一、软件与硬件平台

软件平台:

操作系统: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. kivy sdl2 - ImportError: DLL load failed: 找不到指定的模块。

    kivy version : windows:win python version:3.6 sdl2 - ImportError: DLL load failed: 找不到指定的模块. 运行以下dem ...

  2. VBA读写ini 配置文件

    Option Explicit 'read Private Declare Function GetPrivateProfileString Lib "kernel32" Alia ...

  3. log4j 配置日志输出(log4j.properties)

    轉: https://blog.csdn.net/qq_29166327/article/details/80467593 一.入门log4j实例 1.1 下载解压log4j.jar(地址:http: ...

  4. todolist---插入和删除----vue

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. oracle 查询clob 列时 很慢 , 未解决

    今天查询一张表 ,这张表有一个clob 列 select *  from  tableName :  很卡.. 难道是查询的太多? select * from tableName where rowN ...

  6. JAVA实训第三次作业

    编写"学生"类及其测试类. 5.1 "学生"类: 类名:Student 属性:姓名.性别.年龄.学号.5门课程的成绩 方法1:在控制台输出各个属性的值. 方法2 ...

  7. python3 第三十三章 - 标准库概览Part II

    第二部分提供了更高级的模块用来支持专业编程的需要.这些模块很少出现在小型的脚本里. 1. 输出格式化reprlib 模块提供了一个用来缩写显示大型或深层嵌套容器的 定制版repr() . >&g ...

  8. python 实现快排序

    def q_sort(arr): if len(arr)<2: return arr pivot = arr[0] less = [x for x in arr[1:] if x <= p ...

  9. 《Miracle-House团队》项目需求分析改进

    (一)团队项目需求分析改进 一.<西小餐项目需求规格说明书>的不足 通过老师和其他同学的指正和建议,我们发现上次的需求规格说明书存在以下不足: 1.需求规格文档不够完整和规范: 2.系统设 ...

  10. git的使用方式总结

    1.先用 git clone url 克隆下来项目 2.查看下载的项目里面有没有一个名字叫git的文件夹 3.用git branch查看当前所有的本地分支,绿色的代表当前所处的分支 4.若本地只有一个 ...