首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rising_edge函数避免“锁存警告”?

rising_edge函数避免“锁存警告”?
EN

Stack Overflow用户
提问于 2014-03-31 07:53:28
回答 3查看 526关注 0票数 0

有时我在Xilinx中收到警告:

锁存可以从不完整的大小写或if语句中生成。我们不建议在FPGA/CPLD设计中使用锁存器,因为它们可能导致计时问题。

但是,如果我使用rising_edge()函数,那么即使我有一个不完整的情况,也没有任何警告,例如:

代码语言:javascript
复制
process (clk, rst)
begin   
    if (rst = '1') then
        test <= '0';
    elsif (rising_edge(clk)) then
        test <= '1';
    end if;
end process;

那么,为什么FPGA中的锁存被认为是一种丑陋的设计呢?为什么使用rising_edge()函数可以避免这些警告呢?(实际上,我认为使用rising_edge()函数也会引入锁存器)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-31 10:44:14

使用rising_edge(clk)会产生一个边缘敏感的顺序设计元素,它是触发器,而不是锁存器。如果状态更新的条件是级别敏感的,如en = '1',则会创建锁存器。

FPGA是为实现基于上升边缘敏感触发器的同步设计而优化的,一些FPGA技术,如Xilinx,在使用锁存时限制了资源的利用率。另外,对于基于锁存的设计,通常更难确保正确的定时约束。

因此,如果出于某种特定的原因,只使用锁存器,而且在大多数设计中,即使是大的,也不应该有闩锁。

票数 2
EN

Stack Overflow用户

发布于 2014-03-31 10:44:48

在任何一种情况下,(锁存或寄存器;不包含或与rising_edge(clk))不完整的IF或大小写表示需要存储,以保存信号的当前值。

因此,rising_edge(clk)函数并没有真正改变电路的逻辑,它只是清理了它的时间。具体来说,它允许合成工具在任何地方放置一个时钟寄存器,否则需要一个锁存器。

这通常被认为是一件好事,因为时钟寄存器(触发器)在FPGA和大多数其他技术中得到了很好的支持。它们是具有可预测时间的积木,对于快速可靠的设计是必不可少的。

锁存器(“透明锁存器”)的时间不太可靠,使得时序分析更加困难,因此FPGA通常不能很好地支持它们,因此不鼓励使用它们(尽管ASIC设计者可以非常小心地成功地使用它们)。

因此,rising_edge()并不完全“避免警告”--它安装了一个安全寄存器,而不是一个可能不可靠的锁存器,从而避免了潜在的计时问题。

票数 4
EN

Stack Overflow用户

发布于 2014-03-31 12:26:36

既然你的问题已经被回答了,我只想补充一些关于闩锁设计的注意事项。

闩锁并不是“丑陋的设计”,尽管如果你在基本的网站上阅读,似乎每个人都认为相反。锁存设计中最大的问题之一是它们不能在FPGA上实现,因为FPGA是用来处理触发器的。FPGA通常用于测试代码,大多数设计人员不喜欢编写两次代码(一个用于FPGA,另一个用于ASIC)。此外,锁存设计更复杂,因为您将需要至少两个时钟阶段(主从),但您也可以有更多的阶段。另一方面,一个好的锁存设计可以比FF设计更好,特别是对于低功耗的设计:不需要固定保持时间,过渡时间有较少的限制等。

无论如何,有一件事应该是明确的:如果你不是一个对低功耗技术感兴趣的ASIC设计师,那么你只需要用拖鞋就能过上幸福的生活。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22756257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档