processor-2000/ALU.vhd
2021-05-04 15:29:08 +02:00

44 lines
1.4 KiB
VHDL

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
entity ALU is
Port ( A : in STD_LOGIC_VECTOR (7 downto 0);
B : in STD_LOGIC_VECTOR (7 downto 0);
S : out STD_LOGIC_VECTOR (7 downto 0);
O : out STD_LOGIC;
Z : out STD_LOGIC;
C : out STD_LOGIC;
Ctrl : in STD_LOGIC_VECTOR (1 downto 0));
end ALU;
architecture Behavioral of ALU is
constant Ctrl_ADD : STD_LOGIC_VECTOR (1 downto 0) := "01";
constant Ctrl_MUL : STD_LOGIC_VECTOR (1 downto 0) := "10";
constant Ctrl_SOU : STD_LOGIC_VECTOR (1 downto 0) := "11";
SIGNAL aux : STD_LOGIC_VECTOR (7 downto 0);
SIGNAL A9 : STD_LOGIC_VECTOR (8 downto 0);
SIGNAL B9 : STD_LOGIC_VECTOR (8 downto 0);
SIGNAL ADD : STD_LOGIC_VECTOR (8 downto 0);
SIGNAL SUB : STD_LOGIC_VECTOR (8 downto 0);
SIGNAL MUL : STD_LOGIC_VECTOR (15 downto 0);
begin
A9 <= '0' & A;
B9 <= '0' & B;
ADD <= A9 + B9;
SUB <= A9 - B9;
MUL <= A * B;
aux <= ADD(7 downto 0) when Ctrl = Ctrl_ADD else
SUB(7 downto 0) when Ctrl = Ctrl_SOU else
MUL(7 downto 0) when Ctrl = Ctrl_MUL else
(others => '0');
O <= ADD(8) when Ctrl = Ctrl_ADD else
'0' when Ctrl = Ctrl_MUL and MUL(15 downto 8) = "00000000" else
'1' when Ctrl = Ctrl_MUL else
'0';
C <= ADD(8) when Ctrl = Ctrl_ADD else '0';
Z <= '1' when aux = "00000000" else '0';
S <= aux;
end Behavioral;