关于xilinx使用PCIE实现FPGA的部分重配置实现(MCAP)

news/2024/3/29 16:12:09/文章来源:https://blog.csdn.net/hy_520520/article/details/130338301

平台:vivado21018.3

芯片:xcku115-flva1517-2-i (active)

本文官方文档:Xilinx_Answer_64761_Ultrascale_Devices

本文驱动下载地址:64761 - Bitstream Loading across the PCI Express Link in UltraScale and UltraScale+ Devices for Tandem PCIe and Partial Reconfiguration (xilinx.com)

本文参考:Xilinx基于PCIE的部分重配置实现(一) | 电子创新网赛灵思中文社区 (eetrend.com)

要使用PCIE实现FPGA的部分可重构,就要理解为什么要使用PCIE来重构FPGA内部的电路。PCIE是一种即插即用的协议,这个就意味着在通电状态下,PCIE主机将枚举系统。这个过程包括主机从每个设备读取请求的地址大小,然后为该设备分配一个基本地址。因此在在主机查询PCIE接口时,必须要准备好它们,否则它们将不会被分配一个基本地址。

另外,PCIE规范规定,系统上电后,复位信号必须在100毫秒内取消断言,并且PCIE端口必须在复位信号取消断言后不超过20毫秒准备好进行链路训练。通常被称为100毫秒的启动时间要求。

Tandem Configuration(串联配置)采用两阶段方法,使IP能够满足PCI Express规范中指定的配置时间要求。该技术支持多种用例:

Tandem PROM

从闪存中加载单个两级位流。

Tandem PCIe

从闪存中加载第一阶段比特流,并通过 PCIe 链路将第二阶段比特流传递到 MCAP。

Tandem with Field Updates

在Tandem PROM或Tandem PCIe的初始配置之后,保持PCIe链接处于活动状态,更新整个用户设计。更新区域(平面图)和设计结构是预定义的,并提供了Tcl脚本。

Tandem + Partial Reconfiguration

这是Tandem配置后跟随任何大小或数量的部分重构(PR)的更一般情况。

Partial Reconfiguration over PCIe(PR over PCIe)

这是PR通常遵循的标准配置,使用PCIe / MCAP作为部分比特流的传递路径。

下面我们将采用PR over PCIe模式,通过PCIe的PR启用MCAP链路进行部分重新配置。

对于FPGA的配置方式可以使用JTAG、ICAP和MCAP来配置FPGA。它们具有一下区别:

JTAG

使用JTAG线对FPGA进行烧录配置。需要繁琐的烧录线。

ICAP

使用FPGA的内部配置接口,通过FPGA内部逻辑电路实现对FPGA的配置。

MCAP

主机通过PCIE接口向FPGA发送配置文件,从而实现对FPGA的烧写。

使用MCAP技术对FPGA进行重配置,可以在保证系统不用重新枚举PCI设备的前提下对FPGA某个动态区域进行逻辑修改。

支持的设备,这种配置方式目前只支持UltraScale系列器件。

 

关于Tandem PROM和Tandem PCIe这两个设计的区别。

Tandem PROM解决方案将比特流分为两个部分,并将这两个部分都从本地配置存储器(PROM或者其他存储器)加载。bit流的第一部分配置设计的PCIE部分,第二部分配置FPGA的其余部分。

 

 Tandem PCI解决方案与Tandem PROM类似。在第一阶段,只有与PCIe操作相关的配置存储单元从PROM里面加载。加载完第一阶段比特流后,PCIe端口能够被系统枚举。随后第二阶段的比特流通过PCIe链路传输。

 

下面使用FPGA使用PCIE实现FPGA的部分重配置。

选择mode模式为:Advanced

 

 Tandem Configuration or Partial Reconfiguration下选择PR over PCIe

 使用AXI_LITE接口来完成对寄存器的读写。

 其他配置默认,新建完成XDMA的IP后,打开example project。

 

打开实例工程后

添加自定义的AXI_LITE接口转换模块、寄存器模块、以及LED_RM_0、LED_RM_1模块。

LED_RM_0模块功能输出LED参数为2’b00。

// *********************************************************************************/
// Project Name :
// Author       : i_huyi
// Email        : i_huyi@qq.com
// Creat Time   : 2023/4/20 9:18:02
// File Name    : .v
// Module Name  : 
// Called By    :
// Abstract     :
//
// CopyRight(c) 2020, xxx xxx xxx Co., Ltd.. 
// All Rights Reserved
//
// *********************************************************************************/
// Modification History:
// 1. initial
// *********************************************************************************/
// *************************
// MODULE DEFINITION
// *************************
`timescale 1 ns / 1 ps
module LED_RM_0#(
parameter   U_DLY = 1)(
input   wire                sys_clk     ,
input   wire                rst_n       ,
output  reg [1:0]           led         );
//--------------------------------------
// localparam
//--------------------------------------//--------------------------------------
// register
//--------------------------------------//--------------------------------------
// wire
//--------------------------------------//--------------------------------------
// assign
//--------------------------------------//------------------------------------------------------------
//------------------------------------------------------------//------------------------------------------------------------
//------------------------------------------------------------always @ (posedge sys_clk or negedge rst_n)
beginif(rst_n == 1'b0)led     <= 2'b0;elseled     <= 2'b0;
end//------------------------------------------------------------
//------------------------------------------------------------
endmodule

LED_RM_1模块功能输出LED参数为2’b11。

always @ (posedge sys_clk or negedge rst_n)
beginif(rst_n == 1'b0)led     <= 2'b0;elseled     <= 2'b11;
end

新建完成后。点击tools-Enable Partial Reconfiguration。

 确定启用部分重配置。

 确定后PROJECT MANAGER会多出partial Reconfiguration wizard选项。

 选中你要进行重构的逻辑,即LED_RM_模块。选择Great Partition Definition。

 指定一个分区的名字。

 完成后LED_RM_0模块变成了一个棱形的标志。

 下面打开partial Reconfiguration wizard

 继续

 添加模块LED_RM_1。

添加完成后,LED_RM分区内有两个模块。

 

 下一步后,继续点击automatically create configurations。

 修改Configuration Name。

 在Edit Configuration Runs下点击automatically create configurations。

 

 完成后进行综合。

在Vivado中,Floorplanning是一种将设计分配到芯片的不同区域的方法。Pblock是一种在Floorplanning中使用的工具,它允许用户将设计分配到特定的物理区域中。通过使用Pblock,用户可以控制设计中的不同模块的位置和布局,以最大化性能和资源利用率。在Floorplanning中,绘制Pblock是指创建一个物理块,然后将设计中的模块分配到该块中。这样可以更好地控制设计的物理布局,以满足性能和资源利用率的要求。这里我们选中LED_RM_0模块选择Floorplaning - Draw Pblock。

 在FPGA上选择一块没有使用的区域,划分该区域为可重构的区域。

 修改后会在XDC文件下添加约束信息。

 下面我们进行DRC检查看看分配的区域是否合理,不会和其他模块抢占区域。

 

在Vivado中进行DRC检查,可以按照以下步骤操作:

  1. 打开Vivado软件,打开需要进行DRC检查的工程。
  2. 在左侧的“Flow Navigator”面板中,选择“Open Implemented Design”选项。
  3. 在右侧的“Design Runs”面板中,选择“Generate DRC Report”选项,并点击“Run”按钮。
  4. 等待DRC检查完成后,在“Design Runs”面板中找到生成的DRC报告,并双击打开。
  5. 在DRC报告中,可以查看所有的DRC错误和警告信息,以及相应的解决方法。
  6. 如果需要重新运行DRC检查,可以在“Design Runs”面板中选择“Regenerate DRC Report”选项,并点击“Run”按钮。

注意:在进行DRC检查前,需要先进行综合和实现操作,并确保设计没有任何语法错误和警告信息。

无报错。 

 生成bit流。

至此,部分重配置的工程就生成完毕,在生成出来的文件里面,在工程目录下会有两个imp的文件夹,里面会分别有静态逻辑和各自的重配置逻辑,我们将静态逻辑先烧写进去FPGA,之后就可以通过PCIE配置动态逻辑,关于MCAP的驱动的上位机,在Xilinx_Answer_64761__UltraScale_Devices这份文档中有详细的说明。

xilinx_dma_pcie_ep.bit:这部分为静态逻辑。

U_LED_RM_0_LED_RM_0_partial.bit:这部分为重配置逻辑。

U_LED_RM_0_LED_RM_0_partial_clear.bit:这部分不清楚。

 

 下载bit文件

 

下载Xilinx_Answer_64761_Ultrascale_Devices文件。

安装xilinx提供的驱动。

 需要注意的是,该驱动目前需要在win764位环境下运行。且需要在启动时强制将驱动签名禁止。设置完成后安装驱动文件。开机按F8,选择强制禁用驱动签名。

安装驱动。

 

 点击始终安装此驱动程序。

 安装完成后发现在设备管理器中的系统设备中找到名字叫做Xilinx Pcle MCAP Driver的驱动。

 

用户可以在驱动安装路径下打开INF文件自由添加你的设备PCIE驱动号。

路径为:C:/Program Files(x86)\Xilinx\MCAP\mcap64

格式为%mcap.DRVDESC%= mcap_Inst, PCI\VEN_xxxx&DEV_YYYY

 

驱动的使用

安装后后出现两个快捷方式,一个是MCAPAPP.exe另外一个是MCAPAPPGUI.exe

 

根据我们代码中。

使用LED_RM_0读取PCIE的BAR0地址4读取值为32’h0;

使用LED_RM_1读取PCIE的BAR0地址4读取值为32’h3;

可重构部分未LED_RM_0的时候。

 直接启动MCAPAPPGUI.exe,选择重构部分的代码LED_RM_1。

 重构成功。

 启动windriver读取BAR0地址4的值。

 配置成功。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA——线程池

目录 一、线程池的概念 二、Java标准库中的线程池 三、ThreadPoolExecutor 类的参数 四、线程池的拒绝策略 五、模拟实现线程池 一、线程池的概念 线程池顾名思义就是集中存储线程的地方——联想一下水池。 线程池是一种多线程处理形式&#xff0c;处理过程中将任务添加到…

Ext4日志优化-iJournaling

背景 这几年随着SSD等高性能介质的普及&#xff0c;及其在大规模分布式存储系统上的应用。基于Append only的日志写入技术也应用得越来越多&#xff0c;这几天刚好有空&#xff0c;重读了Ext4文件系统的日志部分的内容&#xff0c;也正好看到一篇对Ext4日志技术进行优化的论文…

《编码——隐藏在计算机软硬件背后的语言》精炼——第11章(门)

“The only source of knowledge is experience.” - Albert Einstein 引言 编码是一种处理并表达信息的方式&#xff0c;它包括摩斯电码、盲文、二进制语言等等&#xff0c;当然作为计算机类的经典书籍&#xff0c;这本书简述了计算机中以二进制数为基础的编码方式&#xff0…

nginx简单介绍

文章目录 1. 下载并解压2. 80端口被占用&#xff0c;更改nginx默认的监听端口3. 访问nginx4. 在linux上安装nginx5. nginx常用命令6. nginx.conf 1. 下载并解压 官网下载 2. 80端口被占用&#xff0c;更改nginx默认的监听端口 更改conf/nginx.conf文件 3. 访问nginx ht…

【Linux】popen pclose接口介绍

本篇文章简单讲述了c语言接口popen/pclose的用法 1.函数作用 函数定义如下 #include <stdio.h>FILE *popen(const char *command, const char *type); int pclose(FILE *stream);1.1 popen popen函数会创建一个管道&#xff0c;fork后调用shell来打开进程。由于管道的…

射频封装技术:层压基板和无源器件集成

射频和无线产品领域可以使用非常广泛的封装载体技术&#xff0c;它们包括引线框架、层压基板、低温共烧陶瓷&#xff08;LTCC&#xff09;和硅底板载体&#xff08;Si Backplane&#xff09;。由于不断增加的功能对集成度有了更高要求&#xff0c;市场对系统级封装方法&#xf…

Qt 项目Mingw编译器转换为VS编译器时的错误及解决办法

错误 在mingw生成的项目&#xff0c;转换为VS编译器时通常会报些以下错误&#xff08;C4819警告&#xff0c;C2001错误&#xff0c;C2143错误&#xff09; 原因及解决方式 这一般是由于字符编码引起的&#xff0c;在源代码文件中包含了中文字符导致的。Qt Creator 生成的代码文…

iptables防火墙和Firewalld

引言 在 Internet 中&#xff0c;企业通过各种应用系统来为用户提供各种服务&#xff0c;如 Web 网站、电子邮件系统、FTP 服务器、数据库系统等&#xff0c;那么&#xff0c;如何来保护这些服务器&#xff0c;过滤企业不需要的访问甚至是恶意的入侵呢&#xff0c;接下来&#…

【Linux】生产者消费者模型——环形队列RingQueue(信号量)

文章目录 铺垫信号量信号量概念信号量PV操作信号量基本接口 环形队列的生产消费模型引入环形队列访问环形队列代码实现代码改造多生产者多消费者代码 总结 铺垫 之前写的代码是存在不足的地方的&#xff1a; 我们使用线程操作临界资源的时候要先去判断临界资源是否满足条件&am…

最新动态 | 大势智慧参加广东省应急测绘保障与安全生产演练

4月20日&#xff0c;2023年度广东省应急测绘保障与安全生产演练在台山市赤溪镇鱼塘湾举行。本次演练由广东自然资源厅主办&#xff0c;广东省国土资源测绘院、江门市自然资源局和台山市人民政府承办。在省市各指导单位与参演单位的多方协同与指挥下&#xff0c;应急测绘保障与安…

【三十天精通Vue 3】第十四天 Vue 3 的单元测试详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、为什么要进行单元测试1.1 单元测试的概念1.2 单元测试的优…

ctfshow_WEB_web2 wp

前言 写这个是因为。。。我想摆烂&#xff0c;就去从最简单的题开始做了&#xff0c;想着交一道题是一道嘛&#xff0c;总之觉得这样做很适合欺骗安慰自己&#xff08;逃 然后我发现我错了&#xff0c;我第二道题就做了好久还没做出来&#xff0c;甚至最后去点开了hint…… ps…

Java网络编程系列之NIO

Java网络编程系列之NIO 1.Java NIO概述1.1 阻塞IO1.2 非阻塞IO1.3 NIO概述1.3.1 Channels1.3.2 Buffer1.3.3 Selector 2.Java NIO(Channel)2.1Channel概述2.2 Channel实现2.3 FileChannel 介绍与示例2.4 FileChannel 操作详解2.4.1 打开FileChannel2.4.2 从FileChannel读取数据…

自定义测试平台搭建

体验地址&#xff1a;TestManagePlatform 首次加载会比较慢... 功能点 1.数据工具生成&#xff0c;增删改查 2.测试用例以及测试套件生成&#xff0c;测试执行测试基础用例增删改查。 3.Jacoco 代码增量扫描 4.文章管理 欢迎私聊&#xff0c;支撑自定义开发。

Java基础(十)字符串相关类

1 字符串相关类之不可变字符序列&#xff1a;String 1.1 String的特性 java.lang.String 类代表字符串。Java程序中所有的字符串文字&#xff08;例如"hello" &#xff09;都可以看作是实现此类的实例。 字符串是常量&#xff0c;用双引号引起来表示。它们的值在创…

对数据结构的初步认识

前言: 牛牛开始更新数据结构的知识了.本专栏后续会分享用c语言实现顺序表,链表,二叉树,栈和队列,排序算法等相关知识,欢迎友友们互相学习,可以私信互相讨论哦! &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&a…

Allegro PCB后处理

Allegro PCB后处理&#xff0c;主要是完成线路设计以后&#xff0c;输出生产文件之前的处理。这是看教程做的记录&#xff0c;方便以后自己参考。 教程&#xff1a; [小哥Cadence Allegro 132讲字幕版PCB视频教程]_哔哩哔哩_bilibili 感觉关键是多看右边Options菜单&#xff0…

Simulation Extractable Versions of Groth’s zk-SNARK Revisited学习笔记

1. 引言 等人2020年论文《Simulation Extractable Versions of Groth’s zk-SNARK Revisited》&#xff0c;开源代码实现见&#xff1a; https://github.com/Baghery/ABPR22&#xff08;Rust&#xff0c;基于arkworks开发。使用了Multi-Scalar Multiplication (MSM)技术来优化…

linux下使用ftp下载服务器数据

首先确认服务器地址 比如我要从uniprot获取数据&#xff0c;需要先ping服务器地址&#xff1a; 可见&#xff0c;ftp地址不需要前面的https 匿名登录 匿名&#xff1a;anonymous 密码&#xff1a;任意邮箱&#xff0c;如123163.com 这里的传输模式我使用的是二进制&#xff…

Revit进入Unity教程

一、背景 小伙伴们是否有Revit进入Unity交互的需求呢&#xff1f; 二、实现功能 1.Revit进入Unity,包含模型属性&#xff0c;材质&#xff0c;轻量化等 2.实现BIM构件点选&#xff0c;高亮&#xff0c;属性展示 3.实现BIM模型分层显示&#xff0c;爆炸等效果 学习教程&…