ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)

ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)

导论

在上一章节(ZYNQ进阶之路6)中讲了如何将自定义的PWM模块打包成自定义AXI4 IP,其实AXI4 IP就是将AXI4总线接口进行封装然后由用户将自己书写的模块融入到其中,这样的IP就可以通过PS端编程进行控制了,今天我们就一起探讨如何通过PS端编程控制自定义的PWM模块实现呼吸灯的功能。

实现步骤

创建工程

首先我们根据第一章节中的步骤创建一个新的工程,工程名我们取名为ps_pl_pwm,创建后的工程如下所示:

ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)

添加PS端IP

首先点击Create Block Design:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
双击打开ps_pl_pwm.bd,点击Diagram项中右上角的加号添加PS硬核IP:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)

然后双击PS端IP设置PS端功能,首先开启复位功能:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
在Peripheral I/O Pin项中勾选UART1用与串口信息打印:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
因为我们需要使用到PL端,所以我们要在时钟里使能PL端的时钟,PL端虽然可以使用PL端晶振的时钟作为时钟源,但是PL晶振时钟和PS端输入异步时钟,所以我们最好使用PS端的时钟作为时钟源,而在后面的章节中会专门探讨FPGA中异步时钟域数据传递的一些处理方法,敬请期待哦,这里设置PL时钟频率为50M,不同器件这里设置的时钟上线是不一样的,我这里最高设置到100M左右:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
然后想之前章节一样设置好DDR3型号等信息:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
设置完成后点击OK,这里我们PS端的IP就设置完成了:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)

添加自定义的PWM IP

首先我们需要将我们封装好的IP添加到我们的IP列表中,按照如下步骤操作即可:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
点击OK后,需要重启vivado,并且这样操作后我们需要重新创建工程才能在IP列表中看到我们的自定义IP,为了在以后的工程中能使用我们的IP,这里需要执行如上操作,不过为了能临时将IP添加到工程做可以做如下操作:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
以上操作以后在我们的列表中就有了我们自定义的AXI4 IP了,其中IP所在的文件夹是之前我们创建IP的时候所创建工程的同目录下的ip_repo文件夹中:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
最后将IP添加到工程中:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)

生成bit文件

首先点击自动连线:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
自动生成外设管脚:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
上图中pwm的管脚没有自动生成,需要我们自己来指定管脚:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
生成标准的布局如下:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
然后点击工具栏 Validate Design,验证设计:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
再来到 Source 窗口, 生成设计代码和顶层文件,生成后如下所示:(生成步骤查看前几个章节的描述):
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
绑定引脚:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
然后保存即可。
然后生成bit文件,等待生成完成可能需要几分钟时间:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)

将bit文件导入到SDK

将上面生成的bit文件导入到PS的工程中:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
打开SDK:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
打开SDK后可以看到我们pwm对应的寄存器地址:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
按照以前章节的步骤生成一个helloworld的工程,并将主函数改名为ps_pl_pwm,并输入我们的呼吸灯代码,如下:
ZYNQ进阶之路7--基于AXI4 IP的自定义PWM呼吸灯实现(PS+PL)
如此便可以实现PS+PL合作实现PWM呼吸灯的功能了,你对AXI4总线有一定了解了吗?如果有什么问题和想法可以通过博主邮箱:[email protected]与博主交流,相互学习共同进步!