最近在用实验室的zedboard学习zynq,在网上找到了一个叫Harald's Embedded Electronics 的网站,里面有关于zedboard的一些教学。
在做完第六个实验时,打算把PS部分的程序学习和注释并记录下来,于是有了这个帖子。
Block Design部分
中间的AXI-Stream FIFO是我们今天主要控制的对象。
最右边的myHeartbeat是这个系列教程的自建IP核,本质上是一个分频器,可以把高频转化为低频,这个地方用来使LED0闪烁。
最右边的mySPI_Tx_AXIS是这个系列教程的自建IP核,功能为SPI接收。
PS程序部分
给出原程序与注释如下:
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xil_types.h"
#include "xstatus.h"
#include "xllfifo.h"
#include "xparameters.h"
#define WORD_SIZE 4 // Size of words in bytes
#define MAX_PACKET_LEN 4
#define NO_OF_PACKETS 64
#define MAX_DATA_BUFFER_SIZE NO_OF_PACKETS*MAX_PACKET_LEN
int main()
{
init_platform();
print("Hello World\n\r");
XLlFifo fifo; //创建一个Axi Streaming FIFO实例
/*对实例进行初始化*/
int xStatus = XLlFifo_CfgInitialize(&fifo,
XLlFfio_LookupConfig(XPAR_AXI_FIFO_MM_S_0_DEVICE_ID),
(UINTPTR)XPAR_AXI_FIFO_MM_S_0_BASEADDR);
if(XST_SUCCESS != xStatus) {
print("Failed to initialize FIFO\n\r");
}
print("FIFO initialized\n\r");
// Check for the Reset value
int Status = XLlFifo_Status(&fifo);//读取fifo中断状态
XLlFifo_IntClear(&fifo,0xffffffff);//清除fifoz所有中断
Status = XLlFifo_Status(&fifo); //读取fifo中断状态
if(Status != 0x0) {
print("Reset value wrong\n\r");
}
for(;;)
{
print("Press Return\n\r");
getchar();
print("Sending\n\r");
XLlFifo_TxPutWord(&fifo, 0xAAAAAAAA);//将32位数据0xAAAAAAAA送入指定的fifo
XLlFifo_TxPutWord(&fifo, 0x55555555);//将32位数据0x55555555送入指定的fifo
XLlFifo_iTxSetLen(&fifo, 2 * WORD_SIZE);//指定传输的字节数,这里是8个字节,共64bit
}
print("Good bye\n\r");
cleanup_platform();
return 0;
}
程序的功能:向fifo发送64位数据0xAAAAAAAA,0x55555555
我们可以点击system.mss文件Peripheral Drivers部分里相对应的Documentation与Import Examples来学习相关的函数调用方法。原博客的代码就是Import Examples例子的一部分,并做了简化。