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

Subversion Repositories pcie_sg_dma

[/] [pcie_sg_dma/] [branches/] [Virtex6/] [ML605_ISE13.3/] [MySource/] [tx_Mem_Reader.vhd] - Blame information for rev 13

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 13 barabba
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Design Name: 
6
-- Module Name:    tx_Mem_Reader - Behavioral 
7
-- Project Name: 
8
-- Target Devices: 
9
-- Tool versions: 
10
-- Description: 
11
--
12
-- Dependencies: 
13
--
14
--
15
-- Revision 1.00 - first release. 20.03.2008
16
-- 
17
-- Additional Comments: 
18
--
19
----------------------------------------------------------------------------------
20
 
21
library IEEE;
22
use IEEE.STD_LOGIC_1164.ALL;
23
use IEEE.STD_LOGIC_ARITH.ALL;
24
use IEEE.STD_LOGIC_UNSIGNED.ALL;
25
 
26
library work;
27
use work.abb64Package.all;
28
 
29
-- Uncomment the following library declaration if instantiating
30
-- any Xilinx primitives in this code.
31
--library UNISIM;
32
--use UNISIM.VComponents.all;
33
 
34
entity tx_Mem_Reader is
35
    port (
36
 
37
      -- DDR Read Interface
38
      DDR_rdc_sof        : OUT   std_logic;
39
      DDR_rdc_eof        : OUT   std_logic;
40
      DDR_rdc_v          : OUT   std_logic;
41
      DDR_rdc_FA         : OUT   std_logic;
42
      DDR_rdc_Shift      : OUT   std_logic;
43
      DDR_rdc_din        : OUT   std_logic_vector(C_DBUS_WIDTH-1 downto 0);
44
      DDR_rdc_full       : IN    std_logic;
45
 
46
      -- DDR payload FIFO Read Port
47
      DDR_FIFO_RdEn      : OUT   std_logic;
48
      DDR_FIFO_Empty     : IN    std_logic;
49
      DDR_FIFO_RdQout    : IN    std_logic_vector(C_DBUS_WIDTH-1 downto 0);
50
 
51
 
52
      -- Event Buffer read port
53
      eb_FIFO_re         : OUT   std_logic;
54
      eb_FIFO_empty      : IN    std_logic;
55
      eb_FIFO_qout       : IN    std_logic_vector(C_DBUS_WIDTH-1 downto 0);
56
 
57
      -- Register Read interface
58
      Regs_RdAddr        : OUT   std_logic_vector(C_EP_AWIDTH-1 downto 0);
59
      Regs_RdQout        : IN    std_logic_vector(C_DBUS_WIDTH-1 downto 0);
60
 
61
      -- Read Command interface
62
      RdNumber           : IN    std_logic_vector(C_TLP_FLD_WIDTH_OF_LENG-1 downto 0);
63
      RdNumber_eq_One    : IN    std_logic;
64
      RdNumber_eq_Two    : IN    std_logic;
65
      StartAddr          : IN    std_logic_vector(C_DBUS_WIDTH-1 downto 0);
66
      Shift_1st_QWord    : IN    std_logic;
67
      FixedAddr          : IN    std_logic;
68
      is_CplD            : IN    std_logic;
69
      BAR_value          : IN    std_logic_vector(C_ENCODE_BAR_NUMBER-1 downto 0);
70
      RdCmd_Req          : IN    std_logic;
71
      RdCmd_Ack          : OUT   std_logic;
72
 
73
      -- Output port of the memory buffer
74
      mbuf_Din           : OUT   std_logic_vector(C_DBUS_WIDTH*9/8-1 downto 0);
75
      mbuf_WE            : OUT   std_logic;
76
      mbuf_Full          : IN    std_logic;
77
      mbuf_aFull         : IN    std_logic;
78
      mbuf_UserFull      : IN    std_logic;   -- Test pin, intended for DDR flow interrupted
79
 
80
      -- Common ports
81
      Tx_TimeOut         : OUT   std_logic;
82
      Tx_eb_TimeOut      : OUT   std_logic;
83
      mReader_Rst_n      : IN    std_logic;
84
      trn_clk            : IN    std_logic
85
    );
86
 
87
end tx_Mem_Reader;
88
 
89
 
90
architecture Behavioral of tx_Mem_Reader is
91
 
92
 
93
  type mReaderStates is           ( St_mR_Idle          -- Memory reader Idle
94
 
95
                                  , St_mR_CmdLatch      -- Capture the read command
96
                                  , St_mR_Transfer      -- Acknowlege the command request
97
 
98
                                  , St_mR_DDR_A         -- DDR access state A
99
--                                  , St_mR_DDR_B         -- DDR access state B
100
                                  , St_mR_DDR_C         -- DDR access state C
101
 
102
                                  , St_mR_Last          -- Last word is reached
103
                                  );
104
 
105
  -- State variables
106
  signal   TxMReader_State        : mReaderStates;
107
 
108
 
109
  -- DDR Read Interface
110
  signal   DDR_rdc_sof_i          : std_logic;
111
  signal   DDR_rdc_eof_i          : std_logic;
112
  signal   DDR_rdc_v_i            : std_logic;
113
  signal   DDR_rdc_Shift_i        : std_logic;
114
  signal   DDR_rdc_din_i          : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
115
  signal   DDR_rdc_full_i         : std_logic;
116
 
117
 
118
  -- Register read address
119
  signal   Regs_RdAddr_i          : std_logic_vector(C_EP_AWIDTH-1   downto 0);
120
  signal   Regs_RdEn              : std_logic;
121
  signal   Regs_Hit               : std_logic;
122
  signal   Regs_Write_mbuf_r1     : std_logic;
123
  signal   Regs_Write_mbuf_r2     : std_logic;
124
  signal   Regs_Write_mbuf_r3     : std_logic;
125
 
126
  -- DDR FIFO read enable
127
  signal   DDR_FIFO_RdEn_i        : std_logic;
128
  signal   DDR_FIFO_RdEn_Mask     : std_logic;
129
  signal   DDR_FIFO_Hit           : std_logic;
130
  signal   DDR_FIFO_Write_mbuf_r1 : std_logic;
131
  signal   DDR_FIFO_Write_mbuf_r2 : std_logic;
132
  signal   DDR_FIFO_Write_mbuf_r3 : std_logic;
133
 
134
  -- Event Buffer
135
  signal   eb_FIFO_Hit            : std_logic;
136
  signal   eb_FIFO_Write_mbuf     : std_logic;
137
  signal   eb_FIFO_Write_mbuf_r1  : std_logic;
138
  signal   eb_FIFO_Write_mbuf_r2  : std_logic;
139
  signal   eb_FIFO_re_i           : std_logic;
140
  signal   eb_FIFO_RdEn_Mask_rise : std_logic;
141
  signal   eb_FIFO_RdEn_Mask_rise_r1 : std_logic;
142
  signal   eb_FIFO_RdEn_Mask_rise_r2 : std_logic;
143
  signal   eb_FIFO_RdEn_Mask_rise_r3 : std_logic;
144
  signal   eb_FIFO_RdEn_Mask      : std_logic;
145
  signal   eb_FIFO_RdEn_Mask_r1   : std_logic;
146
  signal   eb_FIFO_RdEn_Mask_r2   : std_logic;
147
  signal   ebFIFO_Rd_1DW          : std_logic;
148
  signal   eb_FIFO_qout_r1        : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
149
  signal   eb_FIFO_qout_shift     : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
150
  signal   eb_FIFO_qout_swapped   : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
151
 
152
  -- Memory data outputs
153
  signal   eb_FIFO_Dout_wire      : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
154
  signal   DDR_Dout_wire          : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
155
  signal   Regs_RdQout_wire       : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
156
  signal   mbuf_Din_wire_OR       : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
157
 
158
  -- Output port of the memory buffer
159
  signal   mbuf_Din_i             : std_logic_vector(C_DBUS_WIDTH*9/8-1 downto 0);
160
  signal   mbuf_WE_i              : std_logic;
161
  signal   mbuf_Full_i            : std_logic;
162
  signal   mbuf_aFull_i           : std_logic;
163
  signal   mbuf_UserFull_i        : std_logic;
164
  signal   mbuf_aFull_r1          : std_logic;
165
 
166
 
167
  -- Read command request and acknowledge
168
  signal   RdCmd_Req_i            : std_logic;
169
  signal   RdCmd_Ack_i            : std_logic;
170
 
171
  signal   Shift_1st_QWord_k      : std_logic;
172
  signal   is_CplD_k              : std_logic;
173
  signal   may_be_MWr_k           : std_logic;
174
  signal   TRem_n_last_QWord      : std_logic;
175
 
176
  signal   regs_Rd_Counter        : std_logic_vector(C_TLP_FLD_WIDTH_OF_LENG-1   downto 0);
177
  signal   regs_Rd_Cntr_eq_One    : std_logic;
178
  signal   regs_Rd_Cntr_eq_Two    : std_logic;
179
  signal   DDR_Rd_Counter         : std_logic_vector(C_TLP_FLD_WIDTH_OF_LENG-1   downto 0);
180
  signal   DDR_Rd_Cntr_eq_One     : std_logic;
181
 
182
  signal   ebFIFO_Rd_Counter      : std_logic_vector(C_TLP_FLD_WIDTH_OF_LENG-1   downto 0);
183
  signal   ebFIFO_Rd_Cntr_eq_Two  : std_logic;
184
 
185
  signal   Address_var            : std_logic_vector(C_DBUS_WIDTH-1   downto 0);
186
  signal   Address_step           : std_logic_vector(4-1   downto 0);
187
  signal   TxTLP_eof_n            : std_logic;
188
 
189
  signal   TxTLP_eof_n_r1         : std_logic;
190
--  signal   TxTLP_eof_n_r2         : std_logic;
191
 
192
  signal   TimeOut_Counter        : std_logic_vector(C_DBUS_WIDTH-1   downto 0);
193
  signal   TO_Cnt_Rst             : std_logic;
194
  signal   Tx_TimeOut_i           : std_logic;
195
  signal   Tx_eb_TimeOut_i        : std_logic;
196
 
197
 
198
begin
199
 
200
   -- read command REQ + ACK
201
   RdCmd_Req_i           <= RdCmd_Req;
202
   RdCmd_Ack             <= RdCmd_Ack_i;
203
 
204
   -- Time out signal out
205
   Tx_TimeOut            <= Tx_TimeOut_i;
206
   Tx_eb_TimeOut         <= Tx_eb_TimeOut_i;
207
 
208
------------------------------------------------------------
209
---             Memory read control
210
------------------------------------------------------------
211
 
212
   -- Event Buffer read
213
   eb_FIFO_re            <= eb_FIFO_re_i   ;
214
 
215
   -- DDR FIFO Read
216
   DDR_rdc_sof           <= DDR_rdc_sof_i  ;
217
   DDR_rdc_eof           <= DDR_rdc_eof_i  ;
218
   DDR_rdc_v             <= DDR_rdc_v_i    ;
219
   DDR_rdc_FA            <= '0'            ;  -- DDR_rdc_FA_i   ;
220
   DDR_rdc_Shift         <= DDR_rdc_Shift_i;
221
   DDR_rdc_din           <= DDR_rdc_din_i  ;
222
   DDR_rdc_full_i        <= DDR_rdc_full   ;
223
 
224
   DDR_FIFO_RdEn         <= DDR_FIFO_RdEn_i;
225
 
226
 
227
   -- Register address for read
228
   Regs_RdAddr           <= Regs_RdAddr_i;
229
 
230
   -- Memory buffer write port
231
   mbuf_Din              <= mbuf_Din_i;
232
   mbuf_WE               <= mbuf_WE_i;
233
   mbuf_Full_i           <= mbuf_Full;
234
   mbuf_aFull_i          <= mbuf_aFull;
235
   mbuf_UserFull_i       <= mbuf_UserFull;
236
 
237
 
238
   -- 
239
   Regs_RdAddr_i         <=  Address_var(C_EP_AWIDTH-1   downto 0);
240
 
241
-----------------------------------------------------
242
-- Synchronous Delay: mbuf_aFull
243
-- 
244
   Synchron_Delay_mbuf_aFull:
245
   process ( trn_clk )
246
   begin
247
     if trn_clk'event and trn_clk = '1' then
248
         mbuf_aFull_r1      <= mbuf_aFull_i or mbuf_Full_i
249
                            or mbuf_UserFull_i;
250
      end if;
251
   end process;
252
 
253
 
254
-- ---------------------------------------------------
255
-- State Machine: Tx Memory read control
256
--
257
   mR_FSM_Control:
258
   process ( trn_clk, mReader_Rst_n)
259
   begin
260
      if mReader_Rst_n = '0' then
261
         DDR_rdc_sof_i        <= '0';
262
         DDR_rdc_eof_i        <= '0';
263
         DDR_rdc_v_i          <= '0';
264
         DDR_rdc_Shift_i      <= '0';
265
         DDR_rdc_din_i        <= (OTHERS=>'0');
266
 
267
         eb_FIFO_Hit          <= '0';
268
         eb_FIFO_re_i         <= '0';
269
         eb_FIFO_RdEn_Mask    <= '0';
270
 
271
         DDR_FIFO_Hit         <= '0';
272
         DDR_FIFO_RdEn_i      <= '0';
273
         DDR_FIFO_RdEn_Mask   <= '0';
274
         Regs_Hit             <= '0';
275
         Regs_RdEn            <= '0';
276
         regs_Rd_Counter      <= (Others=>'0');
277
         DDR_Rd_Counter       <= (Others=>'0');
278
         DDR_Rd_Cntr_eq_One   <= '0';
279
 
280
         ebFIFO_Rd_Counter    <= (Others=>'0');
281
         ebFIFO_Rd_Cntr_eq_Two<= '0';
282
 
283
         regs_Rd_Cntr_eq_One  <= '0';
284
         regs_Rd_Cntr_eq_Two  <= '0';
285
 
286
         Shift_1st_QWord_k    <= '0';
287
         is_CplD_k            <= '0';
288
         may_be_MWr_k         <= '0';
289
         TRem_n_last_QWord    <= '0';
290
 
291
         Address_var          <= (Others=>'1');
292
         TxTLP_eof_n          <= '1';
293
 
294
         TO_Cnt_Rst           <= '0';
295
 
296
         RdCmd_Ack_i          <= '0';
297
         TxMReader_State      <= St_mR_Idle;
298
 
299
      elsif trn_clk'event and trn_clk = '1' then
300
 
301
         case TxMReader_State is
302
 
303
            when St_mR_Idle    =>
304
              if RdCmd_Req_i='0' then
305
                TxMReader_State      <= St_mR_Idle;
306
                eb_FIFO_Hit          <= '0';
307
                Regs_Hit             <= '0';
308
                Regs_RdEn            <= '0';
309
                TxTLP_eof_n          <= '1';
310
                Address_var          <= (Others=>'1');
311
                RdCmd_Ack_i          <= '0';
312
                is_CplD_k            <= '0';
313
                may_be_MWr_k         <= '0';
314
              else
315
                RdCmd_Ack_i          <= '1';
316
                Shift_1st_QWord_k    <= Shift_1st_QWord;
317
                TRem_n_last_QWord    <= Shift_1st_QWord xor RdNumber(0);
318
                is_CplD_k            <= is_CplD;
319
                may_be_MWr_k         <= not is_CplD;
320
                TxTLP_eof_n          <= '1';
321
                if BAR_value(C_ENCODE_BAR_NUMBER-2 downto 0)
322
                   = CONV_STD_LOGIC_VECTOR(CINT_DDR_SPACE_BAR, C_ENCODE_BAR_NUMBER-1)
323
                   then
324
                   eb_FIFO_Hit      <= '0';
325
                   DDR_FIFO_Hit     <= '1';
326
                   Regs_Hit         <= '0';
327
                   Regs_RdEn        <= '0';
328
                   Address_var      <= Address_var;
329
                   TxMReader_State  <= St_mR_DDR_A;
330
                elsif BAR_value(C_ENCODE_BAR_NUMBER-2 downto 0)
331
                      = CONV_STD_LOGIC_VECTOR(CINT_REGS_SPACE_BAR, C_ENCODE_BAR_NUMBER-1)
332
                   then
333
                   eb_FIFO_Hit      <= '0';
334
                   DDR_FIFO_Hit     <= '0';
335
                   Regs_Hit         <= '1';
336
                   Regs_RdEn        <= '1';
337
                   if Shift_1st_QWord='1' then
338
                     Address_var(C_EP_AWIDTH-1 downto 0)  <= StartAddr(C_EP_AWIDTH-1 downto 0) - "100";
339
                   else
340
                     Address_var(C_EP_AWIDTH-1 downto 0)  <= StartAddr(C_EP_AWIDTH-1 downto 0);
341
                   end if;
342
                   TxMReader_State  <= St_mR_CmdLatch;
343
                elsif BAR_value(C_ENCODE_BAR_NUMBER-2 downto 0)
344
                      = CONV_STD_LOGIC_VECTOR(CINT_FIFO_SPACE_BAR, C_ENCODE_BAR_NUMBER-1)
345
                   then
346
                   eb_FIFO_Hit      <= '1';
347
                   DDR_FIFO_Hit     <= '0';
348
                   Regs_Hit         <= '0';
349
                   Regs_RdEn        <= '0';
350
                   Address_var      <= Address_var;
351
                   TxMReader_State  <= St_mR_DDR_C;
352
                else
353
                   eb_FIFO_Hit      <= '0';
354
                   DDR_FIFO_Hit     <= '0';
355
                   Regs_Hit         <= '0';
356
                   Regs_RdEn        <= '0';
357
                   Address_var      <= Address_var;
358
                   TxMReader_State  <= St_mR_CmdLatch;
359
                end if;
360
 
361
              end if;
362
 
363
 
364
            when St_mR_DDR_A    =>
365
               DDR_rdc_sof_i        <= '1';
366
               DDR_rdc_eof_i        <= '0';
367
               DDR_rdc_v_i          <= '1';
368
               DDR_rdc_Shift_i      <= Shift_1st_QWord_k;
369
               DDR_rdc_din_i        <= C_ALL_ZEROS(C_DBUS_WIDTH-1 downto C_TLP_FLD_WIDTH_OF_LENG+2+32)
370
                                     & RdNumber & "00"
371
                                     & StartAddr(C_DBUS_WIDTH-1-32 downto 0);
372
               Regs_RdEn            <= '0';
373
               DDR_FIFO_RdEn_i      <= '0';
374
               TxTLP_eof_n          <= '1';
375
               RdCmd_Ack_i          <= '1';
376
               TxMReader_State      <= St_mR_DDR_C;  -- St_mR_DDR_B;
377
 
378
 
379
            when St_mR_DDR_C    =>
380
               DDR_rdc_sof_i        <= '0';
381
               DDR_rdc_eof_i        <= '0';
382
               DDR_rdc_v_i          <= '0';
383
               DDR_rdc_din_i        <= DDR_rdc_din_i;
384
               RdCmd_Ack_i          <= '0';
385
               TxTLP_eof_n          <= '1';
386
--               if DDR_FIFO_Hit='1' and DDR_FIFO_Empty='1' then
387
               if DDR_FIFO_Hit='1' and DDR_FIFO_Empty='1' and Tx_TimeOut_i='0' then
388
                  TxMReader_State      <= St_mR_DDR_C;
389
--               elsif eb_FIFO_Hit='1' and eb_FIFO_empty='1' then
390
               elsif eb_FIFO_Hit='1' and eb_FIFO_empty='1' and Tx_eb_TimeOut_i='0' then
391
                  TxMReader_State      <= St_mR_DDR_C;
392
               else
393
                  TxMReader_State      <= St_mR_CmdLatch;
394
               end if;
395
 
396
 
397
            when St_mR_CmdLatch    =>
398
                  RdCmd_Ack_i          <= '0';
399
                  if regs_Rd_Cntr_eq_One = '1' then
400
                     Regs_RdEn            <= '0';
401
                     Address_var          <= Address_var;
402
                     TxTLP_eof_n          <= '0';
403
                     TxMReader_State      <= St_mR_Last;
404
                  elsif regs_Rd_Cntr_eq_Two = '1' then
405
                     if Shift_1st_QWord_k='1' then
406
                       TxMReader_State      <= St_mR_Transfer;
407
                       Regs_RdEn            <= Regs_RdEn;  -- '1';
408
                       TxTLP_eof_n          <= '1';
409
                       Address_var(C_EP_AWIDTH-1 downto 0)  <= Address_var(C_EP_AWIDTH-1 downto 0) + "1000";
410
                     else
411
                       TxMReader_State      <= St_mR_Last;
412
                       Regs_RdEn            <= '0';
413
                       TxTLP_eof_n          <= '0';
414
                       Address_var(C_EP_AWIDTH-1 downto 0)  <= Address_var(C_EP_AWIDTH-1 downto 0) + "1000";
415
                     end if;
416
                  else
417
                     Regs_RdEn            <= Regs_RdEn;
418
                     Address_var(C_EP_AWIDTH-1 downto 0)  <= Address_var(C_EP_AWIDTH-1 downto 0) + "1000";
419
                     TxTLP_eof_n          <= '1';
420
                     TxMReader_State      <= St_mR_Transfer;
421
                  end if;
422
 
423
 
424
            when St_mR_Transfer    =>
425
                  RdCmd_Ack_i          <= '0';
426
                  if DDR_FIFO_Hit='1' and DDR_FIFO_RdEn_Mask='1' then
427
                     Address_var          <= Address_var;
428
                     Regs_RdEn            <= '0';
429
                     TxTLP_eof_n          <= '0';
430
                     TxMReader_State      <= St_mR_Last;
431
                  elsif eb_FIFO_Hit='1' and eb_FIFO_RdEn_Mask='1' then
432
                     Address_var          <= Address_var;
433
                     Regs_RdEn            <= '0';
434
                     TxTLP_eof_n          <= '0';
435
                     TxMReader_State      <= St_mR_Last;
436
                  elsif eb_FIFO_Hit='0' and regs_Rd_Cntr_eq_One = '1' then
437
                     Address_var          <= Address_var;
438
                     Regs_RdEn            <= '0';
439
                     TxTLP_eof_n          <= '0';
440
                     TxMReader_State      <= St_mR_Last;
441
                  elsif eb_FIFO_Hit='0' and regs_Rd_Cntr_eq_Two = '1' then
442
                     Address_var          <= Address_var;
443
                     Regs_RdEn            <= '0';
444
                     TxTLP_eof_n          <= '0';
445
                     TxMReader_State      <= St_mR_Last;
446
                  elsif mbuf_aFull_r1 = '1' then
447
                     Address_var          <= Address_var;
448
                     Regs_RdEn            <= '0';
449
                     TxTLP_eof_n          <= TxTLP_eof_n;
450
                     TxMReader_State      <= St_mR_Transfer;
451
                  else
452
                     Address_var(C_EP_AWIDTH-1 downto 0)    <= Address_var(C_EP_AWIDTH-1 downto 0) + "1000";
453
                     Regs_RdEn            <= Regs_Hit;
454
                     TxTLP_eof_n          <= TxTLP_eof_n;
455
                     TxMReader_State      <= St_mR_Transfer;
456
                  end if;
457
 
458
 
459
            when St_mR_Last    =>
460
               Regs_RdEn            <= '0';
461
               DDR_FIFO_RdEn_i      <= '0';
462
               TxTLP_eof_n          <= (not DDR_FIFO_Hit) and (not eb_FIFO_Hit);
463
               RdCmd_Ack_i          <= '0';
464
               TxMReader_State      <= St_mR_Idle;
465
 
466
 
467
            when Others    =>
468
               Address_var          <= Address_var;
469
               eb_FIFO_Hit          <= '0';
470
               Regs_RdEn            <= '0';
471
               DDR_FIFO_RdEn_i      <= '0';
472
               TxTLP_eof_n          <= '1';
473
               RdCmd_Ack_i          <= '0';
474
               TxMReader_State      <= St_mR_Idle;
475
 
476
         end case;
477
 
478
 
479
         case TxMReader_State is
480
            when St_mR_Idle    =>
481
              TO_Cnt_Rst   <= '1';
482
 
483
            when Others    =>
484
              TO_Cnt_Rst   <= '0';
485
 
486
         end case;
487
 
488
 
489
         case TxMReader_State is
490
 
491
            when St_mR_Idle    =>
492
              DDR_FIFO_RdEn_i  <= '0';
493
              DDR_FIFO_RdEn_Mask   <= '0';
494
 
495
            when Others    =>
496
              if DDR_Rd_Cntr_eq_One = '1'
497
                 and (DDR_FIFO_Empty='0' or Tx_TimeOut_i='1')
498
                 and DDR_FIFO_RdEn_i='1'
499
                 then
500
                 DDR_FIFO_RdEn_Mask   <= '1';
501
                 DDR_FIFO_RdEn_i      <= '0';
502
              else
503
                 DDR_FIFO_RdEn_Mask   <= DDR_FIFO_RdEn_Mask;
504
                 DDR_FIFO_RdEn_i      <=  DDR_FIFO_Hit
505
                                      and not mbuf_aFull_r1
506
                                      and not DDR_FIFO_RdEn_Mask;
507
              end if;
508
         end case;
509
 
510
 
511
         case TxMReader_State is
512
 
513
            when St_mR_Idle    =>
514
              eb_FIFO_re_i        <= '0';
515
              eb_FIFO_RdEn_Mask   <= '0';
516
 
517
            when Others    =>
518
              if ebFIFO_Rd_Cntr_eq_Two = '1'
519
                 and (eb_FIFO_empty='0' or Tx_eb_TimeOut_i='1')
520
                 and eb_FIFO_re_i='1'
521
                 then
522
                 eb_FIFO_RdEn_Mask   <= '1';
523
                 eb_FIFO_re_i        <= '0';
524
              else
525
                 eb_FIFO_RdEn_Mask   <= eb_FIFO_RdEn_Mask;
526
                 eb_FIFO_re_i        <= eb_FIFO_Hit
527
                                      and not mbuf_aFull_r1
528
                                      and not eb_FIFO_RdEn_Mask;
529
              end if;
530
         end case;
531
 
532
 
533
         case TxMReader_State is
534
 
535
            when St_mR_Idle    =>
536
              if RdCmd_Req_i='1' and
537
                 BAR_value(C_ENCODE_BAR_NUMBER-2 downto 0)
538
                 /= CONV_STD_LOGIC_VECTOR(CINT_DDR_SPACE_BAR, C_ENCODE_BAR_NUMBER-1)
539
                 then
540
                 regs_Rd_Counter       <= RdNumber;
541
                 regs_Rd_Cntr_eq_One   <= RdNumber_eq_One;
542
                 regs_Rd_Cntr_eq_Two   <= RdNumber_eq_Two;
543
              else
544
                 regs_Rd_Counter       <= (Others=>'0');
545
                 regs_Rd_Cntr_eq_One   <= '0';
546
                 regs_Rd_Cntr_eq_Two   <= '0';
547
              end if;
548
 
549
            when St_mR_CmdLatch    =>
550
              if DDR_FIFO_Hit='0' then
551
                 if Shift_1st_QWord_k='1' then
552
                   regs_Rd_Counter          <= regs_Rd_Counter - '1';
553
                   if regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(2, C_TLP_FLD_WIDTH_OF_LENG) then
554
                      regs_Rd_Cntr_eq_One   <= '1';
555
                   else
556
                      regs_Rd_Cntr_eq_One   <= '0';
557
                   end if;
558
                   if regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(3, C_TLP_FLD_WIDTH_OF_LENG) then
559
                      regs_Rd_Cntr_eq_Two   <= '1';
560
                   else
561
                      regs_Rd_Cntr_eq_Two   <= '0';
562
                   end if;
563
                 else
564
                   regs_Rd_Counter          <= regs_Rd_Counter - "10";  -- '1';
565
                   if regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(3, C_TLP_FLD_WIDTH_OF_LENG) then
566
                      regs_Rd_Cntr_eq_One   <= '1';
567
                   else
568
                      regs_Rd_Cntr_eq_One   <= '0';
569
                   end if;
570
                   if regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(4, C_TLP_FLD_WIDTH_OF_LENG) then
571
                      regs_Rd_Cntr_eq_Two   <= '1';
572
                   else
573
                      regs_Rd_Cntr_eq_Two   <= '0';
574
                   end if;
575
                 end if;
576
              else
577
                 regs_Rd_Counter       <= regs_Rd_Counter;
578
                 regs_Rd_Cntr_eq_One   <= regs_Rd_Cntr_eq_One;
579
                 regs_Rd_Cntr_eq_Two   <= regs_Rd_Cntr_eq_Two;
580
              end if;
581
 
582
            when St_mR_Transfer    =>
583
              if DDR_FIFO_Hit='0'
584
                 and mbuf_aFull_r1 = '0'
585
                 then
586
                 regs_Rd_Counter           <= regs_Rd_Counter - "10";  -- '1';
587
                 if regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(1, C_TLP_FLD_WIDTH_OF_LENG) then
588
                    regs_Rd_Cntr_eq_One   <= '1';
589
                 elsif regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(2, C_TLP_FLD_WIDTH_OF_LENG) then
590
                    regs_Rd_Cntr_eq_One   <= '1';
591
                 elsif regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(3, C_TLP_FLD_WIDTH_OF_LENG) then
592
                    regs_Rd_Cntr_eq_One   <= '1';
593
                 else
594
                    regs_Rd_Cntr_eq_One   <= '0';
595
                 end if;
596
                 if regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(4, C_TLP_FLD_WIDTH_OF_LENG) then
597
                    regs_Rd_Cntr_eq_Two   <= '1';
598
                 else
599
                    regs_Rd_Cntr_eq_Two   <= '0';
600
                 end if;
601
              else
602
                 regs_Rd_Counter       <= regs_Rd_Counter;
603
                 regs_Rd_Cntr_eq_One   <= regs_Rd_Cntr_eq_One;
604
                 regs_Rd_Cntr_eq_Two   <= regs_Rd_Cntr_eq_Two;
605
              end if;
606
 
607
            when Others    =>
608
              regs_Rd_Counter       <= regs_Rd_Counter;
609
              regs_Rd_Cntr_eq_One   <= regs_Rd_Cntr_eq_One;
610
              regs_Rd_Cntr_eq_Two   <= regs_Rd_Cntr_eq_Two;
611
 
612
         end case;
613
 
614
 
615
         case TxMReader_State is
616
            when St_mR_Idle    =>
617
              if RdCmd_Req_i='1' and
618
                 BAR_value(C_ENCODE_BAR_NUMBER-2 downto 0)
619
                 = CONV_STD_LOGIC_VECTOR(CINT_DDR_SPACE_BAR, C_ENCODE_BAR_NUMBER-1)
620
                 then
621
                 if RdNumber(0)='1' then
622
                   DDR_Rd_Counter       <= RdNumber + '1';
623
                   DDR_Rd_Cntr_eq_One   <= RdNumber_eq_One;
624
                 elsif Shift_1st_QWord='1' then
625
                   DDR_Rd_Counter       <= RdNumber + "10";
626
                   DDR_Rd_Cntr_eq_One   <= RdNumber_eq_One;
627
                 else
628
                   DDR_Rd_Counter       <= RdNumber;
629
                   DDR_Rd_Cntr_eq_One   <= RdNumber_eq_One or RdNumber_eq_Two;
630
                 end if;
631
              else
632
                 DDR_Rd_Counter       <= (Others=>'0');
633
                 DDR_Rd_Cntr_eq_One   <= '0';
634
              end if;
635
 
636
            when Others    =>
637
              if ((DDR_FIFO_Empty='0' or Tx_TimeOut_i='1') and DDR_FIFO_RdEn_i='1')
638
                 then
639
                 DDR_Rd_Counter       <= DDR_Rd_Counter - "10";  -- '1';
640
                 if DDR_Rd_Counter = CONV_STD_LOGIC_VECTOR(4, C_TLP_FLD_WIDTH_OF_LENG) then
641
                    DDR_Rd_Cntr_eq_One   <= '1';
642
                 else
643
                    DDR_Rd_Cntr_eq_One   <= '0';
644
                 end if;
645
              else
646
                 DDR_Rd_Counter       <= DDR_Rd_Counter;
647
                 DDR_Rd_Cntr_eq_One   <= DDR_Rd_Cntr_eq_One;
648
              end if;
649
 
650
         end case;
651
 
652
 
653
         case TxMReader_State is
654
            when St_mR_Idle    =>
655
              if RdCmd_Req_i='1' and
656
                 BAR_value(C_ENCODE_BAR_NUMBER-2 downto 0)
657
                 = CONV_STD_LOGIC_VECTOR(CINT_FIFO_SPACE_BAR, C_ENCODE_BAR_NUMBER-1)
658
                 then
659
                 if RdNumber_eq_One='1' then
660
                   ebFIFO_Rd_Counter       <= RdNumber + '1';
661
                   ebFIFO_Rd_Cntr_eq_Two   <= '1';
662
                   ebFIFO_Rd_1DW           <= '1';
663
                 else
664
                   ebFIFO_Rd_Counter       <= RdNumber;
665
                   ebFIFO_Rd_Cntr_eq_Two   <= RdNumber_eq_Two;  -- or RdNumber_eq_One;
666
                   ebFIFO_Rd_1DW           <= '0';
667
                 end if;
668
              else
669
                 ebFIFO_Rd_Counter       <= (Others=>'0');
670
                 ebFIFO_Rd_Cntr_eq_Two   <= '0';
671
                 ebFIFO_Rd_1DW           <= '0';
672
              end if;
673
 
674
            when Others    =>
675
              ebFIFO_Rd_1DW           <= ebFIFO_Rd_1DW;
676
              if (eb_FIFO_empty='0' or Tx_eb_TimeOut_i='1') and eb_FIFO_re_i='1'
677
                 then
678
                 ebFIFO_Rd_Counter       <= ebFIFO_Rd_Counter - "10";  -- '1';
679
                 if ebFIFO_Rd_Counter = CONV_STD_LOGIC_VECTOR(4, C_TLP_FLD_WIDTH_OF_LENG) then
680
                    ebFIFO_Rd_Cntr_eq_Two   <= '1';
681
                 else
682
                    ebFIFO_Rd_Cntr_eq_Two   <= '0';
683
                 end if;
684
              else
685
                 ebFIFO_Rd_Counter       <= ebFIFO_Rd_Counter;
686
                 ebFIFO_Rd_Cntr_eq_Two   <= ebFIFO_Rd_Cntr_eq_Two;
687
              end if;
688
 
689
         end case;
690
 
691
      end if;
692
   end process;
693
 
694
 
695
-----------------------------------------------------
696
-- Synchronous Delay: mbuf_writes
697
-- 
698
   Synchron_Delay_mbuf_writes:
699
   process ( trn_clk )
700
   begin
701
     if trn_clk'event and trn_clk = '1' then
702
         Regs_Write_mbuf_r1      <= Regs_RdEn;
703
         Regs_Write_mbuf_r2      <= Regs_Write_mbuf_r1;
704
         Regs_Write_mbuf_r3      <= Regs_Write_mbuf_r2;
705
 
706
         DDR_FIFO_Write_mbuf_r1  <= DDR_FIFO_RdEn_i and (not DDR_FIFO_Empty or Tx_TimeOut_i);
707
         DDR_FIFO_Write_mbuf_r2  <= DDR_FIFO_Write_mbuf_r1;
708
         DDR_FIFO_Write_mbuf_r3  <= DDR_FIFO_Write_mbuf_r2;
709
 
710
         eb_FIFO_Write_mbuf      <= eb_FIFO_re_i and (not eb_FIFO_empty or Tx_eb_TimeOut_i);
711
         eb_FIFO_Write_mbuf_r1   <= eb_FIFO_Write_mbuf;
712
         eb_FIFO_Write_mbuf_r2   <= eb_FIFO_Write_mbuf_r1;
713
 
714
         eb_FIFO_RdEn_Mask_r1    <= eb_FIFO_RdEn_Mask;
715
         eb_FIFO_RdEn_Mask_r2    <= eb_FIFO_RdEn_Mask_r1;
716
 
717
      end if;
718
   end process;
719
 
720
 
721
--------------------------------------------------------------------------
722
--  Wires to be OR'ed to build mbuf_Din
723
--------------------------------------------------------------------------
724
 
725
   eb_FIFO_Dout_wire     <= eb_FIFO_qout_r1 when (eb_FIFO_Hit='1' and Shift_1st_QWord_k='0')
726
                            else eb_FIFO_qout_shift when (eb_FIFO_Hit='1' and Shift_1st_QWord_k='1')
727
                            else (OTHERS=>'0');
728
   DDR_Dout_wire         <= DDR_FIFO_RdQout when DDR_FIFO_Hit='1'  else (OTHERS=>'0');
729
   Regs_RdQout_wire      <= Regs_RdQout     when Regs_Hit='1'      else (OTHERS=>'0');
730
 
731
   mbuf_Din_wire_OR      <= eb_FIFO_Dout_wire or DDR_Dout_wire   or Regs_RdQout_wire;
732
 
733
-----------------------------------------------------
734
-- Synchronous Delay: mbuf_WE
735
-- 
736
   Synchron_Delay_mbuf_WE:
737
   process ( trn_clk )
738
   begin
739
     if trn_clk'event and trn_clk = '1' then
740
         mbuf_WE_i      <= DDR_FIFO_Write_mbuf_r1
741
                        or Regs_Write_mbuf_r2
742
                        or (eb_FIFO_Write_mbuf_r1 or (Shift_1st_QWord_k and eb_FIFO_RdEn_Mask_rise_r1))
743
                        ;
744
      end if;
745
   end process;
746
 
747
 
748
-----------------------------------------------------
749
-- Synchronous Delay: TxTLP_eof_n
750
-- 
751
   Synchron_Delay_TxTLP_eof_n:
752
   process ( trn_clk )
753
   begin
754
     if trn_clk'event and trn_clk = '1' then
755
         TxTLP_eof_n_r1      <= TxTLP_eof_n;
756
--         TxTLP_eof_n_r2      <= TxTLP_eof_n_r1;
757
      end if;
758
   end process;
759
 
760
 
761
 
762
 
763
 
764
--S SIMONE BEGIN: Mi trovo in lettura dalla FIFO MSB<-->LSB Invertiti...  Provo a togliere lo SWAP!!!
765
     eb_FIFO_qout_swapped <= eb_FIFO_qout;
766
--   eb_FIFO_qout_swapped  <= eb_FIFO_qout(C_DBUS_WIDTH/2+7  downto C_DBUS_WIDTH/2)
767
--                          & eb_FIFO_qout(C_DBUS_WIDTH/2+15 downto C_DBUS_WIDTH/2+8)
768
--                          & eb_FIFO_qout(C_DBUS_WIDTH/2+23 downto C_DBUS_WIDTH/2+16)
769
--                          & eb_FIFO_qout(C_DBUS_WIDTH/2+31 downto C_DBUS_WIDTH/2+24)
770
--
771
--                          & eb_FIFO_qout(7  downto 0)
772
--                          & eb_FIFO_qout(15 downto 8)
773
--                          & eb_FIFO_qout(23 downto 16)
774
--                          & eb_FIFO_qout(31 downto 24)
775
--                          ;
776
--S SIMONE END:
777
 
778
 
779
 
780
--   eb_FIFO_qout_swapped  <= eb_FIFO_qout(C_DBUS_WIDTH/2-1 downto 0) & eb_FIFO_qout(C_DBUS_WIDTH-1 downto C_DBUS_WIDTH/2);
781
 
782
 
783
-----------------------------------------------------
784
-- Synchronous Delay: eb_FIFO_qout
785
-- 
786
   Synchron_Delay_eb_FIFO_qout:
787
   process ( trn_clk )
788
   begin
789
     if trn_clk'event and trn_clk = '1' then
790
        eb_FIFO_RdEn_Mask_rise    <= eb_FIFO_RdEn_Mask and not eb_FIFO_RdEn_Mask_r1;
791
        eb_FIFO_RdEn_Mask_rise_r1 <= eb_FIFO_RdEn_Mask_rise;
792
        eb_FIFO_RdEn_Mask_rise_r2 <= eb_FIFO_RdEn_Mask_rise_r1;
793
        eb_FIFO_qout_r1           <= eb_FIFO_qout_swapped;
794
        eb_FIFO_qout_shift        <= eb_FIFO_qout_r1(C_DBUS_WIDTH/2-1 downto 0)
795
                                   & eb_FIFO_qout_swapped(C_DBUS_WIDTH-1 downto C_DBUS_WIDTH/2);
796
      end if;
797
   end process;
798
 
799
-----------------------------------------------------
800
-- Synchronous Delay: mbuf_Din
801
-- 
802
   Synchron_Delay_mbuf_Din:
803
   process ( trn_clk, mReader_Rst_n)
804
   begin
805
      if mReader_Rst_n = '0' then
806
         mbuf_Din_i           <= (C_DBUS_WIDTH=>'1', Others=>'0');
807
 
808
      elsif trn_clk'event and trn_clk = '1' then
809
         if Tx_TimeOut_i='1' and DDR_FIFO_Hit='1' then
810
           mbuf_Din_i(C_DBUS_WIDTH-1 downto 0)     <= (OTHERS=>'1');
811
         elsif Tx_eb_TimeOut_i='1' and eb_FIFO_Hit='1' and is_CplD_k='1' then
812
           mbuf_Din_i(C_DBUS_WIDTH-1 downto 0)     <= (OTHERS=>'1');
813
         elsif Tx_eb_TimeOut_i='1' and eb_FIFO_Hit='1' and may_be_MWr_k='1' then
814
           mbuf_Din_i(C_DBUS_WIDTH-1 downto 0)     <= (OTHERS=>'1');
815
         else
816
           mbuf_Din_i(C_DBUS_WIDTH-1 downto 0)     <= Endian_Invert_64(mbuf_Din_wire_OR);
817
         end if;
818
 
819
         if DDR_FIFO_Hit='1' then
820
           mbuf_Din_i(C_DBUS_WIDTH)                <= not DDR_FIFO_RdEn_Mask;
821
           mbuf_Din_i(70)                          <= TRem_n_last_QWord;
822
         elsif eb_FIFO_Hit='1' then
823
           if Shift_1st_QWord_k='1' and ebFIFO_Rd_1DW='0' then
824
              mbuf_Din_i(C_DBUS_WIDTH)                <= not eb_FIFO_RdEn_Mask_r2;
825
           else
826
              mbuf_Din_i(C_DBUS_WIDTH)                <= not eb_FIFO_RdEn_Mask_r1;
827
           end if;
828
           mbuf_Din_i(70)                          <= TRem_n_last_QWord;
829
         else
830
           mbuf_Din_i(C_DBUS_WIDTH)                <= TxTLP_eof_n_r1;
831
           mbuf_Din_i(70)                          <= TRem_n_last_QWord;
832
         end if;
833
      end if;
834
   end process;
835
 
836
 
837
-----------------------------------------------------
838
-- Synchronous: Time-out counter
839
-- 
840
   Synchron_TimeOut_Counter:
841
   process ( trn_clk, TO_Cnt_Rst )
842
   begin
843
      if TO_Cnt_Rst='1' then
844
         TimeOut_Counter   <= (OTHERS=>'0');
845
      elsif trn_clk'event and trn_clk = '1' then
846
         TimeOut_Counter(21 downto 0)   <= TimeOut_Counter(21 downto 0) + '1';
847
      end if;
848
   end process;
849
 
850
-----------------------------------------------------
851
-- Synchronous: Tx_TimeOut
852
-- 
853
   SynchOUT_Tx_TimeOut:
854
   process ( trn_clk, mReader_Rst_n )
855
   begin
856
      if mReader_Rst_n='0' then
857
         Tx_TimeOut_i      <= '0';
858
      elsif trn_clk'event and trn_clk = '1' then
859
         if TimeOut_Counter(21 downto 6)=X"FFFF" then
860
--         if TimeOut_Counter(4 downto 1)=X"F" then
861
            Tx_TimeOut_i   <= '1';
862
         else
863
            Tx_TimeOut_i   <= Tx_TimeOut_i;
864
         end if;
865
      end if;
866
   end process;
867
 
868
-----------------------------------------------------
869
-- Synchronous: Tx_eb_TimeOut
870
-- 
871
   SynchOUT_Tx_eb_TimeOut:
872
   process ( trn_clk, mReader_Rst_n )
873
   begin
874
      if mReader_Rst_n='0' then
875
         Tx_eb_TimeOut_i      <= '0';
876
      elsif trn_clk'event and trn_clk = '1' then
877
--         if TimeOut_Counter(3 downto 0)=X"F" then
878
         if TimeOut_Counter(6 downto 3)=X"F"
879
            and is_CplD_k='1'
880
            then
881
            Tx_eb_TimeOut_i   <= '1';
882
         elsif TimeOut_Counter(8 downto 5)=X"F"
883
            and may_be_MWr_k='1'
884
            then
885
            Tx_eb_TimeOut_i   <= '1';
886
         else
887
            Tx_eb_TimeOut_i   <= Tx_eb_TimeOut_i;
888
         end if;
889
      end if;
890
   end process;
891
 
892
end architecture Behavioral;

powered by: WebSVN 2.1.0

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