刚开始学 FPGA 的时候,很多人都有一个错觉: 只要把 Verilog 学会,再把Viv ad o或者 Quartus 用熟,FPGA基本就入门了。
真做过几个项目以后才发现,事情没这么简单。
代码能综合,不代表逻辑没问题; 仿真 能跑,不代表上板一定正常;波形看起来没问题,也不代表时序就能收敛。
更麻烦的是,FPGA很多坑一开始根本看不出来。
比如一个if没写完整,综合器给你推了个Latch;一个跨 时钟 域 信号 直接连过去,仿真可能一切正常,上板之后却开始“随机抽风”;为了降频随手拿逻辑做了个分频时钟,最后整个设计的时序约束都变得一团糟。
所以,FPGA入门真正需要掌握的,不只是40个知识点,更是这40个知识点背后的 工程思维 。
下面这40个坑,基本覆盖了从 数字电路 、Verilog,到仿真、时序、FPGA架构,再到真正上板开发的全过程。
一、第一关就容易翻车:数字电路基础没打牢
很多人不太愿意花时间学数字电路。
“我就是来写Verilog的,逻辑门这些东西以后再说。”
Verilog只是描述硬件的语言。如果不知道自己描述出来的东西最终是什么电路,后面遇到问题很容易两眼一抹黑。
FPGA工程里,十六进制几乎天天见。
寄存器 地址:0x80000000
状态寄存器:0x00000003
如果二进制、十六进制之间还需要拿计算器转换,调试效率会非常低。
至少要熟练掌握:二进制 十六进制 十进制
另外,BCD码也要知道它是怎么回事,尤其是做显示、计时器之类的设计时。
坑2:只知道“与或非”,不知道异或到底干什么
AND、OR、NOT是最基础的。
比如奇偶校验、CRC、比较逻辑、加法器,都大量使用异或。
看到:assign y = a ^ b;
最好能马上想到:这个东西最终会变成什么逻辑资源?
坑3:搞不清组合逻辑和时序逻辑
组合逻辑:输入变,输出跟着变。
时序逻辑:要靠时钟和寄存器保存状态。
assign y = a & b;
always @(posedge clk)
简单粗暴地记: 组合逻辑负责算,寄存器负责记。
后面的FSM、 Pi peline、FIFO,本质上都能从这里一路追过去。
坑4:看到MUX还不知道是什么
B ─┼──→ MUX ──→ Y
assign y = sel ? a : b;
复杂的数据通路里,MUX会非常多。
所以不要小看这个东西。很多时候,FPGA频率上不去,问题就藏在一大堆选择逻辑里面。
坑5:把Latch和Flip-Flop当成一回事
Flip-Flop是边沿触发。
初学者真正容易踩的是—— 你可能没打算写Latch,却让综合器给你推出来了。
always @(*) begin
先检查自己的组合逻辑是不是没有完整赋值。
坑6:加法器只会写+,不知道背后的硬件
写:assign sum = a + b;
但要知道,FPGA并不是运行了一条“加法指令”。
综合工具会把它映射到芯片内部的专用进位链等资源。
理解半加器、全加器之后,再去理解Carry Chain、 DSP 等资源,会顺很多。
二、Verilog最容易出现的误区:把它当成 C语言
Verilog看起来有变量、if、case、always,确实很像软件语言。
但它描述的是 硬件并行行为 。
坑7:module和 端口 概念混乱
module led _ctrl(
input wire clk,
input wire rs t_n,
output wire led
这里的module可以理解成一个硬件模块。
不是函数,也不是软件里的参数列表。
坑8:认为reg就一定是寄存器
这里的a虽然声明成reg,但综合以后完全可能只是组合逻辑。
真正决定是不是寄存器的,不是reg这个关键词,而是: 你的RTL代码描述了什么硬件结构。
它们的数值可能看起来一样,但位宽并不一样。
assign c = a + b;
这种运算到底怎么扩展?有没有符号位问题?
大型工程里,位宽错误是很常见的Bug来源。
坑10:总线、位选、部分位选不会用
wire [7:0] data;
真正做项目之后你会发现,寄存器映射、协议解析、数据拼接,天天都在干这个。
坑11:把三种Verilog描述方式混在一起
Verilog常见的三种描述方式: 结构描述
你只需要知道:我现在是在描述连线、组合逻辑,还是描述一个时序过程?写代码的时候脑子里有这个判断,已经够用了。
坑12:阻塞赋值、非阻塞赋值乱用
这是Verilog初学者必踩坑。
always @(posedge clk) begin
两个寄存器会在同一个时钟沿完成数据交换。
一句工程习惯: 时序逻辑优先 。
坑13:always敏感列表写错
如果是SystemVerilog,则可以进一步使用:
这些写法的价值在于,让代码意图更清楚,也更容易被工具检查。
需要注意的是,组合逻辑中的条件如果没有覆盖完整,很容易推断出Latch。
所以写完if之后,别忘了问一句:
每一种情况下,这个输出到底有没有确定的值?
三、不会仿真,上板就是“碰运气”
坑15: Te stbench不会写




本页摘要由 AI 辅助整理,经编辑审核后发布;AI 仅用于提炼与分类,原文均附来源链接。