Line 14... |
Line 14... |
--
|
--
|
-- You should have received a copy of the GNU Lesser General Public License
|
-- You should have received a copy of the GNU Lesser General Public License
|
-- along with Experimental Unstable CPU System. If not, see
|
-- along with Experimental Unstable CPU System. If not, see
|
-- http://www.gnu.org/licenses/lgpl.txt.
|
-- http://www.gnu.org/licenses/lgpl.txt.
|
|
|
|
LIBRARY ieee;
|
|
USE ieee.STD_LOGIC_1164.ALL;
|
|
USE ieee.NUMERIC_STD.ALL;
|
|
|
LIBRARY IEEE;
|
ENTITY alu IS
|
USE IEEE.STD_LOGIC_1164.ALL;
|
|
|
|
ENTITY ALU IS
|
|
PORT (A : IN STD_LOGIC_VECTOR (15 DOWNTO 0);
|
|
B : IN STD_LOGIC_VECTOR (15 DOWNTO 0);
|
|
X : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
|
|
SEL : IN STD_LOGIC_VECTOR (5 DOWNTO 0));
|
|
END ALU;
|
|
|
|
ARCHITECTURE Behavioral OF ALU IS
|
|
|
|
COMPONENT boole IS
|
|
GENERIC (
|
GENERIC (
|
width : NATURAL := 32);
|
w_data : NATURAL RANGE 1 TO 32 := 16);
|
PORT (A : IN STD_LOGIC_VECTOR (width - 1 DOWNTO 0);
|
PORT(
|
B : IN STD_LOGIC_VECTOR (width - 1 DOWNTO 0);
|
op : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
|
X : OUT STD_LOGIC_VECTOR (width - 1 DOWNTO 0);
|
A : IN STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0);
|
SEL : IN STD_LOGIC_VECTOR (2 DOWNTO 0));
|
B : IN STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0);
|
END COMPONENT boole;
|
Y : OUT STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0));
|
|
|
|
FUNCTION alu_add (
|
|
SIGNAL A : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0);
|
|
SIGNAL B : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0))
|
|
RETURN STD_LOGIC_VECTOR;
|
|
|
|
FUNCTION alu_add(
|
|
SIGNAL A : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0);
|
|
SIGNAL B : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0))
|
|
RETURN STD_LOGIC_VECTOR IS
|
|
BEGIN -- alu_add
|
|
RETURN STD_LOGIC_VECTOR(UNSIGNED(A) + UNSIGNED(B));
|
|
END alu_add;
|
|
|
|
FUNCTION alu_sub (
|
|
SIGNAL A : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0);
|
|
SIGNAL B : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0))
|
|
RETURN STD_LOGIC_VECTOR;
|
|
|
|
FUNCTION alu_sub(
|
|
SIGNAL A : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0);
|
|
SIGNAL B : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0))
|
|
RETURN STD_LOGIC_VECTOR IS
|
|
BEGIN -- alu_sub
|
|
RETURN STD_LOGIC_VECTOR(UNSIGNED(A) - UNSIGNED(B));
|
|
END alu_sub;
|
|
|
|
FUNCTION alu_inc (
|
|
SIGNAL A : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0))
|
|
RETURN STD_LOGIC_VECTOR;
|
|
|
|
FUNCTION alu_inc (
|
|
SIGNAL A : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0))
|
|
RETURN STD_LOGIC_VECTOR IS
|
|
BEGIN
|
|
RETURN STD_LOGIC_VECTOR(UNSIGNED(A) + 1);
|
|
END alu_inc;
|
|
|
COMPONENT shift IS
|
FUNCTION alu_dec (
|
GENERIC (
|
SIGNAL A : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0))
|
width : NATURAL := 16);
|
RETURN STD_LOGIC_VECTOR;
|
PORT (A : IN STD_LOGIC_VECTOR (width - 1 DOWNTO 0);
|
|
B : IN STD_LOGIC_VECTOR (width - 1 DOWNTO 0);
|
FUNCTION alu_dec (
|
X : OUT STD_LOGIC_VECTOR (width - 1 DOWNTO 0);
|
SIGNAL A : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0))
|
SEL : IN STD_LOGIC_VECTOR (2 DOWNTO 0));
|
RETURN STD_LOGIC_VECTOR IS
|
END COMPONENT shift;
|
BEGIN
|
|
RETURN STD_LOGIC_VECTOR(UNSIGNED(A) - 1);
|
COMPONENT addsub IS
|
END alu_dec;
|
PORT (A : IN STD_LOGIC_VECTOR (15 DOWNTO 0);
|
|
B : IN STD_LOGIC_VECTOR (15 DOWNTO 0);
|
FUNCTION shift_left (
|
SUM : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
|
SIGNAL A : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0))
|
CARRY : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
|
RETURN STD_LOGIC_VECTOR;
|
SEL : IN STD_LOGIC_VECTOR (1 DOWNTO 0));
|
|
END COMPONENT addsub;
|
FUNCTION shift_left (
|
|
SIGNAL A : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0))
|
COMPONENT multiplier IS
|
RETURN STD_LOGIC_VECTOR IS
|
PORT (A : IN STD_LOGIC_VECTOR (15 DOWNTO 0);
|
BEGIN
|
B : IN STD_LOGIC_VECTOR (15 DOWNTO 0);
|
RETURN STD_LOGIC_VECTOR(shift_left(UNSIGNED(A), 1));
|
PRODUCT_HIGH : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
|
END shift_left;
|
PRODUCT_LOW : OUT STD_LOGIC_VECTOR (15 DOWNTO 0));
|
|
END COMPONENT multiplier;
|
|
|
|
SIGNAL bool_out : STD_LOGIC_VECTOR(15 DOWNTO 0);
|
|
SIGNAL shift_out : STD_LOGIC_VECTOR(15 DOWNTO 0);
|
|
SIGNAL add_out : STD_LOGIC_VECTOR(15 DOWNTO 0);
|
|
SIGNAL carry_out : STD_LOGIC_VECTOR(15 DOWNTO 0);
|
|
SIGNAL prod_low_out : STD_LOGIC_VECTOR(15 DOWNTO 0);
|
|
SIGNAL prod_high_out : STD_LOGIC_VECTOR(15 DOWNTO 0);
|
|
|
|
|
FUNCTION shift_right (
|
|
SIGNAL A : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0))
|
|
RETURN STD_LOGIC_VECTOR;
|
|
|
|
FUNCTION shift_right (
|
|
SIGNAL A : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0))
|
|
RETURN STD_LOGIC_VECTOR IS
|
BEGIN
|
BEGIN
|
|
RETURN STD_LOGIC_VECTOR(shift_right(UNSIGNED(A), 1));
|
|
END shift_right;
|
|
|
|
END ENTITY alu;
|
|
|
BOOL1 : boole
|
ARCHITECTURE Behavioral OF alu IS
|
GENERIC MAP (
|
|
width => 16)
|
|
PORT MAP (
|
|
A => A,
|
|
B => B,
|
|
X => bool_out,
|
|
SEL => SEL(2 DOWNTO 0));
|
|
|
|
SHIFT1 : shift PORT MAP (
|
|
A => A,
|
|
B => B,
|
|
X => shift_out,
|
|
SEL => SEL(2 DOWNTO 0));
|
|
|
|
ADD1 : addsub PORT MAP (
|
|
A => A,
|
|
B => B,
|
|
SUM => add_out,
|
|
CARRY => carry_out,
|
|
SEL => SEL(1 DOWNTO 0));
|
|
|
|
MULT1 : multiplier PORT MAP (
|
|
A => A,
|
|
B => B,
|
|
PRODUCT_HIGH => prod_high_out,
|
|
PRODUCT_LOW => prod_low_out);
|
|
|
|
WITH SEL(5 DOWNTO 3) SELECT
|
|
X <=
|
|
bool_out WHEN "000",
|
|
shift_out WHEN "001",
|
|
add_out WHEN "010",
|
|
carry_out WHEN "011",
|
|
prod_low_out WHEN "100",
|
|
prod_high_out WHEN "101",
|
|
X"0000" WHEN OTHERS;
|
|
|
|
END Behavioral;
|
CONSTANT ZERO : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0)
|
|
:= STD_LOGIC_VECTOR(TO_UNSIGNED(0, w_data));
|
|
CONSTANT ONE : STD_LOGIC_VECTOR(w_data - 1 DOWNTO 0)
|
|
:= STD_LOGIC_VECTOR(TO_UNSIGNED(1, w_data));
|
|
|
|
BEGIN -- ARCHITECTURE Behavioral
|
|
|
|
WITH op SELECT
|
|
y <=
|
|
alu_inc(A) WHEN "0000",
|
|
alu_dec(A) WHEN "0001",
|
|
ZERO WHEN "0010", -- Place holder
|
|
ONE WHEN "0011", -- Place holder
|
|
B WHEN "0100",
|
|
A WHEN "0101", -- Place holder
|
|
A WHEN "0110", -- Place holder
|
|
alu_add(A, B) WHEN "0111",
|
|
alu_sub(A, B) WHEN "1000",
|
|
A WHEN "1001", -- Place holder
|
|
A AND B WHEN "1010",
|
|
A OR B WHEN "1011",
|
|
A XOR B WHEN "1100",
|
|
NOT A WHEN "1101",
|
|
shift_left(A) WHEN "1110",
|
|
shift_right(A) WHEN "1111",
|
|
A WHEN OTHERS;
|
|
|
|
END ARCHITECTURE Behavioral;
|
|
|
No newline at end of file
|
No newline at end of file
|