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

Subversion Repositories mem_ctrl

[/] [mem_ctrl/] [trunk/] [rtl/] [verilog/] [mc_top.v] - Blame information for rev 8

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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