我试图通过这个简单的VHDL代码找出问题。如果有人能帮助我,我将不胜感激。 PS:我尝试了没有条件块的代码,它可以工作:S!
*消息错误是:错误(10500):文本“if”附近的Four_Bits_Adder.vhd(18)处的VHDL语法错误;期待“;”或标识符(“if”是保留关键字)或“架构”*
4位加法器代码为:
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
entity Four_Bits_Adder is
port(A,B:in std_logic_vector(3 downto 0);
S:out std_logic_vector(3 downto 0);
Cout:out std_logic);
end Four_Bits_Adder;
architecture description of Four_Bits_Adder is
begin
S<= A+B;
if A(3)=1 then
if B(3)=1 then
Cout<=1;
end if;
end if;
end description;
答案 0 :(得分:4)
if
语句是一个顺序语句,您的用法应该在进程语句中,或者您应该使用并发信号赋值语句。对于流程声明来说,这似乎不够复杂。
并发作业声明:
Cout <= A(3) and B(3);
请注意,使用表达式作为其信号赋值中的值的并发赋值语句可以传递除“0”或“1”之外的值。
不同类型的并发信号赋值语句只能传递表示枚举值的二进制值:
Cout <= '1' when A(3) = '1' and B(3) = '1' else '0';
(您的if
语句似乎也可以推断出一个锁存器,可以优化为常量'1'。
另请注意,您的原始if
嵌套语句可以用BOOLEAN and
表示,它是一个短路运算符,取代了Ada的if expression and then ...
。
如果在if
语句之后没有一个或多个介入语句(包括它的end if
),则没有理由使用不同的表达式嵌套if
语句。如果第一个表达式的计算结果为真,则短路运算符只会评估后续表达式。
表格将与
一致if A(3) = '1' and B(3) = '1' then
Cout <= '1';
end if;
并且仍然只能在顺序陈述合适的地方使用。
请注意,std_logic需要枚举值('U','X','0','1',...),而1
是一个数值,会导致错误。
答案 1 :(得分:0)
除了David的(正确的)答案之外,请注意,如果您尝试使用Cout作为进位输出来制作4位加法器,则该过程将不会给出正确的值。考虑A =“1111”并且B =“0001”。 A(3)为'1'但B(3)不是,结果为S =“0000”,Cout 应为'1',但为'0 ”。