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

Subversion Repositories plasma

[/] [plasma/] [tags/] [V2_1/] [vhdl/] [reg_bank.vhd] - Blame information for rev 350

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 115 rhoads
 
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 115 rhoads
 
51 8 rhoads
begin
52 115 rhoads
 
53 8 rhoads
reg_proc: process(clk, rs_index, rt_index, rd_index, reg_dest_new,
54 88 rhoads
      intr_enable_reg, data_out1, data_out2, reset_in, pause)
55 8 rhoads
begin
56 9 rhoads
   --setup for first dual-port memory
57
   if rs_index = "101110" then  --reg_epc CP0 14
58
      addr_a1 <= "00000";
59
   else
60
      addr_a1 <= rs_index(4 downto 0);
61
   end if;
62 8 rhoads
   case rs_index is
63
   when "000000" => reg_source_out <= ZERO;
64 55 rhoads
   when "101100" => reg_source_out <= ZERO(31 downto 1) & intr_enable_reg;
65 108 rhoads
   when "111111" => --interrupt vector address = 0x3c 
66
                    reg_source_out <= ZERO(31 downto 8) & "00111100";
67 9 rhoads
   when others   => reg_source_out <= data_out1;
68 8 rhoads
   end case;
69
 
70 9 rhoads
   --setup for second dual-port memory
71
   addr_a2 <= rt_index(4 downto 0);
72 8 rhoads
   case rt_index is
73
   when "000000" => reg_target_out <= ZERO;
74 9 rhoads
   when others   => reg_target_out <= data_out2;
75 8 rhoads
   end case;
76
 
77 9 rhoads
   --setup second port (write port) for both dual-port memories
78 74 rhoads
   if rd_index /= "000000" and rd_index /= "101100" and pause = '0' then
79 9 rhoads
      write_enable <= '1';
80
   else
81
      write_enable <= '0';
82
   end if;
83
   if rd_index = "101110" then  --reg_epc CP0 14
84
      addr_b <= "00000";
85
   else
86
      addr_b <= rd_index(4 downto 0);
87
   end if;
88
 
89 55 rhoads
   if reset_in = '1' then
90
      intr_enable_reg <= '0';
91
   elsif rising_edge(clk) then
92 88 rhoads
      if rd_index = "101110" then     --reg_epc CP0 14
93
         intr_enable_reg <= '0';      --disable interrupts
94 24 rhoads
      elsif rd_index = "101100" then
95 55 rhoads
         intr_enable_reg <= reg_dest_new(0);
96 9 rhoads
      end if;
97 8 rhoads
   end if;
98
 
99 55 rhoads
   intr_enable <= intr_enable_reg;
100 9 rhoads
end process;
101 8 rhoads
 
102 9 rhoads
 
103 115 rhoads
--------------------------------------------------------------
104
---- Pick only ONE of the dual-port RAM implementations below!
105
--------------------------------------------------------------
106 12 rhoads
 
107 115 rhoads
-- synopsys synthesis_off
108 12 rhoads
 
109
   -- Option #1
110
   -- One tri-port RAM, two read-ports, one write-port
111
   -- 32 registers 32-bits wide
112 47 rhoads
   tri_port_mem:
113
   if memory_type = "GENERIC" generate
114
      ram_proc: process(clk, addr_a1, addr_a2, addr_b, reg_dest_new,
115
            write_enable)
116
      variable tri_port_ram : ram_type;
117
      begin
118
         data_out1 <= tri_port_ram(conv_integer(addr_a1));
119
         data_out2 <= tri_port_ram(conv_integer(addr_a2));
120
         if rising_edge(clk) then
121
            if write_enable = '1' then
122
               tri_port_ram(conv_integer(addr_b)) := reg_dest_new;
123
            end if;
124 12 rhoads
         end if;
125 47 rhoads
      end process;
126
   end generate; --tri_port_mem
127 9 rhoads
 
128
 
129 12 rhoads
   -- Option #2
130
   -- Two dual-port RAMs, each with one read-port and one write-port
131
   -- According to the Xilinx answers database record #4075 this 
132
   -- architecture may cause Synplify to infer synchronous dual-port 
133
   -- RAM using RAM16x1D.  
134 47 rhoads
   dual_port_mem:
135
   if memory_type = "DUAL_PORT" generate
136 55 rhoads
      ram_proc2: process(clk, addr_a1, addr_a2, addr_b, reg_dest_new,
137 47 rhoads
            write_enable)
138
      variable dual_port_ram1 : ram_type;
139
      variable dual_port_ram2 : ram_type;
140
      begin
141
         data_out1 <= dual_port_ram1(conv_integer(addr_a1));
142
         data_out2 <= dual_port_ram2(conv_integer(addr_a2));
143
         if rising_edge(clk) then
144
            if write_enable = '1' then
145
               dual_port_ram1(conv_integer(addr_b)) := reg_dest_new;
146
               dual_port_ram2(conv_integer(addr_b)) := reg_dest_new;
147
            end if;
148
         end if;
149
      end process;
150
   end generate; --dual_port_mem
151 9 rhoads
 
152 115 rhoads
  -- synopsys synthesis_on
153 9 rhoads
 
154 115 rhoads
  dual_port_mem_coregen:
155
   if memory_type = "DUAL_PORT_XILINX" generate
156
 
157
      reg_file_dp_ram_1: reg_file_dp_ram
158
        port map (
159
          addra => addr_a1,
160
          addrb => addr_b,
161
          clka  => clk,
162
          clkb  => clk,
163
          dinb  => reg_dest_new,
164
          douta => data_out1,
165
          web   => write_enable);
166
 
167
      reg_file_dp_ram_2: reg_file_dp_ram
168
        port map (
169
          addra => addr_a2,
170
          addrb => addr_b,
171
          clka  => clk,
172
          clkb  => clk,
173
          dinb  => reg_dest_new,
174
          douta => data_out2,
175
          web   => write_enable);
176
 
177
   end generate; --dual_port_mem
178
 
179
   dual_port_mem_xc4000xla: if memory_type = "DUAL_PORT_XILINX_XC4000XLA" generate
180
 
181
     reg_file_dp_ram_1: reg_file_dp_ram_xc4000xla
182
       port map (
183
         A      => addr_b,
184
         DI     => reg_dest_new,
185
         WR_EN  => write_enable,
186
         WR_CLK => clk,
187
         DPRA   => addr_a1,
188
         SPO    => open,
189
         DPO    => data_out1);
190
 
191
     reg_file_dp_ram_2: reg_file_dp_ram_xc4000xla
192
       port map (
193
         A      => addr_b,
194
         DI     => reg_dest_new,
195
         WR_EN  => write_enable,
196
         WR_CLK => clk,
197
         DPRA   => addr_a2,
198
         SPO    => open,
199
         DPO    => data_out2);
200
 
201
   end generate; --dual_port_mem
202
 
203 12 rhoads
   -- Option #3
204 9 rhoads
   -- Generic Two-Port Synchronous RAM
205
   -- generic_tpram can be obtained from:
206
   -- http://www.opencores.org/cvsweb.shtml/generic_memories/
207
   -- Supports ASICs (Artisan, Avant, and Virage) and Xilinx FPGA
208 47 rhoads
--   generic_mem:
209
--   if memory_type = "OPENCORES_MEM" generate
210
--      bank1 : generic_tpram port map (
211
--         clk_a  => clk,
212
--         rst_a  => '0',
213
--         ce_a   => '1',
214
--         we_a   => '0',
215
--         oe_a   => '1',
216
--         addr_a => addr_a1,
217
--         di_a   => ZERO,
218
--         do_a   => data_out1,
219 9 rhoads
--
220 47 rhoads
--         clk_b  => clk,
221
--         rst_b  => '0',
222
--         ce_b   => '1',
223
--         we_b   => write_enable,
224
--         oe_b   => '0',
225
--         addr_b => addr_b,
226
--         di_a   => reg_dest_new);
227 9 rhoads
--
228 47 rhoads
--      bank2 : generic_tpram port map (
229
--         clk_a  => clk,
230
--         rst_a  => '0',
231
--         ce_a   => '1',
232
--         we_a   => '0',
233
--         oe_a   => '1',
234
--         addr_a => addr_a2,
235
--         di_a   => ZERO,
236
--         do_a   => data_out2,
237 9 rhoads
--
238 47 rhoads
--         clk_b  => clk,
239
--         rst_b  => '0',
240
--         ce_b   => '1',
241
--         we_b   => write_enable,
242
--         oe_b   => '0',
243
--         addr_b => addr_b,
244
--         di_a   => reg_dest_new);
245
--   end generate; --generic_mem
246 9 rhoads
 
247
 
248 12 rhoads
   -- Option #4
249 9 rhoads
   -- Xilinx mode using four 16x16 banks
250 47 rhoads
--   xilinx_mem:
251
--   if memory_type = "XILINX" generate
252
--      bank1_high: ramb4_s16_s16 port map (
253
--         clka  => clk,
254
--         rsta  => sig_false,
255
--         addra => addr_a1,
256
--         dia   => zero_sig,
257
--         ena   => sig_true,
258
--         wea   => sig_false,
259
--         doa   => data_out1(31 downto 16),
260 9 rhoads
--
261 47 rhoads
--         clkb  => clk,
262
--         rstb  => sig_false,
263
--         addrb => addr_b,
264
--         dib   => reg_dest_new(31 downto 16),
265
--         enb   => sig_true,
266
--         web   => write_enable);
267 9 rhoads
--
268 47 rhoads
--      bank1_low: ramb4_s16_s16 port map (
269
--         clka  => clk,
270
--         rsta  => sig_false,
271
--         addra => addr_a1,
272
--         dia   => zero_sig,
273
--         ena   => sig_true,
274
--         wea   => sig_false,
275
--         doa   => data_out1(15 downto 0),
276 9 rhoads
--
277 47 rhoads
--         clkb  => clk,
278
--         rstb  => sig_false,
279
--         addrb => addr_b,
280
--         dib   => reg_dest_new(15 downto 0),
281
--         enb   => sig_true,
282
--         web   => write_enable);
283 9 rhoads
--
284 47 rhoads
--      bank2_high: ramb4_s16_s16 port map (
285
--         clka  => clk,
286
--         rsta  => sig_false,
287
--         addra => addr_a2,
288
--         dia   => zero_sig,
289
--         ena   => sig_true,
290
--         wea   => sig_false,
291
--         doa   => data_out2(31 downto 16),
292 9 rhoads
--
293 47 rhoads
--         clkb  => clk,
294
--         rstb  => sig_false,
295
--         addrb => addr_b,
296
--         dib   => reg_dest_new(31 downto 16),
297
--         enb   => sig_true,
298
--         web   => write_enable);
299 9 rhoads
--
300 47 rhoads
--      bank2_low: ramb4_s16_s16 port map (
301
--         clka  => clk,
302
--         rsta  => sig_false,
303
--         addra => addr_a2,
304
--         dia   => zero_sig,
305
--         ena   => sig_true,
306
--         wea   => sig_false,
307
--         doa   => data_out2(15 downto 0),
308 9 rhoads
--
309 47 rhoads
--         clkb  => clk,
310
--         rstb  => sig_false,
311
--         addrb => addr_b,
312
--         dib   => reg_dest_new(15 downto 0),
313
--         enb   => sig_true,
314
--         web   => write_enable);
315
--   end generate; --xilinx_mem
316 9 rhoads
 
317 8 rhoads
 
318 123 rhoads
   -- Option #5
319
   -- Altera LPM_RAM_DP
320
   -- Xilinx users may need to comment out this section!!!
321
   altera_mem:
322
   if memory_type = "ALTERA" generate
323
      lpm_ram_dp_component1 : lpm_ram_dp
324
      GENERIC MAP (
325
         lpm_width => 32,
326
         lpm_widthad => 5,
327
         rden_used => "FALSE",
328
         intended_device_family => "UNUSED",
329
         lpm_indata => "REGISTERED",
330
         lpm_wraddress_control => "REGISTERED",
331
         lpm_rdaddress_control => "UNREGISTERED",
332
         lpm_outdata => "UNREGISTERED",
333
         use_eab => "ON",
334
         lpm_type => "LPM_RAM_DP"
335
      )
336
      PORT MAP (
337
         wren => write_enable,
338
         wrclock => clk,
339
         data => reg_dest_new,
340
         rdaddress => addr_a1,
341
         wraddress => addr_b,
342
         q => data_out1
343
      );
344
      lpm_ram_dp_component2 : lpm_ram_dp
345
      GENERIC MAP (
346
         lpm_width => 32,
347
         lpm_widthad => 5,
348
         rden_used => "FALSE",
349
         intended_device_family => "UNUSED",
350
         lpm_indata => "REGISTERED",
351
         lpm_wraddress_control => "REGISTERED",
352
         lpm_rdaddress_control => "UNREGISTERED",
353
         lpm_outdata => "UNREGISTERED",
354
         use_eab => "ON",
355
         lpm_type => "LPM_RAM_DP"
356
      )
357
      PORT MAP (
358
         wren => write_enable,
359
         wrclock => clk,
360
         data => reg_dest_new,
361
         rdaddress => addr_a2,
362
         wraddress => addr_b,
363
         q => data_out2
364
      );
365
   end generate; --altera_mem
366 8 rhoads
 
367 12 rhoads
end; --architecture ram_block
368 2 rhoads
 

powered by: WebSVN 2.1.0

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