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