Line 34... |
Line 34... |
-- Different FPGAs and ASICs need different implementations.
|
-- Different FPGAs and ASICs need different implementations.
|
-- Choose one of the RAM implementations below.
|
-- Choose one of the RAM implementations below.
|
-- I need feedback on this section!
|
-- I need feedback on this section!
|
--------------------------------------------------------------------
|
--------------------------------------------------------------------
|
architecture ram_block of reg_bank is
|
architecture ram_block of reg_bank is
|
signal reg_status : std_logic;
|
signal intr_enable_reg : std_logic;
|
type ram_type is array(31 downto 0) of std_logic_vector(31 downto 0);
|
type ram_type is array(31 downto 0) of std_logic_vector(31 downto 0);
|
|
|
--controls access to dual-port memories
|
--controls access to dual-port memories
|
signal addr_a1, addr_a2, addr_b : std_logic_vector(4 downto 0);
|
signal addr_a1, addr_a2, addr_b : std_logic_vector(4 downto 0);
|
signal data_out1, data_out2 : std_logic_vector(31 downto 0);
|
signal data_out1, data_out2 : std_logic_vector(31 downto 0);
|
Line 47... |
Line 47... |
-- signal sig_true : std_logic := '1';
|
-- signal sig_true : std_logic := '1';
|
-- signal zero_sig : std_logic_vector(15 downto 0) := ZERP(15 downto 0);
|
-- signal zero_sig : std_logic_vector(15 downto 0) := ZERP(15 downto 0);
|
begin
|
begin
|
|
|
reg_proc: process(clk, rs_index, rt_index, rd_index, reg_dest_new,
|
reg_proc: process(clk, rs_index, rt_index, rd_index, reg_dest_new,
|
reg_status, data_out1, data_out2, reset_in)
|
intr_enable_reg, data_out1, data_out2, reset_in)
|
begin
|
begin
|
--setup for first dual-port memory
|
--setup for first dual-port memory
|
if rs_index = "101110" then --reg_epc CP0 14
|
if rs_index = "101110" then --reg_epc CP0 14
|
addr_a1 <= "00000";
|
addr_a1 <= "00000";
|
else
|
else
|
addr_a1 <= rs_index(4 downto 0);
|
addr_a1 <= rs_index(4 downto 0);
|
end if;
|
end if;
|
case rs_index is
|
case rs_index is
|
when "000000" => reg_source_out <= ZERO;
|
when "000000" => reg_source_out <= ZERO;
|
when "101100" => reg_source_out <= ZERO(31 downto 1) & reg_status;
|
when "101100" => reg_source_out <= ZERO(31 downto 1) & intr_enable_reg;
|
when "111111" => reg_source_out <= ZERO(31 downto 8) & "00110000"; --intr vector
|
when "111111" => reg_source_out <= ZERO(31 downto 8) & "00110000"; --intr vector
|
when others => reg_source_out <= data_out1;
|
when others => reg_source_out <= data_out1;
|
end case;
|
end case;
|
|
|
--setup for second dual-port memory
|
--setup for second dual-port memory
|
Line 81... |
Line 81... |
addr_b <= "00000";
|
addr_b <= "00000";
|
else
|
else
|
addr_b <= rd_index(4 downto 0);
|
addr_b <= rd_index(4 downto 0);
|
end if;
|
end if;
|
|
|
if rising_edge(clk) then
|
if reset_in = '1' then
|
if reset_in = '1' or rd_index = "101110" then --reg_epc CP0 14
|
intr_enable_reg <= '0';
|
reg_status <= '0'; --disable interrupts
|
elsif rising_edge(clk) then
|
|
if rd_index = "101110" then --reg_epc CP0 14
|
|
intr_enable_reg <= '0'; --disable interrupts
|
elsif rd_index = "101100" then
|
elsif rd_index = "101100" then
|
reg_status <= reg_dest_new(0);
|
intr_enable_reg <= reg_dest_new(0);
|
end if;
|
end if;
|
end if;
|
end if;
|
|
|
intr_enable <= reg_status;
|
intr_enable <= intr_enable_reg;
|
end process;
|
end process;
|
|
|
|
|
------------------------------------------------------------
|
------------------------------------------------------------
|
-- Pick only ONE of the dual-port RAM implementations below!
|
-- Pick only ONE of the dual-port RAM implementations below!
|
Line 125... |
Line 127... |
-- According to the Xilinx answers database record #4075 this
|
-- According to the Xilinx answers database record #4075 this
|
-- architecture may cause Synplify to infer synchronous dual-port
|
-- architecture may cause Synplify to infer synchronous dual-port
|
-- RAM using RAM16x1D.
|
-- RAM using RAM16x1D.
|
dual_port_mem:
|
dual_port_mem:
|
if memory_type = "DUAL_PORT" generate
|
if memory_type = "DUAL_PORT" generate
|
ram_proc: process(clk, addr_a1, addr_a2, addr_b, reg_dest_new,
|
ram_proc2: process(clk, addr_a1, addr_a2, addr_b, reg_dest_new,
|
write_enable)
|
write_enable)
|
variable dual_port_ram1 : ram_type;
|
variable dual_port_ram1 : ram_type;
|
variable dual_port_ram2 : ram_type;
|
variable dual_port_ram2 : ram_type;
|
begin
|
begin
|
data_out1 <= dual_port_ram1(conv_integer(addr_a1));
|
data_out1 <= dual_port_ram1(conv_integer(addr_a1));
|