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 2

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

powered by: WebSVN 2.1.0

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