我正在制作一个ALU,可以选择做A + 2B 但我很难让我的头脑倍增2B并在我的测试台得到正确的答案。
EG:A = 0110 B = 0011 等式是A + 2B 我即将获得0110
我的代码的snippit是
entity ALU is
port( A :IN STD_LOGIC_VECTOR(3 DOWNTO 0) ;
B :IN STD_LOGIC_VECTOR(3 DOWNTO 0) ;
S0 :IN STD_LOGIC ;
S1 :IN STD_LOGIC ;
M :IN STD_LOGIC ;
C0 :IN STD_LOGIC ;
Cout :OUT STD_LOGIC ;
Z :OUT STD_LOGIC ;
F :OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
SIGNAL VariableAlu : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL FTEMP : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL FTEMP2 : STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL ZTEMP : STD_LOGIC;
SIGNAL BTEMP1 : STD_LOGIC_VECTOR(4 DOWNTO 0);
END ALU ;
PROCESS(A,B,S0,S1,M,C0)
BEGIN
VariableAlu <= (S0 & S1 & C0 & M);
--M = 1 ARITHMETIC
(part that shifts it, lab teacher told us to do this)
BTEMP1(4 DOWNTO 1)<= B;
BTEMP1(0)<= '0';
when "1111" => FTEMP2 <= ((A) + BTEMP1);
任何帮助将不胜感激。
答案 0 :(得分:1)
您的代码有几点需要注意。首先,对于任何算术,请避免使用SLV并坚持使用unsigned
库中的signed
或numeric_std
类型。
操作数B的显式移位(乘以2):
BTEMP1(4 DOWNTO 1)<= B;
BTEMP1(0)<= '0';
是,a)不是必需的,b)详细。您可以通过简单地执行BTEMP <= B & '0';
来实现此目的,或者更好的是,甚至不使用中间信号并在switch语句中直接分配给FTEMP2
。例如
when "1111" => FTEMP2 <= std_logic_vector(unsigned(A) + unsigned(B&'0'));
请注意上述行中的转化。它们是必需的,因为默认情况下,SLV不支持+
运算符(除非您使用std_logic_unsigned
或std_logic_signed
库)。您需要包含numeric_std
库。
编辑:
我也忘了提到FTEMP可能会溢出给定的函数; F <= A + 2B
,其中A
和B
均为4位,F
为5位。
答案 1 :(得分:1)