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_ctrl/] [core64_pb_disp.vhd] - Blame information for rev 18

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
-------------------------------------------------------------------------------
2
--
3
-- Title       : core64_pb_disp
4
-- Author      : Dmitry Smekhov
5
-- Company     : Instrumental Systems
6
-- E-mail      : dsmv@insys.ru
7
--
8
-- Version     : 1.2
9
--
10
-------------------------------------------------------------------------------
11
--
12
-- Description :  Диспетчер шины PB_BUS 
13
--
14
-------------------------------------------------------------------------------
15
--
16
--  Version 1.2  14.12.2011 Dmitry Smekhov
17
--                               Исправлено формирование сигналов reg_disp_back.data_we,
18
--                               reg_disp_back.complete
19
--                               
20
--
21
-------------------------------------------------------------------------------
22
--
23
--  Version 1.1  28.09.2011 Dmitry Smekhov
24
--                               Добавлен сигнал pb_slave.complete 
25
--
26
-------------------------------------------------------------------------------
27
 
28
library ieee;
29
use ieee.std_logic_1164.all;
30
 
31
use work.core64_type_pkg.all;
32
 
33
package core64_pb_disp_pkg is
34
 
35
component core64_pb_disp is
36
        port(
37
                --- General ---
38
                rstp                            : in std_logic;         --! 1 - сброс 
39
                clk                                     : in std_logic;         --! тактовая частота ядра - 250 MHz 
40
 
41
                ---- PB_DISP ----
42
                reg_disp                        : in  type_reg_disp;            --! запрос на доступ к регистрам из BAR1 
43
                reg_disp_back           : out type_reg_disp_back;       --! ответ на запрос 
44
 
45
                ---- EXT_FIFO ----
46
                ext_fifo_disp           : in  type_ext_fifo_disp;               --! запрос на доступ от узла EXT_FIFO 
47
                ext_fifo_disp_back      : out type_ext_fifo_disp_back;  --! ответ на запрос
48
 
49
                ---- BAR1 ----  
50
                aclk                            : in std_logic;                         --! тактовая частота локальной шины - 266 МГц
51
                pb_master                       : out type_pb_master;           --! запрос 
52
                pb_slave                        : in  type_pb_slave                     --! ответ  
53
 
54
        );
55
 
56
end component;
57
 
58
end package;
59
 
60
 
61
library ieee;
62 18 dsmv
use ieee.std_logic_1164.all;
63
use ieee.std_logic_arith.all;
64
use ieee.std_logic_unsigned.all;
65 2 dsmv
 
66
library unisim;
67
use unisim.vcomponents.all;
68
 
69
use work.core64_type_pkg.all;
70
 
71
entity core64_pb_disp is
72
        port(
73
                --- General ---
74
                rstp                            : in std_logic;         --! 1 - сброс 
75
                clk                                     : in std_logic;         --! тактовая частота ядра - 250 MHz 
76
 
77
                ---- PB_DISP ----
78
                reg_disp                        : in  type_reg_disp;            --! запрос на доступ к регистрам из BAR1 
79
                reg_disp_back           : out type_reg_disp_back;       --! ответ на запрос 
80
 
81
                ---- EXT_FIFO ----
82
                ext_fifo_disp           : in  type_ext_fifo_disp;               --! запрос на доступ от узла EXT_FIFO 
83
                ext_fifo_disp_back      : out type_ext_fifo_disp_back;  --! ответ на запрос
84
 
85
                ---- BAR1 ----  
86
                aclk                            : in std_logic;                         --! тактовая частота локальной шины - 266 МГц
87
                pb_master                       : out type_pb_master;           --! запрос 
88
                pb_slave                        : in  type_pb_slave                     --! ответ  
89
 
90
        );
91
 
92
end core64_pb_disp;
93
 
94
 
95
architecture core64_pb_disp of core64_pb_disp is
96
 
97
signal  reg_req_wr                      : std_logic;
98
signal  reg_req_wr_z            : std_logic;
99
signal  reg_req_rd                      : std_logic;
100
signal  reg_req_rd_z            : std_logic;
101
 
102
signal  pb_sel                          : std_logic;
103
 
104
signal  master_data                     : std_logic_vector( 63 downto 0 );
105
signal  master_stb0                     : std_logic;
106
signal  master_stb1                     : std_logic;
107
signal  master_cmd                      : std_logic_vector( 2 downto 0 );
108
 
109
signal  reg_stb1                        : std_logic;
110
 
111
signal  rstpz                           : std_logic;
112
 
113
type stp_type is ( s0, sr1, sr2, sr3, sr5, sf1, sf2, sf3 );
114
 
115
signal  stp                                     : stp_type;
116
 
117
signal  pb_slave_stb1_z         : std_logic;
118
signal  ex_fifo_stb1_z          : std_logic;
119
signal  ext_fifo_eot            : std_logic;
120
 
121
signal  master_adr                      : std_logic_vector( 31 downto 0 );
122
signal  dmar                            : std_logic_vector( 1 downto 0 );
123
 
124
signal  fifo_allow_wr           : std_logic;
125
signal  fifo_data_en            : std_logic;
126
 
127
signal  reg_data_we_set         : std_logic;
128
signal  reg_data_we                     : std_logic;
129
signal  reg_data_we_z1          : std_logic;
130
signal  reg_data_we_z2          : std_logic;
131
signal  reg_data_we_clr         : std_logic;
132
signal  reg_data_we_clr_z1      : std_logic;
133
signal  reg_data_we_clr_z2      : std_logic;
134
 
135
signal  reg_complete            : std_logic;
136
 
137 18 dsmv
signal  timeout_cnt                     : std_logic_vector( 12 downto 0 );
138
signal  slave_timeout           : std_logic;
139
 
140 2 dsmv
attribute tig                           : string;
141
attribute tig   of      master_adr                              : signal is "";
142
attribute tig   of      dmar                                    : signal is "";
143
attribute tig   of      rstp                                    : signal is "";
144
 
145
begin
146
 
147
rstpz <= rstp after 1 ns when rising_edge( aclk );
148
 
149
reg_req_wr <= reg_disp.request_reg_wr after 1 ns when rising_edge( aclk );
150
reg_req_wr_z <= reg_req_wr after 1 ns when rising_edge( aclk );
151
 
152
reg_req_rd <= reg_disp.request_reg_rd after 1 ns when rising_edge( aclk );
153
reg_req_rd_z <= reg_req_rd after 1 ns when rising_edge( aclk );
154
 
155
 
156
master_adr <= reg_disp.adr when pb_sel='0' else ext_fifo_disp.adr;
157
pb_master.adr <= master_adr;
158
 
159
master_data( 31 downto 0 ) <= reg_disp.data when pb_sel='0' else ext_fifo_disp.data( 31 downto 0 );
160
master_data( 63 downto 32 ) <= ext_fifo_disp.data( 63 downto 32 );
161
 
162
master_stb1 <= reg_stb1 or ext_fifo_disp.data_we;
163
 
164
pb_master.data <= master_data after 1 ns when rising_edge( aclk );
165
pb_master.cmd <= master_cmd;
166
 
167
pb_master.stb0 <= master_stb0  after 1 ns when rising_edge( aclk );
168
pb_master.stb1 <= master_stb1  after 1 ns when rising_edge( aclk );
169
 
170
reg_disp_back.data <= pb_slave.data( 31 downto 0 ) after 1 ns  when rising_edge( aclk ) and pb_slave.stb1='1';
171
 
172
ext_fifo_disp_back.data    <= pb_slave.data after 1 ns  when rising_edge( aclk );
173
ext_fifo_disp_back.data_we <= pb_slave.stb1 and fifo_data_en after 1 ns  when rising_edge( aclk );
174
dmar <= pb_slave.dmar;
175
ext_fifo_disp_back.dmar <= dmar;
176
 
177
ext_fifo_disp_back.irq <= pb_slave.irq;
178
 
179
pb_sel <= master_cmd(2) after 1 ns;
180
 
181
pr_state: process( aclk ) begin
182
        if( rising_edge( aclk ) ) then
183
                case( stp ) is
184
                        when s0 =>
185
                                master_cmd <= "000" after 1 ns;
186
                                master_stb0 <= '0' after 1 ns;
187
                                --reg_disp_back.complete <= '0' after 1 ns;
188
                                reg_complete <= '0' after 1 ns;
189
                                reg_data_we_set <= '0' after 1 ns;
190
                                fifo_allow_wr <= '0' after 1 ns;
191
                                reg_stb1 <= '0' after 1 ns;
192
                                fifo_data_en <= '0' after 1 ns;
193 18 dsmv
                                ext_fifo_disp_back.complete <= '0' after 1 ns;
194
                                timeout_cnt <= (others=>'0') after 1 ns;
195 2 dsmv
 
196
                                if( reg_req_wr_z='1' or reg_req_rd_z='1' ) then
197
                                        stp <= sr1 after 1 ns;
198
                                elsif( ext_fifo_disp.request_wr='1' or ext_fifo_disp.request_rd='1' ) then
199
                                        stp <= sf1 after 1 ns;
200
                                end if;
201
 
202
                        when sr1 => ---- Обращение к регистрам ----
203
                                master_cmd(0) <= reg_req_wr_z after 1 ns;        -- 1 - запись
204
                                master_cmd(1) <= reg_req_rd_z after 1 ns;       -- 1 - чтение 
205
                                master_cmd(2) <= '0';    -- только одно 32-х разрядное слово 
206
                                master_stb0 <= '1' after 1 ns;  -- строб команды
207
                                stp <= sr2 after 1 ns;
208
 
209
                        when sr2 =>     ---- Строб записи слова ----
210
                                master_stb0 <= '0' after 1 ns;
211
                                reg_stb1 <= reg_req_wr_z after 1 ns;
212
                                stp <= sr3 after 1 ns;
213
 
214
 
215
                        when sr3 =>     ---- Ожидание подтверждения команды ---
216
                                reg_stb1 <= '0' after 1 ns;
217
--                              if( pb_slave.stb0='1' ) then
218
--                                      if( reg_req_rd_z='1' ) then
219
--                                               stp <= sr4 after 1 ns;
220
--                                      else
221
--                                              stp <= sr5 after 1 ns;
222
--                                      end if;
223 18 dsmv
--                              end if;                         
224
                                timeout_cnt <= timeout_cnt + 1 after 1 ns;
225 2 dsmv
                                reg_data_we_set <= pb_slave.stb1 after 1 ns;
226 18 dsmv
                                if( pb_slave.complete='1' or slave_timeout='1') then
227 2 dsmv
                                        stp <= sr5 after 1 ns;
228
                                end if;
229
 
230
 
231
--                      when sr4 => ---- Ожидание данных ----
232
--                              if( pb_slave.stb1='1' ) then
233
--                                      reg_disp_back.data_we <= '1' after 1 ns;
234
--                                      stp <= sr5 after 1 ns;
235
--                              end if;
236
 
237
                        when sr5 => ---- Ожидание снятия запроса ----
238
                                master_cmd <= "000";
239
                                reg_data_we_set <= '0' after 1 ns;
240
                                --reg_disp_back.complete <= '1' after 1 ns;       
241
                                reg_complete <= '1' after 1 ns;
242
                                if( reg_req_wr_z='0' and reg_req_rd_z='0' ) then
243
                                        stp <= s0 after 1 ns;
244
                                end if;
245
 
246
 
247
 
248
                        when sf1 =>
249
                                master_cmd(0) <= ext_fifo_disp.request_wr after 1 ns;    -- 1 - запись
250
                                master_cmd(1) <= ext_fifo_disp.request_rd after 1 ns;   -- 1 - чтение 
251
                                master_cmd(2) <= '1';   -- блок 512 слов 
252
                                master_stb0 <= '1' after 1 ns;  -- строб команды
253
                                stp <= sf2 after 1 ns;
254
 
255
                        when sf2 =>
256
                                master_stb0 <= '0' after 1 ns;  -- строб команды
257
                                fifo_allow_wr <= ext_fifo_disp.request_wr and pb_slave.ready after 1 ns;
258
                                fifo_data_en <= '1' after 1 ns;
259 18 dsmv
                                timeout_cnt <= timeout_cnt + 1 after 1 ns;
260
                                if( pb_slave.complete='1' or slave_timeout='1' ) then
261 2 dsmv
                                        ext_fifo_disp_back.complete <= '1' after 1 ns;
262
                                        stp <= sf3 after 1 ns;
263
                                end if;
264
 
265
                        when sf3 =>
266
                                ext_fifo_disp_back.complete <= '0' after 1 ns;
267
                                fifo_allow_wr <= '0' after 1 ns;
268
                                if( ext_fifo_disp.request_wr='0' and ext_fifo_disp.request_rd='0' ) then
269
                                        stp <= s0 after 1 ns;
270
                                end if;
271
 
272
 
273
                end case;
274
 
275
                if( rstpz='1' ) then
276
                        stp <= s0 after 1 ns;
277
                end if;
278
 
279
        end if;
280 18 dsmv
end process;
281 2 dsmv
 
282 18 dsmv
slave_timeout <= timeout_cnt(12) after 1 ns when rising_edge( clk );
283
 
284 2 dsmv
ext_fifo_disp_back.allow_wr <= fifo_allow_wr;
285
 
286
pb_slave_stb1_z  <= pb_slave.stb1 after 1 ns when rising_edge( aclk );
287
ex_fifo_stb1_z   <= ext_fifo_disp.data_we after 1 ns when rising_edge( aclk );
288
 
289
--ext_fifo_eot <= (pb_slave_stb1_z and not pb_slave.stb1) or
290
--                               (ex_fifo_stb1_z and not ext_fifo_disp.data_we ) after 1 ns when rising_edge( aclk );
291
--                              
292
 
293
--ext_fifo_eot <= pb_slave.complete after 1 ns when rising_edge( clk );
294
 
295
pr_reg_data_we: process( aclk ) begin
296
        if( rising_edge( aclk ) ) then
297
                if( reg_data_we_clr_z2='1' ) then
298
                        reg_data_we <= '0' after 1 ns;
299
                elsif( reg_data_we_set='1' ) then
300
                        reg_data_we <= '1' after 1 ns;
301
                end if;
302
        end if;
303
end process;
304
 
305
reg_data_we_z1 <= reg_data_we after 1 ns when rising_edge( clk );
306
reg_data_we_z2 <= reg_data_we_z1 after 1 ns when rising_edge( clk );
307
reg_disp_back.data_we <= reg_data_we_z2 and reg_disp.request_reg_rd after 1 ns when rising_edge( clk );
308
 
309
reg_data_we_clr <= reg_data_we_z2 after 1 ns when rising_edge( aclk );
310
reg_data_we_clr_z1 <= reg_data_we_clr after 1 ns when rising_edge( aclk );
311
reg_data_we_clr_z2 <= reg_data_we_clr_z1 after 1 ns when rising_edge( aclk );
312
 
313
xcomlete: srl16 port map( q=>reg_disp_back.complete, clk=>clk, d=>reg_complete, a3=>'0', a2=>'0', a1=>'1', a0=>'0' );
314
 
315
 
316
end core64_pb_disp;
317
 

powered by: WebSVN 2.1.0

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