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

Subversion Repositories pulse_processing_algorithm

[/] [pulse_processing_algorithm/] [data_read_controller.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 panda_emc
--*********************************************************************
2
-- DDR 72 Bit Controller DATA PATH for LEFT RIGHT Pins
3
 
4
-- In the current DATA PATH logic DATA CAPTURE part was modified.
5
-- The below changes were made to reduce the resources in 
6
-- the data capture
7
 
8
-- in the current architecture data ( dq ) from ddr memory 
9
-- directly stored into the FIFO's.
10
 
11
-- Architectural changes :
12
 
13
-- Used only TWO FIFOs ( instead of FOUR FIFOs ) 
14
-- Used Single col ( col0 ) dqs_delayed_col signals
15
-- Used Gray Counters for write and read pointers of the FIFOs 
16
 
17
-- fbit stage is removed from ddr1_dqbit module ( in the data capture )
18
-- dq_clk stage was removed 
19
-- dqs_clk_div logic was removed
20
-- ddr1_transfer_done logic was removed 
21
-- data valid signals registering in clk90 domain was removed
22
 
23
-- fifo_0 and fifo_1 wr_addr was double registered in clk90 domain
24
-- only fifo_0 and fifo_1 empty signals were used for read_data_valid_1 logic  
25
-- write enable for the FIFOs derived from rst_dqs_div signal
26
 
27
 
28
 
29
 
30
--*********************************************************************
31
 
32
 
33
library ieee;
34
use ieee.std_logic_1164.all;
35
use ieee.std_logic_unsigned.all;
36
--library synplify; 
37
--use synplify.attributes.all;
38
--
39
-- pragma translate_off
40
library UNISIM;
41
use UNISIM.VCOMPONENTS.ALL;
42
-- pragma translate_on
43
--
44
 
45
entity data_read_controller is
46
port(
47
     clk90                                : in std_logic;
48
     clk180                               : in std_logic;
49
     reset_r                              : in std_logic;
50
     reset90_r                            : in std_logic;
51
     rst_dqs_div_in                       : in std_logic;
52
     delay_sel                            : in std_logic_vector(4 downto 0);
53
     dqs_int_delay_in0                    : in std_logic;
54
     dqs_int_delay_in1                    : in std_logic;
55
     fifo0_rd_addr                        : in std_logic_vector(3 downto 0);
56
     fifo1_rd_addr                        : in std_logic_vector(3 downto 0);
57
     u_data_val                           : out std_logic;
58
     read_valid_data_1_val                : out std_logic;
59
     fifo_00_wr_en_val                    : out std_logic;
60
     fifo_10_wr_en_val                    : out std_logic;
61
     fifo_01_wr_en_val                    : out std_logic;
62
     fifo_11_wr_en_val                    : out std_logic;
63
 
64
     fifo_00_wr_addr_val                  : out std_logic_vector(3 downto 0);
65
     fifo_01_wr_addr_val                  : out std_logic_vector(3 downto 0);
66
     fifo_10_wr_addr_val                  : out std_logic_vector(3 downto 0);
67
     fifo_11_wr_addr_val                  : out std_logic_vector(3 downto 0);
68
--     dqs0_delayed_col1_val                : out std_logic;
69
--     dqs1_delayed_col1_val                : out std_logic 
70
 
71
 
72
     dqs0_delayed_col0_val                : out std_logic;
73
     dqs1_delayed_col0_val                : out std_logic
74
 
75
      );
76
 
77
end data_read_controller;
78
 
79
architecture arc_data_read_controller of data_read_controller is
80
 
81
component LUT4
82
   generic(
83
      INIT                           :  bit_vector(15 downto 0) := x"0000" );
84
   port(
85
      O                              :  out   STD_ULOGIC;
86
      I0                             :  in    STD_ULOGIC;
87
      I1                             :  in    STD_ULOGIC;
88
      I2                             :  in    STD_ULOGIC;
89
      I3                             :  in    STD_ULOGIC
90
      );
91
end component;
92
 
93
component dqs_delay
94
              port (
95
                    clk_in   : in std_logic;
96
                    sel_in   : in std_logic_vector(4 downto 0);
97
                    clk_out  : out std_logic
98
                  );
99
end component;
100
 
101
-- wr_gray_cntr is a gray counter with an ASYNC reset for fifo wr_addr
102
component wr_gray_cntr
103
        port (
104
                        clk                             :       in std_logic;
105
                        reset                           :       in std_logic;
106
                        cnt_en                          :       in std_logic;
107
                        wgc_gcnt                        :       out     std_logic_vector(3 downto 0)
108
                  );
109
end component;
110
 
111
-- fifo_wr_en module generates fifo write enable signal
112
-- enable is derived from rst_dqs_div signal
113
 
114
 
115
 
116
component fifo_0_wr_en
117
        port
118
        (
119
                clk             :       in std_logic;
120
                reset           :       in std_logic;
121
                din             :       in std_logic;
122
                rst_dqs_delay_n :                       out std_logic;
123
                dout            :       out std_logic
124
          );
125
end component;
126
 
127
 
128
component fifo_1_wr_en
129
        port (
130
                clk             :       in std_logic;
131
                rst_dqs_delay_n :                       in std_logic;
132
                reset           :       in std_logic;
133
                din             :       in std_logic;
134
                dout            :       out std_logic
135
          );
136
end component ;
137
 
138
 
139
signal dqs_delayed_col0       : std_logic_vector(1 downto 0);
140
--signal dqs_delayed_col1       : std_logic_vector(1 downto 0); 
141
 
142
signal fifo_00_empty          : std_logic;
143
signal fifo_01_empty          : std_logic;
144
 
145
signal fifo_00_wr_addr        : std_logic_vector(3 downto 0);
146
signal fifo_01_wr_addr        : std_logic_vector(3 downto 0);
147
signal fifo_10_wr_addr        : std_logic_vector(3 downto 0);
148
signal fifo_11_wr_addr        : std_logic_vector(3 downto 0);
149
--signal fifo_20_wr_addr        : std_logic_vector(3 downto 0);
150
--signal fifo_21_wr_addr        : std_logic_vector(3 downto 0);
151
--signal fifo_30_wr_addr        : std_logic_vector(3 downto 0);
152
--signal fifo_31_wr_addr        : std_logic_vector(3 downto 0);
153
--signal fifo_40_wr_addr        : std_logic_vector(3 downto 0);
154
--signal fifo_41_wr_addr        : std_logic_vector(3 downto 0);
155
--signal fifo_50_wr_addr        : std_logic_vector(3 downto 0);
156
--signal fifo_51_wr_addr        : std_logic_vector(3 downto 0);
157
--signal fifo_60_wr_addr        : std_logic_vector(3 downto 0);
158
--signal fifo_61_wr_addr        : std_logic_vector(3 downto 0);
159
--signal fifo_70_wr_addr        : std_logic_vector(3 downto 0);
160
--signal fifo_71_wr_addr        : std_logic_vector(3 downto 0);
161
 
162
 
163
 
164
 
165
signal read_valid_data_0_1    : std_logic;
166
signal read_valid_data_r      : std_logic;
167
signal read_valid_data_r1      : std_logic;
168
 
169
 
170
 
171
signal dqs0_delayed_col0        : std_logic;
172
signal dqs1_delayed_col0        : std_logic;
173
 
174
 
175
--signal dqs0_delayed_col1      : std_logic;
176
--signal dqs1_delayed_col1      : std_logic;
177
 
178
 
179
 
180
-- dqsx_delayed_col0 negated signals
181
-- used for capturing negedge data into FIFO_*1
182
 
183
 
184
 
185
 
186
 
187
 
188
-- FIFO WRITE ENABLE SIGNALS
189
 
190
signal fifo_00_wr_en                    :  std_logic;
191
signal fifo_10_wr_en                    :  std_logic;
192
 
193
 
194
signal fifo_01_wr_en                    :  std_logic;
195
signal fifo_11_wr_en                    :  std_logic;
196
 
197
 
198
 
199
-- FIFO_WR_POINTER Delayed signals in clk90 domain
200
 
201
signal fifo_00_wr_addr_d        : std_logic_vector(3 downto 0);
202
signal fifo_00_wr_addr_2d       : std_logic_vector(3 downto 0);
203
signal fifo_00_wr_addr_3d       : std_logic_vector(3 downto 0);
204
 
205
signal fifo_01_wr_addr_d        : std_logic_vector(3 downto 0);
206
signal fifo_01_wr_addr_2d       : std_logic_vector(3 downto 0);
207
signal fifo_01_wr_addr_3d       : std_logic_vector(3 downto 0);
208
 
209
 
210
-- DDR_DQ_IN signals from DDR_DQ Input buffer
211
 
212
--signal ddr_dq_in            : std_logic_vector(63 downto 0);
213
 
214
--signal write_data270_1        : std_logic_vector(63 downto 0);
215
--signal write_data270_2        : std_logic_vector(63 downto 0);
216
signal rst_dqs_div            : std_logic;
217
--signal rst_dqs_div2           : std_logic; 
218
 
219
signal rst_dqs_delay_0_n      : std_logic;
220
signal rst_dqs_delay_1_n      : std_logic;
221
--signal rst_dqs_delay_2_n      : std_logic;
222
--signal rst_dqs_delay_3_n      : std_logic;
223
--signal rst_dqs_delay_4_n      : std_logic;
224
--signal rst_dqs_delay_5_n      : std_logic;
225
--signal rst_dqs_delay_6_n      : std_logic;
226
--signal rst_dqs_delay_7_n      : std_logic;
227
 
228
 
229
 
230
 
231
signal dqs0_delayed_col0_n      : std_logic;
232
signal dqs1_delayed_col0_n      : std_logic;
233
 
234
 
235
 
236
--signal dqs0_delayed_col1_n    : std_logic;
237
--signal dqs1_delayed_col1_n      : std_logic;
238
 
239
 
240
 
241
signal tclk180_rst_dqs_div_in         : std_logic;
242
signal tclk180_rst_dqs_div_in_delay1  : std_logic;
243
signal tclk180_rst_dqs_div_in_delay2  : std_logic;
244
signal tclk180_rst_dqs_div_end_pulse  : std_logic; -- used for clear WEs
245
 
246
signal fifo_xx_we_reset  : std_logic; --  
247
 
248
 
249
 
250
signal rst_dqs_div_in_delay1      : std_logic;
251
signal rst_dqs_div_in_delay2      : std_logic;
252
signal rst_dqs_div_in_delay3      : std_logic;
253
 
254
 
255
attribute syn_keep : boolean;  -- Using Syn_Keep Derictive
256
attribute syn_keep of rst_dqs_div      : signal is true;
257
--attribute syn_keep of rst_dqs_div_in_delay1      : signal is true;
258
--attribute syn_keep of rst_dqs_div_in_delay2      : signal is true;
259
--attribute syn_keep of rst_dqs_div_in_delay3      : signal is true;
260
 
261
 
262
 
263
 begin
264
 
265
 fifo_00_wr_addr_val <= fifo_00_wr_addr;
266
 fifo_01_wr_addr_val <= fifo_01_wr_addr;
267
 fifo_10_wr_addr_val <= fifo_10_wr_addr;
268
 fifo_11_wr_addr_val <= fifo_11_wr_addr;
269
 
270
 
271
 fifo_00_wr_en_val   <= fifo_00_wr_en;
272
 fifo_10_wr_en_val   <= fifo_10_wr_en;
273
 
274
 
275
 fifo_01_wr_en_val   <= fifo_01_wr_en;
276
 fifo_11_wr_en_val   <= fifo_11_wr_en;
277
 
278
 
279
-- dqs0_delayed_col1_val <= dqs0_delayed_col1;
280
-- dqs1_delayed_col1_val <= dqs1_delayed_col1;
281
 
282
 
283
 
284
 
285
 dqs0_delayed_col0_val <= dqs0_delayed_col0;
286
 dqs1_delayed_col0_val <= dqs1_delayed_col0;
287
 
288
 
289
-- dqsx_delayed_col0 negated signals
290
 
291
dqs0_delayed_col0_n <= not dqs0_delayed_col0;
292
dqs1_delayed_col0_n <= not dqs1_delayed_col0;
293
 
294
-- dqsx_delayed_col1 negated signals
295
 
296
--dqs0_delayed_col1_n <= not dqs0_delayed_col1;
297
--dqs1_delayed_col1_n <= not dqs1_delayed_col1;
298
 
299
 
300
 
301
 
302
-- data_valid signal is derived from fifo_00 and fifo_01 empty signals only
303
-- FIFO WRITE POINTER DELAYED SIGNALS
304
-- To avoid meta-stability due to the domain crossing from ddr_dqs to clk90 
305
 
306
process (clk90)
307
begin
308
  if (rising_edge(clk90)) then
309
    if (reset90_r = '1') then
310
                fifo_00_wr_addr_d <= "0000";
311
                fifo_01_wr_addr_d <= "0000";
312
 
313
    else
314
        fifo_00_wr_addr_d <= fifo_00_wr_addr;
315
                fifo_01_wr_addr_d <= fifo_01_wr_addr;
316
 
317
    end if;
318
  end if;
319
end process;
320
 
321
 
322
-- FIFO WRITE POINTER DOUBLE DELAYED SIGNALS
323
 
324
process (clk90)
325
begin
326
  if (rising_edge(clk90)) then
327
    if (reset90_r = '1') then
328
                fifo_00_wr_addr_2d <= "0000";
329
                fifo_01_wr_addr_2d <= "0000";
330
    else
331
                fifo_00_wr_addr_2d <= fifo_00_wr_addr_d;
332
                fifo_01_wr_addr_2d <= fifo_01_wr_addr_d;
333
    end if;
334
  end if;
335
end process;
336
 
337
 
338
process (clk90)
339
begin
340
  if (rising_edge(clk90)) then
341
    if (reset90_r = '1') then
342
                fifo_00_wr_addr_3d <= "0000";
343
                fifo_01_wr_addr_3d <= "0000";
344
    else
345
                fifo_00_wr_addr_3d <= fifo_00_wr_addr_2d;
346
                fifo_01_wr_addr_3d <= fifo_01_wr_addr_2d;
347
    end if;
348
  end if;
349
end process;
350
-- user data valid output signal from data path.
351
 
352
fifo_00_empty       <= '1' when (fifo0_rd_addr(3 downto 0) = fifo_00_wr_addr_3d(3 downto 0)) else  '0';
353
fifo_01_empty       <= '1' when (fifo1_rd_addr(3 downto 0) = fifo_01_wr_addr_3d(3 downto 0)) else  '0';
354
 
355
 
356
 
357
 
358
read_valid_data_0_1 <= ( (not fifo_00_empty) and (not fifo_01_empty) );
359
read_valid_data_1_val   <= (read_valid_data_0_1);
360
 
361
 
362
 
363
process(clk90)
364
begin
365
if clk90'event and clk90 = '1' then
366
        if reset90_r = '1' then
367
                u_data_val      <= '0';
368
                read_valid_data_r <= '0';
369
                read_valid_data_r1 <= '0';
370
 
371
 
372
        else
373
                read_valid_data_r <= read_valid_data_0_1;
374
                read_valid_data_r1 <= read_valid_data_r;
375
                u_data_val  <= read_valid_data_r1;
376
        end if;
377
end if;
378
end process;
379
 
380
 
381
 
382
 
383
dqs0_delayed_col0 <= dqs_delayed_col0(0);
384
dqs1_delayed_col0 <= dqs_delayed_col0(1);
385
 
386
--dqs0_delayed_col1 <= dqs_delayed_col1(0);
387
--dqs1_delayed_col1 <= dqs_delayed_col1(1);
388
 
389
 
390
-- dqsx_delayed_col0 negated signals
391
 
392
 
393
 
394
 
395
 
396
rst_dqs_div_lut_delay1 :  LUT4  generic map (INIT => x"e2e2")
397
port map   ( I0 => '1',
398
             I1 => not rst_dqs_div_in,
399
             I2 => '0',
400
             I3 => '1',
401
--             O  => rst_dqs_div
402
             O  => rst_dqs_div_in_delay1
403
            );
404
 
405
rst_dqs_div_lut_delay2 :  LUT4  generic map (INIT => x"e2e2")
406
port map   ( I0 => '1',
407
             I1 => not rst_dqs_div_in_delay1,
408
             I2 => '0',
409
             I3 => '1',
410
             O  => rst_dqs_div_in_delay2
411
            );
412
 
413
rst_dqs_div_lut_delay3 :  LUT4  generic map (INIT => x"e2e2")
414
port map   ( I0 => '1',
415
             I1 => not rst_dqs_div_in_delay2,
416
             I2 => '0',
417
             I3 => '1',
418
             O  => rst_dqs_div_in_delay3
419
            );
420
 
421
rst_dqs_div_lut_delay4 :  LUT4  generic map (INIT => x"e2e2")
422
port map   ( I0 => '1',
423
             I1 => not rst_dqs_div_in_delay3,
424
             I2 => '0',
425
             I3 => '1',
426
             O  => rst_dqs_div
427
            );
428
 
429
--rst_dqs_div_delayed1 : dqs_delay port map (                                                                          
430
--                                    clk_in   => rst_dqs_div_in,
431
--                                    sel_in   => delay_sel,                                
432
--                                    clk_out  => rst_dqs_div                              
433
--                                   );
434
 
435
 
436
 
437
 
438
 
439
--------------------------------------------------------------------------------------------------------------------------------------------------
440
--**************************************************************************************************
441
-- DQS Internal Delay Circuit implemented in LUTs
442
--**************************************************************************************************
443
 
444
-- Internal Clock Delay circuit placed in the first column (for falling edge data) adjacent to IOBs                               
445
--dqs_delay0_col0 : dqs_delay port map (                                                                          
446
--                                    clk_in   => dqs_int_delay_in0,
447
--                                    sel_in   => delay_sel,                                
448
--                                    clk_out  => dqs_delayed_col0(0)                               
449
--                                   );
450
 
451
dqs_delayed_col0(0) <=  dqs_int_delay_in0 ;
452
 
453
-- Internal Clock Delay circuit placed in the first column (for falling edge data) adjacent to IOBs                               
454
--dqs_delay1_col0 : dqs_delay port map (                                                                          
455
--                                    clk_in   => dqs_int_delay_in1,
456
--                                    sel_in   => delay_sel,                                
457
--                                    clk_out  => dqs_delayed_col0(1)                               
458
--                                   );
459
 
460
dqs_delayed_col0(1) <=  dqs_int_delay_in1 ;
461
 
462
 
463
 
464
 
465
 
466
-------------------------------------------------------------------------------------------------
467
------------------------------------------------------------------------------------------------
468
-- help logic, die am Ende des Read Cycles auf jeden Fall die WE enable signale zurueck setzen soll
469
-- ich habe geshen, das WE0 und WE1 gestzt bleiben , da das "rst_dqs_div" wohl mit der letzten 
470
-- negativen Flanke von  dqs_int_delay_in1wohl noch gültig ist.
471
 
472
 
473
 
474
 
475
clr_we_signal_logic: process(clk180)
476
  begin
477
   if rising_edge (clk180) then
478
      tclk180_rst_dqs_div_in           <= rst_dqs_div ;
479
      tclk180_rst_dqs_div_in_delay1    <= tclk180_rst_dqs_div_in ;
480
      tclk180_rst_dqs_div_in_delay2    <= tclk180_rst_dqs_div_in_delay1 ;
481
 
482
      tclk180_rst_dqs_div_end_pulse    <= tclk180_rst_dqs_div_in_delay2 and not tclk180_rst_dqs_div_in_delay1;
483
   end if;
484
 
485
 
486
end process;
487
 
488
fifo_xx_we_reset   <=   reset_r or      tclk180_rst_dqs_div_end_pulse ;
489
 
490
-------------------------------------------------------------------------------------------------
491
------------------------------------------------------------------------------------------------
492
 
493
fifo_00_wr_en_inst: fifo_0_wr_en port map (
494
                                                clk             => dqs0_delayed_col0_n,
495
--                                              reset           => reset_r,
496
                                                reset           => fifo_xx_we_reset,
497
                                                din             => rst_dqs_div,
498
                                                rst_dqs_delay_n => rst_dqs_delay_0_n,
499
                                                dout            => fifo_00_wr_en
500
                                           );
501
 
502
 
503
fifo_01_wr_en_inst: fifo_1_wr_en port map (
504
                                                clk             => dqs0_delayed_col0,
505
                                                rst_dqs_delay_n => rst_dqs_delay_0_n,
506
                                                reset           => fifo_xx_we_reset,
507
                                                din             => rst_dqs_div,
508
                                                dout            => fifo_01_wr_en
509
                                          );
510
 
511
 
512
fifo_10_wr_en_inst: fifo_0_wr_en port map (
513
                                                clk             => dqs1_delayed_col0_n,
514
                                                reset           => fifo_xx_we_reset,
515
                                                din             => rst_dqs_div,
516
                                                rst_dqs_delay_n => rst_dqs_delay_1_n,
517
                                                dout            => fifo_10_wr_en
518
                                           );
519
 
520
 
521
fifo_11_wr_en_inst: fifo_1_wr_en port map (
522
                                                clk             => dqs1_delayed_col0,
523
                                                rst_dqs_delay_n => rst_dqs_delay_1_n,
524
                                                reset           => fifo_xx_we_reset,
525
                                                din             => rst_dqs_div,
526
                                                dout            => fifo_11_wr_en
527
                                          );
528
 
529
 
530
 
531
 
532
 
533
-------------------------------------------------------------------------------------------------
534
-- write pointer gray counter instances 
535
 
536
fifo_00_wr_addr_inst : wr_gray_cntr port map (
537
                                                        clk             =>      dqs0_delayed_col0,
538
                                                        reset           =>      reset_r,
539
                                                        cnt_en          =>      fifo_00_wr_en,
540
                                                        wgc_gcnt        =>      fifo_00_wr_addr
541
                                                );
542
 
543
fifo_01_wr_addr_inst : wr_gray_cntr port map (
544
                                                        clk             =>      dqs0_delayed_col0_n,
545
                                                        reset           =>      reset_r,
546
                                                        cnt_en          =>      fifo_01_wr_en,
547
 
548
                                                        wgc_gcnt        =>      fifo_01_wr_addr
549
                                                );
550
 
551
 
552
fifo_10_wr_addr_inst : wr_gray_cntr port map (
553
                                                        clk             =>      dqs1_delayed_col0,
554
                                                        reset           =>      reset_r,
555
                                                        cnt_en          =>      fifo_10_wr_en,
556
 
557
                                                        wgc_gcnt        =>      fifo_10_wr_addr
558
                                                );
559
 
560
 
561
fifo_11_wr_addr_inst : wr_gray_cntr port map (
562
                                                        clk             =>      dqs1_delayed_col0_n,
563
                                                        reset           =>      reset_r,
564
                                                        cnt_en          =>      fifo_11_wr_en,
565
 
566
                                                        wgc_gcnt        =>      fifo_11_wr_addr
567
                                                );
568
 
569
 
570
 
571
 
572
 
573
 
574
end arc_data_read_controller;

powered by: WebSVN 2.1.0

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