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/] [components/] [rtl/] [core64_pb_transaction.vhd] - Blame information for rev 47

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
-------------------------------------------------------------------------------
2
--
3
-- Title       : core64_pb_transaction
4
-- Author      : Dmitry Smekhov
5
-- Company     : Instrumental Systems
6
-- E-mail      : dsmv@insys.ru
7
--
8 47 dsmv
-- Version     : 1.2
9 2 dsmv
--
10
-------------------------------------------------------------------------------
11
--
12
-- Description : Узел управления локальной шиной 
13
--                                                                                              
14
--              pb_master.cmd   - команда управления, сопровождается стробом stb0
15
--                                      0:      - 1 запись данных
16
--                                      1:  - 1 чтение данных
17
--                                      2:  - 0 - одно слово, 1 - пакет 512 слов (4096 байт)
18
--
19
-------------------------------------------------------------------------------
20
--
21 47 dsmv
--      Version 1.2  14.12.2011
22
--                               Добавлен lc_rd_cfg
23
--
24
---------------------------------------------------------------------------------
25
--
26 2 dsmv
--  Version 1.1  28.09.2011 Dmitry Smekhov
27
--                               Добавлен сигнал pb_slave.complete 
28
--
29
-------------------------------------------------------------------------------
30
 
31
library ieee;
32
use ieee.std_logic_1164.all;
33
 
34
use work.core64_type_pkg.all;
35
 
36
package core64_pb_transaction_pkg is
37
 
38
component core64_pb_transaction is
39
        port(
40
                reset                           : in std_logic;         --! 0 - сброс
41
                clk                                     : in std_logic;         --! тактовая частота локальной шины - 266 МГц 
42
 
43
                ---- BAR1 ----  
44
                pb_master                       : in  type_pb_master;           --! запрос 
45
                pb_slave                        : out type_pb_slave;            --! ответ  
46
 
47
                ---- локальная шина -----               
48
                lc_adr                          : out std_logic_vector( 31 downto 0 );   --! шина адреса
49
                lc_host_data            : out std_logic_vector( 63 downto 0 );   --! шина данных - выход
50
                lc_data                         : in  std_logic_vector( 63 downto 0 );   --! шина данных - вход
51
                lc_wr                           : out std_logic;        --! 1 - запись
52
                lc_rd                           : out std_logic;        --! 1 - чтение, данные должны быть на шестой такт после rd 
53
                lc_dma_req                      : in  std_logic_vector( 1 downto 0 );    --! 1 - запрос DMA
54 47 dsmv
                lc_irq                          : in  std_logic;        --! 1 - запрос прерывания 
55
                lc_rd_cfg                       : in std_logic_vector( 3 downto 0 ):="0101"      --! настройка задержки захвата данных по сигналу lc_rd                          
56 2 dsmv
 
57
 
58
        );
59
 
60
end component;
61
 
62
end package;
63
 
64
 
65
library ieee;
66
use ieee.std_logic_1164.all;
67
use ieee.std_logic_arith.all;
68
use ieee.std_logic_unsigned.all;
69
 
70
library unisim;
71
use unisim.vcomponents.all;
72
 
73
use work.core64_type_pkg.all;
74
 
75
entity core64_pb_transaction is
76
        port(
77
                reset                           : in std_logic;         --! 0 - сброс
78
                clk                                     : in std_logic;         --! тактовая частота локальной шины - 266 МГц 
79
 
80
                ---- BAR1 ----  
81
                pb_master                       : in  type_pb_master;           --! запрос 
82
                pb_slave                        : out type_pb_slave;            --! ответ  
83
 
84
                ---- локальная шина -----               
85
                lc_adr                          : out std_logic_vector( 31 downto 0 );   --! шина адреса
86
                lc_host_data            : out std_logic_vector( 63 downto 0 );   --! шина данных - выход
87
                lc_data                         : in  std_logic_vector( 63 downto 0 );   --! шина данных - вход
88
                lc_wr                           : out std_logic;        --! 1 - запись
89
                lc_rd                           : out std_logic;        --! 1 - чтение, данные должны быть на шестой такт после rd 
90
                lc_dma_req                      : in  std_logic_vector( 1 downto 0 );    --! 1 - запрос DMA
91 47 dsmv
                lc_irq                          : in  std_logic;        --! 1 - запрос прерывания 
92
                lc_rd_cfg                       : in std_logic_vector( 3 downto 0 ):="0101"      --! настройка задержки захвата данных по сигналу lc_rd                          
93 2 dsmv
 
94
 
95
        );
96
 
97
end core64_pb_transaction;
98
 
99
 
100
architecture core64_pb_transaction of core64_pb_transaction is
101
 
102
signal  cnt_start                       : std_logic;
103
signal  cnt                                     : std_logic_vector( 9 downto 0 );
104
signal  rstp                            : std_logic;
105
signal  rd_start                        : std_logic;
106
signal  rd_start_z                      : std_logic;
107
signal  rd_start_z1                     : std_logic;
108
signal  stb1_z                          : std_logic;
109
 
110
begin
111
 
112
rstp <= not reset after 1 ns when rising_edge( clk );
113
--rstp <= '1', '0' after 30 us;
114
 
115
lc_adr <= pb_master.adr            after 1 ns when rising_edge( clk );
116
lc_host_data <= pb_master.data after 1 ns when rising_edge( clk );
117
lc_wr <= pb_master.stb1            after 1 ns when rising_edge( clk );
118
lc_rd <= rd_start                          after 1 ns when rising_edge( clk );
119
 
120
pr_cnt: process( clk ) begin
121
        if( rising_edge( clk ) ) then
122
                if( cnt_start='0' ) then
123
                        if( pb_master.cmd(2)='0' ) then
124
                                cnt <= "0111111111" after 1 ns;
125
                        else
126
                                cnt <= "0000000000" after 1 ns;
127
                        end if;
128
                else
129
                                cnt <= cnt + 1 after 1 ns;
130
                end if;
131
        end if;
132
end process;
133
 
134
pr_cnt_start: process( clk ) begin
135
        if( rising_edge( clk ) ) then
136
                if( rstp='1' or cnt(9)='1' ) then
137
                        cnt_start <= '0' after 1 ns;
138
                elsif( pb_master.cmd(1)='1' and pb_master.stb0='1' ) then
139
                        cnt_start <= '1' after 1 ns;
140
                end if;
141
        end if;
142
end process;
143
 
144
rd_start <= cnt_start and not cnt(9);
145
 
146 47 dsmv
--xrdz: srl16 port map( q=>rd_start_z, clk=>clk, d=>rd_start, a3=>'0', a2=>'1', a1=>'0', a0=>'1' );
147
xrdz:   srl16 port map( q=>rd_start_z, clk=>clk, d=>rd_start, a3=>lc_rd_cfg(3), a2=>lc_rd_cfg(2), a1=>lc_rd_cfg(1), a0=>lc_rd_cfg(0) );
148 2 dsmv
 
149
pb_slave.stb0 <= pb_master.stb0 after 1 ns when rising_edge( clk );
150
pb_slave.stb1 <= rd_start_z  after 1 ns when rising_edge( clk );
151
pb_slave.data <= lc_data   after 1 ns when rising_edge( clk );
152
pb_slave.dmar <= lc_dma_req;
153
pb_slave.irq  <= lc_irq;
154
 
155
rd_start_z1 <= rd_start_z after 1 ns when rising_edge( clk );
156
stb1_z <= pb_master.stb1 after 1 ns when rising_edge( clk );
157
 
158
pb_slave.complete <= ((not rd_start_z) and rd_start_z1) or
159
                                         ((not pb_master.stb1) and stb1_z ) after 1 ns
160
                                                when rising_edge( clk );
161
 
162
pb_slave.ready <= '1';
163
 
164
end core64_pb_transaction;

powered by: WebSVN 2.1.0

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