PL与PS数据共享(1)
之前做的所有的工作都是要么仅仅使用PS部分,有么仅仅使用PL部分,接下去开始,则需要两个部分同时编程,同时运行。之前所有的项目中间,都是构造一个系统,该系统中由各个功能不同的IP核组成,数据在各个IP和之间通过总线相连接。这一部分计划实现一个自己实现的IP核,并通过AXI4-Lite总线完成几个寄存器内的数据进行共享。
正巧,在基于ZYNQ-7000开发板的调试系列(5)提到过基于TTC计时器的基础使用用途,即通过PL部分的PWM来完成一个呼吸灯的效果,这一部分主要就是实现呼吸灯的效果。
1. 创建Block
1. 创建一个ZYNQ Processing System
这里没有需要注意的地方,仅仅需要将DDR的型号调整至于芯片型号一致即可。
2. 创建一个新的IP核框架
首先是菜单栏中的Tools -> Create and Package New IP,或者是直接按照上面的指示,按在打开Tools栏后直接按k即可。
打开的界面如下:
之后选择创建一个新的外设IP核。
修改IP核的名称等基本信息,这里随便取了一个名称ip1_pwm。
设置外设与PS部分的数据接口,以及接口的基本属性。
这里无需改动,但是需要注意这里的Interface Type选项,里面包括了Lite、Full以及Stream选项,代表了不同的AXI总线,之后将对这部分进行展开,使用不同的总线传输需要的数据。具体的功能如图所示:
接口协议 | 特性 | 应用场合 |
---|---|---|
AXI4-Lite | 地址、单数据传输 | 低速外设或控制 |
AXI4 | 地址、突发数据传输 | 地址的批量传输 |
AXI4-Stream | 仅传输数据,突发传输 | 数据流和媒体流传输 |
最后,完成外设的框架设计将IP核放入项目内即可。
3. 完成IP核编写
1. 撰写功能核心代码
在IP Catalog中找到刚刚创建的IP核,并对它进行编辑,之后会进入一个新的Vivado项目中,即IP核的项目。
在Design Source里新建一个verilog文件,完成自己的module的编写。
首先先考虑需要的IP核需要有哪些功能:
- 需要按照外部指令调整输出信号的占空比。
- 需要按照外部指令调整输出信号的频率。
- 需要支持复位。
需要的接口:
- 时钟,提供内部时序。(clk)
- 复位,提供复位功能。(rst)
- 占空比,提供输出占空比要求。(duty)
- 周期,提供输出频率要求。(period)
- 输出,输出信号。(out)
代码如下:
`timescale 1ns / 1ps
module led #(
parameter N = 32
)
(
input wire clk,
input wire rst,
input wire [N-1:0] period,
input wire [N-1:0] duty,
output wire ledOut
);
reg [N-1:0] regPeriod;
reg [N-1:0] regDuty;
reg [N-1:0] regCnt;
reg regLedOut;
assign ledOut = regLedOut;
always@(posedge clk, posedge rst) begin
if(rst) begin
regPeriod <= {N{1'b0}};
regDuty <= {N{1'b0}};
end
else begin
regPeriod <= period;