ZYNQ AXI DMA(Drect Memory Access)②
ZYNQ AXI DMA Simple
1. 今日摸鱼计划
|
通过 DMA 实现 PS 与 PL 间的数据循环。
|
|
小梅哥教材: 03_【裸机教程】基于C编程的Zynq裸机程序设计与应用教程v2.4.5.pdf 17.6 设计实例 |
|
整个系统在工作时,首先 PS 侧会通过 AXI4-Lite 对 DMA 核进行配置,随后数据被写入 DDR 中。
AXI DMA 核会被控制去读取 DDR 中的数据,并将数据写入到位于 PL 侧的 FIFO 中。
当完成了该步骤,会产生一个输出给中断控制器的中断。
再然后,PS 控制 DMA 将 FIFO 中的数据读出,通过 AXI 总线再次写回到 DDR中。
完成了该步骤后,DMA 会产生另一个中断给中断控制器。
重新写回 DDR 的数据会被拿来与最初读出的数据进行比较,判断数据是否一致。
|
2. 硬件逻辑系统设计
①Block Design
|
||||||||||||||||||||||||||||||||||||||||
② ZYNQ核配置 |
||||||||||||||||||||||||||||||||||||||||
a. 配置串口使用串口打印回环数据对比结果,用于检测实验正确性配置UART1
b. 配置 DDR 的型号
c. 使能 HP 接口
PS 与 PL 之间,有 HP、GP、ACP 三种 AXI 接口,其中只有 HP 是用于高速的数据传输
选择建议:
d. 使能中断AXI DMA 每完成一次读出写入,便会产生一个对应中断,这些中断由 DMA核(可编程逻辑)产生,输出到中断控制器,由中断控制器管理并分配到对应 CPU。
由上图可知,为共享外设中断(Shared Peripheral Interrupts,SPI)
e. 配置完成
|
||||||||||||||||||||||||||||||||||||||||
③ DMA 核配置 |
||||||||||||||||||||||||||||||||||||||||
|
Enable Asynchronous Clocks(Auto):使能异步时钟,该项会根据连接到 AXI DMA 的时钟自动设置。
Enable Scatter Gather Engine:使能 SG模式,并使用 SG引擎;
禁用该项会启用直接寄存器模式(简单 DMA 模式)。
Enable Micro DMA:生成高度优化的 DMA,资源数量较少,用于传输极少量数据的应用程序。
Enable Multi Channel Support:启用 DMA 的多信道功能,并可选择 MM2S 和 S2MM 的信道数。
Enable Control/Status Stream:启动 AXI4 控制和状态流
SG 模式下的两组信号,用于传输应用程序元数据。
Width of Buffer Length Registers(8-26):SG 模式传输的控制字段缓冲区长度和状态字段有效位数。
直接寄存器模式,指定MM2S_LENGH和 S2MM_LENGH寄存器中有效位长度。
该值指定的字节数为 2^(width),eg设置为 26,则有效长度为 2^26 字节。
Address Width(32-64):该项指定地址空间的宽度。它可以是 32 到 64之间的任意值。
Number of Channels:该项可以指定通道个数,有效值为 1 到 16。
Memory Map Data Width:AXI MM2S 内存映射读数据总线的数据宽度(以位为单位)。
有效值为 32、64、128、256、512 和 1024。
Stream Data Width:AXI MM2S AXI4 流数据总线的数据宽度(以位为单位)。
该值必须等于或小于内存映射数据宽度。
有效值为 8、16、32、64、128、512 和 1024。
Max Burst Size:最大突发长度设置。该项指定 MM2S 的 AXI4 内存映射侧突发周期的最大值。
有效值为2、4、8、16、32、64、128和256。
Allow Unaligned Transefers:允许非对齐传输,使能后会启用MM2S数据重新校准引擎(DRE),
允许数据重新对齐到 MM2S 内存映射数据路径上的字节(8 位)级别。
Use Rxlength In Status Stream:如果启用了控制/状态流,则选中该选项将允许
AXI DMA 在状态数据包的 App4 字段中使用 S2MM 目标 IP 提供的接收长度字段。
该选项为需要更大吞吐量的系统提供了更高带宽的解决方案。
Enable Single AXI4 Data Interface:此选项仅在 Vivado IP integrater 中使用时适用。
用户可以使用此选项将两个 AXI4 接口(MM2S 和 S2MM)组合为一个接口。
此选项不会影响资源或性能。
配置后为直接寄存器模式
|
||||||||||||||||||||||||||||||||||||||||
④ Concat核配置 |
||||||||||||||||||||||||||||||||||||||||
|
保持默认
|
||||||||||||||||||||||||||||||||||||||||
⑤AXI4-Stream Data FIFO 核配置 |
||||||||||||||||||||||||||||||||||||||||
|
保持默认
TDATA 的位宽此时并不是正确的值,但该项可以由 IP 核自动设置,在后续连接好整个硬件系统后会根据输入数据的 TDATA 位宽自动设置该项,所以这里不需要修改。
|
||||||||||||||||||||||||||||||||||||||||
⑥端口连接 |
||||||||||||||||||||||||||||||||||||||||
|
AXI DMA
① M_AXIS_MM2S → S_AXIS (AXI4-Stream Data FIFO)
② S_AXIS_S2MM → M_AXIS (AXI4-Stream Data FIFO)
③ mm2s_introut → In0[0:0] (Concat)
④ s2mm_introut → In1[0:0] (Concat)
Concat
dout[1:0] → IRQ_F2P[0:0] (ZYNQ)
|
||||||||||||||||||||||||||||||||||||||||
|
依次:Run Block Automation 、Run Connection Automation (S2MM还未连接)、
Run Connection Automation后可以得到:
|
||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||
| 验证无误后,生成.bit与.hdf |
3. CPU 软件程序设计
AXI_DMA.h |
|
#ifndef _AXI_DMA_H_ #include "ISR.h" //循环计数器复位的超时次数 extern XAxiDma AxiDma0; void AXI_DMA_Init(XAxiDma *AxiDma, uint32_t DeviceId); #endif /* _AXI_DMA_H_ */ |
AXI_DMA.c |
|
#include "AXI_DMA.h" XAxiDma AxiDma0;
//禁用所有中断 /***************************************************************************** //使能DMATx中断 /***************************************************************************** //使能DMARx中断 |
ISR.h |
|
#ifndef ACZ702_LIB_ISR_H_
extern volatile int TxDone; void TxIntrHandler(void *Callback); void ScuTimer_IRQ_Handler(void *CallBackRef); #endif /* ACZ702_LIB_ISR_H_ */ |
ISR.c |
|
#include "ISR.h" /***************************************************************************** //读取挂起的中断,获取被声明的中断的位掩码 //确认挂起的中断 //如果没有中断被断言,直接返回 //如果断言中断错误,则拉高错误标志位,复位硬件以从错误中恢复,然后直接返回 //复位DMA通道 //装载循环计数器复位的超时次数 //等待DMA复位完成,若复位超时则也会跳出等待,超时次数由开头用户自定义 TimeOut --;//超时次数减一,达到0时,while循环也会跳出 return; //如果中断完成,则将TxDone标志置为1 /***************************************************************************** //读取挂起的中断 //确认挂起的中断 //如果没有中断被断言,直接返回 /* XAxiDma_Reset(AxiDmaInst); TimeOut = RESET_TIMEOUT_COUNTER; //等待DMA复位完成,若复位超时也会跳出等待,超时次数由开头用户自定义 TimeOut -= 1;//超时次数减一,达到0时,while循环也会跳出 //如果中断完成,则将RxDone标志置为1
//本次没用到,略略略 |
main.c |
|
/***************************************************************************** #include <stdio.h> //#include "xil_types.h" #include "ISR.h"
int main(void) //将指针TxBufferPtr指向TX_BUFFER_BASE //初始化通用中断控制器 //初始化AXI DMA //设置中断服务函数 //在开始传输测试之前清除中断状态标志 //给TxBufferPtr赋值为0~255 //在DMA传输之前刷新Buffer
XAxiDma_SimpleTransfer(&AxiDma0,(UINTPTR) RxBufferPtr, 256, XAXIDMA_DEVICE_TO_DMA); //等待TX完成、或者RX完成、或者传输错误,否则一直等待 //如果发生错误,则打印失败提示 return 0; |
| #include "SCU_GIC.h" #include "SCU_TIMER.h"之前写过啦 |
4. 板级验证
|
|
| //下次尝试一下别的 |
更多推荐



















所有评论(0)