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/] [cycloneiii/] [cycloneiii_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:      cycloneiii_ddr_phy
20
-- File:        cycloneiii_ddr_phy.vhd
21
-- Author:      Jiri Gaisler, Gaisler Research
22
-- Description: DDR PHY for Altera FPGAs
23
------------------------------------------------------------------------------
24
 
25
 LIBRARY cycloneiii;
26
 USE cycloneiii.all;
27
 
28
 LIBRARY ieee;
29
 USE ieee.std_logic_1164.all;
30
 
31
 ENTITY  altdqs_cyciii_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_cyciii_adqs_n7i2;
47
 
48
 ARCHITECTURE RTL OF altdqs_cyciii_adqs_n7i2 IS
49
 
50
--       ATTRIBUTE synthesis_clearbox : boolean;
51
--       ATTRIBUTE synthesis_clearbox OF RTL : ARCHITECTURE IS true;
52
         SIGNAL  wire_cyciii_dll1_delayctrlout  :       STD_LOGIC_VECTOR (5 DOWNTO 0);
53
         SIGNAL  wire_cyciii_dll1_dqsupdate     :       STD_LOGIC;
54
         SIGNAL  wire_cyciii_dll1_offsetctrlout :       STD_LOGIC_VECTOR (5 DOWNTO 0);
55
         SIGNAL  wire_cyciii_io2a_combout       :       STD_LOGIC_VECTOR (width-1 downto 0);
56
         SIGNAL  wire_cyciii_io2a_datain        :       STD_LOGIC_VECTOR (width-1 downto 0);
57
         SIGNAL  wire_cyciii_io2a_ddiodatain    :       STD_LOGIC_VECTOR (width-1 downto 0);
58
         SIGNAL  wire_cyciii_io2a_dqsbusout     :       STD_LOGIC_VECTOR (width-1 downto 0);
59
         SIGNAL  wire_cyciii_io2a_oe    :       STD_LOGIC_VECTOR (width-1 downto 0);
60
         SIGNAL  wire_cyciii_io2a_outclk        :       STD_LOGIC_VECTOR (width-1 downto 0);
61
         SIGNAL  wire_cyciii_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  cycloneiii_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 := "cycloneiii_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  cycloneiii_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 := "cycloneiii_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_cyciii_dll1_delayctrlout;
163
        dll_delayctrlout <= delay_ctrl;
164
        dqinclk <= wire_cyciii_io2a_dqsbusout;
165
        dqs_update <= wire_cyciii_dll1_dqsupdate;
166
        dqsundelayedout <= wire_cyciii_io2a_combout;
167
        offset_ctrl <= wire_cyciii_dll1_offsetctrlout;
168
        cyciii_dll1 :  cycloneiii_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_cyciii_dll1_delayctrlout,
187
                dqsupdate => wire_cyciii_dll1_dqsupdate,
188
                offsetctrlout => wire_cyciii_dll1_offsetctrlout
189
          );
190
        wire_cyciii_io2a_datain <= dqs_datain_h;
191
        wire_cyciii_io2a_ddiodatain <= dqs_datain_l;
192
        wire_cyciii_io2a_oe <= oe;
193
        wire_cyciii_io2a_outclk <= outclk;
194
        wire_cyciii_io2a_outclkena <= outclkena;
195
        loop0 : FOR i IN 0 TO width-1 GENERATE
196
          cyciii_io2a :  cycloneiii_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_cyciii_io2a_combout(i),
226
                datain => wire_cyciii_io2a_datain(i),
227
                ddiodatain => wire_cyciii_io2a_ddiodatain(i),
228
                delayctrlin => delay_ctrl,
229
                dqsbusout => wire_cyciii_io2a_dqsbusout(i),
230
                dqsupdateen => dqs_update,
231
                oe => wire_cyciii_io2a_oe(i),
232
                offsetctrlin => offset_ctrl,
233
                outclk => wire_cyciii_io2a_outclk(i),
234
                outclkena => wire_cyciii_io2a_outclkena(i),
235
                padio => dqs_padio(i)
236
          );
237
        END GENERATE loop0;
238
 
239
 END RTL; --altdqs_cyciii_adqs_n7i2
240
 
241
LIBRARY ieee;
242
USE ieee.std_logic_1164.all;
243
 
244
ENTITY altdqs_cyciii 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_cyciii 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_cyciii_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_cyciii_adqs_n7i2_component : altdqs_cyciii_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
-- CYCLONEIII DDR PHY --------------------------------------------
329
------------------------------------------------------------------
330
 
331
entity cycloneiii_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 cycloneiii_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_cyciii
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
    intended_device_family => "CycloneIII",
451
    operation_mode => "NORMAL",
452
    inclk0_input_frequency   => 1000000/MHz,
453
    inclk1_input_frequency   => 1000000/MHz,
454
    clk4_multiply_by => clk_mul, clk4_divide_by => clk_div,
455
    clk3_multiply_by => clk_mul, clk3_divide_by => clk_div,
456
    clk2_multiply_by => clk_mul, clk2_divide_by => clk_div,
457
    clk1_multiply_by => clk_mul, clk1_divide_by => clk_div,
458
    clk0_multiply_by => clk_mul, clk0_divide_by => clk_div,
459
    clk3_phase_shift => phasearr(DDR_FREQ/10)(3),
460
    clk2_phase_shift => phasearr(DDR_FREQ/10)(2),
461
    clk1_phase_shift => phasearr(DDR_FREQ/10)(1)
462
--    clk3_phase_shift => "6250", clk2_phase_shift => "4167", clk1_phase_shift => "2083"
463
--    clk3_phase_shift => "7500", clk2_phase_shift => "5000", clk1_phase_shift => "2500"
464
  )
465
  port map ( inclk(0) => mclk, inclk(1) => gnd,  clk(0) => clk_0r,
466
        clk(1) => clk_90r, clk(2) => clk_180r, clk(3) => clk_270r,
467
        clk(4) => clk4, clk(5) => clk5, locked => lockl);
468
 
469
  rstdel : process (mclk, rst, lockl)
470
  begin
471
      if rst = '0' then dllrst <= (others => '1');
472
      elsif rising_edge(mclk) then
473
        dllrst <= dllrst(1 to 3) & '0';
474
      end if;
475
  end process;
476
 
477
  rdel : if rstdelay /= 0 generate
478
    rcnt : process (clk_0r)
479
    variable cnt : std_logic_vector(15 downto 0);
480
    variable vlock, co : std_ulogic;
481
    begin
482
      if rising_edge(clk_0r) then
483
        co := cnt(15);
484
        vlockl <= vlock;
485
        if lockl = '0' then
486
          cnt := conv_std_logic_vector(rstdelay*DDR_FREQ, 16); vlock := '0';
487
        else
488
          if vlock = '0' then
489
            cnt := cnt -1;  vlock := cnt(15) and not co;
490
          end if;
491
        end if;
492
      end if;
493
      if lockl = '0' then
494
        vlock := '0';
495
      end if;
496
    end process;
497
  end generate;
498
 
499
  locked <= lockl when rstdelay = 0 else vlockl;
500
  lock <= locked;
501
 
502
  -- Generate external DDR clock
503
 
504
--  fbclkpad : altddio_out generic map (width => 1)
505
--    port map ( datain_h(0) => vcc, datain_l(0) => gnd,
506
--      outclock => clk90r, dataout(0) => ddr_clk_fb_out);
507
 
508
  ddrclocks : for i in 0 to 2 generate
509
    clkpad : altddio_out generic map (width => 1, INTENDED_DEVICE_FAMILY => "CYCLONEIII")
510
    port map ( datain_h(0) => vcc, datain_l(0) => gnd,
511
        outclock => clk90r, dataout(0) => ddr_clk(i));
512
 
513
    clknpad : altddio_out generic map (width => 1, INTENDED_DEVICE_FAMILY => "CYCLONEIII")
514
    port map ( datain_h(0) => gnd, datain_l(0) => vcc,
515
        outclock => clk90r, dataout(0) => ddr_clkb(i));
516
 
517
  end generate;
518
 
519
  csnpads : altddio_out generic map (width => 2, INTENDED_DEVICE_FAMILY => "CYCLONEIII")
520
    port map ( datain_h => csn(1 downto 0), datain_l => csn(1 downto 0),
521
        outclock => clk0r, dataout => ddr_csb(1 downto 0));
522
 
523
  ckepads : altddio_out generic map (width => 2, INTENDED_DEVICE_FAMILY => "CYCLONEIII")
524
    port map ( datain_h => ckel(1 downto 0), datain_l => ckel(1 downto 0),
525
        outclock => clk0r, dataout => ddr_cke(1 downto 0));
526
 
527
  ddrbanks : for i in 0 to 1 generate
528
    ckel(i) <= cke(i) and locked;
529
  end generate;
530
 
531
  rasnpad : altddio_out generic map (width => 1,
532
        INTENDED_DEVICE_FAMILY => "CYCLONEIII")
533
    port map ( datain_h(0) => rasn, datain_l(0) => rasn,
534
        outclock => clk0r, dataout(0) => ddr_rasb);
535
 
536
  casnpad : altddio_out generic map (width => 1,
537
        INTENDED_DEVICE_FAMILY => "CYCLONEIII")
538
    port map ( datain_h(0) => casn, datain_l(0) => casn,
539
        outclock => clk0r, dataout(0) => ddr_casb);
540
 
541
  wenpad : altddio_out generic map (width => 1,
542
        INTENDED_DEVICE_FAMILY => "CYCLONEIII")
543
    port map ( datain_h(0) => wen, datain_l(0) => wen,
544
        outclock => clk0r, dataout(0) => ddr_web);
545
 
546
  dmpads : altddio_out generic map (width => dbits/8,
547
        INTENDED_DEVICE_FAMILY => "CYCLONEIII")
548
    port map (
549
        datain_h => dm(dbits/8*2-1 downto dbits/8),
550
        datain_l => dm(dbits/8-1 downto 0),
551
        outclock => clk0r, dataout => ddr_dm
552
    );
553
 
554
  bapads : altddio_out generic map (width => 2)
555
    port map (
556
        datain_h => ba, datain_l => ba,
557
        outclock => clk0r, dataout => ddr_ba
558
    );
559
 
560
  addrpads : altddio_out generic map (width => 14)
561
    port map (
562
        datain_h => addr, datain_l => addr,
563
        outclock => clk0r, dataout => ddr_ad
564
    );
565
 
566
  -- DQS generation
567
 
568
  dqsnv <= (others => dqsn);
569
  dqsoclk <= (others => clk90r);
570
 
571
  altdqs0 : altdqs_cyciii generic map (dbits/8, periodstr(DDR_FREQ/10))
572
    port map (dqs_datain_h => dqsnv, dqs_datain_l => gndv(dbits/8-1 downto 0),
573
        inclk => clk270r, oe => ddr_dqsoen, outclk => dqsoclk,
574
        dll_delayctrlout => open, dqinclk => dqinclk, dqs_padio => ddr_dqs,
575
        dqsundelayedout => open );
576
 
577
  -- Data bus
578
 
579
  dqgen : for i in 0 to dbits/8-1 generate
580
    qi : altddio_bidir generic map (width => 8, oe_reg =>"REGISTERED",
581
        INTENDED_DEVICE_FAMILY => "CYCLONEIII")
582
    port map (
583
        datain_l => dqout(i*8+7 downto i*8),
584
        datain_h => dqout(i*8+7+dbits downto dbits+i*8),
585
        inclock => dqinclk(i), --clk270r, 
586
        outclock => clk0r, oe => oe,
587
        dataout_h => dqin(i*8+7 downto i*8),
588
        dataout_l => dqin(i*8+7+dbits downto dbits+i*8), --dqinl(i*8+7 downto i*8),
589
        padio => ddr_dq(i*8+7 downto i*8));
590
  end generate;
591
 
592
  dqsreg : process(clk180r)
593
  begin
594
    if rising_edge(clk180r) then
595
      dqsn <= oe;
596
    end if;
597
  end process;
598
  oereg : process(clk0r)
599
  begin
600
    if rising_edge(clk0r) then
601
      ddr_dqsoen(dbits/8-1 downto 0) <= (others => not dqsoen);
602
    end if;
603
  end process;
604
 
605
end;

powered by: WebSVN 2.1.0

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