Compiler errors 错误(10818):Can';t推断“的寄存器”;";在clk200Hz.vhd(29),因为它的值不在时钟边缘之外

Compiler errors 错误(10818):Can';t推断“的寄存器”;";在clk200Hz.vhd(29),因为它的值不在时钟边缘之外,compiler-errors,vhdl,divider,Compiler Errors,Vhdl,Divider,我是VHDL初学者。我想做一个除法器,将clk除以2,这是作为输出F,F除以2应该是E。当我想编译代码时,它总是告诉我这个错误:错误(10818):无法推断clk200Hz处“E”的寄存器。vhd(29),因为它的值不在时钟边缘之外 谢谢你的帮助 frequency_divider: process (reset, clk_in) begin if (reset = '1') then F <= '0'; E <

我是VHDL初学者。我想做一个除法器,将clk除以2,这是作为输出F,F除以2应该是E。当我想编译代码时,它总是告诉我这个错误:错误(10818):无法推断clk200Hz处“E”的寄存器。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;
分频器:过程(复位、时钟输入)开始
如果(重置='1'),则

F当时钟上有上升沿(暂时忽略重置)且未指定当时钟上有上升沿时,
E
将发生什么情况时,您正试图在所有时刻为
E
分配一个新值。当重置未被断言时,看起来
E
应该尽可能快地来回切换,除非时钟边缘可能发生其他情况。我无法想象你真正想要什么样的行为,编译器也无法想象

如果需要边缘触发触发器,则对该信号的赋值必须在由
上升沿()或
下降沿()触发的条件语句中。这样一个条件的
else
子句对于您打算合成的代码没有多大意义


你让事情变得更复杂了。我建议您运行模拟并观察
计数器中的各个位实际上编译器消息非常准确:您的赋值
E错误原因在Ricks的回答中描述

为了减少您的设计,您可以跳过
计数器
来生成
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;
分频器:过程(复位,时钟输入)
开始
如果(重置='1'),则
F