vivado 自定义ip【基于AXI总线协议】及调用

本文介绍了如何在固定目录或当前工程下创建IP核,重点讲解了封装AXI4接口的过程,包括设置IP核属性、选择AXI接口类型和模式。内容还涉及到了IP逻辑的修改、编辑IP工程、添加Verilog功能文件。最后提到了配置完成后生成顶层、创建bit流和硬件信息,并在SDK中进行进一步操作。文章还提及了IP核的控制文件和寄存器读写方法。
摘要由CSDN通过智能技术生成

1.可以在固定目录下也可在当前工程下

这是在固定目录下建立ip
在这里插入图片描述
当前工程:tools->creat new ip
在这里插入图片描述

2封装ip

  1. 封装 IP 或者创建一个带 AXI4 接口的 IP 核,选择创建一个带有 AXI4 接口的 IP 核。调用时候当作ARM的外设,一个模块调用。
    在这里插入图片描述
  2. 设置 IP 核名称、版本号、显示名、描述、保存路径。
    在这里插入图片描述
  3. AXI接口类型选择,模式选择,寄存器的宽度。一般选择lite轻量级,具体可以看看axi协议得说明和使用范围
    在这里插入图片描述
    ip核创建完成,此时修改IP逻辑,用户自定ip查看方式
    在这里插入图片描述
  4. 修改ip功能,自动生成一个ip工程对当前ip配置。右键点击编辑IP,会进入IP修改工程。
    在这里插入图片描述
  5. 打开ip工程后,添加Verilog功能文件。这个就是逻辑代码
    在这里插入图片描述
    在这里插入图片描述
`timescale 1ns / 1ps
module ax_pwm
#(
	parameter N = 32 //pwm bit width 
)
(
    input         clk,
    input         rst,
    input[N - 1:0]period,
    input[N - 1:0]duty,
    output        pwm_out 
    );
 
reg[N - 1:0] period_r;
reg[N - 1:0] duty_r;
reg[N - 1:0] period_cnt;
reg pwm_r;
assign pwm_out = pwm_r;
always@(posedge clk or posedge rst)
begin
    if(rst==1)
    begin
        period_r <= { N {1'b0} };
        duty_r <= { N {1'b0} };
    end
    else
    begin
        period_r <= period;
        duty_r   <= duty;
    end
end

always@(posedge clk or posedge rst)
begin
    if(rst==1)
        period_cnt <= { N {1'b0} };
    else
        period_cnt <= period_cnt + period_r;
end

always@(posedge clk or posedge rst)
begin
    if(rst==1)
    begin
        pwm_r <= 1'b0;
    end
    else
    begin
        if(period_cnt >= duty_r)
            pwm_r <= 1'b1;
        else
            pwm_r <= 1'b0;
    end
end

endmodule

  1. 点开ax_pwm_v2_0.v文件,可以理解为顶层,这是外部看到的一个界面,里面例化的是IP的协议层,所有IP都需要通过这个协议连接,最顶层需要一个输出。pwm
    在这里插入图片描述
    顶层在ax_pwm_v1_0例化协议层,定义pwm输出连接在协议中。
    在这里插入图片描述
    ax_pwm_v1_0_AXI是协议层,所有的IP都需要符合协议的规定,当然逻辑功能需要例化在协议中,也就是说所有的功能通过协议实现。在协议中添加pwm一个输出,为了连接功能模块中的输出。也就是下面例化中的。这是实现AXI协议的核心代码。
    在这里插入图片描述
    总线协议的接口,例化是相当于把功能模块通过总线标准接口,实现ip封装。ip=功能模块+协议层axi在这里插入图片描述

配置完成后
在这里插入图片描述
提示修改完成。
在这里插入图片描述
创建完成后,可以在diagtam中添加刚才的ip,修改外围设备。引入IP。
在这里插入图片描述
引出pwm的引脚为输出。单独逻辑模块输出只需要添加逻辑程序到当前工程下,然后通过当前界面调用模块 add module 这样添加一个rtl纯逻辑模块。
在这里插入图片描述
7. 配置完成后生成顶层,与此同时也要生成输出信息,创建约束。创建bit流,导出硬件信息。
在这里插入图片描述

3.打开SDK

  1. 创建bit流,导出硬件信息;创建工程。还是基于helloworld模板。
    在这里插入图片描述

  2. 找到ip核的控制文件,在硬件包中。这是赛灵思的控制文件,可以通过控制文件对ip核进行读写,这些都是控制寄存器。
    在这里插入图片描述
    这个配置相对来说简单,就只有读写两个函数。对寄存器读写,调用方式就是 基地址+偏移地址+写数据。
    在这里插入图片描述

    寄存器有地址,在xparameters.h里面。有很多宏定义就是寄存器地址。
    在这里插入图片描述
    在这里插入图片描述

  3. 接下来就是对用户文件编写。这就是我们的主函数,需要包含所使用的头文件。其中包含,ip pwm的头文件、io口的头文件、延迟函数的头文件、参数头文件
    在这里插入图片描述

Vivado是一种流行的FPGA设计工具,它提供了许多IP核来加速开发过程。然而,并不是所有的需求都可以通过Vivado自带的IP核来满足。在这种情况下,设计师可以创建自己的自定义IP核以实现特定的功能或加速系统性能。 创建自定义IP核的方法与使用Xilinx官方IP核的方法类似。首先,你需要使用VivadoIP Integrator界面来创建一个新的IP。在创建过程中,你可以指定IP的输入输出接口、功能和参数等信息。接下来,你需要使用HDL语言(如Verilog或VHDL)编写IP的逻辑代码。这些代码将定义IP的行为和功能。 一旦你完成了IP的逻辑设计,你可以将它综合到FPGA设备中进行验证。你可以使用Vivado的综合和实现工具来生成bitstream文件,并将其加载到FPGA设备中进行测试。 对于其他工程中使用封装好的IP核的情况,你需要将IP核文件添加到IP核库中。这样,在其他工程中就可以直接使用这个封装好的IP核了。 总的来说,Vivado提供了强大的功能来创建自定义IP核,以满足特定的设计需求。通过设计自定义IP核,开发者可以更好地定制化设计,提高开发效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Vivado自定义IP核](https://blog.csdn.net/mengzaishenqiu/article/details/130048317)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值