Xilinx VDMA 24位流输出与32位AXI总线的内存 流数据关系
测试方法采用了VDMA仅有MM2S通道, 内存中的图像帧是用MicroBlaze核写入的一个colorbar.
VDMA的mhs部分如下, 因为我的输出用了Digilent的HDMI核,而这个HDMI核是32位的,我自己写了个axis_24_32的位宽转换的ip,这个暂且按下不表.
BEGIN axi_vdma PARAMETER INSTANCE = axi_vdma_0 PARAMETER HW_VER = 5.04.a PARAMETER C_USE_FSYNC = 0 PARAMETER C_M_AXIS_MM2S_TDATA_WIDTH = 24 PARAMETER C_MM2S_LINEBUFFER_DEPTH = 4096 PARAMETER C_MM2S_LINEBUFFER_THRESH = 2048 PARAMETER C_INCLUDE_S2MM = 0 PARAMETER C_BASEADDR = 0x7e220000 PARAMETER C_HIGHADDR = 0x7e22ffff BUS_INTERFACE S_AXI_LITE = axi4lite_0 BUS_INTERFACE M_AXI_MM2S = axi4_0 BUS_INTERFACE M_AXIS_MM2S = axi_vdma_0_M_AXIS_MM2S PORT s_axi_lite_aclk = clk_100_0000MHzPLL0 PORT m_axi_mm2s_aclk = clk_100_0000MHzPLL0 PORT m_axis_mm2s_aclk = axi_hdmi_0_S_AXIS_MM2S_ACLK PORT mm2s_fsync_out = axi_vdma_0_mm2s_fsync_out PORT mm2s_buffer_almost_empty = axi_vdma_0_mm2s_buffer_almost_empty PORT mm2s_buffer_empty = axi_vdma_0_mm2s_buffer_empty_to_chipscope_ila_0 END
结论:
我也不知道手册上究竟有没有讲这个AXI宽度是32bit,而AXIS宽度是24bit的问题,我反正似乎是没看到.
不过最终实验得到的结论是RAM被充分利用了,也就是比如两个像素A(aabbcc)和像素B(112233)存在RAM中,
最终存储的是(aabbcc112233)而不是(00aabbcc00112233)或(aabbcc0011223300)等之类数据.
实验数据:
1.VDMA设置
2.CPU写RAM
for(offset = VERT * HORI * 1/2; offset < VERT * HORI ; ) { Xil_Out32LE(Addr+4*offset, 0xefcdab89); offset++; }
用的是Xil_Out32LE写RAM,那么实际RAM中存储的顺序是89abcdef 89abcdef ..............
3.Chipscope对AXIS mm2s的监测
(其实我对S_AXI也监测了,不过忘记截图了,也没仔细分析.印象是内存对齐读取,也就是一次读取32bit的有效数据然后分别放到AXIS流的不同字节里)