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
    from Rev 99 to Rev 100
    Reverse comparison

Rev 99 → Rev 100

/rtl/verilog/sdr_sdram_16_ctrl.v
1,11 → 1,5
`timescale 1ns/1ns
//`sinclude "type_definitions.struct"
//`include "sdr_16_defines.v"
`ifdef ACTEL
`define SYN /*synthesis syn_useioff=1 syn_allow_retiming=0 */
`else
`define SYN
`endif
 
module sdr_sdram_16_ctrl (
// wisbone i/f
dat_i, adr_i, sel_i, cti_i, bte_i, we_i, cyc_i, stb_i, dat_o, ack_o,
37,15 → 31,15
input [2:0] cti_i;
input [1:0] bte_i;
input we_i, cyc_i, stb_i;
output reg [31:0] dat_o;
output [31:0] dat_o;
output ack_o;
 
output reg [1:0] ba `SYN;
output reg [12:0] a `SYN;
output reg [2:0] cmd `SYN;
output reg [1:0] ba;
output reg [12:0] a;
output reg [2:0] cmd;
output cke, cs_n;
output reg [1:0] dqm `SYN;
output reg [15:0] dq_o `SYN;
output reg [1:0] dqm;
output reg [15:0] dq_o;
output reg dq_oe;
input [15:0] dq_i;
 
57,18 → 51,19
wire [12:0] col_a10_fix;
reg [4:0] col_reg;
wire [0:31] shreg;
reg count0;
wire count0;
wire stall; // active if write burst need data
reg ref_cnt_zero, refresh_req;
wire ref_cnt_zero;
reg refresh_req;
reg wb_flag;
 
reg [1:6] ack_rd;
wire ack_rd, rd_ack_emptyflag;
wire ack_wr;
 
// to keep track of open rows per bank
reg [row_size-1:0] open_row[0:3];
reg [0:3] open_ba;
reg current_bank_closed, current_row_open;
// to keep track of open rows per bank
reg [row_size-1:0] open_row[0:3];
reg [0:3] open_ba;
reg current_bank_closed, current_row_open;
`ifndef RFR_WRAP_VALUE
parameter rfr_length = 10;
77,7 → 72,12
parameter rfr_length = `RFR_LENGTH;
parameter rfr_wrap_value = `RFR_WRAP_VALUE;
`endif
 
// cti
parameter [2:0] classic = 3'b000,
endofburst = 3'b111;
 
// bte
parameter [1:0] linear = 2'b00,
beat4 = 2'b01,
beat8 = 2'b10,
98,7 → 98,7
`define FSM_ADR 3'b011
`define FSM_PCH 3'b100
`define FSM_ACT 3'b101
//`define FSM_W4D 3'b110
//`define FSM_WAIT 3'b110
`define FSM_RW 3'b111
 
assign cke = 1'b1;
137,18 → 137,15
always @*
begin
next = 3'bx;
next = state;
case (state)
`FSM_INIT:
if (shreg[31]) next = `FSM_IDLE;
else next = `FSM_INIT;
`FSM_IDLE:
if (refresh_req) next = `FSM_RFR;
else if (cyc_i & stb_i & !(|ack_rd)) next = `FSM_ADR;
else next = `FSM_IDLE;
else if (cyc_i & stb_i & rd_ack_emptyflag) next = `FSM_ADR;
`FSM_RFR:
if (shreg[8]) next = `FSM_IDLE; // tRFC=60ns, AREF@2
else next = `FSM_RFR;
`FSM_ADR:
if (current_bank_closed) next = `FSM_ACT;
else if (current_row_open) next = `FSM_RW;
155,11 → 152,9
else next = `FSM_PCH;
`FSM_PCH:
if (shreg[1]) next = `FSM_ACT;
else next = `FSM_PCH;
`FSM_ACT:
if (shreg[2]) next = `FSM_RW;
else next = `FSM_ACT;
`FSM_RW:
`FSM_RW:
if (bte_i==linear & shreg[1]) next = `FSM_IDLE;
else if (bte_i==beat4 & shreg[7]) next = `FSM_IDLE;
`ifdef BEAT8
168,7 → 163,6
`ifdef BEAT16
else if (bte_i==beat16 & shreg[31]) next = `FSM_IDLE;
`endif
else next = `FSM_RW;
endcase
end
 
175,16 → 169,6
// active if write burst need data
assign stall = state==`FSM_RW & next==`FSM_RW & ~stb_i & count0 & we_i;
// flag indicates active wb cycle
always @ (posedge clk or posedge rst)
if (rst)
wb_flag <= 1'b0;
else
if (state==`FSM_ADR)
wb_flag <= 1'b1;
else if ((cti_i==3'b000 | cti_i==3'b111) & ack_o)
wb_flag <= 1'b0;
 
// counter
cnt_shreg_ce_clear # ( .length(32))
cnt0 (
284,7 → 268,6
if (rst)
{current_bank_closed, current_row_open} <= {1'b1, 1'b0};
else
//if (state==adr & counter[1:0]==2'b10)
{current_bank_closed, current_row_open} <= {!(open_ba[bank]), open_row[bank]==row};
 
// refresh counter
304,16 → 287,10
assign ack_wr = (state==`FSM_RW & count0 & we_i);
always @ (posedge clk or posedge rst)
if (rst)
ack_rd <= {6{1'b0}};
else
ack_rd <= {state==`FSM_RW & count0 & !we_i,ack_rd[2:5]};
assign ack_o = (cl==2) ? ack_rd[5] | ack_wr :
(cl==3) ? ack_rd[6] | ack_wr :
1'b0;
delay_emptyflag # ( .depth(cl+2)) delay0 ( .d(state==`FSM_RW & count0 & !we_i), .q(ack_rd), .emptyflag(rd_ack_emptyflag), .clk(clk), .rst(rst));
 
assign ack_o = ack_rd | ack_wr;
 
// output dq_o mux and dffs
always @ (posedge clk or posedge rst)
if (rst)

powered by: WebSVN 2.1.0

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