使用vivado封装IP

article/2025/10/7 10:43:31

文章目录

    • Basics
    • 定制IP的参数
    • Enablement Expression
    • 封装IP时使用了绝对路径
    • 封装IP时设置Address Map Addr
    • 相关tcl
    • 修正警告
      • Bus Interface 'clk': ASSOCIATED_BUSIF bus parameter is missing.
      • rst识别成低有效复位
      • Bus Interface 'up_axi': FREQ_HZ bus parameter missing from AXI interface when interface is not associated to a clock.
    • 打开IP-XACT来管理IP
    • Package as a library core
    • 自定义IP包含xilinx ip时的选项
    • 自定义IP时设置logo
    • 封装IP时生成自定义总线接口
    • 使用vivado自定义总线接口
    • 在BD中添加RTL Module时使用自定义总线接口
    • 将旧版vivado IP添加到新版vivado IP仓库中
    • 将HDL源码(含网表文件)封为IP
    • 将MicroBlaze/MCS的bd文件(含elf)封装为IP
    • AR
      • AR66292 - Vivado IP Flows - Sub-core reference is not updated for migrated project even though the parent IP core was upgraded
      • AR75421 - Using Packaged IP library core and referencing as VHDL library
      • AR65277 封装IP时,设置动态端口
    • 其他
  • ttcl

Basics

  • Vivado IP 封装器可以自动 推断IP的 时钟和复位接口, 这样有助于在 IPI验证BD文件中验证封装IP的时钟、复位信号
  • 对于自定义的IP,可以在IP Catlog中出现多个版本
    在这里插入图片描述
  • 可以在封装IP时,设置parameter的类型、范围;并提供启用表达式,实现一些定制功能

定制IP的参数

参数分为两类,一类显示在GUI界面中(可以由用户设置)可以在GUI界面中;另一类则不显示在GUI界面中(不能由用户设置,其参数值通常是由GUI 中显示的参数来确定的)。
在这里插入图片描述

  • 添加参数时,只能添加在自定义 GUI 中使用的参数
  • 删除参数后,IP则会使用相应参数的默认值
    在这里插入图片描述

Enablement Expression

在这里插入图片描述

封装IP时使用了绝对路径

Is it possible in Vivado to package a custom IP with relative paths for all rtl

在这里插入图片描述
看这段描述是说,如果封装IP时引用了IP所在目录之外的文件,则这些引用文件会使用绝对路径。这时,在确保路径正确的情况下,手动修改component.xml中的绝对路径为相对路径即可。

封装IP时设置Address Map Addr

IP Packager “Addressing and Memory” customizations?
在这里插入图片描述

封装了一个IP,使用了AXI接口,因此需要进行地址映射的分配。进行了如下三种尝试,

case 1:封装IP时,base address设为0x10000000,此时在BD中两个IP自动分配的地址相同,修改它们的基地址时出错
在这里插入图片描述

case 2:封装IP时,base address设为0x10000000,此时在BD中两个IP自动分配的地址不同,但修改它们的基地址时出错
在这里插入图片描述

case 3:封装IP时,base address设为0,此时在BD中两个IP自动分配的地址不同,可以修改它们的基地址
在这里插入图片描述

相关tcl

help ipx::*

在这里插入图片描述

修正警告

Bus Interface ‘clk’: ASSOCIATED_BUSIF bus parameter is missing.

在这里插入图片描述

The IP Packager checks for the ASSOCIATED_BUSIF parameter for all clock interfaces.The reason for the warning is that IP Integrator works best with interfaces, and it was expected that user would typically be using AXI interfaces. If you do not have any bus interfaces in your design, you can safely ignore this warning.

IP Packager 会检查所有时钟接口的 ASSOCIATED_BUSIF 参数。发出警告的原因是 IP Integrator 最适用于接口,并且预计用户通常会使用 AXI 接口。 如果您的设计中没有任何总线接口,您可以放心地忽略此警告。

在这里插入图片描述

rst识别成低有效复位

在这里插入图片描述

For reset signals that end with n such as resetn and aresetn which implies an active-Low signal, the interface automatically sets the POLARITY parameter to active_Low. This parameter is used in the Vivado IP integrator to determine if the reset is properly connected when the block diagram is generated. For all other reset interfaces, the POLARITY parameter is not set, and is determined through the parameter propagation feature of IP integrator.

对于以 n 结尾的复位信号,例如 resetn 和 aresetn,这意味着低电平有效信号,接口会自动将 POLARITY 参数设置为 active_Low。 该参数用于 Vivado IP 集成器中,用于在生成框图时确定复位是否正确连接。 对于所有其他复位接口,不设置 POLARITY 参数,通过 IP 集成器的参数传播特性确定

Bus Interface ‘up_axi’: FREQ_HZ bus parameter missing from AXI interface when interface is not associated to a clock.

IP_Flow 19-3158 - FREQ_HZ bus parameter missing from AXI interface when interface is not associated to a clock

在这里插入图片描述
2018.2 Vivado IP Flows - Generate RTL kernel gives three parameter warnings related to an RTL kernel wizard IP block

打开IP-XACT来管理IP

在这里插入图片描述

Package as a library core

在这里插入图片描述

自定义IP包含xilinx ip时的选项

在这里插入图片描述
在这里插入图片描述

自定义IP时设置logo

添加Utility XIT/TTCL的group,并添加logo图片,将Type从image修改成logo
在这里插入图片描述
为方便计,将常用的tcl命令写成脚本,直接通过custom tcl命令执行,
在这里插入图片描述

封装IP时生成自定义总线接口

打开IP封装界面,选择需要封到总线里的端口,选择"Create Interface Definition",
在这里插入图片描述
此时,会弹出界面,来设置生成总线的存储位置,此处选择存放在封装IP的目录中,
在这里插入图片描述
生成总线的各个信号名称,是和端口名称一致的,可以直接使用,也可以重新修改,
在这里插入图片描述
如果总线的信号名称有修改,需要进行port的映射,如下
在这里插入图片描述
之后封装IP,并添加到IP路径中,会发现vivado能扫描到封装的IP以及相应的总线接口,在bd文件中添加IP后,会发现各个端口集成在总线接口中
在这里插入图片描述

使用vivado自定义总线接口

在这里插入图片描述

在BD中添加RTL Module时使用自定义总线接口

在封装IP自定义总线接口时,能看到生成了如下的xml文件,其中包含了总线接口的定义,
在这里插入图片描述
在VHDL文件中,使用attribute进行总线接口的映射,如下

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;entity test_1 is
port (clk      : in  std_logic;data_0   : in  std_logic_vector(3 downto 0);data_1   : in  std_logic_vector(3 downto 0);data_2   : in  std_logic_vector(3 downto 0);data_3   : in  std_logic_vector(3 downto 0);ctrl_0   : out std_logic_vector(3 downto 0);ctrl_1   : out std_logic_vector(3 downto 0)
);
end test_1;architecture Behavioral of test_1 issignal data : unsigned(5 downto 0);attribute X_INTERFACE_INFO : string;attribute X_INTERFACE_INFO of data_0 : signal is "xilinx.com:user:DATA_CTRL_BUS:1.0 DATA_CTRL_BUS data_A";attribute X_INTERFACE_INFO of data_1 : signal is "xilinx.com:user:DATA_CTRL_BUS:1.0 DATA_CTRL_BUS data_B";attribute X_INTERFACE_INFO of data_2 : signal is "xilinx.com:user:DATA_CTRL_BUS:1.0 DATA_CTRL_BUS data_C";attribute X_INTERFACE_INFO of data_3 : signal is "xilinx.com:user:DATA_CTRL_BUS:1.0 DATA_CTRL_BUS data_D";attribute X_INTERFACE_INFO of ctrl_0 : signal is "xilinx.com:user:DATA_CTRL_BUS:1.0 DATA_CTRL_BUS ctrl_A";attribute X_INTERFACE_INFO of ctrl_1 : signal is "xilinx.com:user:DATA_CTRL_BUS:1.0 DATA_CTRL_BUS ctrl_B";beginprocess(clk)beginif rising_edge(clk) then    data   <= resize(unsigned(data_0),6) + resize(unsigned(data_1),6) + resize(unsigned(data_2),6) + resize(unsigned(data_3),6);ctrl_0 <= std_logic_vector(data(3 downto 0));ctrl_1 <= std_logic_vector(data(5 downto 2));end if;end process;
end Behavioral;
--------------------------------------------------------------------------
library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;
entity test_2 is
port (clk      : in  std_logic;data_0   : out std_logic_vector(3 downto 0);data_1   : out std_logic_vector(3 downto 0);data_2   : out std_logic_vector(3 downto 0);data_3   : out std_logic_vector(3 downto 0);ctrl_0   : in  std_logic_vector(3 downto 0);ctrl_1   : in  std_logic_vector(3 downto 0);dout     : out std_logic_vector(7 downto 0)
);
end test_2;architecture Behavioral of test_2 isattribute X_INTERFACE_INFO : string;attribute X_INTERFACE_INFO of data_0 : signal is "xilinx.com:user:DATA_CTRL_BUS:1.0 DATA_CTRL_BUS data_A";attribute X_INTERFACE_INFO of data_1 : signal is "xilinx.com:user:DATA_CTRL_BUS:1.0 DATA_CTRL_BUS data_B";attribute X_INTERFACE_INFO of data_2 : signal is "xilinx.com:user:DATA_CTRL_BUS:1.0 DATA_CTRL_BUS data_C";attribute X_INTERFACE_INFO of data_3 : signal is "xilinx.com:user:DATA_CTRL_BUS:1.0 DATA_CTRL_BUS data_D";attribute X_INTERFACE_INFO of ctrl_0 : signal is "xilinx.com:user:DATA_CTRL_BUS:1.0 DATA_CTRL_BUS ctrl_A";attribute X_INTERFACE_INFO of ctrl_1 : signal is "xilinx.com:user:DATA_CTRL_BUS:1.0 DATA_CTRL_BUS ctrl_B";beginprocess(clk)beginif rising_edge(clk) then    data_0 <= X"0";data_1 <= X"1";data_2 <= X"2";data_3 <= X"3";dout   <= ctrl_0 & ctrl_1;end if;end process;
end Behavioral;

在BD中使用add module添加RTL文件,效果如下,
在这里插入图片描述

将旧版vivado IP添加到新版vivado IP仓库中

在vivado的安装路径的IP文件夹下,其实存在多个版本的IP,但是通过IP Catlog使用IP时,却只能使用最新版本的IP;如果将旧版IP拷贝到别处,手动添加到IP仓库中后,则旧版IP可用,但vivado会提示同一IP出现两次,IP仓库中的IP会处于active状态。
在这里插入图片描述
这一发现提示我们,可用将旧版vivado的IP放到新版vivado的IP仓库中,这一的话,在使用新版本vivado打开旧版工程时,就不用升级IP了。
在这里插入图片描述

将HDL源码(含网表文件)封为IP

实测了一下,

  • 当网表文件为dcp时,不能封装IP
  • 当网表文件为edif时,能够封装IP
  • 如果一个HDL模块中例化了dcp或edif网表,则在BD文件中,不能通过Add RTL Module的方式加入该HDL模块

目前来看,如果想将网表封装在IP中,或者在BD文件中使用,则一个比较好的方式是,将网表通过write_verilog或write_vhdl的方式转换成HDL网表。

将MicroBlaze/MCS的bd文件(含elf)封装为IP

在工程中,将elf关联到综合、仿真中,然后在封装IP时选择封装BD设计即可。不过,有一点要注意,一般含MicroBlaz的BD,复位信号都是低有效,这个复位信号的有效电平最好不要修改。如果复位改为高有效,则单独使用BD文件时没什么问题,但如果使用封装的IP,则会发现复位依然是低电平有效。
在这里插入图片描述

AR

AR66292 - Vivado IP Flows - Sub-core reference is not updated for migrated project even though the parent IP core was upgraded

在这里插入图片描述

AR75421 - Using Packaged IP library core and referencing as VHDL library

在这里插入图片描述

AR65277 封装IP时,设置动态端口

在这里插入图片描述

其他

xilinx的一些IP,如axi_lite_ipif、axi_master_burst等,在IP Catlog中不显示,原因是在component.xml中,ishidden属性设置成了true,可以修改成false。

ttcl

TemplaTcl: a Tcl template engine


http://chatgpt.dhexx.cn/article/gjmZkPo6.shtml

相关文章

vivado使用方法(初级)

文章目录 1 创建新工程1.1 工程创建1.2 新建Verilog文件1.3 仿真 参考 1 创建新工程 1.1 工程创建 1、首先打开Vavido软件&#xff0c;点击Creat Project或者在File——>Project——>New里面进行新工程的创建 2、然后在弹出的界面上点击Next进入下一个界面进行项目的命…

Vivado基础教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、创建项目二、添加设计文件代码 三、综合四、添加约束文件五、上板5.1、生产比特流文件5.2、硬件调试 前言 本文详细的讲述了vivado项目创建到上板的流程。…

vivado基本使用流程(详细版,一步步跟着来一定能成功)

创建工程 1、 2 3、项目名称不能有空格&#xff0c;目录不能含有中文路径 4、 5、 6、 7、 8、 9、 10、 11、 12、 13、 14、 15、 16、 可以查看一下新建的文件 二、设置IP核 1、 2、 3、 4、 5、 6、 7、 可以查看到生成的ip核 8、 找到例化模板&#xff0c;日常…

虚拟基类

对于虚拟基类的个人理解&#xff0c;如有误恳请指正。 1.不用虚拟基类 class cBase_A{int x; public:cBase_A( ){x10;}int getx(){return x;}void setx(int a){xa;}};class cBase_B: public cBase_A{ };class cBase_C: public cBase_A{ };class cDerived_D: public cBase_B…

系统调用。

什么是系统调用&#xff0c;有何作用&#xff1f; 生活场景:你去学校打印店打印论文&#xff0c;当你按下“打印”之后&#xff0c;打印机开始工作。你的论文打印到一半时&#xff0c;另一位同学按下了“打印”按钮开始打印他自己的论文。最终&#xff0c;你的论文和该同学的论…

C++ 基础之虚函数和虚基类

C 基础之虚函数和虚基类 C 有别于 C ,比较重要的就是其抽象、封装、继承和多态等特性。多态又具体地体现在重载、虚函数和模板等等之上。 今天就和大家聊一聊虚函数和虚基类。 虚函数 我们来思考一个问题。假如子&#xff08;派生&#xff09;类 B 继承自父&#xff08;基&…

虚基类 的作用

虚基类 需要解决的问题 当派生类从多个基类派生&#xff0c;而这些基类又共同基类&#xff0c;则在访问此共同基类中的成员时&#xff0c;将产生冗余&#xff0c;并有可能因冗余带来不一致性虚基类声明 以virtual说明基类继承方式例&#xff1a;class B1:virtual public B作用…

虚基类的作用

1 概念 首先还是先给出虚继承和虚基类的定义。虚继承&#xff1a;在继承定义中包含了virtual关键字的继承关系&#xff1b; 虚基类&#xff1a;在虚继承体系中的通过virtual继承而来的基类&#xff0c;需要注意的是&#xff1a; CSubClass : public virtual CBase {}; 其中CB…

系统调用:系统调用的实现

7.3.3 系统调用的实现 1. 中断和陷入硬件机构 (1) 什么是中断和陷入。 中断是指CPU对系统发生某事件时的这样一种响应&#xff1a;CPU暂停正在执行的程序&#xff0c;在保留现场后自动地转去执行该事件的中断处理程序&#xff1b;执行完后&#xff0c;再返回到原程序的断点处继…

系统调用、函数调用

1、系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境来使应用程序具有更好的兼容性&#xff0c;为了达到这个目的&#xff0c; 内核提供一系列具备预定功能的多内核函数&#xff0c;通过一组称为系统调用&#xff08;system call)的接口呈现给…

C++ 虚基类

C 虚基类 概述多重继承的问题虚基类初始化例子 总结 概述 虚基类 (virtual base class) 是用关键字 virtual 声明继承的父类. 多重继承的问题 N 类: class N { public:int a;void display(){cout << "A::a" << a <<endl;} };A 类: class A :…

虚基类

虚基类 意义:假设定义了一个公共基类A。类B和类C都由类A公有派生,类D由类B和类C公有派生。显然D包含类A的两个拷贝,不仅多占用内存,而且还造成多个拷贝的数据不一致。 不定义虚基类的效果如下: class A {public:int x;void SetX(int a) { x = a; }A(int a = 0) { x = a…

【操作系统】系统调用

文章目录 系统调用系统调用举例文件拷贝的系统调用过程应用程序接口系统调用接口C语言系统调用接口Windows和UNIX系统调用示例系统调用与的库函数区别补充说明系统调用 系统调用,System call,提供了操作系统的服务接口。这些系统调用通常以C或C++编写,对某些底层任务可能以…

C++之基类调用自己的虚函数

每个类中存在虚函数时&#xff0c;当构造一个对象时&#xff0c;系统会为对象分配相应的内存空间。但是虚函数表存放在程序的只读数据段中&#xff0c;在实例化对象时&#xff0c;编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable&#xff1b; 下面看一个小例子&#x…

如何调用基类私有的虚函数

直接看代码 #include <iostream> #include <stdio.h> using namespace std;class person { public:virtual void name(){cout<<"A::name"<<endl;}private:virtual void sex(){cout<<"A::sex"<<endl;} };class studen…

详解虚函数的实现过程之虚基类(4)

博客虚函数实现过程3 时提到过虚基类&#xff0c;这里呢&#xff0c;我们来详细讲述一下&#xff1a; 当我们在虚函数的声明结尾处添加“0”&#xff0c;这种虚函数就被称为纯虚函数。 它好似一个没有实现只有声明的函数&#xff0c;它的存在就是为了让类具有抽象类的功能&…

虚基类的基本概念

1.虚基类的作用 类B与类C都为类D的基类&#xff0c;而类A为类B与类C的基类&#xff0c;因此类D会继承类B与类C的多份同名成员。如下图所示&#xff1a; 在引用这些同名成员时&#xff0c;必须在派生类对象后增加直接基类名&#xff0c;以避免产生二义性&#xff0c;如&#x…

【虚基类、虚函数及应用】

虚基类 1.虚基类存在的意义 当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处&#xff0c;这个公共的基类就会产生多个实例(或多个副本)&#xff0c;若只想保存这个基类的一个实例&#xff0c;可以将这个公共基类说明为虚基类。 在继承中产生歧义的原因有可能是…

虚函数的调用机理

C中&#xff0c;必然会接触到虚函数这个概念&#xff0c;那么&#xff0c;会不会对虚函数的内部机理产生疑问呢&#xff1f;而这里&#xff0c;就是对其的简单的研究&#xff08;本人水平有限(&#xff61;•́︿•̀&#xff61;) &#xff09; 首先&#xff0c;先来简单介绍…