XDMA实现的PCIE视频传输

流程:

1.上位机枚举PCIE设备,向PCIE设备(FPGA)写入数据;

2.FPGA接收数据,数据的存放地址是经AXI总线映射的DDR3地址;

3.FPGA DMA 模块从指定的地址取出数据并显示;

需要注意:

1.PCIE写入速度较快,在这个前提下可能会出现带宽不足的问题;

2.通过写入一帧给一个XDMA中断的方法存在问题,因为XDMA的官方驱动有BUG,经常出现拉高以后清除中断失败的情况:

3.XDMA需要使用BD设计,和RTL设计混着用还挺麻烦的,而且速度较慢(经测试,XDMA可达1000Mb左右,RIFFA可达1400M左右,相差近一倍)

所以在不够熟悉前我暂时不采用这个方案,而是采用RIFFA来实现;

整体框图:

 

需要注意:

XDMA和RIFFA都是大端发送的:

所以低位数据先发送,从框架中取出的时候DW0会位于低位,但是FPGA中FIFO是从高到低发送的,故而需要调换位置:

RIFFA:{DW3,DW2,DW1,DW0}---{DW0,DW1,DW2,DW3}
    always @(posedge CLK) begin
        PixelData_0      <= {CHNL_RX_DATA[023-:5],CHNL_RX_DATA[015-:6],CHNL_RX_DATA[007-:5]};//0-24
        PixelData_1      <= {CHNL_RX_DATA[055-:5],CHNL_RX_DATA[047-:6],CHNL_RX_DATA[039-:5]};//32-55
        PixelData_2      <= {CHNL_RX_DATA[087-:5],CHNL_RX_DATA[079-:6],CHNL_RX_DATA[071-:5]};//64-88
        PixelData_3      <= {CHNL_RX_DATA[119-:5],CHNL_RX_DATA[111-:6],CHNL_RX_DATA[103-:5]};//96-119
        Concat_PixelData <= {PixelData_0,PixelData_1,PixelData_2,PixelData_3};
        r1_Rxfifo_Wren   <= (CHNL_RX_DATA_REN == 1'b1) && (CHNL_RX_DATA_VALID == 1'b1);
        r2_Rxfifo_Wren   <= r1_Rxfifo_Wren;
    end
XDMA:{DW7,DW6,DW5,DW4,DW3,DW2,DW1,DW0}--颠倒即可。
    always @(posedge hdmi_clk) begin
        wr_fifo_en   <= data_rd_en;
        wr_fifo_data <= {fifo_rd_data[0+:32],fifo_rd_data[32+:32],fifo_rd_data[64+:32],fifo_rd_data[96+:32],
                         fifo_rd_data[128+:32],fifo_rd_data[160+:32],fifo_rd_data[192+:32],fifo_rd_data[224+:32]};
    end
 
 

 

posted @ 2024-07-15 14:32  NoNounknow  阅读(187)  评论(0编辑  收藏  举报