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

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

这是在固定目录下建立ip
vivado 自定义ip【基于AXI总线协议】及调用_第1张图片
当前工程:tools->creat new ip
vivado 自定义ip【基于AXI总线协议】及调用_第2张图片

2封装ip

  1. 封装 IP 或者创建一个带 AXI4 接口的 IP 核,选择创建一个带有 AXI4 接口的 IP 核。调用时候当作ARM的外设,一个模块调用。
    vivado 自定义ip【基于AXI总线协议】及调用_第3张图片
  2. 设置 IP 核名称、版本号、显示名、描述、保存路径。
    vivado 自定义ip【基于AXI总线协议】及调用_第4张图片
  3. AXI接口类型选择,模式选择,寄存器的宽度。一般选择lite轻量级,具体可以看看axi协议得说明和使用范围
    vivado 自定义ip【基于AXI总线协议】及调用_第5张图片
    ip核创建完成,此时修改IP逻辑,用户自定ip查看方式
    vivado 自定义ip【基于AXI总线协议】及调用_第6张图片
  4. 修改ip功能,自动生成一个ip工程对当前ip配置。右键点击编辑IP,会进入IP修改工程。
    vivado 自定义ip【基于AXI总线协议】及调用_第7张图片
  5. 打开ip工程后,添加Verilog功能文件。这个就是逻辑代码
    vivado 自定义ip【基于AXI总线协议】及调用_第8张图片
    vivado 自定义ip【基于AXI总线协议】及调用_第9张图片
`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
    vivado 自定义ip【基于AXI总线协议】及调用_第10张图片
    顶层在ax_pwm_v1_0例化协议层,定义pwm输出连接在协议中。
    vivado 自定义ip【基于AXI总线协议】及调用_第11张图片
    ax_pwm_v1_0_AXI是协议层,所有的IP都需要符合协议的规定,当然逻辑功能需要例化在协议中,也就是说所有的功能通过协议实现。在协议中添加pwm一个输出,为了连接功能模块中的输出。也就是下面例化中的。这是实现AXI协议的核心代码。
    vivado 自定义ip【基于AXI总线协议】及调用_第12张图片
    总线协议的接口,例化是相当于把功能模块通过总线标准接口,实现ip封装。ip=功能模块+协议层axivivado 自定义ip【基于AXI总线协议】及调用_第13张图片

配置完成后
vivado 自定义ip【基于AXI总线协议】及调用_第14张图片
提示修改完成。
vivado 自定义ip【基于AXI总线协议】及调用_第15张图片
创建完成后,可以在diagtam中添加刚才的ip,修改外围设备。引入IP。
vivado 自定义ip【基于AXI总线协议】及调用_第16张图片
引出pwm的引脚为输出。单独逻辑模块输出只需要添加逻辑程序到当前工程下,然后通过当前界面调用模块 add module 这样添加一个rtl纯逻辑模块。
vivado 自定义ip【基于AXI总线协议】及调用_第17张图片
7. 配置完成后生成顶层,与此同时也要生成输出信息,创建约束。创建bit流,导出硬件信息。
vivado 自定义ip【基于AXI总线协议】及调用_第18张图片

3.打开SDK

  1. 创建bit流,导出硬件信息;创建工程。还是基于helloworld模板。
    vivado 自定义ip【基于AXI总线协议】及调用_第19张图片

  2. 找到ip核的控制文件,在硬件包中。这是赛灵思的控制文件,可以通过控制文件对ip核进行读写,这些都是控制寄存器。
    vivado 自定义ip【基于AXI总线协议】及调用_第20张图片
    这个配置相对来说简单,就只有读写两个函数。对寄存器读写,调用方式就是 基地址+偏移地址+写数据。
    vivado 自定义ip【基于AXI总线协议】及调用_第21张图片

    寄存器有地址,在xparameters.h里面。有很多宏定义就是寄存器地址。
    vivado 自定义ip【基于AXI总线协议】及调用_第22张图片
    vivado 自定义ip【基于AXI总线协议】及调用_第23张图片

  3. 接下来就是对用户文件编写。这就是我们的主函数,需要包含所使用的头文件。其中包含,ip pwm的头文件、io口的头文件、延迟函数的头文件、参数头文件
    vivado 自定义ip【基于AXI总线协议】及调用_第24张图片

你可能感兴趣的:(ZYNQ,fpga开发)