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
- from Rev 80 to Rev 81
- ↔ Reverse comparison
Rev 80 → Rev 81
/rtl/verilog/versatile_mem_ctrl_top.v
464,7 → 464,7
|
`ifdef DDR_16 |
wire read, write; |
wire sdram_clk_90, sdram_clk_180, sdram_clk_270; |
wire sdram_clk_0, sdram_clk_90, sdram_clk_180, sdram_clk_270; |
wire ck_fb; |
reg cke, ras, cas, we, cs_n; |
wire cke_d, ras_d, cas_d, we_d, cs_n_d; |
507,6 → 507,7
reg [3:0] open_ba; |
wire next_row_open, current_bank_closed, current_row_open; |
reg current_bank_closed_reg, current_row_open_reg; |
wire adr_init; |
|
|
// refresh counter |
514,10 → 515,10
( |
.zq(ref_cnt_zero), |
.rst(sdram_rst), |
.clk(sdram_clk) |
.clk(sdram_clk_0) |
); |
|
always @ (posedge sdram_clk or posedge sdram_rst) |
always @ (posedge sdram_clk_0 or posedge sdram_rst) |
if (sdram_rst) |
refresh_req <= 1'b0; |
else |
588,7 → 589,7
assign burst_reading = 1'b0; |
|
// Keep track of open row in banks |
always @ (posedge sdram_clk or posedge sdram_rst) |
always @ (posedge sdram_clk_0 or posedge sdram_rst) |
if (sdram_rst) begin |
open_row[0] <= 13'b0; |
open_row[1] <= 13'b0; |
616,7 → 617,7
.init(adr_init), |
.inc(), |
.adr_o(burst_adr), |
.done(done), |
.done(), |
.clk(sdram_clk_0), |
.rst(sdram_rst) |
); |
743,7 → 744,7
( |
.d(fifo_sel_reg[i]), |
.q(fifo_sel_dly[i]), |
.clk(sdram_clk), |
.clk(sdram_clk_0), |
.rst(sdram_rst) |
); |
end |
754,7 → 755,7
( |
.d(fifo_sel_domain_reg), |
.q(fifo_sel_domain_dly), |
.clk(sdram_clk), |
.clk(sdram_clk_0), |
.rst(sdram_rst) |
); |
endgenerate |
766,7 → 767,7
delay delay6 |
( |
.d({write|read}), |
.q({adr_inc}), |
.q(), |
.clk(sdram_clk_0), |
.rst(sdram_rst) |
); |
/rtl/verilog/versatile_mem_ctrl_ip.v
110,7 → 110,6
reg fifo_empty2; |
reg [N:0] wptr1, wptr2, wptr_bin, rptr_bin; |
reg [N:0] ptr_diff; |
|
|
integer i; |
|
192,11 → 191,11
if (wptr_bin > rptr_bin) |
ptr_diff <= wptr_bin - rptr_bin; |
else if (wptr_bin < rptr_bin) |
ptr_diff <= ((4'd16 - rptr_bin) + wptr_bin); |
ptr_diff <= ((5'd16 - rptr_bin) + wptr_bin); |
else |
ptr_diff <= 4'd0; |
|
|
// Flag |
assign fifo_flag = (ptr_diff >= fifo_flag_value); |
|
|
2959,7 → 2958,7
.CE(1'b1), |
.D0(1'b0), |
.D1(1'b1), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
|
// Generate strobe with equal delay as data |
2986,7 → 2985,7
.CE(1'b1), |
.D0(1'b0), |
.D1(1'b1), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
3040,8 → 3039,8
|
|
// Data from Tx FIFO |
always @ (posedge clk_270 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_270 or posedge rst) |
if (rst) |
dq_tx_reg[15:0] <= 16'h0; |
else |
if (dqm_en) |
3061,14 → 3060,14
.CE(dq_en), |
.D0(dq_tx[i]), |
.D1(dq_tx_reg[i]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
|
// Data mask from Tx FIFO |
always @ (posedge clk_270 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_270 or posedge rst) |
if (rst) |
dqm_tx_reg[1:0] <= 2'b00; |
else |
if (dqm_en) |
3076,8 → 3075,8
else |
dqm_tx_reg[1:0] <= tx_dat_i[1:0]; |
|
always @ (posedge clk_180 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_180 or posedge rst) |
if (rst) |
dqm_tx_reg[3:2] <= 2'b00; |
else |
if (dqm_en) |
3097,7 → 3096,7
.CE(dq_en), |
.D0(!dqm_tx[i]), |
.D1(!dqm_tx_reg[i]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
3126,20 → 3125,20
.C1(clk_90), |
.CE(1'b1), |
.D(dq_io[i]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
|
// Data to Rx FIFO |
always @ (posedge clk_0 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_0 or posedge rst) |
if (rst) |
dq_rx_reg[31:16] <= 16'h0; |
else |
dq_rx_reg[31:16] <= dq_rx[31:16]; |
|
always @ (posedge clk_180 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_180 or posedge rst) |
if (rst) |
dq_rx_reg[15:0] <= 16'h0; |
else |
dq_rx_reg[15:0] <= dq_rx[15:0]; |
3166,20 → 3165,20
.C1(dqs_n_iodelay[0]), |
.CE(1'b1), |
.D(dq_iobuf[i]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
|
// Data to Rx FIFO |
always @ (posedge clk_0 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_0 or posedge rst) |
if (rst) |
dq_rx_reg[31:16] <= 16'h0; |
else |
dq_rx_reg[31:16] <= dq_rx[31:16]; |
|
always @ (posedge clk_0 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_0 or posedge rst) |
if (rst) |
dq_rx_reg[15:0] <= 16'h0; |
else |
dq_rx_reg[15:0] <= dq_rx[15:0]; |
3234,14 → 3233,14
.C1(dqs_n_iodelay[0]), |
.CE(1'b1), |
.D(dq_iobuf[i]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
|
// Rise & fall clocked FF |
always @ (posedge clk_0 or posedge wb_rst) |
if (wb_rst) begin |
always @ (posedge clk_0 or posedge rst) |
if (rst) begin |
dq_fall_1 <= 16'h0; |
dq_rise_1 <= 16'h0; |
end else begin |
3249,8 → 3248,8
dq_rise_1 <= dq_iddr_rise; |
end |
|
always @ (posedge clk_180 or posedge wb_rst) |
if (wb_rst) begin |
always @ (posedge clk_180 or posedge rst) |
if (rst) begin |
dq_fall_2 <= 16'h0; |
dq_rise_2 <= 16'h0; |
end else begin |
3259,8 → 3258,8
end |
|
// Fall sync FF |
always @ (posedge clk_0 or posedge wb_rst) |
if (wb_rst) begin |
always @ (posedge clk_0 or posedge rst) |
if (rst) begin |
dq_fall_3 <= 16'h0; |
dq_rise_3 <= 16'h0; |
end else begin |
3322,7 → 3321,7
.CE(dq_en), |
.D0(tx_dat_i[i+16+4]), |
.D1(tx_dat_i[i+4]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
3349,7 → 3348,7
.CE(dq_en), |
.D0(!dqm_tx[i+2]), |
.D1(!dqm_tx[i]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
3370,14 → 3369,14
.C1(clk_90), |
.CE(1'b1), |
.D(dq_io[i]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
|
// Data to Rx FIFO |
always @ (posedge clk_180 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_180 or posedge rst) |
if (rst) |
dq_rx_reg <= 32'h0; |
else |
dq_rx_reg <= dq_rx; |
3921,7 → 3920,7
radr = fifo_radr_bin[0]; |
end |
|
/* -----\/----- EXCLUDED -----\/----- |
/* |
always @* |
begin |
radr = {a_lo_size{1'b0}}; |
3929,7 → 3928,7
radr = (fifo_radr_bin[k] & {a_lo_size{read_enable_reg[k]}}) | radr; |
end |
end |
-----/\----- EXCLUDED -----/\----- */ |
*/ |
|
// and-or mux write data |
generate |
4961,7 → 4960,7
|
`ifdef DDR_16 |
wire read, write; |
wire sdram_clk_90, sdram_clk_180, sdram_clk_270; |
wire sdram_clk_0, sdram_clk_90, sdram_clk_180, sdram_clk_270; |
wire ck_fb; |
reg cke, ras, cas, we, cs_n; |
wire cke_d, ras_d, cas_d, we_d, cs_n_d; |
5004,6 → 5003,7
reg [3:0] open_ba; |
wire next_row_open, current_bank_closed, current_row_open; |
reg current_bank_closed_reg, current_row_open_reg; |
wire adr_init; |
|
|
// refresh counter |
5011,10 → 5011,10
( |
.zq(ref_cnt_zero), |
.rst(sdram_rst), |
.clk(sdram_clk) |
.clk(sdram_clk_0) |
); |
|
always @ (posedge sdram_clk or posedge sdram_rst) |
always @ (posedge sdram_clk_0 or posedge sdram_rst) |
if (sdram_rst) |
refresh_req <= 1'b0; |
else |
5085,7 → 5085,7
assign burst_reading = 1'b0; |
|
// Keep track of open row in banks |
always @ (posedge sdram_clk or posedge sdram_rst) |
always @ (posedge sdram_clk_0 or posedge sdram_rst) |
if (sdram_rst) begin |
open_row[0] <= 13'b0; |
open_row[1] <= 13'b0; |
5113,7 → 5113,7
.init(adr_init), |
.inc(), |
.adr_o(burst_adr), |
.done(done), |
.done(), |
.clk(sdram_clk_0), |
.rst(sdram_rst) |
); |
5240,7 → 5240,7
( |
.d(fifo_sel_reg[i]), |
.q(fifo_sel_dly[i]), |
.clk(sdram_clk), |
.clk(sdram_clk_0), |
.rst(sdram_rst) |
); |
end |
5251,7 → 5251,7
( |
.d(fifo_sel_domain_reg), |
.q(fifo_sel_domain_dly), |
.clk(sdram_clk), |
.clk(sdram_clk_0), |
.rst(sdram_rst) |
); |
endgenerate |
5263,7 → 5263,7
delay delay6 |
( |
.d({write|read}), |
.q({adr_inc}), |
.q(), |
.clk(sdram_clk_0), |
.rst(sdram_rst) |
); |
/rtl/verilog/versatile_mem_ctrl_ddr.v
61,7 → 61,7
.CE(1'b1), |
.D0(1'b0), |
.D1(1'b1), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
|
// Generate strobe with equal delay as data |
88,7 → 88,7
.CE(1'b1), |
.D0(1'b0), |
.D1(1'b1), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
142,8 → 142,8
|
|
// Data from Tx FIFO |
always @ (posedge clk_270 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_270 or posedge rst) |
if (rst) |
dq_tx_reg[15:0] <= 16'h0; |
else |
if (dqm_en) |
163,14 → 163,14
.CE(dq_en), |
.D0(dq_tx[i]), |
.D1(dq_tx_reg[i]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
|
// Data mask from Tx FIFO |
always @ (posedge clk_270 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_270 or posedge rst) |
if (rst) |
dqm_tx_reg[1:0] <= 2'b00; |
else |
if (dqm_en) |
178,8 → 178,8
else |
dqm_tx_reg[1:0] <= tx_dat_i[1:0]; |
|
always @ (posedge clk_180 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_180 or posedge rst) |
if (rst) |
dqm_tx_reg[3:2] <= 2'b00; |
else |
if (dqm_en) |
199,7 → 199,7
.CE(dq_en), |
.D0(!dqm_tx[i]), |
.D1(!dqm_tx_reg[i]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
228,20 → 228,20
.C1(clk_90), |
.CE(1'b1), |
.D(dq_io[i]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
|
// Data to Rx FIFO |
always @ (posedge clk_0 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_0 or posedge rst) |
if (rst) |
dq_rx_reg[31:16] <= 16'h0; |
else |
dq_rx_reg[31:16] <= dq_rx[31:16]; |
|
always @ (posedge clk_180 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_180 or posedge rst) |
if (rst) |
dq_rx_reg[15:0] <= 16'h0; |
else |
dq_rx_reg[15:0] <= dq_rx[15:0]; |
268,20 → 268,20
.C1(dqs_n_iodelay[0]), |
.CE(1'b1), |
.D(dq_iobuf[i]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
|
// Data to Rx FIFO |
always @ (posedge clk_0 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_0 or posedge rst) |
if (rst) |
dq_rx_reg[31:16] <= 16'h0; |
else |
dq_rx_reg[31:16] <= dq_rx[31:16]; |
|
always @ (posedge clk_0 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_0 or posedge rst) |
if (rst) |
dq_rx_reg[15:0] <= 16'h0; |
else |
dq_rx_reg[15:0] <= dq_rx[15:0]; |
336,14 → 336,14
.C1(dqs_n_iodelay[0]), |
.CE(1'b1), |
.D(dq_iobuf[i]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
|
// Rise & fall clocked FF |
always @ (posedge clk_0 or posedge wb_rst) |
if (wb_rst) begin |
always @ (posedge clk_0 or posedge rst) |
if (rst) begin |
dq_fall_1 <= 16'h0; |
dq_rise_1 <= 16'h0; |
end else begin |
351,8 → 351,8
dq_rise_1 <= dq_iddr_rise; |
end |
|
always @ (posedge clk_180 or posedge wb_rst) |
if (wb_rst) begin |
always @ (posedge clk_180 or posedge rst) |
if (rst) begin |
dq_fall_2 <= 16'h0; |
dq_rise_2 <= 16'h0; |
end else begin |
361,8 → 361,8
end |
|
// Fall sync FF |
always @ (posedge clk_0 or posedge wb_rst) |
if (wb_rst) begin |
always @ (posedge clk_0 or posedge rst) |
if (rst) begin |
dq_fall_3 <= 16'h0; |
dq_rise_3 <= 16'h0; |
end else begin |
424,7 → 424,7
.CE(dq_en), |
.D0(tx_dat_i[i+16+4]), |
.D1(tx_dat_i[i+4]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
451,7 → 451,7
.CE(dq_en), |
.D0(!dqm_tx[i+2]), |
.D1(!dqm_tx[i]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
472,14 → 472,14
.C1(clk_90), |
.CE(1'b1), |
.D(dq_io[i]), |
.R(wb_rst), |
.R(rst), |
.S(1'b0)); |
end |
endgenerate |
|
// Data to Rx FIFO |
always @ (posedge clk_180 or posedge wb_rst) |
if (wb_rst) |
always @ (posedge clk_180 or posedge rst) |
if (rst) |
dq_rx_reg <= 32'h0; |
else |
dq_rx_reg <= dq_rx; |
/rtl/verilog/sdr_16.v
245,7 → 245,6
reg fifo_empty2; |
reg [N:0] wptr1, wptr2, wptr_bin, rptr_bin; |
reg [N:0] ptr_diff; |
|
|
integer i; |
|
283,7 → 282,7
|
|
|
`line 109 "versatile_fifo_async_cmp.v" 0 |
`line 108 "versatile_fifo_async_cmp.v" 0 |
|
|
assign async_empty = (wptr == rptr) && (direction==going_empty); |
329,16 → 328,16
if (wptr_bin > rptr_bin) |
ptr_diff <= wptr_bin - rptr_bin; |
else if (wptr_bin < rptr_bin) |
ptr_diff <= ((4'd16 - rptr_bin) + wptr_bin); |
ptr_diff <= ((5'd16 - rptr_bin) + wptr_bin); |
else |
ptr_diff <= 4'd0; |
|
|
// Flag |
assign fifo_flag = (ptr_diff >= fifo_flag_value); |
|
|
endmodule // async_comp |
`line 163 "versatile_fifo_async_cmp.v" 2 |
`line 162 "versatile_fifo_async_cmp.v" 2 |
`line 1 "async_fifo_mq.v" 1 |
// async FIFO with multiple queues |
|
817,7 → 816,7
radr = fifo_radr_bin[0]; |
end |
|
/* -----\/----- EXCLUDED -----\/----- |
/* |
always @* |
begin |
radr = {a_lo_size{1'b0}}; |
825,7 → 824,7
radr = (fifo_radr_bin[k] & {a_lo_size{read_enable_reg[k]}}) | radr; |
end |
end |
-----/\----- EXCLUDED -----/\----- */ |
*/ |
|
// and-or mux write data |
generate |
2199,7 → 2198,7
|
|
|
|
|
|
|
|
2242,6 → 2241,7
|
|
|
|
|
|
|
2544,8 → 2544,8
|
|
|
`line 811 "versatile_mem_ctrl_top.v" 0 |
`line 812 "versatile_mem_ctrl_top.v" 0 |
// `ifdef DDR_16 |
|
endmodule // wb_sdram_ctrl_top |
`line 814 "versatile_mem_ctrl_top.v" 2 |
`line 815 "versatile_mem_ctrl_top.v" 2 |
/syn/altera/bin/versatile_memory_controller.sdc
4,7 → 4,7
# Timing specifications from Micron Data Sheet (DDR2 SDRAM MT47H32M16-5E) |
|
# Clock cycle time: min=5.00ns, max=8.00ns |
set tCK 5.000 |
set tCK 8.000 |
|
# Data Strobe Out |
# DQS output access time from CK/CK# |
66,7 → 66,7
set sdram_clk_period $tCK |
|
# Clocks |
create_clock -name {wb_clk} -period $wb_clk_period [get_ports {wb_clk}] |
create_clock -name {wb_clk[*]} -period $wb_clk_period [get_ports {wb_clk[*]}] |
create_clock -name {sdram_clk} -period $sdram_clk_period [get_ports {sdram_clk}] |
|
# Virtual clocks |
194,7 → 194,7
#************************************************************** |
|
# Reset |
set_false_path -from [get_ports {wb_rst}] |
set_false_path -from [get_ports {wb_rst[*]}] |
|
# Input Timing Exceptions |
# False path exceptions for opposite-edge transfer |