rgb888数据在memory以及axi_stream以及qspi发送的排布变化 - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

分析

image

注意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就不需要了。只需要做字节顺序取反即可。