【问题标题】:VHDL syntaxe error near ifif 附近的 VHDL 语法错误
【发布时间】:2013-12-06 23:10:02
【问题描述】:

我正在尝试找出这个简单的 VHDL 代码的问题。如果有人可以帮助我,我将不胜感激。 PS:我尝试了没有条件块的代码,它可以工作:S!

*消息错误是:错误(10500):VHDL语法错误在Four_Bits_Adder.vhd(18)靠近文本“if”;期望“;”或标识符(“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;

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    if 语句是顺序语句,根据您的用法,应该在进程语句中,或者您应该使用并发信号赋值语句。对于流程声明来说,它似乎不够复杂。

    并发赋值语句:

     Cout <= A(3) and B(3);
    

    请注意,使用表达式作为信号赋值中的值的并发赋值语句可以传递“0”或“1”以外的值。

    不同风格的并发信号赋值语句只能传递表示枚举值的二进制:

    Cout <= '1'  when A(3) = '1' and B(3) = '1' else '0';
    

    (您的if 语句似乎也推断出一个锁存器,并且可以优化为常量“1”)。

    另请注意,您原来的if 嵌套语句可以用布尔值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 是一个数值,会导致错误。

    【讨论】:

    • 感谢您的指导,感谢您的帮助!
    • 如果您对答案感到满意,您可以针对下一个绊脚石提出不同的问题。另请参阅Ask questions, get answers
    【解决方案2】:

    除了 David 的(正确)答案之外,请注意,如果您尝试使用 Cout 作为进位输出来制作 4 位加法器,则该过程不会给出正确的值。考虑 A = "1111" 和 B = "0001"。 A(3) 是 '1' 但 B(3) 不是,结果是 S = "0000" 并且 Cout 应该 是 '1' 但 '0 '。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 2019-07-31
      相关资源
      最近更新 更多