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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [core/] [adm/] [trd_test_ctrl/] [trd_test_ctrl_m1.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
---------------------------------------------------------------------------------------------------
2
--
3
-- Title       : trd_test_ctrl_m1
4
-- Author      : Ilya Ivanov
5
-- Company     : Instrumental System
6
--
7
-- Version     : 1.3
8
--------------------------------------------------------------------------------------------------
9
--
10
-- Description :        Приём цифрового потока
11
--
12
---------------------------------------------------------------------------------------------------
13
--
14
--   Version 1.3  11.06.2008
15
--                Добавлена возможность измерения тактовой частоты
16
--
17
---------------------------------------------------------------------------------------------------
18
--
19
--   Version 1.2  17.07.2007
20
--                Добавлены выходы регистров MODE0, MODE1, MODE2, MODE3
21
--                                Добавлен выход счётчика слов
22
--
23
---------------------------------------------------------------------------------------------------
24
--
25
--   Version 1.1  18.08.2006
26
--                Используется FIFO cl_fifo1024x64_v2                          
27
--
28
---------------------------------------------------------------------------------------------------
29
 
30
library ieee;
31
use ieee.std_logic_1164.all;
32
 
33
 
34
 
35
 
36
 
37
library work;
38
use work.cl_chn_v3_pkg.all;
39
use work.adm2_pkg.all;
40
 
41
package trd_test_ctrl_m1_pkg is
42
 
43
constant  ID_TEST                       : std_logic_vector( 15 downto 0 ):=x"004F"; -- идентификатор тетрады
44
constant  ID_MODE_TEST          : std_logic_vector( 15 downto 0 ):=x"0001"; -- модификатор тетрады
45
constant  VER_TEST                      : std_logic_vector( 15 downto 0 ):=x"0103";      -- версия тетрады
46
constant  RES_TEST                      : std_logic_vector( 15 downto 0 ):=x"0000";      -- ресурсы тетрады
47
constant  FIFO_TEST                     : std_logic_vector( 15 downto 0 ):=x"0000"; -- размер FIFO
48
constant  FTYPE_TEST            : std_logic_vector( 15 downto 0 ):=x"0000"; -- ширина FIFO
49
 
50
component trd_test_ctrl_m1 is
51
        generic(
52
                SystemFreq      : integer:= 500         -- значение системной тактовой частоты
53
        );
54
        port(
55
                -- GLOBAL
56
                reset                           : in std_logic;         -- 0 - сброс
57
                clk                                     : in std_logic;         -- тактовая частота
58
 
59
                -- Управление тетрадой
60
                cmd_data_in                     : in std_logic_vector( 15 downto 0 ); -- шина данных CMD_DATA
61
                cmd                                     : in bl_cmd;            -- сигналы управления
62
 
63
                cmd_data_out            : out std_logic_vector( 15 downto 0 ); -- выходы регистров, выход через буфер
64
                cmd_data_out2           : out std_logic_vector( 15 downto 0 ); -- выходы регистров, выход без буфера
65
 
66
                bx_irq                          : out std_logic;        -- 1 - прерывание от тетрады
67
                bx_drq                          : out bl_drq;           -- управление DMA
68
 
69
                mode0                           : out std_logic_vector( 15 downto 0 );   -- регистр MODE0
70
                mode1                           : out std_logic_vector( 15 downto 0 );   -- регистр MODE1
71
                mode2                           : out std_logic_vector( 15 downto 0 );   -- регистр MODE2
72
                mode3                           : out std_logic_vector( 15 downto 0 );   -- регистр MODE3
73
 
74
                ---- DIO_IN ----
75
                di_clk                          : out std_logic;        -- тактовая частота записи в FIFO
76
                di_data                         : out std_logic_vector( 63 downto 0 );   -- данные
77
                di_data_we                      : out std_logic;        -- 1 - запись данных
78
                di_flag_wr                      : in  bl_fifo_flag;     -- флаги FIFO
79
                di_fifo_rst                     : in  std_logic;        -- 0 - сброс FIFO
80
                di_mode1                        : in  std_logic_vector( 15 downto 0 ); -- регистр MODE1
81
                di_start                        : in  std_logic;        -- 1 - разрешение работы (MODE0[5])
82
 
83
                ---- DIO_OUT ----
84
                do_clk                          : out std_logic;        -- тактовая частота чтения из FIFO
85
                do_data                         : in  std_logic_vector( 63 downto 0 );
86
                do_data_cs                      : out std_logic;        -- 0 - чтение данных
87
                do_flag_rd                      : in  bl_fifo_flag;     -- флаги FIFO
88
                do_fifo_rst                     : in  std_logic;        -- 0 - сброс FIFO
89
                do_mode1                        : in  std_logic_vector( 15 downto 0 );   -- регистр MODE1
90
                do_start                        : in  std_logic;        -- 1 - разрешение работы (MODE0[5])
91
 
92
                ---- Определение тактовой частоты ----
93
                clk_sys                         : in std_logic:='0';             -- опорная тактовая частота
94
                clk_check0                      : in std_logic:='0';             -- измеряемая частота, вход 0
95
                clk_check1                      : in std_logic:='0';             -- измеряемая частота, вход 1
96
                clk_check2                      : in std_logic:='0'                      -- измеряемая частота, вход 2
97
 
98
                --------------------------------------------
99
 
100
 
101
 
102
            );
103
end component;
104
 
105
end trd_test_ctrl_m1_pkg;
106
 
107
library ieee;
108
use ieee.std_logic_1164.all;
109
 
110
library unisim;
111
use unisim.vcomponents.all;
112
 
113
library work;
114
use work.cl_chn_v3_pkg.all;
115
use work.adm2_pkg.all;
116
use work.cl_test_generate_pkg.all;
117
use work.cl_test_check_pkg.all;
118
use work.ctrl_freq_pkg.all;
119
 
120
entity trd_test_ctrl_m1 is
121
        generic(
122
                SystemFreq      : integer:= 500         -- значение системной тактовой частоты
123
        );
124
        port(
125
                -- GLOBAL
126
                reset                           : in std_logic;         -- 0 - сброс
127
                clk                                     : in std_logic;         -- тактовая частота
128
 
129
                -- Управление тетрадой
130
                cmd_data_in                     : in std_logic_vector( 15 downto 0 ); -- шина данных CMD_DATA
131
                cmd                                     : in bl_cmd;            -- сигналы управления
132
 
133
                cmd_data_out            : out std_logic_vector( 15 downto 0 ); -- выходы регистров, выход через буфер
134
                cmd_data_out2           : out std_logic_vector( 15 downto 0 ); -- выходы регистров, выход без буфера
135
 
136
                bx_irq                          : out std_logic;        -- 1 - прерывание от тетрады
137
                bx_drq                          : out bl_drq;           -- управление DMA
138
 
139
                mode0                           : out std_logic_vector( 15 downto 0 );   -- регистр MODE0
140
                mode1                           : out std_logic_vector( 15 downto 0 );   -- регистр MODE1
141
                mode2                           : out std_logic_vector( 15 downto 0 );   -- регистр MODE2
142
                mode3                           : out std_logic_vector( 15 downto 0 );   -- регистр MODE3
143
 
144
                ---- DIO_IN ----
145
                di_clk                          : out std_logic;        -- тактовая частота записи в FIFO
146
                di_data                         : out std_logic_vector( 63 downto 0 );   -- данные
147
                di_data_we                      : out std_logic;        -- 1 - запись данных
148
                di_flag_wr                      : in  bl_fifo_flag;     -- флаги FIFO
149
                di_fifo_rst                     : in  std_logic;        -- 0 - сброс FIFO
150
                di_mode1                        : in  std_logic_vector( 15 downto 0 ); -- регистр MODE1
151
                di_start                        : in  std_logic;        -- 1 - разрешение работы (MODE0[5])
152
 
153
                ---- DIO_OUT ----
154
                do_clk                          : out std_logic;        -- тактовая частота чтения из FIFO
155
                do_data                         : in  std_logic_vector( 63 downto 0 );
156
                do_data_cs                      : out std_logic;        -- 0 - чтение данных
157
                do_flag_rd                      : in  bl_fifo_flag;     -- флаги FIFO
158
                do_fifo_rst                     : in  std_logic;        -- 0 - сброс FIFO
159
                do_mode1                        : in  std_logic_vector( 15 downto 0 );   -- регистр MODE1
160
                do_start                        : in  std_logic;        -- 1 - разрешение работы (MODE0[5])
161
 
162
                ---- Определение тактовой частоты ----
163
                clk_sys                         : in std_logic:='0';             -- опорная тактовая частота
164
                clk_check0                      : in std_logic:='0';             -- измеряемая частота, вход 0
165
                clk_check1                      : in std_logic:='0';             -- измеряемая частота, вход 1
166
                clk_check2                      : in std_logic:='0'                      -- измеряемая частота, вход 2
167
 
168
                --------------------------------------------
169
 
170
 
171
 
172
            );
173
end trd_test_ctrl_m1;
174
 
175
architecture trd_test_ctrl_m1 of trd_test_ctrl_m1 is
176
 
177
 
178
signal rst,fifo_rst0            : std_logic;
179
signal flag_rdi                 : bl_fifo_flag;
180
signal cmode0                           : std_logic_vector( 15 downto 0 );
181
signal status                           : std_logic_vector( 15 downto 0 );
182
signal cmd_data_int                     : std_logic_vector( 15 downto 0 );
183
 
184
signal test_check_ctrl          : std_logic_vector( 15 downto 0 );
185
signal test_check_size          : std_logic_vector( 15 downto 0 );
186
signal test_check_bl_rd         : std_logic_vector( 31 downto 0 );
187
signal test_check_bl_ok     : std_logic_vector( 31 downto 0 );
188
signal test_check_bl_err        : std_logic_vector( 31 downto 0 );
189
signal test_check_error     : std_logic_vector( 31 downto 0 );
190
signal test_check_err_adr       : std_logic_vector( 15 downto 0 );
191
signal test_check_err_data      : std_logic_vector( 15 downto 0 );
192
signal test_gen_ctrl            : std_logic_vector( 15 downto 0 );
193
signal test_gen_size            : std_logic_vector( 15 downto 0 );
194
signal test_gen_bl_wr           : std_logic_vector( 31 downto 0 );
195
 
196
signal  di_gen_data                     : std_logic_vector( 63 downto 0 );
197
signal  di_gen_data_we          : std_logic;
198
signal  do_cs_rdy                       : std_logic;
199
signal  do_data_en                      : std_logic;
200
signal  mux_ctrl                        : std_logic_vector( 1 downto 0 );
201
 
202
signal  cmd_reg                         : std_logic_vector( 15 downto 0 );
203
signal  cmd_reg0                        : std_logic_vector( 15 downto 0 );
204
signal  cmd_reg1                        : std_logic_vector( 15 downto 0 );
205
signal  cmd_reg_i0                      : std_logic_vector( 15 downto 0 );
206
signal  cmd_reg_i1                      : std_logic_vector( 15 downto 0 );
207
 
208
signal  test_gen_cnt1           : std_logic_vector( 15 downto 0 );
209
signal  test_gen_cnt2           : std_logic_vector( 15 downto 0 );
210
 
211
signal  freq0                           : std_logic_vector( 15 downto 0 );
212
signal  freq1                           : std_logic_vector( 15 downto 0 );
213
signal  freq2                           : std_logic_vector( 15 downto 0 );
214
 
215
begin
216
 
217
xstatus: ctrl_buft16 port map(
218
        t => cmd.status_cs,
219
        i => cmd_data_int,
220
        o => cmd_data_out );
221
 
222
cmd_data_out2 <= cmd_data_int;
223
 
224
cmd_data_int <= status when cmd.status_cs='0' else
225
                                cmd_reg;
226
 
227
chn: cl_chn_v3
228
        generic map(
229
          -- 2 - out - для тетрады вывода
230
          -- 1 - in  - для тетрады ввода
231
          chn_type                      => 1
232
        )
233
        port map (
234
                reset                   => reset,
235
                clk                     => clk,
236
                -- Флаги
237
                cmd_rdy                 => '1',
238
                rdy                             => flag_rdi.ef,
239
                fifo_flag               => flag_rdi,
240
                -- Тетрада      
241
                data_in                 => cmd_data_in,
242
                cmd                             => cmd,
243
                bx_irq                  => bx_irq,
244
                bx_drq                  => bx_drq,
245
                status                  => status,
246
                -- Управление
247
                mode0                   => cmode0,
248
                mode1                   => mode1,
249
                mode2                   => mode2,
250
                mode3                   => mode3,
251
                rst                             => rst,
252
                fifo_rst                => fifo_rst0
253
        );
254
 
255
mode0 <= cmode0;
256
 
257
test_gen: cl_test_generate
258
        port map(
259
 
260
                ---- Global ----
261
                reset           => rst,                         -- 0 - сброс
262
                clk                     => clk,                         -- тактовая частота
263
 
264
                ---- DIO_IN ----
265
                di_clk          => clk,                         -- тактовая частота записи в FIFO
266
                di_data         => di_gen_data,         -- данные
267
                di_data_we      => di_gen_data_we,      -- 1 - запись данных
268
                di_flag_paf     => di_flag_wr.paf,      -- 1 - есть место для записи
269
                di_fifo_rst     => di_fifo_rst,         -- 0 - сброс FIFO
270
                di_start        => di_start,            -- 1 - разрешение работы (MODE0[5])
271
 
272
 
273
                ---- Управление ----
274
                test_gen_ctrl   => test_gen_ctrl,
275
                test_gen_size   => test_gen_size,                -- размер в блоках по 512x64 (4096 байт)
276
                test_gen_bl_wr  => test_gen_bl_wr,
277
                test_gen_cnt1   => test_gen_cnt1,       -- Счётчик разрешения работы
278
                test_gen_cnt2   => test_gen_cnt2        -- Счётчик запрещения работы
279
 
280
        );
281
 
282
 
283
test_check: cl_test_check
284
        port map(
285
 
286
                ---- Global ----
287
                reset           => rst,                         -- 0 - сброс
288
                clk                     => clk,                         -- тактовая частота
289
 
290
                ---- DIO_OUT ----
291
                do_clk          => clk,                         -- тактовая частота чтения из FIFO
292
                do_data         => do_data,
293
                do_data_en      => do_data_en,          -- 1 - передача данных из dio_out
294
 
295
 
296
                ---- Управление ----
297
                test_check_ctrl                  => test_check_ctrl,
298
                test_check_size                  => test_check_size,
299
                test_check_bl_rd                 => test_check_bl_rd,
300
                test_check_bl_ok                 => test_check_bl_ok,
301
                test_check_bl_err                => test_check_bl_err,
302
                test_check_error                 => test_check_error,
303
                test_check_err_adr               => test_check_err_adr,
304
                test_check_err_data              => test_check_err_data
305
);
306
 
307
---- Мультиплексор для выходной последовательности ----
308
di_data <= do_data                      when mux_ctrl( 1 downto 0 )="00" else
309
                   di_gen_data          when mux_ctrl( 1 downto 0 )="01" else
310
                        (others=>'0');
311
 
312
di_data_we <= do_data_en         when mux_ctrl( 1 downto 0 )="00" else
313
                      di_gen_data_we when mux_ctrl( 1 downto 0 )="01" else
314
                          '0';
315
 
316
pr_do_cs_rdy: process( clk ) begin
317
        if( rising_edge( clk ) ) then
318
                if( mux_ctrl="00" ) then
319
                        if( di_flag_wr.paf='1' and di_start='1' ) then
320
                                do_cs_rdy <= '1' after 1 ns;
321
                        else
322
                                do_cs_rdy <= '0' after 1 ns;
323
                        end if;
324
                else
325
                        do_cs_rdy <= '1' after 1 ns;
326
                end if;
327
 
328
                if( do_flag_rd.pae='1' and do_start='1'  and do_cs_rdy='1' and rst='1') then
329
                        do_data_en <= '1' after 1 ns;
330
                        do_data_cs <= '0' after 1 ns;
331
                else
332
                        do_data_en <= '0' after 1 ns;
333
                        do_data_cs <= '1' after 1 ns;
334
                end if;
335
 
336
        end if;
337
end process;
338
 
339
 
340
cmd_reg_i0 <=   test_check_bl_rd( 15 downto 0 )          when cmd.adr( 3 downto 0 )=x"0" else
341
                                test_check_bl_rd( 31 downto 16 )        when cmd.adr( 3 downto 0 )=x"1" else
342
                                test_check_bl_ok( 15 downto 0 )          when cmd.adr( 3 downto 0 )=x"2" else
343
                                test_check_bl_ok( 31 downto 16 )        when cmd.adr( 3 downto 0 )=x"3" else
344
                                test_check_bl_err( 15 downto 0 )         when cmd.adr( 3 downto 0 )=x"4" else
345
                                test_check_bl_err( 31 downto 16 )       when cmd.adr( 3 downto 0 )=x"5" else
346
                                test_check_error( 15 downto 0 )          when cmd.adr( 3 downto 0 )=x"6" else
347
                                test_check_error( 31 downto 16 )        when cmd.adr( 3 downto 0 )=x"7" else
348
                                test_check_err_adr( 15 downto 0 )        when cmd.adr( 3 downto 0 )=x"8" else
349
                                test_check_err_data( 15 downto 0 )  when cmd.adr( 3 downto 0 )=x"9" else
350
                                test_gen_bl_wr( 15 downto 0 )            when cmd.adr( 3 downto 0 )=x"A" else
351
                                test_gen_bl_wr( 31 downto 16 )          when cmd.adr( 3 downto 0 )=x"B" else
352
                                (others=>'-');
353
 
354
cmd_reg_i1 <=           freq0   when cmd.adr( 3 downto 0 )=x"0" else
355
                                        freq1   when cmd.adr( 3 downto 0 )=x"1" else
356
                                        freq2;
357
 
358
cmd_reg0 <= cmd_reg_i0 after 1 ns when rising_edge( clk );
359
cmd_reg1 <= cmd_reg_i1 after 1 ns when rising_edge( clk );
360
 
361
cmd_reg <= cmd_reg0 when cmd.adr( 5 )='0' else cmd_reg1;
362
 
363
pr_reg: process( clk ) begin
364
        if( rising_edge( clk ) ) then
365
                if( rst='0' ) then
366
                        mux_ctrl <= (others=>'0') after 1 ns;
367
                        test_check_ctrl <= (others=>'0') after 1 ns;
368
                        test_check_size <= (others=>'0') after 1 ns;
369
                        test_gen_ctrl <= (others=>'0') after 1 ns;
370
                        test_gen_size <= (others=>'0') after 1 ns;
371
                elsif( cmd.cmd_data_we='1' and cmd.adr( 9 downto 8 )="00" ) then
372
                        case( cmd.adr( 4 downto 0 ) ) is
373
                                when "01111" =>  mux_ctrl <= cmd_data_in( 1 downto 0 ) after 1 ns;
374
                                when "11010" =>  test_gen_cnt1   <= cmd_data_in after 1 ns;
375
                                when "11011" =>  test_gen_cnt2   <= cmd_data_in after 1 ns;
376
                                when "11100" =>  test_check_ctrl <= cmd_data_in after 1 ns;
377
                                when "11101" =>  test_check_size <= cmd_data_in after 1 ns;
378
                                when "11110" =>  test_gen_ctrl   <= cmd_data_in after 1 ns;
379
                                when "11111" =>  test_gen_size   <= cmd_data_in after 1 ns;
380
                                when others => null;
381
                        end case;
382
                elsif( cmd.cmd_data_we='1' and cmd.adr( 9 downto 8 )="10" ) then
383
                        case( cmd.adr( 4 downto 0 ) ) is
384
                                when "11000" =>  test_check_err_adr   <= cmd_data_in after 1 ns;
385
                                when others => null;
386
                        end case;
387
                end if;
388
        end if;
389
end process;
390
 
391
do_clk <= clk;
392
di_clk <= clk;
393
 
394
 
395
fr0: ctrl_freq
396
        generic map(
397
                SystemFreq      => SystemFreq,          -- значение системной тактовой частоты
398
                FreqDiv         => 1                            -- коэффициент деления входной частоты
399
                                                                                -- ( 2 - на вход подаётся половина измеряемой частоты )
400
        )
401
        port map(
402
                reset           => rst,                 -- 0 - сброс
403
                clk_sys         => clk_sys,             -- системная тактовая частота
404
                clk_in          => clk_check0,  -- входная тактовая частота АЦП
405
                freq_adc        => freq0                -- ориентировочное значение тактовой частоты АЦП в МГц
406
        );
407
 
408
fr1: ctrl_freq
409
        generic map(
410
                SystemFreq      => SystemFreq,          -- значение системной тактовой частоты
411
                FreqDiv         => 1                            -- коэффициент деления входной частоты
412
                                                                                -- ( 2 - на вход подаётся половина измеряемой частоты )
413
        )
414
        port map(
415
                reset           => rst,                 -- 0 - сброс
416
                clk_sys         => clk_sys,             -- системная тактовая частота
417
                clk_in          => clk_check1,  -- входная тактовая частота АЦП
418
                freq_adc        => freq1                -- ориентировочное значение тактовой частоты АЦП в МГц
419
        );
420
 
421
fr2: ctrl_freq
422
        generic map(
423
                SystemFreq      => SystemFreq,          -- значение системной тактовой частоты
424
                FreqDiv         => 1                            -- коэффициент деления входной частоты
425
                                                                                -- ( 2 - на вход подаётся половина измеряемой частоты )
426
        )
427
        port map(
428
                reset           => rst,                 -- 0 - сброс
429
                clk_sys         => clk_sys,             -- системная тактовая частота
430
                clk_in          => clk_check2,  -- входная тактовая частота АЦП
431
                freq_adc        => freq2                -- ориентировочное значение тактовой частоты АЦП в МГц
432
        );
433
 
434
 
435
 
436
end trd_test_ctrl_m1;

powered by: WebSVN 2.1.0

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