1 //----------------------------------------------------------------------------
2 // Wishbone DDR Controller
4 // (c) Joerg Bornschein (<jb@capsec.org>)
5 //----------------------------------------------------------------------------
6 `include "ddr_include.v"
10 parameter wait200_init = 26
20 output [`CBA_RNG] mngt_cba // CMD, BA and ADDRESS
24 reg [`CMD_RNG] cmd_cmd_reg;
25 reg [ `BA_RNG] cmd_ba_reg;
26 reg [ `A_RNG] cmd_a_reg;
27 reg [7:0] cmd_idle_reg;
29 //---------------------------------------------------------------------------
30 // Initial 200us delay
31 //---------------------------------------------------------------------------
33 // `define WAIT200_INIT 26
34 // `define WAIT200_INIT 1
36 reg [4:0] wait200_counter;
43 wait200_counter <= wait200_init;
45 if (wait200_counter == 0)
48 if (wait200_reg & pulse78)
49 wait200_counter <= wait200_counter - 1;
53 assign wait200 = wait200_reg;
55 //---------------------------------------------------------------------------
56 // Auto refresh counter
57 //---------------------------------------------------------------------------
64 assign ar_cmd_acked = (cmd_cmd_reg == `DDR_CMD_AR) & mngt_ack;
65 assign ar_needed = (ar_counter != 0) & ~ar_cmd_acked;
66 assign ar_badly_needed = ar_counter[2] == 1'b1; // >= 4
75 else if (pulse78 & ~ar_cmd_acked)
76 ar_counter <= ar_counter + 1;
77 else if (ar_cmd_acked & ~pulse78)
78 ar_counter <= ar_counter - 1;
82 //----------------------------------------------------------------------------
83 // DDR Initialization State Machine
84 //----------------------------------------------------------------------------
86 parameter s_wait200 = 0;
87 parameter s_init1 = 1;
88 parameter s_init2 = 2;
89 parameter s_init3 = 3;
90 parameter s_init4 = 4;
91 parameter s_init5 = 5;
92 parameter s_init6 = 6;
93 parameter s_waitack = 7;
99 assign mngt_cba = {cmd_cmd_reg, cmd_ba_reg, cmd_a_reg};
100 assign mngt_req = cmd_req_reg;
101 assign mngt_pri_req = ~init_done_reg;
102 assign init_done = init_done_reg;
104 always @(posedge clk or posedge reset)
117 if (~wait200_reg) begin
120 cmd_cmd_reg <= `DDR_CMD_PRE; // PRE ALL
121 cmd_a_reg[10] <= 1'b1;
128 cmd_cmd_reg <= `DDR_CMD_MRS; // EMRS
130 cmd_a_reg <= `DDR_INIT_EMRS;
137 cmd_cmd_reg <= `DDR_CMD_MRS; // MRS
139 cmd_a_reg <= `DDR_INIT_MRS1;
146 cmd_cmd_reg <= `DDR_CMD_PRE; // PRE ALL
147 cmd_a_reg[10] <= 1'b1;
154 cmd_cmd_reg <= `DDR_CMD_AR; // AR
161 cmd_cmd_reg <= `DDR_CMD_AR; // AR
169 cmd_cmd_reg <= `DDR_CMD_MRS; // MRS
171 cmd_a_reg <= `DDR_INIT_MRS2;
185 endcase ///////////////////////////////////////// INIT STATE MACHINE ///