函数发生器的主要的是对两个操作数进行逻辑运算,比如加、减、与,或者对操作数进行取非运算。还有一种情况就是不需要对操作数进行操作,即直传,比如移位操作的时候(因为移位操作在后续单独的一个部件进行)。该部分为一个组合逻辑电路,不需要时钟的控制,只根据输入的数据以及运算的类型输出运算结果。
(1)VHDL代码:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use ieee.std_logic_unsigned.all;
entity ALUYSQ is
Port ( M : in STD_LOGIC;
A : in STD_LOGIC_VECTOR (7 downto 0);
B : in STD_LOGIC_VECTOR (7 downto 0);
S : in STD_LOGIC_VECTOR (3 downto 0);
F : out STD_LOGIC_VECTOR (7 downto 0);
C,Zz : out STD_LOGIC);
end ALUYSQ;
architecture ST of ALUYSQ is
begin
process(S,A,B,M)
variable midc:std_logic:='0';
variable midz:std_logic:='0';
variable res:std_logic_vector(8 downto 0);
begin
if(S="1001"and M='1')then
res:=('0'&A)+('0'&B);
midc:=res(8);
F<=res(7 downto 0);
if(res(7 downto 0)="00000000")then midz:='1';
else midz:='0';
end if;
elsif(S="0110"and M='1')then
res:=('0'&A)-('0'&B);
midc:=res(8);
F<=res(7 downto 0);
if(res(7 downto 0)="00000000")then midz:='1';
else midz:='0';
end if;
elsif(S="1110"and M='1')then
F<=(A and B);
elsif(S="0101"and M='1')then
F<=(not B);
elsif(S="1010"and M='0')Then
F<=B;
elsif(S="1111"and M='0')Then
F<=A;
else F<="ZZZZZZZZ";
end if;
C<=midc;
Zz<=midz;
end process;
end ST;
(2)
引脚说明:
输入输出端口分别为:
M:ALU函数反生器的控制端,M为高电平时进行逻辑运算,M为低电平时进行数据的直传;
A,B:两个运算数据的输入端;
S :区分ALU的操作类型的输入;
F :ALU的结果输出;
C :ALU的进位输出,当存在进位时C=‘1’,否则C=‘0’;
Zz :ALU的结果判断,当ADD或者SUB的结果为0时,Zz=‘1’,否则Zz=‘0’。
(3)波形仿真:
最开始C和Zz的输出均为X,这是正常现象,因为还没有进行ADD和SUB运算,当进行了运算之后,由波形图可知C和Zz的输出正确。在S和M的控制下,F的输出为A,B两个数据输入输入的数据进行函数运算后的结果,符合设计要求。