错误(10818):无法推断注册“E”在clk200Hz.vhd(29),因为它没有时钟边缘外保值(

2019-10-19 02:01发布

林初学用VHDL。 我想打一个分频器,除以2 CLK在whitch是作为输出F和F除以2应该是E.它总是当我想编译代码告诉我这个错误:错误(10818):无法推断注册“E”在clk200Hz.vhd(29),因为它不保存其时钟边缘外值

感谢帮助

frequency_divider: process (reset, clk_in) begin
        if (reset = '1') then
            F <= '0';
                E <= '0';
            counter <= 0;
        else
                if rising_edge(clk_in) then
                    if (counter = 2) then
                        F <= NOT(F);
                        counter <= 0;
                    else
                        counter <= counter + 1;
                    end if;
                else
                E<=NOT(E);
                end if;
            end if;
    end process;

Answer 1:

您试图分配一个新值E在所有的时间瞬间当在时钟的上升沿不是 (暂时忽略复位),你没有指定会发生什么E时, 一个上升沿上时钟。 当复位不被肯定,它看起来像E应该来回切换,尽可能快的,也许除了别的事情应该发生在一个时钟边沿。 我无法想象你真的想要什么样的行为和既不能编译器。

如果你想要一个边沿触发的触发器,分配到该信号必须是由触发的条件语句中rising_edge()falling_edge()else条款这样的条件不会使你的代码打算合成多大意义。

你快把这复杂得多,然后它需要。 我建议你运行仿真和观察各个位counter



Answer 2:

其实编译器的消息是非常准确的:你的任务E <= not E是外面if在您检查时钟的上升沿条款。 尝试移动该分配上一行,并摆脱空的else条款。



Answer 3:

原因错误是在里克斯答案形容。

为了减少您的设计,你可以跳过counter产生F ,并简单地使用E来保存的分裂所需的附加状态E由2乔海思暗示这在他的回答的最后一个注释:

frequency_divider : process (reset, clk_in)
begin
  if (reset = '1') then
    F <= '0';
    E <= '0';
  elsif rising_edge(clk_in) then
    E <= not E;
    F <= (not F) when (E = '1') else F;
  end if;
end process;


文章来源: Error (10818): Can't infer register for “E” at clk200Hz.vhd(29) because it does not hold its value outside the clock edge