-
2021-05-24 21:56:23
封装带AXI接口的自定义IP核
为了更方便地使用外部接口驱动或进行系统级的设计时,可以考虑将RTL设计打包制作成自定义的IP核,Vivado会自动生成相关的IP核接口;或者为了在ZYNQ中使用AXI总线将硬核与FPGA硬件部分互联,可以将FPGA部分的RTL设计打包成自定义IP核,Vivado会自动将生成的IP核的接口制作好,使用图形化界面就能快速实现SoC设计。特别地,可以使用这种方法在硬核外挂载软核
在Vivado的设计思想中,一个IP核就相当于一个函数,可以通过重用IP核做到模块化设计的效果
可以参考Xilinx Vivado封装自定义IP参考手册【代号ug1118】来获得更详细的操作指示
第一部分仅说明带AXI接口的自定义IP核封装方法
创建与封装自定义IP的意义
在Vivado中含有一个IP Catalog流程,可以将下列源文档封装成自定义的IP
- RTL级HDL源文件
- 模拟模型文件
- 示例设计文件
- Testbench
- 项目文件目录
- Block Design
同时Vivado也内置了Xilinx自制IP、第三方IP、用户定义IP的库
比起传统“Add Module”将RTL代码以中间级模块的方式例化添加到顶层模块,再封装出统一的顶层模块这样的操作流程,通过可视化的IP核管理可以更快速地实现项目模块化和后期完善修改流程
创建自定义IP
示例程序使用自定义的IP实现LED呼吸灯效果
这个IP使用AXI接口与ZYNQ的硬核连接,可以使用软件控制IP核的“外设控制寄存器”来对自定义IP核的工作状况进行控制
创建IP工程
为了更好管理自定义IP核,通常将用户的RTL代码统一管理在独立目录下
在Vivado开始界面选择【Tasks】-【Manage IP】,选择新建一个IP核管理目录或打开已有目录,并新建项目
根据自己的硬件设备和习惯使用的HDL选择针对性的选项
完成创建后,选择【Tools】-【Create and Package New IP】
如果准备创建一个单独的IP,可以直接Next,相关内容在下一部分介绍;在这里因为准备创建的项目需要使用到AXI4接口与硬核交互,所以选择最后这个选项
设置IP核名称后如下图进行AXI接口设置
其中AXI接口有三种类型:
- Lite:适合数据量较小、速度较快的信号传输
- Full:全规格的AXI总线,适合标准类型的数据传输
- Stream:数据流传输,适合音视频信号等大规模数据的高速传输
还有两种模式:
- Slave:从模式,IP接受外部数据控制
- Master:主模式,IP控制外部设备
完成设置后可以看到右侧User Repository中出现了自定义IP核
这里右键IP核,选择【Edit in IP Packager】,之后Vivado会打开一个新界面用于管理IP核的RTL代码
自动生成的RTL代码分为两部分,一个是顶层模块,另一个是AXI总线接口逻辑;RTL代码中还默认生成了AXI总线相关逻辑的例化和提供给用户使用的区域(包括自定义参数、自定义端口、自定义顶层模块例化),但是需要注意:如果在AXI总线上开辟了独立的新端口,需要将相关代码单独添加到AXI总线逻辑的RTL代码中
编写IP内部RTL代码
顶层例化代码如下所示:
`timescale 1 ns / 1 ps module breath_LED_IP_v1_0 # ( // Users to add parameters here // User parameters ends // Do not modify the parameters beyond this line // Parameters of Axi Slave Bus Interface S0_AXI parameter integer C_S0_AXI_DATA_WIDTH = 32, parameter integer C_S0_AXI_ADDR_WIDTH = 4 ) ( // Users to add ports here // User ports ends // Do not modify the ports beyond this line // Ports of Axi Slave Bus Interface S0_AXI input wire s0_axi_aclk, input wire s0_axi_aresetn, input wire [C_S0_AXI_ADDR_WIDTH-1 : 0] s0_axi_awaddr, input wire [2 : 0] s0_axi_awprot, input wire s0_axi_awvalid, output wire s0_axi_awready, input wire [C_S0_AXI_DATA_WIDTH-1 : 0] s0_axi_wdata, input wire [(C_S0_AXI_DATA_WIDTH/8)-1 : 0] s0_axi_wstrb, input wire s0_axi_wvalid, output wire s0_axi_wready, output wire [1 : 0] s0_axi_bresp, output wire s0_axi_bvalid, input wire s0_axi_bready, input wire [C_S0_AXI_ADDR_WIDTH-1 : 0] s0_axi_araddr, input wire [2 : 0] s0_axi_arprot, input wire s0_axi_arvalid, output wire s0_axi_arready, output wire [C_S0_AXI_DATA_WIDTH-1 : 0] s0_axi_rdata, output wire [1 : 0] s0_axi_rresp, output wire s0_axi_rvalid, input wire s0_axi_rready ); // Instantiation of Axi Bus Interface S0_AXI breath_LED_IP_v1_0_S0_AXI # ( .C_S_AXI_DATA_WIDTH(C_S0_AXI_DATA_WIDTH), .C_S_AXI_ADDR_WIDTH(C_S0_AXI_ADDR_WIDTH) ) breath_LED_IP_v1_0_S0_AXI_inst ( .led(led), .S_AXI_ACLK(s0_axi_aclk), .S_AXI_ARESETN(s0_axi_aresetn), .S_AXI_AWADDR(s0_axi_awaddr), .S_AXI_AWPROT(s0_axi_awprot), .S_AXI_AWVALID(s0_axi_awvalid), .S_AXI_AWREADY(s0_axi_awready), .S_AXI_WDATA(s0_axi_wdata), .S_AXI_WSTRB(s0_axi_wstrb), .S_AXI_WVALID(s0_axi_wvalid), .S_AXI_WREADY(s0_axi_wready), .S_AXI_BRESP(s0_axi_bresp), .S_AXI_BVALID(s0_axi_bvalid), .S_AXI_BREADY(s0_axi_bready), .S_AXI_ARADDR(s0_axi_araddr), .S_AXI_ARPROT(s0_axi_arprot), .S_AXI_ARVALID(s0_axi_arvalid), .S_AXI_ARREADY(s0_axi_arready), .S_AXI_RDATA(s0_axi_rdata), .S_AXI_RRESP(s0_axi_rresp), .S_AXI_RVALID(s0_axi_rvalid), .S_AXI_RREADY(s0_axi_rready) ); // Add user logic here // User logic ends endmodule
默认生成的顶层代码大同小异,无非是AXI总线有无的区别
这里省略AXI总线逻辑代码(太长了)
注意改动代码时如果涉及到接口,需要同时修改顶层代码和AXI总线实现
其中比较常用的部分已经被Vivado自动空出来,如下所示:
//在开头有这四行代码 // Users to add parameters here //中间可以存放自定义的参数 // User parameters ends ...... // Users to add ports here //中间可以存放自定义的端口代码 // User ports ends ...... //在末尾有这两行代码 // Add user logic here //中间就可以存放自定义的模块顶层例化代码 // User logic ends
右键点击【Design Sources】,选择添加新的HDL文件,编写呼吸灯控制代码,如下所示,并保存
module breath_led( input clk , //时钟信号 input _rst , //复位信号 input sw_ctrl , //控制寄存器:呼吸灯开关控制信号 1:亮 0:灭 input led_en , //控制寄存器:设置呼吸灯频率设置使能信号 input [9:0] set_freq_step , //控制寄存器:设置呼吸灯频率变化步长 output led //输出引脚,控制LED ); parameter START_FREQ_STEP = 10'd100; //设置频率步长初始值 reg [15:0] period_cnt ; //周期计数器 reg [9:0] freq_step ; //呼吸灯频率间隔步长 reg [15:0] duty_cycle ; //设置高电平占空比的计数点 reg inc_dec_flag; //用于表示高电平占空比的计数值,是递增还是递减 //为1时表示占空比递减,为0时表示占空比递增 wire led_t ; //将周期信号计数值与占空比计数值进行比较,以输出驱动led的PWM信号 assign led_t = ( period_cnt <= duty_cycle ) ? 1'b1 : 1'b0 ; assign led = led_t & sw_ctrl; //周期信号计数器在0-50_000之间计数 always @ (posedge clk) begin if (!_rst) period_cnt <= 16'd0; else if(!sw_ctrl) period_cnt <= 16'd0; else if( period_cnt == 16'd50_000 ) period_cnt <= 16'd0; else period_cnt <= period_cnt + 16'd1; end //设置频率间隔 always @(posedge clk) begin if(!_rst) freq_step <= START_FREQ_STEP; else if(led_en) begin if(set_freq_step == 0) freq_step <= 10'd1; else if(set_freq_step >= 10'd1_000) freq_step <= 10'd1_000; else freq_step <= set_freq_step; end end //设定高电平占空比的计数值 always @(posedge clk) begin if (_rst == 1'b0) begin duty_cycle <= 16'd0; inc_dec_flag <= 1'b0; end else if(!sw_ctrl) begin duty_cycle <= 16'd0; //呼吸灯开关关闭时,信号清零 inc_dec_flag <= 1'b0; end else if(period_cnt == 16'd50_000) //每次计数完了一个周期,就调节占空比计数值 begin if(inc_dec_flag) //占空比递减 begin if(duty_cycle == 16'd0) inc_dec_flag <= 1'b0; else if(duty_cycle < freq_step) duty_cycle <= 16'd0; else duty_cycle <= duty_cycle - freq_step; end else begin //占空比递增 if(duty_cycle >= 16'd50_000) inc_dec_flag <= 1'b1; else duty_cycle <= duty_cycle + freq_step; end end else duty_cycle <= duty_cycle; //未计数完一个周期时,占空比保持不变 end endmodule
在Vivado自动生成的AXI总线逻辑文件中如下编写例化:
// Users to add parameters here parameter START_FREQ_STEP = 10'd100, //参数设置 // User parameters ends // Users to add ports here output led, //LED端口 // User ports ends // Add user logic here breath_led #( .START_FREQ_STEP (START_FREQ_STEP) //例化参数 ) u_breath_led( .clk (S_AXI_ACLK), //时钟信号 ._rst (S_AXI_ARESETN), //复位信号 .sw_ctrl (slv_reg0[0]), //AXI信号线0最低位为控制信号 .led_en (slv_reg1[31]), //AXI信号线1最高位为使能信号 .set_freq_step (slv_reg1[9:0]), //AXI信号线1第10位表示步长 .led (led) //输出信号 ); // User logic ends
在Vivado自动生成的顶层文件中如下编写例化:
// Users to add parameters here parameter START_FREQ_STEP = 10'd100, //初始参数值 // User parameters ends // Users to add ports here output led, //LED输出端口例化 // User ports end breath_LED_IP_v1_0_S0_AXI # ( .START_FREQ_STEP(START_FREQ_STEP), //例化参数默认值 .C_S_AXI_DATA_WIDTH(C_S0_AXI_DATA_WIDTH), .C_S_AXI_ADDR_WIDTH(C_S0_AXI_ADDR_WIDTH) ) breath_LED_IP_v1_0_S0_AXI_inst ( .led(led), //例化LED输出端口 .S_AXI_ACLK(s0_axi_aclk), .S_AXI_ARESETN(s0_axi_aresetn), .S_AXI_AWADDR(s0_axi_awaddr), .S_AXI_AWPROT(s0_axi_awprot), .S_AXI_AWVALID(s0_axi_awvalid), .S_AXI_AWREADY(s0_axi_awready), .S_AXI_WDATA(s0_axi_wdata), .S_AXI_WSTRB(s0_axi_wstrb), .S_AXI_WVALID(s0_axi_wvalid), .S_AXI_WREADY(s0_axi_wready), .S_AXI_BRESP(s0_axi_bresp), .S_AXI_BVALID(s0_axi_bvalid), .S_AXI_BREADY(s0_axi_bready), .S_AXI_ARADDR(s0_axi_araddr), .S_AXI_ARPROT(s0_axi_arprot), .S_AXI_ARVALID(s0_axi_arvalid), .S_AXI_ARREADY(s0_axi_arready), .S_AXI_RDATA(s0_axi_rdata), .S_AXI_RRESP(s0_axi_rresp), .S_AXI_RVALID(s0_axi_rvalid), .S_AXI_RREADY(s0_axi_rready) );
编辑完成后即可退回原菜单
点击左侧流程中的【Run Synthesis】即可进行IP核的综合
设置IP的可视化界面
打开xml文件后即可在Vivado中进行编辑,
按顺序设置即可
其中在【Customization Parameters】菜单下会出现“更新参数”的选项提示,更新后会现多出一行自定义的参数,双击它如下图进行设置,即可将这个参数反映到IP可视化界面
完成所有设置并确认无误后,即可在最后选项【Review and Package】中点击【Re-Package IP】即可封装IP
关闭项目后可以在原来的Vivado窗口中看到如下显示
证明完成了IP封装
使用自定义IP
硬件部分
完成封装IP后,在任意工程中点击左侧【IP INTERGRATOR】-【Create Block Design】创建基于IP核的FPGA设计
但此时IP选项列表中没有自定义IP核,需要自己将IP核添加到工程
选择【Tools】-【Settings】-【IP】-【Repository】-【Add(加号+)】选择存放自定义IP的文件目录,即可将自定义的IP核添加到项目
如下图对IP核进行设置
设置ZYNQ系统的DDR控制器和外设后,先进行自动生成原理图,再进行自动布线即可
注意要在led引脚处右键选择【Make External】生成一个引出的外部引脚,并将其改名为led
生成外部引脚的过程就是使能逻辑块与IO块连接的过程
接下来按照正常步骤生成硬件平台配置
由于led端口连接到PL部分,所以需要进行管脚约束才能使用
点击左侧综合按钮,综合后打开引脚设置(I/O Ports),将led_0的引脚映射到PL部分MIO上
根据手头的开发板选择引出引脚即可
这里选用的是PL Bank的P15引脚
最后生成比特流并导出到硬件即可
软件部分
还是原来的步骤从.xsa文件导入配置到Vitis,并创建一个新应用程序
使用的软件代码如下所示
总体思路就是读写外设寄存器映射来的地址对外设寄存器进行操作
#include "stdio.h" #include "xparameters.h" #include "xil_printf.h" #include "breath_led_ip.h" #include "xil_io.h" #include "sleep.h" #define LED_IP_BASEADDR XPAR_BREATH_LED_IP_0_S0_AXI_BASEADDR #define LED_IP_REG0 BREATH_LED_IP_S0_AXI_SLV_REG0_OFFSET #define LED_IP_REG1 BREATH_LED_IP_S0_AXI_SLV_REG1_OFFSET int main() { int freq_flag; int led_state; xil_printf("LED User IP Test!\n"); while(1) { if(freq_flag == 0) { BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,0x800000ef); freq_flag = 1; } else { BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,0x8000002f); freq_flag = 0; } led_state = BREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG0); if(led_state == 0) { BREATH_LED_IP_mWriteReg (LED_IP_BASEADDR, LED_IP_REG0, 1); xil_printf("Breath LED ON\n"); } sleep(5); led_state = BREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG0); if(led_state == 1) { BREATH_LED_IP_mWriteReg (LED_IP_BASEADDR, LED_IP_REG0, 0); xil_printf("Breath LED OFF\n"); } sleep(1); } }
烧录后LED呈呼吸灯效果,且可以看到呼吸灯闪烁频率变化
封装不带AXI接口的IP核
Vivado支持将独立的RTL代码封装为IP核,方便以类似函数的方式重用IP核,同时可使用用户自定义的IP核接口协议
参考【ug1118】手册来获取详细信息
创建自定义IP
IP核逻辑封装
- 创建一个RTL工程
- 编辑IP核的RTL代码
- 验证IP核逻辑并进行仿真
- 创建一个基于已有RTL代码的IP核封装
- 修改顶层文件
- 设置IP核端口和控制引脚端口输入输出模式(端口映射)
- 修改IP核的可视化界面配置进行封装
- 创建接口定义
接口封装
- 编辑接口协议的RTL实现
- 在IP核封装完成后在配置接口定义部分对接口进行相关设置
- 依次调整接口协议封装
- 添加接口协议的RTL文件
- 进行接口RTL文件的顶层文件端口映射
- 点击【Package IP】完成IP核封装
使用自定义IP核
封装好的IP核如果出现适用设备相关的错误,可以直接删除对应的封装信息
使用IP核前需要先对IP核进行验证,可以选择编写testbench(普普通通的ZYNQ-7020板子配那么小的LUT规模直接烧就完事了!),也可以直接烧录到开发板(如果开发板很贵就别这样干了)
IP核验证完毕后就可以随意使用了
封装IP核时可能遇到的问题
-
封装的IP核中包含了其他IP核
如果包含了.xci文件(IP核的配置文件),Vivado会直接用新生成的子IP创建输出文件
如果包含IP核的输出文件,Vivado则会从IP设置中生成HDL和XDC代码
封装时推荐直接使用包含.xci文件的方式打包IP核,这样会方便重用IP和生成输出文件
只要在打包当前IP的时候选择相关选项即可
-
如果在封装前分配好了引脚约束应该怎么办
一般来说使用IP核的时候再进行引脚约束的过程会把之前的引脚约束覆盖掉
但是为了保证不出错,一般在打包前或打包后将IP核的.xdc文件删除
更多相关内容 -
FPGA ——IP核的封装和调用(vivado)
2022-06-15 11:03:43IP核的封装和调用,实例,步骤细!VIVADO提倡的积木式设计,积木就是IP核。用户可以将功能模块设计做成一个一个IP核,然后“组装”起来成为产品。VIVADO本身提供了很多IP核可供用户使用,例如数学运算(乘法器、除法器、浮点运算器等)、信号处理(FFT、DFT、DDS等)。用户也可以使用第三方的IP核来加快设计,例如使用第三方提供的神经网络处理IP核。开发者也可以开发自己的IP核,自己在各个工程中调用或提供给第三方使用。
目录
用一个简单的工程举个例子,工程详解在这篇:
IP核封装
在完成多数表决器工程之后,我们把工程封装成IP核,步骤如下:
(1)菜单栏tools——create and package new IP,弹出的窗口直接点next
(2)选择第一个 package your current project,点击next
(3)之后弹出的创建和封装IP窗口,可以修改路径,下面的保持选项不变,点击next
(4)点OK---OK---finish
创建成功会弹出下面的东西:
IP核调用
创建好的IP核,我们直接搜是搜不到的
(1)project manager栏setting——弹出的窗口选择IP
(2) IP下面点开——repository——点加号——选择IP路径——点击OK
(3) 这个时候我们再搜IP核,就搜到了,后面我们就按照正常步骤来调用这个IP核即可~~
-
Vivado2017.4创建和封装用户IP核(使用Nexys4开发板)
2018-12-05 12:20:14vivado不同于ISE的设计模式,vivado提供了以IP为中心的设计...按照这个链接创建即可,下一步对这个工程封装成一个IP核,然后其他的工程调用这个自定义的ip核 https://blog.csdn.net/kenjianqi1647/article/detail...vivado不同于ISE的设计模式,vivado提供了以IP为中心的设计流程,可以帮助设计者快速的将自己的设计和算法转换成可重用的IP。
IP设计流程:
一、创建用于创建IP的工程
按照这个链接创建即可,下一步对这个工程封装成一个IP核,然后其他的工程调用这个自定义的ip核
https://blog.csdn.net/kenjianqi1647/article/details/84821462
二、设置定制IP的库名和库目录
创建好IP工程之后
1、设置库名和库目录
2、封装定制IP的实现
(1)Tools- Create and IP Package...
(2)IP参数配置
按照自己的需求填写
(3)选择Compatibility,确认该IP核所支持的FPGA类型
(4)File Groups,可以根据自己的需求添加一些额外的文件,如平台测试文件。
(5)Customization Parameters,根据自己的需求定义参数
(6)最后点击Package IP按钮,完成ip封装
最后关闭当前工程
三、创建用于调用IP的工程
1、创建新工程
按照普通方式创建即可
2、设置包含调用IP的路径
3、创建基于IP的系统
(1)Create Block Design
(2)添加自己设计的ip核
(3)连线
(4)点击Create HDL Wrapper...
(4)综合、添加约束文件、实现、生成bit文件、下载即可
-
转载 Vivado创建封装自定义ip
2021-01-28 00:04:12Vivado创建封装自定义ip Vivado进行逻辑设计,经常需要自定义一些模块module,如果模块经常用到把它封装为ip核是更好的选择。另外vivado将带有ip核的HDL module加入到Block design中十分麻烦,我参考一些方法进行...Vivado创建封装自定义ip
Vivado进行逻辑设计,经常需要自定义一些模块module,如果模块经常用到把它封装为ip核是更好的选择。另外vivado将带有ip核的HDL module加入到Block design中十分麻烦,我参考一些方法进行最后仿真却报错不通过了。所以仔细设计module后把其封装成ip,再导入Block design是一个真正行得通的方法。
封装自定义ip核有很多方法:1、把当前工程封装为ip;2、把指定目录的设计文件封装为ip;3、把Block design封装为ip;4、新建AXI接口ip核 关于各种实施方法可以参考xilinx UG1118和UG1119。这里我介绍最简单的方法1,把当前工程封装为ip。
http://blog.chinaaet.com/ad604/p/37169 源自这里,我复读一遍2017.4版本下的流程罢
首先确认自己的工程能实现功能满足需要后再进行封装。点击Tools→Create and Package new IP
然后点击package current project
接下来指定目录,我个人选择单独存放ip的一个文件夹,要说明一下指定的目录会生成多个文件夹,vivado会把工程大体复制一遍到这里,便于以后修改更新后re-package
这里建议勾选include.xci files,.xci文件是ip声明文件而不是当前工程生成ip后的所有文件
接下来会新建一个前面指定目录下的工程,用来设置封装ip
这里新建的工程会多出来一个选项,进行封装ip的设置
然后右边出现的封装设置可以进行手动更改
这里Category就是封装完后,ip存放的目录,最好不要和xilinx官方ip的目录放在一起。可以选加号查看
这个是兼容性,点加号可以让ip支持其他xilinx fpga器件
这里可以编辑ip封装设置
我勾选了create arch ip,因为我看别的教程勾选了。勾选就会生成一个IP的zip压缩包
最后一步
封装完后,使用时,点击Tools→setting→IP,或者通过IP catalog点击ip setting
这里点repository,然后添加封装好的ip路径,就可以在IP catalog中看到User IP了
如果需要更新IP,那么方法就是把之前的工程更新后,再封装成ip。
另外在封装ip的设置,勾选不要删除工程,也可以在ip工程中进行修改。
这里我要推荐更好的Xilinx Vivado IP管理与使用教程:https://www.eefocus.com/antaur/blog/16-11/397929_a1d24.html 这个是大连海事大学一位老师的博客
-
vivado创建自定义IP核
2020-06-03 15:47:40一 创建IP核 1、在tool–>Create and Package New IP 选择保存路径 定义IP核信息,可以添加一些备注信息 封装IP (IP创建完成后会生成IP核压缩包,解压后,会有src文件夹、xgui文件夹、... -
FPGA自创用户IP核创建与封装流程
2019-01-28 12:34:44内容:创建和封装用户IP核流程 友情链接:本人博客园连接 第一步:打开Vivado 2015,新建工程。 第二步:更改工程名和存放路径,点击下一步。 第三步:选择RTL工程,点击下一步。 第四步:点击... -
玩转Zynq连载23——用户自定义IP核的创建与封装
2019-12-31 10:12:47特权同学玩转Zynq连载23——用户自定义IP核的创建与封装 1概述 本节以zstar_ex04文件夹下的led_controller_ip工程为例,演示如何创建一个简单的LED闪烁控制模块的IP核。 创建一个用户自定义IP核,只需要以下3个步骤... -
Vivado创建封装自定义ip
2021-02-01 05:42:43Vivado进行逻辑设计,经常需要自定义一些模块module,如果模块经常用到把它封装为ip核是更好的选择。另外vivado将带有ip核的HDL module加入到Block design中十分麻烦,我参考一些方法进行最后仿真却报错不通过了。... -
ise封装IP
2020-11-27 14:56:06开发环境ISE14.7 本次封装的是一个串口模块 ...注意新创建的文件名和模块名与.ngc文件名称保持一致,不用例化.ngc文件 module uart_ip ( input clk, //系统时钟 50MHz,或者100Mhz,和clk_freq对应 input rst_n, . -
Quartus创建自定义IP核 - LED控制IP核
2018-12-13 17:14:48之前使用Quartus II的Qsys工具软件创建了一个SOPC系统,包含了NIOS II处理器、ROM、RAM、JTAG_UART等IP核,虽然Qsys工具已经提供了非常丰富的IP库,但是有些特殊功能的IP核在Library中是没有的,例如我要控制一个LED... -
在Vivado中创建计数器IP核
2021-11-08 14:24:18这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、... -
Vivado使用技巧(2):封装自己设计的IP核
2017-07-18 16:35:22概述 Vivado在设计时可以感觉到一种趋势,它鼓励用IP核的方式进行设计。“IP Integrator”提供了原理图设计的方式,只需要在其中调用设计好的IP核连线。IP核一部分来自于Xilinx官方IP;一部分来自于第三方IP,... -
Vivado使用技巧:封装自己设计的IP核
2021-01-17 16:22:44概述Vivado在设计时可以感觉到一种趋势,它鼓励用IP核的方式进行设计。“IP Integrator”提供了原理图设计的方式,只需要在其中调用设计好的IP核连线。IP核一部分来自于Xilinx官方IP;一部分来自于第三方IP,其中有... -
基于vivado开发xilinx系列FPGA的冷知识(1)——自定义IP核的封装与后期修改
2020-12-25 22:07:18第一篇来介绍下开发完毕后以IP核形式打包工程文件的一些操作。 可能很多人是以纯verilog代码+IP核xci文件的形式开发的,这样移植起来确实算是很方便,但是一旦这个工程文件离开你的电脑,你经常会遇到一些问题: 1... -
MC8051单片机IP核的FPGA实现与应用
2020-08-10 21:27:35本文在分析了MC805lIP Core的结构原理,设计层次,内核各组成模块及参数设置的基础上,详细论述了MC8051 IP核的FPGA实现与应用的实际设计步骤。 -
Vivado中RTL封装IP流程
2021-05-13 17:17:13Vivado中RTL封装IP流程 前言 本文记录自己将RTL代码封装成IP的流程,以供之后查阅使用。最近一个月在做一个数据仲裁与转发的项目,已经完成功能仿真,准备将其封装成IP在Block Design中进行调用。实验平台为Vivado ... -
听说Zynq-手把手教你自定义ip核并调用
2021-05-22 00:56:29概述小编最近在研究Zynq,因为对其相对陌生,在探索过程中也遇到了不少坑,这里将如何创建IP核并调用的方法步骤总结记录,以免日后忘记。注意★环境:Vivado2018.2。开发板:digi... -
基于IP-IN-IP协议的未来移动分组核心网-研究论文
2021-05-19 16:54:55所提出的方案基于封装在IP(IP-in-IP)中的IP,用于移动性管理和数据传递。 在此方案中,核心网络通过第3层交换(L3S)起作用,并且基于IP-in-IP路由实现数据传递,从而消除了GTP隧道协议。 对于彼此相邻的eNB元素... -
IP核创建流程
2018-07-20 12:25:55从各大精华帖总结用vivado封装IP的主要流程 一、将已有的FPGA功能模块封装成IP 在Vivado工程中,选择菜单栏中的Tools,然后再下拉菜单中选择Creat and Package IP… 。如图1所示。 图1 创建或打包IP ... -
如何将自己写的verilog模块封装成IP核(一)
2017-04-29 12:25:32平台与材料 一个写好的工程,综合通过,不用布局布线,...打开Vivado,创建一个工程 Tools -> Create or package IP 里面有三个选项,分别是打包本工程,打包本工程的一个Design,打包一个目录下的工程。 一 -
Vivado封装、调用IP核及Diagram设计
2020-10-29 20:19:151、首先制作IP核需要把对应封装的电路程序设为顶层文件。 2、设置IP核的库名和位置 3、自定义自己的IP核 现在已经能看到封装好的IP核了。 4、下一步调用这个封装的半加器IP核,构建全加器电路 搜索添加刚才... -
如何将自己写的verilog模块封装成IP核
2018-09-18 23:10:00如何将自己写的verilog模块封装成IP核 (2014-11-21 14:53:29) 转载▼ 标签: 财经 分类: 我的东东 =======================第一篇======================= 如何将自己写的verilog模块封装成IP核 将... -
Vivado 自定义VHDL的IP核
2020-12-29 18:55:20文章目录自定义VHDL的IP核一、创建IP核1.1 创建IP核管理工程1.2 设置IP核管理工程1.3 设置IP核二、编辑IP核2.1 打开IP核工程2.2 编辑IP核顶层文件2.3 自定义IP核inst文件三、完成IP核封装配置说明 一、创建IP核 ... -
VIVADO封装包含xilinx IP的自定义IP
2021-08-24 18:54:13项目需要,需要创建一个block design,所以需要将自己写的模块封装成IP。其中,自己的模块中包含bram IP。 注意点 1.封装的时候,工具经常性会错误识别顶层模块,这会导致一些设置需要修改。为了克服这一个问题,先... -
关于FIR IP核使用过程中遇到的问题
2017-12-20 15:24:22第一次用IP核,出现过几个问题,卡了一天吧,现在记录问题如下: 1、关于导入文件数据问题: initial $readmemh("F:/fir/fir_text/input.txt", Mem); 用到上面的这个语句,一直导入不了数据,原因就是路径斜杠方向... -
vivado自定义 IP 核实验
2020-11-24 21:54:48vivado软件提供了创建核封装IP向导的方式来自定义IP核,可以帮助我们实现定制化系统设计,这些设计还可以在其他系统是哪个实现重用。 下面以创建一个能产生PWM波形的IP核在开发板上实现呼吸灯为例来进行介绍。该IP核... -
VIVADO中封装基于AXI4_LITE总线接口IP核注意事项
2019-06-28 22:44:551.以manage ip的方式创建 Tools>create and package...,配置该IP 的名称,并且选择该IP 的保存路径。默认的IP 核存放路径与manage IP 的工程路径是一个层次。 建议以后养成习惯:专门建一个manage IP工程... -
将自己做的FPGA工程封装成一个IP核
2016-06-30 22:28:49利用Vivado的自带工具打包IP核 -
FPGA:将FIFO封装成AXI接口的IP
2022-07-05 16:28:26封装AXI_stream的接口IP核