rgb888数据在memory以及axi_stream以及qspi发送的排布变化 - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki
分析
注意rgb888在memory中的排布是bgrbgrbgr....,也就是:
00: brgb
04: gbrb
08: rgbr
代码中的处理
for(int i=0; i<60; i+=12) begin
curr_val[7:0]=8'h11;
curr_val[15:8]=8'h22;
curr_val[23:16]=8'h33;
curr_val[31:24]=8'h11;
master_agent.AXI4LITE_WRITE_BURST(mem_addr + i,0,curr_val,resp);
curr_val[7:0]=8'h22;
curr_val[15:8]=8'h33;
curr_val[23:16]=8'h11;
curr_val[31:24]=8'h22;
master_agent.AXI4LITE_WRITE_BURST(mem_addr + i+4,0,curr_val,resp);
curr_val[7:0]=8'h33;
curr_val[15:8]=8'h11;
curr_val[23:16]=8'h22;
curr_val[31:24]=8'h33;
master_agent.AXI4LITE_WRITE_BURST(mem_addr + i+8,0,curr_val,resp);
end
reg [0:511] fifo_dout_rev;
integer i;
always @(*)
begin
for (i = 0; i < 16; i = i + 1) begin
fifo_dout_rev[32*i +: 32] = fifo_dout[(480-32*i) +: 32];
end
end
for(i=1; i<16; i=i+1) begin /* msb_first->lsb_first */
din_tmp[(32*(i-1)+0) +:8]= fifo_dout_rev[32*i+24 +:8];
din_tmp[(32*(i-1)+8) +:8]= fifo_dout_rev[32*i+16 +:8];
din_tmp[(32*(i-1)+16) +:8]= fifo_dout_rev[32*i+8 +:8];
din_tmp[(32*(i-1)+24) +:8]= fifo_dout_rev[32*i+0 +:8];
end
for(i=0; i<20; i=i+1) begin /* bmp rgb888: bgr->rgb */
din[(24*i+0) +:8]= din_tmp[24*i+16 +:8];
din[(24*i+8) +:8]= din_tmp[24*i+8 +:8];
din[(24*i+16) +:8]= din_tmp[24*i+0 +:8];
end
可以看到,上面处理的过程有点复杂,分成了2道进行处理。实际上,一道就可以了。只要把dma_out按照字节顺序反转排序就可以了。也就是
reg [0:511] fifo_dout_rev;
integer i;
always @(*)
begin
for (i = 0; i < 64; i = i + 1) begin
fifo_dout_rev[8*i +: 8] = fifo_dout[(504-8*i) +: 8];
end
end
然后再进行r/b swap
for(i=0; i<20; i=i+1) begin /* bmp rgb888: bgr->rgb */
din[(24*i+0) +:8]= fifo_dout_rev[24*i+16 +:8];
din[(24*i+8) +:8]= fifo_dout_rev[24*i+8 +:8];
din[(24*i+16) +:8]= fifo_dout_rev[24*i+0 +:8];
end
事实上,由于lcd driver芯片的36h指令通常都支持RGB/BGR Swap,因此直接配置36h指令这项功能即可。这样子r/b swap就不需要了。只需要做字节顺序取反即可。