FPGA 设计能否大部分(或完全)异步?

电器工程 FPGA 验证日志
2021-12-31 05:39:53

我们在大学(5 年前)有一个非常短的 FPGA/Verilog 课程,而且我们总是到处使用时钟。

我现在又开始将 FPGA 作为一种爱好,我不禁想知道那些时钟。它们是绝对必需的,还是基于 FPGA 的设计可以完全异步?一个人可以构建一堆复杂的逻辑并尽可能快地让东西通过它吗?

我意识到这有很多陷阱,比如知道信号何时传播通过电路的所有部分并且输出已经稳定。那是无关紧要的。我并不是要真正构建一个完全异步的设计,而只是为了提高我对功能的理解。

在我的初学者眼中,绝对需要时钟的唯一构造似乎是reg,而我的理解是,典型的 FPGA(例如 Cyclone II)将其触发器预先连接到特定的时钟信号。它是否正确?是否还有其他类似的隐式时钟,它们通常可以由设计手动驱动吗?

4个回答

一个简短的回答是:是的;更长的答案是:这不值得你花时间。

FPGA 本身可以运行完全异步的设计没有问题。你得到的结果就是问题,因为通过任何 FPGA 的时序都不是很可预测的。更大的问题是您的时序和最终设计几乎肯定会在不同的布局和布线会话之间发生变化。您可以对各个异步路径施加约束,确保它们不会花费太长时间,但我不太确定您是否可以指定最小延迟。

最后,这意味着您的设计将是不可预测的,并且即使是轻微的设计更改也可能完全可变。每次更改任何内容时,您都必须查看整个计时报告,以确保它仍然有效。另一方面,如果设计是同步的,您只需在布局和布线结束时寻找通过或失败(假设您的约束设置正确,这根本不需要很长时间)。

在实践中,人们的目标是完全同步的设计,但如果您需要简单地缓冲或反转信号,则只要您适当地约束它,您就不需要通过触发器。

希望这能澄清一点。

“一个人可以构建一堆复杂的逻辑,并尽可能快地让东西通过它吗?” 是的。已经构建了完全异步的整个 CPU——其中至少有一个是世界上最快的 CPU。 http://en.wikipedia.org/wiki/Asynchronous_circuit#Asynchronous_CPU

令我恼火的是,人们拒绝异步设计技术,尽管它们在理论上比同步设计技术有几个优势,仅仅是因为(正如这里的其他人所说)异步设计没有得到可用工具的很好支持。

对我来说,这就像建议所有的桥梁都用木头建造,因为更多的人拥有木工工具而不是钢工工具。

幸运的是,通过使用全局异步本地同步 (GALS)设计,可以在仍然主要使用同步设计技术的同时获得异步设计的一些优点。

尚未提及的一个因素是亚稳态。如果锁存电路受到一系列输入/转换的影响,结果状态将取决于传播延迟或其他不可预测的因素,则无法保证结果状态将是干净的“高”或“低”。例如,考虑一个边沿触发的触发器,它当前正在输出“低”,并且其输入几乎在时钟边沿到达的同时从低电平变为高电平。如果时钟沿在输入更改之前发生足够长的时间,则输出将简单地保持低电平,直到下一个时钟沿。如果在输入变化后时钟沿发生足够长的时间,输出将快速从低电平切换到高电平并保持在那里直到下一个时钟沿。如果这两个条件都不适用,. 它可能会保持低电平,或者快速切换一次并保持高电平,但它可能会保持低电平一段时间然后切换,或者切换一段时间然后再切换回来,或者来回切换几次,等等。

如果设计是完全同步的,并且所有输入都是双同步的,那么定时脉冲不太可能会撞击同步器的第一个锁存器,从而导致它在最佳时间切换以混淆第二个锁存器闩锁。一般来说,将此类事情视为“不会发生”是安全的。然而,在异步设计中,对这些事情进行推理通常要困难得多。如果锁存电路上的时序约束(不仅仅是触发器,还有任何可用作锁存器的逻辑组合)被违反,则在下一次存在强制锁存器的有效输入条件之前,不知道输出将做什么到已知状态。延迟输出完全有可能导致下游输入的时序约束被违反,导致意外情况,

对异步电路建模的最安全方法是让几乎每个输出电路在“0”和“1”之间切换时产生一段时间的“X”输出。不幸的是,这种方法经常导致几乎所有节点都显示“X”,即使在实际上几乎肯定会导致稳定行为的情况下也是如此。如果一个系统可以在模拟为所有输出在输入更改后立即变为“X”时工作,并保持“X”直到输入稳定,这是一个很好的信号电路可以工作,但是让异步电路在这样的限制下工作往往很困难。

当然,如果你的设计要求足够慢,以至于很多内部延迟仍然比你关心的时间长几个数量级,那么这不是问题,你可以查看时序报告来关注这一点,但是在没有内部状态信息的情况下,您可以有用地做的事情是有限度的。如果您只是想制作一个 100 输入多路复用器,那么请记住,每个输入都会有不同的传播延迟。实际上,您可能会通过大量不可预测的延迟振荡反馈回路获得一些有趣且混乱的效果——也许基于完全异步 FPGA 的合成器可能是下一个“模拟”......