一、FPGA Multiboot
本文主要介紹基于IPROG命令的FPGA多版本重構,用ICAP原語實現在線多版本切換。需要了解MultiBoot Fallback點擊鏈接。
如下圖所示,ICAP原語可實現flash中n+1各版本的動態切換,在工作過程中,可以通過IPROG命令切換到其他任意版本所在地址運行。
二、ICAPE2
??參考Xilinx ug470,ICAPE2原語如下:
ICAPE2 #(.DEVICE_ID(32'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);
DEVICE_ID:需要和芯片ID匹配,可以在ug470查詢,也可以用過JTAG獲取
各引腳定義如下:
O:回讀的config數據
CLK:操作時鐘
CSIB:使能端,低有效
I:輸入的配置數據
RDWRB:讀寫控制端,1-讀,0-寫
ICPE實現multiboot的配置流程如下,在使能后,以此每個時鐘輸入以下命令,其中Warm Boot Start Address為需要跳轉的地址
需要注意的是,輸入的配置數據字節內需進行bit swap,例如:
三、ICAPE3
??參考Xilinx ug570,ICAPE3如下:
ICAPE3 #(.DEVICE_ID(32'h03628093), // Specifies the pre-programmed Device ID value to be used for simulation// purposes..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(AVAIL), // 1-bit output: Availability status of ICAP..O(O), // 32-bit output: Configuration data output bus..PRDONE(PRDONE), // 1-bit output: Indicates completion of Partial Reconfiguration..PRERROR(PRERROR), // 1-bit output: Indicates error during Partial Reconfiguration..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.);
DEVICE_ID:需要和芯片ID匹配,可以在ug470查詢,也可以用過JTAG獲取
各引腳定義如下:
AVAIL:回讀有效標志
PRDONE:重購完成標志
PRERROR:重構失敗標志
O:回讀的config數據
CLK:操作時鐘
CSIB:使能端,低有效
I:輸入的配置數據
RDWRB:讀寫控制端,1-讀,0-寫
ICPE實現multiboot的配置流程如下,在使能后,以此每個時鐘輸入以下命令,其中Warm Boot Start Address為需要跳轉的地址
在BPI重構是,配置地址有所區別,需增加一個RS控制。
與ICAPE2相同,ICAPE3輸入的配置數據字節內需進行bit swap。
三、ICAPE3例程
下面基于ICAPE3,設計了4個image重構例程。
1、輸入輸出
??采用一個25MHz時鐘,輸出LED用于判斷是那個image,同時可以通過VIO判斷image
module Multiboot_top(
//---------------------------全局信號--------------------------------------------- input i_FPGA_GCLK25M , // 板載晶振輸出output reg o_FPGA_TEST_LED
);
2、image配置及狀態
??(1)通過一個VIO配置不同image的跳轉,跳轉地址32bit,跳轉使能觸發狀態機進行跳轉,同時可用過VIO觀測不同的image
??(2)通過條件編譯例化4個綜合實現選項,輸出4個bit
??(3)通過LED的閃爍次數觀察不同的image
`ifdef B2
localparam IMAGE_NUM = 2'd1;
`elsif B3
localparam IMAGE_NUM = 2'd2;
`elsif B4
localparam IMAGE_NUM = 2'd3;
`else
localparam IMAGE_NUM = 2'd0;
`endif
localparam CLK_CNT_MAX = 32'd6250000;
//------------------led image --------------
reg [31:0] clk_cnt;
reg [2:0] led_num;
always @(posedge i_FPGA_GCLK25M) beginif(clk_cnt == CLK_CNT_MAX) beginclk_cnt <= 32'd0;led_num <= led_num + 1'b1;endelse clk_cnt <= clk_cnt + 1'b1;
end
//1S內閃爍IMAGE_NUM+1次,停1S,依次循環
always @(posedge i_FPGA_GCLK25M) beginif(clk_cnt <= CLK_CNT_MAX/2 && led_num <= IMAGE_NUM) o_FPGA_TEST_LED <= 1'b1;else o_FPGA_TEST_LED <= 1'b0;
end
//------------------vio image --------------
wire reboot_valid;
wire [31:0] reboot_addr;
vio_0 vio_image (.clk(i_FPGA_GCLK25M), // input wire clk.probe_in0(IMAGE_NUM), // input wire [1 : 0] probe_in0.probe_out0(reboot_valid), // output wire [0 : 0] probe_out0.probe_out1(reboot_addr) // output wire [31 : 0] probe_out1
);
3、ICAPE3實現IPROG重構
//------------------image exchange--------------
wire ICAPE_CLK;
wire [31:0] ICAPE_O;
reg ICAPE_CSIB;
wire [31:0] ICAPE_I;
reg ICAPE_RDWRB;localparam [31:0] Dummy = 32'hFFFFFFFF;
localparam [31:0] SYNC_WORD = 32'hAA995566;
localparam [31:0] NOOP = 32'h20000000;
localparam [31:0] WR_WBSTAR = 32'h30020001;
localparam [31:0] WR_CMD = 32'h30008001;
localparam [31:0] IPROG = 32'h0000000F;ICAPE3 #(.DEVICE_ID(32'h04AC2093), // Specifies the pre-programmed Device ID value to be used for simulation// purposes..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_multiboot (.AVAIL (AVAIL ), // 1-bit output: Availability status of ICAP..O (ICAPE_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 (ICAPE_CLK ), // 1-bit input: Clock input..CSIB (ICAPE_CSIB ), // 1-bit input: Active-Low ICAP enable..I (ICAPE_I ), // 32-bit input: Configuration data input bus..RDWRB (ICAPE_RDWRB ) // 1-bit input: Read/Write Select input.);
assign ICAPE_CLK = i_FPGA_GCLK25M;wire [31:0] WBSTAR ;
assign WBSTAR = reboot_addr;//ICAPE位翻轉
reg [31:0] wrdat;
assign ICAPE_I = {wrdat[24], wrdat[25], wrdat[26], wrdat[27], wrdat[28], wrdat[29], wrdat[30], wrdat[31], wrdat[16], wrdat[17], wrdat[18], wrdat[19], wrdat[20], wrdat[21], wrdat[22], wrdat[23], wrdat[8], wrdat[9], wrdat[10], wrdat[11], wrdat[12], wrdat[13], wrdat[14], wrdat[15], wrdat[0], wrdat[1], wrdat[2], wrdat[3], wrdat[4], wrdat[5], wrdat[6], wrdat[7]};reg [1:0] reboot_valid_r;
reg [3:0] send_cmd_cnt = 4'hf;always @(posedge i_FPGA_GCLK25M) reboot_valid_r = {reboot_valid_r[0], reboot_valid};
always @(posedge i_FPGA_GCLK25M) beginif(reboot_valid_r == 2'b01) send_cmd_cnt <= 4'd0;else if(send_cmd_cnt != 4'hf) send_cmd_cnt <= send_cmd_cnt + 1'b1;
endalways @(posedge i_FPGA_GCLK25M) begincase(send_cmd_cnt)4'd0: begin //DUMMYwrdat <= Dummy;ICAPE_CSIB <= 1'b0;ICAPE_RDWRB <= 1'b0;end4'd1: begin //SYN_WORDwrdat <= SYNC_WORD;ICAPE_CSIB <= 1'b0;ICAPE_RDWRB <= 1'b0;end4'd2: begin //NOOP1wrdat <= NOOP;ICAPE_CSIB <= 1'b0;ICAPE_RDWRB <= 1'b0;end4'd3: begin //WR_WBSTARwrdat <= WR_WBSTAR;ICAPE_CSIB <= 1'b0;ICAPE_RDWRB <= 1'b0;end4'd4: begin //WBSTARwrdat <= WBSTAR;ICAPE_CSIB <= 1'b0;ICAPE_RDWRB <= 1'b0;end4'd5: begin //WR_CMDwrdat <= WR_CMD;ICAPE_CSIB <= 1'b0;ICAPE_RDWRB <= 1'b0;end4'd6: begin //IPROGwrdat <= IPROG;ICAPE_CSIB <= 1'b0;ICAPE_RDWRB <= 1'b0;end4'd7: begin //NOOP2wrdat <= NOOP;ICAPE_CSIB <= 1'b0;ICAPE_RDWRB <= 1'b0;end4'd8: begin //STOPwrdat <= 32'd0;ICAPE_CSIB <= 1'b1;ICAPE_RDWRB <= 1'b1;enddefault: beginwrdat <= 32'd0;ICAPE_CSIB <= 1'b1;ICAPE_RDWRB <= 1'b1;endendcase
end
4、mcs文件生成
??如下圖所示設置地址和bit,生成mcs并燒寫flash
5、mcs燒寫及切換
??mcs燒寫完成后,通過VIO配置相應啟動地址,產生使能完成重加載,VIO配置加載后觀察IMAGE ID如下:
(1)addr=0
(2)addr=0x00200000
(3)addr=0x00400000
(4)addr=0x00600000
參考工程請點擊
鏈接:https://download.csdn.net/download/u014035968/90962933
參考文件
ug570-ultrascale-configuration
ug470-7Series-configuration