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

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [soc/] [rtl/] [altera_ddr_ctrl/] [altera_ddr_top.v] - Blame information for rev 12

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 xianfeng
//===============================================================================
2
//
3
//          FILE:  altera_ddr_top.v
4
// 
5
//         USAGE:  
6
// 
7
//   DESCRIPTION:  WishBone interface for Altera DDR SDRAM Controller
8
//                 This verion is just for 32MB SDRAM
9
//                 wb_err_o will be asserted while wb_add_i > 32MB
10
//
11
//                 Read proformance is very low because we have to
12
//                 wait for the local_rdata_vaild available, and then
13
//                 generate the wb_ack_o. In fact, we have not use the
14
//                 buast read, I don't know how to implement it currently.
15
// 
16
//       OPTIONS:  ---
17
//  REQUIREMENTS:  ---
18
//          BUGS:  ---
19
//         NOTES:  ---
20
//        AUTHOR:  Xianfeng Zeng (ZXF), xianfeng.zeng@gmail.com
21
//                                      xianfeng.zeng@SierraAtlantic.com
22
//       COMPANY:  
23
//       VERSION:  1.0
24
//       CREATED:  10/09/2009 12:58:10 PM HKT
25
//      REVISION:  ---
26
//===============================================================================
27
 
28
module altera_ddr_top (
29
  // Wishbine interface
30
  wb_clk_i, wb_rst_i,
31
 
32
  wb_dat_i, wb_dat_o, wb_adr_i, wb_sel_i, wb_we_i, wb_cyc_i,
33
  wb_stb_i, wb_ack_o, wb_err_o,
34
 
35
 
36
  // reset to ddr core
37
  global_reset_n_i,
38
 
39
  // global output
40
  reset_request_n_o,
41
 
42
  // to DDR SDRAM
43
 
44
  ddr_pll_clk_i,
45
 
46
  mem_cs_n_o,
47
  mem_cke_o,
48
  mem_addr_o,
49
  mem_ba_o,
50
  mem_ras_n_o,
51
  mem_cas_n_o,
52
  mem_we_n_o,
53
  mem_dm_o,
54
  mem_clk_io,
55
  mem_clk_n_io,
56
  mem_dq_io,
57
  mem_dqs_io
58
);
59
 
60
//
61
// Paraneters
62
//
63
parameter       wb_Idle  = 4'b1000,
64
                wb_Read  = 4'b0100,
65
                wb_Write = 4'b0010,
66
                wb_Ack   = 4'b0001;
67
 
68
parameter       ddr_Idle                = 6'b100000,
69
                ddr_Read                = 6'b010000,
70
                ddr_Wait_data_vaild     = 6'b001000,
71
                ddr_Wait_wb_Ack         = 6'b000100,
72
                ddr_Write               = 6'b000010,
73
                ddr_Set_locale_ready_reg= 6'b000001;
74
 
75
//
76
// I/O Ports
77
//
78
input                   wb_clk_i;
79
input                   wb_rst_i;
80
 
81
//
82
// WB slave i/f
83
//
84
input   [31:0]           wb_dat_i;
85
output  [31:0]           wb_dat_o;
86
input   [31:0]           wb_adr_i;
87
input   [3:0]            wb_sel_i;
88
input                   wb_we_i;
89
input                   wb_cyc_i;
90
input                   wb_stb_i;
91
output                  wb_ack_o;
92
output                  wb_err_o;
93
 
94
//
95
// DDR I/O Ports
96
//
97
 
98
input           ddr_pll_clk_i;
99
input           global_reset_n_i;
100
 
101
output  [0:0]     mem_cs_n_o;
102
output  [0:0]     mem_cke_o;
103
output  [12:0]   mem_addr_o;
104
output  [1:0]    mem_ba_o;
105
output          mem_ras_n_o;
106
output          mem_cas_n_o;
107
output          mem_we_n_o;
108
output  [1:0]    mem_dm_o;
109
 
110
output          reset_request_n_o;
111
 
112
inout   [0:0]     mem_clk_io;
113
inout   [0:0]     mem_clk_n_io;
114
inout   [15:0]   mem_dq_io;
115
inout   [1:0]    mem_dqs_io;
116
 
117
 
118
//
119
// Internal singal for DDR core
120
//
121
wire    [22:0]   local_address;
122
wire            local_write_req;
123
wire            local_read_req;
124
wire            local_burstbegin;
125
wire    [31:0]   local_wdata;
126
wire            local_ready;
127
wire    [31:0]   local_rdata;
128
wire            local_rdata_valid;
129
 
130
wire            local_refresh_ack;
131
wire            local_wdata_req;
132
wire            local_init_done;
133
wire            reset_phy_clk_n;
134
 
135
wire            phy_clk;
136
wire            aux_full_rate_clk;
137
wire            aux_half_rate_clk;
138
 
139
reg             local_ready_reg;
140
reg             local_rdata_valid_reg;
141
 
142
//
143
// Internal regs and wires
144
//
145
 
146
reg [31:0]       data_save;
147
wire            wb_err;
148
 
149
reg [3:0]        wb_State;
150
reg [5:0]        ddr_State;
151
 
152
 
153
//
154
// Altera DDR SDRAM Controller
155
// with
156
//      1. Alvon interface
157
//      2. Full speed
158
//
159
altera_ddr ddr(
160
        // input
161
        .local_address          (local_address),
162
        .local_write_req        (local_write_req),
163
        .local_read_req         (local_read_req),
164
        .local_burstbegin       (local_burstbegin),
165
        .local_wdata            (local_wdata),
166
 
167
        .local_be               (wb_sel_i),
168
        .local_size             (2'b01),
169
        .global_reset_n         (global_reset_n_i),
170
        .pll_ref_clk            (ddr_pll_clk_i),
171
        .soft_reset_n           (1'b1),
172
 
173
        //output
174
        .local_ready            (local_ready),
175
        .local_rdata            (local_rdata),
176
        .local_rdata_valid      (local_rdata_valid),
177
        .reset_request_n        (reset_request_n_o),
178
        .mem_cs_n               (mem_cs_n_o),
179
        .mem_cke                (mem_cke_o),
180
        .mem_addr               (mem_addr_o),
181
        .mem_ba                 (mem_ba_o),
182
        .mem_ras_n              (mem_ras_n_o),
183
        .mem_cas_n              (mem_cas_n_o),
184
        .mem_we_n               (mem_we_n_o),
185
        .mem_dm                 (mem_dm_o),
186
        .local_refresh_ack      (local_refresh_ack),
187
        .local_wdata_req        (local_wdata_req),
188
        .local_init_done        (local_init_done),
189
        .reset_phy_clk_n        (reset_phy_clk_n),
190
        .phy_clk                (phy_clk),
191
        .aux_full_rate_clk      (aux_full_rate_clk),
192
        .aux_half_rate_clk      (aux_half_rate_clk),
193
 
194
        //inout
195
        .mem_clk                (mem_clk_io),
196
        .mem_clk_n              (mem_clk_n_io),
197
        .mem_dq                 (mem_dq_io),
198
        .mem_dqs                (mem_dqs_io)
199
);
200
 
201
//
202
// Aliases and simple assignments
203
//
204
assign wb_err = wb_cyc_i & wb_stb_i & (|wb_adr_i[26:25]);       // If Access to > 32MB (4-bit leading prefix ignored)
205
assign wb_err_o = wb_err;
206
 
207
//
208
// State Machine for Wishbone side
209
//
210
always @ (negedge wb_clk_i or posedge wb_rst_i)
211
begin
212
        if (wb_rst_i) begin
213
                wb_State <= wb_Idle;
214
        end
215
        else
216
                case (wb_State)
217
                        wb_Idle: begin
218
                                if (!local_init_done)
219
                                        wb_State <= wb_Idle;
220
                                else if (wb_cyc_i & wb_stb_i) begin
221
                                        if (wb_we_i)
222
                                                wb_State <= wb_Write;
223
                                        else
224
                                                wb_State <= wb_Read;
225
                                end
226
                        end
227
 
228
                        wb_Read: begin
229
                                if (local_rdata_valid_reg)
230
                                        wb_State <= wb_Ack;
231
                        end
232
 
233
                        wb_Ack: begin
234
                                wb_State <= wb_Idle;
235
                        end
236
 
237
                        wb_Write: begin
238
                                if (local_ready_reg)
239
                                        wb_State <= wb_Ack;
240
                        end
241
 
242
                        default: wb_State <= wb_Idle;
243
                endcase
244
end
245
 
246
//
247
// State Machine for DDR SDRAM Core side
248
//
249
 
250
always @ (posedge phy_clk or posedge wb_rst_i)
251
begin
252
        if (wb_rst_i) begin
253
                ddr_State <= ddr_Idle;
254
                local_ready_reg <= 1'b0;
255
                local_rdata_valid_reg <= 1'b0;
256
        end
257
        else
258
                case (ddr_State)
259
                        ddr_Idle: begin
260
 
261
//                              local_address <= {23{1'b0}};
262
 
263
                                if (!local_init_done)
264
                                        ddr_State <= ddr_Idle;
265
                                else if (wb_State == wb_Write)
266
                                        ddr_State <= ddr_Write;
267
                                else if (wb_State == wb_Read)
268
                                        ddr_State <= ddr_Read;
269
 
270
                                // These signals are used to triger wb enter
271
                                // ACK state, so they need to be reset when in
272
                                // wb_Ack state 
273
                                if (wb_State == wb_Ack) begin
274
                                        local_ready_reg <= 1'b0;
275
                                        local_rdata_valid_reg <= 1'b0;
276
                                end
277
 
278
                        end
279
 
280
                        ddr_Read: begin
281
//                              local_address <= wb_adr_i[24:2];
282
 
283
                                if (local_ready)
284
                                        ddr_State <= ddr_Wait_data_vaild;
285
 
286
                        end
287
                        ddr_Wait_data_vaild: begin
288
                                if (local_rdata_valid) begin
289
                                        data_save <= local_rdata;
290
 
291
                                        local_rdata_valid_reg <= 1'b1; // Triger wb_ack to happen
292
                                        ddr_State <= ddr_Wait_wb_Ack;
293
                                end
294
                        end
295
 
296
                        ddr_Wait_wb_Ack: begin
297
                                if (wb_State == wb_Ack)
298
                                        ddr_State <= ddr_Idle;
299
                        end
300
 
301
                        ddr_Write: begin
302
 
303
                                if (local_ready)
304
                                        ddr_State <= ddr_Set_locale_ready_reg;
305
                        end
306
 
307
                        ddr_Set_locale_ready_reg: begin
308
 
309
                                local_ready_reg <= 1'b1; // let wb State Machine enter wb_Ack state
310
 
311
                                if (wb_State == wb_Ack)
312
                                        ddr_State <= ddr_Idle;
313
                        end
314
 
315
                        default: ddr_State <= ddr_Idle;
316
                endcase
317
end
318
 
319
 
320
assign wb_dat_o = data_save;
321
assign wb_ack_o = (wb_State == wb_Ack) ? 1'b1 : 1'b0;
322
 
323
assign local_burstbegin = (ddr_State == ddr_Write) ? 1'b1 :
324
                          (ddr_State == ddr_Read)  ? 1'b1 : 1'b0;
325
assign local_write_req  = (ddr_State == ddr_Write) ? 1'b1 : 1'b0;
326
assign local_read_req   = (ddr_State == ddr_Read)  ? 1'b1 : 1'b0;
327
assign local_wdata      = (ddr_State == ddr_Write) ? wb_dat_i       : {32{1'b0}};
328
assign local_address    = (ddr_State == ddr_Write) ? wb_adr_i[24:2] :
329
                          (ddr_State == ddr_Read)  ? wb_adr_i[24:2] : {32{1'b0}};
330
 
331
 
332
//
333
// SDRAM i/f monitor
334
//
335
// synopsys translate_off
336
integer fsdram;
337
initial begin
338
        fsdram = $fopen("sdram.log");
339
end
340
always @(posedge wb_clk_i)
341
        if (wb_cyc_i)
342
                if (wb_State == wb_Ack)
343
                        if (wb_we_i)
344
                                $fdisplay(fsdram, "%t [%h] <- write %h, byte sel %b", $time, wb_adr_i, wb_dat_i, wb_sel_i);
345
                        else
346
                                $fdisplay(fsdram, "%t [%h] -> read %h byte sel %b", $time, wb_adr_i, wb_dat_o, wb_sel_i);
347
// synopsys translate_on
348
 
349
endmodule
350
 
351
 

powered by: WebSVN 2.1.0

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