我使用的VDMA的是以RGBA形式的图像数据输入,经过FPGA的运算输出64FC1类型的数据。VDMA的寄存器如下表所示。所有寄存器都被映射到非缓存内存空间。该内存空间必须按照AXI字(32位)进行对齐,换句话说,寄存器偏移地址至少间隔4个字节。
寄存器名称 | 偏移地址 | 详细描述 |
MM2S_VDMACR | 00h | MM2S VDMA控制寄存器 |
MM2S_VDMASR | 04h | MM2S VDMA状态寄存器 |
保留 | 08h~10h | N/A |
MM2S_REG_INDEX | 14h | MM2S寄存器索引 |
保留 | 18h~24h | N/A |
PARK_PRT_REG | 28h | MM2S和S2MM Park指针寄存器 |
VDMA_VERSION | 2Ch | VDMA版本寄存器 |
S2MM_VDMACR | 30h | S2MM VDMA控制寄存器 |
S2MM_VDMASR | 34h | S2MM VDMA状态寄存器 |
保留 | 38h | N/A |
S2MM_VDMA_IRQ_MASK | 3Ch | S2MM错误中断掩码寄存器 |
保留 | 40h | N/A |
S2MM_REG_INDEX | 44h | S2MM寄存器索引 |
保留 | 48h~4Ch | N/A |
MM2S_VSIZE | 50h | MM2S垂直方向显示大小寄存器 |
MM2S_HSIZE | 54h | MM2S水平方向显示大小寄存器 |
MM2S_FRMDLY_STRIDE | 58h | MM2S帧延迟和跨度寄存器 |
MM2S_START_ADDRESS(1~16) | 5Ch~98h | MM2S帧存起始地址(1~16) |
保留 | 9Ch | N/A |
S2MM_VSIZE | A0h | S2MM垂直方向显示大小寄存器 |
S2MM_HSIZE | A4h | S2MM水平方向显示大小寄存器 |
S2MM_FRMDLY_STRIDE | A8h | S2MM帧延迟和跨度寄存器 |
S2MM_START_ADDRESS(1~16) | ACh~E8h | S2MM帧存起始地址(1~16) |
主要涉及到几个修改,VDMA的配置输入输出接口,数据从IP到DDR
VDMA的配置包括输入输出:
(1)输入的数据是RGBA数据共32位,每个字节8位,需要4个字节数。
MM2S_FRMDLY_STRIDE | 58h | MM2S帧延迟和跨度寄存器 |
以下为输入端口的代码,地址从0x5c~0x98
REG_WRITE(vdma_base_address, 0x0 /* 0x30 + additional_offset*/, 0x10003);
REG_WRITE(vdma_base_address,0x58 /*VDMA_FRMDLY_STRIDE */,FRAME_WIDTH*4);//每个为8位,输入32位故*4
REG_WRITE(vdma_base_address,0x5c /*VDMA_START_ADDRESS1*/,IMG_BASEADDR);//地址偏移为4位
//mem_base += BUFFER_OFFSETS;
REG_WRITE(vdma_base_address,0x54/*VDMA_HSIZE*/,FRAME_WIDTH*4);
REG_WRITE(vdma_base_address,0x50/*VDMA_VSIZE*/,FRAME_HEIGHT);
输出端口是64为8位,地址从0xac~0xe8
REG_WRITE(vdma_base_address,0xa8,FRAME_WIDTH*8);
REG_WRITE(vdma_base_address,0xac,FILTER_OUT_BASEADDR);
//mem_base += BUFFER_OFFSETS;
REG_WRITE(vdma_base_address,0xac+8,FILTER_OUT_BASEADDR);//地址偏移为8位
数据从IP到DDR:
地址长度同样修改为*8,而且指针要使用double类型。