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

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [lib/] [hynix/] [ddr2/] [HY5PS121621F_PACK.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
------------------------------------------------------
2
--      Hynix 4BANKS X 8M X 16bits DDR2 SDRAM       --
3
--                                                  --
4
--          Packages for HY5PS121621F.vhd           --
5
--                                                  --
6
--                 HHHH    HHHH                     --
7
--                 HHHH    HHHH                     --
8
--       ,O0O.  ,O0 .HH ,O0 .HH                     --
9
--      (O000O)(000  )H(000  )H    Hynix            --
10
--       `O0O'  `O0 'HH `O0 'HH                     -- 
11
--                 HHHH    HHHH    Semiconductor    --
12
--                 HHHH    HHHH                     --
13
------------------------------------------------------
14
 
15
---------------------------------------------------------------------------------------------------------
16
LIBRARY IEEE;
17
USE IEEE.STD_LOGIC_1164.all;
18
library grlib;
19
use grlib.stdlib.all;
20
--USE IEEE.STD_LOGIC_ARITH.all;
21
--USE IEEE.STD_LOGIC_UNSIGNED.all;
22
---------------------------------------------------------------------------------------------------
23
 
24
package HY5PS121621F_PACK is
25
 
26
---------------------------------------------------------------------------------------------------
27
  constant NUM_OF_MROPCODE : integer := 13;
28
 
29
  constant NUM_OF_ROW_ADD : integer := 13;
30
 
31
  constant NUM_OF_COL_ADD : integer := 10;
32
 
33
  constant NUM_OF_BANK_ADD : integer := 2;
34
 
35
  constant WORD_SIZE : integer := 16;
36
 
37
  constant NUM_OF_ROWS : integer := 2**NUM_OF_ROW_ADD;
38
 
39
  constant NUM_OF_COLS : integer := 2**NUM_OF_COL_ADD;
40
 
41
  constant NUM_OF_BANKS : integer := 2**NUM_OF_BANK_ADD;
42
 
43
  constant NUM_OF_BUFFERS : integer := 3;
44
 
45
  type PART_NUM_TYPE is (B400, B533, B667, B800);
46
 
47
  type PART_NUM is array (B400 to B800) of time;
48
 
49
  constant tCKmin : PART_NUM := (B400 => 5 ns, B533 => 3.75 ns, B667 => 3 ns, B800 => 2.5 ns);
50
 
51
  constant tCKmax : PART_NUM := (B400 => 8 ns, B533 => 8 ns, B667 => 8 ns, B800 => 8 ns);
52
 
53
  constant tWR : PART_NUM := (B400 => 15 ns, B533 => 15 ns, B667 => 15 ns, B800 => 15 ns);
54
 
55
  constant tDS : PART_NUM := (B400 => 0.4 ns, B533 => 0.35 ns, B667 => 0.3 ns, B800 => 0.3 ns);
56
 
57
  constant tDH : PART_NUM := (B400 => 0.4 ns, B533 => 0.35 ns, B667 => 0.3 ns, B800 => 0.3 ns);
58
 
59
  constant tIS : PART_NUM := (B400 => 0.6 ns, B533 => 0.5 ns, B667 => 0.5 ns, B800 => 0.4 ns);
60
 
61
  constant tIH : PART_NUM := (B400 => 0.6 ns, B533 => 0.5 ns, B667 => 0.5 ns, B800 => 0.4 ns);
62
 
63
  constant tWTR : PART_NUM := (B400 => 10 ns, B533 => 7.5 ns, B667 => 7.5 ns, B800 => 7.5 ns);
64
 
65
  constant tRASmax : PART_NUM := (B400 => 70000 ns, B533 => 70000 ns, B667 => 70000 ns, B800 => 70000 ns);
66
 
67
  constant tRRD : time := 10 ns;
68
 
69
  constant tREF : time := 64 ms;
70
 
71
  constant tRFC : time := 75 ns;
72
 
73
  constant tRTP : time := 7.5 ns;
74
 
75
  constant tXSNR : time := tRFC + 10 ns;
76
 
77
  constant tXP : integer := 2;
78
 
79
  constant tCKE : integer := 3;
80
 
81
  constant tXARD : integer := 2;
82
 
83
  constant tXARDS : integer := 2;
84
 
85
  constant tXSRD : integer := 200;
86
 
87
  constant tPUS : time := 200 us;
88
 
89
  type STATE_TYPE is (
90
    PWRDN,
91
    PWRUP,
92
    SLFREF,
93
    IDLE,
94
    RACT,
95
    READ,
96
    WRITE);
97
 
98
  type COMMAND_TYPE is (
99
    DSEL,
100
    NOP,
101
    MRS,
102
    EMRS1,
103
    EMRS2,
104
    EMRS3,
105
    ACT,
106
    RD,
107
    RDAP,
108
    WR,
109
    WRAP,
110
    PCG,
111
    PCGA,
112
    AREF,
113
    SREF,
114
    SREX,
115
    PDEN,
116
    PDEX,
117
    ERROR,
118
    ILLEGAL);
119
 
120
  type BURST_MODE_TYPE is (
121
    SEQUENTIAL,
122
    INTERLEAVE);
123
 
124
  type OCD_DRIVE_MODE_TYPE is (
125
    CAL_EXIT,
126
    DRIVE1,
127
    DRIVE0,
128
    ADJUST,
129
    CAL_DEFAULT);
130
 
131
  subtype CL_TYPE is integer range 0 to 6;
132
 
133
  subtype BL_TYPE is integer range 4 to 8;
134
 
135
  subtype TWR_TYPE is integer range 2 to 6;
136
 
137
  type DLL_RST is (
138
    RST,
139
    NORST);
140
 
141
  type MODE_REGISTER is
142
    record
143
      CAS_LATENCY : CL_TYPE;
144
      BURST_MODE : BURST_MODE_TYPE;
145
      BURST_LENGTH : BL_TYPE;
146
      DLL_STATE : DLL_RST;
147
      SAPD : std_logic;
148
      TWR : TWR_TYPE;
149
    end record;
150
 
151
  type EMR_TYPE is
152
    record
153
      DLL_EN : std_logic;
154
      AL : CL_TYPE;
155
      QOFF : std_logic;
156
      DQSB_ENB : std_logic;
157
      RDQS_EN : std_logic;
158
      OCD_PGM : OCD_DRIVE_MODE_TYPE;
159
    end record;
160
 
161
  type EMR2_TYPE is
162
    record
163
      SREF_HOT : std_logic;
164
    end record;
165
 
166
  type REF_CHECK is array (0 to (NUM_OF_BANKS - 1), 0 to (NUM_OF_ROWS - 1)) of time;
167
 
168
  type COL_ADDR_TYPE is array (0 to 3) of std_logic_vector((NUM_OF_COL_ADD - 1) downto 0);
169
 
170
  type DATA_BUFFER_TYPE is array (0 to 6) of std_logic_vector(8 downto 0);
171
 
172
  subtype COL_DATA_TYPE is integer range 0 to 65535;
173
 
174
  type SA_TYPE is array (0 to (NUM_OF_COLS - 1)) of COL_DATA_TYPE;
175
 
176
  type ROW_DATA_TYPE is array (0 to (NUM_OF_COLS - 1)) of COL_DATA_TYPE;
177
 
178
  type RAM_PNTR is ACCESS ROW_DATA_TYPE;
179
 
180
  type SA_ARRAY_TYPE is array (0 to (NUM_OF_BANKS - 1)) of SA_TYPE;
181
 
182
  type MEM_CELL_TYPE is array (0 to (NUM_OF_ROWS - 1)) of RAM_PNTR;
183
 
184
  subtype DATA_TYPE is std_logic_vector ((WORD_SIZE - 1) downto 0);
185
 
186
  type BUFFER_TYPE is array (0 to NUM_OF_BUFFERS - 1, 0 to 3) of DATA_TYPE;
187
 
188
  type ADD_PIPE_TYPE is array (0 to 12) of std_logic_vector((NUM_OF_COL_ADD + NUM_OF_BANK_ADD - 1) downto 0);
189
 
190
  type CKE_TYPE is array (integer range -1 to 0) of std_logic;
191
 
192
  subtype MROPCODE_TYPE is std_logic_vector ((NUM_OF_MROPCODE - 1) downto 0);
193
 
194
  procedure COMMAND_DECODE (
195
    variable
196
      CSB,
197
      RASB,
198
      CASB,
199
      WEB,
200
      A10 : in std_logic;
201
    variable
202
      Bank_Add : in std_logic_vector((NUM_OF_BANK_ADD - 1) downto 0);
203
    variable
204
      CKE : in CKE_TYPE;
205
    variable
206
      COMMAND : out COMMAND_TYPE;
207
    variable
208
      BankState : in std_logic_vector((NUM_OF_BANKS - 1) downto 0);
209
    variable
210
      State : in STATE_TYPE);
211
 
212
  procedure MODE_REGISTER_SET (
213
    MROPCODE : in MROPCODE_TYPE;
214
    MR : out MODE_REGISTER);
215
 
216
  procedure EXT_MODE_REGISTER_SET (
217
    MROPCODE : in MROPCODE_TYPE;
218
    EMR : out EMR_TYPE);
219
 
220
  procedure EXT_MODE_REGISTER_SET2 (
221
    MROPCODE : in MROPCODE_TYPE;
222
    EMR : out EMR2_TYPE);
223
 
224
  function REMAINDER (
225
    val0 : in integer;
226
    val1 : in integer) return integer;
227
 
228
  function XOR_FUNC (
229
    val0 : in std_logic_vector;
230
    val1 : in std_logic_vector) return std_logic_vector;
231
 
232
  function CHAR_TO_STD_LOGIC (
233
    c : in character)
234
    return std_logic;
235
 
236
  function STD_LOGIC_TO_BIT (V: STD_LOGIC) return BIT;
237
 
238
end HY5PS121621F_PACK; ------------------------------------------------------HY5DU121622T Package
239
 
240
---------------------------------------------------------------------------------------------------
241
 
242
package body HY5PS121621F_PACK is
243
 
244
---------------------------------------------------------------------------------------------------
245
  procedure COMMAND_DECODE (
246
    variable
247
      CSB,
248
      RASB,
249
      CASB,
250
      WEB,
251
      A10 : in std_logic;
252
    variable
253
      Bank_Add : in std_logic_vector((NUM_OF_BANK_ADD - 1) downto 0);
254
    variable
255
      CKE : in CKE_TYPE;
256
    variable
257
      COMMAND : out COMMAND_TYPE;
258
    variable
259
      BankState : in std_logic_vector((NUM_OF_BANKS - 1) downto 0);
260
    variable
261
      State : in STATE_TYPE) Is
262
 
263
    begin
264
      case CKE (-1) is
265
        when '1' =>
266
          case CKE (0) is
267
            when '0' =>
268
              if (BankState = "0000") then
269
                if (CSB = '0' and RASB = '0' and CASB = '0' and WEB = '1') then
270
                  COMMAND := SREF;
271
                elsif ((CSB = '1') or (CSB = '0' and RASB = '1' and CASB = '1' and WEB = '1')) then
272
                  COMMAND := PDEN;
273
                else
274
                  COMMAND := ILLEGAL;
275
                end if;
276
              elsif ((CSB = '1') or (CSB = '0' and RASB = '1' and CASB = '1' and WEB = '1')) then
277
                COMMAND := PDEN;
278
              else
279
                COMMAND := ILLEGAL;
280
              end if;
281
            when '1' =>
282
              if (CSB = '1') then
283
                COMMAND := DSEL;
284
              elsif (CSB = '0' and RASB = '1' and CASB = '1' and WEB ='1') then
285
                COMMAND := NOP;
286
              elsif (CSB = '0' and RASB = '1' and CASB = '0' and WEB ='1') then
287
                if (A10 = '0') then
288
                  COMMAND := RD;
289
                else
290
                  COMMAND := RDAP;
291
                end if;
292
              elsif (CSB = '0' and RASB = '1' and CASB = '0' and WEB ='0') then
293
                if (A10 = '0') then
294
                  COMMAND := WR;
295
                else
296
                  COMMAND := WRAP;
297
                end if;
298
              elsif (CSB = '0' and RASB = '0' and CASB = '1' and WEB ='1') then
299
                COMMAND := ACT;
300
              elsif (CSB = '0' and RASB = '0' and CASB = '1' and WEB ='0') then
301
                if (A10 = '0') then
302
                  COMMAND := PCG;
303
                else
304
                  COMMAND := PCGA;
305
                end if;
306
              elsif (CSB = '0' and RASB = '0' and CASB = '0' and WEB ='1') then
307
                COMMAND := AREF;
308
              elsif (CSB = '0' and RASB = '0' and CASB = '0' and WEB ='0') then
309
                if (BankState = "0000") then
310
                  if (Bank_Add = "00") then
311
                    COMMAND := MRS;
312
                  elsif (Bank_Add = "01") then
313
                    COMMAND := EMRS1;
314
                  elsif (Bank_Add = "10") then
315
                    COMMAND := EMRS2;
316
                  elsif (Bank_Add = "11") then
317
                    COMMAND := EMRS3;
318
                  end if;
319
                else
320
                  COMMAND := ILLEGAL;
321
                end if;
322
              end if;
323
            when others =>
324
              COMMAND := ERROR;
325
            end case;
326
        when '0' =>
327
          case CKE (0) is
328
            when '0' =>
329
              COMMAND := NOP;
330
            when '1' =>
331
              if (State = PWRUP) then
332
                COMMAND := NOP;
333
              elsif (CSB = '1') then
334
                if (State = SLFREF) then
335
                  COMMAND := SREX;
336
                elsif (State = PWRDN) then
337
                  COMMAND := PDEX;
338
                end if;
339
              elsif (CSB = '0' and RASB = '1' and CASB = '1' and WEB ='1') then
340
                if (State = SLFREF) then
341
                  COMMAND := SREX;
342
                elsif (State = PWRDN) then
343
                  COMMAND := PDEX;
344
                end if;
345
              else
346
                COMMAND := ERROR;
347
              end if;
348
            when others =>
349
              COMMAND := ERROR;
350
          end case;
351
        when others =>
352
          COMMAND := ERROR;
353
        end case;
354
    end COMMAND_DECODE;
355
------------------------------------------------------------------------------------------------
356
  procedure MODE_REGISTER_SET (
357
    MROPCODE : in MROPCODE_TYPE;
358
    MR : out MODE_REGISTER) is
359
  begin
360
    if (MROPCODE(6) = '0' and MROPCODE(5) = '1' and MROPCODE(4) = '0')then
361
      MR.CAS_LATENCY := 2;
362
    elsif (MROPCODE(6) = '0' and MROPCODE(5) = '1' and MROPCODE(4) = '1')then
363
      MR.CAS_LATENCY := 3;
364
    elsif (MROPCODE(6) = '1' and MROPCODE(5) = '0' and MROPCODE(4) = '0')then
365
      MR.CAS_LATENCY := 4;
366
    elsif (MROPCODE(6) = '1' and MROPCODE(5) = '0' and MROPCODE(4) = '1')then
367
      MR.CAS_LATENCY := 5;
368
    elsif (MROPCODE(6) = '1' and MROPCODE(5) = '1' and MROPCODE(4) = '0')then
369
      MR.CAS_LATENCY := 6;
370
    else
371
      assert false report
372
      "ERROR : (MODE_REGISTER_SET_PROCEDURE) : Invalid Cas_Latency Encountered!"
373
      severity WARNING;
374
    end if;
375
    if MROPCODE(3) = '0' then
376
      MR.BURST_MODE := SEQUENTIAL;
377
    elsif MROPCODE(3) = '1' then
378
      MR.BURST_MODE := INTERLEAVE;
379
    end if;
380
    if MROPCODE(8) = '0' then
381
      MR.DLL_STATE := NORST;
382
    elsif MROPCODE(8) = '1' then
383
      MR.DLL_STATE := RST;
384
    end if;
385
    if MROPCODE(2) = '0' and MROPCODE(1) = '1' and MROPCODE(0) = '0' then
386
      MR.BURST_LENGTH := 4;
387
    elsif MROPCODE(2) = '0' and MROPCODE(1) = '1' and MROPCODE(0) = '1' then
388
      MR.BURST_LENGTH := 8;
389
    else
390
      assert false report
391
      "ERROR : (MODE_REGISTER_SET_PROCEDURE) : Invalid Burst_Length Encountered!"
392
      severity ERROR;
393
    end if;
394
    if MROPCODE(12) = '0' then
395
      MR.SAPD := '0';
396
    elsif MROPCODE(12) = '1' then
397
      MR.SAPD := '1';
398
    end if;
399
    if MROPCODE(11) = '0' and MROPCODE(10) = '0' and MROPCODE(9) = '1' then
400
      MR.TWR := 2;
401
    elsif MROPCODE(11) = '0' and MROPCODE(10) = '1' and MROPCODE(9) = '0' then
402
      MR.TWR := 3;
403
    elsif MROPCODE(11) = '0' and MROPCODE(10) = '1' and MROPCODE(9) = '1' then
404
      MR.TWR := 4;
405
    elsif MROPCODE(11) = '1' and MROPCODE(10) = '0' and MROPCODE(9) = '0' then
406
      MR.TWR := 5;
407
    elsif MROPCODE(11) = '1' and MROPCODE(10) = '0' and MROPCODE(9) = '1' then
408
      MR.TWR := 6;
409
    else
410
      assert false report
411
      "ERROR : (MODE_REGISTER_SET_PROCEDURE) : Invalid Write Recovery Value Encountered!"
412
      severity ERROR;
413
    end if;
414
  end MODE_REGISTER_SET;
415
------------------------------------------------------------------------------------------------
416
  procedure EXT_MODE_REGISTER_SET (
417
    MROPCODE : in MROPCODE_TYPE;
418
    EMR : out EMR_TYPE) is
419
  begin
420
    if (MROPCODE(0) = '0') then
421
      EMR.DLL_EN := '1';
422
    elsif (MROPCODE(0) = '1') then
423
      EMR.DLL_EN := '0';
424
    end if;
425
    if (MROPCODE(5) = '0' and MROPCODE(4) = '0' and MROPCODE(3) = '0')then
426
      EMR.AL := 0;
427
    elsif (MROPCODE(5) = '0' and MROPCODE(4) = '0' and MROPCODE(3) = '1')then
428
      EMR.AL := 1;
429
    elsif (MROPCODE(5) = '0' and MROPCODE(4) = '1' and MROPCODE(3) = '0')then
430
      EMR.AL := 2;
431
    elsif (MROPCODE(5) = '0' and MROPCODE(4) = '1' and MROPCODE(3) = '1')then
432
      EMR.AL := 3;
433
    elsif (MROPCODE(5) = '1' and MROPCODE(4) = '0' and MROPCODE(3) = '0')then
434
      EMR.AL := 4;
435
    elsif (MROPCODE(5) = '1' and MROPCODE(4) = '0' and MROPCODE(3) = '1')then
436
      EMR.AL := 5;
437
    else
438
      assert false report
439
      "ERROR : (EXT_MODE_REGISTER_SET_PROCEDURE) : Invalid Additive_Latency Encountered!"
440
      severity WARNING;
441
    end if;
442
    if MROPCODE(12) = '0' then
443
      EMR.QOFF := '0';
444
    elsif MROPCODE(12) = '1' then
445
      EMR.QOFF := '1';
446
    end if;
447
    if MROPCODE(10) = '0' then
448
      EMR.DQSB_ENB := '0';
449
    elsif MROPCODE(10) = '1' then
450
      EMR.DQSB_ENB := '1';
451
    end if;
452
    if MROPCODE(11) = '0' then
453
      EMR.RDQS_EN := '0';
454
    elsif MROPCODE(11) = '1' then
455
      EMR.RDQS_EN := '1';
456
    end if;
457
    if MROPCODE(9) = '0' and MROPCODE(8) = '0' and MROPCODE(7) = '0' then
458
      EMR.OCD_PGM := CAL_EXIT;
459
    elsif MROPCODE(9) = '0' and MROPCODE(8) = '0' and MROPCODE(7) = '1' then
460
      EMR.OCD_PGM := DRIVE1;
461
    elsif MROPCODE(9) = '0' and MROPCODE(8) = '1' and MROPCODE(7) = '0' then
462
      EMR.OCD_PGM := DRIVE0;
463
    elsif MROPCODE(9) = '1' and MROPCODE(8) = '0' and MROPCODE(7) = '0' then
464
      EMR.OCD_PGM := ADJUST;
465
    elsif MROPCODE(9) = '1' and MROPCODE(8) = '1' and MROPCODE(7) = '1' then
466
      EMR.OCD_PGM := CAL_DEFAULT;
467
    else
468
      assert false report
469
      "ERROR : (EXT_MODE_REGISTER_SET_PROCEDURE) : Invalid OCD Calibration Program Encountered!"
470
      severity ERROR;
471
    end if;
472
  end EXT_MODE_REGISTER_SET;
473
------------------------------------------------------------------------------------------------
474
  procedure EXT_MODE_REGISTER_SET2 (
475
    MROPCODE : in MROPCODE_TYPE;
476
    EMR : out EMR2_TYPE) is
477
  begin
478
    if (MROPCODE(7) = '0') then
479
      EMR.SREF_HOT := '0';
480
    elsif (MROPCODE(7) = '1') then
481
      EMR.SREF_HOT := '1';
482
    end if;
483
  end EXT_MODE_REGISTER_SET2;
484
------------------------------------------------------------------------------------------------
485
  function REMAINDER (val0 : in integer; val1 : in integer) return integer is
486
    variable Result : integer;
487
  begin
488
    Result := val0;
489
    loop
490
      exit when Result < val1;
491
      Result := Result - val1;
492
    end loop;
493
    return Result;
494
  end REMAINDER;
495
------------------------------------------------------------------------------------------------
496
  function XOR_FUNC (val0 : in std_logic_vector; val1 : in std_logic_vector) return std_logic_vector is
497
    variable Result : std_logic_vector(2 downto 0);
498
    variable j : integer := 0;
499
  begin
500
    for i in val0'RANGE LOOP
501
      if (val0(i) /= val1(i)) then
502
        Result(i) := '1';
503
      else
504
        Result(i) := '0';
505
      end if;
506
      j := j + 1;
507
    end loop;
508
    return Result((j - 1) downto 0);
509
  end XOR_FUNC;
510
------------------------------------------------------------------------------------------------
511
  function CHAR_TO_STD_LOGIC (
512
    c : in character)
513
    return std_logic is
514
    variable r : std_logic;
515
  begin
516
    case c is
517
      when '0' => r := '0';
518
      when 'L' => r := 'L';
519
      when '1' => r := '1';
520
      when 'H' => r := 'H';
521
      when 'W' => r := 'W';
522
      when 'Z' => r := 'Z';
523
      when 'U' => r := 'U';
524
      when '-' => r := '-';
525
      when others => r := 'X';
526
    end case;
527
    return r;
528
  end CHAR_TO_STD_LOGIC;
529
------------------------------------------------------------------------------------------------
530
  function STD_LOGIC_TO_BIT (V: STD_LOGIC) return BIT is
531
    variable Result: BIT;
532
  begin
533
    case V is
534
      when '0' | 'L' =>
535
        Result := '0';
536
      when '1' | 'H' =>
537
        Result := '1';
538
      when 'X' | 'W' | 'Z' | 'U' | '-' =>
539
        Result := '0';
540
    end case;
541
    return Result;
542
  end STD_LOGIC_TO_BIT;
543
------------------------------------------------------------------------------------------------ 
544
end HY5PS121621F_PACK;

powered by: WebSVN 2.1.0

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