FPGA设计可以是大部分(或完全)异步吗?


39

我们在大学里就读了很短的FPGA / Verilog课程(5年前),并且我们到处都使用时钟。

我现在又开始以FPGA为业余爱好,我不禁对这些时钟感到好奇。它们是绝对必需的,还是基于FPGA的设计可以完全异步?是否可以构建一堆复杂的逻辑,并尽可能快地通过它产生一些波动?

我意识到这有很多陷阱,就像知道何时信号在电路的所有部分传播并且输出稳定一样。那不是重点。我并不是要真正构建一个完全异步的设计,而只是为了提高我对功能的理解。

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


3
我知道剑桥大学的Simon Moore对异步设计进行了大量研究,包括制造测试芯片。它需要一套全新的设计工具,并且具有奇怪的副作用:例如,执行速度与温度成反比。
pjc50 2010年

Answers:


27

一个简单的答案是:是的。更长的答案是:这不值得您花费时间。

FPGA本身可以运行完全异步的设计,这没有问题。您得到的结果就是问题,因为通过任何FPGA进行时序不是很可预测的。更大的问题是,在不同的位置和路线会话之间,您的时间安排和最终设计几乎肯定会有所不同。您可以对单个异步路径设置约束,以确保它们不会花费太长时间,但是我不太确定可以指定最小延迟。

最后,这意味着您的设计将是不可预测的,并且即使进行微小的设计更改也可能完全可变。每次更改任何内容时,您都必须仔细阅读整个时序报告,以确保它仍然可以工作。另一方面,如果设计是同步的,则只需在布局和布线的末尾查找通过或失败的情况(假设您的约束设置正确,那么就不会花费很长时间)。

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

希望这可以清除它。


3
我必须将某些设备用于异步FPGA设计。他们很难一起工作。请至少使用时间限制
Tim Williscroft 2010年

1
确实可以通过FPGA实现异步设计,但是大多数FPGA都是为支持特定的同步设计而构建的。它们具有大量资源(PLL,时钟分配电路和大量的触发器),这些资源将在异步设计中浪费掉。
德米特里·格里戈里耶夫

2
这个答案没有提供特别好的建议。您可以创建一个无时钟的FPGA,它实际上简化了布局和布线,消除了有关时序要求的大量问题,并且由于细粒度的流水线可以具有相当高的吞吐量。当您尝试将时钟电路映射到无时钟FPGA时,真正的问题就来了,因为它们具有非常不同的时序特性。可以做到,只需要更多的前端处理就可以完成转换。 vlsi.cornell.edu/~rajit/ps/rc_overview.pdf
Ned

20

“一个人能否构建出一堆复杂的逻辑,并尽其所能地使事物产生波动?” 是。整个CPU都是完全异步的,其中至少有一个是世界上最快的CPU。 http://en.wikipedia.org/wiki/Asynchronous_circuit#Asynchronous_CPU

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

对我而言,这就像建议所有桥梁都由木头制成,因为拥有木工工具的人数要多于钢木工具。

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


我对现代在方形网格上布线PCB的趋势有完全相同的看法,尽管迁移带来的好处远没有那么明显。
罗曼·斯塔科夫

@romkyns-这更多是因为编写使用非直线网格的PCB软件很困难
康纳·沃尔夫,

1
@supercat:我怀疑您是在暗示四阶段逻辑。这是似乎已被忘记的多相时钟信号之一。
davidcary 2011年

1
@davidcary:除了一根导线上的两个“相”以外,其他种类-一相由上升沿控制,一相由下降沿控制。基本上,我将锁存时钟分为四类:干净上升,干净下降,迟到上升,迟到下降。由(L / CB)时钟锁存的上升沿或下降沿可以从任何上升沿或下降沿获取数据。L / CB的上升沿可以在任何下降沿从L / CB干净的上升沿获取数据。L / CB的下降沿可能会从L / CB干净下降或任何上升中获取数据。
超级猫

1
@davidcary:假设任何锁存器的最快传播时间超过最长的保持时间,并且前提是从时钟边沿通过时钟门控逻辑和该边沿触发的“晚期”锁存器到由锁存器触发的任何锁存器的最长信号路径跟随边沿,不超过时钟边沿之间的最短时间,我认为这样的设计应该是完全可靠的,并且在传播延迟的任何组合下都不会产生内部产生的亚稳定性。
超级猫

5

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

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

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


4

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


4

是的你可以。您可以完全忽略触发器,并完全由LUT构建。和/或您可以将大多数Xilinx FPGA的状态元素用作(电平触发)锁存器,而不是(沿边沿触发)触发器。


3
这样做的危险是,除非限制逻辑编译器,否则它可能会产生某些门的传播时间为负的逻辑。例如,如果有人指定X=(someComplexFormula)Y=X & D,并且如果编译器用该公式替换X并确定X & D等于A & D,则编译器可能会根据A和D而不是按X替换计算Y,从而允许计算Y这样的替换对于组合逻辑是有效的,但对异步顺序逻辑造成了严重破坏。
2015年

@supercat-我从未使用过Xilinx的工具,但是当我使用Altera FPGA时,您始终可以选择将任何关键路径指定为连接的门模块,而不是RTL,这时可以进行任何此类优化禁用的。
Jules

@Jules:我所有的可编程逻辑设计都使用了Abel,这是一种有点愚蠢的语言,但是可以用某些CPLD可以实现的方式指定事物,但是这可能给VHDL或Verilog综合工具带来困难。例如,在我的一个项目中,我利用Xilinx部件具有时钟,异步设置和异步复位这一事实来实现可异步加载的移位寄存器。如果我需要在从未使用过Verilog或VHDL的FPGA中进行此类操作,我应该如何学习呢?顺便说一句,如果有记忆的话,我用T触发器做移位器,并且...
supercat

...这样的时序使得异步写入只能在T输入为低电平的时候发生,假设如果在写脉冲的开始附近出现一个nop时钟,那么异步写入将远远超出它为了确保稳定的值,并且如果nop-clock发生在末尾附近,那么它将只是锁存一个仍然稳定的值。我不确定如何在VHDL或Verilog中有效地处理这种情况。
超级猫

@supercat-遇到类似的问题,请看《 Cyclone IV器件手册》,我发现解决同一问题的最佳方法是使用“ LAB范围内的同步负载”选项(“ LAB”是一组16个逻辑元素,因此,如果此类寄存器的大小不等于16位的倍数,则会浪费一些位,但这似乎是最有用的选择)。我现在有两个选择:我可以编写功能性Verilog,它将要求综合工具选择一种实现所需寄存器的方式(通常这是最佳选择),或者,如果我的时间严格的话……
Jules

3

正如@Andrey指出的那样,这不值得您花费时间。具体来说,这些工具不会执行此操作,因此您将完全依靠自己。另外,由于它们具有内置寄存器,因此不使用它们将不会节省任何内容。


3

确实有三种类型的设计。

  1. 组合式。没有时钟,也没有反馈路径,并且系统没有“内存”。当一个或多个输入发生更改时,更改会通过逻辑波动。一段时间后,输出稳定到新状态,直到输入再次更改为止。
  2. 同步顺序。系统是由寄存器和组合逻辑块组成的,这些寄存器由少量(通常为1个)时钟提供时钟。如果有多个时钟,则可能需要对从一个时钟域传递到另一时钟域的信号进行特殊处理。
  3. 异步顺序。有一些反馈路径,锁存器,寄存器或其他元素可以为过去的事件提供设计存储,而不能通过简单的分析时钟线进行计时。

通常,在综合/优化组合逻辑时,工具会假设所有重要的事情是最终结果是什么,以及最终取决于该结果的时间。

您可以构建纯粹组合的设计,它将获得正确的结果。输出可能会以任何顺序更改,并且在达到最终值之前可能会更改数次。这样的设计非常浪费逻辑资源。大多数逻辑元素将大部分时间闲置,而在顺序系统中,您可以重用这些元素来处理多个数据项。

在顺序同步系统中,最重要的是,当组合块的输出时钟输入到下一个触发器时,它们已经稳定到正确的状态。它们的顺序变化或沿途是否出现故障都无关紧要。再次,这些工具可以轻松地将其转变为逻辑,只要时钟足够慢即可给出正确的答案(它们可以告诉您您要使用的时钟是否足够慢)。

在异步顺序系统中,这些假设超出了范围。毛刺可能很重要,输出更改的顺序可能很重要。工具和FPGA本身都是为同步设计而设计的。关于在标准FPGA或特定设计的系统上实现异步系统的可能性,已经进行了很多讨论(如果您想了解更多,请使用Google异步FPGA设计),但仍处于主流公认的设计实践之外


2

是。如果您没有进程类型构造,则它不应执行诸如推断寄存器之类的操作。诸如板载内存之类的东西会需要时钟,尽管如果您确实需要,则可能会异步生成这些时钟。


1
您的意思是说一个答案吗?
凯文·维米尔

1

FWIW我想我应该补充一点,异步逻辑解决方案的一个显而易见的目标应该是降低功耗。

这些全局时钟/ PLL /缓冲器会消耗大量焦耳。

当FPGA解决方案进入电池供电的领域(例如Lattice Icestick)时,这方面将引起更多关注。


这是一个很好的观点,尽管值得考虑的是,设计不良的组合电路在某些情况下会执行与时序电路相同的操作,可能会在计算部分结果并更新最终输出以解决这些问题时进行大量的瞬态转换,在CMOS电路中(与大多数FPGA一样),功耗大致与转换数量成正比。时钟可能会导致不必要的过渡,但是您也可以通过禁用电路中当前不需要的时钟来降低功耗。
Jules
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.