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

Subversion Repositories wdsp

[/] [wdsp/] [trunk/] [rtl/] [verilog/] [minsoc/] [mc/] [mc_timing.v] - Blame information for rev 5

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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