软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! 21.1概述本课讲解了一个最基本的DMA环路搭建,通过PS端控制DMA对DDR数据的读写和校验,完成环路测试。本课程是DMA设计的基础,读者务必认真阅读和学习。 本课程设计一个最基本的DMA环路,实现DMA的环路测试。
本课程会详细介绍创建工程的每个步骤,后面的课程将不再详细介绍创建工程的步骤。 21.2 FPGA BD工程搭建Step1:新建一个名为为Miz_sys的工程。 Step2:创建一个BD文件,并命名为system,添加并且配置好ZYNQ IP。读者需要根据自己的硬件类型配置好输入时钟频率、内存型号、串口,连接时钟等。新手不清楚这些内容个,请参考“CH01 HelloWold/DDR/网口测试及固化”这一节课。 Step4:PL Fabric Clock:勾选FCLK_CLK0,设置为100,即PS的PLL提供本系统的时钟100MHZ。 Step7:单击OK。 Step8:双击DMA IP ,设置如下。 勾选读通道;勾选写通道; 设置Wideh of buffer length register :14。(寄存器设置最大为23,即2的23次方8,388,607bytes,8M大小,这里设置14bit 就够用了,长度越大,需要的资源也就越多) Step9:Data FIFO 设置 设置TDATA Width为4。 Step12:Concat IP设置 Concate IP实现了单个分散的信号,整合成总线信号。这里,将2个独立的中断信号,合并在一起连接到ZYNQ IP的中断信号接口上。 设置:Number of Ports:2 In0 Width :1 In1 Width :1 Dout Width:2 Step10:点击Run Block Automation ,自动配置ZYNQ IP 。 Step11:点击Run Connection Automation 自动连线。只要软件提示你需要自动连线,一般都需要进行自动连线,除非自己知道如何连线,有特殊需求。 Step12:如果还有提示需要自动连线的继续让软件自动连线,直到出下如下。可以看到,还有未连线的模块。 连接完成后如下图 21.3 搭建好的FPGA BD工程至此,就完成了工程架构的搭建。后面的操作过程是Validate Design->Gerate Out products->Create wrappers-> Generate Bitstream ,产生完成后导出硬件,加载SDK。 21.4 PS部分软件分析21.4.1新建SDK工程Step1:新建一个名为AXI_DMA_Test的空的软件工程 Step2:将提供例程中SDK工程的源文件复制,并粘贴到新建SDK工程,软件会自动编译。 21.3.2 main.c源码的分析函数分析1 函数名:int init_intr_sys(void); 功能:对中断资源的初始化,使能中断资源。 说明:这个函数里面调用的函数是笔者封装好的初始化函数,使用起来比较方便。一般只要给出中断对象,中断号,就可以对中断进行初始化。 init_intr_sys函数
init_intr_sys()调用函数 函数分析2 函数名称:int axi_dma_test() 功能:AXI DMA 传输测试 说明:为了发送的数据是已知是确定数据,先对TxBufferPtr 发送缓冲进行初始化,初始化后用Xil_DCacheFlushRange 函数把数据全部刷到DDR中。 axi_dma_test()调用函数 Main.c文件
21.3.3 dma_intr.c 源码分析XAxiDma *AxiDmaInst = (XAxiDma *)Callback;这句代码是为了获取当前中断的对象。void *Callback是一个无符号的指针,传递进来的阐述可以强制转换成其他任何的对象,这里就是强制转换成 XAxiDma 对象了。 IrqStatus =XAxiDma_IntrGetIrq(AxiDmaInst, XAXIDMA_DMA_TO_DEVICE)这个函数获取当前中断号。 XAxiDma_IntrAckIrq(AxiDmaInst, IrqStatus, XAXIDMA_DMA_TO_DEVICE);这个函数是响应当前中断,通知CPU 当前中断已经被接收,并且清除中断标志位。如果中断全部正确,TxDone将被置为1表示发送中断完成。如果有错误,则复位DMA,并且设置超时参数 DMA_TxIntrHandler函数
接收中断函数的原理和发送一样 XAxiDma *AxiDmaInst = (XAxiDma *)Callback;这句代码是为了获取当前中断的对象。void *Callback是一个无符号的指针,传递进来的阐述可以强制转换成其他任何的对象,这里就是强制转换成 XAxiDma 对象了。 IrqStatus = XAxiDma_IntrGetIrq(AxiDmaInst, XAXIDMA_DEVICE_TO_DMA);这个函数是获取当前中断号。 XAxiDma_IntrAckIrq(AxiDmaInst, IrqStatus, XAXIDMA_DEVICE_TO_DMA);这个函数是响应当前中断,通知CPU 当前中断已经被接收,并且清除中断标志位。 如果中断全部正确,RxDone将被置为1表示接收中断完成。如果有错误,则复位DMA,并且设置超时参数 DMA_RxIntrHandler函数
DMA_CheckData函数
21.3.4 dam_intr.h 文件分析一般把DMA相关变量、常量、函数的声明或者定义放到头文件中,dam_intr.h比较关键的参数如下: dam_intr.h中变量
dam_intr.h中函数
dam_intr.h
21.4验证测试测试是使用软件: VIVADIO 和 SDK 测试步骤如下: Step1:启动SDK Step2:在VIVADO工程中点击Open Target 然后点击Auto Connect Step3:连接成功后入下图 当中断触发的时,VIVAIDO中Hardware Manager出现捕捉波形,如下图所示 Step6:观察数据 打开Memory:Window->Show View->Memory 点击添加接收内存部分地址用于观察内存中的数据 地址为 0x01300000
为了观察一次收发数据:设置断点,重新让收发程序跑一次。 收发一次,从内存中读取的数据如图:
可以看到第一个数据是0X0C ,后面是依次加1,一次接收的数据量是2047。发送数据也是OX0C后面依次加1,发送量是2047。接收数据一致,测试结束。 |
XILINX 官网|站点统计|Archiver|手机版|米联客品牌主页|UISRC工程师开源站 ( 苏ICP备19046771号-2 )
GMT+8, 2025-4-3 15:26 , Processed in 0.417589 second(s), 87 queries .