Newer
Older
-------------------------------------------------------------------------------
-- Project ELE8304 : Circuits intégrés à très grande échelle
-------------------------------------------------------------------------------
-- File memory_access.vhd
-- Authors Titouan Luard <luardtitouan@gmail.com>
-- Yann Roberge <yann.roberge@polymtl.ca>
-- Lab GRM - Polytechnique Montreal
-------------------------------------------------------------------------------
-- Brief
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.math_real.all;
library work;
use work.riscv_pkg.all;
entity memory_access is
port (
-- Entrées provenant de l'extérieur du pipeline
i_clk : in std_logic;
i_rstn : in std_logic;
-- Entrées provenant de l'étage Execute
i_execute_reg : in execute_reg;
--i_store_data : in std_logic_vector(XLEN-1 downto 0);
--i_alu_result : in std_logic_vector(XLEN-1 downto 0);
--i_rd_addr : in std_logic_vector(DMEM_ADDR_WIDTH-1 downto 0);
-- Sorties
o_memory_reg : out memory_reg;
o_dmem_read : out std_logic_vector(XLEN-1 downto 0);
--o_alu_result : out std_logic_vector(XLEN-1 downto 0);
--o_rd_addr : out std_logic_vector(DMEM_ADDR_WIDTH-1 downto 0);
-- Communication avec la DPM
i_dmem_read : in std_logic_vector(XLEN-1 downto 0 );

Yann Roberge
committed
-- le +1 laisse 2 bits en plus pour qu'on puisse diviser par 4 ensuite
o_dmem_addr : out std_logic_vector(DMEM_ADDR_WIDTH+1 downto 0);
o_dmem_write : out std_logic_vector(XLEN-1 downto 0);
o_dmem_we : out std_logic;
end entity memory_access;
architecture beh of memory_access is
-- Signaux internes
--signal temp_alu_result : std_logic_vector(XLEN-1 downto 0);
--signal temp_rd_addr : std_logic_vector(DMEM_ADDR_WIDTH-1 downto 0);
alias opcode is i_execute_reg.opcode;
-- Contrôle d'interface mémoire
with i_rstn select o_dmem_en <=
'1' when '1',
'0' when others;

Yann Roberge
committed
o_dmem_addr <= i_execute_reg.alu_result(DMEM_ADDR_WIDTH+1 downto 0);
-- Écriture en mémoire
o_dmem_we <= '1' when opcode = OPCODE_SW else '0';
o_dmem_write <= i_execute_reg.store_data;
-- Recopiage des signaux tirés de Execute dans le registre ME/WB
if rising_edge(i_clk) then
if i_rstn = '1' then
o_memory_reg.opcode <= opcode;
o_memory_reg.alu_result <= i_execute_reg.alu_result;
o_memory_reg.rd_addr <= i_execute_reg.rd_addr;
else
o_memory_reg.opcode <= (others => '0');
o_memory_reg.alu_result <= (others => '0');
o_memory_reg.rd_addr <= (others => '0');
-- if i_rstn = '0' then
-- --o_alu_result <= (others => '0');
-- --o_rd_addr <= (others => '0');
-- else
-- if rising_edge(i_clk) then
-- --o_alu_result <= i_alu_result;
-- --o_rd_addr <= i_rd_addr;
-- end if;
-- end if;