代码在Vivado/Quartus里综合、布局布线一路绿灯,bit文件下到板子,灯不亮、信号没反应、串口打不出东西——这种"软件看着没问题、硬件就是不响应"的情况,每个搞FPGA/嵌入式的工程师都遇到过。我自己也踩过不少坑,按排查顺序捋一遍,下次再遇到直接照着来,能省半天。
一、先看引脚约束(最高频的坑)代码综合通过不代表引脚约束对。很多新手写完RTL直接点"Generate Bitstream",没意识到约束文件(XDC/UCF/SDC)根本没生效,或者写错了引脚编号。最典型的翻车现场:代码里写的是`led[0] <= 1'b1`,约束里却把`led[0]`绑到了`A1`(一个时钟脚),布局布线照样能过,下载下去自然没反应。

图1:引脚约束文件与FPGA开发板引脚对应
检查顺序:先打开约束文件,确认每个顶层端口对应的物理引脚号和电平标准(LVCMOS33还是LVDS);再对照原理图,看原理图上这个引脚连到了哪个外设。两者必须完全对上。一个工程从一块开发板挪到另一块开发板,最容易出这个错——原理图换了,约束没改。
另一个隐蔽的坑:引脚绑到了专用引脚上(比如DDR、配置脚),综合器会直接报错;绑到了差分对的P端、约束写成单端,下到板子也是没反应。养成习惯,约束写完先打开"IO Planning"视图看一眼引脚布局,物理位置和原理图对得上再下板。
二、用示波器量时钟信号(第二高频)引脚约束没问题,灯还是不亮——十有八九是时钟没起来。FPGA内部逻辑再对,时钟进不来,D触发器没边沿触发,输出永远是复位值。常见原因有三种:晶振虚焊/坏掉、时钟管脚配置错误、PLL/MMCM输入参考时钟没接对。

图2:用示波器抓FPGA输入时钟信号
排查方法:拿示波器探头直接点在晶振输出脚或FPGA的全局时钟输入脚,看有没有方波。正常应该有稳定占空比50%左右的方波,频率等于晶振标称值。如果完全没波形,晶振大概率坏了或虚焊,重焊一次试试。如果有波形但频率不对,检查原理图上晶振负载电容是否匹配(一般板级设计是18pF或20pF)。
三、复位信号极性和释放时机时钟起来了,逻辑还是不跑——看复位。很多FPGA默认上电复位是高电平有效,但你的代码可能写的是低电平复位(`if (!rst_n)`),结果上电那一刻复位信号还没稳定,逻辑跑飞了。另一种情况:复位释放时刻和数据采样边沿错位,时序违例,逻辑进入亚稳态。
建议:代码里复位信号一定要和板级实际一致。看门狗或者外部按键复位的,记得加上拉/下拉电阻,避免悬空。复位释放最好用同步逻辑(同步释放异步复位),Xilinx和Altera的官方模板代码里都有,照着改最稳。
四、电源和电平匹配FPGA核心电压、辅助电压、IO电压,板子上少哪个都起不来。用万用表量一下每路电源的实际值,是不是在datasheet要求的±5%以内。IO电平不匹配也很常见——FPGA的IO是3.3V,外设是1.8V,直接连过去要么烧芯片要么没信号,中间必须加电平转换芯片。

图3:用万用表测量FPGA开发板供电电压
五、综合工具的隐性陷阱有些"代码看着对,仿真也对,下板就不动"的情况,是综合工具太"聪明"了。比如你写的case语句没列全所有分支,工具自动给你当成latch;或者某些信号没明确驱动,被优化掉了。Vivado里可以打开综合后的Schematic视图看实际生成的电路,Quartus里有RTL Viewer和Technology Map Viewer,逻辑是不是被优化掉一眼能看出来。
另外一种高频翻车:双向端口(inout)用在了不该用的地方。代码里`inout`信号当成普通`output`用,仿真没问题,下板要么是高阻要么冲突。这种情况打开综合报告,搜"warning",十有八九能看到工具的告警。
排查顺序建议我的习惯是按"硬件→软件"的顺序查:先确认板子供电正常、晶振起振、JTAG能识别到芯片;再看引脚约束、时钟约束、复位约束这些"软件配置";之后才回去看RTL代码和综合报告。别一上来就怀疑代码写错了,大部分时候坑都在配置层。
代码综合过≠代码能跑——这是FPGA/嵌入式调试的第一铁律。下次再遇到"上板没现象",照着这个顺序查一遍,90%的问题能在一小时内定位。

扫码关注






































