3、配置与加载问题:FPGA/芯片配置失败、加载比特流报错、SPI Flash烧录失败、配置引脚电平检查
配置与加载,说白了就是给芯片“灌程序”的过程。很多刚入行的朋友觉得这步很简单——把比特流文件点一下下载就行了。但我在项目里见过太多次,卡在这一步一卡就是好几天。今天咱们就把这块硬骨头啃下来。
3.1 配置失败的常见原因
芯片配置失败,我个人的经验是,八成以上都是硬件环境的问题。你想想看,FPGA上电后,它得按照特定的时序去读取配置数据。任何一个环节出问题,它都不会正常工作。
核心排查思路:先硬件后软件,先电源后信号,先引脚后时序。
3.1.1 电源与复位
我记得有一次,板子回来怎么都配不上。折腾了一下午,最后拿示波器一量——核心电压只有1.0V,芯片要求1.2V。嗯,电源芯片的反馈电阻焊错了。
- 电压范围:检查VCCINT、VCCAUX、VCCO是否在芯片手册规定的范围内。别只看万用表,要用示波器看纹波。
- 上电顺序:很多FPGA要求VCCINT先上电,然后才是VCCAUX和VCCO。顺序反了,配置大概率失败。
- 复位信号:配置期间,复位引脚(比如INIT_B、PROGRAM_B)必须保持正确电平。我习惯在复位引脚上加一个10kΩ上拉电阻。
3.1.2 配置模式选择
FPGA支持多种配置模式:主串、从串、SPI、BPI、JTAG等。模式选错了,芯片根本不理你。
| 模式 | M[2:0]引脚 | 适用场景 |
|---|---|---|
| 主串模式 | 001 | 从SPI Flash加载,最常用 |
| 从串模式 | 111 | 由外部处理器加载 |
| JTAG模式 | 101 | 调试与烧录 |
| SPI模式 | 001 | 主SPI Flash加载 |
注意:M[2:0]引脚上的上下拉电阻值要选对。我见过有人用了4.7kΩ,结果电平不对,芯片一直识别成JTAG模式。一般建议用1kΩ~4.7kΩ。
3.2 加载比特流报错
用JTAG加载比特流时,Vivado或Quartus报错,这是最常见的场景。错误信息五花八门,但核心就那么几种。
3.2.1 常见的JTAG错误
- “Can't find device”——没找到芯片。检查JTAG链是否连通,TCK/TMS/TDI/TDO有没有虚焊。我习惯用示波器量一下TCK有没有时钟信号。
- “CRC error”——数据校验失败。可能是比特流文件损坏,或者配置时钟不稳定。换个下载线试试,有时候是线太长了。
- “DONE pin didn't go High”——配置完成后DONE引脚没拉高。这说明配置过程没走完,检查配置时钟频率是不是太高了。
小技巧:如果JTAG一直连不上,可以试试把PROGRAM_B引脚拉低再释放,强制芯片重新进入配置状态。这招我用了很多次,挺管用的。
3.2.2 比特流版本不匹配
这个坑我踩过。用Vivado 2020.2编译的比特流,想用Vivado 2018.3的下载器去加载——报错。说白了,工具链版本要一致。特别是用了IP核的项目,不同版本生成的比特流格式可能有差异。
3.3 SPI Flash烧录失败
量产的时候,SPI Flash烧录是重头戏。烧录失败,板子就废了。我总结了几条经验。
3.3.1 Flash型号兼容性
不是所有SPI Flash都能用在FPGA上。FPGA对Flash的指令集有要求,比如要支持READ、FAST_READ、PAGE_PROGRAM等指令。我建议直接用芯片厂商推荐列表里的型号,别自己乱选。
避坑指南:我曾经选了一款便宜的国产Flash,烧录时一切正常,但板子断电重启后配置就失败。查了半天,发现是Flash的读时序和FPGA不匹配。后来换了Winbond的W25Q系列,问题解决。
3.3.2 烧录时序与速度
SPI时钟频率不能太高。FPGA配置时,SPI时钟一般建议在20MHz~50MHz之间。频率太高,信号质量下降,容易出错。
- 时钟极性(CPOL)和相位(CPHA):FPGA和Flash要设置一致。大多数Flash默认是Mode 0(CPOL=0, CPHA=0)。
- 片选信号:CS_N在配置期间要保持稳定。我见过因为CS_N上拉电阻太大,导致信号边沿变缓,烧录失败。
- 数据线:MOSI和MISO上的串联电阻(一般22Ω~33Ω)不能省,用来抑制过冲。
3.3.3 烧录流程
标准的SPI Flash烧录流程是这样的:
- 擦除整个Flash(或者只擦除要写的扇区)
- 写入配置数据(按页写入,每页256字节)
- 读取校验(回读数据,对比是否一致)
- 写保护(防止误擦除)
注意:擦除操作很耗时,一个扇区(64KB)可能要几百毫秒。别在擦除过程中断电,否则Flash可能损坏。
3.4 配置引脚电平检查
配置引脚的电平,是排查问题的第一站。我每次拿到新板子,第一件事就是量这些引脚。
3.4.1 关键配置引脚
| 引脚 | 功能 | 正常电平 |
|---|---|---|
| PROGRAM_B | 配置触发 | 高电平(3.3V或1.8V) |
| INIT_B | 初始化状态 | 配置前为低,完成后为高 |
| DONE | 配置完成指示 | 配置完成后拉高 |
| CCLK | 配置时钟 | 配置期间有脉冲 |
| M[2:0] | 模式选择 | 根据模式设定 |
3.4.2 电平检查步骤
我个人习惯按这个顺序查:
- 上电后立即测量:用示波器看PROGRAM_B和INIT_B的上电波形。INIT_B应该先拉低,然后自动释放拉高。如果一直低,说明芯片内部初始化失败。
- 配置过程中测量:看CCLK上有没有时钟信号。没有时钟,说明FPGA没开始配置。有时钟但DONE没拉高,说明配置数据有问题。
- 配置完成后测量:DONE引脚必须为高。如果为低,检查配置数据或Flash内容。
小技巧:如果DONE引脚一直低,可以手动拉低PROGRAM_B再释放,重新触发配置。同时用示波器抓CCLK和DONE的波形,看配置过程持续了多久。正常配置时间一般在几十到几百毫秒。
3.5 知识体系总览
下面这张图,是我自己总结的配置与加载问题的排查流程。你照着走一遍,大部分问题都能定位到。
嗯,配置与加载的问题,说白了就是电源、引脚、时序、数据这四个方面。你把这四点吃透了,遇到问题就不会慌。我刚开始做项目时,也经常被配置问题搞得焦头烂额。后来养成了先量引脚电平的习惯,很多问题一眼就能看出来。
记住一句话:配置失败,先查硬件;硬件没问题,再看软件。这个顺序反了,你会走很多弯路。