【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

时间:2023-03-08 15:38:52

一、软件与硬件平台

软件平台:

操作系统:Windows 7 64-bit

开发套件:ISE14.7

硬件平台:

FPGA型号:XC6SLX45-CSG324

QSPI Flash型号:W25Q128BV

二、背景介绍

  在FPGA开发过程中,如果我们把bit文件下载到FPGA中,那么当FPGA掉电以后,bit文件就丢失,再次上电的时候,代码就不会运行了。如果想掉电以后,代码还可以运行,那么必须把编译好的文件下载到外部的QSPI Flash中。当文件下载到外部的QSPI Flash中以后,由于QSPI Flash是一种非易失性存储器,掉电以后里面的数据并不会丢失,待重新上电以后,FPGA会自动读取QSPI Flash中的数据把代码加载到FPGA内部的RAM中运行。

  由于bit不能直接下载到QSPI Flash中,所以必须先把bit文件转化为.mcs文件或者.bin文件,然后才能下载到QSPI Flash中。

  本文主要教大家如何把bit文件转化为.bin文件和.mcs文件,然后下载到外部的QSPI Flash中。同时为了加快上电以后FPGA加载QSPI Flash中mcs文件的速度,我们可以把bit文件配置为4线模式(前提是你的硬件必须支持四线模式),并修改加载的时钟频率,从而大大加快FPGA的启动速度。

三、目标任务

1、把编译好的bit文件转化为.bin文件

2、把编译好的bit文件转化为.mcs文件

3、把.bin文件或者.mcs文件烧录到外部的QSPI Flash中

4、修改.bit文件的模式以及支持的时钟频率

四、待测代码

module led_top
(
input I_clk ,
input I_rst_n ,
output [:] O_led_out
); reg [:] R_cnt_ls ;
wire W_clk_ls ;
reg R_clk_ls_reg ;
reg [:] R_led_out_reg ; //////////////////////////////////////////////////////////////////
// 功能:产生1s的时钟
//////////////////////////////////////////////////////////////////
always @(posedge I_clk or negedge I_rst_n)
begin
if(!I_rst_n)
begin
R_cnt_ls <= 'd0 ;
R_clk_ls_reg <= 'b1 ;
end
else if(R_cnt_ls == 'd24_999_999)
begin
R_cnt_ls <= 'd0 ;
R_clk_ls_reg <= ~R_clk_ls_reg ;
end
else
R_cnt_ls <= R_cnt_ls + 'b1 ;
end assign W_clk_ls = R_clk_ls_reg ; //////////////////////////////////////////////////////////////////
// 功能:对输出寄存器进行移位产生流水效果
//////////////////////////////////////////////////////////////////
always @(posedge W_clk_ls or negedge I_rst_n)
begin
if(!I_rst_n)
R_led_out_reg <= 'b0001 ;
else if(R_led_out_reg == 'b1000)
R_led_out_reg <= 'b0001 ;
else
R_led_out_reg <= R_led_out_reg << ;
end assign O_led_out = ~R_led_out_reg ; endmodule

  写好待测代码,并添加物理约束文件绑定好管脚,我的开发板上的约束文件如下

NET I_clk LOC = V10 | TNM_NET = sys_clk_pin | IOSTANDARD = "LVCMOS33";
TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin kHz; NET I_rst_n LOC = N4 | IOSTANDARD = "LVCMOS15"; ## SW2 pushbutton NET O_led_out<> LOC = V5 | IOSTANDARD = "LVCMOS33"; ## LED1 NET O_led_out<> LOC = R3 | IOSTANDARD = "LVCMOS33"; ## LED2 NET O_led_out<> LOC = T3 | IOSTANDARD = "LVCMOS33"; ## LED3 NET O_led_out<> LOC = T4 | IOSTANDARD = "LVCMOS33"; ## LED4

五、任务

一、把.bit文件转化为.bin文件。

  1、编写好代码和约束文件,双击Generate Programming File成bit

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  2、如果上一步你没做任何设置的话你的工程目录下只会产生一个bit文件,如果需要产生bin文件的话,选中Generate Programming File,右键选择Process Properties...

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  3、在弹出的窗口中单击General Options,并勾选-g Binary选项,并点击最下面的OK

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  4、Generate Programming File前面变成了“问号”图标

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  5、重新双击Generate Programming File,完毕以后工程目录就生成了.bin文件

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  在ISE不支持bin文件下载到QSPI Flash,但是Vivado支持,后续会有Vivado调试教程以及烧录教程。

二、把.bit文件转化为.mcs文件。

  1、编写好代码和约束文件,双击Generate Programming File成.bit文件

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  2、双击Configure Target Device

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  3、在弹出的窗口中点击OK

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  4、在弹出的ISE iMPACT中双击Create PROM File(PROM File Formatter)

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  5、在弹出的PROM File Formatter窗口中选择Configure Signal FPGA,并点击右边绿色的箭头进入Step 2

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  6、然后选择Storage Device(bits)为外部QSPI Flash的容量,我的QSPI Flash型号是W25Q128BV,容量为128Mbits,所以我选择128M。接着点击的Add Storage Device,然后点击绿色的箭头进入Step 3

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  7、点击上图中的Add Storage Device,然后点击下图的箭头进入Step3

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  8、设置Output File Name为.mcs文件的名字,我设置为和.bit文件的名字相同(这一项可以随便设置)。设置Output File Location为.bit文件所在的目录(这一项也可以随便设置),File Format设置为MCS。

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  9、点击上图中最下面的OK,弹出以下窗口

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  10、在上图中直接点击OK,在弹出的新窗口中选择要转化的.bit文件并点击右下角的“打开”

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  11、在弹出的新窗口中选择NO

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  12、在弹出的新窗口中选择OK

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  13、双击左侧的Generate File...,生成.mcs文件

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  14、生成完毕以后会出现Generate Succeeded字样

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  15、工程目录下出现了.mcs文件

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  16、双击Boundary Scan

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  17、点击Initialize Chain图标(这一步一定要保证开发板处于上电状态并且Jtag线连接正常)

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  18、在弹出的窗口中选择NO(因为我们马上要把.mcs烧录到Flash中,而不是下载.bit文件,所以选择NO)

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  19、在新弹出的窗口中选择OK

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  20、双击FPGA上面的那个虚线框包裹起来的图标

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  21、在弹出的文件选择窗口中选择之前生成好的.mcs文件,并点击打开

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  22、接着在弹出的新窗口中选择芯片型号为W25Q128BV,Data Width为1,点击OK

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  23、选中FPGA上面的FLASH图标,右键在弹出的菜单中单击Program

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  24、在弹出的新窗口中选择OK

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  25、接着就进入了烧录QSPI Flash的过程,这个过程与下载.bit相比要慢的多,需要耐心等待

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  26、下载成功以后出现Successful字样

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  27、接着关掉开发板的电源然后再打开,等一小段时间以后,程序就开始自动运行了。

三、修改bit文件的配置,加快FPGA加载速度

  可以发现,产生的.mcs文件只有3.89M,但是重新上电到程序开始执行却花费了好几秒的时间,如果工程十分庞大,则FPGA选型的时候势必会选择逻辑资源更多的FPGA,那么编译后产生的.mcs文件会大的多,上电后加载的时间也会更长,所以在实际项目中,往往会修改bit文件的配置参数来加快上电以后代码的加载速度。具体步骤如下

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  1、编写好代码和约束文件,双击Generate Programming File成bit

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  2、选中Generate Programming File,右键选择Process Properties...

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  3、在弹出的窗口中单击Configuration Options,并设置Configuration Rate为26MHz,设置Set SPI Configuration Bus Width参数为4。并点击最下面的OK

【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽

  注意:Configuration Rate这个参数的值不能超过你使用的QSPI Flash芯片手册中指定的最高的读频率,大多数QSPI Flash的芯片手册会在第一页说它们支持的频率高达100M甚至更高,但是其实这个频率并不是指芯片支持的读数据频率,Flash芯片支持的读数据频率一定要在芯片手册电气特性(Electrical Characteristics)那一节找。如果你选择的时钟频率超过QSPI Flash支持的最高读取频率太多,出现的现象就是FPGA根本无法加载QSPI Flash中的镜像文件导致FPGA启动失败;如果你选择的时钟频率超过QSPI Flash支持的最高读取频率一点点的话,出现的现象就是FPGA加载QSPI Flash中的镜像文件大概率失败。所以一般选择的Configuration Rate参数值要稍微低于QSPI Flash支持的最高读频率。

  举三个例子:

  Micron公司的N25Q064A支持的最高频率为108MHz,但支持的读命令频率为54MHz,对于这个器件来说Configuration Rate不能选的高于54MHz

  Macronix公司的MX25L25645G支持的最高频率为133MHz,但支持的读命令频率为50MHz,对于这个器件来说Configuration Rate不能选的高于50MHz

  本文使用的Winbond公司的W25Q128BV支持的最高频率为104MHz,但支持的读命令频率为33MHz,对于这个器件来说Configuration Rate不能选的高于33MHz,我们选择为26MHz

  另外要说明的是Configuration Rate这个值对于不同的FPGA来说,值的范围不同。我当前使用的XC6SLX45支持的最高频率仅为26MHz,而XC7K325T支持的最高频率高达66MHz。

  还有一点要注意的是,Set SPI Configuration Bus Width可以设置为4的前提是你的开发板上QSPI Flash和FPGA之间四根数据线都是连通的,并且PCB上建议做好四根数据线的蛇形等长。

  4、接着重新生成.bit文件,然后把.bit文件按照上文的方法生成.mcs文件下载到QSPI Flash中,这个过程不在重复。

  5、烧录完毕以后,重新给开发板断电然后再上电,你会发现上电的瞬间,程序就开始运行了,几乎感觉不到等待的时间。由于XC6SLX45这个器件的资源相较于7系列FPGA来说逻辑资源并不算多,生成的mcs文件并不算大,所以才这么快,而对于高端一点的FPGA来说,FPGA编译后的镜像文件能达到十几兆甚至更大,比如XC7K325t生成的镜像文件约为10M左右,所以即使你这么设置了还是有一点延时的,不过比单线肯定是要快的多。注意,生成的FPGA镜像文件大小与FPGA型号有关,与逻辑代码的多少无关,在同一块FPGA中,你写一个流水灯的代码和调用了几个FFT,FIR数字滤波器IP核的信号处理代码生成的FPGA镜像文件的大小是相同的。

  至此,整个实验过程全部完毕。

六、总结

  1、在生成bit文件的设置中勾选-g Binary选项可以生成bin文件

  2、在生成mcs文件之间提前对bit进行速率与位宽的设置可以提高FPGA从Flash加载程序的速度

  3、设置Configuration Rate参数之前一定要阅读QPSI Flash芯片手册的电气特性(Electrical Characteristics)一节,找到支持的最高频率。