我是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;
答案 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;