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_dma_ext_cmd.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
-------------------------------------------------------------------------------
2
--
3
-- Title       : ctrl_dma_ext_cmd
4
-- Author      : Dmitry Smekhov
5
-- Company     : Instrumental Systems
6
-- E-mail      : dsmv@insys.ru
7
--
8
-- Version     : 1.0
9
--
10
-------------------------------------------------------------------------------
11
--
12
-- Description : Узел формирования команды для контроллера DMA PLDA
13
--                                
14
--              Узел формирует повторное обращение при ошибочном завершении обмена
15
--                                                                                 
16
--              Поле регистра состояния:
17
--                      0: 1 - завершение обмена
18
--                      1: 1 - ошибка при обмене 
19
--                      2: 1 - размер равен 0
20
--
21
-------------------------------------------------------------------------------
22
 
23
 
24
library ieee;
25
use ieee.std_logic_1164.all;
26
 
27
library work;
28
use work.core64_type_pkg.all;
29
 
30
package ctrl_dma_ext_cmd_pkg is
31
 
32
component ctrl_dma_ext_cmd is
33
        generic(
34
                is_dsp48                : in integer:=1         -- 1 - использовать DSP48, 0 - не использовать DSP48
35
        );
36
        port(
37
                ---- Global ----
38
                rstp                            : in std_logic;         --! 1 - сброс
39
                clk                                     : in std_logic;         --! тактовая частота 250 МГц
40
 
41
                ---- CTRL_MAIN ----
42
                dma_reg0                        : in std_logic_vector( 2 downto 0 );     --! регистр упрравления
43
                                                                                                                                        --! 0:  1 - запуск обмена
44
                                                                                                                                        --! 1:  1 - блок 4 kB, 0 - 512 байт
45
                                                                                                                                        --! 2:  1 - увеличение адреса, 0 - запись адреса из дескриптора
46
 
47
                dma_change_adr          : in std_logic  ;       --! 1 - изменение адреса и размера
48
                dma_cmd_status          : out std_logic_vector( 2 downto 0 );    --! состояние DMA
49
                                                                                                                                --! 0: 1 - завершение обмена
50
                                                                                                                                --! 1: 1 - ошибка при обмене
51
                                                                                                                                --! 2: 1 - размер блока равен 0
52
                dma_chn                         : in std_logic;                                                 --! номер канала DMA
53
 
54
                ---- CTRL_EXT_DESCRIPTOR ----                    
55
                dsc_adr_h                       : in std_logic_vector( 7 downto 0 );    --! адрес, байт 4
56
                dsc_adr                         : in std_logic_vector( 23 downto 0 );    --! адрес, байты 3..1
57
                dsc_size                        : in std_logic_vector( 23 downto 0 );    --! размер, байты 3..1
58
 
59
 
60
                ---- TX_ENGINE ----
61
                tx_ext_fifo                     : in type_tx_ext_fifo;                  --! обмен TX->EXT_FIFO 
62
                tx_req_wr                       : out std_logic;                                --! 1 - требование записи блока 4 кБ
63
                tx_req_rd                       : out std_logic;                                --! 1 - требование чтения
64
                tx_rd_size                      : out std_logic;                                --! 0 - 512 байт, 1 - 4 кБ
65
                tx_pci_adr                      : out std_logic_vector( 39 downto 8 );  --! адрес на шине PCI 
66
 
67
                ---- RX_ENGINE ----
68
                rx_ext_fifo                     : in type_rx_ext_fifo;                  --! обмен RX->EXT_FIFO 
69
 
70
                ---- Контрольные точки ----
71
                test                            : out std_logic_vector( 3 downto 0 )
72
        );
73
 
74
 
75
end component;
76
 
77
end package;
78
 
79
 
80
 
81
library ieee;
82
use ieee.std_logic_1164.all;
83
use ieee.std_logic_arith.all;
84
use ieee.std_logic_unsigned.all;
85
 
86
library work;
87
use work.core64_type_pkg.all;
88
use work.ctrl_dma_adr_pkg.all;
89
 
90
 
91
entity ctrl_dma_ext_cmd is
92
        generic(
93
                is_dsp48                : in integer:=1         -- 1 - использовать DSP48, 0 - не использовать DSP48
94
        );
95
        port(
96
                ---- Global ----
97
                rstp                            : in std_logic;         --! 1 - сброс
98
                clk                                     : in std_logic;         --! тактовая частота 250 МГц
99
 
100
                ---- CTRL_MAIN ----
101
                dma_reg0                        : in std_logic_vector( 2 downto 0 );     --! регистр упрравления
102
                                                                                                                                        --! 0:  1 - запуск обмена
103
                                                                                                                                        --! 1:  1 - блок 4 kB, 0 - 512 байт
104
                                                                                                                                        --! 2:  1 - увеличение адреса, 0 - запись адреса из дескриптора
105
                dma_change_adr          : in std_logic  ;       --! 1 - изменение адреса и размера
106
                dma_cmd_status          : out std_logic_vector( 2 downto 0 );    --! состояние DMA
107
                                                                                                                                --! 0: 1 - завершение обмена
108
                                                                                                                                --! 1: 1 - ошибка при обмене
109
                                                                                                                                --! 2: 1 - размер блока равен 0
110
                dma_chn                         : in std_logic;                                                 --! номер канала DMA
111
 
112
                ---- CTRL_EXT_DESCRIPTOR ----                    
113
                dsc_adr_h                       : in std_logic_vector( 7 downto 0 );    --! адрес, байт 4
114
                dsc_adr                         : in std_logic_vector( 23 downto 0 );    --! адрес, байты 3..1
115
                dsc_size                        : in std_logic_vector( 23 downto 0 );    --! размер, байты 3..1
116
 
117
 
118
                ---- TX_ENGINE ----
119
                tx_ext_fifo                     : in type_tx_ext_fifo;                  --! обмен TX->EXT_FIFO 
120
                tx_req_wr                       : out std_logic;                                --! 1 - требование записи блока 4 кБ
121
                tx_req_rd                       : out std_logic;                                --! 1 - требование чтения
122
                tx_rd_size                      : out std_logic;                                --! 0 - 512 байт, 1 - 4 кБ
123
                tx_pci_adr                      : out std_logic_vector( 39 downto 8 );  --! адрес на шине PCI 
124
 
125
                ---- RX_ENGINE ----
126
                rx_ext_fifo                     : in type_rx_ext_fifo;                  --! обмен RX->EXT_FIFO 
127
 
128
                ---- Контрольные точки ----
129
                test                            : out std_logic_vector( 3 downto 0 )
130
        );
131
 
132
 
133
end ctrl_dma_ext_cmd;
134
 
135
 
136
architecture ctrl_dma_ext_cmd of ctrl_dma_ext_cmd is
137
 
138
type stp_type is ( s0, s1, s2, s3 );
139
 
140
signal  stp             : stp_type;
141
 
142
 
143
signal  status  : std_logic_vector( 3 downto 0 );
144
 
145
signal  dma_rw  : std_logic;
146
 
147
signal  cnt_pause       : std_logic_vector( 5 downto 0 );
148
 
149
signal  dma_cmd_rdy             : std_logic;
150
signal  dma_cmd_error   : std_logic;
151
signal  dma_cmd_start   : std_logic;
152
 
153
signal  pci_adr                 : std_logic_vector( 39 downto 0 );
154
signal  pci_size_z              : std_logic;
155
 
156
signal  size4k                  : std_logic;
157
 
158
 
159
begin
160
 
161
 
162
dma_cmd_start <= dma_reg0(0);
163
 
164
dma_adr: ctrl_dma_adr
165
        generic map(
166
                is_dsp48                => is_dsp48
167
        )
168
        port map(
169
                ---- Global ----
170
                clk                             => clk,                 -- тактовая частота
171
 
172
                ---- Доступ к PICOBLAZE ----
173
                dma_chn                 => dma_chn,                             -- номер канала DMA       
174
                reg0                    => dma_reg0,                    -- регистр DMA_CTRL
175
                reg41_wr                => dma_change_adr,              -- 1 - запись в регистр 41
176
 
177
                ---- CTRL_EXT_DESCRIPTOR ----
178
                dsc_adr                 => dsc_adr,                             -- адрес, байты 3..1
179
                dsc_adr_h               => dsc_adr_h,               -- адрес, байт 4
180
                dsc_size                => dsc_size,                    -- размер, байты 3..1
181
 
182
                ---- Адрес ----
183
                pci_adr                 => pci_adr,                             -- текущий адрес 
184
                pci_size_z              => pci_size_z,                  -- 1 - размер равен 0
185
                pci_rw                  => dma_rw                               -- 0 - чтение, 1 - запись       
186
 
187
        );
188
 
189
 
190
size4k <= dma_reg0(1);
191
 
192
tx_pci_adr <= pci_adr( 39 downto 8 );
193
tx_rd_size <= size4k;
194
 
195
dma_cmd_status(0) <= dma_cmd_rdy;
196
dma_cmd_status(1) <= dma_cmd_error;
197
dma_cmd_status(2) <= pci_size_z;
198
 
199
pr_state: process( clk ) begin
200
        if( rising_edge( clk ) ) then
201
 
202
                case( stp ) is
203
                        when s0 =>
204
                                if( dma_cmd_start='1' ) then
205
                                        stp <= s1 after 1 ns;
206
                                end if;
207
 
208
                                tx_req_rd <= '0' after 1 ns;
209
                                tx_req_wr <= '0' after 1 ns;
210
                                dma_cmd_rdy <= '0' after 1 ns;
211
                                dma_cmd_error <= '0' after 1 ns;
212
 
213
                        when s1 =>
214
 
215
                                tx_req_rd <= (not dma_rw) or (not size4k) after 1 ns;
216
                                tx_req_wr <= dma_rw and size4k after 1 ns;
217
 
218
                                if( tx_ext_fifo.complete_ok='1' ) then
219
                                        stp <= s2 after 1 ns;
220
                                elsif( tx_ext_fifo.complete_error='1' ) then
221
                                        stp <= s3 after 1 ns;
222
                                end if;
223
 
224
                                dma_cmd_error <= tx_ext_fifo.complete_error after 1 ns;
225
 
226
                        when s2 =>
227
 
228
                                tx_req_rd <= '0' after 1 ns;
229
                                tx_req_wr <= '0' after 1 ns;
230
 
231
                                dma_cmd_rdy <= '1' after 1 ns;
232
                                if( dma_cmd_start='0' ) then
233
                                        stp <= s0 after 1 ns;
234
                                end if;
235
 
236
                        when s3 =>
237
                                tx_req_rd <= '0' after 1 ns;
238
                                tx_req_wr <= '0' after 1 ns;
239
                                if( tx_ext_fifo.complete_error='0' ) then
240
                                        stp <= s0 after 1 ns;
241
                                end if;
242
 
243
 
244
                end case;
245
 
246
 
247
                if( rstp='1' ) then
248
                        stp <= s0 after 1 ns;
249
                end if;
250
 
251
        end if;
252
end process;
253
 
254
 
255
 
256
 
257
 
258
end ctrl_dma_ext_cmd;

powered by: WebSVN 2.1.0

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