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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [core/] [adm/] [main/] [cl_test_generate.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
-------------------------------------------------------------------------------
2
--
3
-- Title       : cl_test_generate
4
-- Author      : Dmitry Smekhov
5
-- Company     : Instrumental Systems
6
-- E-mail      : dsmv@insys.ru
7
--
8
-- Version     : 1.0
9
--
10
-------------------------------------------------------------------------------
11
--
12
-- Description :        Узел формирования потока данных
13
--                              
14
--              Тестовая последовательность представляет собой набор блоков. 
15
--              Размер блока задаётся кратным страницы размером 4 килобайта 
16
--              (512 слов по 64 бита)
17
--              Первое 64-х разрядное слово в блоке содержит сигнатуру и порядковый номер.       
18
--                  31..0  - сигнатура 0xA5A50123
19
--                      63..32 - порядковый номер блока
20
--
21
--              Содержимое блока зависит от его порядкового номера в последовательности.  
22
--
23
--              Содержимое блока:
24
--              0 - Бегущая единица по 64-м разрядам
25
--              1 - Бегущий ноль по 64-м разрядам
26
--              2 - Бегущая единица с инверсией по 64-м разрядам
27
---                     Чётные номера слов - бегущая единица по 64-м разрядам
28
--                      Нечётные номера - инверсия предыдущего слова             
29
--              3 - Бегущая единица в блоке
30
--                      Номер слова сравнивается с номером блока (сравниваются восемь младший разрядов)
31
--                      При совпадении - в слово записывается бегущая 1.
32
--                      Остальные слова - значение ноль.
33
--              4 - Бегущий ноль с инверсией по 64-м разрядам
34
--                      Чётные номера - бегущий ноль по 64-м разрядам
35
--                      Нечётные номера - инверсия предыдущего слова             
36
--              5 - Бегущий ноль а в блоке
37
--                      Номер слова сравнивается с номером блока (сравниваются восемь младший разрядов)
38
--                      При совпадении - в слово записывается бегущий 0.
39
--                      Остальные слова - значение 0xFFFFFFFFFFFFFFFF.
40
--              6,7 - Счётчик по 64-м разрядам
41
--                      Чётные номера - значение счётчика
42
--                      Нечётные номера - инверсия предыдущего слова
43
--              8,9 - Псевдослучайная последовательность
44
--                      Формируется М-последовательность по 64 разрядам.
45
--                      Начальное значение - 1
46
--                      Слово формируется сдвигом на один разряд вправо.
47
--                      В младший разряд слова записывается значение x[63] xor x[62]
48
--                                                                                                                              
49
--
50
--              Для режима счётчика и псевдослучайной последовательности начальное значение
51
--              формируется при инициализации тестовой последовательности.
52
--              Для остальных режимов - при инициализации проверки блока
53
--
54
--
55
--              Регистр test_check_ctrl
56
--                         
57
--                              0 - 1 сброс узла
58
--                              5 - 1 старт приёма данных
59
--                              7 - 1 фиксированный тип блока
60
--                              11..8 - номер блока при test_check_ctrl[7]=1
61
--                              
62
 
63
-------------------------------------------------------------------------------
64
--
65
-- Version     1.1   06.12.2010
66
--                          Исправлено использование сигнала СТАРТ при работе по счётчикам.
67
--                              Исправлено использование бита test_gen_ctrl(12) 
68
--                              при работе без счётчиков. 
69
--
70
-------------------------------------------------------------------------------
71
 
72
 
73
 
74
 
75
library ieee;
76
use ieee.std_logic_1164.all;
77
library work;
78
use work.adm2_pkg.all;
79
 
80
package cl_test_generate_pkg is
81
 
82
component cl_test_generate is
83
        port(
84
 
85
                ---- Global ----
86
                reset           : in std_logic;         -- 0 - сброс
87
                clk                     : in std_logic;         -- тактовая частота
88
 
89
                ---- DIO_IN ----
90
                di_clk          : in  std_logic;        -- тактовая частота записи в FIFO
91
                di_data         : out std_logic_vector( 63 downto 0 );   -- данные
92
                di_data_we      : out std_logic;        -- 1 - запись данных
93
                di_flag_paf     : in  std_logic;        -- 1 - есть место для записи
94
                di_fifo_rst     : in  std_logic;        -- 0 - сброс FIFO
95
                di_start        : in  std_logic;        -- 1 - разрешение работы (MODE0[5])
96
 
97
 
98
                ---- Управление ----
99
                test_gen_ctrl   : in  std_logic_vector( 15 downto 0 );  -- Регистр управления
100
                test_gen_size   : in  std_logic_vector( 15 downto 0 );   -- размер в блоках по 512x64 (4096 байт)
101
                test_gen_bl_wr  : out std_logic_vector( 31 downto 0 );   -- Число записанных блоков
102
                test_gen_cnt1   : in  std_logic_vector( 15 downto 0 );  -- Счётчик разрешения работы
103
                test_gen_cnt2   : in  std_logic_vector( 15 downto 0 )    -- Счётчик запрещения работы
104
 
105
        );
106
end component;
107
 
108
end package;
109
 
110
 
111
library ieee;
112
use ieee.std_logic_1164.all;
113
use ieee.std_logic_arith.all;
114
use ieee.std_logic_unsigned.all;
115
 
116
library unisim;
117
use unisim.vcomponents.all;
118
 
119
library work;
120
use work.adm2_pkg.all;
121
 
122
entity cl_test_generate is
123
        port(
124
 
125
                ---- Global ----
126
                reset           : in std_logic;         -- 0 - сброс
127
                clk                     : in std_logic;         -- тактовая частота
128
 
129
                ---- DIO_IN ----
130
                di_clk          : in  std_logic;        -- тактовая частота записи в FIFO
131
                di_data         : out std_logic_vector( 63 downto 0 );   -- данные
132
                di_data_we      : out std_logic;        -- 1 - запись данных
133
                di_flag_paf     : in  std_logic;        -- 1 - есть место для записи
134
                di_fifo_rst     : in  std_logic;        -- 0 - сброс FIFO
135
                di_start        : in  std_logic;        -- 1 - разрешение работы (MODE0[5])
136
 
137
                ---- Управление ----
138
                test_gen_ctrl   : in  std_logic_vector( 15 downto 0 );  -- Регистр управления
139
                test_gen_size   : in  std_logic_vector( 15 downto 0 );   -- размер в блоках по 512x64 (4096 байт)
140
                test_gen_bl_wr  : out std_logic_vector( 31 downto 0 );   -- Число записанных блоков
141
                test_gen_cnt1   : in  std_logic_vector( 15 downto 0 );  -- Счётчик разрешения работы
142
                test_gen_cnt2   : in  std_logic_vector( 15 downto 0 )    -- Счётчик запрещения работы
143
 
144
        );
145
end cl_test_generate;
146
 
147
 
148
architecture cl_test_generate of cl_test_generate is
149
 
150
signal  block_rd                : std_logic_vector( 31 downto 0 );
151
 
152
signal  data_expect             : std_logic_vector( 63 downto 0 );
153
 
154
signal  cnt1                    : std_logic_vector( 24 downto 0 );
155
signal  cnt1_z                  : std_logic;
156
signal  cnt1_eq                 : std_logic;
157
 
158
signal  rst                             : std_logic;
159
signal  data_en                 : std_logic;    -- 1 - приём слова данных  
160
 
161
signal  data_ex0                : std_logic_vector( 63 downto 0 );
162
signal  data_ex1                : std_logic_vector( 63 downto 0 );
163
signal  data_ex2                : std_logic_vector( 63 downto 0 );
164
signal  data_ex3                : std_logic_vector( 63 downto 0 );
165
signal  data_ex4                : std_logic_vector( 63 downto 0 );
166
signal  data_ex5                : std_logic_vector( 63 downto 0 );
167
 
168
 
169
signal  block_mode              : std_logic_vector( 3 downto 0 );
170
 
171
signal  xcnt1                   : std_logic_vector( 15 downto 0 );
172
signal  xcnt2                   : std_logic_vector( 15 downto 0 );
173
 
174
signal  xcnt1_z                 : std_logic;
175
signal  xcnt2_z                 : std_logic;
176
 
177
type stp_type is ( s0, s1, s2, s3 );
178
signal  stp                             : stp_type;
179
 
180
signal  di_rdy                  : std_logic;
181
 
182
begin
183
 
184
pr_cnt1: process( di_clk ) begin
185
        if( rising_edge( di_clk ) ) then
186
                if( rst='0' or (cnt1_eq='1' and data_en='1') ) then
187
                        cnt1( 24 downto 0 )   <= (others=>'0') after 1 ns;
188
                elsif( data_en='1' ) then
189
                        cnt1 <= cnt1 + 1 after 1 ns;
190
                end if;
191
        end if;
192
end process;
193
 
194
pr_cnt1_z: process( di_clk ) begin
195
        if( rising_edge( di_clk ) ) then
196
 
197
                if( rst='0' ) then
198
                        cnt1_z <= '1' after 1 ns;
199
                        cnt1_eq <= '0' after 1 ns;
200
                elsif( data_en='1' ) then
201
 
202
                        if( cnt1_eq='1' ) then
203
                                cnt1_z <= '1' after 1 ns;
204
                        else
205
                                cnt1_z <= '0' after 1 ns;
206
                        end if;
207
 
208
                        if( cnt1( 24 downto 9 )=test_gen_size-1 and cnt1( 8 downto 0 )="111111110" ) then
209
                                cnt1_eq <= '1' after 1 ns;
210
                        else
211
                                cnt1_eq <= '0' after 1 ns;
212
                        end if;
213
                end if;
214
 
215
        end if;
216
end process;
217
 
218
 
219
 
220
--pr_data_en: process( di_clk ) begin
221
--      if( rising_edge( di_clk ) ) then
222
--              if( rst='0' or test_gen_ctrl(5)='0' or di_flag_paf='0' or di_start='0' ) then
223
--                      data_en <='0' after 1 ns;
224
--              else
225
--                      data_en <= '1' after 1 ns;
226
--              end if;
227
--      end if;
228
--end process;                          
229
 
230
di_rdy <= (di_flag_paf or test_gen_ctrl(12) ) and di_start after 1 ns when rising_edge( di_clk );
231
 
232
pr_state: process( di_clk ) begin
233
        if( rising_edge( di_clk ) ) then
234
                case( stp ) is
235
                        when s0 => -- Ожидание --
236
                                if( test_gen_ctrl(5)='1' ) then
237
                                        if( test_gen_ctrl( 6 )='1' ) then
238
                                                stp <= s2 after 1 ns;
239
                                        else
240
                                                stp <= s1 after 1 ns;
241
                                        end if;
242
                                end if;
243
                                data_en <= '0' after 1 ns;
244
 
245
                        when s1 => -- Передача по готовности FIFO --
246
                                data_en <= di_rdy after 1 ns;
247
                                if( test_gen_ctrl(5)='0' ) then
248
                                        stp <= s0 after 1 ns;
249
                                end if;
250
 
251
                        when s2 => -- Передача по счётчикам CNT1, CNT2
252
                                data_en <= di_rdy after 1 ns;
253
                                if( test_gen_ctrl(5)='0' ) then
254
                                        stp <= s0 after 1 ns;
255
                                elsif( xcnt1_z='1' ) then
256
                                        stp <= s3 after 1 ns;
257
                                end if;
258
 
259
                        when s3 =>
260
                                data_en <= '0' after 1 ns;
261
                                if( test_gen_ctrl(5)='0' ) then
262
                                        stp <= s0 after 1 ns;
263
                                elsif( xcnt2_z='1' ) then
264
                                        stp <= s2 after 1 ns;
265
                                end if;
266
                end case;
267
 
268
                if( rst='0' ) then
269
                        stp <= s0 after 1 ns;
270
                end if;
271
 
272
        end if;
273
end process;
274
 
275
pr_xcnt1: process( di_clk ) begin
276
        if( rising_edge( di_clk ) ) then
277
                if( stp/=s2 ) then
278
                        xcnt1 <= test_gen_cnt1 after 1 ns;
279
                else
280
                        xcnt1 <= xcnt1 - 1 after 1 ns;
281
                end if;
282
        end if;
283
end process;
284
 
285
pr_xcnt2: process( di_clk ) begin
286
        if( rising_edge( di_clk ) ) then
287
                if( stp/=s3 ) then
288
                        xcnt2 <= test_gen_cnt2 after 1 ns;
289
                else
290
                        xcnt2 <= xcnt2 - 1 after 1 ns;
291
                end if;
292
        end if;
293
end process;
294
 
295
xcnt1_z <= '1' when xcnt1=x"0002" else '0';
296
 
297
xcnt2_z <= '1' when xcnt2=x"0002" else '0';
298
 
299
 
300
rst <= reset and not test_gen_ctrl(0);
301
 
302
pr_block_mode: process( di_clk ) begin
303
        if( rising_edge( di_clk ) ) then
304
                if( rst='0' ) then
305
                        block_mode <= "0000" after 1 ns;
306
                elsif( test_gen_ctrl(7)='1' ) then
307
                        block_mode <= test_gen_ctrl( 11 downto 8 ) after 1 ns;
308
                elsif( data_en='1' and cnt1_eq='1' ) then
309
                                if( block_mode="1001" ) then
310
                                        block_mode <= "0000" after 1 ns;
311
                                else
312
                                        block_mode <= block_mode + 1 after 1 ns;
313
                                end if;
314
                end if;
315
        end if;
316
end process;
317
 
318
pr_block_rd: process( di_clk ) begin
319
        if( rising_edge( di_clk ) ) then
320
                if( rst='0' ) then
321
                        block_rd <= (others=>'0') after 1 ns;
322
                elsif( data_en='1' and cnt1_eq='1' ) then
323
                        block_rd <= block_rd + 1 after 1 ns;
324
                end if;
325
        end if;
326
end process;
327
 
328
pr_data_expect: process( di_clk ) begin
329
        if( rising_edge( di_clk ) ) then
330
          if( rst='0' ) then
331
                  data_ex4 <= (others=>'0') after 1 ns;
332
                  data_ex5 <= (0=>'1', others=>'0') after 1 ns;
333
                  data_ex0 <= x"0000000000000001" after 1 ns;
334
          elsif( data_en='1' ) then
335
                if( cnt1_z='1' ) then
336
                        data_expect( 31 downto 0 ) <= x"A5A50123" after 1 ns;
337
                        data_expect( 63 downto 32 ) <= block_rd after 1 ns;
338
                        case( block_mode( 3 downto 0 ) ) is
339
                          when "0000" => -- Бегущая 1 по 64-м разрядам
340
                                data_ex0 <= x"0000000000000001" after 1 ns;
341
                          when "0001" => -- Бегущий 0 по 64-м разрядам
342
                                data_ex0 <= not x"0000000000000001" after 1 ns;
343
                          when "0010" => -- Бегущая 1 с инверсией  по 64-м разрядам
344
                                data_ex1 <= x"0000000000000001" after 1 ns;
345
                          when "0011" => -- Бегущий 0 с инверсией  по 64-м разрядам
346
                                data_ex1 <= not x"0000000000000001" after 1 ns;
347
                          when "0100" => -- Бегущая 1 в блоке 0
348
                                data_ex2 <= x"0000000000000001" after 1 ns;
349
                                data_ex3 <= (others=>'0');
350
                          when "0101" => -- Бегущий 0 в блоке 1
351
                                data_ex2 <= not x"0000000000000001" after 1 ns;
352
                                data_ex3 <= (others=>'1') after 1 ns;
353
 
354
                          when others=> null;
355
                        end case;
356
                else
357
                        case( block_mode( 3 downto 0 ) )is
358
                          when "0000" | "0001" =>
359
                                data_expect <= data_ex0 after 1 ns;
360
                                data_ex0( 63 downto 1 ) <= data_ex0( 62 downto 0 ) after  1 ns;
361
                                data_ex0( 0 ) <= data_ex0( 63 ) after 1 ns;
362
 
363
                          when "0010" | "0011" => -- Бегущий 0 с инверсией  по 32-м разрядам
364
--                        when "0011" => -- Бегущий 0 с инверсией  по 64-м разрядам
365
                                if( cnt1(0)='0' ) then
366
                                        data_expect <= data_ex1 after 1 ns;
367
                                else
368
                                        data_expect <= not data_ex1 after 1 ns;
369
                                        data_ex1( 63 downto 1 ) <= data_ex1( 62 downto 0 ) after  1 ns;
370
                                        data_ex1( 0 ) <= data_ex1( 63 ) after 1 ns;
371
                                end if;
372
                          when "0100" | "0101" => -- Бегущий 0 в блоке 1
373
--                        when "0111" => -- Бегущий 1 в блоке 0
374
                                if( cnt1( 7 downto 0 )=block_rd( 7 downto 0 ) )then
375
                                        data_expect <= data_ex2 after 1 ns;
376
                                        data_ex2( 63 downto 1 ) <= data_ex2( 62 downto 0 ) after  1 ns;
377
                                        data_ex2( 0 ) <= data_ex2( 63 ) after 1 ns;
378
                                else
379
                                        data_expect <= data_ex3 after 1 ns;
380
                                end if;
381
 
382
                          when "0110" | "0111" => -- Счётчик 
383
                            if( cnt1(0)='0' ) then
384
                                        data_expect <= data_ex4 after 1 ns;
385
                                else
386
                                        data_expect <= not data_ex4 after 1 ns;
387
--                                      data_ex4 <= data_ex4 + x"0000000000000001";
388
                                        data_ex4(31 downto 0) <= data_ex4(31 downto 0) + 1;
389
                                        if (data_ex4(31 downto 0)=x"FFFFFFFF") then
390
                                                data_ex4(63 downto 32) <= data_ex4(63 downto 32) + 1;
391
                                        end if;
392
 
393
                                end if;
394
 
395
 
396
                          when "1000" | "1001" => -- Псевдослучайная последовательность          
397
                                        data_expect <= data_ex5 after 1 ns;
398
                                        data_ex5( 63 downto 1 ) <= data_ex5( 62 downto 0 ) after 1 ns;
399
                                        --data_ex5( 0 ) <= data_ex5( 63 ) xor data_ex5(62) after 1 ns;
400
                                        data_ex5( 0 ) <= data_ex5( 63 ) xor data_ex5(62) xor data_ex5(60) xor data_ex5(59) after 1 ns;
401
                          when others=> null;
402
                        end case;
403
                end if;
404
          end if;
405
        end if;
406
end process;
407
 
408
 
409
di_data <= data_expect;
410
di_data_we <= data_en after 1 ns when rising_edge( di_clk );
411
test_gen_bl_wr <= block_rd;
412
 
413
end cl_test_generate;

powered by: WebSVN 2.1.0

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