【FPGA设计_180110】vdma的使用

本文介绍了VDMA在内存和数据流之间的切换配置方法,包括地址总线宽度、AXI总线数据总线宽度等参数设置,以及如何通过配置寄存器实现持续MM2S读内存并将数据发送出去的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考资料:pg020_axi_vdma.pdf


VDMA可以在内存和数据流之间做切换,从而实现一些类似于帧率切换,数据加载等功能,下面简单描述一下vdma的使用,方便后续调试。

vdma的配置界面1:



其中可以配置地址总线宽度,AXI总线数据总线宽度,读写burst  size,Stream数据总线宽度,以及linebuffer深度(手册描述的是AXI从ddr读数据会先放到line buffer,然后再发送;stream会先写到linebuffer,然后再写内存)


vdma的配置界面2:


这里可以配置产生fsync选项,genlock选项,以及是否允许非对齐传输,fsync相当于一个同步信号,有效后才会触发vdma工作;genlock是一个读写通道之间同步的机制;



下面以一个持续发起MM2S读内存,然后通过AXIS_MM2S stream接口将数据发送出去,

1.版本寄存器0x2c

2.配置MM2S控制寄存器0x00为0x8b

3.配置hsize 寄存器0x54为0x100,代表只要vdma从内存取够256byte,就会开始stream传输;

4.配置mm2s stride寄存器0x58为0x200,代表stream每发送512byte数据后,就产生一个tlast;

5.配置ddr起始地址,因为我们配置时选择3个frame buffer,故这里配置0x5c,0x60,0x64都为0x10000000,代表都从内存0x10000000取数据;

6.配置vsize寄存器0x50为0x5,代表发起5次stream传输后(每次以tlast为标志),下次再从内存取数据的话,从首地址取;


在线调试结果:





缺点:目前发现缺省配置下vdma占用LUT资源都有2k,资源不小。







### FPGAVDMA的配置与使用FPGA开发中,AXI VDMA(Video Direct Memory Access)是一种专门用于视频数据流传输的DMA控制器。它支持从内存到外设或从外设到内存的数据搬运,并能够处理连续的帧数据传输。以下是对AXI VDMA配置和使用的详细介绍: #### 1. AXI VDMA的基本功能 AXI VDMA支持两种主要的操作模式:Frame List Mode 和 Single Frame Mode。这两种模式决定了如何定义和传输视频帧。此外,AXI VDMA还支持同步信号(如`tuser`和`tlast`),这些信号对于视频流的正确传输至关重要[^1]。 - **tuser信号**:在视频流中,`tuser`通常用于标记特殊事件,例如帧的起始位置。当`tuser`信号为高时,表示当前数据是图像的第一个数据。 - **tlast信号**:用于标记每一行数据的结束。在AXI协议中,当发送一行数据的最后一字节时,`tlast`信号需要拉高。 #### 2. 硬件设计中的AXI VDMA配置 在Vivado工具中,可以通过IP Integrator添加AXI VDMA IP核,并进行必要的配置。以下是关键参数的设置说明: - **Stream Data Width**:定义了数据流的位宽,通常根据应用需求选择8位、16位或32位等。 - **Number of Frames**:指定帧列表模式下可以存储的最大帧数。 - **Memory Map Data Width**:定义了与DDR或其他内存接口之间的数据宽度。 - **Include Synchronisation Signals**:启用后,AXI VDMA将支持`tuser`和`tlast`信号。 #### 3. 软件驱动开发 为了控制AXI VDMA的行为,需要编写相应的软件驱动程序。Xilinx提供了标准的Linux驱动框架,开发者可以在内核源码中找到相关的头文件`xilinx_dma.h`[^3]。以下是驱动开发的关键步骤: - **初始化AXI VDMA**:通过调用`xilinx_dma_init()`函数完成硬件资源的分配和初始化。 - **配置帧描述符**:使用`xilinx_dma_config()`设置帧大小、分辨率和其他参数。 - **启动和停止传输**:通过`xilinx_dma_start()`和`xilinx_dma_stop()`函数控制数据流的开始和结束。 #### 4. 测试与验证 在实际项目中,可以通过回环测试验证AXI VDMA的功能是否正常。例如,将`srcBuffer`中的数据通过VDMA搬运到`destBuffer`,并检查两者内容是否一致。同时,可以利用逻辑分析仪捕获`tuser`和`tlast`信号,确保它们符合预期的时序要求[^1]。 ```python # 示例代码:Python脚本模拟AXI VDMA数据搬运 def vdma_transfer(src_buffer, dest_buffer): # 假设每个缓冲区是一个一维数组 for i in range(len(src_buffer)): dest_buffer[i] = src_buffer[i] return dest_buffer # 初始化缓冲区 src_buffer = [i for i in range(16 * 16)] # 模拟16行16列的数据 dest_buffer = [0] * (16 * 16) # 执行VDMA传输 result = vdma_transfer(src_buffer, dest_buffer) print("Transfer completed:", result == src_buffer) # 验证结果 ``` #### 5. AXI VDMA与AXI DMA的区别 尽管AXI VDMA和AXI DMA都属于DMA控制器,但它们的应用场景有所不同。AXI DMA更适合通用的数据搬运任务,而AXI VDMA则针对视频流传输进行了优化。具体区别包括: - AXI VDMA支持`tuser`和`tlast`信号,便于同步视频帧。 - AXI VDMA具有双通道架构,允许同时进行读取和写入操作。 - AXI VDMA内置了帧缓冲管理功能,简化了视频应用的开发过程[^1]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值