VHDL 代码错误:“错误 (10818):无法在 <location> 推断 <name> 的寄存器,因为它没有在时钟沿之外保持其值”

Posted

技术标签:

【中文标题】VHDL 代码错误:“错误 (10818):无法在 <location> 推断 <name> 的寄存器,因为它没有在时钟沿之外保持其值”【英文标题】:VHDL Code Error: "Error (10818): Can't infer register for <name> at <location> because it does not hold its value outside the clock edge" 【发布时间】:2017-10-04 09:15:40 【问题描述】:

我知道这个错误在 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') 之后使用elseelsif。此外,使用rising_edge(clk) 而不是clk'EVENT AND clk = '1'。阅读HERE为什么。我不能给你详细的答案,因为你只提供了一部分代码,并没有解释它应该做什么。提供minimal reproducible example。 ELSIF (SHR_EN = '1') THEN 在复位和时钟边沿条件之外,它的形式无法被综合识别。如果已注册,则将其和以下分配移动到前一端内。从进程敏感度列表中删除 SHR_EN。 感谢所有评论的人。我现在意识到我是冲动地发帖,并没有坚持提供“最小、完整和可验证”的问题。 我知道这个错误已经在 SO ... 上遇到过好几次了,但显然不是一个带有移位寄存器的错误。扫描 20 条左右的内容表明,如果语句部分像您的那样,它们主要是由于错误的位置而发生的。 我明白了。如果我多加注意,我可能可以从其他示例中自己解决这个问题。无论如何,我希望这篇文章对其他人有所帮助! 【参考方案1】:

ELSIF (SHR_EN = '1') THEN 在复位和时钟边沿条件之外,它的形式不能被综合识别。

如果它已注册,则将其和以下分配移动到前面的末尾。从进程敏感度列表中删除 SHR_EN。

同样在 VHDL 中,名称不能以数字开头,5bit_PHreg_vhdl 作为实体名称无效。

修复这些并填写缺失的实体声明:

library ieee;
use ieee.std_logic_1164.all;

entity PH_reg_5_bit is
    port (
        reset:      in  std_logic;
        clk:        in  std_logic;
        LD_EN:      in  std_logic;
        SHR_EN:     in  std_logic;
        FA_in:      in  std_logic_vector (4 downto 0);
        c_in:       in  std_logic;
        c_out:      out std_logic;
        PH_reg_out: out std_logic_vector (4 downto 0)
    );
end entity;

ARCHITECTURE behavioral OF PH_reg_5_bit 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;
        -- 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);
                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;

    c_out <= count(0);  -- c_out not separately registered
    PH_reg_out <= count;
END behavioral;

并且您的代码分析成功。

实体名称很好地表明您尚未模拟您的设计。

注意条件的顺序意味着加载优先于移位。

我怀疑 c_out 不应该被注册,允许使用 c_in 和 c_out 将移位寄存器实例连接到更大的移位寄存器中。这意味着它的分配应该在包含时钟沿事件的 if 语句之外,它可以放在另一个输出引脚分配旁边。

【讨论】:

非常感谢您的回答。我已经修复了我的代码。 JSYK 这个名字只以数字开头,因为原来的名字是以我的真实名字开头的,为了匿名,我把它去掉了。我现在意识到我的个人资料实际上显示了我的名字,所以这是一个不合理的举动!

以上是关于VHDL 代码错误:“错误 (10818):无法在 <location> 推断 <name> 的寄存器,因为它没有在时钟沿之外保持其值”的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 ghdl 执行/运行任何 vhdl 代码

verilog比vhdl的优势是啥?

急急急!!!用vhdl语言写一个计数器程序 下面的错误不知道哪里错了求指教

VHDL:有错误编码的除法,但在 Quartus II 上编译时有错误,但在 Xilinx ISE 上没有

如何在 VHDL 中使用“函数”从同一计算中返回多个变量?

具有 Mux 8:3 的 VHDL 全加器