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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/219285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新Applestore建立其他地区账号简单快捷一看就会

1、首先打开创建appleid网站 2、点击创建你的Apple ID开始创建&#xff08;这里以美国为例&#xff09; 电话号码可以填大陆手机号即可 这两个选项建议不要勾选 3、更改付款方式 3.1点击付款与配送 3.2添加付款方式&#xff0c;这里是最重要的一步&#xff0c;传统方法已经无法…

真正的力量不是摧毁,而是在困境中保持微笑,坚持向前。

真正的力量不是摧毁&#xff0c;而是在困境中保持微笑&#xff0c;坚持向前。

Mac电脑投屏AirServer 2024怎么下载安装激活许可期限

对于那些想要将 iPhone、iPad 或其他 iOS 设备上的小屏幕镜像到计算机上的大屏幕的人来说&#xff0c;AirPlay 是一个很好的工具。 基于此&#xff0c;AirServer 非常需要将您的 Mac 或 PC 变成 AirPlay 设备。 但是如何使用计算机上的设置对 iPhone 等 iOS 设备进行屏幕镜像&a…

docker save多个镜像打包成一个tar.gz压缩文件

docker save多个镜像打包成一个tar.gz压缩文件 有时候我们需要将docker中的多个镜像批量的传输到另一台机器&#xff0c;如果通过docker save这种命令则需要制作多个tar文件&#xff0c;这样以来冗余的操作较多而且tar文件占据的空间较大&#xff0c;不利于传输。 可以通过以…

Netperf使用总结

什么是Netperf Netperf是由惠普公司开发的一种网络性能测量工具&#xff0c;主要针对基于TCP或UDP的传输。Netperf根据应用的不同&#xff0c;可以进行不同模式的网络性能测试&#xff0c;即批量数据传输&#xff08;bulk data transfer&#xff09;模式和请求/应答&#xff0…

Ubuntu 22安装PHP环境

参考博客为《练习 0&#xff08;2/2&#xff09;&#xff1a;Ubuntu 环境下安装PHP&#xff08;PHP-FPM&#xff09;》和《原生态Ubuntu部署LAMP环境 PHP8.1MySQLApache》 sudo apt-get install -y php7.4想要安装php7.4&#xff0c;发现安装的是php8.1。 完成如下图&#xf…

超声波测距HC-SR04模块的简单应用

文章目录 一、HC-SR04HC-SR04是什么&#xff1f;HC-SR04测距的原理 二、使用步骤1.硬件最远探测距离调节硬件连接 2.软件1.初始化配置代码如下&#xff08;示例&#xff09;&#xff1a;引脚初始化定时器初始化 2.引脚输入输出配置代码如下&#xff08;示例&#xff09;&#x…

【linux系统】用户功能与权限详细总结

前言 菜某的笔记总结&#xff0c;有错误还请指正。 linux用户的概念与root用户 这么理解&#xff1a;一台电脑有多个操作者&#xff0c;每个操作者只能无限制操作自己文件夹中的东西&#xff0c;其他地方的操作需要给与相应权限才能操作。 root用户&#xff1a;就是最高级的…

【Java系列】详解多线程(二)——Thread类及常见方法(上篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一…

Proxmox创建CentOS虚拟机

文章目录 下载ISO安装文件上传创建虚拟机启动虚拟机设置DNS CentOS配置国内安装源备份原有安装源下载更新国内源清理yum缓存制作新配置文件缓存 下载ISO安装文件 下载地址&#xff1a;https://www.xitongzhijia.net/ 也可去官网进行下载 上传 下面介绍直接通过页面上传&…

【论文阅读笔记】M3Care: Learning with Missing Modalities in Multimodal Healthcare Data

本文介绍了一种名为“MCare”的模型&#xff0c;旨在处理多模态医疗保健数据中的缺失模态问题。这个模型是端到端的&#xff0c;能够补偿病人缺失模态的信息&#xff0c;以执行临床分析。MCare不是生成原始缺失数据&#xff0c;而是在潜在空间中估计缺失模态的任务相关信息&…

idea一些报错

java: 非法字符: \ufeff 使用IDEA修改文件编码 在IDEA右下角&#xff0c;将编码改为GBK&#xff0c;再转为UTF-8&#xff0c;重新启动项目。具体步骤如下&#xff1a; 在IDEA右下角找到UTF-8字样的编码格式设计项&#xff0c;点击选择第一项GBK&#xff0c;然后Convert&#xf…

JVM虚拟机系统性学习-对象的创建流程及对象的访问定位

对象的创建流程与内存分配 对象创建流程如下&#xff1a; Java 中新创建的对象如何分配空间呢&#xff1f; new 的对象先放 Eden 区&#xff08;如果是大对象&#xff0c;直接放入老年代&#xff09;当 Eden 区满了之后&#xff0c;程序还需要创建对象&#xff0c;则垃圾回收…

设计模式——原型模式代码示例

引言 原型是一种创建型设计模式&#xff0c; 使你能够复制对象&#xff0c; 甚至是复杂对象&#xff0c; 而又无需使代码依赖它们所属的类。 所有的原型类都必须有一个通用的接口&#xff0c; 使得即使在对象所属的具体类未知的情况下也能复制对象。 原型对象可以生成自身的完…

C 标准库 - <time.h>

简介 time.h 头文件定义了四个变量类型、两个宏和各种操作日期和时间的函数。 库变量 下面是头文件 time.h 中定义的变量类型&#xff1a; 序号变量 & 描述1size_t是无符号整数类型&#xff0c;它是 sizeof 关键字的结果。2clock_t这是一个适合存储处理器时间的类型。3…

Linux的五种IO模型

众所周知&#xff0c;出于对 OS 安全性的考虑&#xff0c;用户进程是不能直接操作 I/O 设备的。必须通过系统调用请求操作系统内核来协助完成 I/O 动作。 下图展示了 Linux I/O 的过程。 操作系统内核收到用户进程发起的请求后&#xff0c;从 I/O 设备读取数据到 kernel buff…

【超详细】创建vue3+ts项目(引入ElementPlus、Axios)

目录 前言1、使用vue脚手架创建项目1.1检查vue版本1.2 使用vue脚手架创建项目 2、删除项目多余文件&#xff0c;修改配置项目2.1、删除以下文件2.1、在views下创建index文件2.2、修改router/index.ts路由文件&#xff1a;2.3、修改App.vue文件&#xff1a;2.4、初始化页面样式以…

LeetCode141. Linked List Cycle

文章目录 一、题目二、题解 一、题目 Given head, the head of a linked list, determine if the linked list has a cycle in it. There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the next poi…

windows上抓包出现大包未分片以及关闭tso方法

wireshark抓包中会有大数据包&#xff08;未分片包&#xff09;和ip校验和不对的包&#xff0c;问题根因在目前很多电脑网卡支持TSO和将校验和计算到网卡上&#xff0c;导致抓出数据包未分片 详细文章看: https://www.cnblogs.com/charlieroro/p/11363336.html 目前很多网卡已…

业务代码-整合框架-存储-缓存常见错误详解一

一. java空指针和异常&#xff1a; 1.什么是空指针异常&#xff08;java.lang.NullPointException)&#xff1a; 1.1常见的空指针异常案例&#xff1a; public class WhatIsNpe {public static class User {private String name;private String[] address;public void print…