当我们在产品中使用FPGA时,我们大概有以下几种方式来进行量产,1、使用USB blaster进行烧写;2、使用烧写器进行烧写,将flash烧写后进行贴片焊接; 3、进行板上烧写;4、使用被动加载方式,不需要提前对fpga进行量产。
第一种方式使用usb blaster,这种方式是在进行调试时使用的烧写方法,不太适合批量生产使用,而且对于有高度要求的场合不可能在最终产品上焊接牛角座来进行烧写。
第二种方式使用先烧写器对flash进行烧写,然后进行贴片焊接,这是一种比较常用的方法。
第三种方式进行板上烧写,这有一个前提就是板上不仅有fpga还有其他MCU等,而且要占用MCU的一部分引脚(SPI和GPIO),对于板上有MCU而且GPIO资源够用的情况下简直是不二选择。而且该方法便于在线更新升级。
第四种方式就要求必须要有MCU的支持,每次上电时对FPGA进行数据配置,这种方式可以节约FPGA的配置flash,但缺点是需要每次上电都进行配置,当配置数据比较大时(很多都上M)配置时间显然有些长。这种方式一般是将FPGA的工程比特文件放在MCU片内,在量产MCU时一起烧写。
这里不讨论第一种和第四种方式了,简要来说一下第二种和第三种方式。其实这两种方式有些相似之处,第三种方式的相当于实现了一个板上烧写器的功能,相当于每块板子都带了一个烧写器。也可以说我们的第三种方式将MCU拿下来就可以做一个烧写器。一言以蔽之,我们这里讲的是做一个altera FPGA所使用flash的烧写器。
烧写器重点分为以下几块工作:1、用于量产的上位机程序,主要负责将工程比特文件下发给下位机; 2、下位机MCU对量产功能的支持;
上位机程序可以使用USB或者串口方式下发数据,如果要做一个单独的烧写器那么肯定要选USB了,这个速度比较快。这一块没什么好说的。
FPGA配置的flash,一般都是SPI接口,比如EPCS,因此MCU要支持SPI接口,单独的烧写器肯定要选择一款带有SPI接口的MCU,板载的就有没有可能选择性就小多了,不过这都无所谓,只要有GPIO就可以使用模拟SPI。
各个系列略有不同,这里给出一个Cyclone III/IV的示意图
Pin Descriptions for FPGA Configuration from SPI Flash
这是FPGA从flash主动配置的管教功能描述,这不是我们关心的,我们只关心fpga什么状态下我们可以对flash进行操作,不影响fpga功能。如果要进行在线升级什么的这是要考虑的。对于单独的烧写器那就不关fpga什么事了。nCONFIG拉低将使FPGA已经配置的数据丢失,所有IO管脚呈三态。当拉高时fpga重新配置数据,如果要复位fpga可以使用这个引脚。 接下来是我们下位机的软件处理流程(对于板载烧写)。1. 将FPGA nCONFIG拉低2. 将从上位机接受到的数据从flash 0地址开始顺序写入3. 将与FPGA nCONFIG连接的GPIO设置为高阻态或输入态,将与flash连接的SPI所有接口设置为高阻态或输入态。 那么,我们需要烧写什么格式的工程文件呢,使用usb blaster时AS模式使用pof文件,JTAG模式时使用jic或者sof文件。那么我们使用我们自己的烧写器使用什么文件呢?答案是rbf(Raw Binary File)文件!无论什么格式的文件下载最后下载到FPGA的文件都是rbf的原始二进制文件。因为FPGA上电,无论工程系统大小都会初始化整片FPGA,所以对于同一款FPGA,无论设计大小最后的烧写文件大小都是固定的。 如何得到rbf文件呢?请移步这里
https://bbs.eeworld.com.cn/thread-421829-1-1.html,将这个帖子中选择生成jic的那一步改为选择rbf文件。
到这里,将rbf文件烧写进norflash就能使FPGA配置起来吗?NO.虽然我们的flash是MSB(Most Significant Bit)模式,SPI接口也是MSB模式,但是我们的烧写结果要求我们是以LSB(Least Significant Bit)形式存在。即
写入flash时我们需要将rbf文件的每个byte高地位反转然后按MSB模式写入,也可以将SPI接口修改为LSB模式。这个秘密是怎么发现的呢?开始在网上查找资料只提到烧写rbf文件,但将rbf文件写入后FPGA并不能配置起来。这时候我们用usb blaster烧录flash一个工程,然后通过MCU将数据读出,经过对比发现读出的数据是rbf文件高地位反转之后的数据。这才发现这个惊天秘密。之前有网友不知道如何生成烧写的bin文件
https://bbs.eeworld.com.cn/thread-450142-1-1.html是不是有了答案呢?
说的乱七八糟,总结一下:
单独烧写器:使用MCU烧写rbf文件LSB格式数据到flash
板载烧写:使用MCU烧写rbf文件LSB格式数据到flash,烧写时拉低nCONFIG,烧写完成后拉高nCONFIG