一、软件与硬件平台

软件平台:

操作系统: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

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

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

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

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

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

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

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

  2、双击Configure Target Device

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

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

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

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

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

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

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

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

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

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

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

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

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

  16、双击Boundary Scan

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  注意: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)一节,找到支持的最高频率。

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

  1. js判断flash文件是否加载完毕

    轮询判断加载进度 img的加载完成有onload方法,一直不知道该怎么判断swf文件是否加载完毕了? 在应用中使用了轮询判断加载进度值PercentLoaded是否达到100,经测试,可以达到效果. ...

  2. 用C3中的animation和transform写的一个模仿加载的时动画效果

    用用C3中的animation和transform写的一个模仿加载的时动画效果! 不多说直接上代码; html标签部分 <div class="wrap"> <h ...

  3. android中加载的html获取的宽高不正确

    wap页面使用 js库是zepto,按照惯例在$(function(){})中,来获取当前可视区的宽高,但得到的宽高却与预想的相差十万八千里. 原本android手机的浏览器设定的宽高基本是360*6 ...

  4. mvc中多参数URL会很长,首次加载不传参数让url很短,路由规则实现方法[bubuko.com]

    如要实现列表中地址全路径“bubuko-11-2.html”,在首次进入时,使用短路径“bubuko.html”,只有再次href后才显示全路径“bubuko-11-2.html”,下面使用路由规则来 ...

  5. 2、手把手教你Extjs5(二)项目中文件的加载过程

    上一节中用sencha工具自动创建了一个项目,并且可以在浏览器中查看.现在我们来看看js类加载过程.如下图所示: 1、首先:浏览器中输入 localhost:1841 ,调用 index.html; ...

  6. PageSlider中CSS3动画在除首屏之外先加载页面后执行动画的问题

    PageSlider中CSS3动画在除首屏之外先加载页面后执行动画的问题,PageSlider中加入CSS3动画的话,默认只有首屏是从无到有执行动画,其他屏都是显示下页面再执行动画 这就造成其他屏的动 ...

  7. 记一次解决cmd中执行java提示"找不到或无法加载主类"的问题

    今天遇到一个问题:在cmd命令行中,用javac编译java文件可以成功,但是用java执行却提示“找不到或无法加载主类”.现将该问题的原因以及解决办法记录一下. 先理解一下系统变量path和clas ...

  8. vue项目中主要文件的加载顺序(index.html、App.vue、main.js)

    先后顺序: index.html > App.vue的export外的js代码 > main.js > App.vue的export里面的js代码 > Index.vue的ex ...

  9. extjs5(项目中文件的加载过程)

    现在来看看js类加载过程.如下图所示: 1、首先:浏览器中输入 localhost:1841 ,调用 index.html; <!DOCTYPE HTML> <html> &l ...

随机推荐

  1. Python基础测试有关联的接口

    test_guanlian.py放在case文件夹下 test_guanlian.pyimport unittest import requestsfrom urllib.parse import u ...

  2. 第二期,问道PC端游戏免安装,下载即可体验

    最近 迷恋游戏搭建不能自拔.搭建过 手游梦幻诛仙,传奇等等. 今天还是推荐PC端的问道这款游戏,原因是个人投入修改的时间太多了.基本完善了好多.这还得感谢这都是论坛的各位大佬体验的结果. 原来这个游戏 ...

  3. echart 图例

    说明:stack相同,两个bar合并但是不会重叠 如果需要重叠 用barGap: '-100%', 根据不同的需求来使用两者. <template> <div> echart ...

  4. react-01

    比较了半天VUE.Angular.React,最终选择React,下面从几个例子开始React的学习,先从单个的index.html,引用react.js开始 一.最简单的纯JS的代码 <!DO ...

  5. JavaScript中的闭包永远都存储在内存中,除非关闭浏览器

    //閉包實現累加功能 function fn1() { var n = 1; add = function() { n += 1; } function fn2() { n += 1; console ...

  6. 如何创建并初始化程序集里List类型的反射

    参考网址:http://stackoverflow.com/questions/315231/using-reflection-to-set-a-property-with-a-type-of-lis ...

  7. ELK日志系统使用说明

    数据探索 Elasticsearch具有强大的数据检索和分析同能,支持模糊.全文.过滤.管道等数据查询.对于日志型数据处理很有优势. 下图为KIbana的主页图,将逐步说明每一部分的功能: 依照图中的 ...

  8. 微信小程序开发之搞懂flex布局3——Flex Item

    Flex Item flex容器的子元素就是这个容器的flex item. The direct children of a Flex Container (elements with display ...

  9. python模块:csv

    """ csv.py - read/write/investigate CSV files """ import re from _csv ...

  10. 卸载HDP大数据平台

    使用以下说明卸载HDP: 停止所有已安装的HDP服务.请参阅HDP参考指南中的停止HDP服务. 如果安装了Knox,请在所有群集节点上运行以下命令: 对于RHEL / CentOS / Oracle ...