如何解决这是编码 VHDL 异步复位的有效方法吗?
我选择了一些 VHDL 代码来维护,这些代码以我不熟悉的方式编写。我不确定它是否有效,而且我的模拟器 (Modelsim) 发出了我意想不到的警告。模式示例:
process(clk,reset_n)
begin
if reset_n = '0' then
counter <= (others=>'0');
end if;
if rising_edge(clk) then
case state is
when IDLE =>
if signal_a = signal_b then
state <= DATA;
end if;
when DATA =>
state <= IDLE;
when others =>
end case;
if state = DATA then
counter <= counter + 1;
else
counter <= (others => '0');
end if;
end if;
end process;
Modelsim 警告 state
、signal_a
和 signal_b
“在进程中被读取,但不在敏感列表中”。我不希望这样,因为它们在一个时钟块中,并且进程对时钟很敏感。
这是异步重置的有效编码风格吗?我希望看到 elsif rising_edge(clk)
,但我明白这会在混合其他非复位信号 (state
) 时造成问题。
解决方法
这种模式可能不会像您预期的那样表现,也可能不会综合(如果确实如此,它将与代码不匹配)。
此代码具有覆盖重置的时钟。如果重置被断言 ('0'),那么计数器将被重置,但如果 clk
正在运行,它将运行,好像 reset_n
是 '1'
。这是因为进程仅由敏感度列表中的信号上的 'event'
触发,因此重置只会在 reset_n
更改为“0”时发生。这在 VHDL 中通常无关紧要,因为复位分支的优先级高于时钟。因此,如果它被计时,则采用复位分支。但在这里,因为重置的优先级较低,所以就好像 reset_n
是一个负沿时钟。
在实际硬件上,这是不同的。敏感度列表通常会被忽略,硬件是根据过程中的代码构建的。我预计这将无法构建,因为它会抱怨没有与模板匹配的逻辑,或者不允许双边缘触发器。
要解决此问题,请按照您的建议将时钟分支设置为 elsif
,并且您还需要将 state
添加到重置中以避免在 state
上意外启用时钟,或者将复位移到进程的底部,在那里它将正确覆盖时钟分配,并允许您在同一进程中混合使用复位和非复位寄存器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。