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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [core/] [ds_dma64/] [pcie_src/] [pcie_core64_m1/] [pcie_ctrl/] [core64_tx_engine_m4.vhd] - Blame information for rev 11

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
-------------------------------------------------------------------------------
2
--
3
-- Title       : core64_tx_engine_m4
4
-- Author      : Dmitry Smekhov
5
-- Company     : Instrumental Systems
6
-- E-mail      : dsmv@insys.ru
7
--
8
-- Version     : 1.1
9
--
10
-------------------------------------------------------------------------------
11
--
12
-- Description :  Формирователь пакетов   
13
--                               Модификация 4 - Spartan-6 
14
--
15
-------------------------------------------------------------------------------
16
--
17
--  Version 1.1         19.06.2012
18
--                                      Исправлено формирование cpl_byte_count 
19
--
20 11 dsmv
--                                      12.04.2013
21
--                                      Fixed cpl_byte_count
22
--
23 2 dsmv
-------------------------------------------------------------------------------
24
 
25
library ieee;
26
use ieee.std_logic_1164.all;
27
 
28
use work.core64_type_pkg.all;
29
 
30
package core64_tx_engine_m4_pkg is
31
 
32
component core64_tx_engine_m4 is
33
        port(
34
 
35
                --- General ---
36
                rstp                    : in std_logic;         --! 1 - сброс 
37
                clk                             : in std_logic;         --! тактовая частота ядра - 250 MHz 
38
 
39
                trn_tx                  : out  type_trn_tx;                     --! передача пакета
40
                trn_tx_back             : in   type_trn_tx_back;        --! готовность к передаче пакета
41
 
42
                completer_id    : in std_logic_vector( 15 downto 0 ); --! идентификатор устройства 
43
 
44
                reg_access_back : in type_reg_access_back;      --! запрос на доступ к регистрам 
45
 
46
                rx_tx_engine    : in  type_rx_tx_engine;        --! обмен RX->TX 
47
                tx_rx_engine    : out type_tx_rx_engine;        --! обмен TX->RX 
48
 
49
                tx_ext_fifo             : out type_tx_ext_fifo;         --! обмен TX->EXT_FIFO 
50
                tx_ext_fifo_back: in  type_tx_ext_fifo_back     --! обмен TX->EXT_FIFO 
51
 
52
        );
53
end component;
54
 
55
end package;
56
 
57
library ieee;
58
use ieee.std_logic_1164.all;
59
use ieee.std_logic_arith.all;
60
use ieee.std_logic_unsigned.all;
61
 
62
use work.core64_type_pkg.all;
63
 
64
library unisim;
65
use unisim.vcomponents.all;
66
 
67
entity core64_tx_engine_m4 is
68
        port(
69
 
70
                --- General ---
71
                rstp                    : in std_logic;         --! 1 - сброс 
72
                clk                             : in std_logic;         --! тактовая частота ядра - 250 MHz 
73
 
74
                trn_tx                  : out  type_trn_tx;                     --! передача пакета
75
                trn_tx_back             : in   type_trn_tx_back;        --! готовность к передаче пакета
76
 
77
                completer_id    : in std_logic_vector( 15 downto 0 ); --! идентификатор устройства 
78
 
79
                reg_access_back : in type_reg_access_back;      --! запрос на доступ к регистрам 
80
 
81
                rx_tx_engine    : in  type_rx_tx_engine;        --! обмен RX->TX 
82
                tx_rx_engine    : out type_tx_rx_engine;        --! обмен TX->RX 
83
 
84
                tx_ext_fifo             : out type_tx_ext_fifo;         --! обмен TX->EXT_FIFO 
85
                tx_ext_fifo_back: in  type_tx_ext_fifo_back     --! обмен TX->EXT_FIFO 
86
 
87
        );
88
end core64_tx_engine_m4;
89
 
90
 
91
architecture core64_tx_engine_m4 of core64_tx_engine_m4 is
92
 
93
component ctrl_fifo64x34fw is
94
  port (
95
    clk : in std_logic;
96
    rst : in std_logic;
97
    din : in std_logic_vector(33 downto 0);
98
    wr_en : in std_logic;
99
    rd_en : in std_logic;
100
    dout : out std_logic_vector(33 downto 0);
101
    full : out std_logic;
102
    empty : out std_logic;
103
    valid : out std_logic;
104
    prog_full : out std_logic;
105
    prog_empty : out std_logic
106
  );
107
end component;
108
 
109
 
110
function set_data( data_in  : in std_logic_vector( 31 downto 0 ) ) return std_logic_vector is
111
 
112
variable        ret             : std_logic_vector( 31 downto 0 );
113
 
114
begin
115
 
116
        for ii in 0 to 31 loop
117
                if(  data_in(ii)='1' ) then
118
                        ret(ii):='1';
119
                else
120
                        ret(ii):='0';
121
                end if;
122
        end loop;
123
 
124
        return ret;
125
 
126
end set_data;
127
 
128
signal  rstpz                   : std_logic;
129
 
130
type    stp_type                is ( s0, s1, s2, s21, s3, s31, s4, sr1, sr2, sr21, sr22, sr3, sr4, sr5,
131
                                                         sw1, sw01, sw02, sw04, sw2, sw30, sw31, sw5, sw6       );
132
signal  stp                             : stp_type;
133
 
134
signal  fifo_din                : std_logic_vector( 33 downto 0 );
135
signal  fifo_wr                 : std_logic;
136
signal  fifo_rd                 : std_logic;
137
signal  fifo_dout               : std_logic_vector( 33 downto 0 );
138
signal  fifo_full               : std_logic;
139
signal  fifo_empty              : std_logic;
140
signal  fifo_valid              : std_logic;
141
signal  fifo_paf                : std_logic;
142
signal  fifo_pae                : std_logic;
143
 
144
signal  fifo_sof                : std_logic;
145
signal  fifo_eof                : std_logic;
146
signal  fifo_rrem               : std_logic;
147
signal  fifo_data               : std_logic_vector( 31 downto 0 );
148
signal  reg_data                : std_logic_vector( 31 downto 0 );
149
signal  tlp_dw0                 : std_logic_vector( 31 downto 0 );
150
signal  tlp_dw1                 : std_logic_vector( 31 downto 0 );
151
signal  tlp_dw2                 : std_logic_vector( 31 downto 0 );
152
signal  tlp_dw3                 : std_logic_vector( 31 downto 0 );
153
 
154
signal  cpl_status              : std_logic_vector( 2 downto 0 ):="000";
155
signal  cpl_byte_count  : std_logic_vector( 11 downto 0 ) :=x"000";
156
 
157
signal  tlp_read_dw0    : std_logic_vector( 31 downto 0 );
158
signal  tlp_read_dw1    : std_logic_vector( 31 downto 0 );
159
signal  tlp_read_dw2    : std_logic_vector( 31 downto 0 );
160
signal  tlp_read_dw3    : std_logic_vector( 31 downto 0 );
161
 
162
signal  max_read_size   : std_logic_vector( 7 downto 0 );
163
signal  read_tag                : std_logic_vector( 7 downto 0 );
164
 
165
signal  req_cnt                 : std_logic_vector( 5 downto 0 );        --! счётчик запросов
166
signal  req_complete    : std_logic;                                            --! 1 - получены все ответы 
167
 
168
signal  wait_complete   : std_logic;
169
 
170
signal  complete_cnt    : std_logic_vector( 9 downto 0 );        --! счётчик принятых слов
171
signal  timeout_cnt             : std_logic_vector( 10 downto 0 );       --! ожидание ответа
172
signal  timeout_cnt_en  : std_logic;
173
signal  timeout_error   : std_logic;
174
signal  timeout_st0             : std_logic;
175
signal  rstpz1                  : std_logic;
176
 
177
signal  write_cnt_en    : std_logic;
178
signal  write_cnt               : std_logic_vector( 5 downto 0 );        --! счётчик слов в пакете
179
signal  write_cnt_pkg   : std_logic_vector( 4 downto 0 );        --! счётчик пакетов
180
signal  write_cnt_eq    : std_logic;
181
signal  write_cnt_pkg_eq: std_logic;
182
signal  write_state             : std_logic;
183
signal  write_size              : std_logic;    --! 1 - пакет 256 байт, 0 - пакет 128 байт
184
signal  write_cnt_pkg_add : std_logic_vector( 1 downto 0 );
185
 
186
signal  tlp_write_dw0   : std_logic_vector( 31 downto 0 );
187
signal  tlp_write_dw1   : std_logic_vector( 31 downto 0 );
188
signal  tlp_write_dw2   : std_logic_vector( 31 downto 0 );
189
signal  tlp_write_dw3   : std_logic_vector( 31 downto 0 );
190
 
191
signal  tlp_write_data  : std_logic_vector( 63 downto 0 );
192
signal  tlp_write_data_z: std_logic_vector( 31 downto 0 );
193
signal  adr_cnt                 : std_logic_vector( 5 downto 0 );
194
 
195
signal  adr64                   : std_logic;
196
signal  allow_cpl               : std_logic;
197
signal  allow_wr                : std_logic;
198
signal  tbuf_av                 : std_logic_vector( 5 downto 0 );
199
signal  write_cnt_en_z  : std_logic;
200
 
201
begin
202
 
203
trn_tx.trn_td( 31 downto 0 ) <= fifo_dout( 31 downto 0 );
204
trn_tx.trn_tsof_n <= fifo_dout( 32 );
205
trn_tx.trn_teof_n <= fifo_dout( 33 );
206
--trn_tx.trn_trem_n( 7 downto 4 ) <= "0000";
207
--trn_tx.trn_trem_n( 3 downto 0 ) <= (others=>fifo_dout( 66 ) );
208
 
209
trn_tx.trn_tsrc_dsc_n <= '1';
210
trn_tx.trn_terrfwd_n <= '1';
211
 
212
trn_tx.trn_tsrc_rdy_n <= fifo_empty or trn_tx_back.trn_tdst_rdy_n;
213
fifo_rd <= not ( fifo_empty or trn_tx_back.trn_tdst_rdy_n );
214
 
215
fifo0_reg: ctrl_fifo64x34fw
216
  port map(
217
    clk                 => clk,
218
    rst                 => rstpz,
219
    din                 => fifo_din,
220
    wr_en               => fifo_wr,
221
    rd_en               => fifo_rd,
222
    dout                => fifo_dout,
223
    full                => fifo_full,
224
    empty               => fifo_empty,
225
    valid               => fifo_valid,
226
    prog_full   => fifo_paf,
227
    prog_empty  => fifo_pae
228
  );
229
 
230
rstpz <= rstp after 1 ns when rising_edge( clk );
231
 
232
fifo_din <=  fifo_eof & fifo_sof & set_data( fifo_data );
233
 
234
 
235
tbuf_av <= trn_tx_back.trn_tbuf_av;
236
 
237
allow_cpl <= tbuf_av(4) or tbuf_av(3) or tbuf_av(2) or tbuf_av(1) or tbuf_av(0) after 1 ns when rising_edge( clk );
238
allow_wr  <= tbuf_av(4) or tbuf_av(3) or tbuf_av(2) after 1 ns when rising_edge( clk );
239
 
240
 
241
pr_state: process( clk ) begin
242
        if( rising_edge( clk ) ) then
243
 
244
                case( stp ) is
245
                        when s0 =>
246
 
247
                                if(  fifo_paf='0' ) then
248
 
249
                                if( (rx_tx_engine.request_reg_wr='1' or rx_tx_engine.request_reg_rd='1') and allow_cpl='1' ) then
250
                                        stp <= s1 after 1 ns;
251
                                elsif( tx_ext_fifo_back.req_rd='1' and allow_wr='1'  ) then
252
                                        stp <= sr1 after 1 ns;
253
                                elsif( tx_ext_fifo_back.req_wr='1' and allow_wr='1' ) then
254
                                        stp <= sw1 after 1 ns;
255
                                end if;
256
 
257
                                end if;
258
                                fifo_wr <= '0';
259
                                tx_rx_engine.complete_reg <= '0' after 1 ns;
260
                                tx_ext_fifo.complete_ok <= '0' after 1 ns;
261
                                tx_ext_fifo.complete_error <= '0' after 1 ns;
262
                                write_cnt_en <= '0' after 1 ns;
263
 
264
 
265
                        when s1 =>
266
                                if( reg_access_back.complete='1' ) then
267
                                        if( rx_tx_engine.request_reg_wr='1' ) then
268
                                                stp <= s4 after 1 ns;   -- не отправляется при операции записи 
269
                                        else
270
                                                stp <= s2 after 1 ns;
271
                                        end if;
272
                                end if;
273
 
274
                        when s2 =>
275
                                fifo_sof <= '0' after 1 ns;
276
                                fifo_eof <= '1' after 1 ns;
277
                                fifo_data <= tlp_dw0 after 1 ns;
278
                                fifo_wr <= '1' after 1 ns;
279
                                stp <= s21 after 1 ns;
280
 
281
                        when s21 =>
282
                                fifo_sof <= '1' after 1 ns;
283
                                fifo_eof <= '1' after 1 ns;
284
                                fifo_data <= tlp_dw1 after 1 ns;
285
                                stp <= s3 after 1 ns;
286
 
287
                        when s3 =>
288
 
289
                                fifo_data <= tlp_dw2 after 1 ns;
290
                                stp <= s31 after 1 ns;
291
 
292
                        when s31 =>
293
 
294
                                fifo_eof <= '0' after 1 ns;
295
                                fifo_data <= tlp_dw3 after 1 ns;
296
                                stp <= s4 after 1 ns;
297
 
298
                        when s4 =>
299
                                fifo_wr <= '0' after 1 ns;
300
                                tx_rx_engine.complete_reg <= '1' after 1 ns;
301
                                if( rx_tx_engine.request_reg_wr='0' and rx_tx_engine.request_reg_rd='0' ) then
302
                                        stp <= s0 after 1 ns;
303
                                end if;
304
 
305
                        when sr1 => ---- Запрос на чтение данных из памяти ----
306
 
307
                                if( req_cnt(5)='1' or (req_cnt(2)='1' and tx_ext_fifo_back.rd_size='0' ) ) then
308
                                        stp <= sr4 after 1 ns;
309
                                else
310
                                        stp <= sr2 after 1 ns;
311
                                end if;
312
 
313
                        when sr2 =>
314
                                wait_complete <= '1' after 1 ns;
315
                                fifo_sof <= '0' after 1 ns;
316
                                fifo_eof <= '1' after 1 ns;
317
                                fifo_data <= tlp_read_dw0 after 1 ns;
318
                                fifo_wr <= '1' after 1 ns;
319
                                stp <= sr21 after 1 ns;
320
 
321
                        when sr21 =>
322
                                fifo_sof <= '1' after 1 ns;
323
                                fifo_data <= tlp_read_dw1 after 1 ns;
324
                                if( adr64='1' ) then
325
                                        stp <= sr22 after 1 ns;
326
                                else
327
                                        stp <= sr3 after 1 ns;
328
                                end if;
329
 
330
                        when sr22 =>
331
                                fifo_data <= tlp_read_dw2 after 1 ns;
332
                                stp <= sr3 after 1 ns;
333
 
334
                        when sr3 =>
335
                                fifo_eof <= '0' after 1 ns;
336
                                fifo_data <= tlp_read_dw3 after 1 ns;
337
                                fifo_wr <= '1' after 1 ns;
338
                                stp <= s0 after 1 ns;
339
 
340
--                      when sr3 => ---- Ожидание завершения запроса ----
341
--                              fifo_wr <= '0' after 1 ns;                
342
--                              stp <= sr0 after 1 ns;
343
 
344
                        when sr4 =>  --- Проверка завершения запроса ----
345
                                if( req_complete='1'  or timeout_error='1' ) then
346
                                        stp <= sr5 after 1 ns;
347
                                else
348
                                        stp <= s0 after 1 ns;
349
                                end if;
350
 
351
                        when sr5 =>
352
                                        wait_complete <= '0' after 1 ns;
353
                                        tx_ext_fifo.complete_ok <= req_complete after 1 ns;
354
                                        tx_ext_fifo.complete_error <= timeout_error after 1 ns;
355
                                        if( tx_ext_fifo_back.req_rd='0' ) then
356
                                                stp <= s0 after 1 ns;
357
                                        end if;
358
 
359
 
360
                        when sw1 => --- Запись 4 кБ ---
361
 
362
                                --write_cnt_en <= not adr64 after 1 ns;
363
                                stp <= sw01 after 1 ns;
364
 
365
                        when sw01 => --- Запись 4 кБ ---
366
 
367
 
368
                                write_state <= '1' after 1 ns;
369
 
370
 
371
                                fifo_sof <= '0' after 1 ns;
372
                                fifo_eof <= '1' after 1 ns;
373
                                fifo_data <= tlp_write_dw0 after 1 ns;
374
                                fifo_wr <= '1' after 1 ns;
375
 
376
                                stp <= sw02 after 1 ns;
377
 
378
                        when sw02 =>
379
 
380
                                fifo_sof <= '1' after 1 ns;
381
                                fifo_data <= tlp_write_dw1 after 1 ns;
382
 
383
 
384
                                if( adr64='1' ) then
385
                                        stp <= sw04 after 1 ns;
386
                                else
387
                                        stp <= sw2 after 1 ns;
388
                                        write_cnt_en <= '1' after 1 ns;
389
 
390
                                end if;
391
 
392
                        when sw04 =>
393
                                fifo_data <= tlp_write_dw2 after 1 ns;
394
                                stp <= sw2 after 1 ns;
395
                                write_cnt_en <= '1' after 1 ns;
396
 
397
 
398
                        when sw2 =>
399
 
400
 
401
                                write_cnt_en <= '0' after 1 ns;
402
                                fifo_data <= tlp_write_dw3  after 1 ns;
403
 
404
                                stp <= sw30 after 1 ns;
405
 
406
                        when sw30 =>
407
                                fifo_data <= tlp_write_data( 63 downto 32 ) after 1 ns;
408
                                write_cnt_en <= '1' after 1 ns;
409
                                if( write_cnt_eq='1' ) then
410
                                        stp <= sw5 after 1 ns;
411
                                else
412
                                        stp <= sw31 after 1 ns;
413
                                end if;
414
 
415
                        when sw31 =>
416
                                write_cnt_en <= '0' after 1 ns;
417
                                fifo_wr <= '1' after 1 ns;
418
                                fifo_data <= tlp_write_data( 31 downto 0 ) after 1 ns;
419
                                stp <= sw30 after 1 ns;
420
 
421
                        when sw5 =>
422
                                fifo_data <= tlp_write_data( 31 downto 0 ) after 1 ns;
423
                                fifo_eof <= '0' after 1 ns;
424
                                write_cnt_en <= '0' after 1 ns;
425
                                if( write_cnt_pkg_eq='1' ) then
426
                                        stp <= sw6 after 1 ns;
427
                                else
428
                                        stp <= s0 after 1 ns;
429
                                end if;
430
 
431
                        when sw6 =>
432
                                fifo_wr <= '0' after 1 ns;
433
                                tx_ext_fifo.complete_ok <= '1' after 1 ns;
434
                                tx_ext_fifo.complete_error <= '0' after 1 ns;
435
                                write_state <= '0' after 1 ns;
436
                                if( tx_ext_fifo_back.req_wr='0' ) then
437
                                        stp <= s0 after 1 ns;
438
                                end if;
439
 
440
 
441
 
442
 
443
 
444
                end case;
445
 
446
 
447
 
448
 
449
 
450
                if( rstpz='1' ) then
451
                        stp <= s0 after 1 ns;
452
                        wait_complete <= '0' after 1 ns;
453
                        write_state <= '0' after 1 ns;
454
                end if;
455
 
456
        end if;
457
end process;
458
 
459
 
460
tlp_dw0 <= "0" & rx_tx_engine.request_reg_rd & "0010100" &  rx_tx_engine.request_tc & "0000" & rx_tx_engine.request_attr & "0000" & "0000000" & rx_tx_engine.request_reg_rd;
461
tlp_dw1 <= completer_id & cpl_status & '0' & cpl_byte_count;
462
tlp_dw2 <= rx_tx_engine.request_id & rx_tx_engine.request_tag & '0' & rx_tx_engine.lower_adr & "00";
463
 
464 11 dsmv
--cpl_byte_count <= "0000" & "0000" & "0" & rx_tx_engine.request_reg_rd & "00";  
465 2 dsmv
cpl_byte_count <= "0000" & "0000" & "0" & rx_tx_engine.byte_count;
466
 
467
reg_data <= reg_access_back.data after 1 ns when rising_edge( clk ) and reg_access_back.data_we='1';
468
tlp_dw3(  7 downto 0 )  <= reg_data( 31 downto 24 );
469
tlp_dw3( 15 downto 8 )  <= reg_data( 23 downto 16 );
470
tlp_dw3( 23 downto 16 ) <= reg_data( 15 downto 8 );
471
tlp_dw3( 31 downto 24 ) <= reg_data(  7 downto 0 );
472
 
473
max_read_size <= x"20"; -- 128 байт
474
read_tag <= "000" & req_cnt( 4 downto 0 );
475
 
476
adr64 <= tx_ext_fifo_back.pci_adr( 39 ) or
477
             tx_ext_fifo_back.pci_adr( 38 ) or
478
             tx_ext_fifo_back.pci_adr( 37 ) or
479
             tx_ext_fifo_back.pci_adr( 36 ) or
480
             tx_ext_fifo_back.pci_adr( 35 ) or
481
             tx_ext_fifo_back.pci_adr( 34 ) or
482
             tx_ext_fifo_back.pci_adr( 33 ) or
483
             tx_ext_fifo_back.pci_adr( 32 );
484
 
485
tlp_read_dw0 <= "00" & adr64 & '0' & x"000" & "00000000" & max_read_size;
486
tlp_read_dw1 <= completer_id & read_tag & x"FF";
487
tlp_read_dw2 <= x"000000" & tx_ext_fifo_back.pci_adr( 39 downto 32 );
488
tlp_read_dw3( 6 downto 0 ) <= "0000000";
489
tlp_read_dw3( 8 downto 7 ) <= req_cnt( 1 downto 0 );
490
tlp_read_dw3( 11 downto 9 ) <= req_cnt( 4 downto 2 ) when  tx_ext_fifo_back.rd_size='1'
491
                                        else tx_ext_fifo_back.pci_adr( 11 downto 9 );
492
 
493
tlp_read_dw3( 31 downto 12 ) <= tx_ext_fifo_back.pci_adr( 31 downto 12 );
494
 
495
 
496
--tlp_read_dw0 <= x"0000" & "00000000" & max_read_size;
497
--tlp_read_dw1 <= completer_id & read_tag & x"FF";
498
--
499
--tlp_read_dw2( 6 downto 0 ) <= "0000000";
500
--tlp_read_dw2( 8 downto 7 ) <= req_cnt( 1 downto 0 );
501
--tlp_read_dw2( 11 downto 9 ) <= req_cnt( 4 downto 2 ) when  tx_ext_fifo_back.rd_size='1' 
502
--                                      else tx_ext_fifo_back.pci_adr( 11 downto 9 );  
503
--                                      
504
--tlp_read_dw2( 31 downto 12 ) <= tx_ext_fifo_back.pci_adr( 31 downto 12 );
505
--
506
--tlp_read_dw3 <= (others=>'0');
507
 
508
 
509
 
510
pr_req_cnt: process( clk ) begin
511
        if( rising_edge( clk ) ) then
512
                if( stp=s0 and wait_complete='0' ) then
513
                        req_cnt <= (others=>'0') after 1 ns;
514
                elsif(  stp=sr3 ) then
515
                        req_cnt <= req_cnt + 1 after 1 ns;
516
                end if;
517
        end if;
518
end process;
519
 
520
 
521
 
522
rstpz1 <= rstpz after 1 ns when rising_edge( clk );
523
timeout_st0 <= ( not rstpz ) and (rstpz1 or timeout_cnt_en ) after 1 ns when rising_edge( clk );
524
 
525
xtcnt: srlc32e port map( q31=>timeout_cnt_en, clk=>clk, d=>timeout_st0, a=>"11111", ce=>'1' );
526
 
527
pr_timeout_cnt: process( clk ) begin
528
        if( rising_edge( clk ) ) then
529
                if( wait_complete='0' ) then
530
                        timeout_cnt <= (others=>'0') after 1 ns;
531
                elsif( timeout_cnt_en='1' ) then
532
                        timeout_cnt <= timeout_cnt + 1 after 1 ns;
533
                end if;
534
        end if;
535
end process;
536
 
537
timeout_error <= timeout_cnt(10);
538
 
539
pr_complete_cnt: process( clk ) begin
540
        if( rising_edge( clk ) ) then
541
                if( wait_complete='0' ) then
542
                        if( tx_ext_fifo_back.rd_size='0' ) then
543
                                complete_cnt <= "0111000000" after 1 ns; -- 513-64 -- ожидается 512 байт 
544
                        else
545
                                complete_cnt <= "0000000000" after 1 ns;        -- ожидается 4096 байт (512 слов по 8 байт)
546
                        end if;
547
                elsif( rx_tx_engine.complete_we='1' ) then
548
                        complete_cnt <= complete_cnt + 1 after 1 ns;
549
                end if;
550
        end if;
551
end process;
552
 
553
req_complete <= complete_cnt(9);
554
 
555
write_size <= trn_tx_back.cfg_dcommand(5);
556
 
557
pr_write_cnt: process( clk ) begin
558
        if( rising_edge( clk ) ) then
559
                if( stp=s0 ) then
560
                        write_cnt <= '0' & not write_size & "000" & '0' after 1 ns;
561
                elsif( write_cnt_en='1' ) then
562
                        write_cnt <= write_cnt + 1 after 1 ns;
563
                end if;
564
        end if;
565
end process;
566
 
567
write_cnt_eq <= write_cnt(5);
568
 
569
write_cnt_pkg_add <= write_size & not write_size;
570
 
571
pr_write_cnt_pkg: process( clk ) begin
572
        if( rising_edge( clk ) ) then
573
                if( stp=s0 and write_state='0' ) then
574
                        write_cnt_pkg <= "00000" after 1 ns;
575
                elsif( stp=sw5  ) then
576
                        write_cnt_pkg <= write_cnt_pkg + write_cnt_pkg_add after 1 ns;
577
                end if;
578
        end if;
579
end process;
580
 
581
write_cnt_pkg_eq <= write_cnt_pkg(4) and write_cnt_pkg(3) and write_cnt_pkg(2) and write_cnt_pkg(1) and (write_cnt_pkg(0) or write_size);
582
 
583
 
584
tlp_write_dw0 <= "01" & adr64 & '0' & x"000" & "00000000" & "0" & write_size & not write_size & "00000";
585
tlp_write_dw1 <= tlp_read_dw1;
586
tlp_write_dw2 <= tlp_read_dw2;  --x"000000" & tx_ext_fifo_back.pci_adr( 39 downto 32 );
587
tlp_write_dw3( 6 downto 0 ) <= "0000000";
588
tlp_write_dw3( 11 downto 7 ) <= write_cnt_pkg( 4 downto 0 );
589
tlp_write_dw3( 31 downto 12 ) <= tx_ext_fifo_back.pci_adr( 31 downto 12 );
590
 
591
 
592
--tlp_write_data <=     x"00000000" & x"0000" & "0000000000" & write_cnt;
593
gen_repack: for ii in 0 to 7 generate
594
        tlp_write_data( ii*8+7 downto ii*8 ) <= tx_ext_fifo_back.data(  (7-ii)*8+7 downto  (7-ii)*8 );
595
end generate;
596
 
597
tlp_write_data_z <= tlp_write_data( 31 downto 0 ) after 1 ns when rising_edge( clk );
598
 
599
write_cnt_en_z <= write_cnt_en after 1 ns when rising_edge( clk );
600
 
601
pr_adr_cnt: process( clk ) begin
602
        if( rising_edge( clk ) ) then
603
                if( stp=s0 ) then
604
                        adr_cnt <= (others=>'0') after 1 ns;
605
                elsif( write_cnt_en_z='1' ) then
606
                        adr_cnt <= adr_cnt + 1 after 1 ns;
607
                end if;
608
        end if;
609
end process;
610
 
611
tx_ext_fifo.adr( 3 downto 0 ) <= adr_cnt( 3 downto 0 );
612
tx_ext_fifo.adr( 4 ) <= adr_cnt(4) or write_cnt_pkg(0);
613
tx_ext_fifo.adr( 8 downto 5 ) <= write_cnt_pkg( 4 downto 1 );
614
 
615
end core64_tx_engine_m4;

powered by: WebSVN 2.1.0

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