|
-
-
-
-
-
-
-
-
-
-
-
-
- library ieee;
- use ieee.std_logic_1164.all;
- use ieee.std_logic_unsigned.all;
- use work.mlite_pack.all;
-
- entity reg_bank is
- generic(memory_type : string := "XILINX_16X");
- port(clk : in std_logic;
- reset_in : in std_logic;
- pause : in std_logic;
- rs_index : in std_logic_vector(5 downto 0);
- rt_index : in std_logic_vector(5 downto 0);
- rd_index : in std_logic_vector(5 downto 0);
- reg_source_out : out std_logic_vector(31 downto 0);
- reg_target_out : out std_logic_vector(31 downto 0);
- reg_dest_new : in std_logic_vector(31 downto 0);
- intr_enable : out std_logic);
- end;
-
-
-
-
-
-
-
-
- architecture ram_block of reg_bank is
- signal intr_enable_reg : std_logic;
- type ram_type is array(31 downto 0) of std_logic_vector(31 downto 0);
-
-
- signal addr_read1, addr_read2 : std_logic_vector(4 downto 0);
- signal addr_write : std_logic_vector(4 downto 0);
- signal data_out1, data_out2 : std_logic_vector(31 downto 0);
- signal write_enable : std_logic;
-
- begin
-
- reg_proc: process(clk, rs_index, rt_index, rd_index, reg_dest_new,
- intr_enable_reg, data_out1, data_out2, reset_in, pause)
- begin
-
- if rs_index = "101110" then
- addr_read1 <= "00000";
- else
- addr_read1 <= rs_index(4 downto 0);
- end if;
- case rs_index is
- when "000000" => reg_source_out <= ZERO;
- when "101100" => reg_source_out <= ZERO(31 downto 1) & intr_enable_reg;
-
- when "111111" => reg_source_out <= ZERO(31 downto 8) & "00111100";
- when others => reg_source_out <= data_out1;
- end case;
-
-
- addr_read2 <= rt_index(4 downto 0);
- case rt_index is
- when "000000" => reg_target_out <= ZERO;
- when others => reg_target_out <= data_out2;
- end case;
-
-
- if rd_index /= "000000" and rd_index /= "101100" and pause = '0' then
- write_enable <= '1';
- else
- write_enable <= '0';
- end if;
- if rd_index = "101110" then
- addr_write <= "00000";
- else
- addr_write <= rd_index(4 downto 0);
- end if;
-
- if reset_in = '1' then
- intr_enable_reg <= '0';
- elsif rising_edge(clk) then
- if rd_index = "101110" then
- intr_enable_reg <= '0';
- elsif rd_index = "101100" then
- intr_enable_reg <= reg_dest_new(0);
- end if;
- end if;
-
- intr_enable <= intr_enable_reg;
- end process;
-
-
-
-
-
-
-
-
-
- tri_port_mem:
- if memory_type = "TRI_PORT_X" generate
- ram_proc: process(clk, addr_read1, addr_read2,
- addr_write, reg_dest_new, write_enable)
- variable tri_port_ram : ram_type;
- begin
- data_out1 <= tri_port_ram(conv_integer(addr_read1));
- data_out2 <= tri_port_ram(conv_integer(addr_read2));
- if rising_edge(clk) then
- if write_enable = '1' then
- tri_port_ram(conv_integer(addr_write)) := reg_dest_new;
- end if;
- end if;
- end process;
- end generate;
-
-
-
-
- dual_port_mem:
- if memory_type = "DUAL_PORT_" generate
- ram_proc2: process(clk, addr_read1, addr_read2,
- addr_write, reg_dest_new, write_enable)
- variable dual_port_ram1 : ram_type;
- variable dual_port_ram2 : ram_type;
- begin
- data_out1 <= dual_port_ram1(conv_integer(addr_read1));
- data_out2 <= dual_port_ram2(conv_integer(addr_read2));
- if rising_edge(clk) then
- if write_enable = '1' then
- dual_port_ram1(conv_integer(addr_write)) := reg_dest_new;
- dual_port_ram2(conv_integer(addr_write)) := reg_dest_new;
- end if;
- end if;
- end process;
- end generate;
-
-
-
-
-
-
- xilinx_16x1d:
- if memory_type = "XILINX_16X" generate
- signal data_out1A, data_out1B : std_logic_vector(31 downto 0);
- signal data_out2A, data_out2B : std_logic_vector(31 downto 0);
- signal weA, weB : std_logic;
- begin
- weA <= write_enable and not addr_write(4);
- weB <= write_enable and addr_write(4);
-
- reg_loop: for i in 0 to 31 generate
- begin
-
- reg_bit1a : RAM16X1D
- port map (
- WCLK => clk,
- WE => weA,
- A0 => addr_write(0),
- A1 => addr_write(1),
- A2 => addr_write(2),
- A3 => addr_write(3),
- D => reg_dest_new(i),
- DPRA0 => addr_read1(0),
- DPRA1 => addr_read1(1),
- DPRA2 => addr_read1(2),
- DPRA3 => addr_read1(3),
- DPO => data_out1A(i),
- SPO => open
- );
-
- reg_bit1b : RAM16X1D
- port map (
- WCLK => clk,
- WE => weB,
- A0 => addr_write(0),
- A1 => addr_write(1),
- A2 => addr_write(2),
- A3 => addr_write(3),
- D => reg_dest_new(i),
- DPRA0 => addr_read1(0),
- DPRA1 => addr_read1(1),
- DPRA2 => addr_read1(2),
- DPRA3 => addr_read1(3),
- DPO => data_out1B(i),
- SPO => open
- );
-
- reg_bit2a : RAM16X1D
- port map (
- WCLK => clk,
- WE => weA,
- A0 => addr_write(0),
- A1 => addr_write(1),
- A2 => addr_write(2),
- A3 => addr_write(3),
- D => reg_dest_new(i),
- DPRA0 => addr_read2(0),
- DPRA1 => addr_read2(1),
- DPRA2 => addr_read2(2),
- DPRA3 => addr_read2(3),
- DPO => data_out2A(i),
- SPO => open
- );
-
- reg_bit2b : RAM16X1D
- port map (
- WCLK => clk,
- WE => weB,
- A0 => addr_write(0),
- A1 => addr_write(1),
- A2 => addr_write(2),
- A3 => addr_write(3),
- D => reg_dest_new(i),
- DPRA0 => addr_read2(0),
- DPRA1 => addr_read2(1),
- DPRA2 => addr_read2(2),
- DPRA3 => addr_read2(3),
- DPO => data_out2B(i),
- SPO => open
- );
- end generate;
-
- data_out1 <= data_out1A when addr_read1(4)='0' else data_out1B;
- data_out2 <= data_out2A when addr_read2(4)='0' else data_out2B;
- end generate;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- end;
|