继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

FPGA的选型和应用

2026-03-18 00:18:391369浏览

良许

1实战 · 398手记
TA的实战

大家好,我是良许。

最近有不少朋友问我关于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的选型和应用,如果有问题欢迎交流讨论。

更多编程学习资源

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP