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

Subversion Repositories pcie_ds_dma

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

powered by: WebSVN 2.1.0

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