1、思维破冰:为什么学了单片机还要学FPGA?——从软件思维到硬件思维的转变

说实话,这个问题我经常被问到。

很多工程师学完单片机后,觉得已经能搞定大部分项目了。这时候突然要学FPGA,心里难免犯嘀咕:有必要吗?

我的答案是:有必要,而且越早学越好

1.1 单片机能做的事,FPGA也能做吗?

能,但反过来不一定。

单片机本质上是软件思维——你写代码,CPU一条一条地执行指令。哪怕你写的是并行逻辑,到了CPU那里,还是得排队串行处理。

FPGA不一样。它是硬件思维——你描述的是电路结构,不是指令序列。所有逻辑门在烧录那一刻就同时工作了。

举个我项目中的例子

几年前做多通道数据采集,单片机要同时处理8路ADC的数据。每路采样率1MHz,单片机根本忙不过来——中断嵌套、DMA排队,最后丢数据丢得我头皮发麻。

换成FPGA后,8路ADC各自独立工作,每个通道一个硬件模块,同时采样、同时处理。嗯,问题就这么解决了。

1.2 软件思维 vs 硬件思维:到底差在哪?

说白了,就是顺序执行并行执行的区别。

对比项 单片机(软件思维) FPGA(硬件思维)
执行方式 顺序执行指令 并行硬件电路
速度瓶颈 主频、指令周期 逻辑门延迟、布线延迟
实时性 受中断响应时间影响 确定性延迟,纳秒级响应
灵活性 改代码即可 需要重新综合/布局布线
适合场景 控制、交互、低复杂度 高速信号处理、并行计算

你想想看,单片机里写个for循环,100次迭代就是100个时钟周期。FPGA里呢?一个时钟周期就能完成100个加法——因为每个加法器都是独立的硬件。

1.3 什么时候必须用FPGA?

我总结了三类场景,单片机真的搞不定:

  1. 高速接口通信:比如LVDS、SerDes、千兆以太网。单片机GPIO翻转速度撑死了几十MHz,FPGA轻松上GHz。
  2. 实时信号处理:视频流、雷达信号、软件无线电。这些数据量太大,单片机处理不过来。
  3. 确定性延迟要求:比如工业控制中的PWM同步、电机控制中的电流环。单片机的中断响应时间不确定,FPGA的延迟是固定的。

避坑指南

我曾经有个项目,非要用单片机做视频缩放。折腾了三个月,最后帧率只有5fps。后来换成FPGA,两周搞定,60fps稳稳的。所以,选对工具比硬扛更重要

1.4 学了FPGA,单片机就废了吗?

当然不是。

我现在的习惯是:控制部分用单片机,高速处理部分用FPGA。两者配合,才是最佳方案。

比如一个数据采集系统:

  • FPGA负责:高速采样、数据预处理、FIFO缓存
  • 单片机负责:协议解析、人机交互、网络通信

这样分工,既发挥了FPGA的并行优势,又保留了单片机的灵活性。

1.5 思维转变:从“写代码”到“画电路”

刚开始学FPGA,最难受的就是思维转换。

写单片机代码时,你关心的是变量、函数、流程控制。写Verilog时,你关心的是寄存器、组合逻辑、时序关系。

举个例子:

// 单片机思维:顺序执行
int a = 0;
a = a + 1;  // 先读a,再加1,再写回a
a = a + 2;  // 再读a,再加2,再写回a
// 结果:a = 3
// FPGA思维:并行硬件
reg [7:0] a;
always @(posedge clk) begin
    a <= a + 1;  // 每个时钟周期加1
    a <= a + 2;  // 注意:这里会覆盖上一行!
end
// 结果:每个时钟周期加2,不是加3

为什么会这样?因为FPGA里没有“顺序执行”的概念。两个赋值语句在同一个always块里,最后一个赋值生效。这就是硬件思维——你要想清楚每个时钟周期,电路的状态是什么。

重要提醒

刚开始写Verilog时,别用软件思维去理解。我见过太多人把Verilog当C语言写,结果综合出来的电路乱七八糟。记住:你是在描述硬件,不是在写软件

1.6 学FPGA,到底值不值?

我个人觉得,非常值。

首先,FPGA工程师的薪资普遍比单片机高30%-50%。其次,FPGA能让你接触到更底层的硬件设计,对理解计算机体系结构、数字电路设计都有帮助。

更重要的是,FPGA是通往芯片设计的桥梁。如果你以后想做ASIC、做SoC,FPGA是必经之路。

嗯,这一章就到这里。下一章我们聊聊:FPGA的内部结构到底长什么样?——从逻辑单元到布线资源,我会用最直观的方式讲清楚。