---------------------------------------------------------------------------------- -- Company: -- Engineer: -- -- Create Date: 15.05.2023 14:29:58 -- Design Name: -- Module Name: Pipeline - 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; -- 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 leaf cells in this code. --library UNISIM; --use UNISIM.VComponents.all; entity Pipeline is Port ( Clk : in STD_LOGIC); end Pipeline; architecture Behavioral of Pipeline is component IP is port ( CLK : in STD_LOGIC; RST : in STD_LOGIC; -- rst when 0 LOAD : in STD_LOGIC; EN : in STD_LOGIC; -- enable when 1 Din : in STD_LOGIC_VECTOR (7 downto 0); Dout : out STD_LOGIC_VECTOR (7 downto 0)); end component; signal IP_out : STD_LOGIC_VECTOR (7 downto 0) := (others => '0'); signal Rst : STD_LOGIC; -- to modify component InstructionMemory Port ( Addr : in STD_LOGIC_VECTOR (7 downto 0); Clk : in STD_LOGIC; Inst_out : out STD_LOGIC_VECTOR (31 downto 0)); end component; signal Li : STD_LOGIC_VECTOR (31 downto 0) := (others => '0'); component Stage_Li_Di Port ( In_A : in STD_LOGIC_VECTOR (7 downto 0); In_B : in STD_LOGIC_VECTOR (7 downto 0); In_C : in STD_LOGIC_VECTOR (7 downto 0); In_Op : in STD_LOGIC_VECTOR (7 downto 0); Clk : in STD_LOGIC; Out_A : out STD_LOGIC_VECTOR (7 downto 0); Out_B : out STD_LOGIC_VECTOR (7 downto 0); Out_Op : out STD_LOGIC_VECTOR (7 downto 0); Out_C : out STD_LOGIC_VECTOR (7 downto 0) ); end component; signal Li_A, Li_Op, Li_B, Li_C : STD_LOGIC_VECTOR (7 downto 0) := (others => '0'); component Registers Port ( Addr_A : in STD_LOGIC_VECTOR (3 downto 0); Addr_B : in STD_LOGIC_VECTOR (3 downto 0); Addr_W : 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; signal Di_A, Di_Op, Di_B, Di_C : STD_LOGIC_VECTOR (7 downto 0) := (others => '0'); signal Di_RegB, Di_FinalB, Di_C2 : STD_LOGIC_VECTOR (7 downto 0) := (others => '0'); component Stage_Di_Ex Port ( In_A : in STD_LOGIC_VECTOR (7 downto 0); In_B : in STD_LOGIC_VECTOR (7 downto 0); In_C : in STD_LOGIC_VECTOR (7 downto 0); In_Op : in STD_LOGIC_VECTOR (7 downto 0); Clk : in STD_LOGIC; Out_A : out STD_LOGIC_VECTOR (7 downto 0); Out_B : out STD_LOGIC_VECTOR (7 downto 0); Out_Op : out STD_LOGIC_VECTOR (7 downto 0); Out_C : out STD_LOGIC_VECTOR (7 downto 0) ); end component; signal Ex_A, Ex_Op, Ex_B, Ex_C : STD_LOGIC_VECTOR (7 downto 0) := (others => '0'); 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 (7 downto 0); S : out STD_LOGIC_VECTOR (7 downto 0); N : out STD_LOGIC; O : out STD_LOGIC; Z : out STD_LOGIC; C : out STD_LOGIC ); end component; signal Ex_Ctrl_ALu, Ex_Res_Alu, Ex_FinalB : STD_LOGIC_VECTOR (7 downto 0) := (others => '0'); signal S_NFlag, S_Oflag, S_CFlag, S_ZFlag : STD_LOGIC; component Stage_Ex_Mem Port ( In_A : in STD_LOGIC_VECTOR (7 downto 0); In_B : in STD_LOGIC_VECTOR (7 downto 0); In_Op : in STD_LOGIC_VECTOR (7 downto 0); Clk : in STD_LOGIC; Out_A : out STD_LOGIC_VECTOR (7 downto 0); Out_B : out STD_LOGIC_VECTOR (7 downto 0); Out_Op : out STD_LOGIC_VECTOR (7 downto 0) ); end component; signal Mem_A, Mem_Op, Mem_B : STD_LOGIC_VECTOR (7 downto 0) := (others => '0'); signal Mem_RW : STD_LOGIC; signal Mem_Addr, Mem_Data_Out, Mem_FinalB : STD_LOGIC_VECTOR (7 downto 0) := (others => '0'); component DataMemory Port ( Addr : in STD_LOGIC_VECTOR (7 downto 0); Data_in : in STD_LOGIC_VECTOR (7 downto 0); Rw : in STD_LOGIC; Rst : in STD_LOGIC; Clk : in STD_LOGIC; Data_out : out STD_LOGIC_VECTOR (7 downto 0) ); end component; component Stage_Mem_Re Port ( In_A : in STD_LOGIC_VECTOR (7 downto 0); In_B : in STD_LOGIC_VECTOR (7 downto 0); In_Op : in STD_LOGIC_VECTOR (7 downto 0); Clk : in STD_LOGIC; Out_A : out STD_LOGIC_VECTOR (7 downto 0); Out_B : out STD_LOGIC_VECTOR (7 downto 0); Out_Op : out STD_LOGIC_VECTOR (7 downto 0) ); end component; component ControlUnit is Port ( Op_DI, Op_EX, Op_Mem : in STD_LOGIC_VECTOR (7 downto 0); A_EX, A_Mem : in STD_LOGIC_VECTOR (7 downto 0); B_DI : in STD_LOGIC_VECTOR (7 downto 0); C_DI : in STD_LOGIC_VECTOR (7 downto 0); CNTRL : out STD_LOGIC ); end component; signal Re_A, Re_Op, Re_B : STD_LOGIC_VECTOR (7 downto 0) := (others => '0'); signal Re_W : STD_LOGIC; -- to control jumping and where to jump signal addr_to_jump : STD_LOGIC_VECTOR (7 downto 0) := (others => '0'); signal jump : STD_LOGIC; signal nop_Cntrl : STD_LOGIC; signal OP_LI_DI : STD_LOGIC_VECTOR (7 downto 0) := (others => '0'); begin -- instructionPointer inst_point : IP port map ( CLK=> clk, Dout=> IP_out, Din => addr_to_jump, RST => '1', EN => nop_Cntrl, LOAD => jump); -- instructionMemory MemInst : InstructionMemory PORT MAP ( Addr => IP_out, Clk => Clk, Inst_out => Li); -- Stage_Li_Di Stage1 : Stage_Li_Di PORT MAP ( In_A => Li(23 downto 16), In_B => Li(15 downto 8), In_C => Li(7 downto 0), In_Op => OP_LI_DI, Clk => Clk, Out_A => Di_A, Out_B => Di_B, Out_Op => Di_Op, Out_C => Di_C); -- Registers StageRegisters : Registers PORT MAP ( Addr_A => Di_B(3 downto 0), -- because the registers are on 4 bits Addr_B => Di_C(3 downto 0), Addr_W => Re_A(3 downto 0), W => Re_W, Data => Re_B, Rst => Rst, Clk => Clk, QA => Di_RegB, QB => Di_C2); -- Stage DI/EX Stage2 : Stage_Di_Ex PORT MAP ( In_A => Di_A, In_B => Di_FinalB, In_C => Di_C2, In_Op => Di_Op, Clk => Clk, Out_A => Ex_A, Out_B => Ex_B, Out_Op => Ex_Op, Out_C => Ex_C); -- ALU Ual : ALU PORT MAP ( A => Ex_B, B => Ex_C, Ctrl_Alu => Ex_Ctrl_ALu, S => Ex_Res_Alu, N => S_NFlag, O => S_OFlag, Z => S_ZFlag, C => S_CFlag); -- Stage Ex/Mem Stage3 : Stage_Ex_Mem PORT MAP ( In_A => Ex_A, In_B => Ex_FinalB, In_Op => Ex_Op, Clk => Clk, Out_A => Mem_A, Out_B => Mem_B, Out_Op => Mem_Op); -- DataMemory DataMem : DataMemory PORT MAP ( Addr => Mem_Addr, Data_in => Mem_B, Rw => Mem_RW, Rst => Rst, Clk => Clk, Data_out => Mem_Data_Out); -- Stage Mem/RE Stage4 : Stage_Mem_Re PORT MAP ( In_A => Mem_A, In_B => Mem_FinalB, In_Op => Mem_Op, Clk => Clk, Out_A => Re_A, Out_B => Re_B, Out_Op => Re_Op); -- Instruction code -- ADD x"01" -- MUL x"02" -- SUB x"03" -- DIV x"04" -- COP x"05" -- AFC x"06" -- LOAD x"07" -- STORE x"08" -- INF x"09" -- SUP x"0A" -- EQ x"0B" -- NOT x"0C" -- AND x"0D" -- OR x"0E" -- JMP x"0F" -- JMF x"10" -- CAL x"11" -- RET x"12" -- PRI x"13" -- NOP x"FF" -- Mux post registers Di_FinalB <= Di_B when Di_OP = x"06" -- AFC else Di_RegB; -- Mux post ALU Ex_FinalB <= Ex_B when Ex_Op = x"06" --AFC or Ex_Op = x"05" --COP or Ex_Op = x"07" --LOAD or Ex_Op = x"08" --STORE else Ex_Res_Alu; -- LC pre ALU Ex_Ctrl_ALu <= x"00" when Ex_Op = x"05" or Ex_Op = x"06" or Ex_Op = x"07" or Ex_Op = x"08" --(not using ALU) else Ex_Op; -- Mux post data memory Mem_FinalB <= Mem_B when Mem_Op = x"06" --AFC or Mem_Op = x"05" --COP or Mem_Op = x"01" --ADD or Mem_Op = x"03" -- SUB or Mem_Op = x"02" -- MUL or Mem_Op = x"04" -- DIV else Mem_FinalB ; --LOAD & STORE -- Mux pre data memory Mem_Addr <= Mem_B when Mem_Op = x"07" --LOAD else Mem_A; --STORE -- LC pre data memory Mem_RW <= '1' when Mem_Op = x"07" --LOAD else '0'; --STORE -- LC post Pip_Mem_Re Re_W <= '0' when Re_Op = x"08" --STORE else '1'; CU : ControlUnit port map ( Op_DI => Li(31 downto 24), Op_EX => Di_Op, Op_Mem => Ex_Op, A_EX => Di_A, A_Mem => Ex_A, B_DI => Li(15 downto 8), C_DI => Li(7 downto 0), CNTRL => nop_Cntrl); -- in case of alea : replace li(31 downto 24) by NOP OP_LI_DI <= X"ff" when nop_Cntrl='1' else Li(31 downto 24); end Behavioral;