错误(10818):无法在clk200Hz.vhd(29)处推断出“E”的寄存器,因为它在时钟边缘之外没有保持其值

时间:2013-12-07 11:55:47

标签: compiler-errors vhdl divider

我是VHDL初学者。我想做一个除以clk in 2 whitch的分频器作为输出F和F除以2应该是E.它总是当我想编译代码时告诉我这个错误:错误(10818):无法推断寄存器clk200Hz.vhd(29)中的“E”因为它没有在时钟边缘之外保持其值

感谢您的帮助

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;

3 个答案:

答案 0 :(得分:1)

您正试图在时钟的上升沿时暂时为E分配一个新值(暂时忽略重置)并且您没有' t指定 时钟上升沿时E会发生什么。当没有置位复位时,看起来E应该尽可能快地来回切换,除非在时钟边缘可能发生其他事情。我无法想象你真正想要什么样的行为,编译器也不能。

如果您需要边沿触发的触发器,则对该信号的分配必须位于由rising_edge()falling_edge()触发的条件语句中。这种条件的else子句对于您想要合成的代码没有多大意义。

你需要做的事情要复杂得多。我建议您运行模拟并观察counter中的各个位。

答案 1 :(得分:1)

实际上编译器消息非常准确:您的赋值E <= not E超出了if子句,您可以检查时钟的上升沿。尝试将该任务移动一行,并删除空的else子句。

答案 2 :(得分:1)

Ricks答案中描述了错误原因。

要减少设计,您可以跳过counter生成F,然后使用 E要保留E除以2所需的额外状态.Joe Hass 在他的回答的最后评论中暗示了这一点:

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;
相关问题