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/] [techmap/] [stratixii/] [stratixii_ddr_phy.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
------------------------------------------------------------------------------
2
--  This file is a part of the GRLIB VHDL IP LIBRARY
3
--  Copyright (C) 2003, Gaisler Research
4
--
5
--  This program is free software; you can redistribute it and/or modify
6
--  it under the terms of the GNU General Public License as published by
7
--  the Free Software Foundation; either version 2 of the License, or
8
--  (at your option) any later version.
9
--
10
--  This program is distributed in the hope that it will be useful,
11
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
--  GNU General Public License for more details.
14
--
15
--  You should have received a copy of the GNU General Public License
16
--  along with this program; if not, write to the Free Software
17
--  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
18
-----------------------------------------------------------------------------
19
-- Entity:      stratixii_ddr_phy
20
-- File:        stratixii_ddr_phy.vhd
21
-- Author:      Jiri Gaisler, Gaisler Research
22
-- Description: DDR PHY for Altera FPGAs
23
------------------------------------------------------------------------------
24
 
25
 LIBRARY stratixii;
26
 USE stratixii.all;
27
 
28
 LIBRARY ieee;
29
 USE ieee.std_logic_1164.all;
30
 
31
 ENTITY  altdqs_stxii_adqs_n7i2 IS
32
         generic (width : integer := 2; period : string := "10000ps");
33
         PORT
34
         (
35
                 dll_delayctrlout       :       OUT  STD_LOGIC_VECTOR (5 DOWNTO 0);
36
                 dqinclk        :       OUT  STD_LOGIC_VECTOR (width-1 downto 0);
37
                 dqs_datain_h   :       IN  STD_LOGIC_VECTOR (width-1 downto 0);
38
                 dqs_datain_l   :       IN  STD_LOGIC_VECTOR (width-1 downto 0);
39
                 dqs_padio      :       INOUT  STD_LOGIC_VECTOR (width-1 downto 0);
40
                 dqsundelayedout        :       OUT  STD_LOGIC_VECTOR (width-1 downto 0);
41
                 inclk  :       IN  STD_LOGIC := '0';
42
                 oe     :       IN  STD_LOGIC_VECTOR (width-1 downto 0) := (OTHERS => '1');
43
                 outclk :       IN  STD_LOGIC_VECTOR (width-1 downto 0);
44
                 outclkena      :       IN  STD_LOGIC_VECTOR (width-1 downto 0) := (OTHERS => '1')
45
         );
46
 END altdqs_stxii_adqs_n7i2;
47
 
48
 ARCHITECTURE RTL OF altdqs_stxii_adqs_n7i2 IS
49
 
50
--       ATTRIBUTE synthesis_clearbox : boolean;
51
--       ATTRIBUTE synthesis_clearbox OF RTL : ARCHITECTURE IS true;
52
         SIGNAL  wire_stxii_dll1_delayctrlout   :       STD_LOGIC_VECTOR (5 DOWNTO 0);
53
         SIGNAL  wire_stxii_dll1_dqsupdate      :       STD_LOGIC;
54
         SIGNAL  wire_stxii_dll1_offsetctrlout  :       STD_LOGIC_VECTOR (5 DOWNTO 0);
55
         SIGNAL  wire_stxii_io2a_combout        :       STD_LOGIC_VECTOR (width-1 downto 0);
56
         SIGNAL  wire_stxii_io2a_datain :       STD_LOGIC_VECTOR (width-1 downto 0);
57
         SIGNAL  wire_stxii_io2a_ddiodatain     :       STD_LOGIC_VECTOR (width-1 downto 0);
58
         SIGNAL  wire_stxii_io2a_dqsbusout      :       STD_LOGIC_VECTOR (width-1 downto 0);
59
         SIGNAL  wire_stxii_io2a_oe     :       STD_LOGIC_VECTOR (width-1 downto 0);
60
         SIGNAL  wire_stxii_io2a_outclk :       STD_LOGIC_VECTOR (width-1 downto 0);
61
         SIGNAL  wire_stxii_io2a_outclkena      :       STD_LOGIC_VECTOR (width-1 downto 0);
62
         SIGNAL  delay_ctrl :   STD_LOGIC_VECTOR (5 DOWNTO 0);
63
         SIGNAL  dqs_update :   STD_LOGIC;
64
         SIGNAL  offset_ctrl :  STD_LOGIC_VECTOR (5 DOWNTO 0);
65
         COMPONENT  stratixii_dll
66
         GENERIC
67
         (
68
                DELAY_BUFFER_MODE       :       STRING := "low";
69
                DELAY_CHAIN_LENGTH      :       NATURAL := 12;
70
                DELAYCTRLOUT_MODE       :       STRING := "normal";
71
                INPUT_FREQUENCY :       STRING;
72
                JITTER_REDUCTION        :       STRING := "false";
73
                OFFSETCTRLOUT_MODE      :       STRING := "static";
74
                SIM_LOOP_DELAY_INCREMENT        :       NATURAL := 0;
75
                SIM_LOOP_INTRINSIC_DELAY        :       NATURAL := 0;
76
                SIM_VALID_LOCK  :       NATURAL := 5;
77
                SIM_VALID_LOCKCOUNT     :       NATURAL := 0;
78
                STATIC_DELAY_CTRL       :       NATURAL := 0;
79
                STATIC_OFFSET   :       STRING;
80
                USE_UPNDNIN     :       STRING := "false";
81
                USE_UPNDNINCLKENA       :       STRING := "false";
82
                lpm_type        :       STRING := "stratixii_dll"
83
         );
84
         PORT
85
         (
86
                addnsub :       IN STD_LOGIC := '1';
87
                aload   :       IN STD_LOGIC := '0';
88
                clk     :       IN STD_LOGIC;
89
                delayctrlout    :       OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
90
                dqsupdate       :       OUT STD_LOGIC;
91
                offset  :       IN STD_LOGIC_VECTOR(5 DOWNTO 0) := (OTHERS => '0');
92
                offsetctrlout   :       OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
93
                upndnin :       IN STD_LOGIC := '0';
94
                upndninclkena   :       IN STD_LOGIC := '1';
95
                upndnout        :       OUT STD_LOGIC
96
         );
97
         END COMPONENT;
98
         COMPONENT  stratixii_io
99
         GENERIC
100
         (
101
                BUS_HOLD        :       STRING := "false";
102
                DDIO_MODE       :       STRING := "none";
103
                DDIOINCLK_INPUT :       STRING := "negated_inclk";
104
                DQS_CTRL_LATCHES_ENABLE :       STRING := "false";
105
                DQS_DELAY_BUFFER_MODE   :       STRING := "none";
106
                DQS_EDGE_DETECT_ENABLE  :       STRING := "false";
107
                DQS_INPUT_FREQUENCY     :       STRING := "unused";
108
                DQS_OFFSETCTRL_ENABLE   :       STRING := "false";
109
                DQS_OUT_MODE    :       STRING := "none";
110
                DQS_PHASE_SHIFT :       NATURAL := 0;
111
                EXTEND_OE_DISABLE       :       STRING := "false";
112
                GATED_DQS       :       STRING := "false";
113
                INCLK_INPUT     :       STRING := "normal";
114
                INPUT_ASYNC_RESET       :       STRING := "none";
115
                INPUT_POWER_UP  :       STRING := "low";
116
                INPUT_REGISTER_MODE     :       STRING := "none";
117
                INPUT_SYNC_RESET        :       STRING := "none";
118
                OE_ASYNC_RESET  :       STRING := "none";
119
                OE_POWER_UP     :       STRING := "low";
120
                OE_REGISTER_MODE        :       STRING := "none";
121
                OE_SYNC_RESET   :       STRING := "none";
122
                OPEN_DRAIN_OUTPUT       :       STRING := "false";
123
                OPERATION_MODE  :       STRING;
124
                OUTPUT_ASYNC_RESET      :       STRING := "none";
125
                OUTPUT_POWER_UP :       STRING := "low";
126
                OUTPUT_REGISTER_MODE    :       STRING := "none";
127
                OUTPUT_SYNC_RESET       :       STRING := "none";
128
                SIM_DQS_DELAY_INCREMENT :       NATURAL := 0;
129
                SIM_DQS_INTRINSIC_DELAY :       NATURAL := 0;
130
                SIM_DQS_OFFSET_INCREMENT        :       NATURAL := 0;
131
                TIE_OFF_OE_CLOCK_ENABLE :       STRING := "false";
132
                TIE_OFF_OUTPUT_CLOCK_ENABLE     :       STRING := "false";
133
                lpm_type        :       STRING := "stratixii_io"
134
         );
135
         PORT
136
         (
137
                areset  :       IN STD_LOGIC := '0';
138
                combout :       OUT STD_LOGIC;
139
                datain  :       IN STD_LOGIC := '0';
140
                ddiodatain      :       IN STD_LOGIC := '0';
141
                ddioinclk       :       IN STD_LOGIC := '0';
142
                ddioregout      :       OUT STD_LOGIC;
143
                delayctrlin     :       IN STD_LOGIC_VECTOR(5 DOWNTO 0) := (OTHERS => '0');
144
                dqsbusout       :       OUT STD_LOGIC;
145
                dqsupdateen     :       IN STD_LOGIC := '1';
146
                inclk   :       IN STD_LOGIC := '0';
147
                inclkena        :       IN STD_LOGIC := '1';
148
                linkin  :       IN STD_LOGIC := '0';
149
                linkout :       OUT STD_LOGIC;
150
                oe      :       IN STD_LOGIC := '1';
151
                offsetctrlin    :       IN STD_LOGIC_VECTOR(5 DOWNTO 0) := (OTHERS => '0');
152
                outclk  :       IN STD_LOGIC := '0';
153
                outclkena       :       IN STD_LOGIC := '1';
154
                padio   :       INOUT STD_LOGIC;
155
                regout  :       OUT STD_LOGIC;
156
                sreset  :       IN STD_LOGIC := '0';
157
                terminationcontrol      :       IN STD_LOGIC_VECTOR(13 DOWNTO 0) := (OTHERS => '0')
158
         );
159
         END COMPONENT;
160
 BEGIN
161
 
162
        delay_ctrl <= wire_stxii_dll1_delayctrlout;
163
        dll_delayctrlout <= delay_ctrl;
164
        dqinclk <= wire_stxii_io2a_dqsbusout;
165
        dqs_update <= wire_stxii_dll1_dqsupdate;
166
        dqsundelayedout <= wire_stxii_io2a_combout;
167
        offset_ctrl <= wire_stxii_dll1_offsetctrlout;
168
        stxii_dll1 :  stratixii_dll
169
          GENERIC MAP (
170
                DELAY_BUFFER_MODE => "low",
171
                DELAY_CHAIN_LENGTH => 12,
172
                DELAYCTRLOUT_MODE => "normal",
173
                INPUT_FREQUENCY => period, --"10000ps",
174
                JITTER_REDUCTION => "false",
175
                OFFSETCTRLOUT_MODE => "static",
176
                SIM_LOOP_DELAY_INCREMENT => 132,
177
                SIM_LOOP_INTRINSIC_DELAY => 3840,
178
                SIM_VALID_LOCK => 1,
179
                SIM_VALID_LOCKCOUNT => 46,
180
                STATIC_OFFSET => "0",
181
                USE_UPNDNIN => "false",
182
                USE_UPNDNINCLKENA => "false"
183
          )
184
          PORT MAP (
185
                clk => inclk,
186
                delayctrlout => wire_stxii_dll1_delayctrlout,
187
                dqsupdate => wire_stxii_dll1_dqsupdate,
188
                offsetctrlout => wire_stxii_dll1_offsetctrlout
189
          );
190
        wire_stxii_io2a_datain <= dqs_datain_h;
191
        wire_stxii_io2a_ddiodatain <= dqs_datain_l;
192
        wire_stxii_io2a_oe <= oe;
193
        wire_stxii_io2a_outclk <= outclk;
194
        wire_stxii_io2a_outclkena <= outclkena;
195
        loop0 : FOR i IN 0 TO width-1 GENERATE
196
          stxii_io2a :  stratixii_io
197
          GENERIC MAP (
198
                DDIO_MODE => "output",
199
                DQS_CTRL_LATCHES_ENABLE => "true",
200
                DQS_DELAY_BUFFER_MODE => "low",
201
                DQS_EDGE_DETECT_ENABLE => "false",
202
                DQS_INPUT_FREQUENCY => period, --"10000ps",
203
                DQS_OFFSETCTRL_ENABLE => "true",
204
                DQS_OUT_MODE => "delay_chain3",
205
                DQS_PHASE_SHIFT => 9000,
206
                EXTEND_OE_DISABLE => "false",
207
                GATED_DQS => "false",
208
                OE_ASYNC_RESET => "none",
209
                OE_POWER_UP => "low",
210
                OE_REGISTER_MODE => "register",
211
                OE_SYNC_RESET => "none",
212
                OPEN_DRAIN_OUTPUT => "false",
213
                OPERATION_MODE => "bidir",
214
                OUTPUT_ASYNC_RESET => "none",
215
                OUTPUT_POWER_UP => "low",
216
                OUTPUT_REGISTER_MODE => "register",
217
                OUTPUT_SYNC_RESET => "none",
218
                SIM_DQS_DELAY_INCREMENT => 22,
219
                SIM_DQS_INTRINSIC_DELAY => 960,
220
                SIM_DQS_OFFSET_INCREMENT => 11,
221
                TIE_OFF_OE_CLOCK_ENABLE => "false",
222
                TIE_OFF_OUTPUT_CLOCK_ENABLE => "false"
223
          )
224
          PORT MAP (
225
                combout => wire_stxii_io2a_combout(i),
226
                datain => wire_stxii_io2a_datain(i),
227
                ddiodatain => wire_stxii_io2a_ddiodatain(i),
228
                delayctrlin => delay_ctrl,
229
                dqsbusout => wire_stxii_io2a_dqsbusout(i),
230
                dqsupdateen => dqs_update,
231
                oe => wire_stxii_io2a_oe(i),
232
                offsetctrlin => offset_ctrl,
233
                outclk => wire_stxii_io2a_outclk(i),
234
                outclkena => wire_stxii_io2a_outclkena(i),
235
                padio => dqs_padio(i)
236
          );
237
        END GENERATE loop0;
238
 
239
 END RTL; --altdqs_stxii_adqs_n7i2
240
 
241
LIBRARY ieee;
242
USE ieee.std_logic_1164.all;
243
 
244
ENTITY altdqs_stxii IS
245
        generic (width : integer := 2; period : string := "10000ps");
246
        PORT
247
        (
248
                dqs_datain_h            : IN STD_LOGIC_VECTOR (width-1 downto 0);
249
                dqs_datain_l            : IN STD_LOGIC_VECTOR (width-1 downto 0);
250
                inclk           : IN STD_LOGIC ;
251
                oe              : IN STD_LOGIC_VECTOR (width-1 downto 0);
252
                outclk          : IN STD_LOGIC_VECTOR (width-1 downto 0);
253
                dll_delayctrlout                : OUT STD_LOGIC_VECTOR (5 DOWNTO 0);
254
                dqinclk         : OUT STD_LOGIC_VECTOR (width-1 downto 0);
255
                dqs_padio               : INOUT STD_LOGIC_VECTOR (width-1 downto 0);
256
                dqsundelayedout         : OUT STD_LOGIC_VECTOR (width-1 downto 0)
257
        );
258
END;
259
 
260
 
261
ARCHITECTURE RTL OF altdqs_stxii IS
262
 
263
--      ATTRIBUTE synthesis_clearbox: boolean;
264
--      ATTRIBUTE synthesis_clearbox OF RTL: ARCHITECTURE IS TRUE;
265
        SIGNAL sub_wire0        : STD_LOGIC_VECTOR (5 DOWNTO 0);
266
        SIGNAL sub_wire1        : STD_LOGIC_VECTOR (width-1 downto 0);
267
        SIGNAL sub_wire2        : STD_LOGIC_VECTOR (width-1 downto 0);
268
        SIGNAL sub_wire3_bv     : BIT_VECTOR (width-1 downto 0);
269
        SIGNAL sub_wire3        : STD_LOGIC_VECTOR (width-1 downto 0);
270
 
271
 
272
 
273
        COMPONENT altdqs_stxii_adqs_n7i2
274
        generic (width : integer := 2; period : string := "10000ps");
275
        PORT (
276
                        outclk  : IN STD_LOGIC_VECTOR (width-1 downto 0);
277
                        dqs_padio       : INOUT STD_LOGIC_VECTOR (width-1 downto 0);
278
                        outclkena       : IN STD_LOGIC_VECTOR (width-1 downto 0);
279
                        oe      : IN STD_LOGIC_VECTOR (width-1 downto 0);
280
                        dqs_datain_h    : IN STD_LOGIC_VECTOR (width-1 downto 0);
281
                        inclk   : IN STD_LOGIC ;
282
                        dqs_datain_l    : IN STD_LOGIC_VECTOR (width-1 downto 0);
283
                        dll_delayctrlout        : OUT STD_LOGIC_VECTOR (5 DOWNTO 0);
284
                        dqinclk : OUT STD_LOGIC_VECTOR (width-1 downto 0);
285
                        dqsundelayedout : OUT STD_LOGIC_VECTOR (width-1 downto 0)
286
        );
287
        END COMPONENT;
288
 
289
BEGIN
290
        sub_wire3_bv(width-1 downto 0) <= (others => '1');
291
        sub_wire3    <= To_stdlogicvector(sub_wire3_bv);
292
        dll_delayctrlout    <= sub_wire0(5 DOWNTO 0);
293
        dqinclk    <= not sub_wire1(width-1 downto 0);
294
        dqsundelayedout    <= sub_wire2(width-1 downto 0);
295
 
296
        altdqs_stxii_adqs_n7i2_component : altdqs_stxii_adqs_n7i2
297
        generic map (width, period)
298
        PORT MAP (
299
                outclk => outclk,
300
                outclkena => sub_wire3,
301
                oe => oe,
302
                dqs_datain_h => dqs_datain_h,
303
                inclk => inclk,
304
                dqs_datain_l => dqs_datain_l,
305
                dll_delayctrlout => sub_wire0,
306
                dqinclk => sub_wire1,
307
                dqsundelayedout => sub_wire2,
308
                dqs_padio => dqs_padio
309
        );
310
 
311
 
312
 
313
END RTL;
314
 
315
library ieee;
316
use ieee.std_logic_1164.all;
317
 
318
library grlib;
319
use grlib.stdlib.all;
320
library techmap;
321
use techmap.gencomp.all;
322
 
323
library altera_mf;
324
use altera_mf.altera_mf_components.all;
325
 
326
 
327
------------------------------------------------------------------
328
-- STRATIX2 DDR PHY -----------------------------------------------
329
------------------------------------------------------------------
330
 
331
entity stratixii_ddr_phy is
332
  generic (MHz : integer := 100; rstdelay : integer := 200;
333
        dbits : integer := 16; clk_mul : integer := 2 ;
334
        clk_div : integer := 2);
335
 
336
  port (
337
    rst       : in  std_ulogic;
338
    clk       : in  std_logic;                  -- input clock
339
    clkout    : out std_ulogic;                 -- system clock
340
    lock      : out std_ulogic;                 -- DCM locked
341
 
342
    ddr_clk     : out std_logic_vector(2 downto 0);
343
    ddr_clkb    : out std_logic_vector(2 downto 0);
344
    ddr_clk_fb_out  : out std_logic;
345
    ddr_clk_fb  : in std_logic;
346
    ddr_cke     : out std_logic_vector(1 downto 0);
347
    ddr_csb     : out std_logic_vector(1 downto 0);
348
    ddr_web     : out std_ulogic;                       -- ddr write enable
349
    ddr_rasb    : out std_ulogic;                       -- ddr ras
350
    ddr_casb    : out std_ulogic;                       -- ddr cas
351
    ddr_dm      : out std_logic_vector (dbits/8-1 downto 0);    -- ddr dm
352
    ddr_dqs     : inout std_logic_vector (dbits/8-1 downto 0);    -- ddr dqs
353
    ddr_ad      : out std_logic_vector (13 downto 0);   -- ddr address
354
    ddr_ba      : out std_logic_vector (1 downto 0);    -- ddr bank address
355
    ddr_dq      : inout  std_logic_vector (dbits-1 downto 0); -- ddr data
356
 
357
    addr        : in  std_logic_vector (13 downto 0); -- data mask
358
    ba          : in  std_logic_vector ( 1 downto 0); -- data mask
359
    dqin        : out std_logic_vector (dbits*2-1 downto 0); -- ddr input data
360
    dqout       : in  std_logic_vector (dbits*2-1 downto 0); -- ddr input data
361
    dm          : in  std_logic_vector (dbits/4-1 downto 0); -- data mask
362
    oen         : in  std_ulogic;
363
    dqs         : in  std_ulogic;
364
    dqsoen      : in  std_ulogic;
365
    rasn        : in  std_ulogic;
366
    casn        : in  std_ulogic;
367
    wen         : in  std_ulogic;
368
    csn         : in  std_logic_vector(1 downto 0);
369
    cke         : in  std_logic_vector(1 downto 0)
370
  );
371
 
372
end;
373
 
374
architecture rtl of stratixii_ddr_phy is
375
 
376
signal vcc, gnd, dqsn, oe, lockl : std_logic;
377
signal ddr_clk_fb_outr : std_ulogic;
378
signal ddr_clk_fbl, fbclk : std_ulogic;
379
signal ddr_rasnr, ddr_casnr, ddr_wenr : std_ulogic;
380
signal ddr_clkl, ddr_clkbl : std_logic_vector(2 downto 0);
381
signal ddr_csnr, ddr_ckenr, ckel : std_logic_vector(1 downto 0);
382
signal clk_0ro, clk_90ro, clk_180ro, clk_270ro : std_ulogic;
383
signal clk_0r, clk_90r, clk_180r, clk_270r : std_ulogic;
384
signal clk0r, clk90r, clk180r, clk270r : std_ulogic;
385
signal locked, vlockl, ddrclkfbl : std_ulogic;
386
signal clk4, clk5 : std_logic;
387
 
388
signal ddr_dqin         : std_logic_vector (dbits-1 downto 0); -- ddr data
389
signal ddr_dqout        : std_logic_vector (dbits-1 downto 0); -- ddr data
390
signal ddr_dqoen        : std_logic_vector (dbits-1 downto 0); -- ddr data
391
signal ddr_adr          : std_logic_vector (13 downto 0);   -- ddr address
392
signal ddr_bar          : std_logic_vector (1 downto 0);   -- ddr address
393
signal ddr_dmr          : std_logic_vector (dbits/8-1 downto 0);   -- ddr address
394
signal ddr_dqsin        : std_logic_vector (dbits/8-1 downto 0);    -- ddr dqs
395
signal ddr_dqsoen       : std_logic_vector (dbits/8-1 downto 0);    -- ddr dqs
396
signal ddr_dqsoutl      : std_logic_vector (dbits/8-1 downto 0);    -- ddr dqs
397
signal dqsdel, dqsclk   : std_logic_vector (dbits/8-1 downto 0);    -- ddr dqs
398
signal da               : std_logic_vector (dbits-1 downto 0); -- ddr data
399
signal dqinl            : std_logic_vector (dbits-1 downto 0); -- ddr data
400
signal dllrst           : std_logic_vector(0 to 3);
401
signal dll0rst          : std_logic_vector(0 to 3);
402
signal mlock, mclkfb, mclk, mclkfx, mclk0 : std_ulogic;
403
signal gndv             : std_logic_vector (dbits-1 downto 0);    -- ddr dqs
404
signal pclkout  : std_logic_vector (5 downto 1);
405
signal ddr_clkin        : std_logic_vector(0 to 2);
406
signal dqinclk          : std_logic_vector (dbits/8-1 downto 0);    -- ddr dqs
407
signal dqsoclk          : std_logic_vector (dbits/8-1 downto 0);    -- ddr dqs
408
signal dqsnv            : std_logic_vector (dbits/8-1 downto 0);    -- ddr dqs
409
 
410
constant DDR_FREQ : integer := (MHz * clk_mul) / clk_div;
411
 
412
component altdqs_stxii
413
        generic (width : integer := 2; period : string := "10000ps");
414
        PORT
415
        (
416
                dqs_datain_h            : IN STD_LOGIC_VECTOR (width-1 downto 0);
417
                dqs_datain_l            : IN STD_LOGIC_VECTOR (width-1 downto 0);
418
                inclk           : IN STD_LOGIC ;
419
                oe              : IN STD_LOGIC_VECTOR (width-1 downto 0);
420
                outclk          : IN STD_LOGIC_VECTOR (width-1 downto 0);
421
                dll_delayctrlout                : OUT STD_LOGIC_VECTOR (5 DOWNTO 0);
422
                dqinclk         : OUT STD_LOGIC_VECTOR (width-1 downto 0);
423
                dqs_padio               : INOUT STD_LOGIC_VECTOR (width-1 downto 0);
424
                dqsundelayedout         : OUT STD_LOGIC_VECTOR (width-1 downto 0)
425
        );
426
END component;
427
 
428
type phasevec is array (1 to 3) of string(1 to 4);
429
type phasevecarr is array (10 to 13) of phasevec;
430
 
431
constant phasearr : phasevecarr := (
432
        ("2500", "5000", "7500"), ("2273", "4545", "6818"),   -- 100 & 110 MHz
433
        ("2083", "4167", "6250"), ("1923", "3846", "5769"));  -- 120 & 130 MHz
434
 
435
type periodtype is array (10 to 13) of string(1 to 6);
436
constant periodstr : periodtype := ("9999ps", "9090ps", "8333ps", "7692ps");
437
begin
438
 
439
  oe <= not oen; vcc <= '1'; gnd <= '0'; gndv <= (others => '0');
440
 
441
  mclk <= clk;
442
--  clkout <= clk_270r; 
443
--  clkout <= clk_0r when DDR_FREQ >= 110 else clk_270r; 
444
  clkout <= clk_90r when DDR_FREQ > 120 else clk_0r;
445
  clk0r <= clk_270r; clk90r <= clk_0r;
446
  clk180r <= clk_90r; clk270r <= clk_180r;
447
 
448
  dll : altpll
449
  generic map (
450
    operation_mode => "NORMAL",
451
    inclk0_input_frequency   => 1000000/MHz,
452
    inclk1_input_frequency   => 1000000/MHz,
453
    clk4_multiply_by => clk_mul, clk4_divide_by => clk_div,
454
    clk3_multiply_by => clk_mul, clk3_divide_by => clk_div,
455
    clk2_multiply_by => clk_mul, clk2_divide_by => clk_div,
456
    clk1_multiply_by => clk_mul, clk1_divide_by => clk_div,
457
    clk0_multiply_by => clk_mul, clk0_divide_by => clk_div,
458
    clk3_phase_shift => phasearr(DDR_FREQ/10)(3),
459
    clk2_phase_shift => phasearr(DDR_FREQ/10)(2),
460
    clk1_phase_shift => phasearr(DDR_FREQ/10)(1)
461
--    clk3_phase_shift => "6250", clk2_phase_shift => "4167", clk1_phase_shift => "2083"
462
--    clk3_phase_shift => "7500", clk2_phase_shift => "5000", clk1_phase_shift => "2500"
463
  )
464
  port map ( inclk(0) => mclk, inclk(1) => gnd,  clk(0) => clk_0r,
465
        clk(1) => clk_90r, clk(2) => clk_180r, clk(3) => clk_270r,
466
        clk(4) => clk4, clk(5) => clk5, locked => lockl);
467
 
468
  rstdel : process (mclk, rst)
469
  begin
470
      if rst = '0' then dllrst <= (others => '1');
471
      elsif rising_edge(mclk) then
472
        dllrst <= dllrst(1 to 3) & '0';
473
      end if;
474
  end process;
475
 
476
  rdel : if rstdelay /= 0 generate
477
    rcnt : process (clk_0r, lockl)
478
    variable cnt : std_logic_vector(15 downto 0);
479
    variable vlock, co : std_ulogic;
480
    begin
481
      if rising_edge(clk_0r) then
482
        co := cnt(15);
483
        vlockl <= vlock;
484
        if lockl = '0' then
485
          cnt := conv_std_logic_vector(rstdelay*DDR_FREQ, 16); vlock := '0';
486
        else
487
          if vlock = '0' then
488
            cnt := cnt -1;  vlock := cnt(15) and not co;
489
          end if;
490
        end if;
491
      end if;
492
      if lockl = '0' then
493
        vlock := '0';
494
      end if;
495
    end process;
496
  end generate;
497
 
498
  locked <= lockl when rstdelay = 0 else vlockl;
499
  lock <= locked;
500
 
501
  -- Generate external DDR clock
502
 
503
--  fbclkpad : altddio_out generic map (width => 1)
504
--    port map ( datain_h(0) => vcc, datain_l(0) => gnd,
505
--      outclock => clk90r, dataout(0) => ddr_clk_fb_out);
506
 
507
  ddrclocks : for i in 0 to 2 generate
508
    clkpad : altddio_out generic map (width => 1, INTENDED_DEVICE_FAMILY => "STRATIXII")
509
    port map ( datain_h(0) => vcc, datain_l(0) => gnd, oe => vcc, oe_out => open,
510
        outclock => clk90r, dataout(0) => ddr_clk(i));
511
 
512
    clknpad : altddio_out generic map (width => 1, INTENDED_DEVICE_FAMILY => "STRATIXII")
513
    port map ( datain_h(0) => gnd, datain_l(0) => vcc, oe => vcc, oe_out => open,
514
        outclock => clk90r, dataout(0) => ddr_clkb(i));
515
 
516
  end generate;
517
 
518
  csnpads : altddio_out generic map (width => 2, INTENDED_DEVICE_FAMILY => "STRATIXII")
519
    port map ( datain_h => csn(1 downto 0), datain_l => csn(1 downto 0), oe => vcc, oe_out => open,
520
        outclock => clk0r, dataout => ddr_csb(1 downto 0));
521
 
522
  ckepads : altddio_out generic map (width => 2, INTENDED_DEVICE_FAMILY => "STRATIXII")
523
    port map ( datain_h => ckel(1 downto 0), datain_l => ckel(1 downto 0), oe => vcc, oe_out => open,
524
        outclock => clk0r, dataout => ddr_cke(1 downto 0));
525
 
526
  ddrbanks : for i in 0 to 1 generate
527
    ckel(i) <= cke(i) and locked;
528
  end generate;
529
 
530
  rasnpad : altddio_out generic map (width => 1,
531
        INTENDED_DEVICE_FAMILY => "STRATIXII")
532
    port map ( datain_h(0) => rasn, datain_l(0) => rasn, oe => vcc, oe_out => open,
533
        outclock => clk0r, dataout(0) => ddr_rasb);
534
 
535
  casnpad : altddio_out generic map (width => 1,
536
        INTENDED_DEVICE_FAMILY => "STRATIXII")
537
    port map ( datain_h(0) => casn, datain_l(0) => casn, oe => vcc, oe_out => open,
538
        outclock => clk0r, dataout(0) => ddr_casb);
539
 
540
  wenpad : altddio_out generic map (width => 1,
541
        INTENDED_DEVICE_FAMILY => "STRATIXII")
542
    port map ( datain_h(0) => wen, datain_l(0) => wen, oe => vcc, oe_out => open,
543
        outclock => clk0r, dataout(0) => ddr_web);
544
 
545
  dmpads : altddio_out generic map (width => dbits/8,
546
        INTENDED_DEVICE_FAMILY => "STRATIXII")
547
    port map (
548
        datain_h => dm(dbits/8*2-1 downto dbits/8),
549
        datain_l => dm(dbits/8-1 downto 0), oe => vcc, oe_out => open,
550
        outclock => clk0r, dataout => ddr_dm
551
    );
552
 
553
  bapads : altddio_out generic map (width => 2)
554
    port map (
555
        datain_h => ba, datain_l => ba, oe => vcc, oe_out => open,
556
        outclock => clk0r, dataout => ddr_ba
557
    );
558
 
559
  addrpads : altddio_out generic map (width => 14)
560
    port map (
561
        datain_h => addr, datain_l => addr, oe => vcc, oe_out => open,
562
        outclock => clk0r, dataout => ddr_ad
563
    );
564
 
565
  -- DQS generation
566
 
567
  dqsnv <= (others => dqsn);
568
  dqsoclk <= (others => clk90r);
569
 
570
  altdqs0 : altdqs_stxii generic map (dbits/8, periodstr(DDR_FREQ/10))
571
    port map (dqs_datain_h => dqsnv, dqs_datain_l => gndv(dbits/8-1 downto 0),
572
        inclk => clk270r, oe => ddr_dqsoen, outclk => dqsoclk,
573
        dll_delayctrlout => open, dqinclk => dqinclk, dqs_padio => ddr_dqs,
574
        dqsundelayedout => open );
575
 
576
  -- Data bus
577
 
578
  dqgen : for i in 0 to dbits/8-1 generate
579
    qi : altddio_bidir generic map (width => 8, oe_reg =>"REGISTERED",
580
        INTENDED_DEVICE_FAMILY => "STRATIXII")
581
    port map (
582
        datain_l => dqout(i*8+7 downto i*8),
583
        datain_h => dqout(i*8+7+dbits downto dbits+i*8),
584
        inclock => dqinclk(i), --clk270r, 
585
        outclock => clk0r, oe => oe,
586
        dataout_h => dqin(i*8+7 downto i*8),
587
        dataout_l => dqin(i*8+7+dbits downto dbits+i*8), --dqinl(i*8+7 downto i*8),
588
        padio => ddr_dq(i*8+7 downto i*8));
589
  end generate;
590
 
591
  dqsreg : process(clk180r)
592
  begin
593
    if rising_edge(clk180r) then
594
      dqsn <= oe;
595
    end if;
596
  end process;
597
  oereg : process(clk0r)
598
  begin
599
    if rising_edge(clk0r) then
600
      ddr_dqsoen(dbits/8-1 downto 0) <= (others => not dqsoen);
601
    end if;
602
  end process;
603
 
604
end;

powered by: WebSVN 2.1.0

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