271 lines
7.7 KiB
VHDL
271 lines
7.7 KiB
VHDL
----------------------------------------------------------------------------------
|
|
-- Company:
|
|
-- Engineer:
|
|
--
|
|
-- Create Date: 12:52:06 05/04/2021
|
|
-- Design Name:
|
|
-- Module Name: processeur - Behavioral
|
|
-- Project Name:
|
|
-- Target Devices:
|
|
-- Tool versions:
|
|
-- Description:
|
|
--
|
|
-- Dependencies:
|
|
--
|
|
-- Revision:
|
|
-- Revision 0.01 - File Created
|
|
-- Additional Comments:
|
|
--
|
|
----------------------------------------------------------------------------------
|
|
library IEEE;
|
|
use IEEE.STD_LOGIC_1164.ALL;
|
|
use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
|
|
|
use IEEE.NUMERIC_STD.ALL;
|
|
|
|
-- Uncomment the following library declaration if using
|
|
-- arithmetic functions with Signed or Unsigned values
|
|
--use IEEE.NUMERIC_STD.ALL;
|
|
|
|
-- Uncomment the following library declaration if instantiating
|
|
-- any Xilinx primitives in this code.
|
|
--library UNISIM;
|
|
--use UNISIM.VComponents.all;
|
|
|
|
entity processeur is
|
|
Port ( CLK: in STD_LOGIC ;
|
|
RST : in STD_LOGIC);
|
|
end processeur;
|
|
|
|
architecture Behavioral of processeur is
|
|
COMPONENT bm_instr
|
|
PORT(
|
|
IN_addr : IN std_logic_vector(7 downto 0);
|
|
OUT_data : OUT std_logic_vector(31 downto 0);
|
|
CLK : IN std_logic
|
|
);
|
|
END COMPONENT;
|
|
|
|
COMPONENT pipeline
|
|
PORT( OP_IN : in STD_LOGIC_VECTOR (7 downto 0);
|
|
A_IN : in STD_LOGIC_VECTOR (7 downto 0);
|
|
B_IN : in STD_LOGIC_VECTOR (7 downto 0);
|
|
C_IN : in STD_LOGIC_VECTOR (7 downto 0);
|
|
CLK : IN std_logic;
|
|
OP_OUT : out STD_LOGIC_VECTOR (7 downto 0);
|
|
A_OUT : out STD_LOGIC_VECTOR (7 downto 0);
|
|
B_OUT : out STD_LOGIC_VECTOR (7 downto 0);
|
|
C_OUT : out STD_LOGIC_VECTOR (7 downto 0)
|
|
);
|
|
END COMPONENT;
|
|
|
|
COMPONENT br
|
|
PORT(
|
|
A_addr : IN std_logic_vector(3 downto 0);
|
|
B_addr : IN std_logic_vector(3 downto 0);
|
|
W_addr : IN std_logic_vector(3 downto 0);
|
|
W : IN std_logic;
|
|
Data : IN std_logic_vector(7 downto 0);
|
|
RST : IN std_logic;
|
|
CLK : IN std_logic;
|
|
QA : OUT std_logic_vector(7 downto 0);
|
|
QB : OUT std_logic_vector(7 downto 0)
|
|
);
|
|
END COMPONENT;
|
|
|
|
COMPONENT alu
|
|
PORT(
|
|
A : IN std_logic_vector(7 downto 0);
|
|
B : IN std_logic_vector(7 downto 0);
|
|
Ctrl_Alu : IN std_logic_vector(2 downto 0);
|
|
N : OUT std_logic;
|
|
O : OUT std_logic;
|
|
Z : OUT std_logic;
|
|
C : OUT std_logic;
|
|
S : OUT std_logic_vector(7 downto 0)
|
|
);
|
|
END COMPONENT;
|
|
|
|
COMPONENT bm_data
|
|
PORT(
|
|
IN_addr : IN std_logic_vector(7 downto 0);
|
|
IN_data : IN std_logic_vector(7 downto 0);
|
|
RW : IN std_logic;
|
|
RST : IN std_logic;
|
|
CLK : IN std_logic;
|
|
OUT_data : OUT std_logic_vector(7 downto 0)
|
|
);
|
|
END COMPONENT;
|
|
|
|
--Inputs
|
|
signal IP : std_logic_vector(7 downto 0) := (others => '0');
|
|
signal QA_IN_MUX : std_logic_vector(7 downto 0) := (others => '0');
|
|
|
|
signal B_DIEX_IN : std_logic_vector(7 downto 0) := (others => '0');
|
|
signal C_DIEX_IN : std_logic_vector(7 downto 0) := (others => '0');
|
|
|
|
--Outputs
|
|
signal OUT_data : std_logic_vector(31 downto 0);
|
|
|
|
signal OP_LIDI_OUT : std_logic_vector(7 downto 0);
|
|
signal A_LIDI_OUT : std_logic_vector(7 downto 0);
|
|
signal B_LIDI_OUT : std_logic_vector(7 downto 0);
|
|
signal C_LIDI_OUT : std_logic_vector(7 downto 0);
|
|
|
|
signal OP_DIEX_OUT : std_logic_vector(7 downto 0);
|
|
signal A_DIEX_OUT : std_logic_vector(7 downto 0);
|
|
signal B_DIEX_OUT : std_logic_vector(7 downto 0);
|
|
signal C_DIEX_OUT : std_logic_vector(7 downto 0);
|
|
|
|
signal O_ALU_OUT : std_logic;
|
|
signal N_ALU_OUT : std_logic;
|
|
signal Z_ALU_OUT : std_logic;
|
|
signal C_ALU_OUT : std_logic;
|
|
|
|
signal A_EXMem_OUT : std_logic_vector(7 downto 0);
|
|
signal B_EXMem_OUT : std_logic_vector(7 downto 0);
|
|
signal OP_EXMem_OUT : std_logic_vector(7 downto 0);
|
|
|
|
signal A_MemRE_OUT : std_logic_vector(7 downto 0);
|
|
signal B_MemRE_OUT : std_logic_vector(7 downto 0);
|
|
signal OP_MemRE_OUT : std_logic_vector(7 downto 0);
|
|
|
|
--AUX
|
|
|
|
signal Ctr_ALU_LC : std_logic_vector(2 downto 0);
|
|
signal RW_LC : std_logic;
|
|
signal addr_dm_MUX : std_logic_vector(7 downto 0);
|
|
signal in_dm_MUX : std_logic_vector(7 downto 0);
|
|
signal out_dm_MUX : std_logic_vector(7 downto 0);
|
|
signal B_EXMem_IN : std_logic_vector(7 downto 0);
|
|
signal W_br_LC : std_logic;
|
|
signal S_IN_MUX : std_logic_vector(7 downto 0);
|
|
signal B_MemRE_IN : std_logic_vector(7 downto 0);
|
|
|
|
begin
|
|
|
|
-- Instantiate adresse des instructions
|
|
addr_instructions: bm_instr PORT MAP (
|
|
IN_addr => IP,
|
|
OUT_data => OUT_data,
|
|
CLK => CLK
|
|
);
|
|
|
|
-- Instantiate pipeline LI_LD
|
|
LI_LD : pipeline PORT MAP (
|
|
OP_IN => OUT_data(31 downto 24),
|
|
A_IN => OUT_data(23 downto 16),
|
|
B_IN => OUT_data(15 downto 8),
|
|
C_IN => OUT_data(7 downto 0),
|
|
CLK => CLK,
|
|
A_OUT => A_LIDI_OUT,
|
|
B_OUT => B_LIDI_OUT,
|
|
C_OUT => C_LIDI_OUT,
|
|
OP_OUT => OP_LIDI_OUT
|
|
);
|
|
W_br_LC <= '1' when OP_MemRE_OUT = x"07" or OP_MemRE_OUT = x"05" or OP_MemRE_OUT = x"06" or OP_MemRE_OUT = x"01" or OP_MemRE_OUT = x"02" or OP_MemRE_OUT = x"03" or OP_MemRE_OUT = x"04" else
|
|
'0';
|
|
-- Instanciate banc de registre
|
|
banc_registres : br PORT MAP (
|
|
A_addr => B_LIDI_OUT(3 downto 0),
|
|
B_addr => C_LIDI_OUT(3 downto 0),
|
|
W_addr => A_MemRE_OUT(3 downto 0),
|
|
W => W_br_LC, --ATTENTION LC
|
|
Data => B_MemRE_OUT,
|
|
RST => RST,
|
|
CLK => CLK,
|
|
QA => QA_IN_MUX,
|
|
QB => C_DIEX_IN
|
|
);
|
|
|
|
B_DIEX_IN <= QA_IN_MUX when OP_LIDI_OUT = x"05" or OP_LIDI_OUT = x"01" or OP_LIDI_OUT = x"02" or OP_LIDI_OUT = x"03" or OP_LIDI_OUT = x"04" else B_LIDI_OUT ;
|
|
|
|
|
|
-- Instantiate pipeline DI_EX
|
|
DI_EX : pipeline PORT MAP (
|
|
OP_IN => OP_LIDI_OUT,
|
|
A_IN => A_LIDI_OUT,
|
|
B_IN => B_DIEX_IN,
|
|
C_IN => C_DIEX_IN,
|
|
CLK => CLK,
|
|
A_OUT => A_DIEX_OUT,
|
|
B_OUT => B_DIEX_OUT,
|
|
C_OUT => C_DIEX_OUT,
|
|
OP_OUT => OP_DIEX_OUT
|
|
);
|
|
|
|
Ctr_ALU_LC <= "001" when OP_DIEX_OUT = x"01" else
|
|
"010" when OP_DIEX_OUT = x"03" else
|
|
"011" when OP_DIEX_OUT = x"02" else
|
|
"000";
|
|
|
|
-- Instantiate alu
|
|
UAL : alu PORT MAP (
|
|
A => B_DIEX_OUT,
|
|
B => C_DIEX_OUT,
|
|
Ctrl_Alu =>Ctr_AlU_LC,
|
|
N => N_ALU_OUT,
|
|
O => O_ALU_OUT,
|
|
Z => Z_ALU_OUT,
|
|
C => C_ALU_OUT,
|
|
S => S_IN_MUX
|
|
);
|
|
|
|
B_EXMem_IN <= S_IN_MUX when OP_DIEX_OUT = x"01" or OP_DIEX_OUT = x"02" or OP_DIEX_OUT = x"03" else
|
|
B_DIEX_OUT ;
|
|
|
|
|
|
-- Instantiate pipeline EX_Mem
|
|
EX_Mem : pipeline PORT MAP (
|
|
OP_IN => OP_DIEX_OUT,
|
|
A_IN => A_DIEX_OUT,
|
|
B_IN => B_EXMem_IN,
|
|
C_IN => x"00",
|
|
CLK => CLK,
|
|
A_OUT => A_EXMem_OUT,
|
|
B_OUT => B_EXMem_OUT,
|
|
C_OUT => open,
|
|
OP_OUT => OP_EXMem_OUT
|
|
);
|
|
|
|
RW_LC <= '0' when OP_EXMem_OUT = x"08" else
|
|
'1';
|
|
addr_dm_MUX <= B_EXMem_OUT when OP_EXMem_OUT = x"07" else
|
|
A_EXMem_OUT;
|
|
in_dm_MUX <= B_EXMem_OUT when OP_EXMem_OUT = x"08";
|
|
B_MemRE_IN <= out_dm_MUX when OP_EXMem_OUT = x"08" else
|
|
B_EXMem_OUT;
|
|
-- Instantiate banc de données
|
|
data_memory: bm_data PORT MAP (
|
|
IN_addr => addr_dm_MUX,
|
|
IN_data => B_MemRE_IN,
|
|
RW => RW_LC,
|
|
RST => RST,
|
|
CLK => CLK,
|
|
OUT_data => out_dm_MUX
|
|
);
|
|
|
|
-- Instantiate pipeline Mem_RE
|
|
Mem_RE : pipeline PORT MAP (
|
|
OP_IN => OP_EXMem_OUT,
|
|
A_IN => A_EXMem_OUT,
|
|
B_IN => B_EXMem_OUT,
|
|
C_IN => x"00",
|
|
CLK => CLK,
|
|
A_OUT => A_MemRE_OUT,
|
|
B_OUT => B_MemRE_OUT,
|
|
C_OUT => open,
|
|
OP_OUT => OP_MemRE_OUT
|
|
);
|
|
process
|
|
begin
|
|
wait until rising_edge(CLK);
|
|
if rst = '0' then
|
|
IP <= x"00";
|
|
else
|
|
IP <= IP + "00000001";
|
|
end if;
|
|
end process;
|
|
|
|
end Behavioral;
|
|
|