ZYNQ_DMA控制BRAM读写的地址问题
ZYNQ_DMA控制BRAM读写的地址问题
- 前言
- PL
- PS
- 总结
前言
接上篇仿真的遗留问题,板上调试PS和PL对BRAM的读写。
PL
这个0xC000_0000~0xC000_1FFF是BRAM的绝对地址,8K byte,也就是2048个32bit,我这里要把它一分为二,即从DDR->0xC000_0000至0xC000_0FFF,DDR<-0xC000_1000至0xC000_1FFF,对于28*28的32bit源图像够用。
PS
测试,跟之前类似,DMA先把DDR的数据传输至BRAM,再从BRAM传输到DDR的另一个内存空间,这里要注意的一点,DMA通道的BRAM,PS是不能通过xil_in/out接口去读写的,要有AXI GP通道才可以,如果去读不会报错,但是会卡住。
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"#include "xparameters.h"
#include "xaxicdma.h"
#include "xil_cache.h"
#include "xil_io.h"#define PL_BRAM_Addr 0xC0001000 // 需要单独定义
#define BUFF_LEN 3136 //28*28XAxiCdma_Config *axi_cdma_cfg;
XAxiCdma axi_cdma;static int SourceAddr = 0x11000000;
static int DestAddr = 0x12000000;int main()
{init_platform();print("Hello World\n\r");/int Status;int *SrcPtr;int *DestPtr;SrcPtr = (int*)SourceAddr;DestPtr = (int*)DestAddr;//u32 *rx_buffer = (u32 *) PS_OCM_Addr;//u32 *tx_buffer = (u32 *) PL_BRAM_Addr;//static int Array_0[28][28];//static int Array_1[28][28];int i,j;for (i=0;i<28;i++){for (j=0;j<28;j++){Array_0[i][j] = (i*28+j);//Array_1[i][j] = 0;}}for (i=0;i<28;i++){for (j=0;j<28;j++){SrcPtr[i*28+j] = Array_0[i][j];DestPtr[i+j] = 0;}}int *tx_buffer = (int *) SrcPtr;int *rx_buffer = (int *) PL_BRAM_Addr;printf("%d %d\n\r",SrcPtr[55],2*28);for(i=28;i<28*3;i++){printf("%d %d at %d\n\r",i,SrcPtr[i],&SrcPtr[i]);}// Set up the AXI CDMAprintf("--Set up the AXI CDMA\n\r");axi_cdma_cfg = XAxiCdma_LookupConfig(XPAR_AXICDMA_0_DEVICE_ID);if (!axi_cdma_cfg) {printf("AXAxiCdma_LookupConfig failed\n\r");}Status = XAxiCdma_CfgInitialize(&axi_cdma, axi_cdma_cfg, axi_cdma_cfg->BaseAddress);if (Status == XST_SUCCESS ){printf("XAxiCdma_CfgInitialize succeed\n\r");}printf("--Disable Interrupt of AXI CDMA\n\r");XAxiCdma_IntrDisable(&axi_cdma, XAXICDMA_XR_IRQ_ALL_MASK);if (XAxiCdma_IsBusy(&axi_cdma)) {printf("AXI CDMA is busy...\n\r");while (XAxiCdma_IsBusy(&axi_cdma));}Xil_DCacheFlush();Status = XAxiCdma_SimpleTransfer(&axi_cdma,(u32) tx_buffer,(u32) rx_buffer,BUFF_LEN,NULL,NULL);Xil_DCacheFlush();printf("%d",Status);printf("transaction from ps2pl is done\n\r");u32 *tx_buffer1 = (u32 *) PL_BRAM_Addr;u32 *rx_buffer1 = (u32 *) DestAddr;// Set up the AXI CDMAprintf("--Set up the AXI CDMA\n\r");axi_cdma_cfg = XAxiCdma_LookupConfig(XPAR_AXICDMA_0_DEVICE_ID);if (!axi_cdma_cfg) {printf("AXAxiCdma_LookupConfig failed\n\r");}Status = XAxiCdma_CfgInitialize(&axi_cdma, axi_cdma_cfg, axi_cdma_cfg->BaseAddress);if (Status == XST_SUCCESS ){printf("XAxiCdma_CfgInitialize succeed\n\r");}printf("--Disable Interrupt of AXI CDMA\n\r");XAxiCdma_IntrDisable(&axi_cdma, XAXICDMA_XR_IRQ_ALL_MASK);if (XAxiCdma_IsBusy(&axi_cdma)) {printf("AXI CDMA is busy...\n\r");while (XAxiCdma_IsBusy(&axi_cdma));}Xil_DCacheFlush();Status = XAxiCdma_SimpleTransfer(&axi_cdma,(u32) tx_buffer1,(u32) rx_buffer1,BUFF_LEN,NULL,NULL);Xil_DCacheFlush();printf("transaction from pl2ps is done\n\r");for(i=28*27;i<28*28;i++){printf("%x %x at %x\n\r",i,rx_buffer1[i],&rx_buffer1[i]);}//cleanup_platform();return 0;
}
我直接验证最后一组数据,是可以的,接下来测试一下如果超过BRAM地址边界会发生什么
这边简单一点,直接修改BRAM的偏移地址
#define PL_BRAM_Addr 0xC0001F00 // 需要单独定义
这里可以看到依然可以读,但是数值是不正确的,打印的地址的递增也证明了对PL BRAM和寄存器资源的操作的最小单位是一个字节,32bit数据的操作是4个字节,因此,逻辑部分也很好修改,layer1模块的地址 <<2
就可以了,这个也说明仿真的结果可能是有问题的。
wire [31:0] ram_addr;layer1 layer1_inst(.sys_clk (FCLK_CLK ), //input .sys_rst_n (FCLK_RESET_N ), //input .PL_interrupt (PL_interrupt ), //output .reg0 (reg0 ), //input .reg1 (reg1 ), //input .reg2 (reg2 ), //input .reg3 (reg3 ), //input .reg4 (reg4 ), //input .reg5 (reg5 ), //input .reg6 (reg6 ), //input .reg7 (reg7 ), //input .reg8 (reg8 ), //input .reg9 (reg9 ), //input .reg10 (reg10 ), //input .reg11 (reg11 ), //input .reg12 (reg12 ), //input .reg13 (reg13 ), //input .reg14 (reg14 ), //input .reg15 (reg15 ), //input .reg16 (reg16 ), //input .reg17 (reg17 ), //input .reg18 (reg18 ), //input .reg19 (reg19 ), //input .reg20 (reg20 ), //input .reg21 (reg21 ), //input .reg22 (reg22 ), //input .reg23 (reg23 ), //input .reg24 (reg24 ), //input .reg25 (reg25 ), //input .reg26 (reg26 ), //input .reg27 (reg27 ), //input .reg28 (reg28 ), //output .reg29 (reg29 ), //output .reg30 (reg30 ), //output .reg31 (reg31 ), //output .ram_addr (ram_addr ), //output //revised 190412.wr_out (dinb ), //output .rd_in (doutb ), //input .enb (enb ), //output >design_1_wrapper.web (web ) //output );// assign addrb = ram_addr << 2;
总结
改动之后的仿真图就不放了,下篇直接放板上验证的结果就好。
ZYNQ_DMA控制BRAM读写的地址问题相关推荐
- vfifo控制mig_MIG IP控制DDR3读写测试
本文设计思想采用明德扬至简设计法.在高速信号处理场合下,很短时间内就要缓存大量的数据,这时片内存储资源已经远远不够了.DDR SDRAM因其极高的性价比几乎是每一款中高档FPGA开发板的首选外部存储芯 ...
- zedboard如何从PL端控制DDR读写(一)
zedboard如何从PL端控制DDR读写(一) 看了一段时间的DDR手册,感觉大体有一点了解了,想要实际上板调试,然而实验室可用的开发板不多,拿了一块zynq板看了看,DDR确实有,但是已经集成了控 ...
- Arduino 控制RFID读写器读写 IC卡
Arduino 控制RFID读写器读写 IC卡 一.IC卡的认识 IC卡可以通过频段进行划分,低频(125KHz~134kHz,典型工作频率是12KHz).高频(13.56MHz)和超高频(860 ...
- FPGA控制DDR读写(AXI4总线接口)
FPGA控制DDR读写(AXI4总线接口) 范围 本文适用于FPGA控制DDR读写 MIG核 MIG信号注释 DDR型号为 MT41K256M16TW-107 下面是MIG IP核的相关信号 图2.1 ...
- IIC控制设计读写EEPROM
IIC控制设计 本博文完全参考小梅哥(下面是链接) IIC协议详解+Uart串口读写EEPROM IIC模块是比较好理解,但个人觉得比较难实现.这里的读为随机读数据,即自己可以指定读取那一个数据.若不 ...
- zedboard如何从PL端控制DDR读写(五)
有了前面的一堆铺垫.现在终于开始正式准备读写DDR了,开发环境:VIVADO2014.2 + SDK. 一.首先要想在PL端通过AXI去控制DDR,我们必须要有一个AXI master,由于是测试,就 ...
- zynq bram读写 linux,Zynq-7000 通过BRAM实现PS、PL数据共享问题
针对你提出的需求,是完全可以的,我们之前有过类似的案例.只不过有些地方需要注意. 首先你例化的BRAM的双端口,一端会有PS通过BRAM ctrl控制,所以例化的BRAM是"BRAM Con ...
- php 跨进程读写,php使用多个进程同时控制文件读写示例
代码如下: /** * 写入数据 * @param [string] $path [文件路径] * @param [string] $mode [文件打开模式] * @param [string ...
- php多文件读写,php使用多个进程同时控制文件读写示例
代码如下: /** * 写入数据 * @param [string] $path [文件路径] * @param [string] $mode [文件打开模式] * @param [string ...
最新文章
- Neumorphism.io一个神奇的网站,满足各种圆角矩形ICON图表立体化效果要求,这种样式的名称——新拟态
- zabbix监控windows 服务器各项性能
- 高并发大流量专题---10、MySQL数据库层的优化
- int定义源码 python_python学习(第一章)
- OLED电视出现烧屏问题 LG电子被判赔偿消费者16万澳元
- 深度学习 --- 受限玻尔兹曼机RBM(MCMC和Gibbs采样)
- dedecms织梦入门
- Android 屏幕画笔实现
- Node on Mac 初步
- VB6写的书籍下载软件 --老牛下书,还不错
- 【通信协议】IIC通信协议详解
- iOS 10 消息推送(UserNotifications)秘籍总结(一
- 【微信小程序】关于getCurrentPages()的使用
- Problem A. Alarm Clock
- 安卓手机怎么修改图片分辨率?手机怎么提高图片分辨率?
- springboot蓝球场馆预约系统毕业设计-附源码211706
- 大学英语综合教程二 Unit 3 课文内容英译中 中英翻译
- 苹果ppt_熬夜看完苹果发布会,我居然学会了用PPT做霓虹灯特效?!
- 中国最懒城市,这里的人不想赚钱,只想躺平
- 数据分析概述+框架+方法+工具!