ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

FPGA配置引脚从JTAG到AS模式:EP4CE10E22C8N上电加载与调试排查指南

FPGA配置引脚从JTAG到AS模式:EP4CE10E22C8N上电加载与调试排查指南 做FPGA的朋友应该都有过这种经历新板子焊好信心满满地插上USB-Blaster结果Quartus Programmer里直接弹出一行让人血压升高的“error (209040): cant access JTAG chain”。紧接着就是怀疑线松了、驱动坏了、芯片挂了折腾一下午最后发现元凶不过是某个配置引脚没接对。EP4CE10E22C8N这颗Cyclone IV E系列芯片算是入门级FPGA里非常能打的一颗料10K级逻辑单元、几百个引脚、价格也亲民不少学习板和工控板都在用。但它有个特别容易让新手栽跟头的地方——配置引脚看着不多MSEL、nCONFIG、DATA0、DCLK、nSTATUS、CONF_DONE这些信号单独拎出来都能看懂组合在一起就懵了为什么JTAG能下载却“固化”不了为什么明明烧了EPCS重新上电还是空跑为什么MSEL拨码开关随便拨一下整个下载链就断了这篇文章就围绕EP4CE10E22C8N把配置引脚从JTAG到AS模式的用法彻底捋一遍。不绕弯子直接讲清楚每个引脚干什么、为什么这么接、报错时怎么查。适合正在做板子调试、被配置问题折磨的嵌入式工程师也适合刚入门FPGA、想搞懂配置机制的学习者。1. FPGA上电后到底发生了什么先把配置流程跑通1.1 为什么EP4CE10上电后不会“自动运行”EP4CE10E22C8N属于SRAM工艺的FPGA这意味着它本身没有非易失存储能力。很多人第一次接触FPGA时都会有个困惑单片机烧完程序上电就能跑FPGA凭什么不行答案就在芯片内部结构上。FPGA的逻辑单元、布线资源、IO配置全部由SRAM单元控制这些SRAM单元掉电即失。上电瞬间整片芯片相当于一张白纸所有逻辑单元处于未定义状态IO引脚也没有正确的输出驱动。要让FPGA按照你的设计工作就必须在每次上电后从外部把配置数据“灌”进去。这个“灌”数据的过程就是配置Configuration。EP4CE10E22C8N支持三种主流方式JTAG、ASActive Serial、PSPassive Serial。不管哪种方式最终的配置数据源可以是一个文件、一颗EPCS配置芯片、甚至是一块单片机通过GPIO模拟时序来写入。注意配置数据不等于“程序”。FPGA没有“程序”这个概念只有比特流Bitstream。它描述的是芯片内部逻辑单元如何连接、查找表如何初始化、IO标准如何设置本质是一张“电路图纸”。1.2 配置状态机的三个关键节点Cyclone IV的配置过程可以用三个信号来观察nCONFIG、nSTATUS、CONF_DONE。理解了这三个信号就等于抓住了配置过程的主动脉。正常的上电配置流程是这样的上电后nCONFIG必须为高电平。如果nCONFIG被拉低芯片会保持在复位状态不启动配置。FPGA检测到nCONFIG为高后开始配置初始化nSTATUS被内部拉低表示“配置逻辑正在复位”。初始化完成后nSTATUS被释放。因为它是开漏输出外部上拉电阻会把它拉高此时FPGA开始真正接收配置数据。配置数据全部正确接收后CONF_DONE被释放外部上拉使其变高表示“配置完成”。最后FPGA进入初始化阶段内部寄存器复位、IO引脚使能然后进入用户模式跑起来你的设计。很多调试问题就出在这几个节点的电平上。比如nSTATUS一直是低大概率是配置数据源有问题或者芯片初始化失败CONF_DONE一直拉不高很可能是配置数据还没传完就断了或者开漏输出缺了上拉电阻。1.3 JTAG、AS、PS三种模式一句话说清区别这三种模式的核心区别在于“配置数据从哪来、由谁控制时序”。配置模式数据来源谁控制时钟典型场景是否需要MSEL设置JTAG外部主机通过TDI/TMS/TCK扫描链写入外部主机给出TCK调试、在线逻辑分析、直接下载到SRAMMSEL不影响JTAG本身但建议按目标模式设置AS板上EPCS串行配置芯片FPGA内部产生DCLK量产固化上电自动加载必须设置AS标准是010PS外部控制器CPU/CPLD/单片机外部控制器给出DCLK大型系统远程升级、多片级联必须设置PS标准是000JTAG模式最特殊它不依赖MSEL来选择数据源因为数据完全由JTAG链路里的TAP控制器主导。所以很多人在只使用JTAG下载时MSEL乱接甚至悬空也能正常工作。但这会导致一个隐患当你想从JTAG切换到AS模式时MSEL没设对固化完重新上电程序就是跑不起来。2. MSEL引脚决定“走哪条路”的总开关2.1 MSEL[2:0]真值表与硬件接法EP4CE10E22C8N上有三个MSEL引脚组合起来就是MSEL[2:0]。它们是硬接线引脚直接接高电平VCC或低电平GND不能在软件里配置。芯片在配置初始化阶段会采样这三个引脚的电平决定后续走哪种配置流程。Cyclone IV手册里的典型设置如下MSEL[2:0]配置模式说明000PS标准模式外部控制器逐bit送入配置数据DCLK由外部提供001PS快速模式时序更紧对数据建立时间要求高普通场景用000更稳010AS标准模式FPGA自动从EPCS读取数据DCLK由FPGA内部产生011AS快速模式DCLK频率更高要求EPCS型号支持一般用010就够实际项目里绝大多数人用的就是010AS标准和000PS标准。如果开发板上用了拨码开关或跳线帽来设置MSEL一定要对照丝印看清楚哪一位是MSEL2、哪一位是MSEL1、哪一位是MSEL0。丝印是MSEL0的引脚接到高电平对应的是二进制位的权重不是“1号开关”那么简单。注意MSEL的采样发生在配置开始阶段不是上电瞬间而是在nCONFIG变为高电平之后的初始化窗口内。所以如果你在运行中拨动MSEL开关不会立刻生效。改完MSEL后最好重新上电或者拉低nCONFIG再释放让芯片重新走一次配置流程。2.2 为什么说JTAG“不需要”MSEL有位做单片机转FPGA的朋友问过我既然JTAG下载不需要MSEL那我干脆把MSEL悬空行不行我的回答是不推荐哪怕短时间能用也别这么干。JTAG是一种串行扫描链协议TAP控制器靠TCK、TMS、TDI、TDO四个信号工作数据直接由外部主机USB-Blaster灌进FPGA的配置寄存器。这个过程中芯片已经处于JTAG模式MSEL确实不参与决策。但问题是你不可能永远只用JTAG。当你需要把配置数据固化到EPCS里或者希望板子上电后自动从EPCS加载程序FPGA就必须切换到AS模式。这时候FPGA内部的状态机要去控制EPCS芯片而EPCS芯片挂在FPGA的DATA0、DCLK、nCSO、ASDO这几个专用引脚上。这些信号的时序、片选逻辑全部由MSEL决定的AS模式来驱动。所以正确的做法是即使你大多数时间只跑JTAG也把MSEL设成010AS标准一来兼容后续固化需求二来避免悬空引脚引入不确定电平。2.3 MSEL相关的三个典型坑第一个坑是拨码开关方向搞反。很多板子的拨码开关ON方向对应低电平OFF方向对应高电平不看原理图的人很容易按直觉拨结果MSEL[2:0]从010变成了101芯片直接进入了一种未定义组合的状态配置自然起不来。第二个坑是MSEL引脚被复用成普通IO。有些紧凑型设计想省引脚把MSEL接到了单片机的GPIO上通过软件动态切换配置模式。理论上可以但必须在配置初始化之前让这些引脚电平稳定否则FPGA在采样窗口抓到错误电平后续行为完全不可控。至少我见过好几个因为这个原因导致JTAG链时好时坏的案例。第三个坑是改完MSEL后没有彻底断电。FPGA的配置逻辑在上电后进入待命状态如果你只是按一下复位键nCONFIG虽然重新拉高但如果MSEL电平被某个电容缓慢充放电拖住采样值就不稳定。稳妥的做法是断电等两三秒再上电。3. nCONFIG、nSTATUS、CONF_DONE三兄弟看懂这三个引脚基本能解决一半配置问题3.1 nCONFIG说重启就重启nCONFIG是配置逻辑的复位信号低有效。把它拉低FPGA立刻停止当前配置所有配置寄存器清零配置状态机回到初始状态。把它释放拉高FPGA重新开始配置流程。这个引脚的行为很像单片机的复位引脚但用途更频繁。在实际开发中我经常用一个按键或者单片机GPIO来控制nCONFIG这样每次修改配置后不需要反复插拔电源直接触发一次重配置即可。Altera官方手册里虽然没有特别严格的低电平时间要求但工程上一般拉低10μs以上再释放比较稳。另一个容易忽略的点nCONFIG还承担着“配置模式重载”的功能。如果MSEL是热切换方式切换完成后也需要拉低nCONFIG再拉高让芯片用新的MSEL电平重新采样。3.2 nSTATUS和CONF_DONE观察配置过程的两只眼睛如果说nCONFIG是“输入指令”那nSTATUS和CONF_DONE就是FPGA反馈给外界的“状态报告”。nSTATUS是配置状态输出开漏结构低电平表示配置出错或配置逻辑正在复位。正常流程中nCONFIG拉高后nSTATUS会先拉低一段时间表示FPGA正在做初始化复位之后释放为高表示可以接收配置数据。如果配置过程中数据CRC校验失败、位流格式不对、配置源异常nSTATUS会再次被拉低。CONF_DONE是配置完成指示同样是开漏输出低电平表示尚未配置完成。一旦配置数据全部接收完毕CONF_DONE被释放为高之后FPGA内部会完成IO初始化进入用户模式。用示波器同时抓这三个信号基本就能判断配置卡在哪一步nCONFIG一直低没人启动配置检查复位电路和上拉电阻。nCONFIG高但nSTATUS一直低芯片初始化失败检查电源和时钟或者芯片本身有问题。nSTATUS有拉高动作但CONF_DONE一直低数据源传输有问题AS模式下检查EPCS接线和DATA0JTAG模式下检查链路完整性。CONF_DONE拉高后系统还是不正常看nCEO级联、IO配置和用户设计逻辑。3.3 上拉电阻为什么不能省这两个开漏输出引脚外部必须接上拉电阻典型值10kΩ。如果省掉上拉电阻nSTATUS和CONF_DONE在释放状态时就是高阻电平浮空FPGA内部状态机可能卡死Quartus也会报各种莫名其妙的错误。有朋友问既然FPGA内部有弱上拉能不能不开外部上拉答案是不建议。内部弱上拉阻值通常几十kΩ在信号线上的驱动能力太弱容易受干扰。配置期间信号边沿慢还可能导致芯片误判电平。更何况这两个信号要上拉到哪个电压也有讲究一般接到对应Bank的VCCIO保证逻辑电平在正确范围内。3.4 如何手动触发一次重配置实际调试中我常用下面几种方式手动触发重配置按推荐度排序通过Quartus Programmer点击“Start”重新下载配置文件JTAG会强制FPGA重新配置。拉低nCONFIG引脚接地或接按键再释放。用单片机GPIO控制nCONFIG按需触发在线升级。对于AS模式也可以直接断电再上电EPCS会自动加载。如果你在做远程升级nCONFIG配合一个控制源单片机/CPLD几乎是标配先拉低nCONFIG让FPGA处于复位然后擦写EPCS写完再拉高nCONFIG让FPGA重新从EPCS加载新版配置。4. 从JTAG到AS模式DATA0、DCLK与EPCS的完整链路4.1 开发阶段为什么要用JTAG开发调试阶段代码改得很频繁这时候如果每次都烧写EPCS再重新上电效率太低。合理方案是先用JTAG下载.sof文件直接配置FPGA内部的SRAM。特点是速度快、掉电即失、改完立刻重来。JTAG模式下用到的引脚就那么几个TDI、TDO、TMS、TCK外加电源和地。它们和AS模式的数据引脚没有直接耦合。所以JTAG下载失败排查方向高度集中在链路通断、电平适配、USB-Blaster驱动这几个点上。有一种情况需要注意当你用JTAG连接时nCONFIG状态也会影响JTAG访问。有些版本Quartus在下载前会先触发配置复位如果nCONFIG被外部强制拉低JTAG链就访问不到目标器件报错“cant access JTAG chain”。4.2 AS模式固化的关键信号DATA0、DCLK、nCSO、ASDOAS模式的全称是Active Serial主动串行。主动体现在时钟由FPGA自己产生而不是外部给。FPGA上电后看到MSEL设置为010就会自动进入AS状态机主动发起对EPCS配置芯片的读操作。这时候就要用到一组专用信号DCLK配置时钟由FPGA内部产生串行输出给EPCS。Cyclone IV在AS模式下的DCLK频率一般在20MHz到40MHz范围具体取决于器件型号和配置选项。nCSO片选信号低有效接EPCS的nCS引脚相当于FPGA主动选中EPCS。ASDO地址/数据输出接EPCS的ASDI引脚FPGA通过它发送读命令和地址。DATA0串行数据输入接EPCS的DATA引脚EPCS把配置数据一位一位送回来。很多人对DATA0的理解有偏差以为DATA0是并行数据总线的一位。其实在AS模式下DATA0就是一个独立的串行输入引脚专门接收配置数据。只有当PS模式或FPP模式时DATA0才作为并行数据的低bit位出现。EPCS芯片本身也是个SPI Nor Flash只是Altera给它定制了一套更适合FPGA配置的指令集。平时也可以把它当作普通SPI Flash用但配置模式下FPGA会按内部状态机时序访问它你不需要手动处理。4.3 JTAG间接烧写EPCS是怎么回事EP4CE10E22C8N没有真正的“AS下载模式”单独引脚实际固化EPCS可以走两条路一条是直接用USB-Blaster连接到FPGA的JTAG引脚在Quartus Programmer里选择Mode为“JTAG”然后添加.pof文件勾选EPCS器件点击Start。Quartus会通过JTAG链先借助FPGA内部的一个配置通道把.pof文件“转发”写入EPCS。这个方式在Cyclone IV上很常用前提是FPGA必须能通过JTAG正常访问。另一条是自己拿单片机或逻辑分析仪直接读写EPCS的SPI接口。灵活性高但需要自行处理Altera的.pof文件格式和bit位反转对大多数人来说不划算。所以你会发现一个有意思的现象虽然叫“AS模式固化”但很多工程师实际是JTAG先连通FPGA再间接烧写EPCS。这就意味着JTAG链路不通你的AS固化计划也会跟着卡壳。4.4 从调试到量产的标准流程我自己的项目里从开发到量产一般这样走开发初期只连JTAG下载.sof文件跑功能验证。功能稳定后在Quartus里把编译目标切换成.pof选好EPCS型号。连接JTAGProgrammer选JTAG模式同时添加.sof和.pof勾选Program/Configure。通常先下载.sof保证FPGA处于可访问状态再烧写EPCS。烧写完成后断电重新上电观察是否自动加载成功。此时不要连USB-Blaster避免JTAG信号干扰。批量生产时用专门的下夹具或者烧录器直接对EPCS裸片编程不在板上依赖FPGA。这套流程每一步都有对应的坑第1步容易忽略MSEL设置导致后面固化失败第3步容易因为JTAG链不稳定报错第4步容易忘记改MSEL上电后FPGA还在等JTAG数据啥也不干。5. 实战接线EP4CE10E22C8N最小系统配置电路怎么搭5.1 配置相关引脚接线清单直接给出一份EP4CE10E22C8N配置电路的推荐接线清单。注意这里只列信号名和接法具体引脚编号以你手里的原理图库和Pin Planner报告为准。信号推荐接法说明MSEL[2:0]AS设置010即MSEL2接GNDMSEL1接VCCMSEL0接GND若需拨码切换用10kΩ电阻分别上拉/下拉nCONFIG接10kΩ上拉到VCCIO可并联一个按键到GND避免悬空上电自动进入配置等待nSTATUS接10kΩ上拉到VCCIO开漏输出必须上拉CONF_DONE接10kΩ上拉到VCCIO开漏输出必须上拉DATA0接EPCS的DATA串行数据输入DCLK接EPCS的DCLK串行时钟FPGA输出nCSO接EPCS的nCS片选FPGA输出ASDO接EPCS的ASDI地址/命令输出nCE直接接GND片选使能低有效多片级联时处理不同nCEO悬空单芯片或接下一级nCE级联输出TMS接10kΩ上拉到VCCIOJTAG模式选择TCK接10kΩ下拉到GNDJTAG时钟默认低电平更稳TDI接10kΩ上拉到VCCIO数据输入TDO悬空或远接数据输出VCCA接电源并加磁珠/LC滤波模拟电源配置PLL等VCCIO按Bank设计接对应电压配置引脚电平跟随Bank这里特别强调一下nCE和nCEO。nCE是芯片的配置使能端必须拉低否则芯片认为“没有我被选中”不会参与配置。多片FPGA级联时前一片的nCEO接后一片的nCE形成菊花链只有第一片nCE接地。5.2 电路设计要点设计配置电路时有几个容易被忽略的地方。第一个是VCCIO电平。EPCS配置芯片的工作电压要和FPGA对应Bank的VCCIO匹配。如果你的板子上EP4CE10E22C8N的Bank电压是3.3V那EPCS也选3.3V供电AS模式下DATA0、DCLK这些信号的电平范围才一致。如果把EPCS接在1.8V电压域而FPGA对应Bank是3.3V不是不能用但需要电平匹配最好用同电压。第二个是EPCS型号选择。EP4CE10的配置比特流一般在几百KB量级EPCS44Mbit约512KB通常够用。但如果你还想在EPCS里存一些用户数据、比如校准参数、启动日志什么的建议选EPCS16或更大容量成本差不太多留出余量。第三个是电源时序。Cyclone IV对VCCINT、VCCIO、VCCA的上电顺序有要求最稳的做法是保证VCCINT先于VCCIO上升或者同时上升。配置期间相关Bank的VCCIO如果没起来MSEL采样可能错误。实在调工程序麻烦就加个电源监控芯片或者用DC-DC的启停顺序来控制。5.3 USB-Blaster下载接线与设置USB-Blaster的标准10针接口信号排列如下以排针丝印为准不同转接板可能顺序不同TCKGNDTDOVCCTMSnCE空nCONFIGTDIGND连接时注意4脚和8脚有时被理解为目标板供电或者nCONFIG不同JTAG转接板定义略有差异。买线的时候认准“Altera 10-pin”或者“Cyclone IV兼容”的标签别和Xilinx的14针、ARM的20针搞混。Quartus里设置也简单Tools - ProgrammerHardware Setup选择USB-Blaster。下载.sof时Mode选“JTAG”下载.pof固化EPCS时可以选“JTAG”模式并添加EPCS器件也可以选“Active Serial Programming”模式直接擦写。很多初学者一看Mode里有“Active Serial”以为必须选这个才能固化其实在Cyclone IV上JTAG间接烧写EPCS是更常见、更稳的操作。下载线长度也是个隐形坑。USB-Blaster的TCK频率通常能到几MHz到20MHz但如果你拿一根20cm以上的杜邦线乱飞信号完整性会急剧恶化。遇到时好时坏的下载问题先把TCK频率调低在Programmer里设置或者换成屏蔽线、短杜邦线很多问题就消失了。6. 常见报错与排查把Quartus的错误信息当朋友6.1 error (209040): cant access JTAG chain这是所有FPGA玩家最先遇到的经典报错。原意是“无法访问JTAG链”也就是USB-Blaster发出去的扫描指令没有得到任何有效响应。排查优先级我一般这样排目标板有没有上电。JTAG也需要目标板供电只插USB-Blaster、板子没电必然报这个错误。USB-Blaster是否被系统识别。设备管理器里看不到的话重新装驱动。TMS、TCK、TDI、TDO信号有没有接反。这是杜邦线飞线时最容易犯的错。nCONFIG是否正常拉高。如果nCONFIG被拉低TAP控制器可能无法正常响应扫描。是不是JTAG链上有多片器件。有多个FPGA/CPLD串联时必须确保链路完整TDO接下一片TDI最后一篇TDO回USB-Blaster。TCK频率是否太高。长线、干扰大的场景把频率降到1MHz甚至更低。目标板上MSEL有没有异常。虽然JTAG不依赖MSEL但某些芯片在MSEL未定义组合时可能影响整体配置逻辑。6.2 error (209053): unexpected error in...这个错误通常伴随209040出现或者出现在JTAG访问EPCS烧写过程中。常见原因包含USB-Blaster连接不稳定、驱动版本和Quartus版本不匹配、目标芯片在配置过程中被复位、JTAG链上某个器件突然失效。我遇到过一次是USB-Blaster的线中间有断芯刚开始能识别一运行Programmer就报209053。换根线就好了。还有一次是USB口供电不足把USB-Blaster换到带独立供电的USB HUB上解决。软件层面可以把Hardware Setup里的JTAG Frequency调到最低降低时序压力再看是否是频率导致的偶发错误。6.3 CONF_DONE不拉高nSTATUS反复拉低配置过程中最典型的硬件问题就是CONF_DONE始终为低。用示波器量如果发现CONF_DONE有一定幅度的脉冲但始终不能稳定在高电平说明配置数据流中断了。AS模式下优先检查DATA0到EPCS的DATA通路。我修过一块板子问题出在PCB设计中DATA0走线过长而且旁边有一条DCLK走线串扰导致数据读回出错。解决方式是缩短走线、加地屏蔽、或者降低DCLK频率。另一种情况是EPCS里的数据本身不对。用JTAG读回EPCS内容和原始.pof对不上说明擦写过程有问题。这时重新擦除再写入通常能解决。6.4 AS模式重新上电后程序没跑起来这里说的“跑起来”指用户逻辑功能正常比如LED闪烁、串口输出。如果AS模式上电后什么反应都没有排查顺序是MSEL是否已经设置为010。这是最高频的坑没有之一。EPCS是否成功写入。用JTAG读取EPCS内容验证。nCONFIG和CONF_DONE电平是否正常。示波器抓上电瞬间波形看有没有完整的配置过程。会不会是FPGA跑了但IO初始化有问题。检查Bank的VCCIO有没有供电有些项目GPIO口没配置好逻辑执行了但外设不动作。配置芯片是否被其它信号干扰。比如JTAG排针上还插着USB-Blaster某些情况下会干扰上电自动加载。6.5 配置引脚被“借走”当普通IO的代价最后说一个比较进阶的坑。EP4CE10E22C8N的某些配置引脚在用户模式下是可以被当作普通IO使用的。比如nCEO、DATA0、DCLK、ASDO在配置完成后可以释放为通用IO。听起来省引脚但代价是——一旦你把这些引脚改成了用户IO重新配置时就会遇到冲突。这让我想起一个STM32圈里的老朋友。他用STM32F103时嫌PA13、PA14、PA15、PB3、PB4带JTAG功能碍事用GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE)把JTAG关掉只留SWD调试把多出来的引脚全当普通IO用。结果后来需要用JTAG调试又得重新配置恢复。FPGA里如果动了这些专用配置引脚逻辑上更麻烦因为Quartus在编译时会拒绝把配置专用引脚分配给普通信号除非你在Device and Pin Options里明确打开“Allow user pins in configuration”之类的选项。我的建议是除非引脚资源极度紧张否则不要打配置引脚的主意。为了一两个IO位牺牲整个调试和量产流程的稳定性不值得。最后再分享一个实践经验做了这么多年FPGA板级调试我的体会是配置问题不像逻辑功能问题那样容易推理它的现象往往是“下载失败”“上电不跑”“链时好时坏”这些问题大部分可以通过一个严谨的配置电路设计来避免。每次画EP4CE10E22C8N的最小系统板我都会在原理图阶段就检查三件事第一所有配置引脚有没有合理上拉/下拉尤其是nCONFIG、nSTATUS、CONF_DONE这三个第二MSEL有没有通过拨码开关或跳线露出调整手段方便调试期随时切换模式第三JTAG接口有没有按标准定义布局且靠近FPGA、走线短。这三点做好了后面能省下大量时间。如果你现在正被某个“看似简单却死活下载不了”的配置问题卡住不妨放下Quartus拿起万用表和示波器从nCONFIG开始沿着配置链路一路量过去。很多时候答案就藏在你一直没仔细看的那几根信号线上。
返回列表