【问题标题】:Why am I getting an error saying "expecting end" when I do have an end if?如果我确实有结束,为什么我会收到一条错误消息“期待结束”?
【发布时间】:2021-12-03 21:53:50
【问题描述】:

我正在尝试制作一个 4 位加法器/减法器(我试图在添加 2s 补码之前让它工作)并且我不断收到这些错误消息:

错误 (10500):ASU.vhd(16) 的 VHDL 语法错误,靠近文本“if”;期待“end”、“(”、标识符(“if”是保留关键字)或并发语句
错误 (10500):ASU.vhd(21) 的 VHDL 语法错误,靠近文本“else”;期待“end”、“(”、标识符(“else”是保留关键字)或并发语句
错误 (10500):ASU.vhd(26) 的 VHDL 语法错误,靠近文本“if”;期望“;”或标识符(“if”是保留关键字)或“架构”

真正让我困惑的是它说 end if 是预期的,因为我确实写了一个 end if。如果有人能帮我找出我的代码哪里出错了,我将不胜感激! 到目前为止,这是我的代码:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;

ENTITY ASU IS
PORT (Cin  : IN STD_LOGIC;
     X, Y: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
        S   : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
        Cout, Overflow : out std_logic);
END ASU;

ARCHITECTURE Behaviour OF ASU IS
   signal Sum : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN

if Cin = '1' then 
   sum     <= ('0'& X)-('0'&Y);
   S       <= SUM(3 DOWNTO 0);
   Cout    <= Sum(3);
   Overflow <= Sum(4) XOR X(3) XOR Y(3) XOR Sum(3);
else
    sum     <= ('0'&X)+('0'&Y);
    S       <= SUM(3 DOWNTO 0);
    Cout    <= Sum(3);
    Overflow <= Sum(4) XOR X(3) XOR Y(3) XOR Sum(3); 
end if;

END Behaviour;

【问题讨论】:

  • 如果你注释掉整个 if Cin = '1' then 块并且它仍然抱怨,那么语法错误就在那个块之前的某个地方。
  • @AndrewMorton 我最终把它放在一个进程中并且它工作了,但这是一个很好的建议,我将来肯定会使用它!
  • if 语句(从ifend if 是顺序语句,只能出现在进程语句(并发语句)或子程序体中。这里你有一个在架构语句部分,其语句都是并发语句,要么是进程,要么代表设计层次结构,要么代表进程。将 enire if 语句移动到进程语句中。注意信号Sum 应声明索引范围为 4 到 0。
  • @user16145658 是的哈哈,这是我将其放入进程后遇到的下一个错误。它现在正在运行!非常感谢:)
  • 还有一个concurrent conditional signal assignment statement,它减轻了将Sum 放入进程敏感度列表中的需要,这需要多次恢复和随后的进程暂停。在任何情况下,您只需要对 CoutOverflow 进行单一分配。

标签: vhdl quartus intel-fpga


【解决方案1】:

ifelseendif 条件是顺序语句,因此只能出现在进程内部。

【讨论】:

  • 哦,明白了,非常感谢!
  • 这些保留字都是问题中出现的单个 if 语句的一部分。除了进程中的语句,顺序语句可以出现在子程序中。
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 2020-09-14
  • 1970-01-01
  • 2015-01-25
相关资源
最近更新 更多