1.可以在固定目录下也可在当前工程下
这是在固定目录下建立ip
当前工程:tools->creat new ip
2封装ip
- 封装 IP 或者创建一个带 AXI4 接口的 IP 核,选择创建一个带有 AXI4 接口的 IP 核。调用时候当作ARM的外设,一个模块调用。
- 设置 IP 核名称、版本号、显示名、描述、保存路径。
- AXI接口类型选择,模式选择,寄存器的宽度。一般选择lite轻量级,具体可以看看axi协议得说明和使用范围
ip核创建完成,此时修改IP逻辑,用户自定ip查看方式
- 修改ip功能,自动生成一个ip工程对当前ip配置。右键点击编辑IP,会进入IP修改工程。
- 打开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
- 点开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
-
创建bit流,导出硬件信息;创建工程。还是基于helloworld模板。
-
找到ip核的控制文件,在硬件包中。这是赛灵思的控制文件,可以通过控制文件对ip核进行读写,这些都是控制寄存器。
这个配置相对来说简单,就只有读写两个函数。对寄存器读写,调用方式就是 基地址+偏移地址+写数据。
寄存器有地址,在xparameters.h里面。有很多宏定义就是寄存器地址。
-
接下来就是对用户文件编写。这就是我们的主函数,需要包含所使用的头文件。其中包含,ip pwm的头文件、io口的头文件、延迟函数的头文件、参数头文件