上篇聊了嵌入式Linux系统开发。这篇聊FPGA——在机器人领域,FPGA正在成为高性能计算和实时控制的关键硬件。面试中FPGA相关的题目通常集中在:FPGA和CPU/GPU的区别、硬件描述语言基础、时序约束、以及在机器人中的典型应用场景。

FPGA是什么

FPGA(Field-Programmable Gate Array)是现场可编程门阵列。跟CPU执行软件指令不同,FPGA是通过配置逻辑单元来实现硬件电路——你可以把它理解成"可以编程的芯片"。每次配置后,FPGA内部就形成了一个定制的数字电路。

FPGA的核心结构:

  • CLB(Configurable Logic Block):可配置逻辑块,实现组合逻辑和时序逻辑的基本单元
  • 互联矩阵:连接各个CLB的可编程布线资源
  • IO Block:输入输出块,连接外部信号
  • Block RAM:片上存储块,用于数据缓存
  • DSP Slice:专用的乘加运算单元,适合信号处理
  • PLL/MMCM:时钟管理模块,生成和分配时钟

主流FPGA厂商:Xilinx(AMD收购后叫AMD-Xilinx)、Intel(收购Altera后)、Lattice(低功耗FPGA)、国产的紫光同创、安路科技等。机器人领域最常用的是Xilinx的Zynq系列——它把ARM处理器和FPGA逻辑集成在一颗芯片上。

FPGA vs CPU vs GPU

这是面试必考题。三者的本质区别:

CPU是通用处理器,通过指令流水线执行软件程序。优势是灵活性高,可以跑任何算法。劣势是串行执行,并行度有限。

GPU是众核处理器,有成千上万个小核心。优势是大规模并行计算(比如矩阵乘法)。劣势是编程模型受限(SIMT),不适合复杂控制逻辑,延迟不确定。

FPGA是硬件电路,逻辑在物理层面并行执行。优势是确定性延迟(纳秒级)、真正的并行(不同逻辑块可以同时工作)、低功耗(只实现需要的功能)。劣势是开发周期长、调试困难、不适合复杂软件算法。

在机器人中的分工:CPU做高层决策和通信,GPU做深度学习推理,FPGA做传感器数据预处理和实时控制。三者互补,不是替代关系。

举个具体的性能对比:假设要对1280x720的图像做Sobel边缘检测。CPU用OpenCV(单线程)约需5ms,GPU用CUDA约需0.3ms,FPGA实现流水线约需0.01ms(但延迟固定为几个时钟周期)。功耗方面:CPU约10W,GPU约30W,FPGA约2-3W。在电池供电的移动机器人上,FPGA的功耗优势很明显。但FPGA的开发周期是CPU的10-100倍——所以只把计算密集且算法固定的部分放到FPGA上。

硬件描述语言

FPGA用硬件描述语言(HDL)编程。主流的有两种:Verilog和VHDL。

Verilog语法类似C语言,入门容易但容易写出有bug的代码。VHDL语法严格,类型检查强,不容易出错但写起来啰嗦。现在业界Verilog用得更多,但很多欧洲公司(特别是军工和航空)仍然用VHDL。

HDL编程跟软件编程有本质区别:你在描述硬件电路,不是写执行步骤。一个always块(Verilog)或process块(VHDL)描述的是电路行为,不是顺序执行的代码。理解"并行执行"和"时钟驱动"是入门的关键。

// 简单的D触发器(Verilog)
always @(posedge clk) begin
    if (reset)
        q <= 1'b0;
    else
        q <= d;
end

// 计数器
always @(posedge clk) begin
    if (reset)
        count <= 8'd0;
    else if (enable)
        count <= count + 1'b1;
end

时序约束

FPGA设计中最容易出问题的地方是时序。时序约束告诉综合工具电路需要在什么时钟频率下正确工作。

关键概念:

  • 建立时间(Setup Time):时钟边沿到来前,数据必须稳定的最小时间
  • 保持时间(Hold Time):时钟边沿到来后,数据必须保持稳定的最小时间
  • 最大频率(Fmax):设计能正确工作的最高时钟频率
  • 时序裕量(Slack):实际时序与约束之间的差值,正数表示满足约束

时序违例是FPGA调试中最常见的问题。面试中被问到时序问题,能从建立时间和保持时间两个角度分析就很好。解决方法:流水线化设计(把组合逻辑拆分成多级,每级之间插寄存器)、减少关键路径延迟、调整布局布线约束。

跨时钟域设计是另一个容易出问题的地方。当信号从一个时钟域传到另一个时钟域时(比如100MHz的FPGA逻辑和200MHz的DDR接口),可能出现亚稳态(metastability)——信号在时钟边沿附近变化,导致触发器输出不确定。解决方法:两级同步器(对单比特信号)、异步FIFO(对多比特数据)、握手协议(对控制信号)。面试中问"跨时钟域怎么处理",这三个答案基本就覆盖了。

FPGA在机器人中的应用场景

传感器数据预处理。激光雷达的点云数据、高速相机的图像数据,数据量大但处理逻辑相对固定。用FPGA做前端的滤波、降采样、特征提取,可以大幅减轻CPU的负担。比如一个16线激光雷达,每秒产生30万个点,FPGA可以在数据到达CPU之前就完成坐标变换和无效点过滤。

电机控制。FPGA可以实现纳秒级的电流环控制——这是CPU做不到的。在高性能伺服驱动器中,FPGA负责PWM生成、电流采样、位置解码(编码器接口),控制周期可以低至1微秒。

通信协议加速。EtherCAT从站控制器、自定义高速接口协议,都可以在FPGA中实现。Xilinx的Zynq系列把ARM和FPGA集成在一起,ARM跑Linux+ROS2,FPGA实现EtherCAT从站,一颗芯片搞定。

面试要点

FPGA的开发流程。RTL编码(Verilog/VHDL)→ 功能仿真(Testbench)→ 综合(Synthesis,把RTL转成门级网表)→ 布局布线(Place & Route)→ 时序分析(Timing Analysis)→ 生成比特流(Bitstream)→ 下载到FPGA验证。每个步骤都有对应的工具(Vivado、Quartus等)。

仿真为什么重要。FPGA不像软件可以"先跑起来再调"——每次修改后综合+布局布线可能需要几十分钟到几小时。所以必须在仿真阶段充分验证。Testbench要覆盖所有边界条件和异常情况。

FPGA的功耗问题。FPGA的功耗跟设计的复杂度直接相关——未使用的逻辑也会消耗静态功耗。在机器人中,电池供电的场景需要仔细优化功耗:关闭不用的时钟域、使用门控时钟、选择低功耗的IO标准。

AXI总线协议。在Zynq这类SoC FPGA中,ARM和FPGA之间通过AXI(Advanced eXtensible Interface)总线通信。AXI有五种通道:写地址、写数据、写响应、读地址、读数据,支持突发传输和乱序响应。理解AXI是做Zynq开发的基础——自定义IP核必须通过AXI接口跟ARM交互。面试中可能让你画出AXI的读写时序。

给你的建议

如果你想入门FPGA,建议从Xilinx的Zynq-7020开发板开始(比如Digilent的Zybo或Zedboard)。Zynq集成了ARM Cortex-A9和FPGA,可以同时学习嵌入式Linux和FPGA开发。

学习路径:先学Verilog基础语法和仿真(ModelSim或Vivado Simulator),然后做几个小项目(LED控制、UART收发器、SPI控制器),再学AXI总线(ARM和FPGA之间的通信接口),最后做一个完整的Zynq项目(比如ARM通过AXI控制FPGA中的自定义外设)。

HDL编程的思维转换是最难的。软件工程师习惯了顺序执行,但FPGA是并行的。建议先理解"时钟驱动"和"寄存器传输级"(RTL)的概念,再开始写代码。不要试图用软件思维写硬件——这是初学者最常犯的错误。

推荐的学习资源:HDLBits(在线Verilog练习平台)、Xilinx的Free Video Training Series、OpenCores上的开源IP核(可以学习别人的设计)。实际项目中,Vivado的ILA(Integrated Logic Analyzer)是最好的在线调试工具——可以在FPGA运行时实时观察内部信号,比示波器方便得多。


上一篇:第324篇 嵌入式Linux系统开发

下一篇预告:第326篇 嵌入式AI推理TensorRT与NCNN端侧部署

 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐