OpenCores
URL https://opencores.org/ocsvn/versatile_mem_ctrl/versatile_mem_ctrl/trunk

Subversion Repositories versatile_mem_ctrl

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /versatile_mem_ctrl/trunk/rtl
    from Rev 77 to Rev 78
    Reverse comparison

Rev 77 → Rev 78

/verilog/versatile_mem_ctrl_top.v
74,9 → 74,9
output ras_pad_o;
output cas_pad_o;
output we_pad_o;
output reg [(`SDRAM_DATA_WIDTH)-1:0] dq_o /*synthesis syn_useioff=1 syn_allow_retiming=0 */;
output reg [(`SDRAM_DATA_WIDTH)-1:0] dq_o /*synthesis syn_useioff=1 syn_allow_retiming=0 */;
output [1:0] dqm_pad_o;
input [(`SDRAM_DATA_WIDTH)-1:0] dq_i ;
input [(`SDRAM_DATA_WIDTH)-1:0] dq_i ;
output dq_oe;
output cke_pad_o;
`endif
119,6 → 119,11
wire [35:0] tx_fifo_dat_o;
 
wire burst_reading;
reg sdram_fifo_wr_r;
 
generate
if (nr_of_wb_clk_domains > 0) begin
versatile_mem_ctrl_wb
143,6 → 148,7
.sdram_dat_i(fifo_dat_i),
.sdram_fifo_wr(fifo_wr),
.sdram_fifo_we(fifo_we[0][0:nr_of_wb_ports_clk0-1]),
.sdram_burst_reading(burst_reading),
.sdram_clk(sdram_clk),
.sdram_rst(sdram_rst) );
end
175,6 → 181,7
.sdram_dat_i(fifo_dat_i),
.sdram_fifo_wr(fifo_wr),
.sdram_fifo_we(fifo_we[1][0:nr_of_wb_ports_clk1-1]),
.sdram_burst_reading(burst_reading),
.sdram_clk(sdram_clk),
.sdram_rst(sdram_rst) );
if (nr_of_wb_ports_clk1 < 16) begin
210,6 → 217,7
.sdram_dat_i(fifo_dat_i),
.sdram_fifo_wr(fifo_wr),
.sdram_fifo_we(fifo_we[2][0:nr_of_wb_ports_clk2-1]),
.sdram_burst_reading(burst_reading),
.sdram_clk(sdram_clk),
.sdram_rst(sdram_rst) );
if (nr_of_wb_ports_clk2 < 16) begin
245,6 → 253,7
.sdram_dat_i(fifo_dat_i),
.sdram_fifo_wr(fifo_wr),
.sdram_fifo_we(fifo_we[3][0:nr_of_wb_ports_clk3-1]),
.sdram_burst_reading(burst_reading),
.sdram_clk(sdram_clk),
.sdram_rst(sdram_rst) );
if (nr_of_wb_ports_clk3 < 16) begin
310,6 → 319,11
always @(posedge sdram_clk)
current_fifo_empty_r <= current_fifo_empty;
always @(posedge sdram_clk)
sdram_fifo_wr_r <= fifo_wr;
// SDR SDRAM 16 FSM
fsm_sdr_16 fsm_sdr_16_0
(
329,6 → 343,8
.cmd({ras_pad_o, cas_pad_o, we_pad_o}),
.dq_oe(dq_oe),
.dqm(dqm_pad_o),
.sdram_fifo_wr(sdram_fifo_wr_r),
.sdram_burst_reading(burst_reading),
.sdram_clk(sdram_clk),
.sdram_rst(sdram_rst)
);
/verilog/versatile_mem_ctrl_wb.v
6,7 → 6,7
wb_clk, wb_rst,
// SDRAM controller interface
sdram_dat_o, sdram_fifo_empty, sdram_fifo_rd_adr, sdram_fifo_rd_data, sdram_fifo_re,
sdram_dat_i, sdram_fifo_wr, sdram_fifo_we,
sdram_dat_i, sdram_fifo_wr, sdram_fifo_we, sdram_burst_reading,
sdram_clk, sdram_rst
 
);
29,6 → 29,7
input [31:0] sdram_dat_i;
input sdram_fifo_wr;
input [0:nr_of_wb_ports-1] sdram_fifo_we;
input sdram_burst_reading;
input sdram_clk;
input sdram_rst;
 
89,6 → 90,7
.ingress_fifo_re(ingress_fifo_re[i]),
.ingress_fifo_empty(ingress_fifo_empty[i]),
.state_idle(state_idle[i]),
.sdram_burst_reading(sdram_burst_reading),
.wb_clk(wb_clk),
.wb_rst(wb_rst)
);
/verilog/fsm_wb.v
4,6 → 4,7
egress_fifo_we, egress_fifo_full,
ingress_fifo_re, ingress_fifo_empty,
state_idle,
sdram_burst_reading,
wb_clk, wb_rst
);
 
16,8 → 17,10
output ack_o;
output egress_fifo_we, ingress_fifo_re;
input egress_fifo_full, ingress_fifo_empty;
input sdram_burst_reading;
output state_idle;
input wb_clk, wb_rst;
 
reg ingress_fifo_read_reg;
 
36,6 → 39,10
parameter fe = 2'b11;
reg [1:0] state;
 
reg sdram_burst_reading_1, sdram_burst_reading_2;
wire sdram_burst_reading_wb_clk;
 
always @ (posedge wb_clk or posedge wb_rst)
if (wb_rst)
state <= idle;
55,7 → 62,7
stb_i & cyc_i & ack_o)
state <= fe;
fe:
if (ingress_fifo_empty)
if (ingress_fifo_empty & !sdram_burst_reading_wb_clk)
state <= idle;
default: ;
endcase
89,5 → 96,15
1'b0;*/
 
assign ack_o = !(state==fe) & ((ingress_fifo_read_reg & stb_i) | (state==wr & stb_i & cyc_i & !egress_fifo_full & !stall_i));
 
 
// Sample the SDRAM burst reading signal in WB domain
always @(posedge wb_clk)
sdram_burst_reading_1 <= sdram_burst_reading;
always @(posedge wb_clk)
sdram_burst_reading_2 <= sdram_burst_reading_1;
 
assign sdram_burst_reading_wb_clk = sdram_burst_reading_2;
endmodule
/verilog/sdr_16_defines.v
11,6 → 11,11
`define MT48LC16M16 // 32MB part
//`define MT48LC4M16 // 8MB part
 
// Define this to allow indication that a burst read is still going
// to the wishbone state machine, so it doesn't start emptying the
// ingress fifo after a aborted burst before the burst read is
// actually finished.
//`define SDRAM_WB_SAME_CLOCKS
 
`ifdef MT48LC16M16
// using 1 of MT48LC16M16
/verilog/sdr_16.v
12,6 → 12,11
// 32MB part
//`define MT48LC4M16 // 8MB part
 
// Define this to allow indication that a burst read is still going
// to the wishbone state machine, so it doesn't start emptying the
// ingress fifo after a aborted burst before the burst read is
// actually finished.
//`define SDRAM_WB_SAME_CLOCKS
 
// using 1 of MT48LC16M16
34,7 → 39,7
 
 
`line 35 "sdr_16_defines.v" 0
`line 40 "sdr_16_defines.v" 0
// `ifdef MT48LC4M16
 
// LMR
48,7 → 53,7
`line 48 "sdr_16_defines.v" 2
`line 53 "sdr_16_defines.v" 2
`line 1 "fsm_wb.v" 1
module fsm_wb (
stall_i, stall_o,
56,6 → 61,7
egress_fifo_we, egress_fifo_full,
ingress_fifo_re, ingress_fifo_empty,
state_idle,
sdram_burst_reading,
wb_clk, wb_rst
);
 
68,8 → 74,10
output ack_o;
output egress_fifo_we, ingress_fifo_re;
input egress_fifo_full, ingress_fifo_empty;
input sdram_burst_reading;
output state_idle;
input wb_clk, wb_rst;
 
reg ingress_fifo_read_reg;
 
88,6 → 96,10
parameter fe = 2'b11;
reg [1:0] state;
 
reg sdram_burst_reading_1, sdram_burst_reading_2;
wire sdram_burst_reading_wb_clk;
 
always @ (posedge wb_clk or posedge wb_rst)
if (wb_rst)
state <= idle;
107,7 → 119,7
stb_i & cyc_i & ack_o)
state <= fe;
fe:
if (ingress_fifo_empty)
if (ingress_fifo_empty & !sdram_burst_reading_wb_clk)
state <= idle;
default: ;
endcase
141,9 → 153,19
1'b0;*/
 
assign ack_o = !(state==fe) & ((ingress_fifo_read_reg & stb_i) | (state==wr & stb_i & cyc_i & !egress_fifo_full & !stall_i));
 
 
// Sample the SDRAM burst reading signal in WB domain
always @(posedge wb_clk)
sdram_burst_reading_1 <= sdram_burst_reading;
always @(posedge wb_clk)
sdram_burst_reading_2 <= sdram_burst_reading_1;
 
assign sdram_burst_reading_wb_clk = sdram_burst_reading_2;
endmodule
`line 93 "fsm_wb.v" 2
`line 110 "fsm_wb.v" 2
`line 1 "versatile_fifo_async_cmp.v" 1
//////////////////////////////////////////////////////////////////////
//// ////
1002,6 → 1024,11
// 32MB part
//`define MT48LC4M16 // 8MB part
 
// Define this to allow indication that a burst read is still going
// to the wishbone state machine, so it doesn't start emptying the
// ingress fifo after a aborted burst before the burst read is
// actually finished.
//`define SDRAM_WB_SAME_CLOCKS
 
// using 1 of MT48LC16M16
1024,7 → 1051,7
 
 
`line 35 "sdr_16_defines.v" 0
`line 40 "sdr_16_defines.v" 0
// `ifdef MT48LC4M16
 
// LMR
1038,7 → 1065,7
`line 48 "sdr_16_defines.v" 2
`line 53 "sdr_16_defines.v" 2
`line 2 "fsm_sdr_16.v" 0
 
module fsm_sdr_16 (
1046,7 → 1073,8
fifo_empty, fifo_rd_adr, fifo_rd_data, count0,
refresh_req, cmd_aref, cmd_read, state_idle,
ba, a, cmd, dqm, dq_oe,
sdram_clk, sdram_rst
sdram_burst_reading,
sdram_clk, sdram_fifo_wr, sdram_rst
);
 
/* Now these are defined
1075,7 → 1103,8
output reg [1:0] dqm /*synthesis syn_useioff=1 syn_allow_retiming=0 */;
output reg dq_oe;
 
input sdram_clk, sdram_rst;
output sdram_burst_reading;
input sdram_clk, sdram_fifo_wr, sdram_rst;
 
wire [2-1:0] bank;
wire [13-1:0] row;
1208,13 → 1237,13
`line 169 "fsm_sdr_16.v" 0
`line 171 "fsm_sdr_16.v" 0
 
`line 173 "fsm_sdr_16.v" 0
`line 175 "fsm_sdr_16.v" 0
 
else
next = 3'b111;
1320,13 → 1349,13
`line 277 "fsm_sdr_16.v" 0
`line 279 "fsm_sdr_16.v" 0
 
`line 281 "fsm_sdr_16.v" 0
`line 283 "fsm_sdr_16.v" 0
 
endcase
end
1334,16 → 1363,42
end
end
 
reg fifo_read_data_en;
always @(posedge sdram_clk)
if (sdram_rst)
fifo_read_data_en <= 1;
else if (next==3'b111)
fifo_read_data_en <= ~fifo_read_data_en;
else
fifo_read_data_en <= 1;
 
reg [3:0] beat4_data_read_limiter; // Use this to record how many times we've pulsed fifo_rd_data
// Only 3 bits, becuase we're looking at when fifo_read_data_en goes low - should only happen 3
// times for a 4-beat burst
always @(posedge sdram_clk)
if (sdram_rst)
beat4_data_read_limiter <= 0;
else if(state==3'b011)
beat4_data_read_limiter <= 0;
else if (!fifo_read_data_en)
beat4_data_read_limiter <= {beat4_data_read_limiter[2:0],1'b1};
 
// rd_adr goes high when next adr is fetched from sync RAM and during write burst
assign fifo_rd_adr = state==3'b011 & shreg[1];
assign fifo_rd_data = ((state==3'b111 & next==3'b111) &
 
assign fifo_rd_data = (((state!=3'b111 & next==3'b111)|(state==3'b111 & (bte_reg==beat4 & fifo_read_data_en & !(&beat4_data_read_limiter)))) & we_reg & !fifo_empty);
/*
assign fifo_rd_data = ((state==`FSM_RW & next==`FSM_RW) &
we_reg & !count0 & !fifo_empty);
 
*/
assign state_idle = (state==3'b001);
 
// bank and row open ?
assign current_bank_closed = !(open_ba[bank]);
assign current_row_open = /*open_ba[bank] &*/ (open_row[bank]==row);
assign current_row_open = open_row[bank]==row;
 
always @ (posedge sdram_clk or posedge sdram_rst)
if (sdram_rst)
1352,10 → 1407,31
//if (state==adr & counter[1:0]==2'b10)
{current_bank_closed_reg, current_row_open_reg} <=
{current_bank_closed, current_row_open};
 
// Record the number of write enables going to INGRESS fifo (ie. that we
// generate when we're reading) - this makes sure we keep track of when a
// burst read is in progress, and we can signal the wishbone bus to wait
// for this data to be put into the FIFO before it'll empty it when it's
// had a terminated burst transfer.
reg [3:0] fifo_we_record;
always @(posedge sdram_clk)
if (sdram_rst)
fifo_we_record <= 0;
else if (next==3'b111 & ((state==3'b011)|(state==3'b101)) & (bte_reg==beat4) & !we_reg)
fifo_we_record <= 4'b0001;
else if (sdram_fifo_wr)
fifo_we_record <= {fifo_we_record[2:0],1'b0};
 
`line 350 "fsm_sdr_16.v" 0
assign sdram_burst_reading = 0;
 
 
endmodule
`line 309 "fsm_sdr_16.v" 2
`line 356 "fsm_sdr_16.v" 2
`line 1 "versatile_mem_ctrl_wb.v" 1
`timescale 1ns/1ns
module versatile_mem_ctrl_wb (
1365,7 → 1441,7
wb_clk, wb_rst,
// SDRAM controller interface
sdram_dat_o, sdram_fifo_empty, sdram_fifo_rd_adr, sdram_fifo_rd_data, sdram_fifo_re,
sdram_dat_i, sdram_fifo_wr, sdram_fifo_we,
sdram_dat_i, sdram_fifo_wr, sdram_fifo_we, sdram_burst_reading,
sdram_clk, sdram_rst
 
);
1388,6 → 1464,7
input [31:0] sdram_dat_i;
input sdram_fifo_wr;
input [0:nr_of_wb_ports-1] sdram_fifo_we;
input sdram_burst_reading;
input sdram_clk;
input sdram_rst;
 
1448,6 → 1525,7
.ingress_fifo_re(ingress_fifo_re[i]),
.ingress_fifo_empty(ingress_fifo_empty[i]),
.state_idle(state_idle[i]),
.sdram_burst_reading(sdram_burst_reading),
.wb_clk(wb_clk),
.wb_rst(wb_rst)
);
1481,7 → 1559,7
assign wb_dat_o_v = {nr_of_wb_ports{wb_dat_o}};
 
endmodule
`line 124 "versatile_mem_ctrl_wb.v" 2
`line 126 "versatile_mem_ctrl_wb.v" 2
`line 1 "versatile_mem_ctrl_top.v" 1
`timescale 1ns/1ns
1506,6 → 1584,11
// 32MB part
//`define MT48LC4M16 // 8MB part
 
// Define this to allow indication that a burst read is still going
// to the wishbone state machine, so it doesn't start emptying the
// ingress fifo after a aborted burst before the burst read is
// actually finished.
//`define SDRAM_WB_SAME_CLOCKS
 
// using 1 of MT48LC16M16
1528,7 → 1611,7
 
 
`line 35 "sdr_16_defines.v" 0
`line 40 "sdr_16_defines.v" 0
// `ifdef MT48LC4M16
 
// LMR
1542,7 → 1625,7
`line 48 "sdr_16_defines.v" 2
`line 53 "sdr_16_defines.v" 2
`line 6 "versatile_mem_ctrl_top.v" 0
 
 
1617,9 → 1700,9
output ras_pad_o;
output cas_pad_o;
output we_pad_o;
output reg [(16)-1:0] dq_o /*synthesis syn_useioff=1 syn_allow_retiming=0 */;
output reg [(16)-1:0] dq_o /*synthesis syn_useioff=1 syn_allow_retiming=0 */;
output [1:0] dqm_pad_o;
input [(16)-1:0] dq_i ;
input [(16)-1:0] dq_i ;
output dq_oe;
output cke_pad_o;
 
1664,6 → 1747,11
wire [35:0] tx_fifo_dat_o;
 
wire burst_reading;
reg sdram_fifo_wr_r;
 
generate
if (nr_of_wb_clk_domains > 0) begin
versatile_mem_ctrl_wb
1688,6 → 1776,7
.sdram_dat_i(fifo_dat_i),
.sdram_fifo_wr(fifo_wr),
.sdram_fifo_we(fifo_we[0][0:nr_of_wb_ports_clk0-1]),
.sdram_burst_reading(burst_reading),
.sdram_clk(sdram_clk),
.sdram_rst(sdram_rst) );
end
1720,6 → 1809,7
.sdram_dat_i(fifo_dat_i),
.sdram_fifo_wr(fifo_wr),
.sdram_fifo_we(fifo_we[1][0:nr_of_wb_ports_clk1-1]),
.sdram_burst_reading(burst_reading),
.sdram_clk(sdram_clk),
.sdram_rst(sdram_rst) );
if (nr_of_wb_ports_clk1 < 16) begin
1755,6 → 1845,7
.sdram_dat_i(fifo_dat_i),
.sdram_fifo_wr(fifo_wr),
.sdram_fifo_we(fifo_we[2][0:nr_of_wb_ports_clk2-1]),
.sdram_burst_reading(burst_reading),
.sdram_clk(sdram_clk),
.sdram_rst(sdram_rst) );
if (nr_of_wb_ports_clk2 < 16) begin
1790,6 → 1881,7
.sdram_dat_i(fifo_dat_i),
.sdram_fifo_wr(fifo_wr),
.sdram_fifo_we(fifo_we[3][0:nr_of_wb_ports_clk3-1]),
.sdram_burst_reading(burst_reading),
.sdram_clk(sdram_clk),
.sdram_rst(sdram_rst) );
if (nr_of_wb_ports_clk3 < 16) begin
1855,6 → 1947,11
always @(posedge sdram_clk)
current_fifo_empty_r <= current_fifo_empty;
always @(posedge sdram_clk)
sdram_fifo_wr_r <= fifo_wr;
// SDR SDRAM 16 FSM
fsm_sdr_16 fsm_sdr_16_0
(
1874,6 → 1971,8
.cmd({ras_pad_o, cas_pad_o, we_pad_o}),
.dq_oe(dq_oe),
.dqm(dqm_pad_o),
.sdram_fifo_wr(sdram_fifo_wr_r),
.sdram_burst_reading(burst_reading),
.sdram_clk(sdram_clk),
.sdram_rst(sdram_rst)
);
2250,8 → 2349,8
 
 
`line 717 "versatile_mem_ctrl_top.v" 0
`line 733 "versatile_mem_ctrl_top.v" 0
// `ifdef DDR_16
endmodule // wb_sdram_ctrl_top
`line 720 "versatile_mem_ctrl_top.v" 2
`line 736 "versatile_mem_ctrl_top.v" 2
/verilog/fsm_sdr_16.v
5,7 → 5,8
fifo_empty, fifo_rd_adr, fifo_rd_data, count0,
refresh_req, cmd_aref, cmd_read, state_idle,
ba, a, cmd, dqm, dq_oe,
sdram_clk, sdram_rst
sdram_burst_reading,
sdram_clk, sdram_fifo_wr, sdram_rst
);
 
/* Now these are defined
34,7 → 35,8
output reg [1:0] dqm /*synthesis syn_useioff=1 syn_allow_retiming=0 */;
output reg dq_oe;
 
input sdram_clk, sdram_rst;
output sdram_burst_reading;
input sdram_clk, sdram_fifo_wr, sdram_rst;
 
wire [`BA_SIZE-1:0] bank;
wire [`ROW_SIZE-1:0] row;
285,16 → 287,42
end
end
 
reg fifo_read_data_en;
always @(posedge sdram_clk)
if (sdram_rst)
fifo_read_data_en <= 1;
else if (next==`FSM_RW)
fifo_read_data_en <= ~fifo_read_data_en;
else
fifo_read_data_en <= 1;
 
reg [3:0] beat4_data_read_limiter; // Use this to record how many times we've pulsed fifo_rd_data
// Only 3 bits, becuase we're looking at when fifo_read_data_en goes low - should only happen 3
// times for a 4-beat burst
always @(posedge sdram_clk)
if (sdram_rst)
beat4_data_read_limiter <= 0;
else if(state==`FSM_ADR)
beat4_data_read_limiter <= 0;
else if (!fifo_read_data_en)
beat4_data_read_limiter <= {beat4_data_read_limiter[2:0],1'b1};
 
// rd_adr goes high when next adr is fetched from sync RAM and during write burst
assign fifo_rd_adr = state==`FSM_ADR & shreg[1];
 
assign fifo_rd_data = (((state!=`FSM_RW & next==`FSM_RW)|(state==`FSM_RW & (bte_reg==beat4 & fifo_read_data_en & !(&beat4_data_read_limiter)))) & we_reg & !fifo_empty);
/*
assign fifo_rd_data = ((state==`FSM_RW & next==`FSM_RW) &
we_reg & !count0 & !fifo_empty);
 
*/
assign state_idle = (state==`FSM_IDLE);
 
// bank and row open ?
assign current_bank_closed = !(open_ba[bank]);
assign current_row_open = /*open_ba[bank] &*/ (open_row[bank]==row);
assign current_row_open = open_row[bank]==row;
 
always @ (posedge sdram_clk or posedge sdram_rst)
if (sdram_rst)
303,6 → 331,25
//if (state==adr & counter[1:0]==2'b10)
{current_bank_closed_reg, current_row_open_reg} <=
{current_bank_closed, current_row_open};
 
// Record the number of write enables going to INGRESS fifo (ie. that we
// generate when we're reading) - this makes sure we keep track of when a
// burst read is in progress, and we can signal the wishbone bus to wait
// for this data to be put into the FIFO before it'll empty it when it's
// had a terminated burst transfer.
reg [3:0] fifo_we_record;
always @(posedge sdram_clk)
if (sdram_rst)
fifo_we_record <= 0;
else if (next==`FSM_RW & ((state==`FSM_ADR)|(state==`FSM_ACT)) & (bte_reg==beat4) & !we_reg)
fifo_we_record <= 4'b0001;
else if (sdram_fifo_wr)
fifo_we_record <= {fifo_we_record[2:0],1'b0};
`ifdef SDRAM_WB_SAME_CLOCKS
assign sdram_burst_reading = |fifo_we_record;
`else
assign sdram_burst_reading = 0;
`endif
 
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.