ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ISE 14.7下Spartan-6 FPGA程序固化:bit转mcs与iMPACT烧录Flash实战

ISE 14.7下Spartan-6 FPGA程序固化:bit转mcs与iMPACT烧录Flash实战 1. 为什么还要折腾ISE固化这件事现在Vivado大行其道很多人觉得ISE已经是老古董了。但现实情况是大量高校实验室、工业控制板卡、军工项目上跑的仍然是Spartan-6、Virtex-5、Virtex-6这些老器件而支持它们的最后一代工具就是ISE 14.7。你手上如果有一块Spartan-6的开发板想让程序上电自动运行绕不开的一步就是把bit文件转成mcs文件再通过iMPACT烧进配置Flash。这个流程看起来简单但实际操作中坑特别多。我见过太多人卡在“Generate Programming File”之后不知道怎么往下走或者iMPACT里选错了PROM型号导致烧录失败又或者烧进去了但上电不启动。这篇内容就是把我这些年反复走这条路的经验整理出来从mcs文件生成的参数含义到iMPACT的操作细节再到常见报错的排查思路尽量讲透。适合谁看如果你手上有ISE工程、有Spartan-6或Virtex-5/6的板子、需要脱机运行程序那这篇就是写给你的。不需要你精通ISE但至少要能跑通综合和实现能生成bit文件。下面所有操作基于ISE 14.7Windows环境下实测。2. 核心概念拆解bit、mcs、Flash到底什么关系2.1 bit文件为什么不能直接烧到Flashbit文件是FPGA的配置数据它描述的是FPGA内部查找表、布线开关、Block RAM初始值这些资源的状态。JTAG下载bit文件时PC通过下载器把数据直接灌进FPGA的配置SRAM里掉电就没了。而Flash是掉电非易失的存储器FPGA自己不会主动去读Flash它需要一个“搬运工”——也就是FPGA内部的配置控制器在上电时从Flash里读取配置数据。问题在于Flash里存的数据格式和bit文件不一样。bit文件是给JTAG下载器用的而Flash里需要的是PROM格式的数据。mcs文件就是PROM格式的一种本质上是把bit文件的数据重新打包加上地址信息、校验和等变成Flash能按地址读取的格式。注意mcs不是唯一格式还有exo、tek、bin等但Xilinx工具链里最常用的是mcsiMPACT默认也认这个。2.2 配置Flash的类型和选型逻辑Spartan-6和Virtex-6常用的配置Flash是SPI Flash比如Micron的M25P系列、Winbond的W25Q系列。这些Flash通过SPI接口和FPGA连接FPGA上电后通过SPI时序读取数据。选型时要关注几个参数容量必须大于bit文件大小。比如Spartan-6 XC6SLX16的bit文件大约4Mbit那至少选8Mbit的Flash。实际选型建议留一倍余量因为mcs文件比bit文件略大而且后续可能升级。电压1.8V还是3.3V要和FPGA的VCCO_2配置bank电压匹配。封装SOIC-8、WSON-8等看板子上的焊盘。如果你用的是BPI Flash并行NOR Flash那mcs生成时的地址映射方式又不一样后面会提到。2.3 iMPACT在流程里的角色iMPACT是ISE自带的烧录工具它干两件事一是把bit转成mcs通过Create PROM File向导二是把mcs烧进Flash通过JTAG间接烧录。很多人以为iMPACT只能烧JTAG其实它支持通过FPGA的JTAG口间接对Flash编程——原理是iMPACT把烧录算法下载到FPGA里FPGA再模拟SPI时序去操作Flash。这个“间接烧录”是理解整个流程的关键。你并不是直接用下载器连Flash而是下载器连FPGAFPGA当中间人。3. 生成mcs文件参数怎么填为什么这么填3.1 从bit到mcs的完整操作路径在ISE里生成bit文件后不要关掉Project Navigator。直接打开iMPACTStart Programs Xilinx ISE Design Suite 14.7 ISE Design Tools iMPACT然后按下面的步骤走在iMPACT欢迎界面选“Create PROM File (PROM File Formatter)”点Next。选择存储类型SPI Flash、BPI Flash还是其他。Spartan-6板子通常选SPI Flash。选择PROM型号这里要选对容量和厂商。如果列表里没有你的Flash型号选一个容量相同的通用型号即可比如“M25P16”或“W25Q64”。添加bit文件点Add File选中你的.bit文件。设置输出格式选MCS文件扩展名.mcs。设置输出路径和文件名。点Generate等待完成。看起来简单但第3步和第5步有讲究。3.2 容量选择与地址对齐的坑选PROM型号时iMPACT会根据你选的容量自动计算地址范围。如果你选的容量比实际Flash小生成的mcs文件可能不完整如果选大了烧录时iMPACT会按你选的容量去擦除和写入可能超出实际Flash地址范围导致失败。我的经验是选和实际Flash容量完全一致的型号。如果列表里没有选一个容量相同的其他厂商型号。比如你的Flash是W25Q6464Mbit列表里没有Winbond就选Micron的M25P64容量一样SPI指令集兼容。另一个坑是地址对齐。SPI Flash的地址是线性的mcs文件里每条记录包含地址和数据。如果bit文件大小不是Flash页大小的整数倍iMPACT会自动填充0xFF。这本身没问题但如果你后续要在一个Flash里放多个bit文件比如Golden Image和Update Image就需要手动指定起始地址这时候地址对齐就很重要了。3.3 多个bit文件合并的地址分配有时候一个Flash里要放两个bit一个用于出厂恢复Golden一个用于现场升级Update。这时候在iMPACT里可以添加多个bit文件每个文件指定不同的起始地址。地址分配的原则是第一个bit从0x000000开始第二个bit从第一个bit结束后的下一个扇区边界开始。比如第一个bit占4Mbit那第二个从0x400000开始假设扇区大小64KB。具体地址要看Flash的扇区结构不能随便填。提示如果只是单bit固化不用管地址iMPACT默认从0开始。3.4 mcs文件格式解析生成的mcs文件是ASCII格式的每行以冒号开头后面跟数据长度、地址、记录类型、数据和校验和。比如:020000040000FA :10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00第一行是扩展线性地址记录第二行是数据记录。你不需要手动改这些但知道格式有助于排查问题。比如如果mcs文件里出现大量连续的FF说明bit文件有空洞这是正常的。4. 用iMPACT把mcs烧进Flash操作细节与避坑4.1 JTAG链路的建立烧录前先确保JTAG链路正常。打开iMPACT选“Boundary Scan”右键点空白处选“Initialize Chain”。如果链路正常你会看到FPGA和可能存在的PROM器件。如果只看到FPGA没关系因为我们是间接烧录不需要直接识别Flash。如果Initialize Chain报错检查这几点下载器驱动是否安装Platform Cable USB需要装驱动。JTAG线序是否正确TCK、TDI、TDO、TMS。板子是否上电。FPGA的JTAG口是否被其他电路占用。4.2 间接烧录Flash的步骤在iMPACT里右键点FPGA图标选“Add SPI/BPI Flash”。选择你生成的mcs文件。选择Flash型号和生成mcs时选的一致。右键点Flash图标选“Program”。在弹出的对话框里确认Erase、Program、Verify都勾上。点OK等待进度条走完。烧录时间取决于Flash容量和JTAG速度。64Mbit的Flash大概需要几分钟。如果中途报错先别急着拔线看错误信息。4.3 烧录选项的含义Erase擦除整个Flash或指定扇区。如果Flash之前烧过其他数据必须勾。Program写入mcs数据。Verify回读校验确保写入正确。建议勾上虽然多花时间但能提前发现问题。Blank Check擦除后检查是否全FF。如果擦除不干净Program会失败。注意如果Flash里有其他数据比如MAC地址、序列号不要选全片擦除选扇区擦除只擦你要写的区域。4.4 烧录失败的典型报错与排查报错信息可能原因解决方法“Failed to communicate with the Flash chip”SPI连线不通、Flash未上电、型号选错检查SPI四根线CS、CLK、MOSI、MISO、量Flash电压、换型号“Cannot load flash device description”iMPACT的Flash列表里没有对应型号选容量相同的其他型号或手动添加.dat文件“Program failed at address 0x...”Flash坏块、电压不稳、JTAG速度太快降低JTAG频率、换Flash、检查电源“Verify failed”写入数据与回读不一致重新擦除再写、降低速度、检查SPI信号完整性这些报错我几乎都遇到过。最头疼的是“Failed to communicate”有时候是SPI线太长导致信号反射缩短线或加串联电阻能解决。5. 上电不启动排查思路和实测经验5.1 上电不启动的常见原因烧录成功不代表上电就能跑。FPGA上电后从Flash读取配置数据这个过程叫“配置”。如果配置失败FPGA的DONE引脚不会拉高程序也不运行。常见原因配置模式设置错误Spartan-6的M[2:0]引脚决定配置模式。SPI Flash对应M[2:0]001。如果板子上拉电阻焊错模式不对FPGA不会去读Flash。Flash起始地址不对如果mcs不是从0x000000开始FPGA默认从0读读到的不是有效数据。SPI引脚映射错误FPGA的配置引脚是固定的比如Spartan-6的MOSI是V2、MISO是T2、CLK是U3、CS是T3。如果板子把这些脚接到别处配置失败。Flash电压不对1.8V的Flash接到3.3V的bank上通信失败。DONE引脚被拉低外部电路把DONE拉低FPGA认为配置未完成。5.2 用示波器抓SPI波形如果上电不启动最直接的排查方法是用示波器抓SPI波形。上电瞬间FPGA应该会在CS上产生一个下降沿然后在CLK上输出时钟MOSI上发送读指令0x03MISO上回读数据。如果CS没有动作说明FPGA根本没进入配置模式查M[2:0]。如果CS有动作但MISO没数据查Flash电压和连线。如果MISO有数据但DONE不拉高查配置数据是否正确。5.3 实测经验一个困扰我两天的案例有一次我烧完Flash上电不启动示波器抓波形发现FPGA发了读指令Flash也回了数据但DONE就是不拉高。折腾了两天最后发现是mcs文件生成时选错了PROM型号——我选了M25P16但实际Flash是W25Q16两者容量一样但扇区结构不同导致FPGA读到的数据错位。换成W25Q16对应的型号重新生成mcs问题解决。这个案例说明PROM型号必须和实际Flash严格匹配不能只看容量。如果列表里没有去Flash厂商官网下载.dat文件手动添加到iMPACT的Flash列表里。6. 进阶话题多镜像、压缩与加密6.1 多镜像启动MultiBootSpartan-6支持MultiBoot也就是Flash里放多个bit文件FPGA先加载第一个Golden如果失败或收到触发信号再加载第二个Update。实现方法是在生成mcs时添加多个bit文件指定不同起始地址然后在FPGA设计里加入MultiBoot逻辑。这个功能在远程升级场景很有用。但要注意Golden镜像必须从0x000000开始Update镜像的起始地址必须是扇区边界且不能和Golden重叠。6.2 bit文件压缩Spartan-6支持配置数据压缩能减小bit文件大小从而用更小的Flash。在ISE的Generate Programming File属性里把“Enable Compression”勾上重新生成bit再转mcs。压缩率通常在50%左右但会增加配置时间。提示压缩后的bit文件不能直接用于JTAG下载只能用于Flash固化。因为JTAG下载时FPGA不执行解压逻辑。6.3 配置数据加密Virtex-5/6支持AES加密防止bit文件被抄板。在ISE里生成加密bit需要额外的密钥文件然后转mcs时iMPACT会自动处理。这个流程比较复杂涉及密钥管理和efuse烧写一般项目用不到这里不展开。7. 常见问题速查表问题排查方向快速解决iMPACT识别不到FPGAJTAG线、驱动、供电换USB口、重装驱动、量JTAG电压生成mcs时找不到Flash型号iMPACT列表不全选容量相同的其他型号或手动添加.dat烧录时报“Failed to communicate”SPI连线、Flash电压、型号检查四根SPI线、量电压、换型号烧录成功但上电不启动配置模式、起始地址、DONE查M[2:0]、确认mcs从0开始、量DONEVerify失败信号完整性、Flash坏块降低JTAG速度、换Flash多镜像启动失败地址重叠、Golden镜像损坏检查地址分配、单独烧Golden测试8. 我个人在实际操作中的几点体会第一永远先验证JTAG链路再烧Flash。很多人一上来就烧Flash结果报错后分不清是JTAG问题还是Flash问题。先用Boundary Scan确认FPGA能识别再往下走。第二mcs生成后先检查文件大小。如果mcs文件大小和Flash容量差太多说明PROM型号选错了。比如64Mbit的Flashmcs应该在8MB左右。如果只有1MB肯定不对。第三烧录时把JTAG速度降到最低。iMPACT默认速度可能太快尤其是线缆较长时。在Output菜单里把Cable Setup的TCK频率降到1MHz能解决大部分通信失败问题。第四上电不启动先量DONE引脚。DONE是配置完成的标志如果上电后DONE一直是低说明配置没完成。这时候再抓SPI波形比盲目换Flash高效得多。第五保留一份Golden镜像的mcs文件。如果Update镜像有问题至少还能回退到Golden。我习惯在Flash里永远留一个稳定的Golden镜像地址从0开始Update镜像从0x400000开始。这个流程后续还可以扩展的方向用脚本自动化生成mcsiMPACT支持命令行或者把烧录步骤集成到CI/CD里批量生产时能省不少时间。
返回列表