ALU,即算术逻辑单元(arithmetic and logic unit) 是能实现多组算术运算和逻辑运算的组合逻辑电路,简称ALU。
ALU的实现较为简单,根据真值表利用case语句分情况设计即可。本人所写ALU较为简单,具有以下功能:
模块的端口主要有3位的功能选择端,两个8位的A,B数据输入端口,1位的C进位/借位端口,以及8位的数据输出端口。C仅在进行加法和减法时有效。当有进位或借位时输出1,无则为0。其中乘法功能为AB输入低四位相乘。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ALU is
port(
S:in std_logic_vector(2 downto 0);
A:in std_logic_vector(7 downto 0);
B:in std_logic_vector(7 downto 0);
C:out std_logic;
D:out std_logic_vector(7 downto 0)
);
end ALU;
architecture behave of ALU is
signal temp: std_logic_vector(8 downto 0);
signal aa:std_logic_vector(8 downto 0);
signal bb:std_logic_vector(8 downto 0);
begin
process(A,B,aa,bb,temp)
begin
case S is
when "000"=>
D<=A and B;
when "001"=>
D<=A;
when "010"=>
aa<='0'& A(7 downto 0);
bb<='0'& B(7 downto 0);
temp<=aa+bb;
C<=temp(8);
D<=temp(7 downto 0);
when "011"=>
aa<='0'& A(7 downto 0);
bb<='0'& B(7 downto 0);
temp<=aa-bb;
if(aa>=bb) then
C<='0';
else
C<='1';
end if;
D<=temp(7 downto 0);
when "100"=>
D<=A(3 downto 0)*B(3 downto 0);
when others => null;
end case;
end process ;
end behave;
接下来是仿真波形图:
与功能
直通功能
加法功能
减法功能
乘法功能(低位乘法)
通过观察波形图,判断功能基本正确。这其中减法器最费功夫,C借位信号常常为高阻态,不能正常显示借位信息。隐隐觉得写的有些问题。如有大佬们发现了代码中的错误,还请大家指出。