失败的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

相关文章

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.

利用PL/SQL工具连接Oracle数据库的时候,报错:ORA-12638: 身份证明检索失败的解决办法

找到相对应的安装目录:比如:E:\oracle\product\10.2.0\client_1\NETWORK\ADMIN 在里面找到:SQLNET.AUTHENTICATION_SERVICES= (NTS) 将其更改为:SQLNET.AUTHENTICATION_SERVICES= (BEQ,NONE) 或者注释掉:#SQLNET.AUTHENTICATION_SERVICES= (N

Java应用对接pinpoint监控工具的时候,应用名称长度超出限制而导致接入失败

一、背景 java应用需要接入pinpoint,同一个虚拟机上的其他应用接入成功,唯独本应用不行。 首先排除是pinpoint agent的问题,因为其他应用都正常。 然后,我就对比二者的启动脚本。 -javaagent:/opt/pinpoint/pinpoint-bootstrap.jar -Dpinpoint.agentId=DA301004_17 -Dpinpoint.applic

Windows环境下SD卡多分区 隐藏分区 解决python裸读写扇区失败

SD卡分区 右键“我的电脑”->“管理”->“磁盘管理”; 如果SD卡有文件系统,点击"删除卷",重新做卡; 删除文件系统后如下图,点击“新建简单卷”; 在导航页“指定卷大小”,设置分区的大小,留出剩余的空间; python读写SD卡 这里需要注意的是,写SD卡需要加锁,否则写不成功 #带文件系统,需要锁定卷,否则无法写扇区@contextlib.contextmanagerd

openssh 传文件失败解决方法

应用工程师反馈使用linux中SSHD上传升级文件sftp显示传输成功,但重启后文件大小为0. 经定位是 openssh 中的sftp-server 在传输完毕后没有及时把文件内容从内存中写到文件 解决方法 ,修改openssh 中sftp-server.c代码 ,在传输完成时执行如下脚本命令: $ sync $ echo 3 >/proc/sys/vm/drop_caches 上面的ec

Oracle ADG Broker主备切换报错失败处理

Oracle ADG Broker主备切换报错失败处理 问题症状解决办法 ⭐️ Oracle数据库版本为19.18。 问题症状 通过DG Broker发起主备切换: DGMGRL> show configurationConfiguration - dg_msgdbProtection Mode: MaxPerformanceMembers:msgdb_1 - Prim

ubuntu 20.04 一直卡在登录界面,即使密码正确也无法登录(失败记录)

ubuntu 20.04 一直卡在登录界面,即使密码正确也无法登录 这次是装实体机,一次失败的尝试。。。 名称型号CPUIntel Xeon E5-2673 V3GPURTX 3060 mobile 安装的时候不要选install third-party software for graphics and Wi-fi hardware and additional media

阿里大数据一次简单而失败的面试题回忆

一面 简单介绍一下自己以及自己做过的项目;Java HashMap 是不是线程安全的?为什么?请用 Java 写个单例模式知道几种 GC 算法?如何实现一个高效的单项列表逆向输出?数据湖和数据仓库有什么区别?详细介绍下 Flink 的 Checkpoint 执行机制(分布式快照)算法题:寻找两个正序数组的中位数 二面 如何在两个进程间共享数据?线程呢?如何在 main 函数里面等待一个线程执