Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VHDL代码错误:“错误(10818):无法推断处的寄存器,因为它的值不在时钟边缘之外”_Vhdl_Digital_Quartus - Fatal编程技术网

VHDL代码错误:“错误(10818):无法推断处的寄存器,因为它的值不在时钟边缘之外”

VHDL代码错误:“错误(10818):无法推断处的寄存器,因为它的值不在时钟边缘之外”,vhdl,digital,quartus,Vhdl,Digital,Quartus,我知道这个错误已经遇到过好几次了,但是作为一个初学者,我仍然无法在我自己的代码中看到如何解决这个错误。错误和代码都打印在下面,感谢所有人的输入 错误10818:无法推断5bit_PHreg_vhdl.vhd21处计数[0]的寄存器,因为它的值不在时钟边缘之外 “计数”的每一位都会重复该错误,并引用代码中注明的行 ARCHITECTURE behavioral OF 5bit_PHreg_vhdl IS SIGNAL count : STD_LOGIC_VECTOR(4 DOWNTO 0

我知道这个错误已经遇到过好几次了,但是作为一个初学者,我仍然无法在我自己的代码中看到如何解决这个错误。错误和代码都打印在下面,感谢所有人的输入

错误10818:无法推断5bit_PHreg_vhdl.vhd21处计数[0]的寄存器,因为它的值不在时钟边缘之外

“计数”的每一位都会重复该错误,并引用代码中注明的行

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;
ELSIF SHR_EN='1'则在重置和时钟边缘条件之外,其形式不可识别用于合成

如果已注册,则将其和以下赋值移到前一个端点内。从过程敏感性列表中删除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语句之外,它可以转到另一个输出引脚赋值的旁边。

ELSIF SHR_EN='1'则在重置和时钟边缘条件之外,它的形式无法识别用于合成

如果已注册,则将其和以下赋值移到前一个端点内。从过程敏感性列表中删除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语句之外,它可以转到另一个输出引脚赋值的旁边。

在if clk'event和clk='1'之后不要使用else或elsif。此外,使用rising_EdgeLk代替clk'EVENT和clk='1'。读一读为什么。我不能给你详细的答案,因为你只提供了部分代码,没有解释它应该做什么。如果SHR_EN='1'则超出重置和时钟边缘条件,则其形式无法识别用于合成。如果已注册,则将其和以下赋值移到前一个端点内。从过程敏感度列表中删除SHR_EN。感谢所有发表评论的人。我现在意识到我发帖的冲动,并没有坚持提供一个最小的,完整的,可验证的问题。我知道这个错误已经遇到好几次了,所以。。。几十个,但显然不是一个带移位寄存器的。通过20个左右的扫描显示,如果语句部分像你的一样,那么它们主要是由于放错了位置造成的。我明白了。如果我再小心一点,我也许可以从其他例子中自己解决这个问题。不管怎样,我希望这篇文章能帮助别人!在clk'EVENT和clk='1'之后不要使用else或elsif。此外,使用rising_EdgeLk代替clk'EVENT和clk='1'。读一读为什么。我不能给你详细的答案,因为你只提供了部分代码,没有解释它应该做什么。如果SHR_EN='1'则超出重置和时钟边缘条件,则其形式无法识别用于合成。如果已注册,则将其和以下赋值移到前一个端点内。从过程敏感度列表中删除SHR_EN。感谢所有发表评论的人。我现在意识到我发帖的冲动,并没有坚持提供一个最小的,完整的,可验证的问题。我知道这个错误已经遇到好几次了,所以。。。几十个,但显然不是一个带移位寄存器的。通过20个左右的扫描显示,如果语句部分像你的一样,那么它们主要是由于放错了位置造成的。我明白了。如果我再小心一点,我也许可以从其他例子中自己解决这个问题。不管怎样,我希望这篇文章能帮助别人!非常感谢您的回答。我已经修好了密码。这个名字只以一个数字开头,因为原来的名字是以我的真实名字开头的,为了匿名,我把它删除了。我现在意识到,我的个人资料实际上显示了我的名字,所以这是一个不合理的举动!非常感谢您的回答。我已经修好了密码。这个名字只以一个数字开头,因为原来的名字是以我的真实名字开头的,为了匿名,我把它删除了。我意识到 现在我的个人资料显示了我的名字,这是一个不合理的举动!