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

Subversion Repositories mem_ctrl

[/] [mem_ctrl/] [trunk/] [rtl/] [verilog/] [mc_timing.v] - Blame information for rev 12

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

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

powered by: WebSVN 2.1.0

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