Xilinx zynq PS 透过bram和dma和PL进行数据交互

1 篇文章 0 订阅

PS透过bram 向PL传递 0-9的数据,

PL进行数据处理后( 在此为了简化,就将所取得的数据 + 100 返回) 透过dma 传回PS

项目代码

https://download.csdn.net/download/howard789/13693535

项目设计图

 

main函数

/*
 * Empty C++ Application
 */


#include "xil_printf.h"
#include "sleep.h"

#include "bram_rd.h"
#include "xbram.h"
#include "xaxidma.h"
#include "xparameters.h"

#define BRAM_RD_BASE_ADDR XPAR_BRAM_RD_0_S00_AXI_BASEADDR
#define START_MASK	BRAM_RD_S00_AXI_SLV_REG0_OFFSET// 0
#define ADDR_MASK BRAM_RD_S00_AXI_SLV_REG1_OFFSET// 4
#define LEN_MASK BRAM_RD_S00_AXI_SLV_REG2_OFFSET //8
#define BRAM_BASE_ADDR	XPAR_BRAM_0_BASEADDR

#define START_ADDR	0
#define	DATA_BYTE	4

#define DMA_DEV_ID		XPAR_AXIDMA_0_DEVICE_ID
#define DDR_BASE_ADDR   XPAR_PS7_DDR_0_S_AXI_BASEADDR
#define RX_BUFFER_BASE	(DDR_BASE_ADDR + 0x00300000)

int init_num=999999;

XAxiDma AxiDma;

static u8 *RxBufferPtr;

int data_byte=4; //32位的数据,4个字节


void test_dma_poll(int num){

	int data_size=1; // 1个32位的数据
	//写入bram
	XBram_WriteReg(BRAM_BASE_ADDR,START_ADDR*DATA_BYTE,num);

	//通知pl读取bram数据
	BRAM_RD_mWriteReg(BRAM_RD_BASE_ADDR,ADDR_MASK,START_ADDR*DATA_BYTE);
	BRAM_RD_mWriteReg(BRAM_RD_BASE_ADDR,LEN_MASK,data_size*DATA_BYTE);

	BRAM_RD_mWriteReg(BRAM_RD_BASE_ADDR,START_MASK,1);
	BRAM_RD_mWriteReg(BRAM_RD_BASE_ADDR,START_MASK,0);


	//DEVICE_TO_DMA
	int Status = XAxiDma_SimpleTransfer(&AxiDma,(UINTPTR) RxBufferPtr,
			data_size*data_byte, XAXIDMA_DEVICE_TO_DMA);

	if (Status != XST_SUCCESS) {
		xil_printf("device_to_dma fail, Status:%d\n",Status);
	}
	Xil_DCacheInvalidateRange((UINTPTR)RX_BUFFER_BASE, data_size*data_byte);


	//读取PL传回来的数据
	int response=Xil_In32(RX_BUFFER_BASE);
	if(response != init_num){
		xil_printf("response:%d\n",response);
	}
}


void exchange_by_POLL(void){

	//初始化
//	api_init_dma(0);
	Xil_Out32(RX_BUFFER_BASE,init_num);
	xil_printf("init num:%d\n",Xil_In32(RX_BUFFER_BASE));
	int num;
	for(int i=1;i<100;i++){
		num=i/10;
		test_dma_poll(num);
	}
}






int main()
{
	xil_printf("starting... \n");

	//初始化 dma 使用poll模式
	XAxiDma_Config *CfgPtr;
	int Status;

	RxBufferPtr = (u8 *)RX_BUFFER_BASE;

	/* Initialize the XAxiDma device.
	 */
	CfgPtr = XAxiDma_LookupConfig(DMA_DEV_ID);
	if (!CfgPtr) {
		xil_printf("No config found for %d\r\n", DMA_DEV_ID);
		return XST_FAILURE;
	}

	Status = XAxiDma_CfgInitialize(&AxiDma, CfgPtr);
	if (Status != XST_SUCCESS) {
		xil_printf("Initialization failed %d\r\n", Status);
		return XST_FAILURE;
	}

	if(XAxiDma_HasSg(&AxiDma)){
		xil_printf("Device configured as SG mode \r\n");
		return XST_FAILURE;
	}
	/* Disable interrupts, we use polling mode
		 */
	XAxiDma_IntrDisable(&AxiDma, XAXIDMA_IRQ_ALL_MASK,
						XAXIDMA_DEVICE_TO_DMA);
	XAxiDma_IntrDisable(&AxiDma, XAXIDMA_IRQ_ALL_MASK,
						XAXIDMA_DMA_TO_DEVICE);


	//初始化接收数据的内存
	Xil_Out32(RX_BUFFER_BASE,init_num);
	xil_printf("init num:%d\n",Xil_In32(RX_BUFFER_BASE));

	//PS透过bram 传入0-9的数据, PL进行数据处理 (+100)后, 透过dma传回PS端,PS打印
	for(int i=1;i<100;i++){
		int num=i/10;
		test_dma_poll(num);
	}
	xil_printf("ending... \n");
	return 0;
}






运行结果

starting... 
init num:999999
response:100
response:100
response:100
response:100
response:100
response:100
response:100
response:100
response:100
response:101
response:101
response:101
response:101
response:101
response:101
response:101
response:101
response:101
response:101
response:102
response:102
response:102
response:102
response:102
response:102
response:102
response:102
response:102
response:102
response:103
response:103
response:103
response:103
response:103
response:103
response:103
response:103
response:103
response:103
response:104
response:104
response:104
response:104
response:104
response:104
response:104
response:104
response:104
response:104
response:105
response:105
response:105
response:105
response:105
response:105
response:105
response:105
response:105
response:105
response:106
response:106
response:106
response:106
response:106
response:106
response:106
response:106
response:106
response:106
response:107
response:107
response:107
response:107
response:107
response:107
response:107
response:107
response:107
response:107
response:108
response:108
response:108
response:108
response:108
response:108
response:108
response:108
response:108
response:108
response:109
response:109
response:109
response:109
response:109
response:109
response:109
response:109
response:109
ending... 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值