赞
踩
目录
0.前言
1.ICAP的例化
2.ICAP指令实现
3.比特位交换
4.跳转与fallback约束
5.生成mcs镜像
6.测试demo
multiboot作为更新程序的一种方法,在FPGA的实现方法是将两个bit文件合成为一个mcs镜像。
但是,flash默认只读取第一个从0开始的bit。要跳转到第二个bit文件时,可以用icap控制。
(1)使用原语:在vivado的Language template选项中可以找到标准语法,其中包括IP的调用,icap原语例化如下:
//icap核的调用
ICAPE2 #(
.DEVICE_ID(32'h362D093), // 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(sys_clk), // 1-bit input: Clock Input
.CSIB(CE), // 1-bit input: Active-Low ICAP Enable
.I(I), // 32-bit input: Configuration data input bus
.RDWRB(WRITE) // 1-bit input: Read/Write Select input
);
(2)其中设备号需要查找USER GUIDE手册,如7serials-user guider.pdf,以Artix A7-35T为例
(3)icap的指令也可以在用户手册找到,如图:
parameter DUMMY_WORD = 32'hffff_ffff; //伪指令,不进行操作,实际上为等待状态 parameter SYNC_WORD = 32'haa99_5566; //跳转指令同步字 parameter T1WBS = 32'h3002_0001; //type1 写入跳转空间的字节 parameter WBSA = 32'h0040_0000; //跳转空间地址,可以根据bit大小修改 parameter T1CMD = 32'h3000_8001; //type1 写入的控制指令字 parameter IPROG = 32'h0000_000f; //跳转到下一个程序的控制指令 parameter T1NOOP = 32'h2000_0000; //中断指令 //实现指令的跳转可以使用计数器或状态机,以计数器为例 always@(posedge sys_clk or negedge sys_rst_n) begin if(!sys_rst_n) I_reg<=DUMMY_WORD;//初始状态下为等待状态 else if(work_en==1'b1) case(clk_cnt) 0: I_reg <= DUMMY_WORD; 1: I_reg <= SYNC_WORD; 2: I_reg <= T1NOOP; 3: I_reg <= T1WBS; 4: I_reg <= WBSA; 5: I_reg <= T1CMD; 6: I_reg <= IPROG; 7: I_reg <= T1NOOP; default: I_reg<=DUMMY_WORD; //在错误情况下进入等待状态 endcase else I_reg<=DUMMY_WORD; //在非工作状况下进入等待状态 end
其中可以自己配置的是跳转地址,具体两个bit文件的地址可以查看prm文件
===================================
Configuration Memory information
===================================
File Format MCS
Interface SPIX1
Size 16M
Start Address 0x00000000
End Address 0x00FFFFFF
Addr1 Addr2 Date File(s)
0x00000000 0x0021728B Apr 24 23:41:53 2020 G:/Xilinx/practice/icap/golden_imag/golden/golden.runs/impl_1/top_icap.bit
0x00800000 0x0082F093 Apr 24 23:27:51 2020 G:/Xilinx/practice/icap/updated_imag/led2/led2.runs/impl_1/a_led.bit
根据flash的读写特性,每一个byte内高低位需要互换
32位互换可以用赋值的方法
assign I={ I_reg[24],I_reg[25],I_reg[26],I_reg[27],I_reg[28],I_reg[29],
I_reg[30],I_reg[31],I_reg[16],I_reg[17],I_reg[18],I_reg[19],
I_reg[20],I_reg[21],I_reg[22],I_reg[23],I_reg[08],I_reg[09],
I_reg[10],I_reg[11],I_reg[12],I_reg[13],I_reg[14],I_reg[15],
I_reg[00],I_reg[01],I_reg[02],I_reg[03],I_reg[04],I_reg[05],
I_reg[06],I_reg[07]};
Golden Image是指稳定工作的镜像系统,Updata Image是指升级的功能镜像包,两个工程中都需要添加约束
//Golden Image工程中添加
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] //可选的压缩项
set_property BITSTREAM.CONFIG.CONFIGFALLBACK ENABLE [current_design] //使能回读功能
set_property BITSTREAM.CONFIG.NEXT_CONFIG_ADDR 32'h00800000 [current_design] //update image 的起始地址
//Updata Image工程中添加
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property BITSTREAM.CONFIG.CONFIGFALLBACK ENABLE [current_design]
将两个工程的bit文件添加到一起,分别设置起始地址,即可生成mcs烧制到板上测试。
以Arty A7-35T为例成功测试了一个完整的ICAP功能
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。