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/] [mem_if/] [rtl/] [verilog/] [mc_top.v] - Blame information for rev 12

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 xianfeng
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  WISHBONE Memory Controller Top Level                       ////
4
////                                                             ////
5
////                                                             ////
6
////  Author: Rudolf Usselmann                                   ////
7
////          rudi@asics.ws                                      ////
8
////                                                             ////
9
////                                                             ////
10
////  Downloaded from: http://www.opencores.org/cores/mem_ctrl/  ////
11
////                                                             ////
12
/////////////////////////////////////////////////////////////////////
13
////                                                             ////
14
//// Copyright (C) 2000-2002 Rudolf Usselmann                    ////
15
////                         www.asics.ws                        ////
16
////                         rudi@asics.ws                       ////
17
////                                                             ////
18
//// This source file may be used and distributed without        ////
19
//// restriction provided that this copyright statement is not   ////
20
//// removed from the file and that any derivative work contains ////
21
//// the original copyright notice and the associated disclaimer.////
22
////                                                             ////
23
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
24
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
25
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
26
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
27
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
28
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
29
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
30
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
31
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
32
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
33
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
34
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
35
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
36
////                                                             ////
37
/////////////////////////////////////////////////////////////////////
38
 
39
//  CVS Log
40
//
41
//  $Id: mc_top.v,v 1.7 2002-01-21 13:08:52 rudi Exp $
42
//
43
//  $Date: 2002-01-21 13:08:52 $
44
//  $Revision: 1.7 $
45
//  $Author: rudi $
46
//  $Locker:  $
47
//  $State: Exp $
48
//
49
// Change History:
50
//               $Log: not supported by cvs2svn $
51
//               Revision 1.6  2001/12/21 05:09:30  rudi
52
//
53
//               - Fixed combinatorial loops in synthesis
54
//               - Fixed byte select bug
55
//
56
//               Revision 1.5  2001/11/29 02:16:28  rudi
57
//
58
//
59
//               - More Synthesis cleanup, mostly for speed
60
//               - Several bug fixes
61
//               - Changed code to avoid auto-precharge and
62
//                 burst-terminate combinations (apparently illegal ?)
63
//                 Now we will do a manual precharge ...
64
//
65
//               Revision 1.4  2001/09/10 13:44:17  rudi
66
//               *** empty log message ***
67
//
68
//               Revision 1.3  2001/09/02 02:28:28  rudi
69
//
70
//               Many fixes for minor bugs that showed up in gate level simulations.
71
//
72
//               Revision 1.2  2001/08/10 08:16:21  rudi
73
//
74
//               - Changed IO names to be more clear.
75
//               - Uniquifyed define names to be core specific.
76
//               - Removed "Refresh Early" configuration
77
//
78
//               Revision 1.1  2001/07/29 07:34:41  rudi
79
//
80
//
81
//               1) Changed Directory Structure
82
//               2) Fixed several minor bugs
83
//
84
//               Revision 1.3  2001/06/12 15:19:49  rudi
85
//
86
//
87
//               Minor changes after running lint, and a small bug fix reading csr and ba_mask registers.
88
//
89
//               Revision 1.2  2001/06/03 11:37:17  rudi
90
//
91
//
92
//               1) Fixed Chip Select Mask Register
93
//                      - Power On Value is now all ones
94
//                      - Comparison Logic is now correct
95
//
96
//               2) All resets are now asynchronous
97
//
98
//               3) Converted Power On Delay to an configurable item
99
//
100
//               4) Added reset to Chip Select Output Registers
101
//
102
//               5) Forcing all outputs to Hi-Z state during reset
103
//
104
//               Revision 1.1.1.1  2001/05/13 09:39:39  rudi
105
//               Created Directory Structure
106
//
107
//
108
//
109
//
110
 
111
`include "mc_defines.v"
112
 
113
module mc_top(clk_i, rst_i,
114
 
115
        wb_data_i, wb_data_o, wb_addr_i, wb_sel_i, wb_we_i, wb_cyc_i,
116
        wb_stb_i, wb_ack_o, wb_err_o,
117
 
118
        susp_req_i, resume_req_i, suspended_o, poc_o,
119
 
120
        mc_clk_i, mc_br_pad_i, mc_bg_pad_o, mc_ack_pad_i,
121
        mc_addr_pad_o, mc_data_pad_i, mc_data_pad_o, mc_dp_pad_i,
122
        mc_dp_pad_o, mc_doe_pad_doe_o, mc_dqm_pad_o, mc_oe_pad_o_,
123
        mc_we_pad_o_, mc_cas_pad_o_, mc_ras_pad_o_, mc_cke_pad_o_,
124
        mc_cs_pad_o_, mc_sts_pad_i, mc_rp_pad_o_, mc_vpen_pad_o,
125
        mc_adsc_pad_o_, mc_adv_pad_o_, mc_zz_pad_o, mc_coe_pad_coe_o
126
        );
127
 
128
input           clk_i, rst_i;
129
 
130
// --------------------------------------
131
// WISHBONE SLAVE INTERFACE 
132
input   [31:0]   wb_data_i;
133
output  [31:0]   wb_data_o;
134
input   [31:0]   wb_addr_i;
135
input   [3:0]    wb_sel_i;
136
input           wb_we_i;
137
input           wb_cyc_i;
138
input           wb_stb_i;
139
output          wb_ack_o;
140
output          wb_err_o;
141
 
142
// --------------------------------------
143
// Suspend Resume Interface
144
input           susp_req_i;
145
input           resume_req_i;
146
output          suspended_o;
147
 
148
// POC
149
output  [31:0]   poc_o;
150
 
151
// --------------------------------------
152
// Memory Bus Signals
153
input           mc_clk_i;
154
input           mc_br_pad_i;
155
output          mc_bg_pad_o;
156
input           mc_ack_pad_i;
157
output  [23:0]   mc_addr_pad_o;
158
input   [31:0]   mc_data_pad_i;
159
output  [31:0]   mc_data_pad_o;
160
input   [3:0]    mc_dp_pad_i;
161
output  [3:0]    mc_dp_pad_o;
162
output          mc_doe_pad_doe_o;
163
output  [3:0]    mc_dqm_pad_o;
164
output          mc_oe_pad_o_;
165
output          mc_we_pad_o_;
166
output          mc_cas_pad_o_;
167
output          mc_ras_pad_o_;
168
output          mc_cke_pad_o_;
169
output  [7:0]    mc_cs_pad_o_;
170
input           mc_sts_pad_i;
171
output          mc_rp_pad_o_;
172
output          mc_vpen_pad_o;
173
output          mc_adsc_pad_o_;
174
output          mc_adv_pad_o_;
175
output          mc_zz_pad_o;
176
output          mc_coe_pad_coe_o;
177
 
178
////////////////////////////////////////////////////////////////////
179
//
180
// Local Wires
181
//
182
 
183
// WISHBONE Interface Interconnects
184
wire            wb_read_go;
185
wire            wb_write_go;
186
wire            wb_first;
187
wire            wb_wait;
188
wire            mem_ack;
189
 
190
// Suspend Resume Interface
191
wire            susp_sel;
192
 
193
// Register File Interconnects
194
wire    [31:0]   rf_dout;
195
wire    [31:0]   csc;
196
wire    [31:0]   tms;
197
wire    [31:0]   sp_csc;
198
wire    [31:0]   sp_tms;
199
wire    [7:0]    cs;
200
wire            fs;
201
wire            cs_le;
202
wire    [7:0]    cs_need_rfr;
203
wire    [2:0]    ref_int;
204
wire    [31:0]   mem_dout;
205
wire            wp_err;
206
 
207
// Address Select Signals
208
wire    [12:0]   row_adr;
209
wire    [1:0]    bank_adr;
210
wire            cmd_a10;
211
wire            row_sel;
212
wire            next_adr;
213
wire    [10:0]   page_size;
214
wire            lmr_sel;
215
wire            wr_hold;
216
 
217
// OBCT Signals
218
wire            bank_set;
219
wire            bank_clr;
220
wire            bank_clr_all;
221
wire            bank_open;
222
wire            row_same;
223
wire    [7:0]    obct_cs;
224
wire            any_bank_open;
225
 
226
// Data path Controller Signals
227
wire            dv;
228
wire            pack_le0, pack_le1, pack_le2;   // Pack Latch Enable
229
wire            par_err;
230
wire    [31:0]   mc_data_od;
231
wire    [3:0]    mc_dp_od;
232
wire    [23:0]   mc_addr_d;
233
wire    [35:0]   mc_data_ir;
234
 
235
// Refresh Counter Signals
236
wire            rfr_req;
237
wire            rfr_ack;
238
wire    [7:0]    rfr_ps_val;
239
 
240
// Memory Timing Block Signals
241
wire            data_oe;
242
wire            oe_;
243
wire            we_;
244
wire            cas_;
245
wire            ras_;
246
wire            cke_;
247
wire            lmr_req;
248
wire            lmr_ack;
249
wire            init_req;
250
wire            init_ack;
251
wire    [7:0]    spec_req_cs;
252
wire            cs_en;
253
wire            wb_cycle, wr_cycle;
254
wire    [31:0]   tms_s;
255
wire    [31:0]   csc_s;
256
wire            mc_c_oe_d;
257
wire            mc_br_r;
258
wire            mc_bg_d;
259
wire            mc_adsc_d;
260
wire            mc_adv_d;
261
wire            mc_ack_r;
262
wire            err;
263
wire            mc_sts_i;
264
 
265
////////////////////////////////////////////////////////////////////
266
//
267
// Misc Logic
268
//
269
 
270
assign obct_cs =        (rfr_ack | susp_sel) ? cs_need_rfr :
271
                        (lmr_ack | init_ack) ? spec_req_cs : cs;
272
 
273
assign lmr_sel = lmr_ack | init_ack;
274
 
275
assign tms_s = lmr_sel ? sp_tms : tms;
276
assign csc_s = lmr_sel ? sp_csc : csc;
277
 
278
 
279
wire            not_mem_cyc;
280
 
281
assign  not_mem_cyc = wb_cyc_i & wb_stb_i & !( `MC_MEM_SEL );
282
 
283
reg             mem_ack_r;
284
 
285
always @(posedge clk_i)
286
        mem_ack_r <= #1 mem_ack;
287
 
288
////////////////////////////////////////////////////////////////////
289
//
290
// Modules
291
//
292
 
293
mc_rf           u0(
294
                .clk(           clk_i           ),
295
                .rst(           rst_i           ),
296
                .wb_data_i(     wb_data_i       ),
297
                .rf_dout(       rf_dout         ),
298
                .wb_addr_i(     wb_addr_i       ),
299
                .wb_we_i(       wb_we_i         ),
300
                .wb_cyc_i(      wb_cyc_i        ),
301
                .wb_stb_i(      wb_stb_i        ),
302
                .wb_ack_o(                      ),
303
                .wp_err(        wp_err          ),
304
                .csc(           csc             ),
305
                .tms(           tms             ),
306
                .poc(           poc_o           ),
307
                .sp_csc(        sp_csc          ),
308
                .sp_tms(        sp_tms          ),
309
                .cs(            cs              ),
310
                .mc_data_i(     mc_data_ir[31:0]),
311
                .mc_sts(        mc_sts_ir       ),
312
                .mc_vpen(       mc_vpen_pad_o   ),
313
                .fs(            fs              ),
314
                .cs_le(         cs_le           ),
315
                .cs_le_d(       cs_le_d         ),
316
                .cs_need_rfr(   cs_need_rfr     ),
317
                .ref_int(       ref_int         ),
318
                .rfr_ps_val(    rfr_ps_val      ),
319
                .spec_req_cs(   spec_req_cs     ),
320
                .init_req(      init_req        ),
321
                .init_ack(      init_ack        ),
322
                .lmr_req(       lmr_req         ),
323
                .lmr_ack(       lmr_ack         )
324
                );
325
 
326
mc_adr_sel      u1(
327
                .clk(           clk_i           ),
328
                .csc(           csc_s           ),
329
                .tms(           tms_s           ),
330
                .wb_stb_i(      wb_stb_i        ),
331
                //.wb_ack_o(    wb_ack_o        ),
332
                .wb_ack_o(      mem_ack_r       ),
333
                .wb_addr_i(     wb_addr_i       ),
334
                .wb_we_i(       wb_we_i         ),
335
                .wb_write_go(   wb_write_go     ),
336
                .wr_hold(       wr_hold         ),
337
                .cas_(          cas_            ),
338
                .mc_addr(       mc_addr_d       ),
339
                .row_adr(       row_adr         ),
340
                .bank_adr(      bank_adr        ),
341
                .rfr_ack(       rfr_ack         ),
342
                .cs_le(         cs_le           ),
343
                .cmd_a10(       cmd_a10         ),
344
                .row_sel(       row_sel         ),
345
                .lmr_sel(       lmr_sel         ),
346
                .next_adr(      next_adr        ),
347
                .wr_cycle(      wr_cycle        ),
348
                .page_size(     page_size       )
349
                );
350
 
351
mc_obct_top     u2(
352
                .clk(           clk_i           ),
353
                .rst(           rst_i           ),
354
                .cs(            obct_cs         ),
355
                .row_adr(       row_adr         ),
356
                .bank_adr(      bank_adr        ),
357
                .bank_set(      bank_set        ),
358
                .bank_clr(      bank_clr        ),
359
                .bank_clr_all(  bank_clr_all    ),
360
                .bank_open(     bank_open       ),
361
                .any_bank_open( any_bank_open   ),
362
                .row_same(      row_same        ),
363
                .rfr_ack(       rfr_ack         )
364
                );
365
 
366
mc_dp           u3(
367
                .clk(           clk_i           ),
368
                .rst(           rst_i           ),
369
                .csc(           csc             ),
370
                .wb_cyc_i(      wb_cyc_i        ),
371
                .wb_stb_i(      wb_stb_i        ),
372
                .mem_ack(       mem_ack         ),
373
                //.wb_ack_o(    wb_ack_o        ),
374
                .wb_ack_o(      mem_ack_r       ),
375
                .wb_we_i(       wb_we_i         ),
376
                .wb_data_i(     wb_data_i       ),
377
                .wb_data_o(     mem_dout        ),
378
                .wb_read_go(    wb_read_go      ),
379
                .mc_clk(        mc_clk_i        ),
380
                .mc_data_del(   mc_data_ir      ),
381
                .mc_dp_i(       mc_dp_pad_i     ),
382
                .mc_data_o(     mc_data_od      ),
383
                .mc_dp_o(       mc_dp_od        ),
384
                .dv(            dv              ),
385
                .pack_le0(      pack_le0        ),
386
                .pack_le1(      pack_le1        ),
387
                .pack_le2(      pack_le2        ),
388
                .byte_en(       wb_sel_i        ),
389
                .par_err(       par_err         )
390
                );
391
 
392
mc_refresh      u4(
393
                .clk(           clk_i           ),
394
                .rst(           rst_i           ),
395
                .cs_need_rfr(   cs_need_rfr     ),
396
                .ref_int(       ref_int         ),
397
                .rfr_req(       rfr_req         ),
398
                .rfr_ack(       rfr_ack         ),
399
                .rfr_ps_val(    rfr_ps_val      )
400
                );
401
 
402
mc_timing       u5(
403
                .clk(           clk_i           ),
404
                .mc_clk(        mc_clk_i        ),
405
                .rst(           rst_i           ),
406
                .wb_cyc_i(      wb_cyc_i        ),
407
                .wb_stb_i(      wb_stb_i        ),
408
                .wb_we_i(       wb_we_i         ),
409
                .wb_read_go(    wb_read_go      ),
410
                .wb_write_go(   wb_write_go     ),
411
                .wb_first(      wb_first        ),
412
                .wb_wait(       wb_wait         ),
413
                .mem_ack(       mem_ack         ),
414
                .err(           err             ),
415
                .susp_req(      susp_req_i      ),
416
                .resume_req(    resume_req_i    ),
417
                .suspended(     suspended_o     ),
418
                .susp_sel(      susp_sel        ),
419
                .mc_br(         mc_br_r         ),
420
                .mc_bg(         mc_bg_d         ),
421
                .mc_ack(        mc_ack_r        ),
422
                .not_mem_cyc(   not_mem_cyc     ),
423
                .data_oe(       data_oe         ),
424
                .oe_(           oe_             ),
425
                .we_(           we_             ),
426
                .cas_(          cas_            ),
427
                .ras_(          ras_            ),
428
                .cke_(          cke_            ),
429
                .cs_en(         cs_en           ),
430
                .mc_adsc(       mc_adsc_d       ),
431
                .mc_adv(        mc_adv_d        ),
432
                .mc_c_oe(       mc_c_oe_d       ),
433
                .wb_cycle(      wb_cycle        ),
434
                .wr_cycle(      wr_cycle        ),
435
                .csc(           csc_s           ),
436
                .tms(           tms_s           ),
437
                .cs(            obct_cs         ),
438
                .lmr_req(       lmr_req         ),
439
                .lmr_ack(       lmr_ack         ),
440
                .cs_le(         cs_le           ),
441
                .cs_le_d(       cs_le_d         ),
442
                .cmd_a10(       cmd_a10         ),
443
                .row_sel(       row_sel         ),
444
                .next_adr(      next_adr        ),
445
                .page_size(     page_size       ),
446
                .bank_set(      bank_set        ),
447
                .bank_clr(      bank_clr        ),
448
                .bank_clr_all(  bank_clr_all    ),
449
                .bank_open(     bank_open       ),
450
                .any_bank_open( any_bank_open   ),
451
                .row_same(      row_same        ),
452
                .dv(            dv              ),
453
                .pack_le0(      pack_le0        ),
454
                .pack_le1(      pack_le1        ),
455
                .pack_le2(      pack_le2        ),
456
                .par_err(       par_err         ),
457
                .rfr_req(       rfr_req         ),
458
                .rfr_ack(       rfr_ack         ),
459
                .init_req(      init_req        ),
460
                .init_ack(      init_ack        )
461
                );
462
 
463
mc_wb_if        u6(
464
                .clk(           clk_i           ),
465
                .rst(           rst_i           ),
466
                .wb_addr_i(     wb_addr_i       ),
467
                .wb_cyc_i(      wb_cyc_i        ),
468
                .wb_stb_i(      wb_stb_i        ),
469
                .wb_we_i(       wb_we_i         ),
470
                .wb_ack_o(      wb_ack_o        ),
471
                .wb_err(        wb_err_o        ),
472
                .wb_read_go(    wb_read_go      ),
473
                .wb_write_go(   wb_write_go     ),
474
                .wb_first(      wb_first        ),
475
                .wb_wait(       wb_wait         ),
476
                .mem_ack(       mem_ack         ),
477
                .wr_hold(       wr_hold         ),
478
                .err(           err             ),
479
                .par_err(       par_err         ),
480
                .wp_err(        wp_err          ),
481
                .wb_data_o(     wb_data_o       ),
482
                .mem_dout(      mem_dout        ),
483
                .rf_dout(       rf_dout         )
484
                );
485
 
486
mc_mem_if       u7(
487
                .clk(           clk_i           ),
488
                .rst(           rst_i           ),
489
                .mc_rp(         mc_rp_pad_o_    ),
490
                .mc_clk(        mc_clk_i        ),
491
                .mc_br(         mc_br_pad_i     ),
492
                .mc_bg(         mc_bg_pad_o     ),
493
                .mc_addr(       mc_addr_pad_o   ),
494
                .mc_data_o(     mc_data_pad_o   ),
495
                .mc_dp_o(       mc_dp_pad_o     ),
496
                .mc_data_oe(    mc_doe_pad_doe_o),
497
                .mc_dqm(        mc_dqm_pad_o    ),
498
                .mc_oe_(        mc_oe_pad_o_    ),
499
                .mc_we_(        mc_we_pad_o_    ),
500
                .mc_cas_(       mc_cas_pad_o_   ),
501
                .mc_ras_(       mc_ras_pad_o_   ),
502
                .mc_cke_(       mc_cke_pad_o_   ),
503
                .mc_cs_(        mc_cs_pad_o_    ),
504
                .mc_adsc_(      mc_adsc_pad_o_  ),
505
                .mc_adv_(       mc_adv_pad_o_   ),
506
                .mc_br_r(       mc_br_r         ),
507
                .mc_bg_d(       mc_bg_d         ),
508
                .mc_data_od(    mc_data_od      ),
509
                .mc_dp_od(      mc_dp_od        ),
510
                .mc_addr_d(     mc_addr_d       ),
511
                .mc_ack(        mc_ack_pad_i    ),
512
                .mc_zz_o(       mc_zz_pad_o     ),
513
                .we_(           we_             ),
514
                .ras_(          ras_            ),
515
                .cas_(          cas_            ),
516
                .cke_(          cke_            ),
517
                .mc_adsc_d(     mc_adsc_d       ),
518
                .mc_adv_d(      mc_adv_d        ),
519
                .cs_en(         cs_en           ),
520
                .rfr_ack(       rfr_ack         ),
521
                .cs_need_rfr(   cs_need_rfr     ),
522
                .lmr_sel(       lmr_sel         ),
523
                .spec_req_cs(   spec_req_cs     ),
524
                .cs(            cs              ),
525
                .fs(            fs              ),
526
                .data_oe(       data_oe         ),
527
                .susp_sel(      susp_sel        ),
528
                .suspended_o(   suspended_o     ),
529
                .mc_c_oe(       mc_coe_pad_coe_o),
530
                .mc_c_oe_d(     mc_c_oe_d       ),
531
                .mc_ack_r(      mc_ack_r        ),
532
                .oe_(           oe_             ),
533
                .wb_cyc_i(      wb_cyc_i        ),
534
                .wb_stb_i(      wb_stb_i        ),
535
                .wb_sel_i(      wb_sel_i        ),
536
                .wb_cycle(      wb_cycle        ),
537
                .wr_cycle(      wr_cycle        ),
538
                .mc_data_i(     mc_data_pad_i   ),
539
                .mc_dp_i(       mc_dp_pad_i     ),
540
                .mc_data_ir(    mc_data_ir      ),
541
                .mc_sts_i(      mc_sts_pad_i    ),
542
                .mc_sts_ir(     mc_sts_ir       )
543
                );
544
 
545
endmodule

powered by: WebSVN 2.1.0

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