AXI VDMA的datasheet学习笔记 - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

编程方式

#include <stdint.h>
#include <stdbool.h>

// 假设的寄存器地址,实际使用时应替换为具体的硬件地址
#define MM2S_VDMACR_OFFSET  0x00
#define MM2S_START_ADDRESS1 0x5C
#define MM2S_HSIZE_OFFSET   0x54
#define MM2S_VSIZE_OFFSET   0x50

#define S2MM_VDMACR_OFFSET  0x30
#define S2MM_START_ADDRESS1 0xAC
#define S2MM_HSIZE_OFFSET   0xA4
#define S2MM_VSIZE_OFFSET   0xA0

// 假设的寄存器操作函数,实际使用时应替换为对硬件寄存器的读写操作
void write_register(uint32_t addr, uint32_t value) {
    // 实现对硬件寄存器的写操作
}

uint32_t read_register(uint32_t addr) {
    // 实现对硬件寄存器的读操作,并返回寄存器值
    return 0; // 替换为实际的寄存器读值
}

void axi_vdma_init() {
    // 初始化AXI VDMA核心并启动数据传输的示例代码

    // 1. 配置MM2S通道的控制寄存器以启动通道并设置中断使能(例如,0x8B)
    write_register(MM2S_VDMACR_OFFSET, 0x8B);

    // 2. 设置MM2S通道的起始地址寄存器1
    write_register(MM2S_START_ADDRESS1, 0x1234567890); // 替换为实际的内存地址

    // 3. 设置MM2S通道的水平大小寄存器(每行的字节数)
    write_register(MM2S_HSIZE_OFFSET, 1920); // 假设每行1920字节

    // 4. 设置MM2S通道的垂直大小寄存器(帧的行数),这将启动通道传输
    write_register(MM2S_VSIZE_OFFSET, 1080); // 假设帧有1080行

    // 5. 配置S2MM通道的控制寄存器以启动通道并设置中断使能(例如,0x8B)
    write_register(S2MM_VDMACR_OFFSET, 0x8B);

    // 6. 设置S2MM通道的起始地址寄存器1
    write_register(S2MM_START_ADDRESS1, 0x0987654321); // 替换为实际的内存地址

    // 7. 设置S2MM通道的水平大小寄存器(每行的字节数)
    write_register(S2MM_HSIZE_OFFSET, 1920); // 假设每行1920字节

    // 8. 设置S2MM通道的垂直大小寄存器(帧的行数),这将启动通道传输
    write_register(S2MM_VSIZE_OFFSET, 1080); // 假设帧有1080行
}

int main() {
    // 主函数中调用初始化
    axi_vdma_init();

    // ... 其他代码 ...

    return 0;
}

特性

image image

Genlock(General Lock)模式在AXI VDMA中用于同步视频数据传输,以确保在不同帧率或时钟域之间正确同步视频帧。以下是配置Genlock模式的一般步骤,具体细节可能会根据VDMA的版本和设计要求有所不同:

  1. 选择Genlock模式:

    • 在Vivado IDE中,根据需要选择适当的Genlock模式。有四种Genlock模式:Master、Slave、Dynamic Master和Dynamic Slave。
  2. 配置控制寄存器:

    • 对于Master模式,需要配置mm2s_frame_ptr_outs2mm_frame_ptr_out来输出当前帧号。
    • 对于Slave模式,需要配置mm2s_frame_ptr_ins2mm_frame_ptr_in来输入Master的帧号,并设置帧延迟值。
  3. 设置Genlock使能:

    • 通过设置VDMACR寄存器中的GenlockEn位(例如,MM2S_VDMACR[3]或S2MM_VDMACR[3])来启用Genlock或动态Genlock同步。
  4. 配置帧延迟:

    • 对于Slave模式,设置FRMDLY_STRIDE寄存器中的Frame Delay字段,以确定Slave与Master之间的帧延迟。
  5. 配置帧指针:

    • 在Dynamic Master模式下,Master将跳过Dynamic Slave当前工作的帧缓冲区。
    • 在Dynamic Slave模式下,Slave将访问Dynamic Master最后完成的帧。
  6. 内部Genlock模式:

    • 如果两个通道都启用,并且一个配置为Master而另一个配置为Slave(或一个为Dynamic Master而另一个为Dynamic Slave),则可以启用内部Genlock模式。在这种情况下,不需要外部连接frame_ptr_outframe_ptr_in信号,因为它们在核心内部已经路由。
  7. 编程帧缓冲区地址:

    • 为每个通道设置起始地址寄存器,这些地址用于存储视频帧数据。
  8. 编程帧大小:

    • 设置VSIZEHSIZE寄存器来定义每帧的垂直和水平尺寸。
  9. 启动传输:

    • 通过设置VDMACR寄存器中的RS位(Run/Stop)来启动VDMA通道。

在配置Genlock时,需要确保所有的设置都与视频数据源和目标设备的要求相匹配,以避免任何同步问题。此外,仔细阅读和遵循Xilinx提供的AXI VDMA用户指南和参考设计,因为它们可能包含特定于你使用的核心版本的详细信息和示例。

⚠️ **GitHub.com Fallback** ⚠️