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_fifo_ext/] [ctrl_ram_cmd_pb.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
-------------------------------------------------------------------------------
2
--
3
-- Title       : ctrl_ram_cmd_pb
4
-- Author      : Dmitry Smekhov
5
-- Company     : Instrumental Systems
6
-- E-mail      : dsmv@insys.ru
7
--
8
-- Version     : 1.3
9
--
10
-------------------------------------------------------------------------------
11
--
12
-- Description : Узел управления запросами к шине PLD_BUS
13
--
14
-------------------------------------------------------------------------------
15
--                                       
16
--  Version 1.3   24.04.2012 Dmitry Smekhov
17
--
18
--  Исправлено формирование block_rd_eot
19
--
20
-------------------------------------------------------------------------------
21
--                                       
22
--  Version 1.3   09.04.2012 Dmitry Smekhov
23
--
24
--  Исправлено формирование rdy во время сброса
25
--
26
-------------------------------------------------------------------------------
27
--                                       
28
--  Version 1.1   06.12.2011 Dmitry Smekhov
29
--
30
--  Добавлен local_adr_we - канал DMA должен начинать работу только после
31
--                                                  получения локального адреса
32
--
33
-------------------------------------------------------------------------------
34
 
35
 
36
library ieee;
37
use ieee.std_logic_1164.all;
38
 
39
package ctrl_ram_cmd_pb_pkg is
40
 
41
component ctrl_ram_cmd_pb is
42
        port(
43
                ---- Global ----
44
                reset                           : in std_logic;         -- 0 - сброс
45
                clk                                     : in std_logic;         --! Тактовая частота ядра - 250 МГц
46
                aclk                            : in std_logic;         --! Тактовая частота локальной шины - 266 МГц
47
 
48
                act                                     : in std_logic;         -- 1 - разрешение цикла обработки
49
                rdy                                     : out std_logic;        -- 1 - завершение цикла обработки
50
 
51
                loc_adr_we                      : in std_logic; -- 1 - запись локального адреса
52
                flag_data                       : in  std_logic_vector( 1 downto 0 );    -- 1 - наличие данных в блоке
53
 
54
                flag_set                        : out std_logic_vector( 1 downto 0 );    -- 1 - установка флага наличия данных
55
                flag_clr                        : out std_logic_vector( 1 downto 0 );    -- 1 - сброс флага наличия данных
56
                next_block                      : in  std_logic;        -- 1 - признак достижения блока 4 килобайта
57
                adr_hi_wr                       : out std_logic;        -- 1 - увеличение старших разрядов адреса для блока
58
 
59
                reg_ctrl                        : in std_logic_vector( 7 downto 0 ); -- регистр управления
60
 
61
                dmar                            : in  std_logic;        -- 1 - запрос DMA                                         
62
 
63
                pf_cb                           : out std_logic;        -- номер текущего блока для обмена с шиной
64
                pf_dma_wr_rdy           : out std_logic;        -- 1 - готовность передать 512 слов
65
                pf_dma_rd_rdy           : out std_logic;        -- 1 - готовность принять 512 слов
66
 
67
                pf_ram_rd                       : in  std_logic;        -- 1 - чтение данных из памяти
68
                pf_repack_we            : in  std_logic         -- 1 - запись в память
69
 
70
 
71
        );
72
end component;
73
 
74
end package;
75
 
76
 
77
 
78
library ieee;
79
use ieee.std_logic_1164.all;
80
use ieee.std_logic_arith.all;
81
use ieee.std_logic_unsigned.all;
82
 
83
entity ctrl_ram_cmd_pb is
84
        port(
85
                ---- Global ----
86
                reset                           : in std_logic;         -- 0 - сброс
87
                clk                                     : in std_logic;         --! Тактовая частота ядра - 250 МГц
88
                aclk                            : in std_logic;         --! Тактовая частота локальной шины - 266 МГц
89
 
90
                act                                     : in std_logic;         -- 1 - разрешение цикла обработки
91
                rdy                                     : out std_logic;        -- 1 - завершение цикла обработки
92
 
93
                loc_adr_we                      : in std_logic; -- 1 - запись локального адреса
94
                flag_data                       : in  std_logic_vector( 1 downto 0 );    -- 1 - наличие данных в блоке
95
 
96
                flag_set                        : out std_logic_vector( 1 downto 0 );    -- 1 - установка флага наличия данных
97
                flag_clr                        : out std_logic_vector( 1 downto 0 );    -- 1 - сброс флага наличия данных
98
                next_block                      : in  std_logic;        -- 1 - признак достижения блока 4 килобайта
99
                adr_hi_wr                       : out std_logic;        -- 1 - увеличение старших разрядов адреса для блока
100
 
101
                reg_ctrl                        : in std_logic_vector( 7 downto 0 ); -- регистр управления
102
 
103
                dmar                            : in  std_logic;        -- 1 - запрос DMA                                         
104
 
105
                pf_cb                           : out std_logic;        -- номер текущего блока для обмена с шиной
106
                pf_dma_wr_rdy           : out std_logic;        -- 1 - готовность передать 128 слов
107
                pf_dma_rd_rdy           : out std_logic;        -- 1 - готовность принять 128 слов
108
 
109
                pf_ram_rd                       : in  std_logic;        -- 1 - чтение данных из памяти
110
                pf_repack_we            : in  std_logic         -- 1 - запись в память
111
 
112
 
113
        );
114
end ctrl_ram_cmd_pb;
115
 
116
 
117
architecture ctrl_ram_cmd_pb of ctrl_ram_cmd_pb is
118
 
119
type  stp_type is ( s0, s2,  sr2, sr5, sr6, sw2, sw3 ); -- s1, sr0, sr1,
120
signal  stp             : stp_type;
121
 
122
signal  rst_p   : std_logic;
123
signal  rst_p0  : std_logic;
124
 
125
signal  cb              : std_logic;
126
 
127
signal  block_rd_eot    : std_logic;
128
--signal        block_wr_eot    : std_logic;
129
signal  pf_repack_we_z  : std_logic;
130
signal  pf_ram_rd_z             : std_logic;
131
 
132
signal  start_rd                : std_logic;
133
signal  start_wr                : std_logic;
134
signal  dmari                   : std_logic;
135
 
136
signal  start_rd0               : std_logic;
137
signal  start_wr0               : std_logic;
138
 
139
signal  start_rd1               : std_logic;
140
signal  start_wr1               : std_logic;
141
 
142
signal  flag0_set               : std_logic_vector( 1 downto 0 );
143
signal  flag1_set               : std_logic_vector( 1 downto 0 );
144
signal  flag2_set               : std_logic_vector( 1 downto 0 );
145
 
146
signal  flag0_clr               : std_logic_vector( 1 downto 0 );
147
signal  flag1_clr               : std_logic_vector( 1 downto 0 );
148
signal  flag2_clr               : std_logic_vector( 1 downto 0 );
149
signal  local_adr_rdy   : std_logic;    -- 1 - локальный адрес записан 
150
 
151
 
152
 
153
attribute       tig                     : string;
154
attribute       tig                     of flag2_set    : signal is "";
155
attribute       tig                     of flag2_clr    : signal is "";
156
attribute       tig                     of start_rd0    : signal is "";
157
attribute       tig                     of start_wr0    : signal is "";
158
 
159
begin
160
 
161
rst_p0 <= (not reset) or reg_ctrl(4) after 1 ns when rising_edge( aclk );
162
rst_p <= rst_p0 after 1 ns when rising_edge( aclk );
163
 
164
pf_cb <= cb;
165
 
166
pf_repack_we_z <= pf_repack_we after 1 ns when rising_edge( aclk );
167
--block_rd_eot <= '1' when pf_repack_we='0' and pf_repack_we_z='1' else '0';
168
block_rd_eot <= next_block after 1 ns when rising_edge( aclk );
169
 
170
pf_ram_rd_z <= pf_ram_rd after 1 ns when rising_edge( aclk );
171
--block_wr_eot <= '1' when pf_ram_rd='0' and pf_ram_rd_z='1' else '0';
172
 
173
dmari <= dmar or not reg_ctrl(1);
174
 
175
pr_local_adr_rdy: process( clk ) begin
176
        if( rising_edge( clk ) ) then
177
                if( reg_ctrl(0)='0' ) then
178
                        local_adr_rdy <= '0' after 1 ns;
179
                elsif( loc_adr_we='1' ) then
180
                        local_adr_rdy <= '1' after 1 ns;
181
                end if;
182
        end if;
183
end process;
184
 
185
 
186
start_rd0 <= reg_ctrl(0) and reg_ctrl(2) and dmari and not flag_data( conv_integer(cb) ) and local_adr_rdy after 1 ns when rising_edge( aclk );
187
start_wr0 <= reg_ctrl(0) and (not reg_ctrl(2)) and dmari and flag_data( conv_integer(cb) ) and local_adr_rdy after 1 ns when rising_edge( aclk ) ;
188
 
189
 
190
start_rd1 <= start_rd0 after 1 ns when rising_edge( aclk );
191
start_wr1 <= start_wr0 after 1 ns when rising_edge( aclk );
192
 
193
start_rd <= act and start_rd1;
194
start_wr <= act and start_wr1;
195
 
196
pr_state: process( aclk ) begin
197
        if( rising_edge( aclk ) ) then
198
 
199
                case( stp ) is
200
 
201
                        when s0 =>
202
                                flag0_set(0) <= '0' after 1 ns;
203
                                flag0_set(1) <= '0' after 1 ns;
204
                                flag0_clr(0) <= '0' after 1 ns;
205
                                flag0_clr(1) <= '0' after 1 ns;
206
                                adr_hi_wr <= '0' after 1 ns;
207
 
208
                                pf_dma_wr_rdy <= '0' after 1 ns;
209
                                pf_dma_rd_rdy <= '0' after 1 ns;
210
 
211
                                rdy <= '0' after 1 ns;
212
                                if( start_rd='1' ) then
213
                                        pf_dma_rd_rdy <= '1' after  1 ns;
214
                                        stp <= sr2 after  1ns;
215
                                elsif( start_wr='1' ) then
216
                                    pf_dma_wr_rdy <= '1' after 1 ns;
217
                                        stp <= sw2 after 1 ns;
218
                                elsif( act='1' ) then
219
                                        stp <= s2 after 1 ns;
220
                                end if;
221
 
222
 
223
 
224
                        when s2 => --- Канал DMA выключен ----
225
                                rdy <= '1' after 1 ns;
226
                                --cb <= '0';
227
                                if( act='0' ) then
228
                                        stp <= s0 after 1 ns;
229
                                end if;
230
 
231
 
232
 
233
                        when sr2 =>
234
--                              if( pf_repack_we_z='1' ) then
235
--                                      pf_dma_rd_rdy <= '0' after 1 ns;
236
--                              end if;
237
                                if( block_rd_eot='1' ) then
238
                                        stp <= sr5 after 1 ns;
239
                                end if;
240
 
241
 
242
                        when sr5 =>
243
                                pf_dma_rd_rdy <= '0' after 1 ns;
244
                        --flag_set(conv_integer(cb)) <= '1' after 1 ns;
245
                                flag0_set(0) <= not cb after 1 ns;
246
                                flag0_set(1) <= cb after 1 ns;
247
 
248
--                      
249
--                              flag0_set(0) <= next_block and not cb after 1 ns;
250
--                              flag0_set(1) <= next_block and cb after 1 ns;
251
--                              if( next_block='1' ) then
252
--                                      cb <= not cb after 1 ns;
253
--                              end if;                                         
254
                                cb <= not cb after 1 ns;
255
                                stp <= sr6 after 1 ns;
256
                                adr_hi_wr <= '1' after 1 ns;
257
 
258
                        when sr6 =>
259
                                adr_hi_wr <= '0' after 1 ns;
260
                                flag0_set(0) <= '0' after 1 ns;
261
                                flag0_set(1) <= '0' after 1 ns;
262
                                flag0_clr(0) <= '0' after 1 ns;
263
                                flag0_clr(1) <= '0' after 1 ns;
264
                                rdy <= '1' after 1 ns;
265
                                if( act='0' ) then
266
                                        stp <= s0 after 1 ns;
267
                                end if;
268
 
269
                        when sw2 =>
270
--                              if( pf_ram_rd='1' ) then
271
--                                      pf_dma_wr_rdy <= '0' after  1 ns;
272
--                              end if;
273
                                if( block_rd_eot='1' ) then
274
                                        stp <= sw3 after 1 ns;
275
                                end if;
276
 
277
                        when sw3 =>
278
                                pf_dma_wr_rdy <= '0' after  1 ns;
279
                                flag0_clr(0) <= not cb after 1 ns;
280
                                flag0_clr(1) <= cb after 1 ns;
281
--                              if( next_block='1' ) then
282
--                                      cb <= not cb after 1 ns;
283
--                              end if;                 
284
                                cb <= not cb after 1 ns;
285
                                stp <= sr6 after  1 ns;
286
                                adr_hi_wr <= '1' after 1 ns;
287
 
288
 
289
 
290
                end case;
291
 
292
 
293
                if( rst_p='1' ) then
294
                        stp <= s0 after 1 ns;
295
                        cb <= '0' after 1 ns;
296
                        rdy <= act after 1 ns;
297
                end if;
298
 
299
 
300
        end if;
301
end process;
302
 
303
gen_flag: for ii in 0 to 1 generate
304
 
305
pr_flag1_set: process( flag0_set(ii), clk ) begin
306
 
307
        if( flag0_set(ii)='1' ) then
308
                flag1_set(ii) <= '1' after 1 ns;
309
        elsif( rising_edge( clk ) ) then
310
                if( flag2_set(ii)='1' or rst_p='1' ) then
311
                        flag1_set(ii) <= '0' after 1 ns;
312
                end if;
313
        end if;
314
 
315
end process;
316
 
317
pr_flag1_clr: process( flag0_clr(ii), clk ) begin
318
 
319
        if( flag0_clr(ii)='1' or rst_p='1' ) then
320
                flag1_clr(ii) <= '1' after 1 ns;
321
        elsif( rising_edge( clk ) ) then
322
                if( flag2_clr(ii)='1' ) then
323
                        flag1_clr(ii) <= '0' after 1 ns;
324
                end if;
325
        end if;
326
 
327
end process;
328
 
329
end generate;
330
 
331
flag2_set <= flag1_set after 1 ns when rising_edge( clk );
332
flag2_clr <= flag1_clr after 1 ns when rising_edge( clk );
333
 
334
flag_set <= flag1_set;
335
flag_clr <= flag1_clr;
336
 
337
 
338
end ctrl_ram_cmd_pb;

powered by: WebSVN 2.1.0

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