Compiler errors 错误(10818):Can';t推断“的寄存器”;";在clk200Hz.vhd(29),因为它的值不在时钟边缘之外
我是VHDL初学者。我想做一个除法器,将clk除以2,这是作为输出F,F除以2应该是E。当我想编译代码时,它总是告诉我这个错误:错误(10818):无法推断clk200Hz处“E”的寄存器。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 <
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