简介
在 zynq 系统的设计中,我们将许多实现特定功能的硬件设计模块封装起来,称之为 IP 核。这种方式极大的提高了设计效率,降低了设计门槛,让设计人员不需要在每次需要某个功能时多次重复相同的工作,或者需要某个功能时去自行研究实现方法,只需要添加实现该功能的 IP 核即可。在添加 IP 核的列表即可看出 xilinx 官方提供了非常丰富的 IP 资源供我们使用。但在实际设计中总会遇到一些特殊的需求,这种时候就需要我们自行设计并封装 IP 核,将它运用到各个系统中。在本次实验中,我们将创建一个能产生 PWM 波形的 IP 核,在开发板上实现呼吸灯的功能。该 IP 核带有 AXI 总线,可以通过 PS 端访问 IP 核内部寄存器,实现 PS 端对于 IP 核的控制。
BD设计
首先这里需要自己创建一个AXI_LITE总线的IP核,然后加入自己的逻辑代码。
在这里将PWM的模块例化,这里使用了寄存器0的低十位作为PWM的步进值。
最终的BD原理图如图所示:
软件设计
/*
* main.c
*/
#include <AXI_PWM.h>
#include <xparameters.h>
#include <stdio.h>
#include <sleep.h>
#define AXI_PWMBASEADDR XPAR_AXI_PWM_0_S00_AXI_BASEADDR
#define REG0 AXI_PWM_S00_AXI_SLV_REG0_OFFSET
int main()
{
print("AXI_PWM test\n");
AXI_PWM_mWriteReg(AXI_PWMBASEADDR,REG0,0x000001ff);
sleep(10);
AXI_PWM_mWriteReg(AXI_PWMBASEADDR,REG0,0x0000005f);
print("test finsh\n");
return 0;
}
这里的代码很简单,就是将步进值写入寄存器0,以此来改变PWM的步进值。