资讯详情

资讯详情

FPGA不是处理器:从底层结构到实战应用的深度解析

1. 从一个被问烂了的问题说起FPGA 到底算不算处理器每次线下交流或者群里聊天只要聊到 FPGA总有人抛出一个问题“FPGA 能不能当处理器用”这个问题看起来简单实际上背后牵扯的东西特别多。我见过太多初学者拿着一块开发板脑子里第一反应就是“我要在上面跑个 CPU”然后花了两周时间折腾 RISC-V 软核最后发现性能还不如一颗十块钱的单片机。也见过一些有经验的工程师在特定场景下用 FPGA 做状态机控制效率高得离谱一个时钟周期干完的事CPU 得跑几十条指令。所以这个标题“FPGA 不是处理器除非你想让它们当处理器”其实点出了一个非常核心的认知问题FPGA 的本质是可编程逻辑器件它的强项是并行、流水线和定制化数据通路而不是通用指令执行。你当然可以在上面搭处理器但那是你的选择不是它的天性。这篇文章我打算从几个层面把这件事讲透。先聊 FPGA 的底层结构为什么它天生就不是处理器再讲如果你想让它当处理器需要付出什么代价然后展开 FPGA 真正擅长的领域比如图像处理、高速接口、数字信号处理最后给一些入门和进阶的实操建议。不管你是刚接触 FPGA 的新手还是已经做过几个项目的老手应该都能从中找到一些有用的东西。提示本文涉及的开发工具以 Xilinx Vivado 和 Intel Quartus 为主其他厂商的流程类似思路通用。2. FPGA 的底层结构决定了它的“性格”2.1 LUT、CLB、DSP 到底是什么关系要理解 FPGA 为什么不是处理器得先从它的基本组成单元说起。FPGA 内部最核心的资源是LUTLook-Up Table查找表。一个 LUT 本质上就是一块极小的 SRAM比如 6 输入 LUT 就是 64 位存储空间你往里面写一个真值表它就能根据输入组合输出对应结果。这意味着 LUT 可以实现任意 6 输入以内的组合逻辑函数。多个 LUT 加上触发器Flip-Flop、进位链、多路选择器打包在一起就构成了CLBConfigurable Logic Block可配置逻辑块。CLB 是 FPGA 里最基本的逻辑单元不同厂商叫法不一样Xilinx 叫 CLBIntel 叫 LAB但本质差不多。一个 CLB 通常包含几个 slice每个 slice 里有若干 LUT 和 FF。那DSP呢DSP 切片是 FPGA 里专门用来做乘加运算的硬核资源。比如 Xilinx 7 系列的 DSP48E1可以在一个时钟周期内完成 25×18 的乘法加 48 位累加。这东西如果拿 LUT 去搭得消耗几百个 LUT 和大量布线资源速度和面积都吃亏。所以 DSP 切片的存在就是为了让 FPGA 在数字信号处理场景下能和专用芯片掰手腕。这三者的关系可以这样理解LUT 是砖头CLB 是预制板DSP 是钢筋混凝土柱子。你用砖头可以盖任何房子但盖高楼的时候柱子能帮你省很多事。2.2 为什么这种结构天生不是处理器处理器的工作方式是取指、译码、执行、写回一条指令接一条指令地串行执行。它的硬件结构围绕指令流设计有程序计数器、指令寄存器、算术逻辑单元、流水线控制等等。而 FPGA 的结构是空间并行的你写下的每一段逻辑在综合之后都会变成实实在在的电路同时存在于芯片上。举个例子你要做a b c d。在处理器上可能是三条加法指令依次执行。在 FPGA 上你可以用两个加法器并行算ab和cd然后再用一个加法器把结果加起来三个加法器同时工作一个时钟周期出结果。这就是本质区别处理器是时间换空间FPGA 是空间换时间。所以当你问“FPGA 能不能当处理器”的时候实际上是在问“我能不能用空间并行的结构去模拟时间串行的行为”。答案是能但效率取决于你的任务。如果是高度串行、分支密集的任务FPGA 模拟出来的处理器会又大又慢如果是数据流清晰、并行度高的任务FPGA 直接做数据通路会比处理器快几十倍。2.3 一个生活化类比流水线工厂 vs 万能工匠我经常用这样一个类比来解释处理器就像一个万能工匠什么活都能干但一次只能干一件干完一件再干下一件。FPGA 则像一条可定制的流水线你根据产品需求把流水线搭好原料从一头进去成品从另一头出来中间每个工位同时干活。万能工匠的好处是灵活今天做杯子明天做盘子换个模具就行。流水线的好处是效率一旦搭好单位时间产量远超工匠。但如果你非要用流水线去做“每次只做一个、而且每个都不一样”的活那还不如请个工匠。FPGA 不是处理器就像流水线不是工匠。你可以把流水线改造成工匠的工作台但那就浪费了流水线的优势。3. 如果你真想让 FPGA 当处理器需要付出什么3.1 软核处理器的几种主流方案市面上确实有不少 FPGA 软核处理器方案比较知名的有 Xilinx 的 MicroBlaze、Intel 的 Nios II、开源的 RISC-V 核如 Rocket、PicoRV32、VexRiscv 等。这些核都是用 HDL 代码写成的综合后映射到 FPGA 的 LUT 和 FF 上。以 MicroBlaze 为例一个最小配置大概消耗 1000 到 2000 个 LUT加上 Block RAM 和 DSP。如果跑在 100MHz 时钟下性能大概在 100 到 200 DMIPS 左右。这个性能什么概念差不多相当于一颗低端 ARM Cortex-M3 的水平。而一颗 Cortex-M3 芯片多少钱几块钱。你用的 FPGA 多少钱几百甚至上千。所以从性价比角度用 FPGA 软核做通用计算基本是亏的。那为什么还有人用因为集成度。当你的系统里已经有 FPGA 在做高速接口、图像处理、实时控制再塞一个软核进去做协议栈、状态管理、人机交互可以省掉一颗外部 MCU简化板级设计。这才是软核的真正价值。3.2 硬核处理器的存在意义有些 FPGA 内部直接集成了硬核处理器比如 Xilinx Zynq 系列里的 ARM Cortex-A9/A53Intel SoC FPGA 里的 ARM Cortex-A9。这些硬核不占用 FPGA 逻辑资源性能也远超软核。Zynq 的 PS 端可以跑 LinuxPL 端做硬件加速两者通过 AXI 总线通信。这种架构其实回答了标题里的问题当 FPGA 想当处理器的时候厂商直接给它配了一个真正的处理器。硬核负责通用计算和操作系统FPGA 逻辑负责并行加速和实时处理。各干各的活谁也不抢谁的饭碗。我做过一个视频处理项目用 Zynq 做平台。PS 端跑 Linux 做网络传输和文件管理PL 端做图像滤波和缩放。如果全部用软核做性能根本不够如果全部用硬核做又达不到实时性。两者结合才是正解。3.3 软核处理器的资源开销与性能权衡如果你确实需要在纯 FPGA 上跑软核有几个参数需要仔细权衡。下面这张表是我根据实际项目经验整理的供参考处理器核LUT 消耗FF 消耗DSP 消耗Block RAM典型频率大致性能MicroBlaze 最小配置~1000~80014150MHz~150 DMIPSMicroBlaze 全配置~3000~2500316100MHz~250 DMIPSNios II 快速版~1400~120028150MHz~200 DMIPSPicoRV32~800~60002100MHz~80 DMIPSVexRiscv 全功能~2000~180018120MHz~180 DMIPS从表里可以看出一个中等配置的软核大概要吃掉一块中低端 FPGA 三分之一到一半的逻辑资源。如果你选的 FPGA 本身就不大那留给其他逻辑的空间就很紧张了。注意软核的性能瓶颈往往不在核本身而在存储器和总线。指令和数据都放在 Block RAM 里访问延迟虽然比外部 DDR 小但多周期访问会拖累流水线。如果加上 Cache资源消耗又会上去。4. FPGA 真正的主场并行数据流与定制化通路4.1 图像处理像素级并行的天然舞台图像处理是 FPGA 最经典的應用场景之一。一幅 1080p 的图像有 200 多万个像素如果每个像素都要做滤波、边缘检测、色彩空间转换用处理器串行跑帧率很难上去。但 FPGA 可以做成流水线每个时钟周期处理一个甚至多个像素200MHz 时钟下一秒钟能处理两亿个像素轻松跑满 60 帧甚至 120 帧。我做过一个 Sobel 边缘检测的实例。用处理器做一帧 1080p 大概要几十毫秒用 FPGA 做流水线一帧只要几毫秒而且延迟固定不随图像内容变化。这种确定性延迟在工业检测和自动驾驶里特别重要。实现的时候关键是把图像数据流组织好。通常用 AXI-Stream 接口配合行缓冲Line Buffer和窗口生成模块。行缓冲用 Block RAM 实现存几行像素然后滑动窗口提取 3×3 或 5×5 的邻域。每个时钟周期出一个窗口送给后续的卷积计算模块。4.2 高速接口LVDS、MIPI 与串口通信FPGA 的 IO 资源非常灵活支持 LVDS、MIPI、DDR、以太网等多种接口标准。这也是处理器很难替代的地方。处理器通常只有固定的几种接口而 FPGA 可以根据需求配置 IO 电平、驱动强度、端接电阻甚至实现自定义的串行协议。比如LVDS 接收FPGA 内部有专门的 SERDES 资源可以跑几百 Mbps 到 Gbps 的差分信号。你只需要在约束文件里指定引脚和时序剩下的交给硬件。再比如MIPI摄像头和显示屏常用FPGA 可以通过 IO 和逻辑实现 D-PHY 接收把高速串行数据解成像素流。串口通信就更常见了。用 FPGA 实现串口发送 ASCII 字符串本质上就是一个状态机加一个移位寄存器。你可以精确控制波特率误差比单片机还小。我试过用 50MHz 时钟分频出 115200 波特率分频系数 434误差不到 0.2%实测非常稳。4.3 数字信号处理DSP 切片与滤波器实现数字滤波器是 FPGA 的另一个强项。FIR 滤波器本质上是乘加运算正好匹配 DSP 切片的结构。一个 16 阶 FIR用 16 个 DSP 并行乘加一个时钟周期出一个输出。如果用处理器做得循环 16 次速度差了一个数量级。MATLAB 和 FPGA 联合开发是常用流程。先在 MATLAB 里设计滤波器系数仿真验证然后用 HDL Coder 或者手动写 Verilog 实现。手动写的话关键是把系数存成 ROM输入数据打拍乘加树流水线化。注意位宽管理中间结果要留够余量不然会溢出。我踩过一个坑滤波器系数没做量化直接用浮点仿真结果 FPGA 里用定点实现后频响偏差很大。后来改成 16 位定点小数点定在合适位置才和 MATLAB 对得上。所以定点化设计是 FPGA 信号处理的基本功不能跳过。5. 从入门到实战FPGA 项目落地的关键步骤5.1 需求分析与器件选型拿到一个项目第一步不是写代码而是想清楚需求。数据速率多少延迟要求多少接口有哪些功耗预算多少这些问题决定了你选什么器件。比如你要做视频处理1080p60 的像素率是 148.5MHz每个时钟一个像素。如果要做 3×3 卷积需要至少 3 行缓冲每行 1920 像素16 位色深那就是 1920×3×2 字节 ≈ 11.5KB 的 Block RAM。再加上其他逻辑选一块中等规模的 FPGA 就够了。如果要做 4K像素率翻四倍行缓冲也翻四倍还得考虑 DDR 带宽。这时候就得选带硬核 DDR 控制器的器件比如 Zynq 或者 UltraScale 系列。提示选型时留 20% 到 30% 的资源余量方便后期改需求和调试。我见过太多项目因为资源用满最后连个调试逻辑都塞不进去。5.2 代码风格与综合约束FPGA 代码和软件代码的思维方式完全不同。写 Verilog 或 VHDL 的时候脑子里要始终有电路图。每个 always 块综合出来是什么电路是组合逻辑还是时序逻辑有没有产生锁存器这些都要清楚。几个基本原则时序逻辑用非阻塞赋值组合逻辑用阻塞赋值避免在多个 always 块里驱动同一个信号状态机用独热码还是二进制码要看器件结构和速度要求。独热码消耗更多 FF 但译码逻辑简单速度快二进制码省 FF 但译码逻辑复杂速度慢。实际项目中状态数少于 8 个用独热码多于 8 个用二进制码或格雷码。综合约束也很关键。时钟周期、输入输出延迟、虚假路径、多周期路径这些都要在 XDC 或 SDC 文件里写清楚。不写约束工具就按最坏情况优化结果可能过约束或者欠约束。5.3 仿真验证与板级调试仿真验证能覆盖 70% 到 80% 的问题剩下的得在板子上调。Testbench 要写得像真实场景激励要覆盖边界条件。比如串口接收要测试起始位、数据位、校验位、停止位的各种组合还要测试噪声和毛刺。板级调试常用 ILAIntegrated Logic Analyzer和 VIOVirtual Input Output。ILA 可以抓内部信号波形VIO 可以实时修改寄存器值。这两个工具能省很多时间。我习惯在关键路径上预留 ILA 核综合时先不接出问题了再接上抓波形。还有一个技巧用 LED 和按键做最原始的状态指示。别小看这个有时候 ILA 抓不到的问题一个 LED 闪烁模式就能告诉你状态机卡在哪了。6. 常见问题与排查技巧实录6.1 时序不收敛怎么办时序不收敛是 FPGA 开发中最常见的问题。表现是综合实现后报 setup 或 hold 违例。排查思路如下问题现象可能原因排查方法解决手段Setup 违例组合逻辑太长看时序报告找关键路径插入流水线寄存器拆分逻辑Hold 违例时钟偏斜大检查时钟树和布线调整约束降低频率跨时钟域违例缺少同步器检查 CDC 路径加两级触发器同步输入延迟违例IO 约束不对核对数据手册修正 input delay 约束我遇到最多的是组合逻辑太长。比如一个 32 位加法器后面直接接比较器再接多路选择器路径延迟超过时钟周期。解决办法是在中间插一级寄存器把长路径切成两段。虽然多了一个时钟周期延迟但频率能上去整体吞吐量反而更高。6.2 资源不够用怎么优化资源不够用的时候先看综合报告找出消耗大户。通常是 Block RAM、DSP 或者 LUT。如果是 Block RAM 不够看看能不能用分布式 RAM 替代或者优化缓冲策略。如果是 DSP 不够看看能不能用 LUT 搭乘法器虽然慢但省 DSP。还有一个办法是时分复用。比如你有 4 个乘法操作但 DSP 只有 2 个那就让 DSP 跑两倍频率分时处理 4 个操作。这需要加多路选择器和控制逻辑但能省一半 DSP。6.3 跨时钟域处理的坑跨时钟域是 FPGA 设计的经典难题。单比特信号用两级触发器同步多比特信号用异步 FIFO 或者握手协议。千万别直接用多比特信号跨时钟域亚稳态会导致数据错误。我踩过一个坑一个 8 位计数器从 50MHz 域传到 100MHz 域直接打两拍结果偶尔读到错误值。后来改成格雷码每次只变一位问题就没了。所以多比特跨时钟域要么用格雷码要么用 FIFO这是铁律。6.4 常见问题速查表问题排查方向快速解决板子不工作电源、时钟、复位先量电压再看时钟有没有输出下载失败JTAG 连接、器件型号检查线序确认器件选对仿真对但板子错约束、时序、IO 电平加 ILA 抓波形对比仿真数据偶尔出错跨时钟域、亚稳态加同步器检查 CDC 路径频率上不去关键路径、布线拥塞插流水线优化布局7. 一些个人体会与后续扩展方向FPGA 这个领域入门门槛确实比单片机高但一旦跨过去能做的事情非常多。我的建议是先从简单的项目入手比如串口收发、PWM 生成、数码管驱动把工具链跑熟把仿真流程走通。然后再挑战图像处理、高速接口、信号处理这些复杂场景。关于“FPGA 是不是处理器”这个问题我的看法是别纠结定义看需求。如果你的任务适合并行流水线那就用 FPGA 逻辑直接实现别绕道处理器。如果你的任务需要操作系统、文件系统、网络协议栈那就用硬核处理器或者外挂 MCU。FPGA 的价值在于它能填补处理器和专用芯片之间的空白给你一个灵活又高效的实现平台。后续如果想深入可以研究一下高层次综合HLS用 C/C 写算法工具自动生成 HDL。虽然目前 HLS 还有局限性但在图像处理和信号处理领域已经能用了。另外RISC-V 生态越来越成熟用 FPGA 跑 RISC-V 做定制指令扩展也是一个很有意思的方向。最后分享一个小技巧每次项目做完把关键的约束文件、Testbench、调试脚本整理成模板。下次做类似项目的时候直接拿来改能省很多时间。我自己的模板库已经攒了十几个从串口到 DDR 到图像流水线都有效率提升非常明显。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →