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读写的地址问题相关推荐

  1. vfifo控制mig_MIG IP控制DDR3读写测试

    本文设计思想采用明德扬至简设计法.在高速信号处理场合下,很短时间内就要缓存大量的数据,这时片内存储资源已经远远不够了.DDR SDRAM因其极高的性价比几乎是每一款中高档FPGA开发板的首选外部存储芯 ...

  2. zedboard如何从PL端控制DDR读写(一)

    zedboard如何从PL端控制DDR读写(一) 看了一段时间的DDR手册,感觉大体有一点了解了,想要实际上板调试,然而实验室可用的开发板不多,拿了一块zynq板看了看,DDR确实有,但是已经集成了控 ...

  3. Arduino 控制RFID读写器读写 IC卡

    Arduino 控制RFID读写器读写 IC卡 一.IC卡的认识   IC卡可以通过频段进行划分,低频(125KHz~134kHz,典型工作频率是12KHz).高频(13.56MHz)和超高频(860 ...

  4. FPGA控制DDR读写(AXI4总线接口)

    FPGA控制DDR读写(AXI4总线接口) 范围 本文适用于FPGA控制DDR读写 MIG核 MIG信号注释 DDR型号为 MT41K256M16TW-107 下面是MIG IP核的相关信号 图2.1 ...

  5. IIC控制设计读写EEPROM

    IIC控制设计 本博文完全参考小梅哥(下面是链接) IIC协议详解+Uart串口读写EEPROM IIC模块是比较好理解,但个人觉得比较难实现.这里的读为随机读数据,即自己可以指定读取那一个数据.若不 ...

  6. zedboard如何从PL端控制DDR读写(五)

    有了前面的一堆铺垫.现在终于开始正式准备读写DDR了,开发环境:VIVADO2014.2 + SDK. 一.首先要想在PL端通过AXI去控制DDR,我们必须要有一个AXI master,由于是测试,就 ...

  7. zynq bram读写 linux,Zynq-7000 通过BRAM实现PS、PL数据共享问题

    针对你提出的需求,是完全可以的,我们之前有过类似的案例.只不过有些地方需要注意. 首先你例化的BRAM的双端口,一端会有PS通过BRAM ctrl控制,所以例化的BRAM是"BRAM Con ...

  8. php 跨进程读写,php使用多个进程同时控制文件读写示例

    代码如下: /** * 写入数据 * @param  [string] $path [文件路径] * @param  [string] $mode [文件打开模式] * @param  [string ...

  9. php多文件读写,php使用多个进程同时控制文件读写示例

    代码如下: /** * 写入数据 * @param  [string] $path [文件路径] * @param  [string] $mode [文件打开模式] * @param  [string ...

最新文章

  1. Neumorphism.io一个神奇的网站,满足各种圆角矩形ICON图表立体化效果要求,这种样式的名称——新拟态
  2. zabbix监控windows 服务器各项性能
  3. 高并发大流量专题---10、MySQL数据库层的优化
  4. int定义源码 python_python学习(第一章)
  5. OLED电视出现烧屏问题 LG电子被判赔偿消费者16万澳元
  6. 深度学习 --- 受限玻尔兹曼机RBM(MCMC和Gibbs采样)
  7. dedecms织梦入门
  8. Android 屏幕画笔实现
  9. Node on Mac 初步
  10. VB6写的书籍下载软件 --老牛下书,还不错
  11. 【通信协议】IIC通信协议详解
  12. iOS 10 消息推送(UserNotifications)秘籍总结(一
  13. 【微信小程序】关于getCurrentPages()的使用
  14. Problem A. Alarm Clock
  15. 安卓手机怎么修改图片分辨率?手机怎么提高图片分辨率?
  16. springboot蓝球场馆预约系统毕业设计-附源码211706
  17. 大学英语综合教程二 Unit 3 课文内容英译中 中英翻译
  18. 苹果ppt_熬夜看完苹果发布会,我居然学会了用PPT做霓虹灯特效?!
  19. 中国最懒城市,这里的人不想赚钱,只想躺平
  20. 数据分析概述+框架+方法+工具!

热门文章

  1. censys获取到ip和端口
  2. TP-Link TL-WR703N路由器刷打印服务,网络配置及补丁加载
  3. 520来了,用数据告诉你应该买什么礼物
  4. Ubuntu18.04 新发现——鼠标滚轮快速切换界面!
  5. Django+Vue开发生鲜电商平台之10.购物车、订单管理和支付功能
  6. 机器学习实战-SVM模型实现人脸识别
  7. linux访问vdma的数据,zynq-7000学习笔记(十一)——Linux下VDMA的使用
  8. 快和她在圣诞节看一场烟花吧
  9. pacemaker+drbd双主
  10. 海马汽车经销商管理系统技术解析(三)应收管理