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

Subversion Repositories pcie_sg_dma

[/] [pcie_sg_dma/] [trunk/] [rtl/] [tx_Mem_Reader.vhd] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 weng_ziti
----------------------------------------------------------------------------------
2
-- Company:  ziti, Uni. HD
3
-- Engineer:  wgao
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 3 weng_ziti
  signal   ebFIFO_Rd_1DW_r1       : std_logic;
149 2 weng_ziti
  signal   eb_FIFO_qout_r1        : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
150
  signal   eb_FIFO_qout_shift     : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
151
  signal   eb_FIFO_qout_swapped   : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
152
 
153
  -- Memory data outputs
154
  signal   eb_FIFO_Dout_wire      : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
155
  signal   DDR_Dout_wire          : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
156
  signal   Regs_RdQout_wire       : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
157
  signal   mbuf_Din_wire_OR       : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
158
 
159
  -- Output port of the memory buffer
160
  signal   mbuf_Din_i             : std_logic_vector(C_DBUS_WIDTH*9/8-1 downto 0);
161
  signal   mbuf_WE_i              : std_logic;
162
  signal   mbuf_Full_i            : std_logic;
163
  signal   mbuf_aFull_i           : std_logic;
164
  signal   mbuf_UserFull_i        : std_logic;
165
  signal   mbuf_aFull_r1          : std_logic;
166
 
167
 
168
  -- Read command request and acknowledge
169
  signal   RdCmd_Req_i            : std_logic;
170
  signal   RdCmd_Ack_i            : std_logic;
171
 
172
  signal   Shift_1st_QWord_k      : std_logic;
173
  signal   is_CplD_k              : std_logic;
174
  signal   may_be_MWr_k           : std_logic;
175
  signal   TRem_n_last_QWord      : std_logic;
176
 
177
  signal   regs_Rd_Counter        : std_logic_vector(C_TLP_FLD_WIDTH_OF_LENG-1   downto 0);
178
  signal   regs_Rd_Cntr_eq_One    : std_logic;
179
  signal   regs_Rd_Cntr_eq_Two    : std_logic;
180
  signal   DDR_Rd_Counter         : std_logic_vector(C_TLP_FLD_WIDTH_OF_LENG-1   downto 0);
181
  signal   DDR_Rd_Cntr_eq_One     : std_logic;
182
 
183
  signal   ebFIFO_Rd_Counter      : std_logic_vector(C_TLP_FLD_WIDTH_OF_LENG-1   downto 0);
184
  signal   ebFIFO_Rd_Cntr_eq_Two  : std_logic;
185
 
186
  signal   Address_var            : std_logic_vector(C_DBUS_WIDTH-1   downto 0);
187
  signal   Address_step           : std_logic_vector(4-1   downto 0);
188
  signal   TxTLP_eof_n            : std_logic;
189
 
190
  signal   TxTLP_eof_n_r1         : std_logic;
191
--  signal   TxTLP_eof_n_r2         : std_logic;
192
 
193
  signal   TimeOut_Counter        : std_logic_vector(C_DBUS_WIDTH-1   downto 0);
194 3 weng_ziti
  signal   TimeOut_Indic_TX       : std_logic;
195
  signal   TimeOut_Indic_eb_CplD  : std_logic;
196
  signal   TimeOut_Indic_eb_MWr   : std_logic;
197 2 weng_ziti
  signal   TO_Cnt_Rst             : std_logic;
198
  signal   Tx_TimeOut_i           : std_logic;
199
  signal   Tx_eb_TimeOut_i        : std_logic;
200
 
201
 
202
begin
203
 
204
   -- read command REQ + ACK
205
   RdCmd_Req_i           <= RdCmd_Req;
206
   RdCmd_Ack             <= RdCmd_Ack_i;
207
 
208
   -- Time out signal out
209
   Tx_TimeOut            <= Tx_TimeOut_i;
210
   Tx_eb_TimeOut         <= Tx_eb_TimeOut_i;
211
 
212
------------------------------------------------------------
213
---             Memory read control
214
------------------------------------------------------------
215
 
216
   -- Event Buffer read
217
   eb_FIFO_re            <= eb_FIFO_re_i   ;
218
 
219
   -- DDR FIFO Read
220
   DDR_rdc_sof           <= DDR_rdc_sof_i  ;
221
   DDR_rdc_eof           <= DDR_rdc_eof_i  ;
222
   DDR_rdc_v             <= DDR_rdc_v_i    ;
223
   DDR_rdc_FA            <= '0'            ;  -- DDR_rdc_FA_i   ;
224
   DDR_rdc_Shift         <= DDR_rdc_Shift_i;
225
   DDR_rdc_din           <= DDR_rdc_din_i  ;
226
   DDR_rdc_full_i        <= DDR_rdc_full   ;
227
 
228
   DDR_FIFO_RdEn         <= DDR_FIFO_RdEn_i;
229
 
230
 
231
   -- Register address for read
232
   Regs_RdAddr           <= Regs_RdAddr_i;
233
 
234
   -- Memory buffer write port
235
   mbuf_Din              <= mbuf_Din_i;
236
   mbuf_WE               <= mbuf_WE_i;
237
   mbuf_Full_i           <= mbuf_Full;
238
   mbuf_aFull_i          <= mbuf_aFull;
239
   mbuf_UserFull_i       <= mbuf_UserFull;
240
 
241
 
242
   -- 
243
   Regs_RdAddr_i         <=  Address_var(C_EP_AWIDTH-1   downto 0);
244
 
245
-----------------------------------------------------
246
-- Synchronous Delay: mbuf_aFull
247
-- 
248
   Synchron_Delay_mbuf_aFull:
249
   process ( trn_clk )
250
   begin
251
     if trn_clk'event and trn_clk = '1' then
252
         mbuf_aFull_r1      <= mbuf_aFull_i or mbuf_Full_i
253
                            or mbuf_UserFull_i;
254
      end if;
255
   end process;
256
 
257
 
258
-- ---------------------------------------------------
259
-- State Machine: Tx Memory read control
260
--
261
   mR_FSM_Control:
262
   process ( trn_clk, mReader_Rst_n)
263
   begin
264
      if mReader_Rst_n = '0' then
265
         DDR_rdc_sof_i        <= '0';
266
         DDR_rdc_eof_i        <= '0';
267
         DDR_rdc_v_i          <= '0';
268
         DDR_rdc_Shift_i      <= '0';
269
         DDR_rdc_din_i        <= (OTHERS=>'0');
270
 
271
         eb_FIFO_Hit          <= '0';
272
         eb_FIFO_re_i         <= '0';
273
         eb_FIFO_RdEn_Mask    <= '0';
274
 
275
         DDR_FIFO_Hit         <= '0';
276
         DDR_FIFO_RdEn_i      <= '0';
277
         DDR_FIFO_RdEn_Mask   <= '0';
278
         Regs_Hit             <= '0';
279
         Regs_RdEn            <= '0';
280
         regs_Rd_Counter      <= (Others=>'0');
281
         DDR_Rd_Counter       <= (Others=>'0');
282
         DDR_Rd_Cntr_eq_One   <= '0';
283
 
284
         ebFIFO_Rd_Counter    <= (Others=>'0');
285
         ebFIFO_Rd_Cntr_eq_Two<= '0';
286
 
287
         regs_Rd_Cntr_eq_One  <= '0';
288
         regs_Rd_Cntr_eq_Two  <= '0';
289
 
290
         Shift_1st_QWord_k    <= '0';
291
         is_CplD_k            <= '0';
292
         may_be_MWr_k         <= '0';
293
         TRem_n_last_QWord    <= '0';
294
 
295
         Address_var          <= (Others=>'1');
296
         TxTLP_eof_n          <= '1';
297
 
298
         TO_Cnt_Rst           <= '0';
299
 
300
         RdCmd_Ack_i          <= '0';
301
         TxMReader_State      <= St_mR_Idle;
302
 
303
      elsif trn_clk'event and trn_clk = '1' then
304
 
305
         case TxMReader_State is
306
 
307
            when St_mR_Idle    =>
308
              if RdCmd_Req_i='0' then
309
                TxMReader_State      <= St_mR_Idle;
310
                eb_FIFO_Hit          <= '0';
311
                Regs_Hit             <= '0';
312
                Regs_RdEn            <= '0';
313
                TxTLP_eof_n          <= '1';
314
                Address_var          <= (Others=>'1');
315
                RdCmd_Ack_i          <= '0';
316
                is_CplD_k            <= '0';
317
                may_be_MWr_k         <= '0';
318
              else
319
                RdCmd_Ack_i          <= '1';
320
                Shift_1st_QWord_k    <= Shift_1st_QWord;
321
                TRem_n_last_QWord    <= Shift_1st_QWord xor RdNumber(0);
322
                is_CplD_k            <= is_CplD;
323
                may_be_MWr_k         <= not is_CplD;
324
                TxTLP_eof_n          <= '1';
325
                if BAR_value(C_ENCODE_BAR_NUMBER-2 downto 0)
326
                   = CONV_STD_LOGIC_VECTOR(CINT_DDR_SPACE_BAR, C_ENCODE_BAR_NUMBER-1)
327
                   then
328
                   eb_FIFO_Hit      <= '0';
329
                   DDR_FIFO_Hit     <= '1';
330
                   Regs_Hit         <= '0';
331
                   Regs_RdEn        <= '0';
332
                   Address_var      <= Address_var;
333
                   TxMReader_State  <= St_mR_DDR_A;
334
                elsif BAR_value(C_ENCODE_BAR_NUMBER-2 downto 0)
335
                      = CONV_STD_LOGIC_VECTOR(CINT_REGS_SPACE_BAR, C_ENCODE_BAR_NUMBER-1)
336
                   then
337
                   eb_FIFO_Hit      <= '0';
338
                   DDR_FIFO_Hit     <= '0';
339
                   Regs_Hit         <= '1';
340
                   Regs_RdEn        <= '1';
341
                   if Shift_1st_QWord='1' then
342
                     Address_var(C_EP_AWIDTH-1 downto 0)  <= StartAddr(C_EP_AWIDTH-1 downto 0) - "100";
343
                   else
344
                     Address_var(C_EP_AWIDTH-1 downto 0)  <= StartAddr(C_EP_AWIDTH-1 downto 0);
345
                   end if;
346
                   TxMReader_State  <= St_mR_CmdLatch;
347
                elsif BAR_value(C_ENCODE_BAR_NUMBER-2 downto 0)
348
                      = CONV_STD_LOGIC_VECTOR(CINT_FIFO_SPACE_BAR, C_ENCODE_BAR_NUMBER-1)
349
                   then
350
                   eb_FIFO_Hit      <= '1';
351
                   DDR_FIFO_Hit     <= '0';
352
                   Regs_Hit         <= '0';
353
                   Regs_RdEn        <= '0';
354
                   Address_var      <= Address_var;
355
                   TxMReader_State  <= St_mR_DDR_C;
356
                else
357
                   eb_FIFO_Hit      <= '0';
358
                   DDR_FIFO_Hit     <= '0';
359
                   Regs_Hit         <= '0';
360
                   Regs_RdEn        <= '0';
361
                   Address_var      <= Address_var;
362
                   TxMReader_State  <= St_mR_CmdLatch;
363
                end if;
364
 
365
              end if;
366
 
367
 
368
            when St_mR_DDR_A    =>
369
               DDR_rdc_sof_i        <= '1';
370
               DDR_rdc_eof_i        <= '0';
371
               DDR_rdc_v_i          <= '1';
372
               DDR_rdc_Shift_i      <= Shift_1st_QWord_k;
373
               DDR_rdc_din_i        <= C_ALL_ZEROS(C_DBUS_WIDTH-1 downto C_TLP_FLD_WIDTH_OF_LENG+2+32)
374
                                     & RdNumber & "00"
375
                                     & StartAddr(C_DBUS_WIDTH-1-32 downto 0);
376
               Regs_RdEn            <= '0';
377
               DDR_FIFO_RdEn_i      <= '0';
378
               TxTLP_eof_n          <= '1';
379
               RdCmd_Ack_i          <= '1';
380
               TxMReader_State      <= St_mR_DDR_C;  -- St_mR_DDR_B;
381
 
382
 
383
            when St_mR_DDR_C    =>
384
               DDR_rdc_sof_i        <= '0';
385
               DDR_rdc_eof_i        <= '0';
386
               DDR_rdc_v_i          <= '0';
387
               DDR_rdc_din_i        <= DDR_rdc_din_i;
388
               RdCmd_Ack_i          <= '0';
389
               TxTLP_eof_n          <= '1';
390
--               if DDR_FIFO_Hit='1' and DDR_FIFO_Empty='1' then
391
               if DDR_FIFO_Hit='1' and DDR_FIFO_Empty='1' and Tx_TimeOut_i='0' then
392
                  TxMReader_State      <= St_mR_DDR_C;
393
--               elsif eb_FIFO_Hit='1' and eb_FIFO_empty='1' then
394
               elsif eb_FIFO_Hit='1' and eb_FIFO_empty='1' and Tx_eb_TimeOut_i='0' then
395
                  TxMReader_State      <= St_mR_DDR_C;
396
               else
397
                  TxMReader_State      <= St_mR_CmdLatch;
398
               end if;
399
 
400
 
401
            when St_mR_CmdLatch    =>
402
                  RdCmd_Ack_i          <= '0';
403
                  if regs_Rd_Cntr_eq_One = '1' then
404
                     Regs_RdEn            <= '0';
405
                     Address_var          <= Address_var;
406
                     TxTLP_eof_n          <= '0';
407
                     TxMReader_State      <= St_mR_Last;
408
                  elsif regs_Rd_Cntr_eq_Two = '1' then
409
                     if Shift_1st_QWord_k='1' then
410
                       TxMReader_State      <= St_mR_Transfer;
411
                       Regs_RdEn            <= Regs_RdEn;  -- '1';
412
                       TxTLP_eof_n          <= '1';
413
                       Address_var(C_EP_AWIDTH-1 downto 0)  <= Address_var(C_EP_AWIDTH-1 downto 0) + "1000";
414
                     else
415
                       TxMReader_State      <= St_mR_Last;
416
                       Regs_RdEn            <= '0';
417
                       TxTLP_eof_n          <= '0';
418
                       Address_var(C_EP_AWIDTH-1 downto 0)  <= Address_var(C_EP_AWIDTH-1 downto 0) + "1000";
419
                     end if;
420
                  else
421
                     Regs_RdEn            <= Regs_RdEn;
422
                     Address_var(C_EP_AWIDTH-1 downto 0)  <= Address_var(C_EP_AWIDTH-1 downto 0) + "1000";
423
                     TxTLP_eof_n          <= '1';
424
                     TxMReader_State      <= St_mR_Transfer;
425
                  end if;
426
 
427
 
428
            when St_mR_Transfer    =>
429
                  RdCmd_Ack_i          <= '0';
430
                  if DDR_FIFO_Hit='1' and DDR_FIFO_RdEn_Mask='1' then
431
                     Address_var          <= Address_var;
432
                     Regs_RdEn            <= '0';
433
                     TxTLP_eof_n          <= '0';
434
                     TxMReader_State      <= St_mR_Last;
435
                  elsif eb_FIFO_Hit='1' and eb_FIFO_RdEn_Mask='1' then
436
                     Address_var          <= Address_var;
437
                     Regs_RdEn            <= '0';
438
                     TxTLP_eof_n          <= '0';
439
                     TxMReader_State      <= St_mR_Last;
440
                  elsif eb_FIFO_Hit='0' and regs_Rd_Cntr_eq_One = '1' then
441
                     Address_var          <= Address_var;
442
                     Regs_RdEn            <= '0';
443
                     TxTLP_eof_n          <= '0';
444
                     TxMReader_State      <= St_mR_Last;
445
                  elsif eb_FIFO_Hit='0' and regs_Rd_Cntr_eq_Two = '1' then
446
                     Address_var          <= Address_var;
447
                     Regs_RdEn            <= '0';
448
                     TxTLP_eof_n          <= '0';
449
                     TxMReader_State      <= St_mR_Last;
450
                  elsif mbuf_aFull_r1 = '1' then
451
                     Address_var          <= Address_var;
452
                     Regs_RdEn            <= '0';
453
                     TxTLP_eof_n          <= TxTLP_eof_n;
454
                     TxMReader_State      <= St_mR_Transfer;
455
                  else
456
                     Address_var(C_EP_AWIDTH-1 downto 0)    <= Address_var(C_EP_AWIDTH-1 downto 0) + "1000";
457
                     Regs_RdEn            <= Regs_Hit;
458
                     TxTLP_eof_n          <= TxTLP_eof_n;
459
                     TxMReader_State      <= St_mR_Transfer;
460
                  end if;
461
 
462
 
463
            when St_mR_Last    =>
464
               Regs_RdEn            <= '0';
465
               DDR_FIFO_RdEn_i      <= '0';
466
               TxTLP_eof_n          <= (not DDR_FIFO_Hit) and (not eb_FIFO_Hit);
467
               RdCmd_Ack_i          <= '0';
468
               TxMReader_State      <= St_mR_Idle;
469
 
470
 
471
            when Others    =>
472
               Address_var          <= Address_var;
473
               eb_FIFO_Hit          <= '0';
474
               Regs_RdEn            <= '0';
475
               DDR_FIFO_RdEn_i      <= '0';
476
               TxTLP_eof_n          <= '1';
477
               RdCmd_Ack_i          <= '0';
478
               TxMReader_State      <= St_mR_Idle;
479
 
480
         end case;
481
 
482
 
483
         case TxMReader_State is
484
            when St_mR_Idle    =>
485
              TO_Cnt_Rst   <= '1';
486
 
487
            when Others    =>
488
              TO_Cnt_Rst   <= '0';
489
 
490
         end case;
491
 
492
 
493
         case TxMReader_State is
494
 
495
            when St_mR_Idle    =>
496
              DDR_FIFO_RdEn_i  <= '0';
497
              DDR_FIFO_RdEn_Mask   <= '0';
498
 
499
            when Others    =>
500
              if DDR_Rd_Cntr_eq_One = '1'
501
                 and (DDR_FIFO_Empty='0' or Tx_TimeOut_i='1')
502
                 and DDR_FIFO_RdEn_i='1'
503
                 then
504
                 DDR_FIFO_RdEn_Mask   <= '1';
505
                 DDR_FIFO_RdEn_i      <= '0';
506
              else
507
                 DDR_FIFO_RdEn_Mask   <= DDR_FIFO_RdEn_Mask;
508
                 DDR_FIFO_RdEn_i      <=  DDR_FIFO_Hit
509
                                      and not mbuf_aFull_r1
510
                                      and not DDR_FIFO_RdEn_Mask;
511
              end if;
512
         end case;
513
 
514
 
515
         case TxMReader_State is
516
 
517
            when St_mR_Idle    =>
518
              eb_FIFO_re_i        <= '0';
519
              eb_FIFO_RdEn_Mask   <= '0';
520
 
521
            when Others    =>
522
              if ebFIFO_Rd_Cntr_eq_Two = '1'
523
                 and (eb_FIFO_empty='0' or Tx_eb_TimeOut_i='1')
524
                 and eb_FIFO_re_i='1'
525
                 then
526
                 eb_FIFO_RdEn_Mask   <= '1';
527
                 eb_FIFO_re_i        <= '0';
528
              else
529
                 eb_FIFO_RdEn_Mask   <= eb_FIFO_RdEn_Mask;
530
                 eb_FIFO_re_i        <= eb_FIFO_Hit
531
                                      and not mbuf_aFull_r1
532
                                      and not eb_FIFO_RdEn_Mask;
533
              end if;
534
         end case;
535
 
536
 
537
         case TxMReader_State is
538
 
539
            when St_mR_Idle    =>
540
              if RdCmd_Req_i='1' and
541
                 BAR_value(C_ENCODE_BAR_NUMBER-2 downto 0)
542
                 /= CONV_STD_LOGIC_VECTOR(CINT_DDR_SPACE_BAR, C_ENCODE_BAR_NUMBER-1)
543
                 then
544
                 regs_Rd_Counter       <= RdNumber;
545
                 regs_Rd_Cntr_eq_One   <= RdNumber_eq_One;
546
                 regs_Rd_Cntr_eq_Two   <= RdNumber_eq_Two;
547
              else
548
                 regs_Rd_Counter       <= (Others=>'0');
549
                 regs_Rd_Cntr_eq_One   <= '0';
550
                 regs_Rd_Cntr_eq_Two   <= '0';
551
              end if;
552
 
553
            when St_mR_CmdLatch    =>
554
              if DDR_FIFO_Hit='0' then
555
                 if Shift_1st_QWord_k='1' then
556
                   regs_Rd_Counter          <= regs_Rd_Counter - '1';
557
                   if regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(2, C_TLP_FLD_WIDTH_OF_LENG) then
558
                      regs_Rd_Cntr_eq_One   <= '1';
559
                   else
560
                      regs_Rd_Cntr_eq_One   <= '0';
561
                   end if;
562
                   if regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(3, C_TLP_FLD_WIDTH_OF_LENG) then
563
                      regs_Rd_Cntr_eq_Two   <= '1';
564
                   else
565
                      regs_Rd_Cntr_eq_Two   <= '0';
566
                   end if;
567
                 else
568
                   regs_Rd_Counter          <= regs_Rd_Counter - "10";  -- '1';
569
                   if regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(3, C_TLP_FLD_WIDTH_OF_LENG) then
570
                      regs_Rd_Cntr_eq_One   <= '1';
571
                   else
572
                      regs_Rd_Cntr_eq_One   <= '0';
573
                   end if;
574
                   if regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(4, C_TLP_FLD_WIDTH_OF_LENG) then
575
                      regs_Rd_Cntr_eq_Two   <= '1';
576
                   else
577
                      regs_Rd_Cntr_eq_Two   <= '0';
578
                   end if;
579
                 end if;
580
              else
581
                 regs_Rd_Counter       <= regs_Rd_Counter;
582
                 regs_Rd_Cntr_eq_One   <= regs_Rd_Cntr_eq_One;
583
                 regs_Rd_Cntr_eq_Two   <= regs_Rd_Cntr_eq_Two;
584
              end if;
585
 
586
            when St_mR_Transfer    =>
587
              if DDR_FIFO_Hit='0'
588
                 and mbuf_aFull_r1 = '0'
589
                 then
590
                 regs_Rd_Counter           <= regs_Rd_Counter - "10";  -- '1';
591
                 if regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(1, C_TLP_FLD_WIDTH_OF_LENG) then
592
                    regs_Rd_Cntr_eq_One   <= '1';
593
                 elsif regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(2, C_TLP_FLD_WIDTH_OF_LENG) then
594
                    regs_Rd_Cntr_eq_One   <= '1';
595
                 elsif regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(3, C_TLP_FLD_WIDTH_OF_LENG) then
596
                    regs_Rd_Cntr_eq_One   <= '1';
597
                 else
598
                    regs_Rd_Cntr_eq_One   <= '0';
599
                 end if;
600
                 if regs_Rd_Counter = CONV_STD_LOGIC_VECTOR(4, C_TLP_FLD_WIDTH_OF_LENG) then
601
                    regs_Rd_Cntr_eq_Two   <= '1';
602
                 else
603
                    regs_Rd_Cntr_eq_Two   <= '0';
604
                 end if;
605
              else
606
                 regs_Rd_Counter       <= regs_Rd_Counter;
607
                 regs_Rd_Cntr_eq_One   <= regs_Rd_Cntr_eq_One;
608
                 regs_Rd_Cntr_eq_Two   <= regs_Rd_Cntr_eq_Two;
609
              end if;
610
 
611
            when Others    =>
612
              regs_Rd_Counter       <= regs_Rd_Counter;
613
              regs_Rd_Cntr_eq_One   <= regs_Rd_Cntr_eq_One;
614
              regs_Rd_Cntr_eq_Two   <= regs_Rd_Cntr_eq_Two;
615
 
616
         end case;
617
 
618
 
619
         case TxMReader_State is
620
            when St_mR_Idle    =>
621
              if RdCmd_Req_i='1' and
622
                 BAR_value(C_ENCODE_BAR_NUMBER-2 downto 0)
623
                 = CONV_STD_LOGIC_VECTOR(CINT_DDR_SPACE_BAR, C_ENCODE_BAR_NUMBER-1)
624
                 then
625
                 if RdNumber(0)='1' then
626
                   DDR_Rd_Counter       <= RdNumber + '1';
627
                   DDR_Rd_Cntr_eq_One   <= RdNumber_eq_One;
628
                 elsif Shift_1st_QWord='1' then
629
                   DDR_Rd_Counter       <= RdNumber + "10";
630
                   DDR_Rd_Cntr_eq_One   <= RdNumber_eq_One;
631
                 else
632
                   DDR_Rd_Counter       <= RdNumber;
633
                   DDR_Rd_Cntr_eq_One   <= RdNumber_eq_One or RdNumber_eq_Two;
634
                 end if;
635
              else
636
                 DDR_Rd_Counter       <= (Others=>'0');
637
                 DDR_Rd_Cntr_eq_One   <= '0';
638
              end if;
639
 
640
            when Others    =>
641
              if ((DDR_FIFO_Empty='0' or Tx_TimeOut_i='1') and DDR_FIFO_RdEn_i='1')
642
                 then
643
                 DDR_Rd_Counter       <= DDR_Rd_Counter - "10";  -- '1';
644
                 if DDR_Rd_Counter = CONV_STD_LOGIC_VECTOR(4, C_TLP_FLD_WIDTH_OF_LENG) then
645
                    DDR_Rd_Cntr_eq_One   <= '1';
646
                 else
647
                    DDR_Rd_Cntr_eq_One   <= '0';
648
                 end if;
649
              else
650
                 DDR_Rd_Counter       <= DDR_Rd_Counter;
651
                 DDR_Rd_Cntr_eq_One   <= DDR_Rd_Cntr_eq_One;
652
              end if;
653
 
654
         end case;
655
 
656
 
657
         case TxMReader_State is
658
            when St_mR_Idle    =>
659
              if RdCmd_Req_i='1' and
660
                 BAR_value(C_ENCODE_BAR_NUMBER-2 downto 0)
661
                 = CONV_STD_LOGIC_VECTOR(CINT_FIFO_SPACE_BAR, C_ENCODE_BAR_NUMBER-1)
662
                 then
663
                 if RdNumber_eq_One='1' then
664
                   ebFIFO_Rd_Counter       <= RdNumber + '1';
665
                   ebFIFO_Rd_Cntr_eq_Two   <= '1';
666
                   ebFIFO_Rd_1DW           <= '1';
667
                 else
668
                   ebFIFO_Rd_Counter       <= RdNumber;
669
                   ebFIFO_Rd_Cntr_eq_Two   <= RdNumber_eq_Two;  -- or RdNumber_eq_One;
670
                   ebFIFO_Rd_1DW           <= '0';
671
                 end if;
672
              else
673
                 ebFIFO_Rd_Counter       <= (Others=>'0');
674
                 ebFIFO_Rd_Cntr_eq_Two   <= '0';
675
                 ebFIFO_Rd_1DW           <= '0';
676
              end if;
677
 
678
            when Others    =>
679
              ebFIFO_Rd_1DW           <= ebFIFO_Rd_1DW;
680
              if (eb_FIFO_empty='0' or Tx_eb_TimeOut_i='1') and eb_FIFO_re_i='1'
681
                 then
682
                 ebFIFO_Rd_Counter       <= ebFIFO_Rd_Counter - "10";  -- '1';
683
                 if ebFIFO_Rd_Counter = CONV_STD_LOGIC_VECTOR(4, C_TLP_FLD_WIDTH_OF_LENG) then
684
                    ebFIFO_Rd_Cntr_eq_Two   <= '1';
685
                 else
686
                    ebFIFO_Rd_Cntr_eq_Two   <= '0';
687
                 end if;
688
              else
689
                 ebFIFO_Rd_Counter       <= ebFIFO_Rd_Counter;
690
                 ebFIFO_Rd_Cntr_eq_Two   <= ebFIFO_Rd_Cntr_eq_Two;
691
              end if;
692
 
693
         end case;
694
 
695
      end if;
696
   end process;
697
 
698
 
699
-----------------------------------------------------
700
-- Synchronous Delay: mbuf_writes
701
-- 
702
   Synchron_Delay_mbuf_writes:
703
   process ( trn_clk )
704
   begin
705
     if trn_clk'event and trn_clk = '1' then
706
         Regs_Write_mbuf_r1      <= Regs_RdEn;
707
         Regs_Write_mbuf_r2      <= Regs_Write_mbuf_r1;
708
         Regs_Write_mbuf_r3      <= Regs_Write_mbuf_r2;
709
 
710
         DDR_FIFO_Write_mbuf_r1  <= DDR_FIFO_RdEn_i and (not DDR_FIFO_Empty or Tx_TimeOut_i);
711
         DDR_FIFO_Write_mbuf_r2  <= DDR_FIFO_Write_mbuf_r1;
712
         DDR_FIFO_Write_mbuf_r3  <= DDR_FIFO_Write_mbuf_r2;
713
 
714
         eb_FIFO_Write_mbuf      <= eb_FIFO_re_i and (not eb_FIFO_empty or Tx_eb_TimeOut_i);
715
         eb_FIFO_Write_mbuf_r1   <= eb_FIFO_Write_mbuf;
716
         eb_FIFO_Write_mbuf_r2   <= eb_FIFO_Write_mbuf_r1;
717
 
718
         eb_FIFO_RdEn_Mask_r1    <= eb_FIFO_RdEn_Mask;
719
         eb_FIFO_RdEn_Mask_r2    <= eb_FIFO_RdEn_Mask_r1;
720
 
721
      end if;
722
   end process;
723
 
724
 
725
--------------------------------------------------------------------------
726
--  Wires to be OR'ed to build mbuf_Din
727
--------------------------------------------------------------------------
728
 
729
   eb_FIFO_Dout_wire     <= eb_FIFO_qout_r1 when (eb_FIFO_Hit='1' and Shift_1st_QWord_k='0')
730
                            else eb_FIFO_qout_shift when (eb_FIFO_Hit='1' and Shift_1st_QWord_k='1')
731
                            else (OTHERS=>'0');
732
   DDR_Dout_wire         <= DDR_FIFO_RdQout when DDR_FIFO_Hit='1'  else (OTHERS=>'0');
733
   Regs_RdQout_wire      <= Regs_RdQout     when Regs_Hit='1'      else (OTHERS=>'0');
734
 
735
   mbuf_Din_wire_OR      <= eb_FIFO_Dout_wire or DDR_Dout_wire   or Regs_RdQout_wire;
736
 
737
-----------------------------------------------------
738
-- Synchronous Delay: mbuf_WE
739
-- 
740
   Synchron_Delay_mbuf_WE:
741
   process ( trn_clk )
742
   begin
743
     if trn_clk'event and trn_clk = '1' then
744
         mbuf_WE_i      <= DDR_FIFO_Write_mbuf_r1
745
                        or Regs_Write_mbuf_r2
746 3 weng_ziti
                        or (eb_FIFO_Write_mbuf_r1 or (Shift_1st_QWord_k
747
                            and eb_FIFO_RdEn_Mask_rise_r1 and not ebFIFO_Rd_1DW_r1))
748 2 weng_ziti
                        ;
749
      end if;
750
   end process;
751
 
752
 
753
-----------------------------------------------------
754
-- Synchronous Delay: TxTLP_eof_n
755
-- 
756
   Synchron_Delay_TxTLP_eof_n:
757
   process ( trn_clk )
758
   begin
759
     if trn_clk'event and trn_clk = '1' then
760
         TxTLP_eof_n_r1      <= TxTLP_eof_n;
761
--         TxTLP_eof_n_r2      <= TxTLP_eof_n_r1;
762
      end if;
763
   end process;
764
 
765
--   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);
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
 
777
-----------------------------------------------------
778
-- Synchronous Delay: eb_FIFO_qout
779
-- 
780
   Synchron_Delay_eb_FIFO_qout:
781
   process ( trn_clk )
782
   begin
783
     if trn_clk'event and trn_clk = '1' then
784 3 weng_ziti
        ebFIFO_Rd_1DW_r1          <= ebFIFO_Rd_1DW;
785 2 weng_ziti
        eb_FIFO_RdEn_Mask_rise    <= eb_FIFO_RdEn_Mask and not eb_FIFO_RdEn_Mask_r1;
786
        eb_FIFO_RdEn_Mask_rise_r1 <= eb_FIFO_RdEn_Mask_rise;
787
        eb_FIFO_RdEn_Mask_rise_r2 <= eb_FIFO_RdEn_Mask_rise_r1;
788
        eb_FIFO_qout_r1           <= eb_FIFO_qout_swapped;
789
        eb_FIFO_qout_shift        <= eb_FIFO_qout_r1(C_DBUS_WIDTH/2-1 downto 0)
790
                                   & eb_FIFO_qout_swapped(C_DBUS_WIDTH-1 downto C_DBUS_WIDTH/2);
791
      end if;
792
   end process;
793
 
794
-----------------------------------------------------
795
-- Synchronous Delay: mbuf_Din
796
-- 
797
   Synchron_Delay_mbuf_Din:
798
   process ( trn_clk, mReader_Rst_n)
799
   begin
800
      if mReader_Rst_n = '0' then
801
         mbuf_Din_i           <= (C_DBUS_WIDTH=>'1', Others=>'0');
802
 
803
      elsif trn_clk'event and trn_clk = '1' then
804
         if Tx_TimeOut_i='1' and DDR_FIFO_Hit='1' then
805
           mbuf_Din_i(C_DBUS_WIDTH-1 downto 0)     <= (OTHERS=>'1');
806
         elsif Tx_eb_TimeOut_i='1' and eb_FIFO_Hit='1' and is_CplD_k='1' then
807
           mbuf_Din_i(C_DBUS_WIDTH-1 downto 0)     <= (OTHERS=>'1');
808
         elsif Tx_eb_TimeOut_i='1' and eb_FIFO_Hit='1' and may_be_MWr_k='1' then
809
           mbuf_Din_i(C_DBUS_WIDTH-1 downto 0)     <= (OTHERS=>'1');
810
         else
811
           mbuf_Din_i(C_DBUS_WIDTH-1 downto 0)     <= Endian_Invert_64(mbuf_Din_wire_OR);
812
         end if;
813
 
814
         if DDR_FIFO_Hit='1' then
815
           mbuf_Din_i(C_DBUS_WIDTH)                <= not DDR_FIFO_RdEn_Mask;
816
           mbuf_Din_i(70)                          <= TRem_n_last_QWord;
817
         elsif eb_FIFO_Hit='1' then
818
           if Shift_1st_QWord_k='1' and ebFIFO_Rd_1DW='0' then
819
              mbuf_Din_i(C_DBUS_WIDTH)                <= not eb_FIFO_RdEn_Mask_r2;
820
           else
821
              mbuf_Din_i(C_DBUS_WIDTH)                <= not eb_FIFO_RdEn_Mask_r1;
822
           end if;
823
           mbuf_Din_i(70)                          <= TRem_n_last_QWord;
824
         else
825
           mbuf_Din_i(C_DBUS_WIDTH)                <= TxTLP_eof_n_r1;
826
           mbuf_Din_i(70)                          <= TRem_n_last_QWord;
827
         end if;
828
      end if;
829
   end process;
830
 
831
 
832
-----------------------------------------------------
833
-- Synchronous: Time-out counter
834
-- 
835
   Synchron_TimeOut_Counter:
836
   process ( trn_clk, TO_Cnt_Rst )
837
   begin
838
      if TO_Cnt_Rst='1' then
839 3 weng_ziti
         TimeOut_Counter        <= (OTHERS=>'0');
840
         TimeOut_Indic_TX       <= '0';
841
         TimeOut_Indic_eb_CplD  <= '0';
842 2 weng_ziti
         TimeOut_Indic_eb_MWr   <= '0';
843
      elsif trn_clk'event and trn_clk = '1' then
844
         TimeOut_Counter(21 downto 0)   <= TimeOut_Counter(21 downto 0) + '1';
845 3 weng_ziti
 
846 2 weng_ziti
         if TimeOut_Counter(21 downto 10)=X"FFF" then
847
--         if TimeOut_Counter(4 downto 1)=X"F" then
848
            TimeOut_Indic_TX       <= '1';
849
         else
850
            TimeOut_Indic_TX       <= '0';
851
         end if;
852 3 weng_ziti
 
853 2 weng_ziti
         if TimeOut_Counter(7 downto 4)=X"F" then
854
--         if TimeOut_Counter(3 downto 0)=X"F" then
855 3 weng_ziti
            TimeOut_Indic_eb_CplD  <= '1';
856
         else
857
            TimeOut_Indic_eb_CplD  <= '0';
858 2 weng_ziti
         end if;
859 3 weng_ziti
 
860 2 weng_ziti
         if TimeOut_Counter(10 downto 7)=X"F" then
861
--         if TimeOut_Counter(3 downto 0)=X"F" then
862
            TimeOut_Indic_eb_MWr   <= '1';
863
         else
864
            TimeOut_Indic_eb_MWr   <= '0';
865
         end if;
866 3 weng_ziti
 
867 2 weng_ziti
      end if;
868
   end process;
869
 
870
-----------------------------------------------------
871
-- Synchronous: Tx_TimeOut
872
-- 
873
   SynchOUT_Tx_TimeOut:
874
   process ( trn_clk, mReader_Rst_n )
875
   begin
876
      if mReader_Rst_n='0' then
877
         Tx_TimeOut_i      <= '0';
878
      elsif trn_clk'event and trn_clk = '1' then
879
         if TimeOut_Indic_TX='1' then
880
            Tx_TimeOut_i   <= '1';
881
         else
882
            Tx_TimeOut_i   <= Tx_TimeOut_i;
883
         end if;
884
      end if;
885
   end process;
886
 
887
-----------------------------------------------------
888
-- Synchronous: Tx_eb_TimeOut
889
-- 
890
   SynchOUT_Tx_eb_TimeOut:
891
   process ( trn_clk, mReader_Rst_n )
892
   begin
893
      if mReader_Rst_n='0' then
894
         Tx_eb_TimeOut_i      <= '0';
895
      elsif trn_clk'event and trn_clk = '1' then
896
         if TimeOut_Indic_eb_CplD='1' and is_CplD_k='1'
897
            then
898
            Tx_eb_TimeOut_i   <= '1';
899
         elsif TimeOut_Indic_eb_MWr='1' and may_be_MWr_k='1'
900
            then
901
            Tx_eb_TimeOut_i   <= '1';
902
         else
903
            Tx_eb_TimeOut_i   <= Tx_eb_TimeOut_i;
904
         end if;
905
      end if;
906
   end process;
907
 
908
end architecture Behavioral;

powered by: WebSVN 2.1.0

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