【发布时间】: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 语句(从
if到end if是顺序语句,只能出现在进程语句(并发语句)或子程序体中。这里你有一个在架构语句部分,其语句都是并发语句,要么是进程,要么代表设计层次结构,要么代表进程。将 enire if 语句移动到进程语句中。注意信号Sum应声明索引范围为 4 到 0。 -
@user16145658 是的哈哈,这是我将其放入进程后遇到的下一个错误。它现在正在运行!非常感谢:)
-
还有一个concurrent conditional signal assignment statement,它减轻了将
Sum放入进程敏感度列表中的需要,这需要多次恢复和随后的进程暂停。在任何情况下,您只需要对Cout和Overflow进行单一分配。
标签: vhdl quartus intel-fpga