赞
踩
一.远程升级的思路(实验成功):
在flash的0地址固化带有接收远程升级程序(如串口接收功能)/和往flash里面写数据功能且能引导到flash的固定地址的程序(如QSPI)/和接收跳转到flash的固定地址启动(利用原语)指令。
二:流程
设备上电——FPGA自动从flash的基地址拿先前固化好的程序——通过串口往falsh里面写升级程序,并且修改跳转flash地址(最新升级的新程序)的指令。
设备断电——在启动上电——FPGA自动去之前设定好的flah跳转地址拿最新的升级程序——如果拿取失败就会自动加载旧版固化在flash的程序。
三:工具
1.所需ip核:QSPI+UART+ARM架构cpu
2.首先往flah里面固化bit+elf(bootloader),可以从flash的地址0开始固化(mcs文件生成处可以选择)。
3.上电从flash拿合并程序,并运行bit+elf(bootloader)
4.在bootloader程序里的设置写flash的地址:就是意味着往flash的哪个地址去写并引导app程序的启动。
但是想做远程程序更新功能就必须这么干,通过串口或者网口或者什么其他通信接口将要更新的程序发送至fpga,fpga存储空间不够的话就暂存到ddr或者外置sram里,再按顺序操作flash烧入
外部存储器的时钟管脚一般与fpga的CCLK_0连接,当使用远程更新时,首先fpga内部有控制flash的驱动(即逻辑控制flash时序),当然flash时钟也需要控制了,但这时时钟管脚已经连接到CCLK_0,那该如何操作啊,你直接约束分配管脚试试,是通不过的,这时STARTUPE2就派上用场了,那该如何使用啊,如下
STARTUPE2 #(
.PROG_USR("FALSE"), // Activate program event security feature. Requires encrypted bitstreams.
.SIM_CCLK_FREQ(0.0) // Set the Configuration Clock Frequency(ns) for simulation
)
STARTUPE2_inst
(
.CFGCLK(), // 1-bit output: Configuration main clock output
.CFGMCLK(), // 1-bit output: Configuration internal oscillator clock output
.EOS(), // 1-bit output: Active high output signal indicating the End Of Startup.
.PREQ(), // 1-bit output: PROGRAM request to fabric output
.CLK(0), // 1-bit input: User start-up clock input
.GSR(0), // 1-bit input: Global Set/Reset input (GSR cannot be used for the port name)
.GTS(0), // 1-bit input: Global 3-state input (GTS cannot be used for the port name)
.KEYCLEARB(1), // 1-bit input: Clear AES Decrypter Key input from Battery-Backed RAM (BBRAM)
.PACK(1), // 1-bit input: PROGRAM acknowledge input
.USRCCLKO(flash_clk), // 1-bit input: User CCLK input
.USRCCLKTS(0), // 1-bit input: User CCLK 3-state enable input
.USRDONEO(1), // 1-bit input: User DONE pin output control
.USRDONETS(1) // 1-bit input: User DONE 3-state enable outpu
);
其中flash_clk就是你时序控制的flash时钟信号(使用STArtupe2原语输出cclk时钟时,启动后的前三个时钟用于切换时钟源,不会对外输出),连接到这就行了,其它的不需要改动,也无需约束此管脚,当然你也可以例化qspi ip看里面是如何使用的。
顺便说一下,对于数据信号,一般是inout类型,对于单bit可以如下使用:
assign data = data_en ? data_reg : 1'bz;
多bit可以如下使用:
//data_en=1:data_in--valid;0:data_out--valid
generate
genvar j;
for (j = 0; j <= 3; j = j + 1)
begin : bidir_IO
IOBUF IOBUF_i (
.IO (flash_data[j]),
.I (data_out[j]),
.O (data_in[j]),
.T (data_en)
);
end
endgenerate
data_en、data_in、data_out是时序控制的信号,flash_data为顶层的inout类型信号(直接接芯片引脚)。
ext_spi_clk:在QSPI模式下这个时钟的两分频就是给SPI Flash的访问时钟,因此这个时钟要根据QSPI Flash的参数设置到合理值;
ICAP实现Multiboot的原理介绍
FPGA具有多重配置的特性,允许用户在不掉电重启的情况下,根据不同时刻的需求,可以从FLASH中贮存的多个比特文件选择加载其中的一个,实现系统功能的变换。当FPGA完成上电自动加载初始化的比特流后,可以通过触发FPGA内部的多重启动事件使得FPGA从外部配置存储器(SPI FLASH)指定的地址自动下载一个新的比特流来重新配置。FPGA的多重配置可以通过多种方式来实现。本文采用的是基于ICAP原语的状态机编码方式。通过调用Xilinx自带的ICAP原语,编写状态机按照一定的指令流程对ICAP原语进行不断的配置,可以控制FPGA重新配置。
-
- // ICAPE2 : In order to incorporate this function into the design,
- // Verilog : the following instance declaration needs to be placed
- // instance : in the body of the design code. The instance name
- // declaration : (ICAPE2_inst) and/or the port declarations within the
- // code : parenthesis may be changed to properly reference and
- // : connect this function to the design. All inputs
- // : and outputs must be connected.
-
- // <-----Cut code below this line---->
-
- // ICAPE2: Internal Configuration Access Port
- // Artix-7
- // Xilinx HDL Language Template, version 2019.1
-
- ICAPE2 #(
- .DEVICE_ID(0'h3651093), // Specifies the pre-programmed Device ID value to be used for simulation
- // purposes.
- .ICAP_WIDTH("X32"), // Specifies the input and output data width.
- .SIM_CFG_FILE_NAME("NONE") // Specifies the Raw Bitstream (RBT) file to be parsed by the simulation
- // model.
- )
- ICAPE2_inst (
- .O(O), // 32-bit output: Configuration data output bus
- .CLK(CLK), // 1-bit input: Clock Input
- .CSIB(CSIB), // 1-bit input: Active-Low ICAP Enable
- .I(I), // 32-bit input: Configuration data input bus
- .RDWRB(RDWRB) // 1-bit input: Read/Write Select input
- );
-
- // End of ICAPE2_inst instantiation
-
-
device id 在UG470可找
14. 对于flash来说:只要你不擦除绝对是pp写不进去的(实测确实是这样)。
15.对于vivado的先擦除后编程来说,擦除的步骤一定是正片flash全部擦除。不可能只查出mcs固化地址的小块区域(已验证过)
16. 对于lash固化,当000000没程序,只有006000有程序。FPGA上电会一直找到006000有程序的地方去执行。(已验证过)
17.在线烧录和固化验证跳转指令是有差别的,在线烧录跳转验证功能会出现功能异常,一定要固化进去验证。
18.initial begin一定不要在代码阶段写,这种只推荐在testbech写。一旦上电复位之后传参传不进去的。
19.当falsh里面只有golden 程序时,一旦发现跳转地址是错的,会回退到golden程序运行(实测有效)
20.当把golden 程序固化到0地址,test1固化到700000,test2固化到a00000,一旦从goden程序跳转到错误地址时,会直接执行test1程序。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。