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

Subversion Repositories pcie_sg_dma

[/] [pcie_sg_dma/] [branches/] [Virtex6/] [ML605_ISE12.3/] [rx_MRd_Channel.vhd] - Blame information for rev 11

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 11 barabba
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Design Name: 
6
-- Module Name:    rx_MRd_Transact - Behavioral 
7
-- Project Name: 
8
-- Target Devices: 
9
-- Tool versions: 
10
-- Description: 
11
--
12
-- Dependencies: 
13
--
14
-- Revision 1.20 - Literal assignments removed.   30.07.2007
15
--
16
-- Revision 1.10 - x4 timing constraints met.   02.02.2007
17
--
18
-- Revision 1.04 - Timing improved.     17.01.2007
19
--
20
-- Revision 1.02 - FIFO added.    20.12.2006
21
--
22
-- Revision 1.00 - first release. 14.12.2006
23
-- 
24
-- Additional Comments: 
25
--
26
----------------------------------------------------------------------------------
27
 
28
library IEEE;
29
use IEEE.STD_LOGIC_1164.ALL;
30
use IEEE.STD_LOGIC_ARITH.ALL;
31
use IEEE.STD_LOGIC_UNSIGNED.ALL;
32
 
33
library work;
34
use work.abb64Package.all;
35
 
36
-- Uncomment the following library declaration if instantiating
37
-- any Xilinx primitives in this code.
38
--library UNISIM;
39
--use UNISIM.VComponents.all;
40
 
41
entity rx_MRd_Transact is
42
    port (
43
      -- Transaction receive interface
44
      trn_rsof_n         : IN  std_logic;
45
      trn_reof_n         : IN  std_logic;
46
      trn_rd             : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
47
      trn_rrem_n         : IN  std_logic_vector(C_DBUS_WIDTH/8-1 downto 0);
48
      trn_rerrfwd_n      : IN  std_logic;
49
      trn_rsrc_rdy_n     : IN  std_logic;
50
--      trn_rdst_rdy_n     : OUT std_logic;
51
      trn_rnp_ok_n       : OUT std_logic;
52
      trn_rsrc_dsc_n     : IN std_logic;
53
      trn_rbar_hit_n     : IN  std_logic_vector(C_BAR_NUMBER-1 downto 0);
54
--      trn_rfc_ph_av      : IN  std_logic_vector(7 downto 0);
55
--      trn_rfc_pd_av      : IN  std_logic_vector(11 downto 0);
56
--      trn_rfc_nph_av     : IN  std_logic_vector(7 downto 0);
57
--      trn_rfc_npd_av     : IN  std_logic_vector(11 downto 0);
58
--      trn_rfc_cplh_av    : IN  std_logic_vector(7 downto 0);
59
--      trn_rfc_cpld_av    : IN  std_logic_vector(11 downto 0);
60
 
61
      IORd_Type          : IN  std_logic;
62
      MRd_Type           : IN  std_logic_vector(3 downto 0);
63
      Tlp_straddles_4KB  : IN  std_logic;
64
 
65
      -- MRd Channel
66
      pioCplD_Req        : OUT std_logic;
67
      pioCplD_RE         : IN  std_logic;
68
      pioCplD_Qout       : OUT std_logic_vector(C_CHANNEL_BUF_WIDTH-1 downto 0);
69
--      FIFO_Data_Count    : IN  std_logic_vector(C_FIFO_DC_WIDTH-1 downto 0);
70
      FIFO_Empty         : IN  std_logic;
71
      FIFO_Reading       : IN  std_logic;
72
      pio_FC_stop        : IN  std_logic;
73
      pio_reading_status : OUT std_logic;
74
 
75
      -- Channel reset (from MWr channel)
76
      Channel_Rst        : IN  std_logic;
77
 
78
      -- Common ports
79
      trn_clk            : IN  std_logic;
80
      trn_reset_n        : IN  std_logic;
81
      trn_lnk_up_n       : IN  std_logic
82
    );
83
 
84
end entity rx_MRd_Transact;
85
 
86
 
87
architecture Behavioral of rx_MRd_Transact is
88
 
89
  type RxMRdTrnStates is         ( ST_MRd_RESET
90
                                 , ST_MRd_IDLE
91
                                 , ST_MRd_HEAD2
92
                                 , ST_MRd_Tail
93
                                 );
94
 
95
  -- State variables
96
  signal RxMRdTrn_NextState      : RxMRdTrnStates;
97
  signal RxMRdTrn_State          : RxMRdTrnStates;
98
 
99
  -- trn_rx stubs            
100
  signal  trn_rsof_n_i           : std_logic;
101
  signal  trn_reof_n_i           : std_logic;
102
  signal  trn_rd_i               : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
103
  signal  trn_rrem_n_i           : std_logic_vector(C_DBUS_WIDTH/8-1 downto 0);
104
  signal  trn_rbar_hit_n_i       : std_logic_vector(C_BAR_NUMBER-1 downto 0);
105
  signal  trn_rerrfwd_n_i        : std_logic;
106
 
107
  -- delays
108
  signal  trn_rd_r1              : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
109
  signal  trn_rbar_hit_n_r1      : std_logic_vector(C_BAR_NUMBER-1 downto 0);
110
 
111
  -- BAR encoded
112
  signal  Encoded_BAR_Index      : std_logic_vector(C_ENCODE_BAR_NUMBER-1 downto 0);
113
 
114
  -- Reset
115
  signal  local_Reset            : std_logic;
116
 
117
  -- Output signals
118
--  signal  trn_rdst_rdy_n_i       : std_logic;
119
  signal  trn_rnp_ok_n_i         : std_logic;
120
  signal  trn_rsrc_dsc_n_i       : std_logic;
121
 
122
  -- Throttle
123
  signal  trn_rx_throttle        : std_logic;
124
 
125
  signal  pio_reading_status_i   : std_logic;
126
  signal  pio_read_fading_cnt    : std_logic_vector(8-1 downto 0);
127
  signal  MRd_Has_3DW_Header     : std_logic;
128
  signal  MRd_Has_4DW_Header     : std_logic;
129
  signal  Tlp_is_Zero_Length     : std_logic;
130
  signal  Illegal_Leng_on_FIFO   : std_logic;
131
 
132
  -- Built-in single-port fifo as MRd channel buffer
133
  component v6_sfifo_15x128
134
    port (
135
          clk                  : IN  std_logic;
136
          rst                  : IN  std_logic;
137
          prog_full            : OUT std_logic;
138
--          wr_clk               : IN  std_logic;
139
          wr_en                : IN  std_logic;
140
          din                  : IN  std_logic_VECTOR(C_CHANNEL_BUF_WIDTH-1 downto 0);
141
          full                 : OUT std_logic;
142
--          rd_clk               : IN  std_logic;
143
          rd_en                : IN  std_logic;
144
          dout                 : OUT std_logic_VECTOR(C_CHANNEL_BUF_WIDTH-1 downto 0);
145
          prog_empty           : OUT std_logic;
146
          empty                : OUT std_logic
147
    );
148
  end component;
149
 
150
 
151
  -- Signal with MRd channel FIFO
152
  signal  pioCplD_din            : std_logic_vector(C_CHANNEL_BUF_WIDTH-1 downto 0);
153
  signal  pioCplD_Qout_wire      : std_logic_vector(C_CHANNEL_BUF_WIDTH-1 downto 0);
154
  signal  pioCplD_RE_i           : std_logic;
155
  signal  pioCplD_we             : std_logic;
156
  signal  pioCplD_empty_i        : std_logic;
157
  signal  pioCplD_full           : std_logic;
158
  signal  pioCplD_prog_Full      : std_logic;
159
  signal  pioCplD_empty_r1       : std_logic;
160
  signal  pioCplD_prog_full_r1   : std_logic;
161
 
162
  signal  pioCplD_Qout_i         : std_logic_vector(C_CHANNEL_BUF_WIDTH-1 downto 0);
163
  signal  pioCplD_Qout_reg       : std_logic_vector(C_CHANNEL_BUF_WIDTH-1 downto 0);
164
 
165
  -- Request for output arbitration
166
  signal  pioCplD_Req_i        : std_logic;
167
  signal  pioCplD_Leng         : std_logic_vector(C_TLP_FLD_WIDTH_OF_LENG-1 downto 0);
168
 
169
  -- Busy/Done state bits generation
170
  type FSM_Request is         (
171
                                 REQST_Idle
172
                               , REQST_1Read
173
                               , REQST_Decision
174
                               , REQST_nFIFO_Req
175
--                               , REQST_Quantity
176
--                               , REQST_FIFO_Req
177
                               );
178
 
179
  signal FSM_REQ_pio          : FSM_Request;
180
 
181
begin
182
 
183
   -- positive reset and local
184
   local_Reset       <= not trn_reset_n or Channel_Rst;
185
 
186
 
187
   -- MRd channel buffer control
188
--   pioCplD_RE_i      <= pioCplD_RE;
189
 
190
   pioCplD_Qout      <= pioCplD_Qout_i;
191
   pioCplD_Req       <= pioCplD_Req_i;  -- and not FIFO_Reading;
192
 
193
   pio_reading_status  <= pio_reading_status_i;
194
 
195
 
196
   -- Output to the core as handshaking
197
   trn_rsof_n_i      <= trn_rsof_n;
198
   trn_reof_n_i      <= trn_reof_n;
199
   trn_rd_i          <= trn_rd;
200
   trn_rrem_n_i      <= trn_rrem_n;
201
   trn_rerrfwd_n_i   <= trn_rerrfwd_n;
202
   trn_rsrc_dsc_n_i  <= trn_rsrc_dsc_n;
203
   trn_rbar_hit_n_i  <= trn_rbar_hit_n;
204
 
205
   -- Output to the core as handshaking
206
   trn_rnp_ok_n      <= trn_rnp_ok_n_i;
207
   trn_rnp_ok_n_i    <= pioCplD_prog_full_r1;
208
 
209
   -- ( trn_rsrc_rdy_n seems never deasserted during packet)
210
   trn_rx_throttle   <= trn_rsrc_rdy_n;    --  or trn_rdst_rdy_n_i;
211
 
212
 
213
-- ------------------------------------------------
214
-- Synchronous Delay: trn_rd + trn_rbar_hit_n
215
-- 
216
   Synch_Delay_trn_rd:
217
   process ( trn_clk )
218
   begin
219
      if trn_clk'event and trn_clk = '1' then
220
         trn_rd_r1          <= trn_rd_i;
221
         trn_rbar_hit_n_r1  <= trn_rbar_hit_n_i;
222
      end if;
223
 
224
   end process;
225
 
226
 
227
-- ------------------------------------------------
228
-- States synchronous
229
--
230
   Syn_RxTrn_States:
231
   process ( trn_clk, local_Reset)
232
   begin
233
      if local_Reset = '1' then
234
         RxMRdTrn_State   <= ST_MRd_RESET;
235
      elsif trn_clk'event and trn_clk = '1' then
236
         RxMRdTrn_State   <= RxMRdTrn_NextState;
237
      end if;
238
 
239
   end process;
240
 
241
 
242
-- Next States
243
   Comb_RxTrn_NextStates:
244
   process (
245
             RxMRdTrn_State
246
           , MRd_Type
247
--           , IORd_Type
248
           , trn_rx_throttle
249
           , trn_rnp_ok_n_i
250
           , trn_rsrc_dsc_n_i
251
           , trn_rerrfwd_n_i
252
           )
253
   begin
254
     case RxMRdTrn_State  is
255
 
256
        when ST_MRd_RESET =>
257
              RxMRdTrn_NextState <= ST_MRd_IDLE;
258
 
259
        when ST_MRd_IDLE =>
260
 
261
           if trn_rnp_ok_n_i='0' then
262
 
263
            case MRd_Type is
264
 
265
             when C_TLP_TYPE_IS_MRD_H3 =>
266
               RxMRdTrn_NextState <= ST_MRd_HEAD2;
267
             when C_TLP_TYPE_IS_MRD_H4 =>
268
               RxMRdTrn_NextState <= ST_MRd_HEAD2;
269
             when C_TLP_TYPE_IS_MRDLK_H3 =>
270
               RxMRdTrn_NextState <= ST_MRd_HEAD2;
271
             when C_TLP_TYPE_IS_MRDLK_H4 =>
272
               RxMRdTrn_NextState <= ST_MRd_HEAD2;
273
             when OTHERS =>
274
--               if IORd_Type='1' then   -- Temp taking IORd as MRd3
275
--                 RxMRdTrn_NextState <= ST_MRd3_HEAD1;
276
--               else
277
                 RxMRdTrn_NextState <= ST_MRd_IDLE;
278
--               end if;
279
 
280
            end case;  -- MRd_Type
281
 
282
           else
283
             RxMRdTrn_NextState <= ST_MRd_IDLE;
284
           end if;
285
 
286
 
287
        when ST_MRd_HEAD2 =>
288
           if trn_rx_throttle = '1' then
289
              RxMRdTrn_NextState <= ST_MRd_HEAD2;
290
           else
291
              RxMRdTrn_NextState <= ST_MRd_Tail;
292
           end if;
293
 
294
 
295
        when ST_MRd_Tail =>      -- support back-to-back transactions
296
 
297
           if trn_rnp_ok_n_i='0' then
298
 
299
            case MRd_Type is
300
 
301
             when C_TLP_TYPE_IS_MRD_H3 =>
302
               RxMRdTrn_NextState <= ST_MRd_HEAD2;
303
             when C_TLP_TYPE_IS_MRD_H4 =>
304
               RxMRdTrn_NextState <= ST_MRd_HEAD2;
305
             when C_TLP_TYPE_IS_MRDLK_H3 =>
306
               RxMRdTrn_NextState <= ST_MRd_HEAD2;
307
             when C_TLP_TYPE_IS_MRDLK_H4 =>
308
               RxMRdTrn_NextState <= ST_MRd_HEAD2;
309
             when OTHERS =>
310
--               if IORd_Type='1' then   -- Temp taking IORd as MRd3
311
--                 RxMRdTrn_NextState <= ST_MRd3_HEAD1;
312
--               else
313
                 RxMRdTrn_NextState <= ST_MRd_IDLE;
314
--               end if;
315
 
316
            end case;  -- MRd_Type
317
 
318
           else
319
             RxMRdTrn_NextState <= ST_MRd_IDLE;
320
           end if;
321
 
322
        when OTHERS =>
323
           RxMRdTrn_NextState <= ST_MRd_RESET;
324
 
325
     end case;
326
 
327
   end process;
328
 
329
 
330
 
331
-- ------------------------------------------------
332
-- Synchronous calculation: Encoded_BAR_Index
333
-- 
334
   Syn_Calc_Encoded_BAR_Index:
335
   process ( trn_clk, local_Reset)
336
   begin
337
      if local_Reset = '1' then
338
         Encoded_BAR_Index <= (OTHERS=>'1');
339
 
340
      elsif trn_clk'event and trn_clk = '1' then
341
 
342
         if    trn_rbar_hit_n(0)='0' then
343
            Encoded_BAR_Index <= CONV_STD_LOGIC_VECTOR(0, C_ENCODE_BAR_NUMBER);
344
         elsif trn_rbar_hit_n(1)='0' then
345
            Encoded_BAR_Index <= CONV_STD_LOGIC_VECTOR(1, C_ENCODE_BAR_NUMBER);
346
         elsif trn_rbar_hit_n(2)='0' then
347
            Encoded_BAR_Index <= CONV_STD_LOGIC_VECTOR(2, C_ENCODE_BAR_NUMBER);
348
         elsif trn_rbar_hit_n(3)='0' then
349
            Encoded_BAR_Index <= CONV_STD_LOGIC_VECTOR(3, C_ENCODE_BAR_NUMBER);
350
         elsif trn_rbar_hit_n(4)='0' then
351
            Encoded_BAR_Index <= CONV_STD_LOGIC_VECTOR(4, C_ENCODE_BAR_NUMBER);
352
         elsif trn_rbar_hit_n(5)='0' then
353
            Encoded_BAR_Index <= CONV_STD_LOGIC_VECTOR(5, C_ENCODE_BAR_NUMBER);
354
         elsif trn_rbar_hit_n(6)='0' then
355
            Encoded_BAR_Index <= CONV_STD_LOGIC_VECTOR(6, C_ENCODE_BAR_NUMBER);
356
         else
357
            Encoded_BAR_Index <= CONV_STD_LOGIC_VECTOR(7, C_ENCODE_BAR_NUMBER);
358
         end if;
359
 
360
      end if;
361
   end process;
362
 
363
 
364
-- ----------------------------------------------------------------------------------
365
-- 
366
-- Synchronous output: MRd FIFO write port
367
-- 
368
-- PIO Channel Buffer (128-bit) definition:
369
--     Note: Type not shows in this buffer
370
--
371
--  127 ~ xxx : Peripheral address
372
--  xxy ~  97 : reserved
373
--         96 : Zero-length
374
--         95 : reserved
375
--         94 : Valid
376
--   93 ~  68 : reserved
377
--   67 ~  65 : BAR number
378
--   64 ~  49 : Requester ID
379
--   48 ~  41 : Tag
380
--   40 ~  34 : Lower Address
381
--   33 ~  31 : Completion Status
382
--   30 ~  19 : Byte count
383
--
384
--   18 ~  17 : Format
385
--   16 ~  14 : TC
386
--         13 : TD
387
--         12 : EP
388
--   11 ~  10 : Attribute
389
--    9 ~   0 : Length
390
-- 
391
   RxFSM_Output_pioCplD_WR:
392
   process ( trn_clk, local_Reset)
393
   begin
394
      if local_Reset = '1' then
395
         pioCplD_we  <= '0';
396
         pioCplD_din <= (OTHERS=>'0');
397
 
398
      elsif trn_clk'event and trn_clk = '1' then
399
 
400
         case RxMRdTrn_State is
401
 
402
 
403
            when ST_MRd_HEAD2 =>
404
               pioCplD_we  <= '0';
405
 
406
               if Illegal_Leng_on_FIFO='1' then          -- Cpl : unsupported request
407
                 pioCplD_din(C_CHBUF_FMT_BIT_TOP downto C_CHBUF_FMT_BIT_BOT)
408
                             <= C_FMT3_NO_DATA;
409
                 pioCplD_din(C_CHBUF_CPLD_CS_BIT_TOP downto C_CHBUF_CPLD_CS_BIT_BOT)
410
                             <= "001";      --------------- ############
411
               else
412
                 pioCplD_din(C_CHBUF_FMT_BIT_TOP downto C_CHBUF_FMT_BIT_BOT)
413
                             <= C_FMT3_WITH_DATA;
414
                 pioCplD_din(C_CHBUF_CPLD_CS_BIT_TOP downto C_CHBUF_CPLD_CS_BIT_BOT)
415
                             <= "000";      --------------- ############
416
               end if;
417
 
418
 
419
               pioCplD_din(C_CHBUF_TC_BIT_TOP downto C_CHBUF_TC_BIT_BOT)
420
                           <= trn_rd_r1(C_TLP_TC_BIT_TOP downto C_TLP_TC_BIT_BOT);
421
 
422
               pioCplD_din(C_CHBUF_TD_BIT)  <= '0';
423
 
424
               pioCplD_din(C_CHBUF_EP_BIT)  <= '0';
425
 
426
               pioCplD_din(C_CHBUF_ATTR_BIT_TOP downto C_CHBUF_ATTR_BIT_BOT)
427
--                           <= trn_rd_r1(C_TLP_ATTR_BIT_TOP) & C_NO_SNOOP;  -- downto C_TLP_ATTR_BIT_BOT);
428
                           <= trn_rd_r1(C_TLP_ATTR_BIT_TOP downto C_TLP_ATTR_BIT_BOT);
429
 
430
               pioCplD_din(C_CHBUF_LENG_BIT_TOP downto C_CHBUF_LENG_BIT_BOT)
431
                             <= trn_rd_r1(C_TLP_LENG_BIT_TOP downto C_TLP_LENG_BIT_BOT);
432
 
433
               pioCplD_din(C_CHBUF_QVALID_BIT)  <= '1';
434
 
435
               pioCplD_din(C_CHBUF_CPLD_REQID_BIT_TOP downto C_CHBUF_CPLD_REQID_BIT_BOT)
436
                           <= trn_rd_r1(C_TLP_REQID_BIT_TOP downto C_TLP_REQID_BIT_BOT);
437
 
438
               pioCplD_din(C_CHBUF_CPLD_TAG_BIT_TOP downto C_CHBUF_CPLD_TAG_BIT_BOT)
439
                           <= trn_rd_r1(C_TLP_TAG_BIT_TOP downto C_TLP_TAG_BIT_BOT);
440
 
441
               pioCplD_din(C_CHBUF_0LENG_BIT) <= Tlp_is_Zero_Length;
442
 
443
               if Tlp_is_Zero_Length='1' then
444
                 pioCplD_din(C_CHBUF_CPLD_BAR_BIT_TOP downto C_CHBUF_CPLD_BAR_BIT_BOT)
445
                           <= CONV_STD_LOGIC_VECTOR(0, C_ENCODE_BAR_NUMBER);
446
               else
447
                 pioCplD_din(C_CHBUF_CPLD_BAR_BIT_TOP downto C_CHBUF_CPLD_BAR_BIT_BOT)
448
                           <= Encoded_BAR_Index;
449
               end if;
450
 
451
 
452
            when ST_MRd_Tail =>
453
 
454
              if MRd_Has_4DW_Header='1' then
455
                pioCplD_din(C_CHBUF_CPLD_LA_BIT_TOP downto C_CHBUF_CPLD_LA_BIT_BOT)
456
                             <= trn_rd_r1(C_CHBUF_CPLD_LA_BIT_TOP-C_CHBUF_CPLD_LA_BIT_BOT downto 0);
457
 
458
                if trn_rbar_hit_n_r1(CINT_REGS_SPACE_BAR)='0' then
459
                   pioCplD_din(C_CHBUF_PA_BIT_TOP downto C_CHBUF_PA_BIT_BOT)
460
                               <= trn_rd_r1(C_CHBUF_PA_BIT_TOP-C_CHBUF_PA_BIT_BOT downto 0);
461
--                   pioCplD_din(C_CHBUF_CPLD_BAR_BIT_TOP downto C_CHBUF_CPLD_BAR_BIT_BOT)
462
--                               <= CONV_STD_LOGIC_VECTOR(CINT_REGS_SPACE_BAR, C_ENCODE_BAR_NUMBER);   --- "000";
463
                elsif trn_rbar_hit_n_r1(CINT_BRAM_SPACE_BAR)='0' then
464
                   pioCplD_din(C_CHBUF_MA_BIT_TOP downto C_CHBUF_MA_BIT_BOT)
465
                               <= trn_rd_r1(C_CHBUF_MA_BIT_TOP-C_CHBUF_MA_BIT_BOT downto 0);
466
--                   pioCplD_din(C_CHBUF_CPLD_BAR_BIT_TOP downto C_CHBUF_CPLD_BAR_BIT_BOT)
467
--                               <= CONV_STD_LOGIC_VECTOR(CINT_BRAM_SPACE_BAR, C_ENCODE_BAR_NUMBER);   --- "001";
468
                elsif trn_rbar_hit_n_r1(CINT_DDR_SPACE_BAR)='0' then
469
                   pioCplD_din(C_CHBUF_DDA_BIT_TOP downto C_CHBUF_DDA_BIT_BOT)
470
                               <= trn_rd_r1(C_CHBUF_DDA_BIT_TOP-C_CHBUF_DDA_BIT_BOT downto 0);
471
--                   pioCplD_din(C_CHBUF_CPLD_BAR_BIT_TOP downto C_CHBUF_CPLD_BAR_BIT_BOT)
472
--                               <= CONV_STD_LOGIC_VECTOR(CINT_DDR_SPACE_BAR, C_ENCODE_BAR_NUMBER);   --- "001";
473
                else
474
                   pioCplD_din(C_CHBUF_PA_BIT_TOP downto C_CHBUF_PA_BIT_BOT)
475
                               <= C_ALL_ZEROS(C_CHBUF_PA_BIT_TOP downto C_CHBUF_PA_BIT_BOT);
476
--                   pioCplD_din(C_CHBUF_CPLD_BAR_BIT_TOP downto C_CHBUF_CPLD_BAR_BIT_BOT)
477
--                               <= C_ALL_ONES(C_CHBUF_CPLD_BAR_BIT_TOP downto C_CHBUF_CPLD_BAR_BIT_BOT);    --- "111" !!!
478
                end if;
479
 
480
              else
481
                pioCplD_din(C_CHBUF_CPLD_LA_BIT_TOP downto C_CHBUF_CPLD_LA_BIT_BOT)
482
                             <= trn_rd_r1(C_CHBUF_CPLD_LA_BIT_TOP-C_CHBUF_CPLD_LA_BIT_BOT+32 downto 32);
483
 
484
                if trn_rbar_hit_n_r1(CINT_REGS_SPACE_BAR)='0' then
485
                   pioCplD_din(C_CHBUF_PA_BIT_TOP downto C_CHBUF_PA_BIT_BOT)
486
                               <= trn_rd_r1(C_CHBUF_PA_BIT_TOP-C_CHBUF_PA_BIT_BOT+32 downto 32);
487
--                   pioCplD_din(C_CHBUF_CPLD_BAR_BIT_TOP downto C_CHBUF_CPLD_BAR_BIT_BOT)
488
--                               <= CONV_STD_LOGIC_VECTOR(CINT_REGS_SPACE_BAR, C_ENCODE_BAR_NUMBER);   --- "000";
489
                elsif trn_rbar_hit_n_r1(CINT_BRAM_SPACE_BAR)='0' then
490
                   pioCplD_din(C_CHBUF_MA_BIT_TOP downto C_CHBUF_MA_BIT_BOT)
491
                               <= trn_rd_r1(C_CHBUF_MA_BIT_TOP-C_CHBUF_MA_BIT_BOT+32 downto 32);
492
--                   pioCplD_din(C_CHBUF_CPLD_BAR_BIT_TOP downto C_CHBUF_CPLD_BAR_BIT_BOT)
493
--                               <= CONV_STD_LOGIC_VECTOR(CINT_BRAM_SPACE_BAR, C_ENCODE_BAR_NUMBER);   --- "001";
494
                elsif trn_rbar_hit_n_r1(CINT_DDR_SPACE_BAR)='0' then
495
                   pioCplD_din(C_CHBUF_DDA_BIT_TOP downto C_CHBUF_DDA_BIT_BOT)
496
                               <= trn_rd_r1(C_CHBUF_DDA_BIT_TOP-C_CHBUF_DDA_BIT_BOT+32 downto 32);
497
--                   pioCplD_din(C_CHBUF_CPLD_BAR_BIT_TOP downto C_CHBUF_CPLD_BAR_BIT_BOT)
498
--                               <= CONV_STD_LOGIC_VECTOR(CINT_DDR_SPACE_BAR, C_ENCODE_BAR_NUMBER);   --- "001";
499
                else
500
                   pioCplD_din(C_CHBUF_PA_BIT_TOP downto C_CHBUF_PA_BIT_BOT)
501
                               <= C_ALL_ZEROS(C_CHBUF_PA_BIT_TOP downto C_CHBUF_PA_BIT_BOT);
502
--                   pioCplD_din(C_CHBUF_CPLD_BAR_BIT_TOP downto C_CHBUF_CPLD_BAR_BIT_BOT)
503
--                               <= C_ALL_ONES(C_CHBUF_CPLD_BAR_BIT_TOP downto C_CHBUF_CPLD_BAR_BIT_BOT);    --- "111" !!!
504
                end if;
505
              end if;
506
 
507
 
508
              if pioCplD_din(C_CHBUF_0LENG_BIT) ='1' then   --  Zero-length
509
                 pioCplD_din(C_CHBUF_CPLD_BC_BIT_TOP downto C_CHBUF_CPLD_BC_BIT_BOT)
510
                          <= CONV_STD_LOGIC_VECTOR(1, C_CHBUF_CPLD_BC_BIT_TOP-C_CHBUF_CPLD_BC_BIT_BOT+1);
511
              else
512
                 pioCplD_din(C_CHBUF_CPLD_BC_BIT_TOP downto C_CHBUF_CPLD_BC_BIT_BOT)
513
                          <= pioCplD_din(C_CHBUF_LENG_BIT_TOP downto C_CHBUF_LENG_BIT_BOT) &"00";
514
              end if;
515
 
516
--              if trn_rbar_hit_n_r1(CINT_REGS_SPACE_BAR)='0'
517
--                 or trn_rbar_hit_n_r1(CINT_BRAM_SPACE_BAR)='0' 
518
--                 then
519
              if trn_rbar_hit_n_r1(CINT_BAR_SPACES-1 downto 0) /= C_ALL_ONES(CINT_BAR_SPACES-1 downto 0) then
520
                 pioCplD_we  <= not Tlp_straddles_4KB;                    --'1';
521
              else
522
                 pioCplD_we  <= '0';
523
              end if;
524
 
525
 
526
            when OTHERS =>
527
               pioCplD_we  <= '0';
528
               pioCplD_din <= pioCplD_din;
529
 
530
         end case;
531
 
532
      end if;
533
   end process;
534
 
535
 
536
-- -----------------------------------------------------------------------
537
-- Capture: MRd_Has_4DW_Header
538
--        : Tlp_is_Zero_Length
539
-- 
540
   Syn_Capture_MRd_Has_4DW_Header:
541
   process ( trn_clk, trn_reset_n)
542
   begin
543
      if trn_reset_n = '0' then
544
         MRd_Has_3DW_Header   <= '0';
545
         MRd_Has_4DW_Header   <= '0';
546
         Tlp_is_Zero_Length   <= '0';
547
         Illegal_Leng_on_FIFO <= '0';
548
      elsif trn_clk'event and trn_clk = '1' then
549
         if trn_rsof_n_i='0' then
550
            MRd_Has_3DW_Header   <= not trn_rd_i(C_TLP_FMT_BIT_BOT) and not trn_rd_i(C_TLP_FMT_BIT_BOT+1);
551
            MRd_Has_4DW_Header   <= trn_rd_i(C_TLP_FMT_BIT_BOT) and not trn_rd_i(C_TLP_FMT_BIT_BOT+1);
552
            Tlp_is_Zero_Length   <= not (trn_rd_i(3) or trn_rd_i(2) or trn_rd_i(1) or trn_rd_i(0));
553
            if     trn_rd_i(C_TLP_LENG_BIT_TOP downto C_TLP_LENG_BIT_BOT)/=CONV_STD_LOGIC_VECTOR(1, C_TLP_FLD_WIDTH_OF_LENG)
554
               and trn_rd_i(C_TLP_LENG_BIT_TOP downto C_TLP_LENG_BIT_BOT)/=CONV_STD_LOGIC_VECTOR(2, C_TLP_FLD_WIDTH_OF_LENG)
555
               and trn_rbar_hit_n(CINT_FIFO_SPACE_BAR)='0'
556
               then
557
              Illegal_Leng_on_FIFO  <= '1';
558
            else
559
              Illegal_Leng_on_FIFO  <= '0';
560
            end if;
561
         else
562
            MRd_Has_3DW_Header    <= MRd_Has_3DW_Header;
563
            MRd_Has_4DW_Header    <= MRd_Has_4DW_Header;
564
            Tlp_is_Zero_Length    <= Tlp_is_Zero_Length;
565
            Illegal_Leng_on_FIFO  <= Illegal_Leng_on_FIFO;
566
         end if;
567
      end if;
568
   end process;
569
 
570
 
571
-- -----------------------------------------------------------------------
572
-- syn
573
--        : pio_reading_status
574
-- 
575
   Syn_PIO_Reading_EB_Status:
576
   process ( trn_clk, trn_reset_n)
577
   begin
578
      if trn_reset_n = '0' then
579
         pio_reading_status_i <= '0';
580
         pio_read_fading_cnt  <= (OTHERS=>'0');
581
      elsif trn_clk'event and trn_clk = '1' then
582
         if trn_reof_n_i='0' then
583
            if  MRd_Has_4DW_Header='1'
584
            and trn_rbar_hit_n(CINT_REGS_SPACE_BAR)='0'
585
            and trn_rd_i(8-1 downto 0)=X"90" then
586
                pio_reading_status_i <= '1';
587
                pio_read_fading_cnt  <= X"E0";
588
            elsif MRd_Has_3DW_Header='1'
589
            and trn_rbar_hit_n(CINT_REGS_SPACE_BAR)='0'
590
            and trn_rd_i(32+8-1 downto 32)=X"90" then
591
                pio_reading_status_i <= '1';
592
                pio_read_fading_cnt  <= X"E0";
593
            elsif pio_read_fading_cnt(7)='1' then
594
                pio_reading_status_i <= '1';
595
                pio_read_fading_cnt  <= pio_read_fading_cnt + '1';
596
            else
597
                pio_reading_status_i <= '0';
598
                pio_read_fading_cnt  <= (OTHERS=>'0');
599
            end if;
600
         elsif pio_read_fading_cnt=X"00" then
601
                pio_reading_status_i <= '0';
602
                pio_read_fading_cnt  <= (OTHERS=>'0');
603
         else
604
                pio_reading_status_i <= pio_reading_status_i;
605
                pio_read_fading_cnt  <= pio_read_fading_cnt + '1';
606
         end if;
607
 
608
      end if;
609
   end process;
610
 
611
 
612
   -- -------------------------------------------------
613
   -- MRd TLP Buffer
614
   -- -------------------------------------------------
615
   pioCplD_Buffer:
616
   v6_sfifo_15x128
617
      port map (
618
         clk           => trn_clk,
619
         rst           => local_Reset,
620
         prog_full     => pioCplD_prog_Full,
621
--         wr_clk        => trn_clk,
622
         wr_en         => pioCplD_we,
623
         din           => pioCplD_din,
624
         full          => pioCplD_full,
625
--         rd_clk        => trn_clk,
626
         rd_en         => pioCplD_RE_i,
627
         dout          => pioCplD_Qout_wire,
628
         prog_empty    => open,
629
         empty         => pioCplD_empty_i
630
       );
631
 
632
 
633
-- ---------------------------------------------
634
--  Request for arbitration
635
-- 
636
   Synch_Req_Proc:
637
   process (local_Reset, trn_clk )
638
   begin
639
      if local_Reset = '1' then
640
         pioCplD_RE_i     <= '0';
641
         pioCplD_Qout_i   <= (OTHERS=>'0');
642
         pioCplD_Qout_reg <= (OTHERS=>'0');
643
         pioCplD_Leng     <= (0=>'1', OTHERS=>'0');
644
         pioCplD_Req_i    <= '0';
645
         FSM_REQ_pio      <= REQST_IDLE;
646
 
647
      elsif trn_clk'event and trn_clk = '1' then
648
 
649
         case FSM_REQ_pio  is
650
 
651
           when REQST_IDLE  =>
652
             if pioCplD_empty_i = '0' then
653
               pioCplD_RE_i   <= '1';
654
               pioCplD_Req_i  <= '0';
655
               pioCplD_Qout_i <= pioCplD_Qout_i;
656
               FSM_REQ_pio    <= REQST_1Read;
657
             else
658
               pioCplD_RE_i   <= '0';
659
               pioCplD_Req_i  <= '0';
660
               pioCplD_Qout_i <= pioCplD_Qout_i;
661
               FSM_REQ_pio    <= REQST_IDLE;
662
             end if;
663
 
664
           when REQST_1Read  =>
665
             pioCplD_RE_i   <= '0';
666
             pioCplD_Req_i  <= '0';
667
             pioCplD_Qout_i <= pioCplD_Qout_i;
668
             FSM_REQ_pio    <= REQST_Decision;
669
 
670
           when REQST_Decision  =>
671
             pioCplD_Qout_reg  <= pioCplD_Qout_wire;
672
             pioCplD_Leng      <= pioCplD_Qout_wire(C_CHBUF_LENG_BIT_TOP downto C_CHBUF_LENG_BIT_BOT);
673
             pioCplD_Qout_i    <= pioCplD_Qout_i;
674
--             if pioCplD_Qout_wire(C_CHBUF_FMT_BIT_TOP) = '1'  -- Has Payload
675
--               and pioCplD_Qout_wire(C_CHBUF_CPLD_BAR_BIT_TOP downto C_CHBUF_CPLD_BAR_BIT_BOT)
676
--                   =CONV_STD_LOGIC_VECTOR(CINT_FIFO_SPACE_BAR, C_ENCODE_BAR_NUMBER) 
677
--               then
678
--               pioCplD_RE_i  <= '0';
679
--               pioCplD_Req_i <= '0';
680
--               FSM_REQ_pio   <= REQST_Quantity;
681
--             else
682
               pioCplD_RE_i  <= '0';
683
               pioCplD_Req_i <= '1';
684
               FSM_REQ_pio   <= REQST_nFIFO_Req;
685
--             end if;
686
 
687
           when REQST_nFIFO_Req  =>
688
             if pioCplD_RE = '1' then
689
               pioCplD_RE_i   <= '0';
690
               pioCplD_Qout_i <= pioCplD_Qout_reg;
691
               pioCplD_Req_i  <= '0';
692
               FSM_REQ_pio    <= REQST_IDLE;
693
             else
694
               pioCplD_RE_i   <= '0';
695
               pioCplD_Qout_i <= pioCplD_Qout_i;
696
               pioCplD_Req_i  <= '1';
697
               FSM_REQ_pio    <= REQST_nFIFO_Req;
698
             end if;
699
 
700
--           when REQST_Quantity  =>
701
--             if FIFO_Empty='1' then
702
--               pioCplD_RE_i   <= '0';
703
--               pioCplD_Req_i  <= '0';
704
--               pioCplD_Qout_i <= pioCplD_Qout_i;
705
--               FSM_REQ_pio    <= REQST_Quantity;
706
--             else
707
--               pioCplD_RE_i   <= '0';
708
--               pioCplD_Qout_i <= pioCplD_Qout_i;
709
--               pioCplD_Req_i  <= '1';
710
--               FSM_REQ_pio    <= REQST_FIFO_Req;
711
--             end if;
712
--
713
--           when REQST_FIFO_Req  =>
714
--             if FIFO_Empty='1' then
715
--               pioCplD_RE_i   <= '0';
716
--               pioCplD_Req_i  <= '0';
717
--               pioCplD_Qout_i <= pioCplD_Qout_i;
718
--               FSM_REQ_pio    <= REQST_Quantity;
719
--             elsif pioCplD_RE = '1' then
720
--               pioCplD_RE_i   <= '0';
721
--               pioCplD_Qout_i <= pioCplD_Qout_reg;
722
--               pioCplD_Req_i  <= '0';
723
--               FSM_REQ_pio    <= REQST_IDLE;
724
--             else
725
--               pioCplD_RE_i   <= '0';
726
--               pioCplD_Qout_i <= pioCplD_Qout_i;
727
--               pioCplD_Req_i  <= '1';
728
--               FSM_REQ_pio    <= REQST_FIFO_Req;
729
--             end if;
730
 
731
           when OTHERS  =>
732
             pioCplD_RE_i     <= '0';
733
             pioCplD_Qout_i   <= (OTHERS=>'0');
734
             pioCplD_Qout_reg <= (OTHERS=>'0');
735
             pioCplD_Leng     <= (OTHERS=>'1');
736
             pioCplD_Req_i    <= '0';
737
             FSM_REQ_pio      <= REQST_IDLE;
738
 
739
         end case;
740
 
741
      end if;
742
   end process;
743
 
744
 
745
 
746
-- ---------------------------------------------
747
--  Delay of Empty and prog_Full
748
-- 
749
   Synch_Delay_empty_and_full:
750
   process ( trn_clk )
751
   begin
752
      if trn_clk'event and trn_clk = '1' then
753
         pioCplD_empty_r1      <= pioCplD_empty_i;
754
         pioCplD_prog_full_r1  <= pioCplD_prog_Full;
755
      end if;
756
   end process;
757
 
758
 
759
end architecture Behavioral;

powered by: WebSVN 2.1.0

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