1 |
2 |
slavek |
------------------------------------------------------------------------------
|
2 |
|
|
-- user_logic.vhd - entity/architecture pair
|
3 |
|
|
------------------------------------------------------------------------------
|
4 |
|
|
--
|
5 |
|
|
-- ***************************************************************************
|
6 |
|
|
-- ** Copyright (c) 1995-2007 Xilinx, Inc. All rights reserved. **
|
7 |
|
|
-- ** **
|
8 |
|
|
-- ** Xilinx, Inc. **
|
9 |
|
|
-- ** XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" **
|
10 |
|
|
-- ** AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND **
|
11 |
|
|
-- ** SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, **
|
12 |
|
|
-- ** OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, **
|
13 |
|
|
-- ** APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION **
|
14 |
|
|
-- ** THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, **
|
15 |
|
|
-- ** AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE **
|
16 |
|
|
-- ** FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY **
|
17 |
|
|
-- ** WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE **
|
18 |
|
|
-- ** IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR **
|
19 |
|
|
-- ** REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF **
|
20 |
|
|
-- ** INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS **
|
21 |
|
|
-- ** FOR A PARTICULAR PURPOSE. **
|
22 |
|
|
-- ** **
|
23 |
|
|
-- ***************************************************************************
|
24 |
|
|
--
|
25 |
|
|
------------------------------------------------------------------------------
|
26 |
|
|
-- Filename: user_logic.vhd
|
27 |
|
|
-- Version: 1.00.a
|
28 |
|
|
-- Description: User logic.
|
29 |
|
|
-- Date: Sun Apr 13 14:29:06 2008 (by Create and Import Peripheral Wizard)
|
30 |
|
|
-- VHDL Standard: VHDL'93
|
31 |
|
|
|
32 |
|
|
library ieee;
|
33 |
|
|
use ieee.std_logic_1164.all;
|
34 |
|
|
use ieee.std_logic_arith.all;
|
35 |
|
|
use ieee.std_logic_unsigned.all;
|
36 |
|
|
|
37 |
|
|
entity user_logic is
|
38 |
|
|
generic (
|
39 |
|
|
C_SLV_AWIDTH : integer := 32;
|
40 |
|
|
C_SLV_DWIDTH : integer := 32;
|
41 |
|
|
C_NUM_MEM : integer := 2);
|
42 |
|
|
port (
|
43 |
|
|
GR_DATA_O : out std_logic_vector(31 downto 0);
|
44 |
|
|
GR_DATA_I0 : in std_logic_vector(31 downto 0);
|
45 |
|
|
GR_DATA_I1 : in std_logic_vector(31 downto 0);
|
46 |
|
|
GR_ADDR : out std_logic_vector(15 downto 2);
|
47 |
|
|
GR_RNW : out std_logic;
|
48 |
|
|
GR_CS : out std_logic_vector(1 downto 0);
|
49 |
|
|
Bus2IP_Clk : in std_logic;
|
50 |
|
|
Bus2IP_Reset : in std_logic;
|
51 |
|
|
Bus2IP_Addr : in std_logic_vector(0 to C_SLV_AWIDTH-1);
|
52 |
|
|
Bus2IP_CS : in std_logic_vector(0 to C_NUM_MEM-1);
|
53 |
|
|
Bus2IP_RNW : in std_logic;
|
54 |
|
|
Bus2IP_Data : in std_logic_vector(0 to C_SLV_DWIDTH-1);
|
55 |
|
|
Bus2IP_BE : in std_logic_vector(0 to C_SLV_DWIDTH/8-1);
|
56 |
|
|
Bus2IP_RdCE : in std_logic_vector(0 to C_NUM_MEM-1);
|
57 |
|
|
Bus2IP_WrCE : in std_logic_vector(0 to C_NUM_MEM-1);
|
58 |
|
|
IP2Bus_Data : out std_logic_vector(0 to C_SLV_DWIDTH-1);
|
59 |
|
|
IP2Bus_RdAck : out std_logic;
|
60 |
|
|
IP2Bus_WrAck : out std_logic;
|
61 |
|
|
IP2Bus_Error : out std_logic);
|
62 |
|
|
|
63 |
|
|
attribute SIGIS : string;
|
64 |
|
|
attribute SIGIS of Bus2IP_Clk : signal is "CLK";
|
65 |
|
|
attribute SIGIS of Bus2IP_Reset : signal is "RST";
|
66 |
|
|
|
67 |
|
|
end entity user_logic;
|
68 |
|
|
|
69 |
|
|
------------------------------------------------------------------------------
|
70 |
|
|
-- Architecture section
|
71 |
|
|
------------------------------------------------------------------------------
|
72 |
|
|
|
73 |
|
|
architecture IMP of user_logic is
|
74 |
|
|
|
75 |
|
|
signal mem_select : std_logic_vector(0 to 1);
|
76 |
|
|
signal mem_read_enable : std_logic;
|
77 |
|
|
signal mem_read_enable_dly1 : std_logic;
|
78 |
|
|
signal mem_read_req : std_logic;
|
79 |
|
|
signal mem_ip2bus_data : std_logic_vector(0 to C_SLV_DWIDTH-1);
|
80 |
|
|
signal mem_read_ack_dly1 : std_logic;
|
81 |
|
|
signal mem_read_ack : std_logic;
|
82 |
|
|
signal mem_write_ack : std_logic;
|
83 |
|
|
signal gr_cs_i : std_logic_vector(1 downto 0);
|
84 |
|
|
signal gr_rnw_i : std_logic;
|
85 |
|
|
|
86 |
|
|
begin
|
87 |
|
|
|
88 |
|
|
mem_select <= Bus2IP_CS;
|
89 |
|
|
mem_read_enable <= ( Bus2IP_CS(0) or Bus2IP_CS(1) ) and Bus2IP_RNW;
|
90 |
|
|
mem_read_ack <= mem_read_ack_dly1;
|
91 |
|
|
mem_write_ack <= ( Bus2IP_CS(0) or Bus2IP_CS(1) ) and not(Bus2IP_RNW);
|
92 |
|
|
|
93 |
|
|
-- implement single clock wide read request
|
94 |
|
|
mem_read_req <= mem_read_enable and not(mem_read_enable_dly1);
|
95 |
|
|
BRAM_RD_REQ_PROC : process( Bus2IP_Clk ) is
|
96 |
|
|
begin
|
97 |
|
|
|
98 |
|
|
if ( Bus2IP_Clk'event and Bus2IP_Clk = '1' ) then
|
99 |
|
|
if ( Bus2IP_Reset = '1' ) then
|
100 |
|
|
mem_read_enable_dly1 <= '0';
|
101 |
|
|
else
|
102 |
|
|
mem_read_enable_dly1 <= mem_read_enable;
|
103 |
|
|
end if;
|
104 |
|
|
end if;
|
105 |
|
|
|
106 |
|
|
end process BRAM_RD_REQ_PROC;
|
107 |
|
|
|
108 |
|
|
-- this process generates the read acknowledge 1 clock after read enable
|
109 |
|
|
-- is presented to the BRAM block. The BRAM block has a 1 clock delay
|
110 |
|
|
-- from read enable to data out.
|
111 |
|
|
BRAM_RD_ACK_PROC : process( Bus2IP_Clk ) is
|
112 |
|
|
begin
|
113 |
|
|
|
114 |
|
|
if ( Bus2IP_Clk'event and Bus2IP_Clk = '1' ) then
|
115 |
|
|
if ( Bus2IP_Reset = '1' ) then
|
116 |
|
|
mem_read_ack_dly1 <= '0';
|
117 |
|
|
else
|
118 |
|
|
mem_read_ack_dly1 <= mem_read_req;
|
119 |
|
|
end if;
|
120 |
|
|
end if;
|
121 |
|
|
|
122 |
|
|
end process BRAM_RD_ACK_PROC;
|
123 |
|
|
|
124 |
|
|
PROCESS(Bus2IP_Clk)
|
125 |
|
|
BEGIN
|
126 |
|
|
If Bus2IP_Clk'event And Bus2IP_Clk = '1' Then
|
127 |
|
|
If Bus2IP_Reset = '1' Then
|
128 |
|
|
gr_cs_i <= (Others => '0');
|
129 |
|
|
gr_rnw_i <= '0';
|
130 |
|
|
Else
|
131 |
|
|
If mem_write_ack = '1' Then
|
132 |
|
|
gr_cs_i <= Bus2IP_CS;
|
133 |
|
|
gr_rnw_i <= '0';
|
134 |
|
|
gr_data_o <= Bus2IP_Data;
|
135 |
|
|
gr_addr <= Bus2IP_Addr(16 to 29);
|
136 |
|
|
ElsIf mem_read_enable = '1' Then
|
137 |
|
|
gr_cs_i <= Bus2IP_CS;
|
138 |
|
|
gr_rnw_i <= '1';
|
139 |
|
|
gr_addr <= Bus2IP_Addr(16 to 29);
|
140 |
|
|
Else
|
141 |
|
|
gr_cs_i <= (Others => '0');
|
142 |
|
|
End If;
|
143 |
|
|
End If;
|
144 |
|
|
End If;
|
145 |
|
|
END PROCESS;
|
146 |
|
|
|
147 |
|
|
GR_CS <= gr_cs_i;
|
148 |
|
|
GR_RNW <= gr_rnw_i;
|
149 |
|
|
|
150 |
|
|
mem_ip2bus_data <= GR_DATA_I0 When Bus2IP_CS(0) = '1' Else
|
151 |
|
|
GR_DATA_I1 When Bus2IP_CS(1) = '1' Else
|
152 |
|
|
(Others => '0');
|
153 |
|
|
|
154 |
|
|
IP2Bus_Data <= (others => '0');--mem_ip2bus_data when mem_read_ack = '1' else
|
155 |
|
|
|
156 |
|
|
|
157 |
|
|
IP2Bus_WrAck <= mem_write_ack;
|
158 |
|
|
IP2Bus_RdAck <= mem_read_ack;
|
159 |
|
|
IP2Bus_Error <= '0';
|
160 |
|
|
|
161 |
|
|
end IMP;
|