1. 为什么易灵思FPGA的烧写值得单独写一篇
易灵思(Efinix)的Trion系列FPGA这两年在国内中小规模逻辑市场里出现频率越来越高,尤其是T120F324这颗料,324个引脚、120K逻辑单元,卡在了一个很舒服的位置——比Lattice ECP5的规模大,比Xilinx Artix-7的功耗和成本低,做图像采集、工业控制、多路接口桥接都够用。但很多人第一次拿到易灵思的开发板或者自己画的板子时,会卡在一个非常基础的问题上:程序怎么烧进去。
这个问题听起来简单,实际踩坑的人非常多。易灵思的烧写链路和Xilinx、Altera那套习惯不太一样,它的JTAG配置、SPI Flash固化、外部Host配置模式各有各的讲究,Efinity软件里的操作入口也和Vivado、Quartus不同。我见过有人把JTAG线序接反了折腾一下午,也见过有人固化了Flash但上电不启动,最后发现是配置模式引脚没拉对。T120F324这颗芯片的配置引脚分布和Trion系列其他封装还有细微差别,不查手册直接照搬别人的经验,很容易翻车。
这篇内容面向的是刚接触易灵思FPGA的工程师、学生,以及从Xilinx/Altera平台转过来的老手。我会把JTAG在线烧写和SPI Flash固化两条路径都拆开讲清楚,以T120F324为例,把引脚定义、Efinity软件操作、配置模式设置、常见报错排查都过一遍。你不需要有易灵思的使用经验,但最好对FPGA的基本开发流程有概念——知道综合、布局布线、生成比特流大概在干什么就行。
注意:本文所有操作基于Efinity软件(2023.2及以后版本),不同版本菜单名称可能略有差异,但核心逻辑一致。硬件以T120F324C4为例,其他封装型号请对照对应Datasheet的Pinout章节。
2. 易灵思的配置架构到底和别家差在哪
2.1 Trion系列的配置模式全貌
易灵思Trion系列的配置方式比Xilinx 7系列要简单一些,没有那么多花哨的模式组合。T120F324支持的主要配置模式有这么几种:
- JTAG模式:通过JTAG接口直接向FPGA的配置SRAM写入比特流,掉电丢失。适合调试阶段。
- 主动SPI模式(Active SPI):FPGA作为主机,主动从外部SPI Flash读取配置数据。这是产品化最常用的模式。
- 被动SPI模式(Passive SPI):外部控制器(比如MCU)作为主机,把配置数据推给FPGA。
- 被动并行模式:类似被动SPI,但走并行总线,速度快但引脚多。
T120F324的配置模式由几个专用引脚的电平组合决定,这些引脚在芯片上电复位期间被采样。具体是哪些引脚、什么组合对应什么模式,必须查T120F324的Datasheet。我见过有人直接拿Trion T20的配置引脚定义往T120上套,结果模式选错了,FPGA根本不启动。
2.2 为什么JTAG和Flash固化要分开讲
JTAG烧写和Flash固化解决的是两个不同阶段的问题。JTAG烧写是把比特流直接灌进FPGA内部的配置SRAM,断电就没了,但速度快、不需要额外器件,调试阶段改一版烧一版,非常方便。Flash固化是把比特流写进板载的SPI Flash,FPGA上电后自己从Flash里读配置数据,这才是最终产品的工作状态。
很多人容易混淆的一点是:JTAG烧写成功不代表Flash固化也能成功。JTAG走的是FPGA的JTAG控制器,Flash固化走的是FPGA的SPI主控制器加外部Flash芯片,两条链路的硬件连接、软件设置、时序要求都不一样。JTAG能通,只说明FPGA的JTAG部分和下载器没问题,Flash那边可能还有一堆坑等着。
2.3 T120F324在配置上的特殊之处
T120F324是324引脚的FBGA封装,配置相关的引脚分布在Bank 0和Bank 1区域。和Trion系列小封装相比,T120F324的配置引脚更完整,支持的模式也更多。但这也意味着引脚复用的可能性更多,如果你在原理图设计阶段没有把配置引脚预留好,后面想改配置模式就很麻烦。
具体来说,T120F324的配置相关引脚包括:
| 引脚名称 | 功能 | 注意事项 |
|---|---|---|
| CRESET_N | 配置复位,低有效 | 需要外部上拉,通常10K到VCC |
| CDONE | 配置完成指示 | 需要外部上拉,配置成功后输出高 |
| CSI_B | 片选信号(被动模式用) | 主动SPI模式下作为Flash片选输出 |
| CSO_N | 片选输出(主动模式用) | 连接Flash的CS引脚 |
| DCLK | 配置时钟 | 主动模式下由FPGA输出 |
| DATA0 | 配置数据输入 | 连接Flash的MOSI或DO |
| DATA1 | 配置数据输出 | 连接Flash的MISO或DI |
| MODE[2:0] | 配置模式选择 | 上电时采样,决定配置模式 |
这些引脚在T120F324上的具体球号,必须查对应版本的Pinout文档。不同批次的芯片可能有细微差异,以官方最新Datasheet为准。
3. JTAG在线烧写:从接线到点灯的全流程
3.1 硬件连接:JTAG线序和下载器选择
易灵思FPGA的JTAG接口是标准的4线制:TCK、TMS、TDI、TDO,加上可选的TRST_N。T120F324的JTAG引脚是专用引脚,不复用为普通IO,这一点比某些需要特殊配置才能启用JTAG的芯片要省心。
下载器方面,易灵思官方有Efinix USB Downloader,但价格不便宜。实际上大部分通用的FTDI方案下载器都能用,关键是Efinity软件要能识别到。我用的是FT2232H方案的通用下载器,在Efinity里选择FTDI JTAG模式就能连上。如果你手头有Xilinx Platform Cable或者Altera USB-Blaster,理论上也能用,但需要在Efinity里选对下载器类型,有时候还要手动指定VID/PID。
接线的时候注意几点:
- TCK和TMS需要上拉,通常各接一个4.7K到VCC。TDI和TDO是否需要上拉取决于你的下载器驱动能力,保险起见也加上。
- JTAG的GND必须和板子共地,这个不用多说,但实际调试时因为没共地导致连不上的情况我见过不止一次。
- 如果板子上JTAG接口是排针,注意线序。易灵思的JTAG排针定义和Xilinx的14针接口不一样,别直接拿Xilinx的转接板往上插。
实操心得:我习惯在JTAG的TCK线上串一个33欧姆的电阻,靠近FPGA端放置。这个电阻可以抑制信号反射,尤其是在JTAG线缆较长或者板子上有多个JTAG器件级联的时候,能明显提高连接稳定性。这个做法在Xilinx的文档里也有提到,易灵思同样适用。
3.2 Efinity软件里的JTAG烧写操作
打开Efinity,工程综合布局布线完成之后,生成比特流文件(.bit)。然后按这个流程走:
- 菜单栏选择Tools -> Programmer,打开编程器窗口。
- 在编程器窗口里,点击Add Device,选择JTAG模式。
- 如果下载器连接正常,Efinity会自动识别到FPGA的IDCODE。T120F324的IDCODE在Datasheet里有,识别到之后会显示芯片型号。
- 点击Add File,选择你生成的.bit文件。
- 勾选Program和Verify,点击Start。
如果一切正常,进度条会走完,然后提示Program Successful。这时候FPGA应该已经按照你的设计在工作了。如果是点灯工程,LED应该亮了。
但实际往往没那么顺利。最常见的报错是"JTAG chain detection failed"或者"Unable to detect device"。遇到这种情况,按这个顺序排查:
- 先确认下载器驱动装好了。Windows设备管理器里能看到FTDI或者对应的USB设备,没有黄色感叹号。
- 确认Efinity里选的下载器类型和实际硬件匹配。FTDI方案选FTDI,官方下载器选Efinix。
- 检查JTAG线序。TCK对TCK,TMS对TMS,TDI对TDO(注意是交叉的),TDO对TDI。
- 量一下TCK和TMS的上拉电压,应该在VCC附近。如果只有1V左右,说明上拉电阻没焊或者阻值太大。
- 如果板子上有多个JTAG器件,确认JTAG链的拓扑。Efinity支持多器件链,但需要在Programmer里正确配置链上器件顺序。
3.3 JTAG烧写的局限和适用场景
JTAG烧写最大的好处是快,改一版烧一版,几秒钟的事。但它有两个硬伤:一是掉电丢失,二是占用JTAG引脚。在产品化阶段,JTAG接口通常不会引出来,或者引出来也只是为了产线测试。
所以JTAG烧写主要用在两个场景:一是开发调试阶段,频繁修改逻辑;二是产线首次烧写Flash,通过JTAG把比特流间接写入Flash(Efinity支持通过JTAG对Flash进行编程,这个后面讲)。
注意:JTAG烧写的时候,如果FPGA已经在上电运行某个设计,直接烧写新比特流会导致FPGA瞬间进入未定义状态。如果板子上有电机、继电器之类的执行机构,务必先断电或者确保安全。我吃过这个亏,调试一个电机驱动板的时候直接JTAG烧写,电机突然抖了一下,差点把联轴器打坏。
4. SPI Flash固化:让FPGA上电自启动
4.1 Flash选型和硬件设计要点
T120F324的主动SPI模式支持标准SPI Flash,容量根据比特流大小来选。T120F324的比特流大概在4MB到8MB之间,取决于设计复杂度。保险起见选16MB(128Mbit)的Flash,比如Winbond W25Q128或者Micron N25Q128,这些都是经过验证的型号。
硬件连接上,主动SPI模式的典型接法是:
- FPGA的CSO_N接Flash的CS#
- FPGA的DCLK接Flash的CLK
- FPGA的DATA0接Flash的DI(MOSI)
- FPGA的DATA1接Flash的DO(MISO)
- Flash的WP#和HOLD#需要上拉到VCC,否则Flash可能进入写保护或者保持状态
这里有一个容易忽略的点:T120F324的DATA0和DATA1在主动SPI模式下是FPGA的输出和输入,但在被动模式下方向是反的。如果你原理图设计时没注意,把DATA0和DATA1接反了,主动模式就读不到数据。我建议在原理图里明确标注每个引脚在目标模式下的方向,避免混淆。
另外,Flash的电源去耦要做好。SPI Flash在读写瞬间电流会有波动,如果去耦电容不够,可能导致配置失败。通常每个电源引脚配一个0.1uF的陶瓷电容,再加一个10uF的钽电容在Flash电源入口。
4.2 用Efinity生成Flash烧写文件
Efinity不能直接把.bit文件烧进Flash,需要先转换成Flash编程文件。具体操作:
- 在Efinity工程里,确保已经生成了比特流。
- 菜单栏选择Tools -> Flash Programming File Generator(不同版本可能叫法不同)。
- 选择目标Flash型号,或者手动输入Flash的容量和页大小。
- 选择输入文件为你的.bit文件。
- 生成输出文件,通常是.bin或者.hex格式。
这个转换过程实际上是把比特流按照Flash的页大小进行分包,并添加必要的头部信息。Efinity会自动处理地址映射,你不需要手动计算。
实操心得:生成Flash文件的时候,我习惯把输出格式选成.bin,因为后续用其他工具(比如Flash烧写器)的时候.bin更通用。如果只用Efinity烧写,.hex也行。另外,生成的.bin文件建议用二进制查看器打开确认一下头部数据,正常的比特流头部应该有易灵思的标识,如果全是FF或者00,说明转换过程有问题。
4.3 通过JTAG间接烧写Flash
这是最常用的Flash固化方式:JTAG连着FPGA,FPGA内部有一个SPI控制器,Efinity通过JTAG把Flash编程数据传给FPGA,FPGA再通过SPI接口写入Flash。
操作流程:
- 打开Efinity Programmer。
- 在Programmer窗口里,选择Add Device -> JTAG,识别到FPGA。
- 然后选择Add Device -> SPI Flash,这时候Efinity会通过JTAG去探测Flash的ID。
- 如果Flash ID识别成功,会显示Flash型号和容量。
- 添加之前生成的Flash编程文件(.bin或.hex)。
- 勾选Program和Verify,点击Start。
烧写时间取决于Flash容量和JTAG速度,16MB的Flash大概需要几分钟。烧完之后,把板子断电再上电,FPGA应该自动从Flash加载配置。
如果Flash ID识别失败,常见原因有:
- Flash的SPI引脚和FPGA连接有问题,用万用表量通断。
- Flash的WP#或HOLD#没上拉,Flash处于保护状态。
- FPGA的配置模式引脚设置不对,没有进入主动SPI模式。
- Flash芯片本身坏了,换一片试试。
4.4 配置模式引脚的设置
这是Flash固化最容易翻车的地方。T120F324的配置模式由MODE[2:0]引脚在上电复位期间的电平决定。具体什么组合对应主动SPI模式,必须查T120F324的Datasheet。我见过有人把MODE引脚悬空,结果FPGA进入了一个未定义模式,什么都不干。
通常的做法是:MODE引脚通过电阻上拉或下拉到固定电平,不要悬空。具体阻值可以用4.7K或10K。上电时FPGA内部会采样这些引脚,然后锁定配置模式。
另外,CRESET_N引脚需要外部上拉,通常10K到VCC。如果CRESET_N被拉低,FPGA会一直处于复位状态,不启动配置。有些板子设计了复位按键,按键按下时拉低CRESET_N,松开后FPGA重新配置。这个设计没问题,但要确保按键没有卡住或者漏电。
CDONE引脚是配置完成指示,配置成功后输出高。可以接一个LED来指示配置状态,调试的时候很直观。CDONE也需要外部上拉,否则可能一直是低。
5. 常见问题排查:从报错到点灯
5.1 JTAG连接类问题速查
| 报错信息 | 可能原因 | 排查方法 |
|---|---|---|
| JTAG chain detection failed | 下载器驱动未装好 | 检查设备管理器,重装驱动 |
| Unable to detect device | JTAG线序接反 | 核对TCK/TMS/TDI/TDO |
| IDCODE mismatch | 芯片型号选错 | 确认Efinity里选的型号和实际一致 |
| JTAG communication error | TCK频率太高 | 降低JTAG时钟频率试试 |
| Device locked | 芯片被加密 | 需要先解锁或者换芯片 |
JTAG时钟频率是一个容易被忽略的点。Efinity默认的JTAG频率可能比较高,如果板子走线不好或者线缆太长,高速下容易出错。在Programmer设置里可以把JTAG频率降到1MHz甚至更低,先保证连通性,再逐步提高。
5.2 Flash固化类问题速查
| 报错信息 | 可能原因 | 排查方法 |
|---|---|---|
| Flash ID read failed | SPI引脚连接问题 | 量通断,检查焊接 |
| Flash program failed | WP#/HOLD#未上拉 | 确认上拉电阻 |
| Verify failed | Flash质量问题 | 换一片Flash |
| Config failed after power cycle | 配置模式引脚错误 | 查Datasheet确认MODE设置 |
| CDONE never goes high | CRESET_N被拉低 | 检查复位电路 |
Flash固化失败后,FPGA上电不启动,这时候JTAG通常还是能连上的(因为JTAG是独立于配置模式的)。所以排查的时候可以先用JTAG确认FPGA还活着,然后再查Flash那边的问题。
避坑技巧:我习惯在板子上把Flash的CS、CLK、DI、DO四个信号各引一个测试点出来。调试的时候用示波器或者逻辑分析仪抓一下上电时SPI总线上的波形,能直接看到FPGA有没有发出读命令、Flash有没有回应。这个方法比盲猜高效得多。如果没有逻辑分析仪,用示波器看CS和CLK也行,至少能确认FPGA在尝试配置。
5.3 上电不启动但JTAG能连的排查思路
这种情况说明FPGA本身没问题,JTAG链路正常,问题出在配置模式或者Flash链路上。按这个顺序查:
- 确认MODE引脚的电平。用万用表量上电瞬间的电平,注意要在上电后几毫秒内量,因为FPGA采样后就锁定了。如果万用表反应不够快,用示波器抓。
- 确认CRESET_N在上电后能正常拉高。如果一直是低,FPGA不会启动配置。
- 确认Flash的电源正常。量Flash的VCC引脚,应该在3.3V左右。
- 用示波器抓SPI总线,看FPGA有没有发出读命令。如果没有,说明FPGA没有进入主动SPI模式,回到第1步查MODE引脚。
- 如果FPGA发出了读命令但Flash没回应,查Flash的CS和CLK连接,以及Flash是否处于保护状态。
5.4 关于配置时间的注意事项
T120F324从Flash加载配置需要一定时间,通常在几十毫秒到几百毫秒之间,取决于比特流大小和SPI时钟频率。如果板子上有其他器件依赖FPGA的IO状态,需要确保这些器件在FPGA配置完成之前不会误动作。
一个常见的做法是用CDONE信号去使能其他器件的电源或者复位。CDONE拉高之前,其他器件保持复位状态。这样能避免FPGA配置期间IO不确定导致的问题。
6. 一些实战中攒下来的经验
6.1 关于Efinity版本的坑
Efinity的版本更新比较快,不同版本对T120F324的支持程度不一样。我遇到过某个版本生成的比特流在JTAG烧写时正常,但转成Flash文件后烧进去不启动,换了一个版本就好了。所以如果你遇到莫名其妙的问题,先确认Efinity版本是不是最新的稳定版。易灵思官网会标注每个版本支持的器件列表,下载之前看一眼。
另外,Efinity的工程文件在不同版本之间不完全兼容。如果你从别人那里拿到的工程,最好问清楚用的哪个版本,避免打开后各种报错。
6.2 JTAG和Flash共存时的注意事项
有些板子设计的时候,JTAG接口和Flash的SPI引脚是复用的。比如FPGA的某个IO在JTAG模式下是TDI,在主动SPI模式下是DATA0。这种复用设计在T120F324上不常见,因为T120F324的JTAG引脚是专用的,但SPI引脚可能和其他功能复用。
如果你的设计里SPI引脚复用了,要确保在配置阶段这些引脚不会被其他逻辑驱动。FPGA在配置期间,普通IO都是高阻态,所以一般没问题。但如果板子上有外部器件驱动这些引脚,就可能冲突。
6.3 批量生产时的烧写方案
小批量的时候用JTAG逐个烧写还能接受,但批量生产时效率太低。常见的做法是用离线烧写器先把比特流烧进Flash,然后再把Flash焊到板子上。这样产线上只需要焊接,不需要烧写。
离线烧写器选择很多,国产的通用编程器基本都支持SPI Flash。关键是烧写文件要正确,用Efinity生成的.bin文件直接烧就行。烧完之后最好抽检几片,焊到板子上确认能启动。
如果Flash是焊在板子上的,也可以用产线夹具通过JTAG批量烧写。Efinity支持命令行模式,可以写脚本自动化烧写流程。具体命令在Efinity的安装目录下有文档,核心就是调用programmer的可执行文件,传入工程文件和烧写参数。
6.4 关于T120F324的散热和电源
虽然和烧写不直接相关,但T120F324在配置期间和正常工作时对电源的要求比较高。核心电压和IO电压的纹波如果太大,可能导致配置失败或者运行不稳定。我在一个项目里遇到过配置成功率只有80%的情况,后来发现是核心电压的纹波超过了100mV,换了一个低ESR的电容就好了。
所以如果你遇到偶发性的配置失败,除了查配置链路,也量一下电源纹波。尤其是核心电压,T120F324的核心电压比较低,对纹波更敏感。
6.5 一个容易被忽略的细节:Flash的扇区保护
有些SPI Flash出厂时默认开启了扇区保护,或者之前被其他程序写入了保护位。这种情况下,Efinity烧写时会报"Flash program failed"或者"Verify failed"。解决方法是用Flash的专用命令解除保护,或者用编程器全片擦除一次。
Efinity的Programmer里通常有擦除选项,烧写前先执行一次全片擦除。如果擦除也失败,就得用外部编程器处理了。我建议在原理图设计时把Flash的WP#和HOLD#引出来,通过跳线或者测试点控制,这样调试的时候灵活很多。
7. 从JTAG到Flash的完整检查清单
最后整理一个实操检查清单,从拿到板子到Flash启动,按顺序过一遍:
- 确认Efinity版本支持T120F324,工程器件型号选对。
- 检查JTAG连接:线序、上拉、共地。
- JTAG烧写测试比特流,确认FPGA能工作。
- 确认配置模式引脚MODE[2:0]设置正确,对应主动SPI模式。
- 确认CRESET_N和CDONE有上拉。
- 确认Flash的WP#和HOLD#上拉。
- 生成Flash编程文件,确认文件头部数据正常。
- 通过JTAG烧写Flash,先擦除再编程再校验。
- 断电重启,观察CDONE是否拉高。
- 如果CDONE不拉高,用示波器抓SPI总线,按第5章的排查思路走。
这个清单看着简单,但每一步都有细节。我自己的习惯是在原理图设计阶段就把这些检查点标注出来,PCB打样回来之后先量一遍关键信号的电平,再上电调试。这样能提前发现大部分硬件问题,比软件层面折腾半天要高效得多。
易灵思的FPGA在性价比上确实有优势,但工具链和生态还在完善中,烧写这块的文档不如Xilinx那么详尽。希望这篇内容能帮你少走点弯路。如果你在T120F324上遇到了其他烧写相关的问题,欢迎一起交流。