今天的任务是用ZYNQ的PS核心,取访问自定义IP。
建立AXI接口的IP
![](https://i-blog.csdnimg.cn/blog_migrate/344ddb4f347dd2da2972517ff6e61154.png)
右键编辑IP
![](https://i-blog.csdnimg.cn/blog_migrate/1fdc2451ed6cd12fca361de1b477b2ec.png)
在顶层,添加相应端口,这里就放一个LED接口
![](https://i-blog.csdnimg.cn/blog_migrate/1cddba4fa0933aab528f94701782b642.png)
例化的位置也相应添加。
![](https://i-blog.csdnimg.cn/blog_migrate/2cfe94fd6afd741761e41b566ae36c58.png)
接下来,修正下一层,就是接口定义层。把AXI的slv_reg0[0]作为breath_led的输入。
![](https://i-blog.csdnimg.cn/blog_migrate/1b956ae00c863bc7b10c0369f17dc07b.png)
添加breath_led这个就是我们真正执行的程序了。
module breath_led(
input ctrl,
output led
);
assign led = ctrl;
endmodule
好了以后,进入xml开始封装IP
![](https://i-blog.csdnimg.cn/blog_migrate/34ae3ea220456e068482c5c0ebbe207f.png)
点击Re-package IP完成IP封装。
![](https://i-blog.csdnimg.cn/blog_migrate/adae60c88ef4f85901336e67372c4d0f.png)
接着在vivado里添加这个IP,过程省略了。最后看下SDK里面的程序。
#include "stdio.h"
#include "xparameters.h"
#include "xil_printf.h"
#include "breath_led_ip.h"
#include "xil_io.h"
#include "sleep.h"
int main()
{
xil_printf("SPI ON!\n");
while(1)
{
BREATH_LED_IP_mWriteReg(XPAR_BREATH_LED_IP_0_S0_AXI_BASEADDR,BREATH_LED_IP_S0_AXI_SLV_REG0_OFFSET,1);
xil_printf("LED ON--------!\n");
sleep(1);
BREATH_LED_IP_mWriteReg(XPAR_BREATH_LED_IP_0_S0_AXI_BASEADDR,BREATH_LED_IP_S0_AXI_SLV_REG0_OFFSET,0);
xil_printf("LED OFF--------!\n");
sleep(1);
}
}
像BREATH_LED_IP_mWriteReg(XPAR_BREATH_LED_IP_0_S0_AXI_BASEADDR,BREATH_LED_IP_S0_AXI_SLV_REG0_OFFSET,1);就是写寄存器的值,对应的话就是把LED点亮。
以上,因为其中有很多细节比较繁琐就不一一列举了,有问题可以留言。