近些年来,全可编程片上系统(SOPC)概念在 FPGA 厂商的推动之下,日益普及。所谓“全可编程”,指的是在 FPGA 硬件逻辑可编程的基础上,通过在 FPGA 芯片中添加处理器核实现软件层面的可编程特性。软硬兼备,是为全可编程也。
软硬可编程性
硬件可编程是 FPGA 芯片安身立命之所在,借助 Verilog 等硬件编程语言编程,通过改变逻辑单元之间的连线,实现不同的逻辑门排布,适用于不同输入输出场景下的应用。
在与 CPU,GPU,ASIC,ASSP 等兄弟器件的比拼中,如果性能败下阵来,FPGA:我硬件可编程。成本败下阵来,FPGA:我硬件可编程。开发周期难度败下阵来,FPGA:我硬件可编程。功耗败下阵来,众人:行行行,你硬件可编程。
软件可编程,乍一听可能有些突兀,Ha,软件不编程,难道等快递小哥送上门?
程序员使用 C 等高级语言编写源代码,通过编译,链接等步骤,生成对应平台可运行的二进制文件,如果没有 BUG(那是不可能的)的话,一个软件就编写完成了。
那如果不幸发现了 BUG (那是常有的),怎么办,修改源代码,再来一次。编译的过程可以是非常快的,最复杂的代码模块,编译时间也可以用十根手指头,一秒一秒数完(模块构成的系统总的编译时间肯定更长),试错的时间成本很低,像笔者这么菜的话,完全可以面向 BUG 编程。。。额,面向调试编程。我都是瞎写的
硬件可编程性,看上去很美,但真没那么快
FPGA 的硬件可编程可以开发适用于某个场景的应用,高效且能效比高,但整个开发过程就要长的多啊,尤其是试错时间成本根本遭不住。Verilog 代码经过综合,布局布线等过程,首先被转换成逻辑门描述(作为一个逻辑门,你要知道你前后左右都是谁,是跟TA 牵着手,还是勾着背),再映射到器件的具体位置上。(与门小 A,你的座位在教室的第一排)
逻辑门排队大概和小朋友排队差不多复杂吧(/滑稽)
因为综合实现工具要在多种可能中寻找转换和布局的较优解,运算的时间很长,算力也会有要求,特别是在那些资源丰富的高端器件上,因为资源丰富就意味更复杂的模块,更多的布局可能性。另外小小的改动也可能导致一切被推倒重来。
一般会通过合理的模块划分,综合前大量充分的行为仿真,尽可能减少硬件可编程的时间成本。但不管怎么说,面向 BUG 编程是不可取的。(同学们,综合前要行为仿真啊,别直接上啊)
硬件需要软件,好比奥利奥需要夹心
合理地利用硬件可编程特性,相比软件实现,可以大幅提高效率与能效比,并在性能与开发周期之间相折中。但有些工作,软件天生要比硬件适合来做。比如,调试一个 IIC 模块,当你没有完全了解这个模块几十页的寄存器的时候,大量的试错调试是需要的。还有对于一些递归问题,比如涉及树这一数据结构的场景,使用软件编程可以通过函数的递归调用,简洁直观地解决问题。
FPGA 软件编程解决方案
那么以 Xilinx/Altera 为首厂商(vendor)是如何实现 FPGA 的软件可编程的呢?
简单,我们加个处理器核不就完了,这样软件不就能在 CPU 上跑了么。
这个办法看上去简单粗暴哈~,
CPU,给我加上,我全都要。
但其实问题并没有那么简单,涉及到与逻辑资源的通信耦合,开发工具,性能等等一系列的问题。首先,加上的处理器核实际上可软可硬,分为软核以及硬核两种方案。
过去软着来
软核是指使用 FPGA 的逻辑资源实现一个处理器。处理器从电路的角度来看,实际上是一个超复杂的数字电路,基本上由逻辑门与触发器构成。这两者也是 FPGA 可编程逻辑的主要组成部分。所以,完全可以使用逻辑资源“搭出”一个处理器。
软核可以理解成一个 IP,通过总线与其他逻辑资源整合,和连接一个 FIFO 或者 BRAM 这样的 IP 没有实质上的差别。一般最广为使用的软核是 X/A 两厂自己的 MicroBlaze 系列和 NIOS 系列。也可以选择最近大火的 RISC-V 开源实现,实际上现在 ARM 也在其 DesignStart 计划中提供 Cortex-M 系列处理器软核,笔者最近也在参加一个使用 ARM 软核的比赛。在过去软核是厂商软件可编程的主推方案。
软核作为一个复杂的 IP,一个 ARM M3 处理器子系统需要一片中端 FPGA 四分之一的逻辑资源,受限于 FPGA 的布局布线特性,性能远远低于专用的处理器。一般软核的时钟频率在100Mhz 以下。
现在流行硬着来
所谓硬着来,就是在 FPGA 器件中直接加入一个处理器系统的硬件电路。这个部分是不可硬件编程的固化电路,和 STM32 这样的专用处理器芯片性质相同,那么性能就摆脱了可编程逻辑布局布线特性的限制,和专用的处理器芯片的性能接近。实际上,在 FPGA 器件的可编程逻辑资源之外,不断塞进其他硬件电路模块是 FPGA 发展历史中的常规操作。
近年来,X/A 等厂商一方面追求更先进的半导体工艺制程,在塞入更多逻辑资源的同时,提升 FPGA 的运行频率;另一方面,加入了 DSP(用于更高速的计算),BRAM(用于更高速的存储),MCB(支持更高速的内存),高速收发器(支持更高速的外围总线),甚至硬件以太网 MAC,ADC(支持混合信号处理)等,Xilinx 在 18 年发布的 ACAP 中还加入了类似 GPU 的 AI 引擎。一切都是为了提高 FPGA 性能以及适应更多的应用场景。
那么为了获得更好的软件可编程特性,自然就要加入一个,甚至好几个处理器核了。处理器核核其外围模块的硬件电路构成了 PS(Processor System)与可编程逻辑 PL (Programmable Logic)相对应。
FPGA:遭不住,这玩意儿几片 FPGA 都放不下
结语
本文介绍了日趋流行的全可编程软硬可编程解决方案,简单介绍了两种嵌入式处理器核方案:软核与硬核的概念,在后续的文章中,将进一步介绍处理器核的产品系列,工具与开发流程,以及处理器核在 FPGA 系统中的应用,尤其是基于 FPGA 的通信和信号处理系统。