44 lines
1.4 KiB
VHDL
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;
|