if附近的VHDL语法错误

时间:2013-12-06 23:10:02

标签: vhdl

我试图通过这个简单的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;

2 个答案:

答案 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 ”。

相关问题