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/] [gaisler/] [ddr/] [hs.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:      hs
20
-- File:        hs.vhd
21
-- Author:      David Lindh - Gaisler Research
22
-- Description: High speed DDR memory interface
23
------------------------------------------------------------------------------
24
 
25
library ieee;
26
use ieee.std_logic_1164.all;
27
library grlib;
28
use grlib.stdlib.all;
29
use grlib.amba.all;
30
library gaisler;
31
use gaisler.misc.all;
32
library techmap;
33
use techmap.gencomp.all;
34
use techmap.allmem.all;
35
library gaisler;
36
use gaisler.ddrrec.all;
37
 
38
entity hs is
39
  generic(
40
    tech      : in integer;
41
    dqsize    : in integer;
42
    dmsize    : in integer;
43
    strobesize: in integer;
44
    clkperiod : in integer);
45
  port (
46
    rst       : in std_ulogic;
47
    clk0      : in std_ulogic;
48
    clk90     : in std_ulogic;
49
    clk180    : in std_ulogic;
50
    clk270    : in std_ulogic;
51
    hclk      : in std_ulogic;
52
    hssi      : in  hs_in_type;
53
    hsso      : out hs_out_type);
54
 end entity hs;
55
 
56
 architecture rtl of hs is
57
 
58
   type wait_times_row_type is array(7 downto 0) of integer range 0 to 31;
59
   type wait_times_matrix_type is array(7 downto 0) of wait_times_row_type;
60
 
61
   constant DELAY_15NS  : integer := (((15*1000)-1) / (clkperiod*1000))+1;
62
   constant DELAY_20NS  : integer := (((20*1000)-1) / (clkperiod*1000))+1;
63
   constant DELAY_50NS  : integer := (((50*1000)-1) / (clkperiod*1000))+1;
64
   constant DELAY_75NS  : integer := (((75*1000)-1) / (clkperiod*1000))+1;
65
   constant DELAY_80NS  : integer := (((80*1000)-1) / (clkperiod*1000))+1;
66
   constant DELAY_120NS : integer := (((120*1000)-1) / (clkperiod*1000))+1;
67
 
68
 
69
 
70
 
71
   constant wait_times : wait_times_matrix_type :=
72
   -- NOP,BST,READ,WRITE,ACT,PRE,RFSH,LMR
73
     ((0, 0, 0, 0, 0, 0, 0, 0),
74
      (0, 0, 0, 0, 0, 0, 0, 0),
75
      (0, 0, 0, 2, DELAY_20NS, 10, 10, 10),
76
      (0, 0, 3, 0, DELAY_20NS, 10, 10, 10),
77
      (0, 0, DELAY_20NS, 1+DELAY_15NS+DELAY_20NS, DELAY_15NS, DELAY_20NS, DELAY_120NS, 2),
78
      (0, 0, 0, 1+DELAY_15NS, DELAY_50NS, DELAY_20NS, DELAY_120NS, 2),
79
      (0, 0, DELAY_20NS, 1+DELAY_15NS+DELAY_20NS, 10, DELAY_20NS, DELAY_120NS, 2),
80
      (0, 0, DELAY_20NS, 1+DELAY_15NS+DELAY_20NS, 10, DELAY_20NS, DELAY_120NS, 2));
81
 
82
 
83
 
84
   --signal cmdr : cmd_reg_type; signal cmdri: cmd_reg_type;
85
   signal rwr  : rw_reg_type; signal rwri : rw_reg_type;
86
   signal data_out      : std_logic_vector((dqsize-1) downto 0);
87
   signal data_in       : std_logic_vector((dqsize-1) downto 0);
88
   signal strobe_out    : std_logic_vector((strobesize-1) downto 0);
89
   signal mask_out      : std_logic_vector((dmsize-1) downto 0);
90
   signal dq1_i    : std_logic_vector((dqsize-1) downto 0);
91
   signal dq1del_i : std_logic_vector((dqsize-1) downto 0);
92
   signal dq2_i    : std_logic_vector((dqsize-1) downto 0);
93
   signal dq1_o    : std_logic_vector((dqsize-1) downto 0);
94
   signal dq2_o    : std_logic_vector((dqsize-1) downto 0);
95
   signal dm1_o    : std_logic_vector((dmsize-1) downto 0);
96
   signal dm2_o    : std_logic_vector((dmsize-1) downto 0);
97
   signal dqs1_o, dqs2_o, w_ce, r_ce, vcc, gnd   : std_ulogic;
98
 
99
 
100
   -- DQS delay control signal
101
   signal uddcntl : std_ulogic;
102
   signal lock    : std_ulogic;
103
   signal dqsdel  : std_ulogic;
104
   signal read    : std_ulogic;
105
   signal dqso    : std_logic_vector((strobesize-1) downto 0);
106
   signal ddrclkpol : std_logic_vector((strobesize-1) downto 0);
107
   signal invrst  : std_logic;
108
   signal clk_90  :std_ulogic;
109
 
110
begin
111
-------------------------------------------------------------------------------   
112
rwcomb : process(rst, hssi, rwr, dq1_i, dq1del_i, dq2_i)
113
  variable v : rw_reg_type;
114
begin
115
  v:= rwr;
116
  v.set_cmd := CMD_NOP;
117
  v.set_adr := (others => '0');
118
  v.set_cs := "11";
119
  v.begin_read := '0';
120
  v.begin_write := '0';
121
 
122
 
123
 
124
-------------------------------------------------------------------------------
125
   -- Buffer for incoming command
126
-------------------------------------------------------------------------------
127
   case v.cbufstate is
128
      when no_cmd =>
129
         v.hs_busy := '0';
130
         if hssi.cmd_valid = '1' then
131
           v.next_bl  := hssi.bl; v.next_buf := hssi.buf; v.next_cas := hssi.cas;
132
           v.next_adr := hssi.adr; v.next_cs := hssi.cs; v.next_cmd := hssi.cmd;
133
           v.next_ml := hssi.ml; v.next_ahb := hssi.ahb;
134
           v.cbufstate := new_cmd;
135
         end if;
136
      when new_cmd =>
137
         v.hs_busy := '1';
138
   end case;
139
 
140
 
141
 
142
-------------------------------------------------------------------------------
143
  -- Send commands
144
-------------------------------------------------------------------------------
145
case v.cmdstate is
146
 when idle =>
147
    v.holdcnt := 0;
148
 
149
   if rwr.cbufstate = new_cmd then
150
    v.rw_cmd := rwr.next_cmd;
151
    v.rw_bl := rwr.next_bl;
152
    v.rw_cas := 2 + conv_integer(rwr.next_cas(0))+ conv_integer(rwr.next_cas(1));
153
    v.set_cmd := rwr.next_cmd;
154
    v.set_adr := rwr.next_adr;
155
    v.set_cs  := rwr.next_cs;
156
    v.set_cke := '1';
157
    v.cbufstate := no_cmd;
158
    v.cmdstate := hold;
159
 
160
      -- Read command, delay start of Read machine
161
   if rwr.next_cmd = CMD_READ then
162
      if rwr.next_cas = "00" then       -- cas 2   
163
         v.readwait(5) := '1';
164
         v.bufwait(5):=  rwr.next_buf;
165
         v.ahbwait(5) := rwr.next_ahb;
166
         v.blwait(5) := rwr.next_bl;
167
         v.caswait(5) := rwr.next_cas(0);
168
      else                            -- cas 2.5 or 3
169
         v.readwait(6) := '1';
170
         v.bufwait(6):=  rwr.next_buf;
171
         v.ahbwait(6) := rwr.next_ahb;
172
         v.blwait(6) := rwr.next_bl;
173
         v.caswait(6) := rwr.next_cas(0);
174
      end if;
175
 
176
       -- Calculate delay until write can begin
177
       v.r2wholdcnt :=  rwr.rw_cas  + rwr.rw_bl/2 +2;
178
 
179
 
180
     -- Write command, immediately start Write machine 
181
   elsif rwr.next_cmd = CMD_WRITE then
182
      v.writewait(1) := '1';
183
      v.bufwait(1):=  rwr.next_buf;
184
      v.ahbwait(1) := rwr.next_ahb;
185
      v.blwait(1) := rwr.next_bl;
186
      v.mlwait(1) := rwr.next_ml;
187
 
188
      -- Active command, begin count towards ealiest precharge
189
    elsif rwr.next_cmd = CMD_ACTIVE then
190
       v.act2precnt := DELAY_50NS-1;
191
   end if;
192
 end if;
193
 
194
 
195
    -- Wait until next cmd is valid to send
196
 when hold =>
197
 
198
     v.set_cmd := CMD_NOP;
199
     v.set_adr := (others => '0');
200
     v.set_cs := "11";
201
 
202
     -- Some waittimes which isn't constant
203
     if v.rw_cmd = CMD_READ and rwr.next_cmd = CMD_WRITE then
204
       v.wait_time := v.rw_cas  + v.rw_bl/2;
205
     elsif v.rw_cmd = CMD_READ or v.rw_cmd = CMD_WRITE then
206
       v.wait_time := v.rw_bl/2;
207
     else
208
       v.wait_time := 0;
209
     end if;
210
 
211
     -- Calculate total wait time
212
     if rwr.cbufstate = new_cmd then
213
       if ((v.holdcnt+2 >= wait_times(conv_integer(rwr.next_cmd))(conv_integer(v.rw_cmd))+ v.wait_time)
214
           and (v.r2wholdcnt = 0 or rwr.next_cmd /= CMD_WRITE)
215
           and (v.act2precnt = 0 or rwr.next_cmd /= CMD_PRE)) then
216
         v.cmdstate := idle;
217
       end if;
218
     elsif v.holdcnt >= 4+DELAY_120NS then
219
       v.cmdstate := idle;
220
     end if;
221
 
222
     v.holdcnt := v.holdcnt +1;
223
end case;
224
 
225
-- Separate count for time beteen a read and write and between  active and precharge
226
if v.r2wholdcnt /= 0 then v.r2wholdcnt := v.r2wholdcnt -1; end if;
227
if v.act2precnt /= 0 then v.act2precnt := v.act2precnt -1; end if;
228
 
229
-------------------------------------------------------------------------------
230
-- Delay cmd data for Read machine during CAS period
231
-------------------------------------------------------------------------------
232
 
233
  if v.readwait(0) = '1' or v.writewait(0) = '1' then
234
    v.begin_read :=  v.readwait(0);
235
    v.begin_write := v.writewait(0);
236
    v.use_ahb := v.ahbwait(0);
237
    v.use_buf := v.bufwait(0);
238
    v.use_bl := v.blwait(0);
239
    if v.writewait(0) = '1' then
240
      v.use_ml := v.mlwait(0);
241
    else
242
      v.use_cas := v.caswait(0);
243
    end if;
244
  end if;
245
 
246
  v.readwait := '0' & v.readwait(6 downto 1);
247
  v.writewait := '0' & v.writewait(1);
248
  v.bufwait(5 downto 0) :=  v.bufwait(6 downto 1);
249
  v.ahbwait := 0 & v.ahbwait(6 downto 1);
250
  v.blwait := 8 & v.blwait(6 downto 1);
251
  v.mlwait := 1 & v.mlwait(1);
252
  v.caswait := '0' & v.caswait(6 downto 1);
253
 
254
 
255
 
256
-------------------------------------------------------------------------------
257
   -- Send/recieve data
258
-------------------------------------------------------------------------------
259
 
260
  -- Read and Write routines
261
case v.rwstate is
262
  when idle =>
263
    v.sync_adr(0)  := (v.cur_buf(0)+1) & "00";
264
    v.sync_adr(1)  := (v.cur_buf(1)+1) & "00";
265
    v.cmdDone   := v.cur_buf;
266
    v.sync_write:= "00";
267
    v.dq_dqs_oe := '1';
268
    v.dqs1_o    := '0';
269
    v.w_ce      := '0';
270
    v.r_ce      := '1';
271
    v.cnt       := 0;
272
 
273
     if v.begin_write = '1' then
274
       v.cur_buf(v.use_ahb)  := v.use_buf;
275
       v.cur_ahb   := v.use_ahb;
276
       v.dq_dqs_oe := '0';
277
       v.w_ce      := '1';
278
       v.cnt       := v.cnt +2;
279
       if v.use_bl = 2 then
280
         v.sync_adr(v.use_ahb) := (v.use_buf +1) & "00";
281
       else
282
         v.sync_adr(v.use_ahb) := v.use_buf & "01";
283
       end if;
284
       v.rwstate := w;
285
 
286
     elsif v.begin_read = '1' then
287
       v.cur_buf(v.use_ahb)   := v.use_buf;
288
       v.cur_ahb   := v.use_ahb;
289
       v.sync_adr(v.use_ahb)  := v.use_buf & "00";
290
       v.sync_write(v.use_ahb) := '1';
291
       v.cnt        := v.cnt +2;
292
       v.cmdDone(v.use_ahb)    := v.use_buf;
293
       if v.use_cas = '0' then      -- Cas 2 or 3 
294
         v.sync_wdata((2*dqsize)-1 downto 0) :=  dq1_i & dq2_i;
295
       else                           -- Cas 2.5
296
         v.sync_wdata((2*dqsize)-1 downto 0) :=  dq2_i & dq1del_i;
297
       end if;
298
       v.rwstate := r;
299
     end if;
300
 
301
  -- Write
302
  when w =>
303
     v.dqs1_o    := '1';
304
     v.dq_dqs_oe := '0';
305
 
306
     if v.cnt = v.use_bl then
307
       v.cmdDone(v.cur_ahb)  := v.cur_buf(v.cur_ahb);
308
       if v.begin_write = '0' then      -- No new write is following
309
         v.sync_adr(v.cur_ahb) := (v.cur_buf(v.cur_ahb)+1) & "00";
310
         v.cnt      := 0;
311
         v.rwstate  := idle;
312
       else                             -- New write is following
313
          v.sync_adr(v.cur_ahb) := (v.cur_buf(v.cur_ahb)+1) & "00";
314
         if v.use_bl = 2 then
315
           v.sync_adr(v.use_ahb) := (v.use_buf +1) & "00";
316
         else
317
           v.sync_adr(v.use_ahb) := v.use_buf & "01";
318
         end if;
319
         v.cur_buf(v.use_ahb)   := v.use_buf;
320
         v.cur_ahb   := v.use_ahb;
321
         v.cnt       := 2;
322
       end if;
323
     else
324
       v.cnt := v.cnt +2;
325
       if v.cnt = v.use_bl then
326
         v.sync_adr(v.cur_ahb) := (v.cur_buf(v.cur_ahb)+1) & "00";
327
       else
328
         v.sync_adr(v.cur_ahb) := v.sync_adr(v.cur_ahb)+1;
329
       end if;
330
     end if;
331
 
332
  -- Read
333
  when r =>
334
    v.cmdDone(v.cur_ahb) := v.cur_buf(v.cur_ahb);
335
    if v.use_cas = '0' then             -- Cas 2 or 3
336
      v.sync_wdata((2*dqsize)-1 downto 0) :=  dq1_i & dq2_i;
337
    else                                -- Cas 2.5
338
      v.sync_wdata((2*dqsize)-1 downto 0) :=  dq2_i & dq1del_i;
339
    end if;
340
 
341
    if v.cnt = v.use_bl then
342
      if v.begin_read = '0' then
343
        v.sync_write := "00";
344
        v.sync_adr(v.cur_ahb) := (v.cur_buf(v.cur_ahb)+1) & "00";
345
        v.cnt        := 0;
346
        v.rwstate    := idle;
347
      else
348
        v.sync_adr(v.cur_ahb) := (v.cur_buf(v.cur_ahb)+1) & "00";
349
        v.cnt        := 2;
350
        v.cur_ahb   := v.use_ahb;
351
        v.cur_buf(v.use_ahb)   := v.use_buf;
352
        v.sync_adr(v.use_ahb) := v.use_buf & "00";
353
        if v.use_ahb = 0 then
354
          v.sync_write := "01";
355
        else
356
          v.sync_write := "10";
357
        end if;
358
      end if;
359
    else
360
      v.cnt := v.cnt +2;
361
      v.sync_adr(v.cur_ahb) := v.sync_adr(v.cur_ahb) +1;
362
    end if;
363
 
364
  end case;
365
 
366
   -- Calculate and set data mask 
367
  if v.use_ml+1 < v.cnt then
368
    v.dm1_o := (others => '1');
369
    v.dm2_o := (others => '1');
370
  elsif v.use_ml+1 = v.cnt then
371
    v.dm1_o(dmsize-1 downto 0) := hssi.dsramso(v.use_ahb).dataout2((2*dqsize+dmsize)-1 downto (2*dqsize));
372
    v.dm2_o := (others => '1');
373
  else
374
    v.dm1_o(dmsize-1 downto 0) := hssi.dsramso(v.use_ahb).dataout2((2*dqsize+dmsize)-1 downto (2*dqsize));
375
    v.dm2_o(dmsize-1 downto 0) := hssi.dsramso(v.use_ahb).dataout2((2*dqsize+2*dmsize)-1 downto (2*dqsize+dmsize));
376
  end if;
377
 
378
 
379
 
380
-------------------------------------------------------------------------------
381
-- Register and reset
382
 
383
  if rst = '0' then
384
    v.cbufstate := no_cmd;
385
    v.cmdstate  := idle;
386
    v.rwstate   := idle;
387
    v.cur_buf   := (others => (others => '1'));
388
    v.cur_ahb   := 0;
389
    v.use_bl    := 4;
390
    v.use_ml    := 2;
391
    v.use_buf   := (others => '1');
392
    v.use_cas   := '0';
393
    v.rw_cmd    := CMD_NOP;
394
    v.rw_bl     := 4;
395
    v.rw_cas    := 2;
396
    v.next_bl   := 4;
397
    v.next_ml   := 2;
398
    v.next_buf  := (others => '1');
399
    v.next_cas  := "00";
400
    v.next_adr  := (others => '0');
401
    v.next_cs   := "11";
402
    v.next_cmd  := CMD_NOP;
403
    v.set_cmd   := CMD_NOP;
404
    v.set_adr   := (others => '0');
405
    v.set_cs    := "00";
406
    v.set_cke   := '0';
407
    v.hs_busy   := '0';
408
    v.cmdDone   := (others => (others => '1'));
409
    v.begin_read  := '0';
410
    v.begin_write := '0';
411
    v.dq_dqs_oe := '1';
412
    v.w_ce      := '0';
413
    v.r_ce      := '0';
414
    v.cnt       := 0;
415
    v.holdcnt   := 0;
416
    v.r2wholdcnt:= 0;
417
    v.act2precnt:= 0;
418
    v.wait_time := 10;
419
    v.readwait  := (others => '0');
420
    v.writewait := (others => '0');
421
    v.dm1_o     := (others => '1');
422
    v.dm2_o     := (others => '1');
423
    v.dqs1_o    := '0';
424
    v.sync_adr  := (others => (others => '0'));
425
    v.sync_write := "00";
426
    v.sync_wdata := (others => '0');
427
  end if;
428
 
429
  rwri <= v;
430
 
431
 -- Combinatiorial outputs
432
  hsso.hs_busy <= v.hs_busy;
433
  dqs1_o <= v.dqs1_o;
434
  dqs2_o <= '0';
435
  hsso.dsramsi(0).address2 <= v.sync_adr(0);
436
  hsso.dsramsi(0).write2 <= v.sync_write(0);
437
  hsso.dsramsi(0).datain2 <= v.sync_wdata;
438
  hsso.dsramsi(1).address2 <= v.sync_adr(1);
439
  hsso.dsramsi(1).write2 <= v.sync_write(1);
440
  hsso.dsramsi(1).datain2 <= v.sync_wdata;
441
end process;
442
 
443
-------------------------------------------------------------------------------
444
-- Clocked processes
445
 
446
-- CLK0, Main register
447
rwclk : process(clk0)
448
  begin
449
    if rising_edge(clk0) then
450
      rwr <= rwri;
451
 
452
      -- Registered outputs
453
      r_ce <= rwri.r_ce;
454
      w_ce <= rwri.w_ce;
455
      hsso.cmdDone <= rwri.cmdDone;
456
      dm1_o <= rwri.dm1_o((dmsize-1) downto 0);
457
      dm2_o <= rwri.dm2_o((dmsize-1) downto 0);
458
 
459
      -- Registers
460
      dq1del_i <= dq1_i;
461
      dq1_o <= hssi.dsramso(rwri.use_ahb).dataout2(dqsize-1 downto 0);
462
      dq2_o <= hssi.dsramso(rwri.use_ahb).dataout2((2*dqsize)-1 downto dqsize);
463
 
464
    end if;
465
end process;
466
 
467
---- CLK270, Drives output enable signal
468
--oeclk : process(rst, clk270)
469
--  begin
470
--    if rst = '0' then
471
--      hsso.ddsi.dq_dqs_oe <= '1';
472
--    elsif rising_edge(clk270) then
473
--      hsso.ddsi.dq_dqs_oe <= rwri.dq_dqs_oe;
474
--    end if;
475
--  end process;
476
 
477
 
478
-- CLK0, Drives control signals
479
 cmdclk : process(clk0)
480
  begin
481
     if rising_edge(clk0) then
482
      hsso.ddsi.control <= rwri.set_cmd;
483
      hsso.ddsi.adr     <= rwri.set_adr((adrbits-3) downto 0);
484
      hsso.ddsi.ba      <= rwri.set_adr((adrbits-1) downto (adrbits-2));
485
      hsso.ddsi.cs      <= rwri.set_cs;
486
      hsso.ddsi.cke     <= rwri.set_cke;
487
   end if;
488
 end process;
489
 
490
  vcc <= '1';
491
  gnd <= '0';
492
  data_in <= hssi.ddso.dq((dqsize-1) downto 0);
493
  hsso.ddsi.dq((dqsize-1) downto 0) <= data_out;
494
  hsso.ddsi.dqs((strobesize-1) downto 0) <= strobe_out;
495
  hsso.ddsi.dm((dmsize-1) downto 0) <= mask_out;
496
 
497
  dqot : if dqsize < maxdqsize generate
498
     hsso.ddsi.dq((maxdqsize-1) downto dqsize) <= (others => '-');
499
  end generate;
500
  dqsot : if strobesize < maxstrobesize generate
501
     hsso.ddsi.dqs((maxstrobesize-1) downto strobesize) <= (others => '-');
502
  end generate;
503
  dmot : if dmsize <= maxdmsize generate
504
    hsso.ddsi.dm((maxdmsize-1) downto dmsize) <= (others => '-');
505
  end generate;
506
 
507
-------------------------------------------------------------------------------
508
-- DDR IO registers
509
-------------------------------------------------------------------------------
510
 
511
 
512
 
513
 -- Input and Output DQ
514
 
515
    dqio : for i in 0 to (dqsize-1) generate
516
        in1 : ddr_ireg generic map( tech => tech)
517
          port map(
518
            Q1 => dq1_i(i),
519
            Q2 => dq2_i(i),
520
            C1 => clk0,
521
            C2 => clk180,
522
            CE => vcc, --r_ce,              
523
            D  => data_in(i),
524
            R  => gnd,
525
            S  => gnd);
526
 
527
      out1  : ddr_oreg
528
        generic map( tech => tech)
529
        port map(
530
          Q  => data_out(i),
531
          C1 => clk180,
532
          C2 => clk0,
533
          CE => vcc, --w_ce,       
534
          D1 => dq1_o(i),
535
          D2 => dq2_o(i),
536
          R  => gnd,
537
          S  => gnd);
538
 
539
      dq_tri : ddr_oreg generic map(
540
          tech => tech)
541
        port map(
542
        Q  => hsso.ddsi.dq_oe(i),
543
        C1 => clk180,
544
        C2 => clk0,
545
        CE => vcc, --w_ce,       
546
        D1 => rwri.dq_dqs_oe,
547
        D2 => rwri.dq_dqs_oe,
548
        R  => gnd,
549
        S  => gnd);
550
 
551
    end generate;
552
 
553
 
554
 
555
 -- output DQS
556
 
557
 dqsio : for i in 0 to (strobesize-1) generate
558
     dqso : ddr_oreg
559
      generic map(
560
        tech => tech)
561
      port map(
562
        Q  => strobe_out(i),
563
        C1 => clk270,
564
        C2 => clk90,
565
        CE => vcc,
566
        D1 => dqs1_o,
567
        D2 => dqs2_o,
568
        R  => gnd,
569
        S  => gnd);
570
 
571
     dqso_tri : ddr_oreg
572
      generic map(
573
        tech => tech)
574
      port map(
575
        Q  => hsso.ddsi.dqs_oe(i),
576
        C1 => clk270,
577
        C2 => clk90,
578
        CE => vcc, --w_ce,       
579
        D1 => rwri.dq_dqs_oe,
580
        D2 => rwri.dq_dqs_oe,
581
        R  => gnd,
582
        S  => gnd);
583
 end generate;
584
 
585
 
586
 
587
 -- Output DM
588
 
589
      dmo : for i in 0 to (dmsize-1) generate
590
      U4 : ddr_oreg
591
        generic map(
592
          tech => tech)
593
        port map(
594
          Q  => mask_out(i),
595
          C1 => clk180,
596
          C2 => clk0,
597
          CE => vcc, --w_ce,                --write_ce
598
          D1 => dm1_o(i),
599
          D2 => dm2_o(i),
600
          R  => gnd,
601
          S  => gnd);
602
      end generate;
603
 
604
end rtl;

powered by: WebSVN 2.1.0

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