FPGA可以解决哪些问题?

图片

FPGA 允许在单个芯片中实现大量数字逻辑,其运行速度相对较高,并且只需很少或不需要在 CPU 内核上运行的传统顺序程序即可完成其工作。

这种数字逻辑可以实现任何东西,从简单的UART到由数十个CPU内核组成的架构,每个CPU内核都运行自己的小程序,并在共享任务上相互通信。或者,它可以是几组不同的逻辑在处理完全独立的任务,这些任务彼此之间可以没有关系。

数字逻辑实现

基本上,FPGA 允许放置下图中所有这些较小的黑色芯片:

图片

只需 1 个芯片,就可以立即使用新设计以任何想要的方式重新连接所有这些芯片。诚然,设计过程是......比较困难!

FPGA 擅长同时执行多项任务,可以将该功能实现为单独的数字逻辑,从最简单的组合逻辑一直到复杂的 CPU 处理器。除了逻辑元件的数量和它们之间的互连之外,几乎没有什么限制。

高速率高带宽数据处理

一个典型的例子:

FPGA 的一个典型示例是与图像传感器的接口:

图片

看到顶部和底部有多达 32 个 LVDS 串行输出。

LVDS信号是串行数据的一对差分线(用于获得高速和抗噪性)。图像数据将从每个LVDS对中输出。

这种高速串行输出数据的原因是为了让整个图像尽快从传感器中取出,并进入后续处理阶段(可能在FPGA中)。完成此操作的速度越快,帧速率就越高。如果想要一个能够达到 120fps 帧速率的运动相机,那么就需要将整个帧数据输出 - 在以 18 位分辨率模式运行时,此传感器为单帧数据量为 12 MB - 每秒 120 帧,超过 2 GBytes/s 的数据量!

实现这一目标的一种方法是使用大量LVDS输出,并将每个输出分配给帧的特定部分。这基本上是“分而治之”。

图片

问题在于,接收数据后需要重组这些LVDS数据,组成一个图像传感器的一帧数据。唯一可行的方法是在硬件中实现,因为:(a)没有微控制器/处理器具有那么多串行LVDS,(b)即使有,处理负担也会很大,并且可能永远无法达到所需的帧速率。

这只是使用FPGA的一个“经典”示例,它将来自每个LVDS输入的所有数据重新组合到图像的单个相干帧中。然而,它并没有就此结束。后续的ISP处理等操作都可以在同一个FPGA中进行。

保证时间精确控制

FPGA的另一个重要用途:在需要“保证”响应的情况下,或者需要确定地满足“硬”时序约束。实时控制系统的挑战之一是保证实际上能够满足这些时间限制。

在大多数通过微处理器/微控制器上的顺序编程实现的非平凡的控制系统中,有时主要“应用程序”会被中断,要么是切换到其他辅助任务,要么是处理 I/O 中断,尤其是需要大量计算资源且自身具有时序限制的现代通信协议。由于所有这些其他任务和职责都在争夺 CPU 时间,嵌入式系统开发人员已经提出了几种技术来应对这些挑战,但是顺序编程系统可以实现的功能是有限的。

FPGA 是专用电路、状态机以及控制和数据流“编程”的绝佳解决方案,精度低至纳秒级,几乎没有系统“错过”事件或不符合设计时序约束的风险。

一个常见示例是通过多相电机或桥式整流器进行相位控制或PWM控制,或使用H桥晶体管驱动器配置时进行的。

图片

在这些场景中,不仅可以以数十kHz甚至高达MHz的速度开关电源,而且还可能根据其他控制信号调制PWM - 可能是一组3个正弦波,用于三相对准,在这种情况下,需要相对PWM时序的精细分辨率。

在FPGA中实现这种控制可以满足非常精细的时序约束。

其他

FPGA 还有无数其他用途。

就在我常用的一种工具-Saleae逻辑分析仪:

图片

Xilinx Spartan 6 FPGA 执行所有高速工作,捕获其数字输入的时间序列状态,然后通过 USB 将其发送到PC。通过在 PC 上的分析来查找自己的数字电路设计中的错误。

数据中心:

在过去的几年里,微软、亚马逊和谷歌在云服务器基础设施中使用FPGA引起了很多关注,其中每个服务器都有一个FPGA,允许一些传统上通过线性编程完成的计算任务,在专用的定制FPGA数字逻辑中完成。

这使得服务器可以相对快速且轻松地重新配置,以便针对在其上运行的特定应用程序进行优化。这些应用程序可以是加密计算,或是OpenCV视觉算法,或是AI/ML推理,或是复杂的网络数据包过滤,或者其他我们不知道的操作!

图片

IC设计:

最后,FPGA 通常被用作原型设计的一种方式,该设计最终将被“锁定”到自己的IC芯片设计中。

图片

还有其他应用,欢迎大家留言补充~