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?
我总结了三类场景,单片机真的搞不定:
- 高速接口通信:比如LVDS、SerDes、千兆以太网。单片机GPIO翻转速度撑死了几十MHz,FPGA轻松上GHz。
- 实时信号处理:视频流、雷达信号、软件无线电。这些数据量太大,单片机处理不过来。
- 确定性延迟要求:比如工业控制中的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的内部结构到底长什么样?——从逻辑单元到布线资源,我会用最直观的方式讲清楚。