OpenCores
URL https://opencores.org/ocsvn/plasma/plasma/trunk

Subversion Repositories plasma

[/] [plasma/] [tags/] [V3_0/] [vhdl/] [reg_bank.vhd] - Blame information for rev 108

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 rhoads
---------------------------------------------------------------------
2
-- TITLE: Register Bank
3
-- AUTHOR: Steve Rhoads (rhoadss@yahoo.com)
4
-- DATE CREATED: 2/2/01
5
-- FILENAME: reg_bank.vhd
6 43 rhoads
-- PROJECT: Plasma CPU core
7 2 rhoads
-- COPYRIGHT: Software placed into the public domain by the author.
8
--    Software 'as is' without warranty.  Author liable for nothing.
9
-- DESCRIPTION:
10
--    Implements a register bank with 32 registers that are 32-bits wide.
11
--    There are two read-ports and one write port.
12
---------------------------------------------------------------------
13
library ieee;
14
use ieee.std_logic_1164.all;
15 12 rhoads
use ieee.std_logic_unsigned.all;
16 39 rhoads
use work.mlite_pack.all;
17 2 rhoads
 
18
entity reg_bank is
19 47 rhoads
   generic(memory_type : string := "GENERIC");
20 2 rhoads
   port(clk            : in  std_logic;
21 24 rhoads
        reset_in       : in  std_logic;
22 74 rhoads
        pause          : in  std_logic;
23 2 rhoads
        rs_index       : in  std_logic_vector(5 downto 0);
24
        rt_index       : in  std_logic_vector(5 downto 0);
25
        rd_index       : in  std_logic_vector(5 downto 0);
26
        reg_source_out : out std_logic_vector(31 downto 0);
27
        reg_target_out : out std_logic_vector(31 downto 0);
28
        reg_dest_new   : in  std_logic_vector(31 downto 0);
29
        intr_enable    : out std_logic);
30
end; --entity reg_bank
31
 
32 9 rhoads
 
33 8 rhoads
--------------------------------------------------------------------
34 9 rhoads
-- The ram_block architecture attempts to use TWO dual-port memories.
35 12 rhoads
-- Different FPGAs and ASICs need different implementations.
36
-- Choose one of the RAM implementations below.
37 9 rhoads
-- I need feedback on this section!
38 8 rhoads
--------------------------------------------------------------------
39
architecture ram_block of reg_bank is
40 55 rhoads
   signal intr_enable_reg : std_logic;
41 8 rhoads
   type ram_type is array(31 downto 0) of std_logic_vector(31 downto 0);
42
 
43 9 rhoads
   --controls access to dual-port memories
44
   signal addr_a1, addr_a2, addr_b : std_logic_vector(4 downto 0);
45
   signal data_out1, data_out2     : std_logic_vector(31 downto 0);
46
   signal write_enable             : std_logic;
47 48 rhoads
--   signal sig_false                : std_logic := '0';
48
--   signal sig_true                 : std_logic := '1';
49 88 rhoads
--   signal zero_sig                 : std_logic_vector(15 downto 0) := ZERO(15 downto 0);
50 8 rhoads
begin
51
 
52
reg_proc: process(clk, rs_index, rt_index, rd_index, reg_dest_new,
53 88 rhoads
      intr_enable_reg, data_out1, data_out2, reset_in, pause)
54 8 rhoads
begin
55 9 rhoads
   --setup for first dual-port memory
56
   if rs_index = "101110" then  --reg_epc CP0 14
57
      addr_a1 <= "00000";
58
   else
59
      addr_a1 <= rs_index(4 downto 0);
60
   end if;
61 8 rhoads
   case rs_index is
62
   when "000000" => reg_source_out <= ZERO;
63 55 rhoads
   when "101100" => reg_source_out <= ZERO(31 downto 1) & intr_enable_reg;
64 108 rhoads
   when "111111" => --interrupt vector address = 0x3c 
65
                    reg_source_out <= ZERO(31 downto 8) & "00111100";
66 9 rhoads
   when others   => reg_source_out <= data_out1;
67 8 rhoads
   end case;
68
 
69 9 rhoads
   --setup for second dual-port memory
70
   addr_a2 <= rt_index(4 downto 0);
71 8 rhoads
   case rt_index is
72
   when "000000" => reg_target_out <= ZERO;
73 9 rhoads
   when others   => reg_target_out <= data_out2;
74 8 rhoads
   end case;
75
 
76 9 rhoads
   --setup second port (write port) for both dual-port memories
77 74 rhoads
   if rd_index /= "000000" and rd_index /= "101100" and pause = '0' then
78 9 rhoads
      write_enable <= '1';
79
   else
80
      write_enable <= '0';
81
   end if;
82
   if rd_index = "101110" then  --reg_epc CP0 14
83
      addr_b <= "00000";
84
   else
85
      addr_b <= rd_index(4 downto 0);
86
   end if;
87
 
88 55 rhoads
   if reset_in = '1' then
89
      intr_enable_reg <= '0';
90
   elsif rising_edge(clk) then
91 88 rhoads
      if rd_index = "101110" then     --reg_epc CP0 14
92
         intr_enable_reg <= '0';      --disable interrupts
93 24 rhoads
      elsif rd_index = "101100" then
94 55 rhoads
         intr_enable_reg <= reg_dest_new(0);
95 9 rhoads
      end if;
96 8 rhoads
   end if;
97
 
98 55 rhoads
   intr_enable <= intr_enable_reg;
99 9 rhoads
end process;
100 8 rhoads
 
101 9 rhoads
 
102 12 rhoads
------------------------------------------------------------
103
-- Pick only ONE of the dual-port RAM implementations below!
104
------------------------------------------------------------
105
 
106
 
107
   -- Option #1
108
   -- One tri-port RAM, two read-ports, one write-port
109
   -- 32 registers 32-bits wide
110 47 rhoads
   tri_port_mem:
111
   if memory_type = "GENERIC" generate
112
      ram_proc: process(clk, addr_a1, addr_a2, addr_b, reg_dest_new,
113
            write_enable)
114
      variable tri_port_ram : ram_type;
115
      begin
116
         data_out1 <= tri_port_ram(conv_integer(addr_a1));
117
         data_out2 <= tri_port_ram(conv_integer(addr_a2));
118
         if rising_edge(clk) then
119
            if write_enable = '1' then
120
               tri_port_ram(conv_integer(addr_b)) := reg_dest_new;
121
            end if;
122 12 rhoads
         end if;
123 47 rhoads
      end process;
124
   end generate; --tri_port_mem
125 9 rhoads
 
126
 
127 12 rhoads
   -- Option #2
128
   -- Two dual-port RAMs, each with one read-port and one write-port
129
   -- According to the Xilinx answers database record #4075 this 
130
   -- architecture may cause Synplify to infer synchronous dual-port 
131
   -- RAM using RAM16x1D.  
132 47 rhoads
   dual_port_mem:
133
   if memory_type = "DUAL_PORT" generate
134 55 rhoads
      ram_proc2: process(clk, addr_a1, addr_a2, addr_b, reg_dest_new,
135 47 rhoads
            write_enable)
136
      variable dual_port_ram1 : ram_type;
137
      variable dual_port_ram2 : ram_type;
138
      begin
139
         data_out1 <= dual_port_ram1(conv_integer(addr_a1));
140
         data_out2 <= dual_port_ram2(conv_integer(addr_a2));
141
         if rising_edge(clk) then
142
            if write_enable = '1' then
143
               dual_port_ram1(conv_integer(addr_b)) := reg_dest_new;
144
               dual_port_ram2(conv_integer(addr_b)) := reg_dest_new;
145
            end if;
146
         end if;
147
      end process;
148
   end generate; --dual_port_mem
149 9 rhoads
 
150
 
151 12 rhoads
   -- Option #3
152 9 rhoads
   -- Generic Two-Port Synchronous RAM
153
   -- generic_tpram can be obtained from:
154
   -- http://www.opencores.org/cvsweb.shtml/generic_memories/
155
   -- Supports ASICs (Artisan, Avant, and Virage) and Xilinx FPGA
156 47 rhoads
--   generic_mem:
157
--   if memory_type = "OPENCORES_MEM" generate
158
--      bank1 : generic_tpram port map (
159
--         clk_a  => clk,
160
--         rst_a  => '0',
161
--         ce_a   => '1',
162
--         we_a   => '0',
163
--         oe_a   => '1',
164
--         addr_a => addr_a1,
165
--         di_a   => ZERO,
166
--         do_a   => data_out1,
167 9 rhoads
--
168 47 rhoads
--         clk_b  => clk,
169
--         rst_b  => '0',
170
--         ce_b   => '1',
171
--         we_b   => write_enable,
172
--         oe_b   => '0',
173
--         addr_b => addr_b,
174
--         di_a   => reg_dest_new);
175 9 rhoads
--
176 47 rhoads
--      bank2 : generic_tpram port map (
177
--         clk_a  => clk,
178
--         rst_a  => '0',
179
--         ce_a   => '1',
180
--         we_a   => '0',
181
--         oe_a   => '1',
182
--         addr_a => addr_a2,
183
--         di_a   => ZERO,
184
--         do_a   => data_out2,
185 9 rhoads
--
186 47 rhoads
--         clk_b  => clk,
187
--         rst_b  => '0',
188
--         ce_b   => '1',
189
--         we_b   => write_enable,
190
--         oe_b   => '0',
191
--         addr_b => addr_b,
192
--         di_a   => reg_dest_new);
193
--   end generate; --generic_mem
194 9 rhoads
 
195
 
196 12 rhoads
   -- Option #4
197 9 rhoads
   -- Xilinx mode using four 16x16 banks
198 47 rhoads
--   xilinx_mem:
199
--   if memory_type = "XILINX" generate
200
--      bank1_high: ramb4_s16_s16 port map (
201
--         clka  => clk,
202
--         rsta  => sig_false,
203
--         addra => addr_a1,
204
--         dia   => zero_sig,
205
--         ena   => sig_true,
206
--         wea   => sig_false,
207
--         doa   => data_out1(31 downto 16),
208 9 rhoads
--
209 47 rhoads
--         clkb  => clk,
210
--         rstb  => sig_false,
211
--         addrb => addr_b,
212
--         dib   => reg_dest_new(31 downto 16),
213
--         enb   => sig_true,
214
--         web   => write_enable);
215 9 rhoads
--
216 47 rhoads
--      bank1_low: ramb4_s16_s16 port map (
217
--         clka  => clk,
218
--         rsta  => sig_false,
219
--         addra => addr_a1,
220
--         dia   => zero_sig,
221
--         ena   => sig_true,
222
--         wea   => sig_false,
223
--         doa   => data_out1(15 downto 0),
224 9 rhoads
--
225 47 rhoads
--         clkb  => clk,
226
--         rstb  => sig_false,
227
--         addrb => addr_b,
228
--         dib   => reg_dest_new(15 downto 0),
229
--         enb   => sig_true,
230
--         web   => write_enable);
231 9 rhoads
--
232 47 rhoads
--      bank2_high: ramb4_s16_s16 port map (
233
--         clka  => clk,
234
--         rsta  => sig_false,
235
--         addra => addr_a2,
236
--         dia   => zero_sig,
237
--         ena   => sig_true,
238
--         wea   => sig_false,
239
--         doa   => data_out2(31 downto 16),
240 9 rhoads
--
241 47 rhoads
--         clkb  => clk,
242
--         rstb  => sig_false,
243
--         addrb => addr_b,
244
--         dib   => reg_dest_new(31 downto 16),
245
--         enb   => sig_true,
246
--         web   => write_enable);
247 9 rhoads
--
248 47 rhoads
--      bank2_low: ramb4_s16_s16 port map (
249
--         clka  => clk,
250
--         rsta  => sig_false,
251
--         addra => addr_a2,
252
--         dia   => zero_sig,
253
--         ena   => sig_true,
254
--         wea   => sig_false,
255
--         doa   => data_out2(15 downto 0),
256 9 rhoads
--
257 47 rhoads
--         clkb  => clk,
258
--         rstb  => sig_false,
259
--         addrb => addr_b,
260
--         dib   => reg_dest_new(15 downto 0),
261
--         enb   => sig_true,
262
--         web   => write_enable);
263
--   end generate; --xilinx_mem
264 9 rhoads
 
265 8 rhoads
 
266 12 rhoads
   -- Option #5
267
   -- Altera LPM_RAM_DP
268 47 rhoads
   altera_mem:
269
   if memory_type = "ALTERA" generate
270
      lpm_ram_dp_component1 : lpm_ram_dp
271
      GENERIC MAP (
272
         lpm_width => 32,
273
         lpm_widthad => 5,
274
         rden_used => "FALSE",
275
         intended_device_family => "UNUSED",
276
         lpm_indata => "REGISTERED",
277
         lpm_wraddress_control => "REGISTERED",
278
         lpm_rdaddress_control => "UNREGISTERED",
279
         lpm_outdata => "UNREGISTERED",
280
         use_eab => "ON",
281
         lpm_type => "LPM_RAM_DP"
282
      )
283
      PORT MAP (
284
         wren => write_enable,
285
         wrclock => clk,
286
         data => reg_dest_new,
287
         rdaddress => addr_a1,
288
         wraddress => addr_b,
289
         q => data_out1
290
      );
291
      lpm_ram_dp_component2 : lpm_ram_dp
292
      GENERIC MAP (
293
         lpm_width => 32,
294
         lpm_widthad => 5,
295
         rden_used => "FALSE",
296
         intended_device_family => "UNUSED",
297
         lpm_indata => "REGISTERED",
298
         lpm_wraddress_control => "REGISTERED",
299
         lpm_rdaddress_control => "UNREGISTERED",
300
         lpm_outdata => "UNREGISTERED",
301
         use_eab => "ON",
302
         lpm_type => "LPM_RAM_DP"
303
      )
304
      PORT MAP (
305
         wren => write_enable,
306
         wrclock => clk,
307
         data => reg_dest_new,
308
         rdaddress => addr_a2,
309
         wraddress => addr_b,
310
         q => data_out2
311
      );
312
   end generate; --altera_mem
313 8 rhoads
 
314 12 rhoads
end; --architecture ram_block
315 2 rhoads
 

powered by: WebSVN 2.1.0

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