【发布时间】:2023-03-14 10:30:01
【问题描述】:
我知道这个错误在 SO 上已经遇到过好几次了,但是作为一个初学者,我仍然无法在我自己的代码中看到如何解决这个错误。错误和代码都打印在下面,感谢任何人的输入。
错误 (10818):无法推断 5bit_PHreg_vhdl.vhd(21) 处的 count[0] 寄存器,因为它在时钟边沿之外没有保持其值
'count' 的每一位都会重复该错误,并引用代码中注明的行。
ARCHITECTURE behavioral OF 5bit_PHreg_vhdl IS
SIGNAL count : STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
PROCESS(reset, clk, SHR_EN)
BEGIN
-- Check if asynchronous reset is 0
IF reset = '0' THEN --ERROR OCCURS HERE
count <= "00000";
-- Check if rising edge
ELSIF (clk'EVENT AND clk = '1') THEN
IF LD_EN = '1' THEN
count <= FA_in;
END IF;
-- Check if SHR_EN is active
ELSIF (SHR_EN = '1') THEN
count(4) <= c_in;
count(3) <= count(4);
count(2) <= count(3);
count(1) <= count(2);
count(0) <= count(1);
c_out <= count(0);
END IF;
END PROCESS;
PH_reg_out <= count;
END behavioral;
【问题讨论】:
-
不要在
IF (clk'EVENT AND clk = '1')之后使用else或elsif。此外,使用rising_edge(clk)而不是clk'EVENT AND clk = '1'。阅读HERE为什么。我不能给你详细的答案,因为你只提供了一部分代码,并没有解释它应该做什么。提供minimal reproducible example。 -
ELSIF (SHR_EN = '1') THEN在复位和时钟边沿条件之外,它的形式无法被综合识别。如果已注册,则将其和以下分配移动到前一端内。从进程敏感度列表中删除 SHR_EN。 -
感谢所有评论的人。我现在意识到我是冲动地发帖,并没有坚持提供“最小、完整和可验证”的问题。
-
我知道这个错误已经在 SO ... 上遇到过好几次了,但显然不是一个带有移位寄存器的错误。扫描 20 条左右的内容表明,如果语句部分像您的那样,它们主要是由于错误的位置而发生的。
-
我明白了。如果我多加注意,我可能可以从其他示例中自己解决这个问题。无论如何,我希望这篇文章对其他人有所帮助!