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. 学习 慕课网 PHP工程师学习计划--我的笔记汇总
  2. python画图三维-Python使用matplotlib绘制三维图形示例
  3. HDU 2567 寻梦(字符串,插入)
  4. 抽象类和接口有什么区别?
  5. greenplum 替代mysql_转:MySQL到Greenplum迁移分析
  6. 设计模式,你知道什么是Observer模式吗?
  7. 阻塞模式下的超时等待
  8. Ubuntu Linux 下 Ffmpeg 及 Mencoder 安装使用小结
  9. Dreamweaver cc 2019
  10. P4556 [Vani有约会]雨天的尾巴 树链剖分 线段树合并
  11. dlt645协议电表数据采集接入PLC或scada等组态软件系统(转modbus)实现内网监控技术方案
  12. JDO与JPA哪个更好?
  13. 【vue,SpringBoot,Mybatis】 关于多条件搜索表单
  14. ECCV 2022 | 新方案: 先剪枝再蒸馏
  15. 2017国家集训队作业[agc016e]Poor Turkey
  16. 计算成绩平均分浮点数c语言,C实验四
  17. 复现Oriented R-CNN RTX 2080Ti
  18. linux dprintk 日志,linux命令备忘
  19. U盘损坏和文件修复(前方高能!!!)
  20. Django2 Django MTV模板

热门文章

  1. 51单片机 智能婴儿监护系统
  2. 新浪怎么获取股票接口api接口?
  3. postman使用教程
  4. 蓝洞新消费发布有关中国近期电子烟新法规的专题报道
  5. 读书笔记-专注于自己的目标不要为其他事情和人分心和浪费时间
  6. Visual C# 2008程序开发与界面设计秘诀
  7. css 超过两行做超出隐藏,隐藏用省略号代替
  8. EDG夺冠,用爬虫+数据分析+自然语言处理(情感分析)+数据可视化分析3万条数据:粉丝都疯了(唯一原创)
  9. 从SEED种子数据库还原出其他库
  10. 树莓派数据库的安装教程及基本使用方法(从0开始教你安装数据库)