Xilinx FPGA 重构Multiboot ICAPE2和ICAPE3使用

news2025/7/26 19:44:20

一、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) begin
    if(clk_cnt == CLK_CNT_MAX) begin
        clk_cnt <= 32'd0;
        led_num <= led_num + 1'b1;
    end
    else clk_cnt <= clk_cnt + 1'b1;
end
//1S内闪烁IMAGE_NUM+1次,停1S,依次循环
always @(posedge i_FPGA_GCLK25M) begin
    if(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) begin
	if(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; 	
end
 
always @(posedge i_FPGA_GCLK25M) begin
	case(send_cmd_cnt)
        4'd0: begin   //DUMMY
            wrdat			<= Dummy;
            ICAPE_CSIB		<= 1'b0;
            ICAPE_RDWRB	    <= 1'b0;
        end
        4'd1: begin   //SYN_WORD
            wrdat			<= SYNC_WORD;
            ICAPE_CSIB		<= 1'b0;
            ICAPE_RDWRB	    <= 1'b0;
        end
        4'd2: begin   //NOOP1
            wrdat			<= NOOP;
            ICAPE_CSIB		<= 1'b0;
            ICAPE_RDWRB	    <= 1'b0;
        end
        4'd3: begin   //WR_WBSTAR
            wrdat			<= WR_WBSTAR;
            ICAPE_CSIB		<= 1'b0;
            ICAPE_RDWRB	    <= 1'b0;
        end
        4'd4: begin   //WBSTAR
            wrdat			<= WBSTAR;
            ICAPE_CSIB		<= 1'b0;
            ICAPE_RDWRB	    <= 1'b0;
        end
        4'd5: begin   //WR_CMD
            wrdat			<= WR_CMD;
            ICAPE_CSIB		<= 1'b0;
            ICAPE_RDWRB	    <= 1'b0;
        end
        4'd6: begin   //IPROG
            wrdat			<= IPROG;
            ICAPE_CSIB		<= 1'b0;
            ICAPE_RDWRB	    <= 1'b0;
        end
        4'd7: begin   //NOOP2
            wrdat			<= NOOP;
            ICAPE_CSIB		<= 1'b0;
            ICAPE_RDWRB	    <= 1'b0;
        end
        4'd8: begin   //STOP
            wrdat			<= 32'd0;
            ICAPE_CSIB		<= 1'b1;
            ICAPE_RDWRB	    <= 1'b1;
        end
        default: begin
            wrdat			<= 32'd0;
            ICAPE_CSIB		<= 1'b1;
            ICAPE_RDWRB	    <= 1'b1;
        end
	endcase
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2404412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis专题-基础篇

题记 本文涵盖了Redis的各种数据结构和命令&#xff0c;Redis的各种常见Java客户端的应用和最佳实践 jedis案例github地址&#xff1a;https://github.com/whltaoin/fedis_java_demo SpringbootDataRedis案例github地址&#xff1a;https://github.com/whltaoin/springbootData…

springMVC-11 中文乱码处理

前言 本文介绍了springMVC中文乱码的解决方案&#xff0c;同时也贴出了本人遇到过的其他乱码情况&#xff0c;可以根据自身情况选择合适的解决方案。 其他-jdbc、前端、后端、jsp乱码的解决 Tomcat导致的乱码解决 自定义中文乱码过滤器 老方法&#xff0c;通过javaW…

【iOS安全】iPhone X iOS 16.7.11 (20H360) WinRa1n 越狱教程

前言 越狱iPhone之后&#xff0c;一定记得安装一下用于屏蔽更新的描述文件&#xff08;可使用爱思助手&#xff09; 因为即便关闭了自动更新&#xff0c;iPhone仍会在某些时候自动更新系统&#xff0c;导致越狱失效&#xff1b;更为严重的是&#xff0c;更新后的iOS版本可能是…

智能标志桩图像监测装置如何守护地下电缆安全

在现代城市基础设施建设中&#xff0c;大量电缆、管道被埋设于地下&#xff0c;这虽然美化了城市景观&#xff0c;却也带来了新的安全隐患。施工挖掘时的意外破坏、自然灾害的影响&#xff0c;都可能威胁这些"城市血管"的安全运行。 传统的地下设施标识方式往往只依…

【网站建设】网站 SEO 中 meta 信息修改全攻略 ✅

在做 SEO 优化时,除了前一篇提过的Title之外,meta 信息(通常指 <meta> 标签)也是最基础、最重要的内容之一,主要包括: <meta name="description"> <meta name="keywords"> 搜索引擎重点参考这些信息,决定你网页的展示效果与排名。…

计算机视觉处理----OpenCV(从摄像头采集视频、视频处理与视频录制)

一、采集视频 VideoCapture 用于从视频文件、摄像头或其他视频流设备中读取视频帧。它可以捕捉来自 多种源的视频。 cv2.VideoCapture() 打开摄像头或视频文件。 cap cv2.VideoCapture(0) # 0表示默认摄像头&#xff0c;1是第二个摄像头&#xff0c;传递视频文件路径也可以 …

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- 第一篇:MIPI CSI-2基础入门

第一篇&#xff1a;MIPI CSI-2基础入门 1. 为什么需要CSI-2&#xff1f; 痛点场景对比 &#xff08;用生活案例降低理解门槛&#xff09; 传统并行接口CSI-2接口30根线传输720P图像仅需5根线&#xff08;1对CLK4对DATA&#xff09;线距&#xff1e;5cm时出现重影线缆可长达1…

变幻莫测:CoreData 中 Transformable 类型面面俱到(一)

概述 各位似秃似不秃小码农们都知道&#xff0c;在苹果众多开发平台中 CoreData 无疑是那个最简洁、拥有“官方认证”且最具兼容性的数据库框架。使用它可以让我们非常方便的搭建出 App 所需要的持久存储体系。 不过&#xff0c;大家是否知道在 CoreData 中还存在一个 Transfo…

开源技术驱动下的上市公司财务主数据管理实践

开源技术驱动下的上市公司财务主数据管理实践 —— 以人造板制造业为例 引言&#xff1a;财务主数据的战略价值与行业挑战 在资本市场监管日益严格与企业数字化转型的双重驱动下&#xff0c;财务主数据已成为上市公司财务治理的核心基础设施。对于人造板制造业而言&#xff0…

Java建造者模式(Builder Pattern)详解与实践

一、引言 在软件开发中&#xff0c;我们经常会遇到需要创建复杂对象的场景。例如&#xff0c;构建一个包含多个可选参数的对象时&#xff0c;传统的构造函数或Setter方法可能导致代码臃肿、难以维护。此时&#xff0c;建造者模式&#xff08;Builder Pattern&#xff09;便成为…

win32相关(IAT HOOK)

IAT HOOK 什么是IAT Hook&#xff1f; IAT Hook&#xff08;Import Address Table Hook&#xff0c;导入地址表钩子&#xff09;是一种Windows平台下的API钩取技术&#xff0c;通过修改目标程序的导入地址表(IAT)来拦截和重定向API调用 在我们之前学习pe文件结构的导入表时&am…

零基础玩转物联网-串口转以太网模块如何快速实现与TCP服务器通信

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 驱动检查 3 TCP服务器通信配置与交互 3.1 硬件连接 3.2 开启TCP服务器 3.3 打开配置工具读取基本信息 3.4 填写连接参数进行连接 3.5 通信测试 4 总结 1 前言 TCP是TCP/IP体系中的传输层协议&#xff0c;全称为Transmiss…

ESP32开发之LED闪烁和呼吸的实现

硬件电路介绍GPIO输出模式GPIO配置过程闪烁灯的源码LED PWM的控制器(LEDC)概述LEDC配置过程及现象整体流程 硬件电路介绍 电路图如下&#xff1a; 只要有硬件基础的应该都知道上图中&#xff0c;当GPIO4的输出电平为高时&#xff0c;LED灯亮&#xff0c;反之则熄灭。如果每间…

【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录、退款业务记录

【产品业务设计】支付业务设计规范细节记录&#xff0c;含订单记录、支付业务记录、支付流水记录 前言 我为什么要写这个篇文章 总结设计经验生成设计模板方便后期快速搭建 一个几张表 一共5张表&#xff1b; 分别是&#xff1a; 订单主表&#xff1a;jjy_orderMain订单产…

2025软件供应链安全最佳实践︱证券DevSecOps下供应链与开源治理实践

项目背景&#xff1a;近年来&#xff0c;云计算、AI人工智能、大数据等信息技术的不断发展、各行各业的信息电子化的步伐不断加快、信息化的水平不断提高&#xff0c;网络安全的风险不断累积&#xff0c;金融证券行业面临着越来越多的威胁挑战。特别是近年以来&#xff0c;开源…

WebRTC通话原理与入门难度实战指南

波煮的实习公司主要是音视频业务&#xff0c;所以最近在补习WebRTC的相关内容&#xff0c;会不定期给大家分享学习心得和笔记。 文章目录 WebRTC通话原理进行媒体协商&#xff1a;彼此要了解对方支持的媒体格式网络协商&#xff1a;彼此要了解对方的网络情况&#xff0c;这样才…

N元语言模型 —— 一文讲懂!!!

目录 引言 一. 基本知识 二.参数估计 三.数据平滑 一.加1法 二.减值法/折扣法 ​编辑 1.Good-Turing 估计 ​编辑 2.Back-off (后备/后退)方法 3.绝对减值法 ​编辑4.线性减值法 5.比较 三.删除插值法(Deleted interpolation) 四.模型自适应 引言 本章节讲的…

.NET 9中的异常处理性能提升分析:为什么过去慢,未来快

一、为什么要关注.NET异常处理的性能 随着现代云原生、高并发、分布式场景的大量普及&#xff0c;异常处理&#xff08;Exception Handling&#xff09;早已不再只是一个冷僻的代码路径。在高复杂度的微服务、网络服务、异步编程环境下&#xff0c;服务依赖的外部资源往往不可…

Mac 安装git心路历程(心累版)

省流版&#xff1a;直接安装Xcode命令行工具即可&#xff0c;不用安Xcode。 git下载官网 第一部分 上网初步了解后&#xff0c;打算直接安装Binary installer&#xff0c;下载完安装时&#xff0c;苹果还阻止安装&#xff0c;只好在“设置–安全性与隐私”最下面的提示进行安…

计算机网络第2章(下):物理层传输介质与核心设备全面解析

目录 一、传输介质1.1 传输介质的分类1.2 导向型传输介质1.2.1 双绞线&#xff08;Twisted Pair&#xff09;1.2.2 同轴电缆&#xff08;Coaxial Cable&#xff09;1.2.3 光纤&#xff08;Optical Fiber&#xff09;1.2.4 以太网对有线传输介质的命名规则 1.3 非导向型传输介质…