12_ps_pl_bram实验
PS将串口接收到的数据写入BRAM,然后从BRAM中读出数据,并通过串口打印出来;与此同时,PL从BRAM中同样读出数据,并通过ILA来观察读出的数据与串口打印的数据是否一 致
使用 PYNQ-Z2开发板
硬件配置、IP核设计 参考正点原子资料和视频
代码
#include "xil_printf.h"
#include "stdio.h"
#include "xbram_hw.h"
#include "pl_bram_rd.h"
#define PL_BRAM_START PL_BRAM_RD_S00_AXI_SLV_REG0_OFFSET //RAM读开始寄存器地址
#define PL_BRAM_START_ADDR PL_BRAM_RD_S00_AXI_SLV_REG1_OFFSET //RAM起始寄存器地址
#define PL_BRAM_LEN PL_BRAM_RD_S00_AXI_SLV_REG2_OFFSET //PL读 RAM的深度
#define PL_BRAM_BASE XPAR_PL_BRAM_RD_0_S00_AXI_BASEADDR //PL_RAM_RD基地址
#define START_ADDR 0 //RAM起始地址范围:0~1023
#define BRAM_DATA_BYTE 4 //BRAM数据字节个数
char ch_data[1024]; //写入BRAM的字符数组
int ch_data_len; //写入BRAM的字符个数
int main()
{
while(1)
{
int i = 0;
int wr_cnt = 0;
int read_data = 0;
printf("Please input data to read and write Bram !\n");
scanf("%s",ch_data); //用户输入字符串
ch_data_len = strlen(ch_data); //计算字符串的长度
//将字符串写入BRAM,每次循环向 BRAM中写入 1 个字符
for(i = START_ADDR*BRAM_DATA_BYTE; i<(START_ADDR + ch_data_len)*BRAM_DATA_BYTE; i+=BRAM_DATA_BYTE)
{
XBram_WriteReg(XPAR_BRAM_0_BASEADDR,i,ch_data[wr_cnt]);
wr_cnt++;
}
//配置PL_BRAM_RD起始地址
PL_BRAM_RD_mWriteReg(PL_BRAM_BASE,PL_BRAM_START_ADDR,START_ADDR*BRAM_DATA_BYTE);
//配置PL_BRAM_RD长度
PL_BRAM_RD_mWriteReg(PL_BRAM_BASE,PL_BRAM_LEN,ch_data_len*BRAM_DATA_BYTE);
//配置PL_BRAM_RD开始读信号,产生一个上升沿
PL_BRAM_RD_mWriteReg(PL_BRAM_BASE,PL_BRAM_START,1);
PL_BRAM_RD_mWriteReg(PL_BRAM_BASE,PL_BRAM_START,0);
//从 BRAM 中读出数据,循环从 BRAM 中读出数据
for(i = START_ADDR*BRAM_DATA_BYTE; i<(START_ADDR + ch_data_len)*BRAM_DATA_BYTE; i+=BRAM_DATA_BYTE)
{
read_data = XBram_ReadReg(XPAR_BRAM_0_BASEADDR,i);
printf("BRAM address is %d\t,Read data is %c\n",i/BRAM_DATA_BYTE,read_data);
}
}
}
串口
Please input data to read and write Bram !
BRAM address is 0 ,Read data is 2
BRAM address is 1 ,Read data is 0
BRAM address is 2 ,Read data is 2
BRAM address is 3 ,Read data is 3
BRAM address is 4 ,Read data is /
BRAM address is 5 ,Read data is 0
BRAM address is 6 ,Read data is 7
BRAM address is 7 ,Read data is /
BRAM address is 8 ,Read data is 1
BRAM address is 9 ,Read data is 9
Please input data to read and write Bram !
波形图如下,在 enb 拉高期间,doutb 输出的数据和串口助手发送的数据以及打印出的数据一致
参考
-
正点原子 启明星ZYNQ之嵌入式SDK开发指南_V2.0.pdf