☰
FPGA从JTAG到AS模式:EP4CE10E22C8N配置与排查实战
2026/10/5 1:20:38 网站建设 项目流程

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 模式010FPGA 主动读取 EPCS,最常用
PS 模式000外部主机主动写入,用于 CPU 引导
JTAG 模式XXX不受 MSEL 约束,随时可用

注意,我给出的是实际工程中的常见取值。Cyclone IV 手册里有更完整的表格,还会根据 VCCIO 电压、是否启用压缩配置等因素做细分,比如高速 AS 模式、FPP 模式等。做产品设计时一定要翻阅对应器件型号的手册确认,不要凭一张速查表走天下。

以 AS 模式为例,MSEL[2:0] = 010,意味着 FPGA 上电后会把 nCSO、DCLK、ASDO 这些引脚切到与 EPCS 通信的状态,主动发起一次 SPI 读操作,把配置数据从 Flash 里拉出来。

2.2 PCB上MSEL如何处理:直接绑电平还是拨码开关

MSEL 引脚内部有弱下拉,但外部必须明确处理,不能悬空。处理方式主要有两种:

  1. 固定电平:量产产品确定只用 AS 模式后,直接把 MSEL[2] 接 GND、MSEL[1] 接 VCCIO(3.3V)、MSEL[0] 接 GND。简单可靠,少两个拨码开关,也少了误拨风险。
  2. 拨码开关或跳线:开发板常用。方便在 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 模式为例,梳理一版完整的上电配置时序,理解了这个时序,很多配置故障就能自己判断:

  1. 板上电,FPGA 在 nCONFIG 为低电平时保持复位状态,nSTATUS 和 CONF_DONE 都被拉低。
  2. 外部电路(或 FPGA 内部 POR 逻辑)释放 nCONFIG,FPGA 检测到 nCONFIG 上升沿后开始初始化配置引擎。
  3. nSTATUS 释放,被上拉电阻拉高,表示 FPGA 可以接受配置数据。
  4. AS 模式下,FPGA 通过 DCLK 产生时钟,拉低 nCSO 选中 EPCS,通过 DATA0 线逐个比特读取配置数据。
  5. 数据接收完成后,FPGA 对配置数据进行 CRC/ID 校验。校验通过,CONF_DONE 释放拉高。
  6. 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 问题。我的排查顺序已经固化成肌肉记忆了:

  1. 先用下载器自检。USB-Blaster 插上电脑,设备管理器里能看到 Altera USB-Blaster 端口。如果驱动感叹号,先解决驱动。
  2. 检查目标板供电。JTAG 链上的器件没上电,就是一堆死硅片,TDO 这种开漏输出根本没有电平。用万用表量 FPGA 核心供电和 IO 供电,确认 VCCINT 和 VCCIO 都在正常范围。
  3. 量 JTAG 引脚波形。TCK 在点击 Autodetect 的瞬间应该有方波产生,TMS 应该有电平跳变。如果 TCK 完全没波形,说明连接线或板上的焊点有问题。
  4. 检查 nCONFIG 状态。虽然 JTAG 不受 MSEL 控制,但如果 nCONFIG 一直处于低电平,TAP 控制器虽然存在,部分 Quartus 操作仍可能表现怪异。最直接的办法是手动把 nCONFIG 拉高再试。
  5. 检查链路上有没有其他器件干扰。如果 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 引脚信号方向作用
DCLKDCLKFPGA → EPCSSPI 时钟
nCSOCS#FPGA → EPCS片选,低有效
ASDOASDIFPGA → EPCSFPGA 向 Flash 发送命令/地址
DATA0DATAEPCS → FPGAFlash 向 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 的完整流程是这样的:

  1. 在 Quartus 里用.sof完成一次 JTAG 下载,把 FPGA 配置成一个“桥接器”。
  2. 这个桥接器会占用 FPGA 的 AS 引脚,通过 ASDO/DCLK/nCSO/DATA0 与 EPCS 通信。
  3. Quartus Programmer 把 .jic 里的 Flash 数据按地址依次发到 JTAG TDI,FPGA 桥接器再把数据转换成 SPI 命令,通过 ASDO 写进 EPCS。
  4. 烧写完成后,断开 JTAG,重新上电,MSEL 设为 AS 模式,FPGA 就从 EPCS 自动加载固件了。

这个过程听起来有点绕,但实际在 Quartus 里操作只需要两个动作:生成 .jic 文件,然后在 Programmer 里选中 .jic 并点 Start。不需要额外硬件,这也是 AS 模式最讨喜的地方。

5.3 生成 .jic 的具体步骤与参数

在 Quartus II 或 Quartus Prime 里,操作路径如下:

  1. 菜单 File -> Convert Programming Files。
  2. Programming file type 选择JTAG Indirect Configuration File (.jic)。
  3. Configuration device 选择你板子上的 EPCS 型号,比如 EPCS16。
  4. Mode 选择Active Serial(如果你用的是常规 AS 配置)。
  5. 在 Input files to convert 区域,选择 Flash Loader,并勾选目标器件EP4CE10E22C8N。
  6. 添加 SOF Data,选中你已经编译好的.sof文件。
  7. 点击 Generate,生成 .jic 文件。
  8. 打开 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 模式,我建议按这个顺序操作:

  1. 确认 MSEL 设置为 AS:MSEL[2:0]=010。
  2. 编译工程,生成 .sof,确保功能正常。
  3. 用 Quartus 的 Convert Programming Files 生成 .jic 文件,Configuration device 选择 EPCS16。
  4. 打开 Programmer,从 JTAG 模式添加 .jic,勾选 Program/Configure,烧录。
  5. 烧录完成后,拔掉下载器,板子重新上电。
  6. 观察 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。排查过程如下:

  1. 先怀疑是 Quartus 版本的问题,换了个版本,依旧。
  2. 再怀疑 EPCS16 是假片,换过两颗,依旧。
  3. 用示波器抓 ASDO 和 DATA0 波形,发现 DATA0 上的回答信号幅度偏低,只有 1.8V 左右,而 FPGA 的 VCCIO 是 3.3V。
  4. 最后查到原因是 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 的朋友试试看。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询