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/] [rx_dsDMA_Channel.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:    dsDMA_Transact - Behavioral 
7
-- Project Name: 
8
-- Target Devices: 
9
-- Tool versions: 
10
-- Description: 
11
--
12
-- Dependencies: 
13
--
14
-- Revision 1.30 - DMA engine divided into 2 modules: calculation and FSM.  26.07.2007
15
--
16
-- Revision 1.20 - DMA engine shared out.   12.02.2007
17
--
18
-- Revision 1.10 - x4 timing constraints met.   02.02.2007
19
--
20
-- Revision 1.04 - Timing improved.     17.01.2007
21
--
22
-- Revision 1.02 - FIFO added.    20.12.2006
23
--
24
-- Revision 1.00 - first release. 14.12.2006
25
-- 
26
-- Additional Comments: 
27
--
28
----------------------------------------------------------------------------------
29
 
30
library IEEE;
31
use IEEE.STD_LOGIC_1164.ALL;
32
use IEEE.STD_LOGIC_ARITH.ALL;
33
use IEEE.STD_LOGIC_UNSIGNED.ALL;
34
 
35
library work;
36
use work.abb64Package.all;
37
 
38
-- Uncomment the following library declaration if instantiating
39
-- any Xilinx primitives in this code.
40
--library UNISIM;
41
--use UNISIM.VComponents.all;
42
 
43
entity dsDMA_Transact is
44
    port (
45
      -- downstream DMA Channel Buffer
46
      MRd_dsp_Req        : OUT std_logic;
47
      MRd_dsp_RE         : IN  std_logic;
48
      MRd_dsp_Qout       : OUT std_logic_vector(C_CHANNEL_BUF_WIDTH-1 downto 0);
49
 
50
      -- Downstream reset from MWr channel
51
      dsDMA_Channel_Rst  : IN  std_logic;
52
 
53
      -- Downstream Registers from MWr Channel
54
      DMA_ds_PA          : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
55
      DMA_ds_HA          : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
56
      DMA_ds_BDA         : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
57
      DMA_ds_Length      : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
58
      DMA_ds_Control     : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
59
      dsDMA_BDA_eq_Null  : IN  std_logic;
60
 
61
      -- Calculation in advance, for better timing
62
      dsHA_is_64b        : IN  std_logic;
63
      dsBDA_is_64b       : IN  std_logic;
64
 
65
      -- Calculation in advance, for better timing
66
      dsLeng_Hi19b_True  : IN  std_logic;
67
      dsLeng_Lo7b_True   : IN  std_logic;
68
 
69
      -- from Cpl/D channel
70
      dsDMA_dex_Tag      : IN  std_logic_vector(C_TAG_WIDTH-1 downto 0);
71
 
72
      -- Downstream Control Signals from MWr Channel
73
      dsDMA_Start        : IN  std_logic;   -- out of 1st dex
74
      dsDMA_Stop         : IN  std_logic;   -- out of 1st dex
75
 
76
 
77
      -- Downstream Control Signals from CplD Channel
78
      dsDMA_Start2       : IN  std_logic;   -- out of consecutive dex
79
      dsDMA_Stop2        : IN  std_logic;   -- out of consecutive dex
80
 
81
      -- Downstream DMA Acknowledge to the start command
82
      DMA_Cmd_Ack        : OUT std_logic;
83
 
84
      -- Downstream Handshake Signals with CplD Channel for Busy/Done
85
      Tag_Map_Clear      : IN  std_logic_vector(C_TAG_MAP_WIDTH-1 downto 0);
86
      FC_pop             : IN  std_logic;
87
 
88
      -- Downstream tRAM port A write request
89
      tRAM_weB           : OUT std_logic;
90
      tRAM_AddrB         : OUT std_logic_vector(C_TAGRAM_AWIDTH-1 downto 0);
91
      tRAM_dinB          : OUT std_logic_vector(C_TAGRAM_DWIDTH-1 downto 0);
92
 
93
      -- To Interrupt module
94
      DMA_Done           : OUT std_logic;
95
      DMA_TimeOut        : OUT std_logic;
96
      DMA_Busy           : OUT std_logic;
97
 
98
      -- To Tx Port
99
      DMA_ds_Status      : OUT std_logic_vector(C_DBUS_WIDTH-1 downto 0);
100
 
101
      -- Additional
102
      cfg_dcommand       : IN  std_logic_vector(C_CFG_COMMAND_DWIDTH-1 downto 0);
103
 
104
      -- Common ports
105
      trn_clk            : IN  std_logic
106
    );
107
 
108
end entity dsDMA_Transact;
109
 
110
 
111
 
112
architecture Behavioral of dsDMA_Transact is
113
 
114
  signal  FC_push              : std_logic;
115
  signal  FC_counter           : std_logic_vector(C_TAGRAM_AWIDTH-1 downto 0);
116
  signal  dsFC_stop            : std_logic;
117
  signal  dsFC_stop_128B       : std_logic;
118
  signal  dsFC_stop_256B       : std_logic;
119
  signal  dsFC_stop_512B       : std_logic;
120
  signal  dsFC_stop_1024B      : std_logic;
121
  signal  dsFC_stop_2048B      : std_logic;
122
  signal  dsFC_stop_4096B      : std_logic;
123
 
124
  -- Reset
125
  signal  Local_Reset_i        : std_logic;
126
 
127
  signal  cfg_MRS              : std_logic_vector(C_CFG_MRS_BIT_TOP-C_CFG_MRS_BIT_BOT downto 0);
128
 
129
  -- Tag RAM port B write
130
  signal  tRAM_dinB_i          : std_logic_vector(C_TAGRAM_DWIDTH-1 downto 0);
131
  signal  tRAM_AddrB_i         : std_logic_vector(C_TAGRAM_AWIDTH-1 downto 0);
132
  signal  tRAM_weB_i           : std_logic;
133
 
134
 
135
  -- DMA calculation
136
  COMPONENT DMA_Calculate
137
    PORT(
138
      -- Downstream Registers from MWr Channel
139
      DMA_PA             : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);  -- EP   (local)
140
      DMA_HA             : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);  -- Host (remote)
141
      DMA_BDA            : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
142
      DMA_Length         : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
143
      DMA_Control        : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
144
 
145
      -- Calculation in advance, for better timing
146
      HA_is_64b          : IN  std_logic;
147
      BDA_is_64b         : IN  std_logic;
148
 
149
      -- Calculation in advance, for better timing
150
      Leng_Hi19b_True    : IN  std_logic;
151
      Leng_Lo7b_True     : IN  std_logic;
152
 
153
 
154
      -- Parameters fed to DMA_FSM
155
      DMA_PA_Loaded      : OUT std_logic_vector(C_DBUS_WIDTH-1 downto 0);
156
      DMA_PA_Var         : OUT std_logic_vector(C_DBUS_WIDTH-1 downto 0);
157
      DMA_HA_Var         : OUT std_logic_vector(C_DBUS_WIDTH-1 downto 0);
158
 
159
      DMA_BDA_fsm        : OUT std_logic_vector(C_DBUS_WIDTH-1 downto 0);
160
      BDA_is_64b_fsm     : OUT std_logic;
161
 
162
      -- Only for downstream channel
163
      DMA_PA_Snout       : OUT std_logic_vector(C_DBUS_WIDTH-1 downto 0);
164
      DMA_BAR_Number     : OUT std_logic_vector(C_TAGBAR_BIT_TOP-C_TAGBAR_BIT_BOT downto 0);
165
 
166
      -- 
167
      DMA_Snout_Length   : OUT std_logic_vector(C_MAXSIZE_FLD_BIT_TOP downto 0);
168
      DMA_Body_Length    : OUT std_logic_vector(C_MAXSIZE_FLD_BIT_TOP downto 0);
169
      DMA_Tail_Length    : OUT std_logic_vector(C_TLP_FLD_WIDTH_OF_LENG+1 downto 0);
170
 
171
 
172
      -- Engine control signals
173
      DMA_Start          : IN  std_logic;
174
      DMA_Start2         : IN  std_logic;   -- out of consecutive dex
175
 
176
      -- Control signals to FSM
177
      No_More_Bodies     : OUT std_logic;
178
      ThereIs_Snout      : OUT std_logic;
179
      ThereIs_Body       : OUT std_logic;
180
      ThereIs_Tail       : OUT std_logic;
181
      ThereIs_Dex        : OUT std_logic;
182
      HA64bit            : OUT std_logic;
183
      Addr_Inc           : OUT std_logic;
184
 
185
      -- FSM indicators
186
      State_Is_LoadParam : IN  std_logic;
187
      State_Is_Snout     : IN  std_logic;
188
      State_Is_Body      : IN  std_logic;
189
--      State_Is_Tail      : IN  std_logic;
190
 
191
      -- Additional
192
      Param_Max_Cfg      : IN  std_logic_vector(2 downto 0);
193
 
194
      -- Common ports
195
      dma_clk            : IN  std_logic;
196
      dma_reset          : IN  std_logic
197
      );
198
  END COMPONENT;
199
 
200
  signal  dsDMA_PA_Loaded      : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
201
  signal  dsDMA_PA_Var         : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
202
  signal  dsDMA_HA_Var         : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
203
 
204
  signal  dsDMA_BDA_fsm        : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
205
  signal  dsBDA_is_64b_fsm     : std_logic;
206
 
207
  signal  dsDMA_PA_snout       : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
208
 
209
  signal  dsDMA_BAR_Number     : std_logic_vector(C_TAGBAR_BIT_TOP-C_TAGBAR_BIT_BOT downto 0);
210
 
211
  signal  dsDMA_Snout_Length   : std_logic_vector(C_MAXSIZE_FLD_BIT_TOP downto 0);
212
  signal  dsDMA_Body_Length    : std_logic_vector(C_MAXSIZE_FLD_BIT_TOP downto 0);
213
  signal  dsDMA_Tail_Length    : std_logic_vector(C_TLP_FLD_WIDTH_OF_LENG+1 downto 0);
214
 
215
  signal  dsNo_More_Bodies     : std_logic;
216
  signal  dsThereIs_Snout      : std_logic;
217
  signal  dsThereIs_Body       : std_logic;
218
  signal  dsThereIs_Tail       : std_logic;
219
  signal  dsThereIs_Dex        : std_logic;
220
  signal  dsHA64bit            : std_logic;
221
  signal  ds_AInc              : std_logic;
222
 
223
  -- DMA state machine
224
  COMPONENT DMA_FSM
225
    PORT(
226
      -- Fixed information for 1st header of TLP: MRd/MWr
227
      TLP_Has_Payload    : IN  std_logic;
228
      TLP_Hdr_is_4DW     : IN  std_logic;
229
      DMA_Addr_Inc       : IN  std_logic;
230
 
231
      DMA_BAR_Number     : IN  std_logic_vector(C_TAGBAR_BIT_TOP-C_TAGBAR_BIT_BOT downto 0);
232
 
233
      -- FSM control signals
234
      DMA_Start          : IN  std_logic;
235
      DMA_Start2         : IN  std_logic;
236
      DMA_Stop           : IN  std_logic;
237
      DMA_Stop2          : IN  std_logic;
238
 
239
      No_More_Bodies     : IN  std_logic;
240
      ThereIs_Snout      : IN  std_logic;
241
      ThereIs_Body       : IN  std_logic;
242
      ThereIs_Tail       : IN  std_logic;
243
      ThereIs_Dex        : IN  std_logic;
244
 
245
      -- Parameters to be written into ChBuf
246
      DMA_PA_Loaded      : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
247
      DMA_PA_Var         : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
248
      DMA_HA_Var         : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
249
 
250
      DMA_BDA_fsm        : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
251
      BDA_is_64b_fsm     : IN  std_logic;
252
 
253
      DMA_Snout_Length   : IN  std_logic_vector(C_MAXSIZE_FLD_BIT_TOP downto 0);
254
      DMA_Body_Length    : IN  std_logic_vector(C_MAXSIZE_FLD_BIT_TOP downto 0);
255
      DMA_Tail_Length    : IN  std_logic_vector(C_TLP_FLD_WIDTH_OF_LENG+1 downto 0);
256
 
257
      -- Busy/Done conditions
258
      Done_Condition_1   : IN  std_logic;
259
      Done_Condition_2   : IN  std_logic;
260
      Done_Condition_3   : IN  std_logic;
261
      Done_Condition_4   : IN  std_logic;
262
      Done_Condition_5   : IN  std_logic;
263
 
264
 
265
      -- Channel buffer write
266
      us_MWr_Param_Vec   : IN  std_logic_vector(6-1   downto 0);
267
      ChBuf_aFull        : IN  std_logic;
268
      ChBuf_WrEn         : OUT std_logic;
269
      ChBuf_WrDin        : OUT std_logic_vector(C_CHANNEL_BUF_WIDTH-1 downto 0);
270
 
271
 
272
      -- FSM indicators
273
      State_Is_LoadParam : OUT std_logic;
274
      State_Is_Snout     : OUT std_logic;
275
      State_Is_Body      : OUT std_logic;
276
      State_Is_Tail      : OUT std_logic;
277
      DMA_Cmd_Ack        : OUT std_logic;
278
 
279
      -- To Tx Port
280
      ChBuf_ValidRd      : IN  std_logic;
281
      BDA_nAligned       : OUT std_logic;
282
      DMA_TimeOut        : OUT std_logic;
283
      DMA_Busy           : OUT std_logic;
284
      DMA_Done           : OUT std_logic;
285
--      DMA_Done_Rise      : OUT std_logic;
286
 
287
      -- Tags
288
      Pkt_Tag            : IN  std_logic_vector(C_TAG_WIDTH-1 downto 0);
289
      Dex_Tag            : IN  std_logic_vector(C_TAG_WIDTH-1 downto 0);
290
 
291
      -- Common ports
292
      dma_clk            : IN  std_logic;
293
      dma_reset          : IN  std_logic
294
    );
295
  END COMPONENT;
296
 
297
  signal  Tag_DMA_dsp          : std_logic_vector(C_TAG_WIDTH-1 downto  0);
298
 
299
  -- FSM state indicators
300
  signal  dsState_Is_LoadParam : std_logic;
301
  signal  dsState_Is_Snout     : std_logic;
302
  signal  dsState_Is_Body      : std_logic;
303
  signal  dsState_Is_Tail      : std_logic;
304
 
305
  signal  dsChBuf_ValidRd      : std_logic;
306
  signal  dsBDA_nAligned       : std_logic;
307
  signal  dsDMA_TimeOut_i      : std_logic;
308
  signal  dsDMA_Busy_i         : std_logic;
309
  signal  dsDMA_Done_i         : std_logic;
310
 
311
  signal  DMA_Status_i         : std_logic_vector(C_DBUS_WIDTH-1 downto 0);
312
 
313
  ---------------------------------------------------------------
314
  --    Done state identification uses 2^C_TAGRAM_AWIDTH bits, 2 stages logic
315
  signal  Tag_Map_Bits         : std_logic_vector(C_TAG_MAP_WIDTH-1 downto 0);
316
  signal  Tag_Map_filling      : std_logic_vector(C_SUB_TAG_MAP_WIDTH-1 downto 0);
317
  signal  All_CplD_have_come   : std_logic;
318
 
319
 
320
  -- Built-in single-port fifo as downstream DMA channel buffer
321
  --   128-bit wide, for 64-bit address
322
  component v6_sfifo_15x128
323
    port (
324
          clk                  : IN  std_logic;
325
          rst                  : IN  std_logic;
326
          prog_full            : OUT std_logic;
327
--          wr_clk             : IN  std_logic;
328
          wr_en                : IN  std_logic;
329
          din                  : IN  std_logic_VECTOR(C_CHANNEL_BUF_WIDTH-1 downto 0);
330
          full                 : OUT std_logic;
331
--          rd_clk             : IN  std_logic;
332
          rd_en                : IN  std_logic;
333
          dout                 : OUT std_logic_VECTOR(C_CHANNEL_BUF_WIDTH-1 downto 0);
334
          prog_empty           : OUT std_logic;
335
          empty                : OUT std_logic
336
    );
337
  end component;
338
 
339
  -- Signal with DMA_downstream channel FIFO
340
  signal  MRd_dsp_din          : std_logic_vector(C_CHANNEL_BUF_WIDTH-1 downto 0);
341
  signal  MRd_dsp_dout         : std_logic_vector(C_CHANNEL_BUF_WIDTH-1 downto 0);
342
  signal  MRd_dsp_re_i         : std_logic;
343
  signal  MRd_dsp_we           : std_logic;
344
  signal  MRd_dsp_empty_i      : std_logic;
345
  signal  MRd_dsp_full         : std_logic;
346
  signal  MRd_dsp_prog_Full    : std_logic;
347
 
348
  signal  MRd_dsp_prog_Full_r1 : std_logic;
349
  signal  MRd_dsp_re_r1        : std_logic;
350
  signal  MRd_dsp_empty_r1     : std_logic;
351
 
352
  -- Request for output arbitration
353
  signal  MRd_dsp_Req_i        : std_logic;
354
 
355
 
356
begin
357
 
358
   -- DMA done signal
359
   DMA_Done          <= dsDMA_Done_i;
360
   DMA_TimeOut       <= dsDMA_TimeOut_i;
361
   DMA_Busy          <= dsDMA_Busy_i;
362
 
363
   -- connecting FIFO's signals
364
   MRd_dsp_Qout      <= MRd_dsp_dout;
365
   MRd_dsp_re_i      <= MRd_dsp_RE;
366
   MRd_dsp_Req       <= MRd_dsp_Req_i;
367
 
368
   --  tag RAM write request signals
369
   tRAM_weB          <= tRAM_weB_i;
370
   tRAM_AddrB        <= tRAM_AddrB_i;
371
   tRAM_dinB         <= tRAM_dinB_i;
372
 
373
 
374
   -- positive local reset
375
   Local_Reset_i     <= dsDMA_Channel_Rst;
376
 
377
   -- Max Read Request Size bits
378
   cfg_MRS           <= cfg_dcommand(C_CFG_MRS_BIT_TOP downto C_CFG_MRS_BIT_BOT);
379
 
380
 
381
   -- Kernel Engine
382
   ds_DMA_Calculation:
383
   DMA_Calculate
384
   PORT MAP(
385
 
386
            DMA_PA             => DMA_ds_PA        ,
387
            DMA_HA             => DMA_ds_HA        ,
388
            DMA_BDA            => DMA_ds_BDA       ,
389
            DMA_Length         => DMA_ds_Length    ,
390
            DMA_Control        => DMA_ds_Control   ,
391
 
392
            HA_is_64b          => dsHA_is_64b        ,
393
            BDA_is_64b         => dsBDA_is_64b       ,
394
 
395
            Leng_Hi19b_True    => dsLeng_Hi19b_True  ,
396
            Leng_Lo7b_True     => dsLeng_Lo7b_True   ,
397
 
398
            DMA_PA_Loaded      => dsDMA_PA_Loaded  ,
399
            DMA_PA_Var         => dsDMA_PA_Var     ,
400
            DMA_HA_Var         => dsDMA_HA_Var     ,
401
 
402
            DMA_BDA_fsm        => dsDMA_BDA_fsm    ,
403
            BDA_is_64b_fsm     => dsBDA_is_64b_fsm ,
404
 
405
            -- Only for downstream channel
406
            DMA_PA_Snout       => dsDMA_PA_snout   ,
407
            DMA_BAR_Number     => dsDMA_BAR_Number ,
408
 
409
            -- Lengths
410
            DMA_Snout_Length   => dsDMA_Snout_Length ,
411
            DMA_Body_Length    => dsDMA_Body_Length  ,
412
            DMA_Tail_Length    => dsDMA_Tail_Length  ,
413
 
414
            -- Control signals to FSM
415
            No_More_Bodies     => dsNo_More_Bodies   ,
416
            ThereIs_Snout      => dsThereIs_Snout    ,
417
            ThereIs_Body       => dsThereIs_Body     ,
418
            ThereIs_Tail       => dsThereIs_Tail     ,
419
            ThereIs_Dex        => dsThereIs_Dex      ,
420
            HA64bit            => dsHA64bit          ,
421
            Addr_Inc           => ds_AInc            ,
422
 
423
 
424
            DMA_Start          => dsDMA_Start       ,
425
            DMA_Start2         => dsDMA_Start2      ,
426
 
427
            State_Is_LoadParam => dsState_Is_LoadParam ,
428
            State_Is_Snout     => dsState_Is_Snout     ,
429
            State_Is_Body      => dsState_Is_Body      ,
430
--            State_Is_Tail      => dsState_Is_Tail      ,
431
 
432
            Param_Max_Cfg      => cfg_MRS       ,
433
 
434
            dma_clk            => trn_clk       ,
435
            dma_reset          => Local_Reset_i
436
   );
437
 
438
 
439
   -- Kernel FSM
440
   ds_DMA_StateMachine:
441
   DMA_FSM
442
   PORT MAP(
443
            TLP_Has_Payload    => '0'               ,
444
            TLP_Hdr_is_4DW     => dsHA64bit         ,
445
            DMA_Addr_Inc       => '0'               ,    -- of any value
446
 
447
            DMA_BAR_Number     => dsDMA_BAR_Number  ,
448
 
449
            DMA_Start          => dsDMA_Start       ,
450
            DMA_Start2         => dsDMA_Start2      ,
451
            DMA_Stop           => dsDMA_Stop        ,
452
            DMA_Stop2          => dsDMA_Stop2       ,
453
 
454
            -- Control signals to FSM
455
            No_More_Bodies     => dsNo_More_Bodies   ,
456
            ThereIs_Snout      => dsThereIs_Snout    ,
457
            ThereIs_Body       => dsThereIs_Body     ,
458
            ThereIs_Tail       => dsThereIs_Tail     ,
459
            ThereIs_Dex        => dsThereIs_Dex      ,
460
 
461
            DMA_PA_Loaded      => dsDMA_PA_Loaded  ,
462
            DMA_PA_Var         => dsDMA_PA_Var     ,
463
            DMA_HA_Var         => dsDMA_HA_Var     ,
464
 
465
            DMA_BDA_fsm        => dsDMA_BDA_fsm    ,
466
            BDA_is_64b_fsm     => dsBDA_is_64b_fsm ,
467
 
468
            DMA_Snout_Length   => dsDMA_Snout_Length ,
469
            DMA_Body_Length    => dsDMA_Body_Length  ,
470
            DMA_Tail_Length    => dsDMA_Tail_Length  ,
471
 
472
            ChBuf_ValidRd      => dsChBuf_ValidRd,
473
            BDA_nAligned       => dsBDA_nAligned ,
474
            DMA_TimeOut        => dsDMA_TimeOut_i,
475
            DMA_Busy           => dsDMA_Busy_i   ,
476
            DMA_Done           => dsDMA_Done_i   ,
477
--            DMA_Done_Rise      => open         ,
478
 
479
            Pkt_Tag            => Tag_DMA_dsp        ,
480
            Dex_Tag            => dsDMA_dex_Tag      ,
481
 
482
            Done_Condition_1   => '1' ,
483
            Done_Condition_2   => MRd_dsp_empty_r1   ,
484
            Done_Condition_3   => '1' ,
485
            Done_Condition_4   => '1' ,
486
            Done_Condition_5   => All_CplD_have_come ,
487
 
488
            us_MWr_Param_Vec   => "000000"             ,
489
            ChBuf_aFull        => MRd_dsp_prog_Full_r1 ,
490
            ChBuf_WrEn         => MRd_dsp_we        ,
491
            ChBuf_WrDin        => MRd_dsp_din       ,
492
 
493
            State_Is_LoadParam => dsState_Is_LoadParam ,
494
            State_Is_Snout     => dsState_Is_Snout     ,
495
            State_Is_Body      => dsState_Is_Body      ,
496
            State_Is_Tail      => dsState_Is_Tail      ,
497
 
498
            DMA_Cmd_Ack        => DMA_Cmd_Ack     ,
499
 
500
            dma_clk            => trn_clk       ,
501
            dma_reset          => Local_Reset_i
502
   );
503
 
504
   dsChBuf_ValidRd     <= MRd_dsp_RE;   -- MRd_dsp_re_i and not MRd_dsp_empty_i;
505
 
506
-- -------------------------------------------------
507
--
508
   DMA_ds_Status       <= DMA_Status_i;
509
-- 
510
-- Synchronous output: DMA_Status
511
-- 
512
   DS_DMA_Status_Concat:
513
   process ( trn_clk, Local_Reset_i)
514
   begin
515
      if Local_Reset_i = '1' then
516
         DMA_Status_i <= (OTHERS =>'0');
517
 
518
      elsif trn_clk'event and trn_clk = '1' then
519
 
520
         DMA_Status_i <= (
521
                          CINT_BIT_DMA_STAT_NALIGN  => dsBDA_nAligned,
522
                          CINT_BIT_DMA_STAT_TIMEOUT => dsDMA_TimeOut_i,
523
                          CINT_BIT_DMA_STAT_BDANULL => dsDMA_BDA_eq_Null,
524
                          CINT_BIT_DMA_STAT_BUSY    => dsDMA_Busy_i,
525
                          CINT_BIT_DMA_STAT_DONE    => dsDMA_Done_i,
526
                          Others                    => '0'
527
                         );
528
 
529
      end if;
530
   end process;
531
 
532
 
533
-- -------------------------------------------------------------
534
-- Synchronous reg: tRAM_weB
535
--                  tRAM_AddrB
536
--                  tRAM_dinB
537
--
538
   FSM_dsDMA_tRAM_PortB:
539
   process ( trn_clk, Local_Reset_i)
540
   begin
541
      if Local_Reset_i = '1' then
542
         tRAM_weB_i     <= '0';
543
         tRAM_AddrB_i   <= (OTHERS =>'1');
544
         tRAM_dinB_i    <= (OTHERS =>'0');
545
      elsif trn_clk'event and trn_clk = '1' then
546
 
547
         tRAM_AddrB_i   <= Tag_DMA_dsp(C_TAGRAM_AWIDTH-1 downto 0);
548
 
549
         tRAM_weB_i     <= dsState_Is_Snout
550
                        or dsState_Is_Body
551
                        or dsState_Is_Tail;
552
 
553
         if    dsState_Is_Snout='1' then
554
               tRAM_dinB_i  <=
555
                               ds_AInc           -- DMA_ds_Control(CINT_BIT_DMA_CTRL_AINC)
556
                             & dsDMA_BAR_Number  -- (C_TAGBAR_BIT_TOP-C_TAGBAR_BIT_BOT downto 0)
557
                             & dsDMA_PA_snout(C_TAGBAR_BIT_BOT-1 downto 2)&"00"
558
                             ;
559
         elsif dsState_Is_Body='1' then
560
               tRAM_dinB_i  <=
561
                               ds_AInc           -- DMA_ds_Control(CINT_BIT_DMA_CTRL_AINC)
562
                             & dsDMA_BAR_Number  -- (C_TAGBAR_BIT_TOP-C_TAGBAR_BIT_BOT downto 0)
563
                             & dsDMA_PA_Var(C_TAGBAR_BIT_BOT-1 downto 2) &"00"
564
                             ;
565
         elsif dsState_Is_Tail='1' then
566
               tRAM_dinB_i  <=
567
                               ds_AInc           -- DMA_ds_Control(CINT_BIT_DMA_CTRL_AINC)
568
                             & dsDMA_BAR_Number  -- (C_TAGBAR_BIT_TOP-C_TAGBAR_BIT_BOT downto 0)
569
                             & dsDMA_PA_Var(C_TAGBAR_BIT_BOT-1 downto 2) &"00"
570
                             ;
571
         else
572
               tRAM_dinB_i  <= (Others=>'0');
573
 
574
         end if;
575
 
576
      end if;
577
   end process;
578
 
579
 
580
-- ------------------------------------------
581
--  Loop:  Tag_Map
582
-- 
583
   Sync_Tag_set_reset_Bits:
584
   process ( trn_clk, Local_Reset_i)
585
   begin
586
      if Local_Reset_i = '1' then
587
         Tag_Map_Bits   <= (Others=>'0');
588
 
589
      elsif trn_clk'event and trn_clk = '1' then
590
 
591
         FOR j IN 0 TO C_TAG_MAP_WIDTH-1 LOOP
592
            if  tRAM_AddrB_i=CONV_STD_LOGIC_VECTOR(j, C_TAGRAM_AWIDTH) and tRAM_weB_i='1' then
593
                Tag_Map_Bits(j)   <= '1';
594
            elsif Tag_Map_Clear(j)='1' then
595
                Tag_Map_Bits(j)   <= '0';
596
            else
597
                Tag_Map_Bits(j)   <= Tag_Map_Bits(j);
598
            end if;
599
         END LOOP;
600
 
601
      end if;
602
   end process;
603
 
604
 
605
-- ------------------------------------------
606
-- Determination: All_CplD_have_come
607
-- 
608
   Sync_Reg_All_CplD_have_come:
609
   process ( trn_clk, Local_Reset_i)
610
   begin
611
      if Local_Reset_i = '1' then
612
         Tag_Map_filling     <= (OTHERS =>'0');
613
         All_CplD_have_come  <= '0';
614
 
615
      elsif trn_clk'event and trn_clk = '1' then
616
 
617
         FOR k IN 0 TO C_SUB_TAG_MAP_WIDTH-1 LOOP
618
            if  Tag_Map_Bits((C_TAG_MAP_WIDTH/C_SUB_TAG_MAP_WIDTH)*(k+1)-1 downto (C_TAG_MAP_WIDTH/C_SUB_TAG_MAP_WIDTH)*k)
619
               = C_ALL_ZEROS((C_TAG_MAP_WIDTH/C_SUB_TAG_MAP_WIDTH)*(k+1)-1 downto (C_TAG_MAP_WIDTH/C_SUB_TAG_MAP_WIDTH)*k)
620
               then
621
                Tag_Map_filling(k)   <= '1';
622
            else
623
                Tag_Map_filling(k)   <= '0';
624
            end if;
625
         END LOOP;
626
 
627
         -- final signal :  All_CplD_have_come
628
         if    Tag_Map_filling=C_ALL_ONES(C_SUB_TAG_MAP_WIDTH-1 downto 0) then
629
             All_CplD_have_come   <= '1';
630
         else
631
             All_CplD_have_come   <= '0';
632
         end if;
633
 
634
 
635
      end if;
636
   end process;
637
 
638
 
639
 
640
-- ------------------------------------------
641
-- Synchronous Output: Tag_DMA_dsp
642
-- 
643
   FSM_dsDMA_Tag_DMA_dsp:
644
   process ( trn_clk, Local_Reset_i)
645
   begin
646
      if Local_Reset_i = '1' then
647
         Tag_DMA_dsp    <= (OTHERS =>'0');
648
 
649
      elsif trn_clk'event and trn_clk = '1' then
650
 
651
         if    dsState_Is_Snout='1'
652
            or dsState_Is_Body='1'
653
            or dsState_Is_Tail='1'
654
            then
655
            Tag_DMA_dsp    <= '0' & dsDMA_BAR_Number(1)
656
                            & ( Tag_DMA_dsp(C_TAGRAM_AWIDTH-1 downto 0)
657
                              + CONV_STD_LOGIC_VECTOR(1, C_TAGRAM_AWIDTH));
658
         else
659
            Tag_DMA_dsp    <= '0' & dsDMA_BAR_Number(1)
660
                            & Tag_DMA_dsp(C_TAGRAM_AWIDTH-1 downto 0);
661
         end if;
662
 
663
      end if;
664
   end process;
665
 
666
 
667
 
668
   -- -------------------------------------------------
669
   -- ds MRd TLP Buffer
670
   -- -------------------------------------------------
671
   DMA_DSP_Buffer:
672
   v6_sfifo_15x128
673
      port map (
674
         clk           => trn_clk,
675
         rst           => Local_Reset_i,
676
         prog_full     => MRd_dsp_prog_Full,
677
--         wr_clk        => trn_clk,
678
         wr_en         => MRd_dsp_we,
679
         din           => MRd_dsp_din,
680
         full          => MRd_dsp_full,
681
--         rd_clk        => trn_clk,
682
         rd_en         => MRd_dsp_re_i,
683
         dout          => MRd_dsp_dout,
684
         prog_empty    => open,
685
         empty         => MRd_dsp_empty_i
686
       );
687
 
688
 
689
-- ---------------------------------------------
690
--  Delay of Empty and prog_Full
691
-- 
692
   Synch_Delay_empty_and_full:
693
   process ( trn_clk )
694
   begin
695
      if trn_clk'event and trn_clk = '1' then
696
         MRd_dsp_re_r1        <= MRd_dsp_re_i;
697
         MRd_dsp_empty_r1     <= MRd_dsp_empty_i;
698
         MRd_dsp_prog_Full_r1 <= MRd_dsp_prog_Full;
699
         MRd_dsp_Req_i        <= not MRd_dsp_empty_i
700
                             and not dsDMA_Stop
701
                             and not dsDMA_Stop2
702
                             and not dsFC_stop
703
                             ;
704
      end if;
705
   end process;
706
 
707
 
708
-- ------------------------------------------
709
-- Synchronous: FC_push
710
-- 
711
   Synch_Calc_FC_push:
712
   process ( trn_clk, Local_Reset_i)
713
   begin
714
      if Local_Reset_i = '1' then
715
         FC_push    <= '0';
716
 
717
      elsif trn_clk'event and trn_clk = '1' then
718
 
719
         FC_push    <= MRd_dsp_re_r1 and not MRd_dsp_empty_r1
720
                   and not MRd_dsp_dout(C_CHBUF_TAG_BIT_TOP);
721
 
722
      end if;
723
   end process;
724
 
725
-- ------------------------------------------
726
-- Synchronous: FC_counter
727
-- 
728
   Synch_Calc_FC_counter:
729
   process ( trn_clk, Local_Reset_i)
730
   begin
731
      if Local_Reset_i = '1' then
732
         FC_counter    <= (Others=>'0');
733
 
734
      elsif trn_clk'event and trn_clk = '1' then
735
 
736
         if FC_push='1' and FC_pop='0' then
737
            FC_counter    <= FC_counter + '1';
738
         elsif FC_push='0' and FC_pop='1' then
739
            FC_counter    <= FC_counter - '1';
740
         else
741
            FC_counter    <= FC_counter;
742
         end if;
743
 
744
      end if;
745
   end process;
746
 
747
 
748
 
749
-- ------------------------------------------
750
-- Synchronous: dsFC_stop
751
-- 
752
   Synch_Calc_dsFC_stop:
753
   process ( trn_clk, Local_Reset_i)
754
   begin
755
      if Local_Reset_i = '1' then
756
         dsFC_stop_128B     <= '1';
757
         dsFC_stop_256B     <= '1';
758
         dsFC_stop_512B     <= '1';
759
         dsFC_stop_1024B    <= '1';
760
         dsFC_stop_2048B    <= '1';
761
         dsFC_stop_4096B    <= '1';
762
 
763
      elsif trn_clk'event and trn_clk = '1' then
764
 
765
         if FC_counter(C_TAGRAM_AWIDTH-1 downto 0)/=C_ALL_ZEROS(C_TAGRAM_AWIDTH-1 downto 0) then
766
           dsFC_stop_4096B    <= '1';
767
         else
768
           dsFC_stop_4096B    <= '0';
769
         end if;
770
 
771
         if FC_counter(C_TAGRAM_AWIDTH-1 downto 0)/=C_ALL_ZEROS(C_TAGRAM_AWIDTH-1 downto 0) then
772
           dsFC_stop_2048B    <= '1';
773
         else
774
           dsFC_stop_2048B    <= '0';
775
         end if;
776
 
777
         if FC_counter(C_TAGRAM_AWIDTH-1 downto 1)/=C_ALL_ZEROS(C_TAGRAM_AWIDTH-1 downto 1) then
778
           dsFC_stop_1024B    <= '1';
779
         else
780
           dsFC_stop_1024B    <= '0';
781
         end if;
782
 
783
         if FC_counter(C_TAGRAM_AWIDTH-1 downto 2)/=C_ALL_ZEROS(C_TAGRAM_AWIDTH-1 downto 2) then
784
           dsFC_stop_512B    <= '1';
785
         else
786
           dsFC_stop_512B    <= '0';
787
         end if;
788
 
789
         if FC_counter(C_TAGRAM_AWIDTH-1 downto 3)/=C_ALL_ZEROS(C_TAGRAM_AWIDTH-1 downto 3) then
790
           dsFC_stop_256B    <= '1';
791
         else
792
           dsFC_stop_256B    <= '0';
793
         end if;
794
 
795
         if FC_counter(C_TAGRAM_AWIDTH-1 downto 4)/=C_ALL_ZEROS(C_TAGRAM_AWIDTH-1 downto 4) then
796
           dsFC_stop_128B    <= '1';
797
         else
798
           dsFC_stop_128B    <= '0';
799
         end if;
800
 
801
      end if;
802
   end process;
803
 
804
 
805
  -- ------------------------------------------
806
  -- Configuration pamameters: cfg_MRS
807
  --
808
    Syn_Config_Param_cfg_MRS:
809
    process ( trn_clk, Local_Reset_i)
810
    begin
811
       if Local_Reset_i = '1' then  -- 0x0080 Bytes
812
               dsFC_stop      <= '1';
813
 
814
       elsif trn_clk'event and trn_clk = '1' then
815
 
816
          case cfg_MRS is
817
 
818
            when "000" =>  -- 0x0080 Bytes
819
               dsFC_stop      <= dsFC_stop_128B;
820
 
821
            when "001" =>  -- 0x0100 Bytes
822
               dsFC_stop      <= dsFC_stop_256B;
823
 
824
            when "010" =>  -- 0x0200 Bytes
825
               dsFC_stop      <= dsFC_stop_512B;
826
 
827
            when "011" =>  -- 0x0400 Bytes
828
               dsFC_stop      <= dsFC_stop_1024B;
829
 
830
            when "100" =>  -- 0x0800 Bytes
831
               dsFC_stop      <= dsFC_stop_2048B;
832
 
833
            when "101" =>  -- 0x1000 Bytes
834
               dsFC_stop      <= dsFC_stop_4096B;
835
 
836
            when Others => -- as 0x0080 Bytes
837
               dsFC_stop      <= dsFC_stop_128B;
838
 
839
          end case;
840
 
841
       end if;
842
    end process;
843
 
844
end architecture Behavioral;

powered by: WebSVN 2.1.0

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