失败的2x2 Mipi Raw10转RGB565

2023-12-14 04:28
文章标签 失败 2x2 mipi rgb565 raw10

本文主要是介绍失败的2x2 Mipi Raw10转RGB565,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

反转了,有思路改了,待我思考一番。

---------------------------------------------------------------------------------------------------------------------------------

希望完成的目标:

MIPI在解析以后是四个像素四个像素地产出数据,

我原本希望能够通过2x2窗口来完成de bayer filter操作,

但是写完了,通过验证发现存在以下问题:

首先,1920x1080的图像经过filter,会被缩减行列,这个时候就需要使用Padding操作,

        但是Padding操作会遇到一个问题:此处是四个像素一同进来的,而我仅需要填充一行一列,也就是说,padding会产生额外的三个无用像素,并写进DDR3中,这三个无用像素如何产生的呢?

        我的Padding方式是:在传输完该行数据以后,再进行一次传输,可是因为FIFO的位宽设置为4个像素(raw10的高八位)比较方便,所以最小的执行单位是4个像素,这就是Padding产生的原因!

那么这个问题该如何解决呢?其实也容易,那就是通过拼接直接完成Padding就好了!

但是拼接不可避免地需要考虑到:传输速率是4个像素/一个时钟周期的问题,那我还不如写到DDR3中,再读出来,那一定容易很多!

失败案例:

module Mipi_Bayer_2_RGB #(parameter   Image_width = 1920,parameter   Image_Higth = 1080,parameter   Pixel_Num = 4     ,parameter   Col_Max = Image_width/Pixel_Num,parameter   I_w = 40
)(input   wire                           I_CLK   ,input   wire                           I_Rst_n ,input   wire                           I_Mipi_Unpacket_V_sync      ,input   wire [I_w-1:0]                 I_Mipi_raw10_depacker_Data  ,input   wire                           I_Mipi_raw10_depacker_Vaild ,output  reg                            O_RGB_Vaild                 ,output  wire [63:0]                    O_RGB_Data                   
);reg  [12:0]         Row_Cnt_wr     ;reg  [12:0]         Row_Cnt_rd     ;reg  [12:0]         Col_Cnt_wr     ;          reg  [12:0]         Col_Cnt_rd     ;   //FIFOwire                 FIFO_Wr_EN     ;reg                 r_FIFO_Wr_EN   ;reg                 rr_FIFO_Wr_EN  ;wire  [31:0]         FIFO_Wr_Data   ;reg  [31:0]         r1_FIFO_Wr_Data;reg  [31:0]         r2_FIFO_Wr_Data;reg                 FIFO_Rd_EN     ;reg                 r_FIFO_Rd_EN   ;reg                 rr_FIFO_Rd_EN  ;wire  [31:0]         FIFO_Rd_Data   ;reg  [31:0]         r_FIFO_Rd_Data ;//Pixelreg  [23:0]         Pixel   [3:0]  ;reg                 Pixel_flag     ;//FIFO wire                full           ;wire                empty          ;wire                wr_rst_busy    ;wire                rd_rst_busy    ;reg                 Padding_Lock   ;reg [2:0]           Padding_Locking;//Col_Cnt_wralways @(posedge I_CLK or negedge I_Rst_n) beginif(I_Rst_n == 1'b0) beginCol_Cnt_wr <= 'd0;end else if(I_Mipi_Unpacket_V_sync == 1'b1) beginCol_Cnt_wr <= 'd0;end else if(I_Mipi_raw10_depacker_Vaild == 1'b1) beginif(Col_Cnt_wr == Col_Max - 1'b1) beginCol_Cnt_wr <= 'd0;end else beginCol_Cnt_wr <= Col_Cnt_wr + 1'b1;endend else beginCol_Cnt_wr <= Col_Cnt_wr;endend //Row_Cnt_wralways @(posedge I_CLK or negedge I_Rst_n) beginif(I_Rst_n == 1'b0) beginRow_Cnt_wr <= 'd0;end else if(I_Mipi_Unpacket_V_sync == 1'b1) beginRow_Cnt_wr <= 'd0;end else if(I_Mipi_raw10_depacker_Vaild == 1'b1 && Col_Cnt_wr == Col_Max - 1'b1) beginif(Row_Cnt_wr == Image_Higth - 1'b1) beginRow_Cnt_wr <= 'd0;end else beginRow_Cnt_wr <= Row_Cnt_wr + 1'b1;endend else beginRow_Cnt_wr <= Row_Cnt_wr;endend //Col_Cnt_rd:always @(posedge I_CLK or negedge I_Rst_n) beginif(I_Rst_n == 1'b0) beginCol_Cnt_rd <= 'd0;end else if(I_Mipi_Unpacket_V_sync == 1'b1) beginCol_Cnt_rd <= 'd0;end else if(FIFO_Rd_EN == 1'b1) beginif(Col_Cnt_rd == Col_Max - 1'b1) beginCol_Cnt_rd <= 'd0;end else beginCol_Cnt_rd <= Col_Cnt_rd + 1'b1;endend else beginCol_Cnt_rd <= Col_Cnt_rd;endend //Row_Cnt_rd always @(posedge I_CLK or negedge I_Rst_n) beginif(I_Rst_n == 1'b0) beginRow_Cnt_rd <= 'd0;end else if(I_Mipi_Unpacket_V_sync == 1'b1) beginRow_Cnt_rd <= 'd0;end else if(FIFO_Rd_EN == 1'b1 && Col_Cnt_rd == Col_Max - 1'b1) begin if(Row_Cnt_rd == Image_Higth - 1'd1) beginRow_Cnt_rd <= 'd0;end else beginRow_Cnt_rd <= Row_Cnt_rd + 1'b1;endend else beginRow_Cnt_rd <= Row_Cnt_rd;endend //Pixel_flagalways @(posedge I_CLK or negedge I_Rst_n) beginif(I_Rst_n == 1'b0) beginPixel_flag <= 1'b0;end else if(I_Mipi_Unpacket_V_sync == 1'b1) beginPixel_flag <= 1'b0;end else if(FIFO_Rd_EN == 1'b1 && Col_Cnt_rd == Col_Max - 1'b1) beginPixel_flag <= ~Pixel_flag;end else beginPixel_flag <= Pixel_flag;endend //FIFOassign   FIFO_Wr_EN   =  I_Mipi_raw10_depacker_Vaild ;//方便paddingassign   FIFO_Wr_Data = {I_Mipi_raw10_depacker_Data[32+:8],I_Mipi_raw10_depacker_Data[22+:8],I_Mipi_raw10_depacker_Data[12+:8],I_Mipi_raw10_depacker_Data[02+:8]}; //FIFO_Rd_ENalways @(posedge I_CLK or negedge I_Rst_n) beginif(I_Rst_n == 1'b0) beginFIFO_Rd_EN <= 1'b0;end else if(FIFO_Rd_EN == 1'b1 && Col_Cnt_rd == Col_Max - 1'b1) beginFIFO_Rd_EN <= 1'b0;end else if((Row_Cnt_wr > 'd0) && (I_Mipi_raw10_depacker_Vaild == 1'b1)) beginFIFO_Rd_EN <= 1'b1;end else beginFIFO_Rd_EN <= FIFO_Rd_EN;endend always @(posedge I_CLK or negedge I_Rst_n) beginif(I_Rst_n == 1'b0) beginr_FIFO_Rd_EN  <= 'd0;rr_FIFO_Rd_EN <= 'd0;r_FIFO_Wr_EN  <= 'd0;rr_FIFO_Wr_EN <= 'd0;end else beginr_FIFO_Rd_EN  <= FIFO_Rd_EN  ;rr_FIFO_Rd_EN <= r_FIFO_Rd_EN;r_FIFO_Wr_EN  <= FIFO_Wr_EN  ;rr_FIFO_Wr_EN <= r_FIFO_Wr_EN;endend //regalways @(posedge I_CLK or negedge I_Rst_n) beginif(I_Rst_n == 1'b0) beginr1_FIFO_Wr_Data <= 'd0;r_FIFO_Rd_Data <= 'd0;r2_FIFO_Wr_Data <= 'd0;end else if(I_Mipi_Unpacket_V_sync == 1'b1) beginr1_FIFO_Wr_Data <= 'd0;r_FIFO_Rd_Data <= 'd0;r2_FIFO_Wr_Data <= 'd0;end else beginr1_FIFO_Wr_Data <= FIFO_Wr_Data;r_FIFO_Rd_Data <= FIFO_Rd_Data;r2_FIFO_Wr_Data<= r1_FIFO_Wr_Data;endend //Paddingalways @(posedge I_CLK) beginPadding_Locking <= {Padding_Locking[1:0],Padding_Lock};endalways @(posedge I_CLK or negedge I_Rst_n) beginif(I_Rst_n == 1'b0) beginPadding_Lock <= 1'b0;end else if(rr_FIFO_Rd_EN == 1'b1 && r_FIFO_Rd_EN == 1'b0) beginPadding_Lock <= 1'b1;end else if(Padding_Locking[2] == 1'b1) beginPadding_Lock <= 1'b0;endend //Pixelalways @(*) beginif(Padding_Lock != 1'b1) beginif(Row_Cnt_wr >'d0) beginO_RGB_Vaild <= rr_FIFO_Rd_EN;end else if(Row_Cnt_wr == 'd0)beginO_RGB_Vaild <= rr_FIFO_Wr_EN;end        end else if(Padding_Lock == 1'b1) beginif(Padding_Locking[1] == 1'b1) beginO_RGB_Vaild <= 1'b1;end else beginO_RGB_Vaild <= 1'b0;endend else beginO_RGB_Vaild <= 1'b0;endendassign  O_RGB_Data  = (O_RGB_Vaild)?({{Pixel[0][23-:5],Pixel[0][15-:6],Pixel[0][7-:5]},{Pixel[1][23-:5],Pixel[1][15-:6],Pixel[1][7-:5]},{Pixel[2][23-:5],Pixel[2][15-:6],Pixel[2][7-:5]},{Pixel[3][23-:5],Pixel[3][15-:6],Pixel[3][7-:5]}}):(64'd0);always @(posedge I_CLK or negedge I_Rst_n) beginif(I_Rst_n == 1'b0) beginPixel[0] <= 24'd0;     Pixel[1] <= 24'd0;   Pixel[2] <= 24'd0;  Pixel[3] <= 24'd0;end else if(Padding_Lock == 1'b1) beginPixel[0] = {r2_FIFO_Wr_Data[16+:8],(r_FIFO_Rd_Data[16+:8]+r2_FIFO_Wr_Data[24+:08])>>1,r_FIFO_Rd_Data[24+:8]};Pixel[1] = {r2_FIFO_Wr_Data[16+:8],(r_FIFO_Rd_Data[16+:8]+r2_FIFO_Wr_Data[08+:08])>>1,r_FIFO_Rd_Data[08+:8]};Pixel[2] = {r2_FIFO_Wr_Data[00+:8],(r_FIFO_Rd_Data[00+:8]+r2_FIFO_Wr_Data[08+:08])>>1,r_FIFO_Rd_Data[08+:8]};Pixel[3] = {r2_FIFO_Wr_Data[00+:8],(r_FIFO_Rd_Data[00+:8]+  r1_FIFO_Wr_Data[24+:08])>>1,FIFO_Rd_Data[24+:8]};end else if(Padding_Lock == 1'b0) beginif((Row_Cnt_wr > 'd0) && (r_FIFO_Rd_EN == 1'b1)) begincase (Pixel_flag)1'b0:beginPixel[0] = {r2_FIFO_Wr_Data[16+:8],(r_FIFO_Rd_Data[16+:8]+r2_FIFO_Wr_Data[24+:08])>>1,r_FIFO_Rd_Data[24+:8]};Pixel[1] = {r2_FIFO_Wr_Data[16+:8],(r_FIFO_Rd_Data[16+:8]+r2_FIFO_Wr_Data[08+:08])>>1,r_FIFO_Rd_Data[08+:8]};Pixel[2] = {r2_FIFO_Wr_Data[00+:8],(r_FIFO_Rd_Data[00+:8]+r2_FIFO_Wr_Data[08+:08])>>1,r_FIFO_Rd_Data[08+:8]};Pixel[3] = {r2_FIFO_Wr_Data[00+:8],(r_FIFO_Rd_Data[00+:8]+  r1_FIFO_Wr_Data[24+:08])>>1,FIFO_Rd_Data[24+:8]};end1'b1:beginPixel[0] = {r_FIFO_Rd_Data[16+:8],(r_FIFO_Rd_Data[24+:8]+r2_FIFO_Wr_Data[16+:08])>>1,r2_FIFO_Wr_Data[24+:8]};Pixel[1] = {r_FIFO_Rd_Data[16+:8],(r_FIFO_Rd_Data[08+:8]+r2_FIFO_Wr_Data[16+:08])>>1,r2_FIFO_Wr_Data[08+:8]};Pixel[2] = {r_FIFO_Rd_Data[00+:8],(r_FIFO_Rd_Data[08+:8]+r2_FIFO_Wr_Data[00+:08])>>1,r2_FIFO_Wr_Data[08+:8]};Pixel[3] = {r_FIFO_Rd_Data[00+:8],(r2_FIFO_Wr_Data[00+:8]+  FIFO_Rd_Data[24+:08])>>1,r1_FIFO_Wr_Data[24+:8]};enddefault: beginPixel[0] = {r2_FIFO_Wr_Data[16+:8],(r_FIFO_Rd_Data[16+:8]+r2_FIFO_Wr_Data[24+:08])>>1,r_FIFO_Rd_Data[24+:8]};Pixel[1] = {r2_FIFO_Wr_Data[16+:8],(r_FIFO_Rd_Data[16+:8]+r2_FIFO_Wr_Data[08+:08])>>1,r_FIFO_Rd_Data[08+:8]};Pixel[2] = {r2_FIFO_Wr_Data[00+:8],(r_FIFO_Rd_Data[00+:8]+r2_FIFO_Wr_Data[08+:08])>>1,r_FIFO_Rd_Data[08+:8]};Pixel[3] = {r2_FIFO_Wr_Data[00+:8],(r_FIFO_Rd_Data[00+:8]+r1_FIFO_Wr_Data[24+:08])>>1,FIFO_Rd_Data[24+:8]};endendcaseend else if((Row_Cnt_wr == 'd0) &&(r_FIFO_Wr_EN)) beginPixel[0] = {8'b0,r2_FIFO_Wr_Data[16+:8],r2_FIFO_Wr_Data[24+:8]};Pixel[1] = {8'b0,r2_FIFO_Wr_Data[16+:8],r2_FIFO_Wr_Data[08+:8]};Pixel[2] = {8'b0,r2_FIFO_Wr_Data[00+:8],r2_FIFO_Wr_Data[08+:8]};Pixel[3] = {8'b0,r2_FIFO_Wr_Data[00+:8],r1_FIFO_Wr_Data[24+:8]};endend else beginPixel[0] <= 24'd0;     Pixel[1] <= 24'd0;   Pixel[2] <= 24'd0;  Pixel[3] <= 24'd0;endendSfifo_Raw2RGB_w32x1024_r32x1024  Raw2RGB_FIFO_0(.rst        (!I_Rst_n                     ),// input wire rst.wr_clk     ( I_CLK                       ),// input wire wr_clk.rd_clk     ( I_CLK                       ),// input wire rd_clk.din        ( FIFO_Wr_Data                ),// input wire [31 : 0] din.wr_en      ( I_Mipi_raw10_depacker_Vaild ),// input wire wr_en.rd_en      ( FIFO_Rd_EN                  ),// input wire rd_en.dout       ( FIFO_Rd_Data                ),// output wire [31 : 0] dout.full       ( full                        ),// output wire full.empty      ( empty                       ),// output wire empty.wr_rst_busy( wr_rst_busy                 ),// output wire wr_rst_busy.rd_rst_busy( rd_rst_busy                 ) // output wire rd_rst_busy);
endmodule

这篇关于失败的2x2 Mipi Raw10转RGB565的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/491153

相关文章

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

MySQL安装时initializing database失败的问题解决

《MySQL安装时initializingdatabase失败的问题解决》本文主要介绍了MySQL安装时initializingdatabase失败的问题解决,文中通过图文介绍的非常详细,对大家的学... 目录问题页面:解决方法:问题页面:解决方法:1.勾选红框中的选项:2.将下图红框中全部改为英

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

Xshell远程连接失败以及解决方案

《Xshell远程连接失败以及解决方案》本文介绍了在Windows11家庭版和CentOS系统中解决Xshell无法连接远程服务器问题的步骤,在Windows11家庭版中,需要通过设置添加SSH功能并... 目录一.问题描述二.原因分析及解决办法2.1添加ssh功能2.2 在Windows中开启ssh服务2

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

ssh版本升级导致连接失败

公司系统使用的是第三方ssh插件jsch-0.1.39.jar,之前采集正常的,但是厂家服务器ssh升级成2.0版本,然后程序就报错,异常如下: com.jcraft.jsch.JSchException: Algorithm negotiation failat com.jcraft.jsch.Session.receive_kexinit(Session.java:510)at com.