FPGA的选型和应用

3 阅读12分钟

大家好,我是良许。

最近有不少朋友问我关于 FPGA 的问题,虽然我主要做嵌入式软件开发,但在实际项目中也经常需要和 FPGA 工程师配合。

今天就来聊聊 FPGA 的选型和应用,希望能给准备入坑或者正在选型的朋友一些参考。

1. FPGA 基础认知

1.1 什么是 FPGA

FPGA(Field Programmable Gate Array,现场可编程门阵列)是一种可以通过编程来配置内部逻辑的集成电路。

和我们常用的 MCU、MPU 不同,FPGA 的核心优势在于并行处理能力和可重构性。

简单来说,MCU 是顺序执行指令的,就像一个人按照清单逐项完成任务。

而 FPGA 可以同时处理多个任务,就像多个人同时工作,效率自然高得多。

这也是为什么在高速信号处理、图像处理、通信协议转换等场景下,FPGA 有着不可替代的地位。

1.2 FPGA 的核心资源

在选型之前,我们需要了解 FPGA 的几个核心资源指标:

逻辑单元(LE/LUT):这是 FPGA 最基本的逻辑资源,用来实现组合逻辑和时序逻辑。

逻辑单元的数量直接决定了你能实现多复杂的逻辑功能。

比如 Xilinx 的 Artix-7 系列,从几万到几十万逻辑单元不等。

块 RAM(BRAM):片上存储资源,速度快但容量有限。

在做数据缓存、FIFO、查找表等应用时非常重要。

我之前做过一个图像处理项目,需要缓存多帧图像数据,BRAM 资源就成了瓶颈。

DSP 单元:专门用于乘法、加法等数学运算的硬核,在数字信号处理中非常关键。

如果你的应用涉及大量数学运算,DSP 资源一定要够用。

IO 引脚:这个很好理解,就是对外通信的接口。

不同封装的 FPGA,IO 数量差异很大,从几十到上千不等。

时钟资源:包括 PLL、DLL 等,用于时钟管理和频率综合。

高速应用对时钟质量要求很高,这块资源也不能忽视。

2. FPGA 选型要点

2.1 明确应用需求

选型的第一步是明确你的应用场景。

我见过不少新手上来就选最贵最高端的型号,结果发现资源浪费严重,成本也控制不住。

高速数据采集:比如示波器、高速 ADC 接口,需要关注 IO 速率、SERDES 资源。

我之前参与的一个项目,需要接入 4 路 1Gsps 的 ADC,最后选择了带有高速 SERDES 的 Kintex-7 系列。

图像处理:需要大量的 DSP 资源和 BRAM。

比如做实时图像滤波、边缘检测,DSP 单元的数量直接影响能处理的图像分辨率和帧率。

通信协议转换:比如 PCIe、以太网、CAN、串口等协议之间的转换,需要关注硬核 IP 的支持情况。

有些高端 FPGA 集成了 PCIe 硬核,可以大大简化设计。

工控应用:对可靠性要求高,需要考虑工业级温度范围(-40℃ 到 85℃ 或更高)、抗干扰能力等。

2.2 资源评估方法

如何评估需要多少资源呢?

这里有个经验公式,但实际项目中还需要预留 30% 到 50% 的余量:

逻辑资源:先用 HDL(Verilog 或 VHDL)写出核心模块,用综合工具评估资源占用。

比如一个简单的 UART 模块可能只需要几百个逻辑单元,但一个复杂的图像处理流水线可能需要几万甚至十几万。

存储资源:计算数据缓存需求。比如缓存一帧 1920x1080 的 RGB 图像,需要 1920 10803 = 6220800 字节,约 6MB。

如果 BRAM 不够,就需要外挂 DDR。

DSP 资源:统计乘法器和加法器的数量。

比如一个 FIR 滤波器,如果有 N 个抽头,就需要 N 个乘法器和 N-1 个加法器。

2.3 厂商和系列选择

目前市场上主要有三大 FPGA 厂商:

Xilinx(现在是 AMD 的一部分):市场占有率最高,产品线最全。

从低端的 Spartan 系列到高端的 Virtex 系列,应有尽有。

开发工具 Vivado 功能强大,但学习曲线稍陡。

我个人用得最多的是 Artix-7 和 Zynq 系列。

Intel(Altera):原来的 Altera 被 Intel 收购后,产品线也很丰富。

Cyclone 系列性价比高,Stratix 系列性能强悍。开发工具 Quartus 也很成熟。

Lattice:主打低功耗和小封装,在便携设备和 IoT 领域有优势。

价格相对便宜,但生态不如前两家。

对于初学者或者中小型项目,我推荐从 Xilinx 的 Artix-7 或 Intel 的 Cyclone V 开始。

这两个系列性价比高,资料丰富,社区活跃。

2.4 成本考量

FPGA 的成本不仅仅是芯片本身的价格,还包括:

开发板成本:如果是原型验证,可以买现成的开发板,价格从几百到几千不等。

比如 Digilent 的 Arty A7 开发板,搭载 Artix-7,价格在 1000 元左右,非常适合学习和小型项目。

开发工具:Xilinx 和 Intel 的开发工具都有免费版本,但高级功能需要付费 License。

对于商业项目,这块成本不能忽视。

PCB 成本:FPGA 的封装通常是 BGA,对 PCB 设计和制造要求较高。

如果是多层板,成本会显著增加。

量产成本:批量采购时,芯片价格会有折扣,但需要考虑供货周期和最小起订量。

3. FPGA 典型应用案例

3.1 高速数据采集系统

我之前参与过一个雷达信号处理项目,需要采集 8 路 100MHz 的 ADC 数据,并进行实时 FFT 运算。

这种应用 MCU 完全无法胜任,必须用 FPGA。

设计思路是这样的:FPGA 通过 LVDS 接口接收 ADC 数据,先做数据对齐和时钟域转换,然后送入 FFT IP 核进行频域分析,最后通过 PCIe 接口将结果传给主机。

整个数据流水线在 FPGA 内部并行处理,延迟只有几微秒。

关键代码片段(Verilog):

// ADC数据接收模块
module adc_receiver (
    input wire clk,
    input wire rst_n,
    input wire [7:0] adc_data_p,
    input wire [7:0] adc_data_n,
    output reg [15:0] data_out,
    output reg data_valid
);
​
// LVDS差分输入缓冲
wire [7:0] adc_data;
genvar i;
generate
    for (i = 0; i < 8; i = i + 1) begin : lvds_buf
        IBUFDS #(
            .DIFF_TERM("TRUE")
        ) ibufds_inst (
            .I(adc_data_p[i]),
            .IB(adc_data_n[i]),
            .O(adc_data[i])
        );
    end
endgenerate
​
// 数据拼接和对齐
reg [7:0] data_buf;
reg phase;
​
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        data_buf <= 8'b0;
        data_out <= 16'b0;
        data_valid <= 1'b0;
        phase <= 1'b0;
    end else begin
        if (phase == 1'b0) begin
            data_buf <= adc_data;
            data_valid <= 1'b0;
            phase <= 1'b1;
        end else begin
            data_out <= {data_buf, adc_data};
            data_valid <= 1'b1;
            phase <= 1'b0;
        end
    end
end
​
endmodule

这个模块实现了 LVDS 差分信号接收和数据拼接。

实际项目中还需要加入 FIFO 缓冲、时钟域转换等模块。

3.2 视频图像处理

另一个常见应用是实时视频处理。

比如在安防监控中,需要对摄像头采集的视频进行降噪、增强、目标检测等处理。

FPGA 在这类应用中的优势非常明显:可以实现像素级并行处理,延迟低,功耗相对 GPU 也更低。

我见过一个项目,用 FPGA 实现了 4K@60fps 的实时视频处理,如果用 ARM 处理器,根本不可能达到这个性能。

典型的视频处理流水线包括:

1.1 视频输入接口(MIPI、HDMI 等)1.2 图像预处理(去噪、色彩空间转换)1.3 核心算法(滤波、边缘检测、特征提取)1.4 后处理(叠加 OSD、缩放)1.5 视频输出接口

每个模块都可以用独立的硬件逻辑实现,数据在流水线中流动,实现真正的实时处理。

3.3 通信协议桥接

在嵌入式系统中,经常需要在不同通信协议之间转换。

比如将以太网数据转换为 CAN 总线数据,或者将多路串口数据汇聚到一个高速接口。

我之前做过一个项目,需要将 16 路 RS485 串口数据通过千兆以太网上传到服务器。

如果用 MCU 实现,16 路串口的中断处理就会非常复杂,而且容易丢数据。

用 FPGA 就简单多了,每路串口用一个独立的 UART 模块,数据先缓存到 FIFO,然后由仲裁模块统一打包成以太网帧发送。

关键是 FPGA 的并行处理能力,16 个 UART 模块同时工作,互不干扰,系统的实时性和可靠性都得到了保证。

3.4 SoC 系统设计

现在很多 FPGA 集成了 ARM 处理器,比如 Xilinx 的 Zynq 系列和 Intel 的 SoC FPGA 系列。

这种架构结合了处理器的灵活性和 FPGA 的并行处理能力,非常适合复杂的嵌入式系统。

以 Zynq-7000 为例,它包含双核 ARM Cortex-A9 处理器和 FPGA 逻辑。

ARM 端运行 Linux 系统,负责系统管理、网络通信、用户界面等;FPGA 端负责高速数据处理、外设接口等。

两者通过 AXI 总线高速互联,可以实现非常复杂的功能。

我用 Zynq 做过一个工业相机项目,ARM 端运行 Linux,负责网络通信和参数配置;FPGA 端实现图像传感器接口、ISP 处理、图像压缩等。

整个系统性能强大,开发效率也很高。

4. FPGA 开发注意事项

4.1 时序约束

FPGA 设计中最容易出问题的就是时序。

不像 MCU 编程,FPGA 的时序是硬件级别的,必须满足建立时间和保持时间的要求。

在 Vivado 中,需要编写 XDC 约束文件,定义时钟频率、IO 延迟等参数。比如:

# 创建主时钟,频率100MHz
create_clock -period 10.000 -name sys_clk [get_ports clk_in]# 设置输入延迟
set_input_delay -clock sys_clk -max 2.000 [get_ports data_in]
set_input_delay -clock sys_clk -min 0.500 [get_ports data_in]# 设置输出延迟
set_output_delay -clock sys_clk -max 3.000 [get_ports data_out]
set_output_delay -clock sys_clk -min 0.500 [get_ports data_out]

时序约束不当会导致综合后的电路无法稳定工作,这是很多初学者容易踩的坑。

4.2 跨时钟域处理

在 FPGA 设计中,经常需要在不同时钟域之间传递数据。

如果处理不当,会出现亚稳态,导致数据错误。

常用的跨时钟域处理方法包括:

双触发器同步:适用于单比特信号,用两级寄存器同步,降低亚稳态概率。

异步 FIFO:适用于多比特数据,FIFO 的读写端分别工作在不同时钟域,内部用格雷码指针避免亚稳态。

握手协议:用请求-应答机制确保数据传输的可靠性。

这些都是 FPGA 设计的基本功,必须掌握。

4.3 资源优化

FPGA 资源有限,需要合理优化。常用的优化方法包括:

流水线设计:将复杂的组合逻辑拆分成多级流水线,提高工作频率。

比如一个复杂的乘加运算,可以拆分成乘法级、加法级、输出级,每级插入寄存器。

资源复用:对于不同时工作的模块,可以复用相同的硬件资源。

比如多个滤波器可以分时复用同一组乘法器。

IP 核使用:Xilinx 和 Intel 都提供了丰富的 IP 核,比如 FFT、FIR 滤波器、DDR 控制器等。

使用 IP 核可以节省开发时间,而且经过优化,性能和资源占用都比较好。

4.4 仿真和调试

FPGA 开发离不开仿真和调试。

综合前的功能仿真可以验证逻辑正确性,综合后的时序仿真可以发现时序问题。

常用的仿真工具包括 ModelSim、Vivado Simulator 等。

编写完整的 testbench 非常重要,可以覆盖各种边界条件和异常情况。

硬件调试方面,可以使用逻辑分析仪(ILA)抓取内部信号,或者通过 JTAG 接口在线调试。

Xilinx 的 ChipScope 和 Intel 的 SignalTap 都是很好用的在线调试工具。

5. 学习建议

如果你是刚接触 FPGA 的新手,我的建议是:

从基础学起:先学习数字电路基础,理解组合逻辑、时序逻辑、状态机等概念。

然后学习 HDL 语言,Verilog 或 VHDL 都可以,个人推荐 Verilog,语法更接近 C 语言。

动手实践:买一块开发板,从 LED 流水灯、按键消抖、数码管显示等简单项目开始。

然后逐步尝试 UART 通信、VGA 显示、DDR 读写等复杂项目。

学习 IP 核使用:熟悉厂商提供的 IP 核,比如时钟管理、存储控制器、通信接口等。

这些 IP 核经过充分验证,可以大大提高开发效率。

关注时序:从一开始就养成良好的时序设计习惯,学会编写约束文件,分析时序报告。

时序问题是 FPGA 设计中最常见也最难调试的问题。

多看项目案例:GitHub 上有很多开源的 FPGA 项目,可以学习别人的设计思路和代码风格。

比如 PicoRV32、VexRiscv 等开源处理器核,都是很好的学习资料。

FPGA 是一个门槛较高但非常有价值的技术方向。

虽然我主要做软件开发,但在实际项目中,软硬结合才能发挥最大的价值。

希望这篇文章能帮助大家更好地理解 FPGA 的选型和应用,如果有问题欢迎交流讨论。

更多编程学习资源