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;
}
Genlock(General Lock)模式在AXI VDMA中用于同步视频数据传输,以确保在不同帧率或时钟域之间正确同步视频帧。以下是配置Genlock模式的一般步骤,具体细节可能会根据VDMA的版本和设计要求有所不同:
-
选择Genlock模式:
- 在Vivado IDE中,根据需要选择适当的Genlock模式。有四种Genlock模式:Master、Slave、Dynamic Master和Dynamic Slave。
-
配置控制寄存器:
- 对于Master模式,需要配置
mm2s_frame_ptr_out
或s2mm_frame_ptr_out
来输出当前帧号。 - 对于Slave模式,需要配置
mm2s_frame_ptr_in
或s2mm_frame_ptr_in
来输入Master的帧号,并设置帧延迟值。
- 对于Master模式,需要配置
-
设置Genlock使能:
- 通过设置VDMACR寄存器中的
GenlockEn
位(例如,MM2S_VDMACR[3]或S2MM_VDMACR[3])来启用Genlock或动态Genlock同步。
- 通过设置VDMACR寄存器中的
-
配置帧延迟:
- 对于Slave模式,设置
FRMDLY_STRIDE
寄存器中的Frame Delay
字段,以确定Slave与Master之间的帧延迟。
- 对于Slave模式,设置
-
配置帧指针:
- 在Dynamic Master模式下,Master将跳过Dynamic Slave当前工作的帧缓冲区。
- 在Dynamic Slave模式下,Slave将访问Dynamic Master最后完成的帧。
-
内部Genlock模式:
- 如果两个通道都启用,并且一个配置为Master而另一个配置为Slave(或一个为Dynamic Master而另一个为Dynamic Slave),则可以启用内部Genlock模式。在这种情况下,不需要外部连接
frame_ptr_out
和frame_ptr_in
信号,因为它们在核心内部已经路由。
- 如果两个通道都启用,并且一个配置为Master而另一个配置为Slave(或一个为Dynamic Master而另一个为Dynamic Slave),则可以启用内部Genlock模式。在这种情况下,不需要外部连接
-
编程帧缓冲区地址:
- 为每个通道设置起始地址寄存器,这些地址用于存储视频帧数据。
-
编程帧大小:
- 设置
VSIZE
和HSIZE
寄存器来定义每帧的垂直和水平尺寸。
- 设置
-
启动传输:
- 通过设置VDMACR寄存器中的
RS
位(Run/Stop)来启动VDMA通道。
- 通过设置VDMACR寄存器中的
在配置Genlock时,需要确保所有的设置都与视频数据源和目标设备的要求相匹配,以避免任何同步问题。此外,仔细阅读和遵循Xilinx提供的AXI VDMA用户指南和参考设计,因为它们可能包含特定于你使用的核心版本的详细信息和示例。