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 2

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