EP4CE10E22C8N 这块芯片,玩过 Cyclone IV 的人应该不陌生,10K 逻辑单元,144 个引脚,做工业控制、信号处理、电机驱动这些场景非常常见。但很多刚接触 FPGA 的朋友卡住的第一关,往往不是 Verilog 语法,而是这块板子怎么“活起来”——明明 JTAG 下载 .sof 能跑,拔了电再上电就全灭;想做成 AS 模式自动加载,又被 MSEL 拨码开关、nCONFIG、DATA0 这些名词搞得一头雾水。这篇就把 EP4CE10E22C8N 从 JTAG 到 AS 模式的完整配置链路讲透,重点拆解 MSEL、nCONFIG、DATA0 这几个关键引脚的实际用法,配合我踩过的坑和排查思路,争取让你看完就能自己设计配置电路、独立部署固件烧录流程。
1. EP4CE10E22C8N的启动链路:为什么FPGA要“外挂”一颗配置芯片
1.1 SRAM工艺决定了“每次上电都要重新加载”
先纠正一个最普遍的认知偏差:很多人拿到 EP4CE10E22C8N 之后,以为它跟 STM32 一样,程序烧进去就永久保存了。实际完全不是这样。Cyclone IV 系列是基于 SRAM 工艺的 FPGA,片上没有非易失存储器,每次掉电后逻辑配置信息全部丢失,上电时必须从外部重新加载一次配置数据。这就像一个没有硬盘的电脑,开机必须要从 U 盘或网络启动盘引导系统。
所以你会看到一块完整的 FPGA 开发板上,除了 EP4CE10E22C8N 之外,还躺着一颗 EPCS16 或 W25Q16 之类的小芯片。这颗 SPI Flash 就是 FPGA 的“引导盘”,专门用来存放配置位流(bitstream)。EP4CE10 的配置位流大小通常在一两兆比特这个量级,EPCS4 勉强能装但余量很小,所以绝大多数板子选用 EPCS16,容量充足,价格也没差多少。
1.2 三种常用配置途径:JTAG、AS、PS
Cyclone IV 支持的配置方式有好几种,但实际工程中你真正会高频用到的就三个:JTAG、AS、PS。
- JTAG模式:调试期最常用。通过 USB-Blaster 下载器直接访问 FPGA 内部的 SRAM 配置单元,配置数据进 RAM,掉电即失。适合开发阶段反复烧版本调试。
- AS模式(Active Serial,主动串行):上电后由 FPGA 主动从外部 SPI Flash 读取配置数据,一上电就自动加载,适合最终产品部署。
- PS模式(Passive Serial,被动串行):由外部单片机、CPU 或 CPLD 充当主机,把配置数据主动“喂”给 FPGA,适合嵌入式系统里面由上位处理器统一管理多颗 FPGA 的场景。
这三种模式之间并不是互斥关系,尤其是 JTAG,它几乎在任何配置模式下都能使用,优先级最高。这也是很多板子把 JTAG 和 AS 设计成共存的原因。
提示:EP4CE10E22C8N 引脚上的 MSEL 组合决定的是 AS/PS 等非 JTAG 方式的启动路径,JTAG 不受 MSEL 控制。所以哪怕你把 MSEL 拨到 PS 模式,JTAG 照样能下载,只是掉电后 FPGA 不会自动从 EPCS 加载而已。
1.3 配置数据的“目的地”决定了你的文件格式
很多新手分不清 .sof 和 .jic 的区别,其实只要抓住一点:配置数据到底要进去哪里。
.sof(SRAM Object File):目标器件是 FPGA 内部的 SRAM,JTAG 下载后立即可跑,掉电丢失。.jic(JTAG Indirect Configuration File):目标器件是外部 EPCS Flash,通过 JTAG 链路“绕道”FPGA,再由 FPGA 充当烧录器把数据写进 EPCS,上电后自动加载。.pof(Programmer Object File):目标器件也是 EPCS Flash,通常在 AS 模式下由 USB-Blaster 直接通过 AS 接口烧写。
如果你拿到一个开发板,第一次用 Quartus 生成 .sof 下载,跑了一会儿发现“为什么拔电再上电程序没了”,很正常,因为你根本没碰 AS 模式。要让 EP4CE10E22C8N 上电自动跑你写的逻辑,必须把配置数据落到外部 Flash 里。
2. MSEL[2:0]:三根小引脚,决定板子从哪个通道醒来
2.1 MSEL组合的底层逻辑
MSEL 是 Mode Select 的缩写,固定在 FPGA 芯片上的三个专用引脚,编号为 MSEL[2:0]。你别看它就是三根电平线,组合起来却能决定 FPGA 上电之后从哪条路径、以什么时序去加载配置。
EP4CE10E22C8N 所属的 Cyclone IV E 系列,常用配置模式对应的 MSEL 设置大概是下面这个样子:
| 配置模式 | MSEL[2] | MSEL[1] | MSEL[0] | 说明 |
|---|---|---|---|---|
| AS 模式 | 0 | 1 | 0 | FPGA 主动读取 EPCS,最常用 |
| PS 模式 | 0 | 0 | 0 | 外部主机主动写入,用于 CPU 引导 |
| JTAG 模式 | X | X | X | 不受 MSEL 约束,随时可用 |
注意,我给出的是实际工程中的常见取值。Cyclone IV 手册里有更完整的表格,还会根据 VCCIO 电压、是否启用压缩配置等因素做细分,比如高速 AS 模式、FPP 模式等。做产品设计时一定要翻阅对应器件型号的手册确认,不要凭一张速查表走天下。
以 AS 模式为例,MSEL[2:0] = 010,意味着 FPGA 上电后会把 nCSO、DCLK、ASDO 这些引脚切到与 EPCS 通信的状态,主动发起一次 SPI 读操作,把配置数据从 Flash 里拉出来。
2.2 PCB上MSEL如何处理:直接绑电平还是拨码开关
MSEL 引脚内部有弱下拉,但外部必须明确处理,不能悬空。处理方式主要有两种:
- 固定电平:量产产品确定只用 AS 模式后,直接把 MSEL[2] 接 GND、MSEL[1] 接 VCCIO(3.3V)、MSEL[0] 接 GND。简单可靠,少两个拨码开关,也少了误拨风险。
- 拨码开关或跳线:开发板常用。方便在 AS、PS、JTAG 之间切换调试,但问题也随之而来——很多板子出厂默认拨到 JTAG 模式,你直接烧 .jic 永远写不进 EPCS,因为 FPGA 根本不会去操作那条 Flash 链路。
我之前修过一块客户板子,现象是“明明 .jic 烧录提示成功,但重新上电就是不起来”。排查到最后发现是 MSEL 拨码开关接触不良,MSEL[1] 在 GND 和 VCCIO 之间反复横跳,FPGA 每次上电进入的模式完全是随机的。从那以后我在自己的板子上一律默认用固定电平,只有调试阶段才允许拨码开关存在。
2.3 MSEL 一定不能犯的错
MSEL 的处理有几个隐蔽点,容易在抄原理图时踩中:
- MSEL 引脚的参考电压是 VCCIO 所在 bank 的电压,不要接到 5V 上。Cyclone IV 的配置引脚基本都是 3.3V 电平,接 5V 轻则配置不稳定,重则打坏引脚。
- 如果 MSEL 用拨码开关,开关的走线尽量短,尽量靠近 FPGA 引脚,避免太长的走线引入噪声。尤其是 DCLK 频率比较高时,MSEL 上的毛刺可能导致 FPGA 误判模式。
- 不要在 MSEL 上串大阻值电阻再接电平,直接接或加 0 欧电阻即可。串了 10k 电阻再接 3.3V 虽然也能拉高,但抗干扰能力明显下降。
3. nCONFIG与两位“状态哨兵”:配置时序里的握手细节
3.1 三个引脚的分工
除了 MSEL,配置电路里还有一组“状态/控制”引脚,很多新手容易忽略,但它们才是配置流程能正常跑通的关键:
- nCONFIG:配置控制输入。低电平时强制 FPGA 复位配置状态机,所有配置相关寄存器清零;拉高后 FPGA 才开始重新配置。你可以把它理解成 FPGA 配置模块的“复位按键”。
- nSTATUS:开漏输出,同时也能被外部拉低。上电后 FPGA 会先把它拉低一段时间,然后释放拉高,表示“我准备好了,可以开始接收配置数据”。如果在配置过程中发生错误,FPGA 会把 nSTATUS 拉低,向外界报错。
- CONF_DONE:开漏输出。配置数据接收完成且校验通过后,FPGA 释放该引脚,配合外部上拉电阻拉高,表示配置成功。如果这个引脚一直是低,说明配置过程还没完成或者已经失败。
这三个引脚全部需要外部上拉电阻,典型值是 10kΩ,很多开发板习惯用 4.7kΩ,也能正常工作。上拉电阻接 VCCIO 的 3.3V 电平域,不是接 5V。
3.2 从 nCONFIG 拉高到 CONF_DONE 变高的完整过程
咱们以 AS 模式为例,梳理一版完整的上电配置时序,理解了这个时序,很多配置故障就能自己判断:
- 板上电,FPGA 在 nCONFIG 为低电平时保持复位状态,nSTATUS 和 CONF_DONE 都被拉低。
- 外部电路(或 FPGA 内部 POR 逻辑)释放 nCONFIG,FPGA 检测到 nCONFIG 上升沿后开始初始化配置引擎。
- nSTATUS 释放,被上拉电阻拉高,表示 FPGA 可以接受配置数据。
- AS 模式下,FPGA 通过 DCLK 产生时钟,拉低 nCSO 选中 EPCS,通过 DATA0 线逐个比特读取配置数据。
- 数据接收完成后,FPGA 对配置数据进行 CRC/ID 校验。校验通过,CONF_DONE 释放拉高。
- FPGA 进入初始化阶段,IO 状态按照设置切换,内部 RAM 初始化,最后进入用户模式。
这个过程看着简单,但每一步都有可能出问题。比如第 2 步 nCONFIG 如果被一个 RC 延时电路拉得太慢,上升沿不够陡峭,FPGA 就可能无法正常启动配置。比如第 4 步 DATA0 线上的信号质量太差,EMI 干扰一大,配置数据就会出错,表现出来的就是 nSTATUS 中途拉低、CONF_DONE 永远起不来。
3.3 nCONFIG 被忽略导致的重配置失效
有一个典型坑:很多人画原理图时,觉得 nCONFIG 反正内部有弱上拉,就直接悬空。Quartus 可能会告诉你“nCONFIG is not connected”,但也不报编译错误,于是板子在某些温度、某些供电条件下就是偶尔起不来。
我测试过一块板子,上电 10 次有 3 次配置失败,用示波器抓 nCONFIG 波形,发现上电瞬间有一定概率出现 1V 左右的毛刺,上升沿没有干净地利落起来。后来我在 nCONFIG 和 3.3V 之间挂了一个 10kΩ 上拉电阻,并在 nCONFIG 对地加了一个 1nF 电容滤毛刺,问题就消失了。所以无论从抗干扰还是从可维护性角度,nCONFIG 都建议显式上拉,不要依赖内部弱上拉。
另外,如果你的系统里有一块外部 CPU 或 CPLD 想控制 FPGA 重配置,nCONFIG 就是最直接的入口——拉低 2μs 以上,再拉高,FPGA 就会重新走一遍配置流程。这个特性在远程升级场景里很有用,配合 AS 模式先更新 Flash 内容、再触发一次重配置,就能实现“远程加载新固件”。
4. JTAG模式:调试器的入口,也是踩坑重灾区
4.1 四根线怎么接,为什么能“抢”到配置权
JTAG 模式只需要四根信号线:TCK、TMS、TDI、TDO,加上下载器的 GND 和 VCC 参考。接口经过 USB-Blaster 连到 PC 的 Quartus Programmer,就能完成 .sof 的在线下载。
JTAG 之所以优先级最高,是因为 FPGA 内部有独立的 JTAG TAP 控制器,它不受 MSEL 状态和配置状态机的控制。哪怕你的 FPGA 因为配置失败卡死了,只要 JTAG TAP 还活着,就能通过 JTAG 指令把配置数据强行塞进去。这也是很多“顺手救砖”操作的基础。
典型接法如下:
- TCK → TCK
- TMS → TMS
- TDI → TDI
- TDO → TDO
- GND → GND
注意,EP4CE10E22C8N 的 JTAG 引脚是专用引脚,不像 STM32 那样可以把 JTAG 引脚复用成 GPIO。FPGA 上 TDI、TDO、TMS、TCK 没有任何第二功能(至少 Cyclone IV 上是这样),所以你不必纠结“要不要禁用 JTAG 释放引脚”,这跟单片机的思路完全不同。
4.2 多器件菊花链与下载器连接
如果你一块板上同时挂了 CPLD 和 FPGA,或者多颗 FPGA 共用一条 JTAG 链路,就要注意菊花链的连接顺序。规则很简单:上一颗器件的 TDO 接到下一颗器件的 TDI,最后一颗器件的 TDO 回到下载器,TMS 和 TCK 并联到所有器件。
Quartus Programmer 会自动识别链路上的所有器件,前提是每个器件的 IDCODE 都能被正常读到。如果链路上某个器件 TDO 无输出,整个链路都会断开,表现为“无法访问 JTAG 链”。
USB-Blaster 的 10 针接口,除了四根 JTAG 信号和 GND,还有一个 VCC 引脚用于检测目标板电平。这个 VCC 不是给板子供电的,只是下载器用来做电平参考。有的下载器对目标板电压很敏感,如果板子电压不标准(比如 2.5V 的 JTAG 电平域),可能识别不到器件。
4.3 排查“can't access JTAG chain”的完整思路
报错Error (209040): Can't access JTAG chain,是新手遇到最多的 JTAG 问题。我的排查顺序已经固化成肌肉记忆了:
- 先用下载器自检。USB-Blaster 插上电脑,设备管理器里能看到 Altera USB-Blaster 端口。如果驱动感叹号,先解决驱动。
- 检查目标板供电。JTAG 链上的器件没上电,就是一堆死硅片,TDO 这种开漏输出根本没有电平。用万用表量 FPGA 核心供电和 IO 供电,确认 VCCINT 和 VCCIO 都在正常范围。
- 量 JTAG 引脚波形。TCK 在点击 Autodetect 的瞬间应该有方波产生,TMS 应该有电平跳变。如果 TCK 完全没波形,说明连接线或板上的焊点有问题。
- 检查 nCONFIG 状态。虽然 JTAG 不受 MSEL 控制,但如果 nCONFIG 一直处于低电平,TAP 控制器虽然存在,部分 Quartus 操作仍可能表现怪异。最直接的办法是手动把 nCONFIG 拉高再试。
- 检查链路上有没有其他器件干扰。如果 TDI 在中间某个器件中断,TDO 永远回不来。可以单点测试:把 USB-Blaster 的 TDI 直接接到目标 FPGA 的 TDI,TDO 单独接回下载器,排除其他器件。
这套流程走下来,绝大多数 209040 都能定位到“连接/供电/电平”三个环节之一,而不是程序本身。
5. AS模式的数据通道:DATA0、DCLK、nCSO、ASDO四条线的实际接法
5.1 一张表理清 FPGA 与 EPCS 的连线
AS 模式之所以叫“主动串行”,是因为整个数据读取过程由 FPGA 主导。FPGA 充当 SPI 主机,EPCS 充当 SPI 从机。两者之间的四条线,很容易被记住:
| FPGA 引脚 | EPCS 引脚 | 信号方向 | 作用 |
|---|---|---|---|
| DCLK | DCLK | FPGA → EPCS | SPI 时钟 |
| nCSO | CS# | FPGA → EPCS | 片选,低有效 |
| ASDO | ASDI | FPGA → EPCS | FPGA 向 Flash 发送命令/地址 |
| DATA0 | DATA | EPCS → FPGA | Flash 向 FPGA 返回配置数据 |
这里最容易被绕晕的就是 DATA0 和 ASDO 的方向。核心记忆点是:配置过程中绝大多数数据是从 EPCS 流到 FPGA 的,所以“数据线”DATA0 的方向是从 EPCS 到 FPGA;而 FPGA 要先向 EPCS 发送读命令和地址,所以还需要一条“从 FPGA 到 EPCS”的线,这条线叫 ASDO,对应 EPCS 的 ASDI。
你可以把 EPCS 当成一个 SPI Nor Flash,ASDO 就是 MOSI,DATA0 就是 MISO,DCLK 是 SCK,nCSO 是 CS#。这样一下子就好理解多了。
5.2 为什么 AS 模式下也要给 EPCS 留一个 JTAG 接口
实际产品里,固件升级最常见的路径是:通过 JTAG 接口把 .jic 文件烧进 EPCS。你可能会问:EPCS 本身就是 SPI Flash,直接用 SPI 编程器烧不行吗?当然行,但问题是 EPCS 通常已经焊死在板子上,专门引一个 SPI 编程接口不如复用 JTAG 来得省事。
用 .jic 烧录 EPCS 的完整流程是这样的:
- 在 Quartus 里用
.sof完成一次 JTAG 下载,把 FPGA 配置成一个“桥接器”。 - 这个桥接器会占用 FPGA 的 AS 引脚,通过 ASDO/DCLK/nCSO/DATA0 与 EPCS 通信。
- Quartus Programmer 把 .jic 里的 Flash 数据按地址依次发到 JTAG TDI,FPGA 桥接器再把数据转换成 SPI 命令,通过 ASDO 写进 EPCS。
- 烧写完成后,断开 JTAG,重新上电,MSEL 设为 AS 模式,FPGA 就从 EPCS 自动加载固件了。
这个过程听起来有点绕,但实际在 Quartus 里操作只需要两个动作:生成 .jic 文件,然后在 Programmer 里选中 .jic 并点 Start。不需要额外硬件,这也是 AS 模式最讨喜的地方。
5.3 生成 .jic 的具体步骤与参数
在 Quartus II 或 Quartus Prime 里,操作路径如下:
- 菜单 File -> Convert Programming Files。
- Programming file type 选择
JTAG Indirect Configuration File (.jic)。 - Configuration device 选择你板子上的 EPCS 型号,比如 EPCS16。
- Mode 选择
Active Serial(如果你用的是常规 AS 配置)。 - 在 Input files to convert 区域,选择 Flash Loader,并勾选目标器件
EP4CE10E22C8N。 - 添加 SOF Data,选中你已经编译好的
.sof文件。 - 点击 Generate,生成 .jic 文件。
- 打开 Programmer,添加 .jic 文件,勾选 Program/Configure,Start。
这里有个小细节:Flash Loader 列表里选择的目标器件型号要和实际 FPGA 一致。如果型号选错,桥接器可能无法正确驱动 AS 引脚,烧录会中途失败。我见过有人把 Cyclone IV 选成 Cyclone III,烧录 20% 左右就报错,就是这个原因。
5.4 AS模式烧录的具体波形:为什么慢但稳
AS 模式烧录 EPCS 的时钟频率是 FPGA 配置时的 DCLK,Cyclone IV 的 AS 配置时钟通常可以到几十 MHz,但实际烧录过程中,Flash 的擦写本身需要时间,所以整体速度不会很快。一颗 EPCS16 全片烧录加校验,大概需要几十秒到一分钟,视 USB-Blaster 链路质量而定。
6. 从JTAG到AS模式:工程中的切换流程与注意事项
6.1 原理图上如何做到“JTAG与AS共存”
一块靠谱的 EP4CE10E22C8N 板子,原理图上一定同时有 JTAG 和 EPCS 两套配置电路。它们之间没有冲突,因为 JTAG 引脚和 AS 引脚在物理上是分开的:
- JTAG 侧:TDI、TDO、TMS、TCK 连接到 10 针 JTAG 座。
- AS 侧:DCLK、nCSO、ASDO、DATA0 连接到 EPCS16,EPCS16 的地址和命令线由 FPGA 控制。
有一种常见误解是“JTAG 和 AS 要切换使用,必须用跳线选择”,其实芯片内部已经做好了仲裁。只要 EPCS 的数据线、时钟线没有被外部其他 SPI 主机占用,就可以同时接。唯一的注意点是:不要让外部 CPU 通过同样的 SPI 口同时操作 EPCS,否则双主机冲突,FPGA 或 CPU 都可能拉死总线。
6.2 项目里第一次切换到 AS 模式的完整操作清单
如果你的板子已经焊好、JTAG 能正常下载 .sof,现在要切换到 AS 模式,我建议按这个顺序操作:
- 确认 MSEL 设置为 AS:MSEL[2:0]=010。
- 编译工程,生成 .sof,确保功能正常。
- 用 Quartus 的 Convert Programming Files 生成 .jic 文件,Configuration device 选择 EPCS16。
- 打开 Programmer,从 JTAG 模式添加 .jic,勾选 Program/Configure,烧录。
- 烧录完成后,拔掉下载器,板子重新上电。
- 观察 FPGA 是否自动加载。如果 CONF_DONE 拉高、用户逻辑正常跑起来,说明 AS 模式配置成功。
如果第 5 步上电后 CONF_DONE 一直为低,多半问题出在 MSEL 或 EPCS 电路。用示波器抓 DCLK,看有没有时钟输出,有的话说明 FPGA 确实在尝试读 Flash;没有的话先查 MSEL 和 nCONFIG。
6.3 升级固件时的“双保险”策略
做过商业产品的朋友应该深有体会:直接用 .jic 烧录 EPCS 最怕烧到一半掉电,Flash 里残留一个半截镜像,FPGA 上电后加载失败,板子直接变砖。
为了避免这种情况,有些设计会把配置镜像做成 A/B 双备份。A 区放稳定的出厂固件,B 区放新升级固件。FPGA 上电先从 A 区加载,如果校验失败再从 B 区加载。这个功能在 Cyclone IV 的 AS 模式里可以通过配置分区和远程更新逻辑配合实现,操作比较复杂,但对于批量部署的设备非常值得。
如果你的产品暂时没做双备份,至少要在烧录 .jic 之前,先把可靠的低版本 .sof 通过 JTAG 下载一遍,保证 Flash Loader 桥接器能正常工作。这样即使 .jic 烧录中断,也不会把 Flash Loader 级别的功能弄坏。
6.4 关于“配置完成之后 AS 引脚能不能复用”
FPGA 配置完成后,AS 模式下的 DCLK、nCSO、ASDO、DATA0 这些引脚会释放,变成普通 IO,除非你在工程里把它们约束使用了。如果不使用,它们默认处于三态。
这里有个很多人忽略的问题:Cyclone IV 在配置完成后,所有未使用的 IO 默认会表现为高阻,而不是自动拉低。如果你的板子上 DCLK 之外又加了一颗外部芯片复用同一引脚,可能因为 FPGA 三态输出而出现不定电平,导致外部芯片误判。所以画原理图时,AS 信号线尽量独立,不要与其他外设共享。
7. 两个高频报错的现场排查:209040与209053(附一串其他问题)
7.1 Error (209040):Can't access JTAG chain
这个报错上面已经讲了不少,这里再补充一个容易忽略的高频原因:USB-Blaster 和目标板之间的线缆太长、太细。JTAG 的 TCK 频率如果跑得比较高,长线缆的寄生电容和串扰会直接把信号毁掉。我之前用一条 30cm 的杜邦线连接 JTAG,下载 .sof 时一会儿成功一会儿失败,换成一截 10cm 的短线后稳定了。
排查 209040 时还可以看一下 Quartus Programmer 的 Hardware Setup,确保当前选中了正确的下载器实例。电脑上如果同时装了 Quartus 和第三方 FPGA 工具链,下载器驱动可能会被抢占,Programmer 里就找不到设备。
7.2 Error (209053):Unexpected error
Error (209053): Unexpected error in ...这个报错比 209040 模糊得多,它经常出现在 AS 模式烧录或擦除 EPCS 的过程中,而不是普通的 JTAG 下载 .sof 时。
我遇到过一个很典型的案例:烧录 .jic 到 EPCS16,每次都在 60% 左右报 209053。排查过程如下:
- 先怀疑是 Quartus 版本的问题,换了个版本,依旧。
- 再怀疑 EPCS16 是假片,换过两颗,依旧。
- 用示波器抓 ASDO 和 DATA0 波形,发现 DATA0 上的回答信号幅度偏低,只有 1.8V 左右,而 FPGA 的 VCCIO 是 3.3V。
- 最后查到原因是 EPCS16 的 VCC 供电走线太细,过孔压降大,Flash 在写操作时需要大电流的时候,供电被拉低,导致内部电荷泵工作不正常。
解决办法很简单:把 EPCS 的供电走线加粗,并在 Flash 电源引脚旁边多放几颗 0.1μF 和 1μF 电容。从那以后我再也没见过这个 209053。
所以遇到 209053,优先怀疑三个方向:EPCS 供电是否干净、AS 四线连接是否可靠、EPCS 型号是否与 .jic 配置匹配。
7.3 常见错误速查表
| 常见现象 | 可能原因 | 优先排查动作 |
|---|---|---|
| JTAG Autodetect 找不到器件 | 供电、接线、驱动、nCONFIG 拉低 | 量电压、量 TCK/TMS 波形、拉高 nCONFIG |
| .sof 能下载但掉电丢失 | 正常现象,未配置 AS 启动 | 用 .jic 烧录 EPCS |
| .jic 烧录到一半失败 | EPCS 供电不足、Flash 型号错、Flash Loader 选错 | 示波器抓供电、核对型号 |
| 上电后 CONF_DONE 一直为低 | MSEL 设置错误、EPCS 无有效镜像、nSTATUS 被拉低 | 检查 MSEL 电平、抓 DCLK 波形 |
| 板子偶尔配置失败,温度高时更明显 | 时序余量不足、上拉电阻偏大、电源纹波大 | nCONFIG 滤波、增大上拉驱动力、优化电源 |
| 多器件 JTAG 链识别不全 | 菊花链中断、TDO 输出电平异常 | 从链首逐个测量 TDO |
7.4 为什么有时候“按复位键能恢复”
最后分享一个非常经典的现象:板子配置失败,但按一下复位键就能恢复。很多人觉得不可思议,其实原因很简单:复位键通常连着 nCONFIG,按下时把 nCONFIG 拉低,FPGA 退出错误状态并复位,松开后重新执行配置流程。如果 EPCS 里镜像没问题,只是上电瞬间电源建立时序太差,导致第一次配置失败,那么手动复位一次就能成功加载。
这个现象本身也是配置时序余量不足的信号。治本的办法是优化电源上电时序,或者给 nCONFIG 加一个适当的上电延时电路,让 FPGA 在电源稳定后再开始配置。治标的办法就是你现在这个“按复位键”的操作,修产品的时候千万别只停留在治标层面。
最后再分享一个我画板子时的“土办法”
以后只要画 EP4CE10E22C8N 的板子,我会在原理图第一页放一张“配置电路总览图”,把 MSEL、nCONFIG、nSTATUS、CONF_DONE、JTAG 四线、AS 四线、EPCS 供电全画在同一页,用不同颜色的网络标号分组。虽然有点占地方,但每次调试时扫一眼就能定位问题,不用翻十几页原理图找信号。这个习惯帮我省下了大量查线的时间,也建议入坑 FPGA 的朋友试试看。