mirror of
git://projects.qi-hardware.com/nn-usb-fpga.git
synced 2024-12-14 01:25:56 +02:00
62 lines
2.6 KiB
VHDL
62 lines
2.6 KiB
VHDL
|
---------------------------------------------------------------------
|
||
|
-- TITLE: Arithmetic Logic Unit
|
||
|
-- AUTHOR: Steve Rhoads (rhoadss@yahoo.com)
|
||
|
-- DATE CREATED: 2/8/01
|
||
|
-- FILENAME: alu.vhd
|
||
|
-- PROJECT: Plasma CPU core
|
||
|
-- COPYRIGHT: Software placed into the public domain by the author.
|
||
|
-- Software 'as is' without warranty. Author liable for nothing.
|
||
|
-- DESCRIPTION:
|
||
|
-- Implements the ALU.
|
||
|
---------------------------------------------------------------------
|
||
|
library ieee;
|
||
|
use ieee.std_logic_1164.all;
|
||
|
use work.mlite_pack.all;
|
||
|
|
||
|
entity alu is
|
||
|
generic(alu_type : string := "DEFAULT");
|
||
|
port(a_in : in std_logic_vector(31 downto 0);
|
||
|
b_in : in std_logic_vector(31 downto 0);
|
||
|
alu_function : in alu_function_type;
|
||
|
c_alu : out std_logic_vector(31 downto 0));
|
||
|
end; --alu
|
||
|
|
||
|
architecture logic of alu is
|
||
|
signal do_add : std_logic;
|
||
|
signal sum : std_logic_vector(32 downto 0);
|
||
|
signal less_than : std_logic;
|
||
|
begin
|
||
|
|
||
|
do_add <= '1' when alu_function = ALU_ADD else '0';
|
||
|
sum <= bv_adder(a_in, b_in, do_add);
|
||
|
less_than <= sum(32) when a_in(31) = b_in(31) or alu_function = ALU_LESS_THAN
|
||
|
else a_in(31);
|
||
|
|
||
|
GENERIC_ALU: if alu_type = "DEFAULT" generate
|
||
|
c_alu <= sum(31 downto 0) when alu_function=ALU_ADD or
|
||
|
alu_function=ALU_SUBTRACT else
|
||
|
ZERO(31 downto 1) & less_than when alu_function=ALU_LESS_THAN or
|
||
|
alu_function=ALU_LESS_THAN_SIGNED else
|
||
|
a_in or b_in when alu_function=ALU_OR else
|
||
|
a_in and b_in when alu_function=ALU_AND else
|
||
|
a_in xor b_in when alu_function=ALU_XOR else
|
||
|
a_in nor b_in when alu_function=ALU_NOR else
|
||
|
ZERO;
|
||
|
end generate;
|
||
|
|
||
|
AREA_OPTIMIZED_ALU: if alu_type/="DEFAULT" generate
|
||
|
c_alu <= sum(31 downto 0) when alu_function=ALU_ADD or
|
||
|
alu_function=ALU_SUBTRACT else (others => 'Z');
|
||
|
c_alu <= ZERO(31 downto 1) & less_than when alu_function=ALU_LESS_THAN or
|
||
|
alu_function=ALU_LESS_THAN_SIGNED else
|
||
|
(others => 'Z');
|
||
|
c_alu <= a_in or b_in when alu_function=ALU_OR else (others => 'Z');
|
||
|
c_alu <= a_in and b_in when alu_function=ALU_AND else (others => 'Z');
|
||
|
c_alu <= a_in xor b_in when alu_function=ALU_XOR else (others => 'Z');
|
||
|
c_alu <= a_in nor b_in when alu_function=ALU_NOR else (others => 'Z');
|
||
|
c_alu <= ZERO when alu_function=ALU_NOTHING else (others => 'Z');
|
||
|
end generate;
|
||
|
|
||
|
end; --architecture logic
|
||
|
|