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 16

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

powered by: WebSVN 2.1.0

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