
说明1.参考文档UG570 UG9082.环境vivado 2021.13.FPGA型号ku060Ultrascaleku5p (Ultrascale )4.FlashSPI x8 Dual Quad Flash5.ICAP原语Ultrascale系列使用ICAPE3原语和STARTUP3原语二、基础概念1.IPROG命令使用IPROG Using ICAP7series使用ICAPE2Ultrascale使用ICAPE3原语两者有区别在配置逻辑接收到 IPROG 命令后FPGA 会重置除专用重新配置逻辑之外的所有内容并且 INIT_B 和 DONE 引脚会变为低电平。在 FPGA 清除所有配置存储器后INIT_B 会再次变为 高电平。图中WBSTAR 中的值用于比特流的起始地址。2.bit swapping字节内数据进行交换3、ICAPE3原语中的DEVICE ID4、了解BitStream构成初始填充 (Dummy Pad Words)内容 16个 FFFFFFFF字。作用 为配置过程的初始化和同步提供时间缓冲。总线宽度自动检测 (Bus Width Auto Detect)内容 两个字 000000BB和 11220044。作用 这个特殊的序列用于让FPGA自动检测其配置接口的宽度例如是x8、x16还是x32模式更多填充 (Additional Dummy Pad Words)内容 紧接着又是两个 FFFFFFFF。作用 继续确保时序稳定。同步与配置开始同步字 (Sync Word) AA995566。这是最关键的信号。它告诉FPGA内部的配置逻辑“接下来的数据是正式的配置指令包请开始解析”。空操作 (NOOP) 两个 20000000。NOOP是“无操作”指令用于提供指令间的延时或占位。核心配置指令包写入WBSTAR寄存器 设置Warm Boot Start Address。如果发生热启动如IPROG命令触发应该从哪个地址加载下一个镜像。这是MultiBoot多重启动功能的核心。写入CMD寄存器 执行一个命令。图中示例为 NULL(空命令)但实际使用中如果需要立即触发跳转这里会写入 IPROG命令值为 0000000F5、实际BitStream构成BIT文件采用ASSIC字符构成在FFFF之前的头部是由是目标 FPGA 器件信息的二进制编码。核心功能是匹配控制器这个比特流是为哪个具体型号的芯片设计的避免bit文件和器件型号不符合。0009: 字段类型标识符可能是 0x0009代表 b- Key/Part Name Data。0ff0 0ff0 0ff0 0ff0 0000 0161 0037: 这是字段值。它通常是目标 FPGA 器件名称的二进制编码。这个值需要查阅 Xilinx 内部编码表才能精确解读。比如如6c65 645f 746f 703b - led _ top ; (设计名称: led_top)5665 7273 696f 6e3d - version3230 3231 2e31 - 2021.1提示vivado版本是2021.1FFFF后面是同步头 AA9955664、升级原理Golden Image是从Flash中的0地址开始存储如果在XDC属性中设置了set_property BITSTREAM.CONFIG.NEXT_CONFIG_ADDR0xXXXXXXXX[current_design]则其帧头会包括WBSTARnext_config_addr寄存器里面指定的upper address space等信息。FPGA器件上电后会从0地址开始加载Golden Image后会根据里面的设定来决定加载Golden Image还是直接跳转到MultiBoot Image存储地址去执行MultiBoot Image当MultiBoot Image加载时候遇到错误Fallback电路会触发去重新从0地址去加载Golden Image。set_property BITSTREAM.CONFIG.CONFIGFALLBACK ENABLE[current_design]其流程如图所示或者是读取超时触发看门狗退回set_property BITSTREAM.CONFIG.TIMER_CFG0x0000_5000[current_design]看门狗时间设置如下详细参考看门狗时间计算对于7系列FPGA来说计算器件启动时间按照以下公式Config time Bitstream size / (Config clk freq * Config interface width)Bitstream size为实际文件的大小如果开启了compression按照压缩后的尺寸计算Config clk freq是CCLK或者EMCCLK的频率Config Interface width取决于启动模式比如SPIX4则位宽为4接下来用启动时间去换算Watchdog timer数值Watchdog timer Config time / Watchdog clk periodWatchdog clk period对于7系列FPGA是4000nsFPGA内部有个65MHz时钟经过256分频系数得到大约为250KHz的时钟这个时钟用于驱动watchdog timer。以KU5P为例Master SPI X8方式加载。配置bit文件128M bitsCCLK 125Mhz Config time 128M bits/(125Mhz *1) 1.024swatchdog period 1/125Mhz 8ns则watchdog timer config_time/watchdog period 1.024s/8ns 128*10^6 0x7A1_2000因此Watchdog Timer Register (10001)的配置为0x47A1_200关键点、关键MCS文件生成参考:UltraScale and UltraScale How should the .mcs/.bin files be generated for SPIx8 configuration with and without multiboot?应用场景一普通设计无双启动镜像Vivado 的 write_cfgmem工具会自动将配置数据分成两半并均匀地将低位和高位字节数据分布到双 Quad SPISPIx8的两个闪存中。用户应确保为 SPIx8 生成 .mcs/.bin文件时指定的大小是双 Quad SPI 配置中两个闪存的总容量。这样 Vivado 才能利用全部可用存储空间并分割配置数据。设计XDC中需要设置的 BITSTREAM 属性和 Vivado 特定的 SPIx8 设置如下set_property BITSTREAM.CONFIG.SPI_BUSWIDTH8[current_design]set_property CONFIG_MODE SPIx8[current_design]示例一假设使用 2 片 1Gb 的闪存组成 SPIx8 模式。由于每个 SPI 闪存容量为 1Gb因此在生成 .mcs/.bin时容量应指定为 256代表 2Gb。生成 .mcs文件的命令如下write_cfgmem-format mcs-interface SPIx8-size256-loadbitup 0 ./TOPx8.bit-file./TOPx8.mcs应用场景二多启动镜像特别注意确保多个启动镜像的地址不要跨越单个闪存的地址空间边界。例如如果采用 2x1Gb 的双 Quad 配置那么多启动镜像的地址都应限定在第一片 1Gb 闪存的地址范围内。多启动的跳转地址可以像往常一样通过设计中的 WBSTAR 寄存器或 BITSTREAM.CONFIG.NEXT_CONFIG_ADDR 属性来指定。这个地址不用乘以 2set_property BITSTREAM.CONFIG.NEXT_CONFIG_ADDR0x01000000[current_design]但是在使用 write_cfgmem生成 .mcs/.bin文件时指定的地址必须乘以 2。指定的地址必须乘以 2。指定的地址必须乘以 2。指定的地址必须乘以 2。因为 Vivado 会将配置数据分割并均匀分布到两个闪存中。设计中应根据需要设置相应的 BITSTREAM 属性例如NEXT_CONFIG_REBOOT、SPI_32BIT_ADDR等。示例二在本例中WBSTAR 地址设置为 0x01000000采用 2x1Gb 的 SPIx8 闪存配置。因为是 2x1Gb 闪存所以容量应指定为 256。设计中设定的 WBSTAR 地址是 0x01000000而用于 write_cfgmem的多启动地址需要乘以 2因此地址变为 0x02000000。最终生成 .mcs文件的命令如下write_cfgmem-format mcs-interface spix8-size256-loadbitup 0 ./Goldenx8.bit up 0x02000000 ./Multibootx8.bit-file Golden_n_Multibootx8.mcs如果是图形画界面生成如图所示如果采用ICAPE3实现地址指定指定的地址不用乘以 2。指定的地址不用乘以 2。三、项目实现1-XDC实现上电跳转golden XDCset_property BITSTREAM.CONFIG.SPI_BUSWIDTH8[current_design]set_property CONFIG_MODE SPIx8[current_design]set_property BITSTREAM.CONFIG.CONFIGRATE102[current_design]#102Mhz 根据实际应用速度来定 可以是8551都可以 set_property BITSTREAM.GENERAL.COMPRESS TRUE[current_design]set_property BITSTREAM.CONFIG.UNUSEDPIN Pullup[current_design]set_property CONFIG_VOLTAGE1.8[current_design]set_property BITSTREAM.CONFIG.SPI_32BIT_ADDR YES[current_design]set_property BITSTREAM.CONFIG.CONFIGFALLBACK ENABLE[current_design]#updateimage bitstream 注释该语句set_property BITSTREAM.CONFIG.NEXT_CONFIG_ADDR0x01000000[current_design]update XDCset_property BITSTREAM.CONFIG.SPI_BUSWIDTH8[current_design]set_property CONFIG_MODE SPIx8[current_design]set_property BITSTREAM.CONFIG.CONFIGRATE102[current_design]set_property BITSTREAM.GENERAL.COMPRESS TRUE[current_design]set_property BITSTREAM.CONFIG.UNUSEDPIN Pullup[current_design]set_property CONFIG_VOLTAGE1.8[current_design]set_property BITSTREAM.CONFIG.SPI_32BIT_ADDR YES[current_design]set_property BITSTREAM.CONFIG.CONFIGFALLBACK ENABLE[current_design]如果需要设置看门狗 请都加上set_property BITSTREAM.CONFIG.TIMER_CFG0xXXXXXXXX[current_design]这个时间值由上述方法进行计算本帖不计算 以防各位工程出错。项目实现2-ICAPE3实现上电跳转参考文档https://www.eet-china.com/mp/a66994.htmlmodule icap #(parameter JUMP_ADDR32h0100_0000)(input clk,input rst_n,input icap_start,output reg icap_done);reg icap_de;reg cs;reg wr;reg[31:0]data;reg[3:0]cnt;wire[31:0]I;localparam config_data032hFFFFFFFF;// 同步字用于同步ICAP接口通常为全1。localparam config_data132hAA995566;// 同步字这是ICAP的同步头用于启动配置操作。localparam config_data232h20000000;// 空操作NOOP命令。localparam config_data332h30020001;// 写一个1到WBSTARWarm Boot Start Address Register寄存器。这是一个命令将下一个数据写入WBSTAR。localparam config_data4JUMP_ADDR;localparam config_data532h30008001;localparam config_data632h0000000F;localparam config_data732h20000000;always(posedge clk)beginif(!rst_n)icap_de1b0;elseif(cnt7)icap_de1b0;elseif(icap_start1b1)icap_de1b1;elseicap_deicap_de;end always(posedge clk)beginif(!rst_n)begin cs1b1;wr1b1;data0;cnt0;endelseif(icap_de1b1)begincase(cnt)0:begin cs1b0;wr1b0;dataconfig_data0;cntcnt1b1;end1:begin cs1b0;wr1b0;dataconfig_data1;cntcnt1b1;end2:begin cs1b0;wr1b0;dataconfig_data2;cntcnt1b1;end3:begin cs1b0;wr1b0;dataconfig_data3;cntcnt1b1;end4:begin cs1b0;wr1b0;dataconfig_data4;cntcnt1b1;end5:begin cs1b0;wr1b0;dataconfig_data5;cntcnt1b1;end6:begin cs1b0;wr1b0;dataconfig_data6;cntcnt1b1;end7:begin cs1b0;wr1b0;dataconfig_data7;cntcnt1b1;enddefault:begin cs1b1;wr1b1;data32h00000000;cnt0;end endcase end end assign I{data[24],data[25],data[26],data[27],data[28],data[29],data[30],data[31],data[16],data[17],data[18],data[19],data[20],data[21],data[22],data[23],data[08],data[09],data[10],data[11],data[12],data[13],data[14],data[15],data[00],data[01],data[02],data[03],data[04],data[05],data[06],data[07]};always(posedge clk)beginif(!rst_n)icap_done1b0;elseif(cnt7)icap_done1b1;elseicap_doneicap_done;end ICAPE3 #(.DEVICE_ID(32h04A62093),// KU5P.ICAP_AUTO_SWITCH(DISABLE),// Enable switch ICAP using sync word..SIM_CFG_FILE_NAME(NONE)// Specifies the Raw Bitstream (RBT) file to be parsed by the simulation // model.)ICAPE3_inst(.AVAIL(),// 1-bit output: Availability status of ICAP..O(),// 32-bit output: Configuration data output bus..PRDONE(),// 1-bit output: Indicates completion of Partial Reconfiguration..PRERROR(),// 1-bit output: Indicates error during Partial Reconfiguration..CLK(clk),// 1-bit input: Clock input..CSIB(cs),// 1-bit input: Active-Low ICAP enable..I(I),// 32-bit input: Configuration data input bus..RDWRB(wr)// 1-bit input: Read/Write Select input.);endmodule