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_timing.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 Main Timing Block               ////
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_timing.v,v 1.8 2002-01-21 13:08:52 rudi Exp $
42
//
43
//  $Date: 2002-01-21 13:08:52 $
44
//  $Revision: 1.8 $
45
//  $Author: rudi $
46
//  $Locker:  $
47
//  $State: Exp $
48
//
49
// Change History:
50
//               $Log: not supported by cvs2svn $
51
//               Revision 1.7  2001/12/21 05:09:30  rudi
52
//
53
//               - Fixed combinatorial loops in synthesis
54
//               - Fixed byte select bug
55
//
56
//               Revision 1.6  2001/12/11 02:47:19  rudi
57
//
58
//               - Made some changes not to expect clock during reset ...
59
//
60
//               Revision 1.5  2001/11/29 02:16:28  rudi
61
//
62
//
63
//               - More Synthesis cleanup, mostly for speed
64
//               - Several bug fixes
65
//               - Changed code to avoid auto-precharge and
66
//                 burst-terminate combinations (apparently illegal ?)
67
//                 Now we will do a manual precharge ...
68
//
69
//               Revision 1.4  2001/09/24 00:38:21  rudi
70
//
71
//               Changed Reset to be active high and async.
72
//
73
//               Revision 1.3  2001/09/02 02:28:28  rudi
74
//
75
//               Many fixes for minor bugs that showed up in gate level simulations.
76
//
77
//               Revision 1.2  2001/08/10 08:16:21  rudi
78
//
79
//               - Changed IO names to be more clear.
80
//               - Uniquifyed define names to be core specific.
81
//               - Removed "Refresh Early" configuration
82
//
83
//               Revision 1.1  2001/07/29 07:34:41  rudi
84
//
85
//
86
//               1) Changed Directory Structure
87
//               2) Fixed several minor bugs
88
//
89
//               Revision 1.4  2001/06/14 01:57:37  rudi
90
//
91
//
92
//               Fixed a potential bug in a corner case situation where the TMS register
93
//               does not propegate properly during initialisation.
94
//
95
//               Revision 1.3  2001/06/12 15:19:49  rudi
96
//
97
//
98
//               Minor changes after running lint, and a small bug fix reading csr and ba_mask registers.
99
//
100
//               Revision 1.2  2001/06/03 11:37:17  rudi
101
//
102
//
103
//               1) Fixed Chip Select Mask Register
104
//                      - Power On Value is now all ones
105
//                      - Comparison Logic is now correct
106
//
107
//               2) All resets are now asynchronous
108
//
109
//               3) Converted Power On Delay to an configurable item
110
//
111
//               4) Added reset to Chip Select Output Registers
112
//
113
//               5) Forcing all outputs to Hi-Z state during reset
114
//
115
//               Revision 1.1.1.1  2001/05/13 09:39:44  rudi
116
//               Created Directory Structure
117
//
118
//
119
//
120
//
121
 
122
`include "mc_defines.v"
123
 
124
module mc_timing(clk, rst,
125
 
126
                // Wishbone Interface
127
                wb_cyc_i, wb_stb_i, wb_we_i,
128
                wb_read_go, wb_write_go, wb_first, wb_wait, mem_ack,
129
                err,
130
 
131
                // Suspend/Resume Interface
132
                susp_req, resume_req, suspended, susp_sel,
133
 
134
                // Memory Interface
135
                mc_clk, data_oe, oe_, we_, cas_, ras_, cke_,
136
                cs_en, wb_cycle, wr_cycle,
137
                mc_br, mc_bg, mc_adsc, mc_adv,
138
                mc_c_oe, mc_ack,
139
                not_mem_cyc,
140
 
141
                // Register File Interface
142
                csc, tms, cs, lmr_req, lmr_ack, cs_le_d, cs_le,
143
 
144
                // Address Select Signals
145
                cmd_a10, row_sel, next_adr, page_size,
146
 
147
                // OBCT Signals
148
                bank_set, bank_clr, bank_clr_all, bank_open, any_bank_open, row_same,
149
 
150
                // Data path Controller Signals
151
                dv, pack_le0, pack_le1, pack_le2, par_err,
152
 
153
                // Refresh Counter Signals
154
                rfr_req, rfr_ack,
155
 
156
                // Initialize Request & Ack
157
                init_req, init_ack
158
                );
159
 
160
input           clk;
161
input           rst;
162
 
163
// Wishbone Interface
164
input           wb_cyc_i, wb_stb_i, wb_we_i;
165
input           wb_read_go;
166
input           wb_write_go;
167
input           wb_first;
168
input           wb_wait;
169
output          mem_ack;
170
output          err;
171
 
172
// Suspend/Resume Interface
173
input           susp_req;
174
input           resume_req;
175
output          suspended;
176
output          susp_sel;
177
 
178
// Memory Interface
179
input           mc_clk;
180
output          data_oe;
181
output          oe_;
182
output          we_;
183
output          cas_;
184
output          ras_;
185
output          cke_;
186
output          cs_en;
187
output          wb_cycle;
188
output          wr_cycle;
189
input           mc_br;
190
output          mc_bg;
191
output          mc_adsc;
192
output          mc_adv;
193
output          mc_c_oe;
194
input           mc_ack;
195
input           not_mem_cyc;
196
 
197
// Register File Interface
198
input   [31:0]   csc;
199
input   [31:0]   tms;
200
input   [7:0]    cs;
201
input           lmr_req;
202
output          lmr_ack;
203
output          cs_le;
204
output          cs_le_d;
205
 
206
// Address Select Signals
207
input   [10:0]   page_size;
208
output          cmd_a10;
209
output          row_sel;
210
output          next_adr;
211
 
212
// OBCT Signals
213
output          bank_set;
214
output          bank_clr;
215
output          bank_clr_all;
216
input           bank_open;
217
input           any_bank_open;
218
input           row_same;
219
 
220
// Data path Controller Signals
221
output          dv;
222
output          pack_le0, pack_le1, pack_le2;   // Pack Latch Enable
223
input           par_err;
224
 
225
// Refresh Counter Signals
226
input           rfr_req;
227
output          rfr_ack;
228
 
229
// Initialize Request & Ack
230
input           init_req;
231
output          init_ack;
232
 
233
////////////////////////////////////////////////////////////////////
234
//
235
// Defines & Parameters
236
//
237
 
238
// Number of states: 66
239
parameter       [65:0]   // synopsys enum state
240
//                   6666666555555555544444444443333333333222222222211111111110000000000
241
//                   6543210987654321098765432109876543210987654321098765432109876543210
242
POR             = 66'b000000000000000000000000000000000000000000000000000000000000000001,
243
IDLE            = 66'b000000000000000000000000000000000000000000000000000000000000000010,
244
IDLE_T          = 66'b000000000000000000000000000000000000000000000000000000000000000100,
245
IDLE_T2         = 66'b000000000000000000000000000000000000000000000000000000000000001000,
246
PRECHARGE       = 66'b000000000000000000000000000000000000000000000000000000000000010000,
247
PRECHARGE_W     = 66'b000000000000000000000000000000000000000000000000000000000000100000,
248
ACTIVATE        = 66'b000000000000000000000000000000000000000000000000000000000001000000,
249
ACTIVATE_W      = 66'b000000000000000000000000000000000000000000000000000000000010000000,
250
SD_RD_WR        = 66'b000000000000000000000000000000000000000000000000000000000100000000,
251
SD_RD           = 66'b000000000000000000000000000000000000000000000000000000001000000000,
252
SD_RD_W         = 66'b000000000000000000000000000000000000000000000000000000010000000000,
253
SD_RD_LOOP      = 66'b000000000000000000000000000000000000000000000000000000100000000000,
254
SD_RD_W2        = 66'b000000000000000000000000000000000000000000000000000001000000000000,
255
SD_WR           = 66'b000000000000000000000000000000000000000000000000000010000000000000,
256
SD_WR_W         = 66'b000000000000000000000000000000000000000000000000000100000000000000,
257
BT              = 66'b000000000000000000000000000000000000000000000000001000000000000000,
258
BT_W            = 66'b000000000000000000000000000000000000000000000000010000000000000000,
259
REFR            = 66'b000000000000000000000000000000000000000000000000100000000000000000,
260
LMR0            = 66'b000000000000000000000000000000000000000000000001000000000000000000,
261
LMR1            = 66'b000000000000000000000000000000000000000000000010000000000000000000,
262
LMR2            = 66'b000000000000000000000000000000000000000000000100000000000000000000,
263
//                   6666666555555555544444444443333333333222222222211111111110000000000
264
//                   6543210987654321098765432109876543210987654321098765432109876543210
265
INIT0           = 66'b000000000000000000000000000000000000000000001000000000000000000000,
266
INIT            = 66'b000000000000000000000000000000000000000000010000000000000000000000,
267
INIT_W          = 66'b000000000000000000000000000000000000000000100000000000000000000000,
268
INIT_REFR1      = 66'b000000000000000000000000000000000000000001000000000000000000000000,
269
INIT_REFR1_W    = 66'b000000000000000000000000000000000000000010000000000000000000000000,
270
//                   6666666555555555544444444443333333333222222222211111111110000000000
271
//                   6543210987654321098765432109876543210987654321098765432109876543210
272
INIT_LMR        = 66'b000000000000000000000000000000000000000100000000000000000000000000,
273
SUSP1           = 66'b000000000000000000000000000000000000001000000000000000000000000000,
274
SUSP2           = 66'b000000000000000000000000000000000000010000000000000000000000000000,
275
SUSP3           = 66'b000000000000000000000000000000000000100000000000000000000000000000,
276
SUSP4           = 66'b000000000000000000000000000000000001000000000000000000000000000000,
277
RESUME1         = 66'b000000000000000000000000000000000010000000000000000000000000000000,
278
RESUME2         = 66'b000000000000000000000000000000000100000000000000000000000000000000,
279
BG0             = 66'b000000000000000000000000000000001000000000000000000000000000000000,
280
BG1             = 66'b000000000000000000000000000000010000000000000000000000000000000000,
281
BG2             = 66'b000000000000000000000000000000100000000000000000000000000000000000,
282
ACS_RD          = 66'b000000000000000000000000000001000000000000000000000000000000000000,
283
ACS_RD1         = 66'b000000000000000000000000000010000000000000000000000000000000000000,
284
ACS_RD2A        = 66'b000000000000000000000000000100000000000000000000000000000000000000,
285
ACS_RD2         = 66'b000000000000000000000000001000000000000000000000000000000000000000,
286
ACS_RD3         = 66'b000000000000000000000000010000000000000000000000000000000000000000,
287
ACS_RD_8_1      = 66'b000000000000000000000000100000000000000000000000000000000000000000,
288
ACS_RD_8_2      = 66'b000000000000000000000001000000000000000000000000000000000000000000,
289
ACS_RD_8_3      = 66'b000000000000000000000010000000000000000000000000000000000000000000,
290
ACS_RD_8_4      = 66'b000000000000000000000100000000000000000000000000000000000000000000,
291
ACS_RD_8_5      = 66'b000000000000000000001000000000000000000000000000000000000000000000,
292
ACS_RD_8_6      = 66'b000000000000000000010000000000000000000000000000000000000000000000,
293
ACS_WR          = 66'b000000000000000000100000000000000000000000000000000000000000000000,
294
ACS_WR1         = 66'b000000000000000001000000000000000000000000000000000000000000000000,
295
ACS_WR2         = 66'b000000000000000010000000000000000000000000000000000000000000000000,
296
ACS_WR3         = 66'b000000000000000100000000000000000000000000000000000000000000000000,
297
ACS_WR4         = 66'b000000000000001000000000000000000000000000000000000000000000000000,
298
SRAM_RD         = 66'b000000000000010000000000000000000000000000000000000000000000000000,
299
SRAM_RD0        = 66'b000000000000100000000000000000000000000000000000000000000000000000,
300
SRAM_RD1        = 66'b000000000001000000000000000000000000000000000000000000000000000000,
301
SRAM_RD2        = 66'b000000000010000000000000000000000000000000000000000000000000000000,
302
SRAM_RD3        = 66'b000000000100000000000000000000000000000000000000000000000000000000,
303
SRAM_RD4        = 66'b000000001000000000000000000000000000000000000000000000000000000000,
304
SRAM_WR         = 66'b000000010000000000000000000000000000000000000000000000000000000000,
305
SRAM_WR0        = 66'b000000100000000000000000000000000000000000000000000000000000000000,
306
SCS_RD          = 66'b000001000000000000000000000000000000000000000000000000000000000000,
307
SCS_RD1         = 66'b000010000000000000000000000000000000000000000000000000000000000000,
308
SCS_RD2         = 66'b000100000000000000000000000000000000000000000000000000000000000000,
309
SCS_WR          = 66'b001000000000000000000000000000000000000000000000000000000000000000,
310
SCS_WR1         = 66'b010000000000000000000000000000000000000000000000000000000000000000,
311
SCS_ERR         = 66'b100000000000000000000000000000000000000000000000000000000000000000;
312
 
313
////////////////////////////////////////////////////////////////////
314
//
315
// Local Registers & Wires
316
//
317
 
318
reg     [65:0]   /* synopsys enum state */ state, next_state;
319
// synopsys state_vector state
320
 
321
reg             mc_bg;
322
 
323
wire    [2:0]    mem_type;
324
wire    [1:0]    bus_width;
325
wire            kro;
326
 
327
wire            cs_a;
328
reg     [3:0]    cmd;
329
 
330
wire            mem_ack;
331
wire            mem_ack_s;
332
reg             mem_ack_d;
333
reg             err_d;
334
wire            err;
335
reg             cmd_a10;
336
reg             lmr_ack;
337
reg             lmr_ack_d;
338
reg             row_sel;
339
reg             oe_;
340
reg             oe_d;
341
reg             data_oe;
342
reg             data_oe_d;
343
reg             cke_d;
344
reg             cke_;
345
reg             init_ack;
346
reg             dv;
347
reg             rfr_ack_d;
348
reg             mc_adsc;
349
reg             mc_adv;
350
 
351
reg             bank_set;
352
reg             bank_clr;
353
reg             bank_clr_all;
354
 
355
reg             wr_set, wr_clr;
356
reg             wr_cycle;
357
 
358
reg             cmd_asserted;
359
reg             cmd_asserted2;
360
 
361
reg     [10:0]   burst_val;
362
reg     [10:0]   burst_cnt;
363
wire            burst_act;
364
reg             burst_act_rd;
365
wire            single_write;
366
 
367
reg             cs_le_d;
368
reg             cs_le;
369
reg             cs_le_r;
370
 
371
reg             susp_req_r;
372
reg             resume_req_r;
373
reg             suspended;
374
reg             suspended_d;
375
reg             susp_sel_set, susp_sel_clr, susp_sel_r;
376
 
377
reg     [3:0]    cmd_del;
378
reg     [3:0]    cmd_r;
379
reg             data_oe_r;
380
reg             data_oe_r2;
381
reg             cke_r;
382
reg             cke_rd;
383
reg             cke_o_del;
384
reg             cke_o_r1;
385
reg             cke_o_r2;
386
reg             wb_cycle_set, wb_cycle;
387
reg     [3:0]    ack_cnt;
388
wire            ack_cnt_is_0;
389
reg             cnt, cnt_next;
390
reg     [7:0]    timer;
391
reg             tmr_ld_trp, tmr_ld_trcd, tmr_ld_tcl, tmr_ld_trfc;
392
reg             tmr_ld_twr, tmr_ld_txsr;
393
reg             tmr2_ld_tscsto;
394
reg             tmr_ld_trdv;
395
reg             tmr_ld_trdz;
396
reg             tmr_ld_twr2;
397
wire            timer_is_zero;
398
reg             tmr_done;
399
reg             tmr2_ld_trdv, tmr2_ld_trdz;
400
reg             tmr2_ld_twpw, tmr2_ld_twd, tmr2_ld_twwd;
401
reg             tmr2_ld_tsrdv;
402
reg     [8:0]    timer2;
403
reg             tmr2_done;
404
wire            timer2_is_zero;
405
reg     [3:0]    ir_cnt;
406
reg             ir_cnt_ld;
407
reg             ir_cnt_dec;
408
reg             ir_cnt_done;
409
reg             rfr_ack_r;
410
reg             burst_cnt_ld;
411
reg             burst_fp;
412
reg             wb_wait_r, wb_wait_r2;
413
reg             lookup_ready1, lookup_ready2;
414
reg             burst_cnt_ld_4;
415
reg             dv_r;
416
reg             mc_adv_r1, mc_adv_r;
417
 
418
reg             next_adr;
419
reg             pack_le0, pack_le1, pack_le2;
420
reg             pack_le0_d, pack_le1_d, pack_le2_d;
421
wire            bw8, bw16;
422
 
423
reg             mc_c_oe_d;
424
reg             mc_c_oe;
425
 
426
reg             mc_le;
427
reg             mem_ack_r;
428
 
429
reg             rsts, rsts1;
430
reg             no_wb_cycle;
431
 
432
wire            bc_dec;
433
reg             ap_en;  // Auto Precharge Enable
434
reg             cmd_a10_r;
435
reg             wb_stb_first;
436
reg             tmr_ld_tavav;
437
 
438
////////////////////////////////////////////////////////////////////
439
//
440
// Aliases
441
//
442
assign mem_type  = csc[3:1];
443
assign bus_width = csc[5:4];
444
assign kro       = csc[10];
445
assign single_write = tms[9] | (tms[2:0] == 3'h0);
446
 
447
////////////////////////////////////////////////////////////////////
448
//
449
// Misc Logic
450
//
451
reg             cs_le_r1;
452
 
453
always @(posedge clk)
454
        lmr_ack <= #1 lmr_ack_d;
455
 
456
assign rfr_ack = rfr_ack_r;
457
 
458
always @(posedge clk)
459
        cs_le_r <= #1 cs_le_r1;
460
 
461
always @(posedge clk)
462
        cs_le_r1 <= #1 cs_le;
463
 
464
always @(posedge clk)
465
        cs_le <= #1 cs_le_d;
466
 
467
always @(posedge mc_clk or posedge rst)
468
        if(rst)         rsts1 <= #1 1'b1;
469
        else            rsts1 <= #1 1'b0;
470
 
471
always @(posedge clk or posedge rst)
472
        if(rst)         rsts <= #1 1'b1;
473
        else            rsts <= #1 rsts1;
474
 
475
// Control Signals Output Enable
476
always @(posedge clk or posedge rst)
477
        if(rst)         mc_c_oe <= #1 1'b0;
478
        else            mc_c_oe <= #1 mc_c_oe_d;
479
 
480
always @(posedge clk or posedge rsts)
481
        if(rsts)        mc_le <= #1 1'b0;
482
        else            mc_le <= #1 ~mc_le;
483
 
484
always @(posedge clk)
485
        pack_le0 <= #1 pack_le0_d;
486
 
487
always @(posedge clk)
488
        pack_le1 <= #1 pack_le1_d;
489
 
490
always @(posedge clk)
491
        pack_le2 <= #1 pack_le2_d;
492
 
493
always @(posedge clk or posedge rst)
494
        if(rst)         mc_adv_r1 <= #1 1'b0;
495
        else
496
        if(!mc_le)      mc_adv_r1 <= #1 mc_adv;
497
 
498
always @(posedge clk or posedge rst)
499
        if(rst)         mc_adv_r <= #1 1'b0;
500
        else
501
        if(!mc_le)      mc_adv_r <= #1 mc_adv_r1;
502
 
503
// Bus Width decoder
504
assign bw8  = (bus_width == `MC_BW_8);
505
assign bw16 = (bus_width == `MC_BW_16);
506
 
507
// Any Chip Select
508
assign cs_a = |cs;
509
 
510
// Memory to Wishbone Ack
511
assign  mem_ack = (mem_ack_d | mem_ack_s) & (wb_read_go | wb_write_go);
512
 
513
always @(posedge clk or posedge rst)
514
        if(rst)         mem_ack_r <= #1 1'b0;
515
        else            mem_ack_r <= #1 mem_ack;
516
 
517
assign  err = err_d;
518
 
519
// SDRAM Command, either delayed (for writes) or straight through
520
always @(posedge clk or posedge rst)
521
        if(rst)         cmd_r <= #1 `MC_CMD_NOP;
522
        else            cmd_r <= #1 cmd;
523
 
524
always @(posedge clk or posedge rst)
525
        if(rst)         cmd_del <= #1 `MC_CMD_NOP;
526
        else            cmd_del <= #1 cmd_r;
527
 
528
assign {cs_en, ras_, cas_, we_} = wr_cycle ? cmd_del : cmd;
529
 
530
// Track Timing of Asserting a command
531
always @(posedge clk or posedge rst)
532
        if(rst)         cmd_asserted <= #1 1'b0;
533
        else
534
        if(!mc_le)      cmd_asserted <= #1 cmd[3];
535
 
536
always @(posedge clk or posedge rst)
537
        if(rst)         cmd_asserted2 <= #1 1'b0;
538
        else
539
        if(!mc_le)      cmd_asserted2 <= #1 cmd_asserted;
540
 
541
// Output Enable
542
always @(posedge clk or posedge rst)
543
        if(rst)         oe_ <= #1 1'b1;
544
        else            oe_ <= #1 ~oe_d;
545
 
546
// Memory Bus Data lines Output Enable
547
always @(posedge clk or posedge rst)
548
        if(rst)         data_oe_r <= #1 1'b0;
549
        else            data_oe_r <= #1 data_oe_d;
550
 
551
always @(posedge clk or posedge rst)
552
        if(rst)         data_oe_r2 <= #1 1'b0;
553
        else            data_oe_r2 <= #1 data_oe_r;
554
 
555
always @(posedge clk or posedge rst)
556
        if(rst)         data_oe <= #1 1'b0;
557
        else            data_oe <= #1 wr_cycle ? data_oe_r2 : data_oe_d;
558
 
559
// Clock Enable
560
always @(posedge clk)
561
        cke_r <= #1 cke_d;
562
 
563
always @(posedge clk)
564
        cke_ <= #1 cke_r & cke_rd;
565
 
566
// CKE output delay line to time DV for reads
567
always @(posedge clk)
568
        cke_o_r1 <= #1 cke_;
569
 
570
always @(posedge clk)
571
        cke_o_r2 <= #1 cke_o_r1;
572
 
573
always @(posedge clk)
574
        cke_o_del <= #1 cke_o_r2;
575
 
576
// Delayed version of the wb_wait input
577
always @(posedge clk)
578
        wb_wait_r2 <= #1 wb_wait;
579
 
580
always @(posedge clk)
581
        wb_wait_r <= #1 wb_wait_r2;
582
 
583
// Indicates when the row_same and bank_open lookups are done
584
reg     lookup_ready1a;
585
 
586
always @(posedge clk or posedge rst)
587
        if(rst)         lookup_ready1 <= #1 1'b0;
588
        else            lookup_ready1 <= #1 cs_le & wb_cyc_i & wb_stb_i;
589
 
590
always @(posedge clk or posedge rst)
591
        if(rst)         lookup_ready2 <= #1 1'b0;
592
        else            lookup_ready2 <= #1 lookup_ready1 & wb_cyc_i & wb_stb_i;
593
 
594
// Keep Track if it is a SDRAM write cycle
595
always @(posedge clk or posedge rst)
596
        if(rst)         wr_cycle <= #1 1'b0;
597
        else
598
        if(wr_set)      wr_cycle <= #1 1'b1;
599
        else
600
        if(wr_clr)      wr_cycle <= #1 1'b0;
601
 
602
// Track when a cycle is *still* active
603
always @(posedge clk or posedge rst)
604
        if(rst)                         wb_cycle <= #1 1'b0;
605
        else
606
        if(wb_cycle_set)                wb_cycle <= #1 1'b1;
607
        else
608
        if(!wb_cyc_i | not_mem_cyc)     wb_cycle <= #1 1'b0;
609
 
610
// Thses two signals are used to signal that no wishbone cycle is in
611
// progress. Need to register them to avoid a very long combinatorial
612
// path ....
613
always @(posedge clk or posedge rst)
614
        if(rst)         no_wb_cycle <= #1 1'b0;
615
        else            no_wb_cycle <= #1 !wb_read_go & !wb_write_go;
616
 
617
// Track ack's for read cycles 
618
always @(posedge clk or posedge rst)
619
        if(rst)                                 ack_cnt <= #1 4'h0;
620
        else
621
        if(no_wb_cycle)                         ack_cnt <= #1 4'h0;
622
        else
623
        if(dv & !mem_ack_s)                     ack_cnt <= #1 ack_cnt + 4'h1;
624
        else
625
        if(!dv & mem_ack_s)                     ack_cnt <= #1 ack_cnt - 4'h1;
626
 
627
assign ack_cnt_is_0 = (ack_cnt==4'h0);
628
 
629
assign mem_ack_s = (ack_cnt != 4'h0) & !wb_wait & !mem_ack_r & wb_read_go & !(wb_we_i & wb_stb_i);
630
 
631
// Internal Cycle Tracker
632
always @(posedge clk)
633
        cnt <= #1 cnt_next;
634
 
635
// Suspend/resume Logic
636
always @(posedge clk or posedge rst)
637
        if(rst)         susp_req_r <= #1 1'b0;
638
        else            susp_req_r <= #1 susp_req;
639
 
640
always @(posedge clk or posedge rst)
641
        if(rst)         resume_req_r <= #1 1'b0;
642
        else            resume_req_r <= #1 resume_req;
643
 
644
always @(posedge clk or posedge rst)
645
        if(rst)         suspended <= #1 1'b0;
646
        else            suspended <= #1 suspended_d;
647
 
648
always @(posedge clk or posedge rst)
649
        if(rst)         rfr_ack_r <= #1 1'b0;
650
        else            rfr_ack_r <= #1 rfr_ack_d;
651
 
652
// Suspend Select Logic
653
assign susp_sel = susp_sel_r;
654
 
655
always @(posedge clk or posedge rst)
656
        if(rst)                 susp_sel_r <= #1 1'b0;
657
        else
658
        if(susp_sel_set)        susp_sel_r <= #1 1'b1;
659
        else
660
        if(susp_sel_clr)        susp_sel_r <= #1 1'b0;
661
 
662
////////////////////////////////////////////////////////////////////
663
//
664
// Timing Logic
665
//
666
wire    [3:0]    twrp;
667
wire            twd_is_zero;
668
wire    [31:0]   tms_x;
669
 
670
// FIX_ME
671
// Hard wire worst case or make it programmable ???
672
assign tms_x = (rfr_ack_d | rfr_ack_r | susp_sel | !mc_c_oe) ? 32'hffff_ffff : tms;
673
 
674
always @(posedge clk)
675
        if(tmr2_ld_tscsto)      timer2 <= #1 tms_x[24:16];
676
        else
677
        if(tmr2_ld_tsrdv)       timer2 <= #1 9'd4;      // SSRAM RD->1st DATA VALID
678
        else
679
        if(tmr2_ld_twpw)        timer2 <= #1 { 5'h0, tms_x[15:12]};
680
        else
681
        if(tmr2_ld_twd)         timer2 <= #1 { 4'h0, tms_x[19:16],1'b0};
682
        else
683
        if(tmr2_ld_twwd)        timer2 <= #1 { 3'h0, tms_x[25:20]};
684
        else
685
        if(tmr2_ld_trdz)        timer2 <= #1 { 4'h0, tms_x[11:8], 1'b1};
686
        else
687
        if(tmr2_ld_trdv)        timer2 <= #1 { tms_x[7:0], 1'b1};
688
        else
689
        if(!timer2_is_zero)     timer2 <= #1 timer2 - 9'b1;
690
 
691
assign twd_is_zero =  (tms_x[19:16] == 4'h0);
692
 
693
assign timer2_is_zero = (timer2 == 9'h0);
694
 
695
always @(posedge clk or posedge rst)
696
        if(rst) tmr2_done <= #1 1'b0;
697
        else    tmr2_done <= #1 timer2_is_zero & !tmr2_ld_trdv & !tmr2_ld_trdz &
698
                                !tmr2_ld_twpw & !tmr2_ld_twd & !tmr2_ld_twwd & !tmr2_ld_tscsto;
699
 
700
assign twrp = {2'h0,tms_x[16:15]} + tms_x[23:20];
701
 
702
// SDRAM Memories timing tracker
703
always @(posedge clk or posedge rst)
704
`ifdef MC_POR_DELAY
705
        if(rst)                 timer <= #1 `MC_POR_DELAY_VAL ;
706
        else
707
`endif
708
        if(tmr_ld_twr2)         timer <= #1 { 4'h0, tms_x[15:12] };
709
        else
710
        if(tmr_ld_trdz)         timer <= #1 { 4'h0, tms_x[11:8] };
711
        else
712
        if(tmr_ld_trdv)         timer <= #1 tms_x[7:0];
713
        else
714
        if(tmr_ld_twr)          timer <= #1 { 4'h0, twrp};
715
        else
716
        if(tmr_ld_trp)          timer <= #1 { 4'h0, tms_x[23:20]};
717
        else
718
        if(tmr_ld_trcd)         timer <= #1 { 5'h0, tms_x[19:17]};
719
        else
720
        if(tmr_ld_tcl)          timer <= #1 { 6'h0, tms_x[05:04]};
721
        else
722
        if(tmr_ld_trfc)         timer <= #1 { 4'h0, tms_x[27:24]};
723
        else
724
        if(tmr_ld_tavav)        timer <= #1 8'h3;
725
        else
726
        if(tmr_ld_txsr)         timer <= #1 8'h7;
727
        else
728
        if(!timer_is_zero & !mc_le)     timer <= #1 timer - 8'b1;
729
 
730
assign timer_is_zero = (timer == 8'h0);
731
 
732
always @(posedge clk or posedge rst)
733
        if(rst)         tmr_done <= #1 1'b0;
734
        else            tmr_done <= #1 timer_is_zero;
735
 
736
// Init Refresh Cycles Counter
737
always @(posedge clk)
738
        if(ir_cnt_ld)   ir_cnt <= #1 `MC_INIT_RFRC_CNT;
739
        else
740
        if(ir_cnt_dec)  ir_cnt <= #1 ir_cnt - 4'b1;
741
 
742
always @(posedge clk)
743
        ir_cnt_done <= #1 (ir_cnt == 4'h0);
744
 
745
// Burst Counter
746
always @(tms_x or page_size)
747
        case(tms_x[2:0])         // synopsys full_case parallel_case
748
           3'h0: burst_val = 11'h1;
749
           3'h1: burst_val = 11'h2;
750
           3'h2: burst_val = 11'h4;
751
           3'h3: burst_val = 11'h8;
752
           3'h7: burst_val = page_size;
753
        endcase
754
 
755
assign bc_dec = wr_cycle ? mem_ack_d : dv;
756
 
757
always @(posedge clk)
758
        if(burst_cnt_ld_4)      burst_cnt <= #1 11'h4; // for SSRAM only
759
        else
760
        if(burst_cnt_ld)        burst_cnt <= #1 burst_val;
761
        else
762
        if(bc_dec)              burst_cnt <= #1 burst_cnt - 11'h1;
763
 
764
always @(posedge clk or posedge rst)
765
        if(rst)                 burst_fp <= #1 1'b0;
766
        else
767
        if(burst_cnt_ld)        burst_fp <= #1 (tms_x[2:0] == 3'h7);
768
 
769
// Auto Precharge Enable
770
always @(posedge clk or posedge rst)
771
        if(rst)                 ap_en <= #1 1'b0;
772
        else
773
        if(burst_cnt_ld)        ap_en <= #1 (tms_x[2:0] == 3'h0) & !kro;
774
 
775
assign burst_act = |burst_cnt & ( |tms_x[2:0] );
776
 
777
always @(posedge clk)
778
        burst_act_rd <= #1 |burst_cnt;
779
 
780
always @(posedge clk or posedge rst)
781
        if(rst)         dv_r <= #1 1'b0;
782
        else            dv_r <= #1 dv;
783
 
784
always @(posedge clk)   // Auto Precharge Holding Register
785
        cmd_a10_r <= #1 cmd_a10;
786
 
787
////////////////////////////////////////////////////////////////////
788
//
789
// Main State Machine
790
//
791
reg             wb_write_go_r;
792
 
793
always @(posedge clk)
794
        wb_write_go_r <= #1 wb_write_go;
795
 
796
always @(posedge clk or posedge rst)
797
        if(rst)                 wb_stb_first <= #1 1'b0;
798
        else
799
        if(mem_ack)             wb_stb_first <= #1 1'b0;
800
        else
801
        if(wb_first & wb_stb_i) wb_stb_first <= #1 1'b1;
802
 
803
always @(posedge clk or posedge rst)
804
`ifdef MC_POR_DELAY
805
        if(rst)         state <= #1 POR;
806
`else
807
        if(rst)         state <= #1 IDLE;
808
`endif
809
        else            state <= #1 next_state;
810
 
811
always @(state or cs_a or cs_le or cs_le_r or
812
        twd_is_zero or wb_stb_i or wb_write_go_r or
813
        wb_first or wb_read_go or wb_write_go or wb_wait or mem_ack_r or wb_we_i or
814
        ack_cnt_is_0 or wb_wait_r or cnt or wb_cycle or wr_cycle or
815
        mem_type or kro or lookup_ready2 or row_same or cmd_a10_r or
816
        bank_open or single_write or
817
        cmd_asserted or tmr_done or tmr2_done or ir_cnt_done or cmd_asserted2 or
818
        burst_act or burst_act_rd or burst_fp or cke_ or cke_r or cke_o_del or
819
        rfr_req or lmr_req or init_req or rfr_ack_r or susp_req_r or resume_req_r or
820
        mc_br or bw8 or bw16 or dv_r or mc_adv_r or mc_ack or wb_stb_first or ap_en
821
        )
822
   begin
823
        next_state = state;     // Default keep current state
824
        cnt_next = 1'b0;
825
 
826
        cmd = `MC_CMD_NOP;
827
        cmd_a10 = ap_en;
828
        oe_d = 1'b0;
829
        data_oe_d = 1'b0;
830
        cke_d = 1'b1;
831
        cke_rd = 1'b1;
832
        mc_adsc = 1'b0;
833
        mc_adv = 1'b0;
834
 
835
        bank_set = 1'b0;
836
        bank_clr = 1'b0;
837
        bank_clr_all = 1'b0;
838
 
839
        burst_cnt_ld = 1'b0;
840
        burst_cnt_ld_4 = 1'b0;
841
        tmr_ld_trp = 1'b0;
842
        tmr_ld_trcd = 1'b0;
843
        tmr_ld_tcl = 1'b0;
844
        tmr_ld_trfc = 1'b0;
845
        tmr_ld_twr = 1'b0;
846
        tmr_ld_txsr = 1'b0;
847
        tmr_ld_trdv = 1'b0;
848
        tmr_ld_trdz = 1'b0;
849
        tmr_ld_twr2 = 1'b0;
850
        tmr_ld_tavav = 1'b0;
851
 
852
        tmr2_ld_trdv = 1'b0;
853
        tmr2_ld_trdz = 1'b0;
854
 
855
        tmr2_ld_twpw = 1'b0;
856
        tmr2_ld_twd = 1'b0;
857
        tmr2_ld_twwd = 1'b0;
858
        tmr2_ld_tsrdv = 1'b0;
859
        tmr2_ld_tscsto = 1'b0;
860
 
861
        mem_ack_d = 1'b0;
862
        err_d = 1'b0;
863
        rfr_ack_d = 1'b0;
864
        lmr_ack_d = 1'b0;
865
        init_ack = 1'b0;
866
 
867
        ir_cnt_dec = 1'b0;
868
        ir_cnt_ld = 1'b0;
869
 
870
        row_sel = 1'b0;
871
        cs_le_d = 1'b0;
872
        wr_clr = 1'b0;
873
        wr_set = 1'b0;
874
        wb_cycle_set = 1'b0;
875
        dv = 1'b0;
876
 
877
        suspended_d = 1'b0;
878
        susp_sel_set = 1'b0;
879
        susp_sel_clr = 1'b0;
880
        mc_bg = 1'b0;
881
 
882
        next_adr = 1'b0;
883
        pack_le0_d = 1'b0;
884
        pack_le1_d = 1'b0;
885
        pack_le2_d = 1'b0;
886
 
887
        mc_c_oe_d = 1'b1;
888
 
889
        case(state)             // synopsys full_case parallel_case
890
`ifdef MC_POR_DELAY
891
           POR:
892
              begin
893
                if(tmr_done)    next_state = IDLE;
894
              end
895
`endif
896
           IDLE:
897
              begin
898
                //cs_le_d = wb_stb_first | lmr_req;
899
                cs_le_d = wb_stb_first;
900
 
901
                burst_cnt_ld = 1'b1;
902
                wr_clr = 1'b1;
903
 
904
                if(mem_type == `MC_MEM_TYPE_SCS)        tmr2_ld_tscsto = 1'b1;
905
                if(mem_type == `MC_MEM_TYPE_SRAM)       tmr2_ld_tsrdv = 1'b1;
906
 
907
                if(rfr_req)
908
                   begin
909
                        rfr_ack_d = 1'b1;
910
                        next_state = PRECHARGE;
911
                   end
912
                else
913
                if(init_req)
914
                   begin
915
                        cs_le_d = 1'b1;
916
                        next_state = INIT0;
917
                   end
918
                else
919
                if(lmr_req & lookup_ready2)
920
                   begin
921
                        lmr_ack_d = 1'b1;
922
                        cs_le_d = 1'b1;
923
                        next_state = LMR0;
924
                   end
925
                else
926
                if(susp_req_r & !wb_cycle)
927
                   begin
928
                        cs_le_d = 1'b1;
929
                        susp_sel_set = 1'b1;
930
                        next_state = SUSP1;
931
                   end
932
                else
933
                if(cs_a & (wb_read_go | wb_write_go) & lookup_ready2)
934
                  begin
935
                   wb_cycle_set = 1'b1;
936
                   case(mem_type)               // synopsys full_case parallel_case
937
                     `MC_MEM_TYPE_SDRAM:                // SDRAM
938
                        if((lookup_ready2) & !wb_wait)
939
                           begin
940
                                if(wb_write_go | (wb_we_i & wb_stb_i))  wr_set = 1'b1;
941
                                if(kro & bank_open & row_same)  next_state = SD_RD_WR;
942
                                else
943
                                if(kro & bank_open)             next_state = PRECHARGE;
944
                                else                            next_state = ACTIVATE;
945
                           end
946
                     `MC_MEM_TYPE_ACS:
947
                        begin                           // Async Chip Select
948
                                if(!wb_wait)
949
                                   begin
950
                                        cs_le_d = 1'b1;
951
                                        if(wb_write_go)
952
                                           begin
953
                                                        data_oe_d = 1'b1;
954
                                                        next_state = ACS_WR;
955
                                           end
956
                                        else            next_state = ACS_RD;
957
                                   end
958
                        end
959
                     `MC_MEM_TYPE_SCS:
960
                        begin                           // Sync Chip Select
961
                                if(!wb_wait)
962
                                   begin
963
                                        cs_le_d = 1'b1;
964
                                        if(wb_write_go)
965
                                           begin
966
                                                cmd = `MC_CMD_XWR;
967
                                                data_oe_d = 1'b1;
968
                                                tmr_ld_twr2 = 1'b1;
969
                                                next_state = SCS_WR;
970
                                           end
971
                                        else
972
                                           begin
973
                                                cmd = `MC_CMD_XRD;
974
                                                oe_d = 1'b1;
975
                                                tmr_ld_trdv = 1'b1;
976
                                                next_state = SCS_RD;
977
                                           end
978
                                   end
979
                        end
980
                     `MC_MEM_TYPE_SRAM:
981
                        begin           // SRAM
982
                                if(!wb_wait)
983
                                   begin
984
                                        cs_le_d = 1'b1;
985
                                        if(wb_write_go)
986
                                           begin
987
                                                data_oe_d = 1'b1;
988
                                                mem_ack_d = 1'b1;
989
                                                next_state = SRAM_WR;
990
                                           end
991
                                        else
992
                                           begin
993
                                                cmd = `MC_CMD_XRD;
994
                                                oe_d = 1'b1;
995
                                                mc_adsc = 1'b1;
996
                                                next_state = SRAM_RD;
997
                                           end
998
                                   end
999
                        end
1000
                   endcase
1001
                  end
1002
                else
1003
                if(mc_br)
1004
                   begin
1005
                        if(!cmd_asserted2)
1006
                           begin
1007
                                next_state = BG0;
1008
                                mc_c_oe_d = 1'b0;
1009
                           end
1010
                   end
1011
              end
1012
 
1013
           IDLE_T:
1014
              begin
1015
                cmd_a10 = cmd_a10_r;    // Hold Auto Precharge 'til cycle finishes
1016
                if(tmr_done & wb_cycle & !wb_wait)      cs_le_d = 1'b1;
1017
                if(tmr_done)    next_state = IDLE;
1018
              end
1019
 
1020
           IDLE_T2:
1021
              begin
1022
                if(tmr2_done & (!wb_wait | !wb_cycle) )
1023
                   begin
1024
                        cs_le_d = wb_cycle;
1025
                        if(cs_le_r | !wb_cycle) next_state = IDLE;
1026
                   end
1027
              end
1028
 
1029
                /////////////////////////////////////////
1030
                // SCS STATES ....
1031
                /////////////////////////////////////////
1032
           SCS_RD:
1033
              begin
1034
                cmd = `MC_CMD_XRD;
1035
                oe_d = 1'b1;
1036
                tmr_ld_trdv = 1'b1;
1037
                if(mc_ack)      next_state = SCS_RD1;
1038
                else
1039
                if(tmr2_done)   next_state = SCS_ERR;
1040
              end
1041
 
1042
           SCS_RD1:
1043
              begin
1044
                cmd = `MC_CMD_XRD;
1045
                oe_d = 1'b1;
1046
                if(tmr_done)
1047
                   begin
1048
                        mem_ack_d = 1'b1;
1049
                        tmr_ld_trdz = 1'b1;
1050
                        next_state = SCS_RD2;
1051
                   end
1052
              end
1053
 
1054
           SCS_RD2:
1055
              begin
1056
                tmr_ld_trdz = 1'b1;
1057
                next_state = IDLE_T;
1058
              end
1059
 
1060
           SCS_WR:
1061
              begin
1062
                tmr_ld_twr2 = 1'b1;
1063
                cmd = `MC_CMD_XWR;
1064
                data_oe_d = 1'b1;
1065
                if(mc_ack)      next_state = SCS_WR1;
1066
                else
1067
                if(tmr2_done)   next_state = SCS_ERR;
1068
              end
1069
 
1070
           SCS_WR1:
1071
              begin
1072
                data_oe_d = 1'b1;
1073
                if(tmr_done)
1074
                   begin
1075
                        mem_ack_d = 1'b1;
1076
                        next_state = IDLE_T;
1077
                   end
1078
                else    cmd = `MC_CMD_XWR;
1079
              end
1080
 
1081
           SCS_ERR:
1082
              begin
1083
                mem_ack_d = 1'b1;
1084
                err_d = 1'b1;
1085
                next_state = IDLE_T2;
1086
              end
1087
 
1088
                /////////////////////////////////////////
1089
                // SSRAM STATES ....
1090
                /////////////////////////////////////////
1091
           SRAM_RD:
1092
              begin
1093
                cmd = `MC_CMD_XRD;
1094
                oe_d = 1'b1;
1095
                mc_adsc = 1'b1;
1096
                tmr2_ld_tsrdv = 1'b1;
1097
                burst_cnt_ld_4 = 1'b1;
1098
                if(cmd_asserted)        next_state = SRAM_RD0;
1099
              end
1100
 
1101
           SRAM_RD0:
1102
              begin
1103
                mc_adv = 1'b1;
1104
                oe_d = 1'b1;
1105
                if(tmr2_done)
1106
                   begin
1107
                        mc_adv = !wb_wait;
1108
                        next_state = SRAM_RD1;
1109
                   end
1110
              end
1111
 
1112
           SRAM_RD1:
1113
              begin
1114
                if(mc_adv_r)    dv = ~dv_r;
1115
                mc_adv = !wb_wait;
1116
 
1117
                if(!burst_act | !wb_read_go)    next_state = SRAM_RD2;
1118
                else            oe_d = 1'b1;
1119
              end
1120
 
1121
           SRAM_RD2:
1122
              begin
1123
                if(ack_cnt_is_0 & wb_read_go)   next_state = SRAM_RD3;
1124
                else
1125
                if(!wb_read_go)
1126
                   begin
1127
                        mc_adsc = 1'b1;
1128
                        next_state = SRAM_RD4;
1129
                   end
1130
              end
1131
 
1132
           SRAM_RD3:
1133
              begin
1134
                if(!wb_read_go)
1135
                   begin
1136
                        mc_adsc = 1'b1;
1137
                        next_state = SRAM_RD4;
1138
                   end
1139
                else
1140
                if(!wb_wait)
1141
                   begin
1142
                        cs_le_d = 1'b1;
1143
                        next_state = SRAM_RD;
1144
                   end
1145
              end
1146
 
1147
           SRAM_RD4:    // DESELECT
1148
              begin
1149
                if(wb_cycle)    cs_le_d = 1'b1; // For RMW
1150
                mc_adsc = 1'b1;
1151
                next_state = IDLE;
1152
              end
1153
 
1154
           SRAM_WR:
1155
              begin
1156
                cmd = `MC_CMD_XWR;
1157
                mc_adsc = 1'b1;
1158
                data_oe_d = 1'b1;
1159
                if(cmd_asserted)
1160
                   begin
1161
                        if(wb_wait)             next_state = SRAM_WR0;
1162
                        else
1163
                        if(!wb_write_go)
1164
                           begin
1165
                                mc_adsc = 1'b1;
1166
                                next_state = SRAM_RD4;
1167
                           end
1168
                        else
1169
                           begin
1170
                                data_oe_d = 1'b1;
1171
                                mem_ack_d = ~mem_ack_r;
1172
                           end
1173
                   end
1174
              end
1175
 
1176
           SRAM_WR0:
1177
              begin
1178
                if(wb_wait)             next_state = SRAM_WR0;
1179
                else
1180
                if(!wb_write_go)
1181
                   begin
1182
                        mc_adsc = 1'b1;
1183
                        next_state = SRAM_RD4;
1184
                   end
1185
                else
1186
                   begin
1187
                        data_oe_d = 1'b1;
1188
                        next_state = SRAM_WR;
1189
                   end
1190
              end
1191
 
1192
                /////////////////////////////////////////
1193
                // Async Devices STATES ....
1194
                /////////////////////////////////////////
1195
           ACS_RD:
1196
              begin
1197
                cmd = `MC_CMD_XRD;
1198
                oe_d = 1'b1;
1199
                tmr2_ld_trdv = 1'b1;
1200
                next_state = ACS_RD1;
1201
              end
1202
 
1203
           ACS_RD1:
1204
              begin     // 32 bit, 8 bit - first; 16 bit - first
1205
                cmd = `MC_CMD_XRD;
1206
                oe_d = 1'b1;
1207
                if(tmr2_done)
1208
                   begin
1209
                        if(bw8 | bw16)          next_adr = 1'b1;
1210
                        if(bw8)                 next_state = ACS_RD_8_1;
1211
                        else
1212
                        if(bw16)                next_state = ACS_RD_8_5;
1213
                        else                    next_state = ACS_RD2A;
1214
                   end
1215
              end
1216
 
1217
           ACS_RD_8_1:
1218
              begin     // 8 bit 2nd byte
1219
                pack_le0_d = 1'b1;
1220
                cmd = `MC_CMD_XRD;
1221
                oe_d = 1'b1;
1222
                tmr2_ld_trdv = 1'b1;
1223
                next_state = ACS_RD_8_2;
1224
              end
1225
 
1226
           ACS_RD_8_2:
1227
              begin
1228
                cmd = `MC_CMD_XRD;
1229
                oe_d = 1'b1;
1230
                if(tmr2_done)
1231
                   begin
1232
                        next_adr = 1'b1;
1233
                        next_state = ACS_RD_8_3;
1234
                   end
1235
              end
1236
 
1237
           ACS_RD_8_3:
1238
              begin     // 8 bit 3rd byte
1239
                pack_le1_d = 1'b1;
1240
                cmd = `MC_CMD_XRD;
1241
                oe_d = 1'b1;
1242
                tmr2_ld_trdv = 1'b1;
1243
                next_state = ACS_RD_8_4;
1244
              end
1245
 
1246
           ACS_RD_8_4:
1247
              begin
1248
                cmd = `MC_CMD_XRD;
1249
                oe_d = 1'b1;
1250
                if(tmr2_done)
1251
                   begin
1252
                        next_adr = 1'b1;
1253
                        next_state = ACS_RD_8_5;
1254
                   end
1255
              end
1256
 
1257
           ACS_RD_8_5:
1258
              begin     // 8 bit 4th byte; 16 bit 2nd word
1259
                if(bw8)                 pack_le2_d = 1'b1;
1260
                if(bw16)                pack_le0_d = 1'b1;
1261
                cmd = `MC_CMD_XRD;
1262
                oe_d = 1'b1;
1263
                tmr2_ld_trdv = 1'b1;
1264
                next_state = ACS_RD_8_6;
1265
              end
1266
 
1267
           ACS_RD_8_6:
1268
              begin
1269
                cmd = `MC_CMD_XRD;
1270
                oe_d = 1'b1;
1271
                if(tmr2_done)
1272
                   begin
1273
                        next_state = ACS_RD2;
1274
                   end
1275
              end
1276
 
1277
           ACS_RD2A:
1278
              begin
1279
                oe_d = 1'b1;
1280
                cmd = `MC_CMD_XRD;
1281
                next_state = ACS_RD2;
1282
              end
1283
 
1284
           ACS_RD2:
1285
              begin
1286
                cmd = `MC_CMD_XRD;
1287
                next_state = ACS_RD3;
1288
              end
1289
 
1290
           ACS_RD3:
1291
              begin
1292
                mem_ack_d = 1'b1;
1293
                tmr2_ld_trdz = 1'b1;
1294
                next_state = IDLE_T2;
1295
              end
1296
 
1297
           ACS_WR:
1298
              begin
1299
                tmr2_ld_twpw = 1'b1;
1300
                cmd = `MC_CMD_XWR;
1301
                data_oe_d = 1'b1;
1302
                next_state = ACS_WR1;
1303
              end
1304
 
1305
           ACS_WR1:
1306
              begin
1307
                if(!cmd_asserted)       tmr2_ld_twpw = 1'b1;
1308
                cmd = `MC_CMD_XWR;
1309
                data_oe_d = 1'b1;
1310
                if(tmr2_done)
1311
                   begin
1312
                        tmr2_ld_twd = 1'b1;
1313
                        next_state = ACS_WR2;
1314
                   end
1315
              end
1316
 
1317
           ACS_WR2:
1318
              begin
1319
                if(twd_is_zero) next_state = ACS_WR3;
1320
                else
1321
                   begin
1322
                        cmd = `MC_CMD_XRD;
1323
                        data_oe_d = 1'b1;
1324
                        next_state = ACS_WR3;
1325
                   end
1326
              end
1327
 
1328
           ACS_WR3:
1329
              begin
1330
                if(tmr2_done)   next_state = ACS_WR4;
1331
                else            cmd = `MC_CMD_XRD;
1332
              end
1333
 
1334
           ACS_WR4:
1335
              begin
1336
                tmr2_ld_twwd = 1'b1;
1337
                mem_ack_d = 1'b1;
1338
                next_state = IDLE_T2;
1339
              end
1340
 
1341
                /////////////////////////////////////////
1342
                // SDRAM STATES ....
1343
                /////////////////////////////////////////
1344
 
1345
           PRECHARGE:
1346
              begin
1347
                cmd = `MC_CMD_PC;
1348
                if(rfr_ack_r)
1349
                   begin
1350
                        rfr_ack_d = 1'b1;
1351
                        cmd_a10 = `MC_ALL_BANKS;
1352
                        bank_clr_all = 1'b1;
1353
                   end
1354
                else
1355
                   begin
1356
                        bank_clr = 1'b1;
1357
                        cmd_a10 = `MC_SINGLE_BANK;
1358
                   end
1359
                tmr_ld_trp = 1'b1;
1360
                if(cmd_asserted)        next_state = PRECHARGE_W;
1361
              end
1362
 
1363
           PRECHARGE_W:
1364
              begin
1365
                rfr_ack_d = rfr_ack_r;
1366
                if(tmr_done)
1367
                   begin
1368
                        if(rfr_ack_r)   next_state = REFR;
1369
                        else            next_state = ACTIVATE;
1370
                   end
1371
              end
1372
 
1373
           ACTIVATE:
1374
              begin
1375
                if(!wb_wait_r)
1376
                   begin
1377
                        row_sel = 1'b1;
1378
                        tmr_ld_trcd = 1'b1;
1379
                        cmd = `MC_CMD_ACT;
1380
                   end
1381
                if(cmd_asserted)        next_state = ACTIVATE_W;
1382
              end
1383
 
1384
           ACTIVATE_W:
1385
              begin
1386
                row_sel = 1'b1;
1387
                if(wb_write_go | (wb_we_i & wb_stb_i))  wr_set = 1'b1;
1388
 
1389
                if(kro)         bank_set = 1'b1;
1390
 
1391
                if(tmr_done)
1392
                   begin
1393
                        if(wb_write_go)
1394
                           begin
1395
                                mem_ack_d = ~mem_ack_r;
1396
                                cmd_a10 = ap_en | (single_write & !kro);
1397
                                next_state = SD_WR;
1398
                           end
1399
                        else
1400
                        if(!wb_wait_r)  next_state = SD_RD;
1401
                   end
1402
              end
1403
 
1404
           SD_RD_WR:
1405
              begin
1406
                if(wb_write_go | (wb_we_i & wb_stb_i))  wr_set = 1'b1;
1407
 
1408
                if(wb_write_go & !wb_wait)
1409
                   begin        // Write
1410
                        data_oe_d = 1'b1;
1411
                        mem_ack_d = ~mem_ack_r;
1412
                        cmd_a10 = ap_en | (single_write & !kro);
1413
                        next_state = SD_WR;
1414
                   end
1415
                else
1416
                if(!wb_wait)
1417
                   begin        // Read
1418
                        if(kro)
1419
                           begin
1420
                                if(!wb_wait_r)  next_state = SD_RD;
1421
                           end
1422
                        else    next_state = SD_RD;
1423
                   end
1424
              end
1425
 
1426
           SD_WR:       // Write Command
1427
              begin     // Does the first single write
1428
                data_oe_d = 1'b1;
1429
                tmr_ld_twr = 1'b1;
1430
                cnt_next = ~cnt;
1431
                cmd = `MC_CMD_WR;
1432
 
1433
                cmd_a10 = ap_en | (single_write & !kro);
1434
 
1435
                if(!cnt & wb_cycle & burst_act) cke_d = ~wb_wait;
1436
                else                            cke_d = cke_r;
1437
 
1438
                if(cmd_asserted)
1439
                   begin
1440
                        mem_ack_d = !mem_ack_r & wb_write_go & !wb_wait & wb_cycle & burst_act;
1441
 
1442
                        if(wb_cycle & !burst_act)       next_state = IDLE_T;
1443
                        else
1444
                        if(wb_write_go)                 next_state = SD_WR_W;
1445
                        else
1446
                        if(burst_act & !single_write)   next_state = BT;
1447
                        else
1448
                        if(!ap_en)                      next_state = BT_W;
1449
                        else                            next_state = IDLE_T;
1450
                   end
1451
 
1452
              end
1453
 
1454
           SD_WR_W:
1455
              begin     // Does additional Writes or Times them
1456
                tmr_ld_twr = 1'b1;
1457
                cnt_next = ~cnt;
1458
 
1459
                if(single_write & wb_cycle)
1460
                   begin
1461
                        cmd = `MC_CMD_WR;
1462
                   end
1463
                cmd_a10 = ap_en | (single_write & !kro);
1464
 
1465
                data_oe_d = 1'b1;
1466
                mem_ack_d = !mem_ack_r & wb_write_go & !wb_wait & wr_cycle & burst_act;
1467
 
1468
                if(!cnt)        cke_d = ~wb_wait;
1469
                else            cke_d = cke_r;
1470
 
1471
                if( (single_write & cke_r) | (!single_write & !cnt & !wb_wait) | (!single_write & cnt & cke_r) )
1472
                   begin
1473
                        if(single_write & !wb_cycle)            next_state = IDLE_T;
1474
                        else
1475
                        if(burst_act & !single_write & !wb_write_go_r)
1476
                           begin
1477
                                cmd = `MC_CMD_BT;
1478
                                next_state = BT;
1479
                           end
1480
                        else
1481
                        if(!burst_act & !ap_en)                 next_state = BT_W;
1482
                        else
1483
                        if(!burst_act)                          next_state = IDLE_T;
1484
                        else
1485
                        if(!wb_write_go_r & wb_read_go)         next_state = IDLE_T;    // Added for WMR
1486
                   end
1487
              end
1488
 
1489
           SD_RD:       // Read Command
1490
              begin
1491
                cmd = `MC_CMD_RD;
1492
                cmd_a10 = ap_en;
1493
                tmr_ld_tcl = 1'b1;
1494
                if(cmd_asserted)                        next_state = SD_RD_W;
1495
              end
1496
 
1497
           SD_RD_W:
1498
              begin
1499
                if(tmr_done)                            next_state = SD_RD_LOOP;
1500
              end
1501
 
1502
           SD_RD_LOOP:
1503
              begin
1504
                cnt_next = ~cnt;
1505
 
1506
                if(cnt & !(burst_act & !wb_cycle) & burst_act )         cke_rd = !wb_wait;
1507
                else                                                    cke_rd = cke_;
1508
 
1509
                if(wb_cycle & !cnt & burst_act_rd & cke_o_del)          dv = 1'b1;
1510
 
1511
                if(wb_cycle & wb_write_go)              next_state = BT;
1512
                else
1513
                if(burst_act & !wb_cycle)               next_state = BT;
1514
                else
1515
                if(!burst_act)                          next_state = SD_RD_W2;
1516
              end
1517
 
1518
           SD_RD_W2:
1519
              begin
1520
                if(wb_write_go | ack_cnt_is_0)
1521
                   begin
1522
                        if(!ap_en & !kro)               next_state = BT_W;
1523
                        else
1524
                        if(!wb_wait & !mem_ack_r)       next_state = IDLE_T;
1525
                   end
1526
              end
1527
 
1528
           BT:
1529
              begin
1530
                cmd = `MC_CMD_BT;
1531
                tmr_ld_trp = 1'b1;
1532
                if(cmd_asserted)                        next_state = BT_W;
1533
              end
1534
 
1535
           BT_W:
1536
              begin
1537
                cmd_a10 = cmd_a10_r;    // Hold Auto Precharge 'til cycle finishes
1538
 
1539
                if(kro & tmr_done)
1540
                   begin
1541
                        if(kro & !wb_wait & (wb_read_go | wb_write_go) )        cs_le_d = 1'b1;
1542
                        next_state = IDLE;
1543
                   end
1544
                else
1545
                if(!kro & tmr_done)             // Must do a PRECHARGE after Burst Terminate
1546
                   begin
1547
                        bank_clr = 1'b1;
1548
                        cmd = `MC_CMD_PC;
1549
                        cmd_a10 = `MC_SINGLE_BANK;
1550
                        tmr_ld_trp = 1'b1;
1551
                        if(cmd_asserted)        next_state = IDLE_T;
1552
                   end
1553
              end
1554
 
1555
           REFR:        // Refresh Cycle
1556
              begin
1557
                cs_le_d = 1'b1;
1558
                cmd = `MC_CMD_ARFR;
1559
                tmr_ld_trfc = 1'b1;
1560
                rfr_ack_d = 1'b1;
1561
                if(cmd_asserted)
1562
                   begin
1563
                        susp_sel_clr = 1'b1;
1564
                        next_state = IDLE_T;
1565
                   end
1566
              end
1567
 
1568
           LMR0:
1569
              begin
1570
                lmr_ack_d = 1'b1;
1571
                cmd = `MC_CMD_PC;
1572
                cmd_a10 = `MC_ALL_BANKS;
1573
                bank_clr_all = 1'b1;
1574
                tmr_ld_trp = 1'b1;
1575
                if(cmd_asserted)                next_state = LMR1;
1576
              end
1577
 
1578
           LMR1:
1579
              begin
1580
                lmr_ack_d = 1'b1;
1581
                if(tmr_done)                    next_state = LMR2;
1582
              end
1583
 
1584
           LMR2:
1585
              begin
1586
                bank_clr_all = 1'b1;
1587
                cmd = `MC_CMD_LMR;
1588
                tmr_ld_trfc = 1'b1;
1589
                lmr_ack_d = 1'b1;
1590
                if(cmd_asserted)                next_state = IDLE_T;
1591
              end
1592
 
1593
           INIT0:
1594
              begin
1595
                cs_le_d = 1'b1;
1596
                next_state = INIT;
1597
              end
1598
 
1599
           INIT:        // Initialize SDRAMS
1600
              begin     // PRECHARGE
1601
                init_ack = 1'b1;
1602
                cmd = `MC_CMD_PC;
1603
                cmd_a10 = `MC_ALL_BANKS;
1604
                bank_clr_all = 1'b1;
1605
                tmr_ld_trp = 1'b1;
1606
                ir_cnt_ld = 1'b1;
1607
                if(cmd_asserted)                next_state = INIT_W;
1608
              end
1609
 
1610
           INIT_W:
1611
              begin
1612
                init_ack = 1'b1;
1613
                if(tmr_done)                    next_state = INIT_REFR1;
1614
              end
1615
 
1616
           INIT_REFR1:  // Init Refresh Cycle 1
1617
              begin
1618
                init_ack = 1'b1;
1619
                cmd = `MC_CMD_ARFR;
1620
                tmr_ld_trfc = 1'b1;
1621
                if(cmd_asserted)
1622
                   begin
1623
                        ir_cnt_dec = 1'b1;
1624
                        next_state = INIT_REFR1_W;
1625
                   end
1626
              end
1627
 
1628
           INIT_REFR1_W:
1629
              begin
1630
                init_ack = 1'b1;
1631
                if(tmr_done)
1632
                   begin
1633
                        if(ir_cnt_done)         next_state = INIT_LMR;
1634
                        else                    next_state = INIT_REFR1;
1635
                   end
1636
              end
1637
 
1638
           INIT_LMR:
1639
              begin
1640
                init_ack = 1'b1;
1641
                cmd = `MC_CMD_LMR;
1642
                bank_clr_all = 1'b1;
1643
                tmr_ld_trfc = 1'b1;
1644
                if(cmd_asserted)                next_state = IDLE_T;
1645
              end
1646
 
1647
                /////////////////////////////////////////
1648
                // Bus Arbitration STATES ....
1649
                /////////////////////////////////////////
1650
           BG0:
1651
              begin     // Bus Grant
1652
                mc_bg = 1'b1;
1653
                mc_c_oe_d = 1'b0;
1654
                next_state = BG1;
1655
              end
1656
           BG1:
1657
              begin     // Bus Grant
1658
                mc_bg = 1'b1;
1659
                cs_le_d = 1'b1;
1660
                mc_c_oe_d = 1'b0;
1661
                next_state = BG2;
1662
              end
1663
           BG2:
1664
              begin     // Bus Grant
1665
                cs_le_d = 1'b1;
1666
                mc_bg = !wb_read_go & !wb_write_go &
1667
                        !rfr_req & !init_req & !lmr_req &
1668
                        !susp_req_r;
1669
                tmr_ld_tavav = 1'b1;
1670
                mc_c_oe_d = mc_br;
1671
                if(!mc_br)      next_state = IDLE_T;
1672
              end
1673
 
1674
                /////////////////////////////////////////
1675
                // SUSPEND/RESUME STATES ....
1676
                /////////////////////////////////////////
1677
           SUSP1:
1678
              begin             // Precharge All
1679
                cmd = `MC_CMD_PC;
1680
                cmd_a10 = `MC_ALL_BANKS;
1681
                bank_clr_all = 1'b1;
1682
                tmr_ld_trp = 1'b1;
1683
                if(cmd_asserted)        next_state = SUSP2;
1684
              end
1685
 
1686
           SUSP2:
1687
              begin
1688
                if(tmr_done)    next_state = SUSP3;
1689
              end
1690
 
1691
           SUSP3:
1692
              begin             // Enter Self refresh Mode
1693
                cke_d = 1'b0;
1694
                cmd = `MC_CMD_ARFR;
1695
                rfr_ack_d = 1'b1;
1696
                if(cmd_asserted)
1697
                   begin
1698
                        next_state = SUSP4;
1699
                   end
1700
              end
1701
 
1702
           SUSP4:
1703
              begin             // Now we are suspended
1704
                cke_rd = 1'b0;
1705
                suspended_d = 1'b1;
1706
                tmr_ld_txsr = 1'b1;
1707
                if(resume_req_r)        next_state = RESUME1;
1708
              end
1709
 
1710
           RESUME1:
1711
              begin
1712
                suspended_d = 1'b1;
1713
                tmr_ld_txsr = 1'b1;
1714
                next_state = RESUME2;
1715
              end
1716
 
1717
           RESUME2:
1718
              begin
1719
                suspended_d = 1'b1;
1720
                if(tmr_done)    next_state = REFR;
1721
              end
1722
 
1723
// synopsys translate_off
1724
           default:
1725
                $display("MC_TIMING SM: Entered non existing state ... (%t)",$time);
1726
// synopsys translate_on
1727
 
1728
        endcase
1729
   end
1730
 
1731
endmodule

powered by: WebSVN 2.1.0

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