热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RGB转YCrCb笔记

在一个小的项目中,需要用FPGA实现一个RGB格式的图像数据转换成YCrCb格式,然后再YCrCb444转成YCrCb422输出。这里暂且先记录下自己R

  在一个小的项目中,需要用FPGA实现一个RGB格式的图像数据转换成YCrCb格式,然后再YCrCb444转成YCrCb422输出。这里暂且先记录下自己RGB转YCrCb这个模块的实现方式。转换公式:

  Y = 0.257R + 0.504G + 0.0.098B + 16
  Cb = -0.148R - 0.291G + 0.439B + 128
  Cr = 0.439R - 0.368G - 0.071B + 128

  Y = (132R + 258G + 50B ) >> 9 + 16
  Cb = (-76R - 149G + 225B ) >> 9 + 128
  Cr = (225R - 188G - 36B) >> 9 + 128

对应实现Verilog代码:

  

`timescale 1ns/1ps

module RGB2YUV(
 input     clk,
 input     rst_n,
 
 input[7:0]    iR,
 input[7:0]    iG,
 input[7:0]    iB,
 input     iDVAL,
 input     iHsync,
 input     iVsync,
 
 output reg[7:0]   oY,
 output reg[7:0]   oCr,
 output reg[7:0]   oCb,
 output reg   oDVAL,
 output reg   oHsync,
 output reg    oVsync
 );

//wire[9:0] R,G,B; 
 
reg[16:0] mR0,mR1,mR2;
reg[16:0] mG0,mG1,mG2;
reg[16:0] mB0,mB1,mB2;

reg[17:0] sY,sCr,sCb;
reg DVAL_reg0,DVAL_reg1;
reg Hsync_reg0,Hsync_reg1;
reg Vsync_reg0,Vsync_reg1;

always@(posedge clk or negedge rst_n)
begin
if(~rst_n)
 begin
 DVAL_reg0 <&#61; 1&#39;b0;
 DVAL_reg1 <&#61; 1&#39;b0;
 oDVAL <&#61; 1&#39;b0;
 end
else
 begin
 DVAL_reg0 <&#61; iDVAL;
 DVAL_reg1 <&#61; DVAL_reg0;
 oDVAL <&#61; DVAL_reg1;
 end
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 begin
 Hsync_reg0 <&#61; 1&#39;b0;
 Hsync_reg1 <&#61; 1&#39;b0;
 oHsync <&#61; 1&#39;b0;
 end
else
 begin
 Hsync_reg0 <&#61; iHsync;
 Hsync_reg1 <&#61; Hsync_reg0;
 oHsync <&#61; Hsync_reg1;
 end
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 begin
 Vsync_reg0 <&#61; 1&#39;b0;
 Vsync_reg1 <&#61; 1&#39;b0;
 oVsync <&#61; 1&#39;b0;
 end
else
 begin
 Vsync_reg0 <&#61; iVsync;
 Vsync_reg1 <&#61; Vsync_reg0;
 oVsync <&#61; Vsync_reg1;
 end
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 mR0 <&#61; 17&#39;d0;
else
 mR0 <&#61; 9&#39;d132 * iR;
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 mR1 <&#61; 17&#39;d0;
else
 mR1 <&#61; 9&#39;d76 * iR;
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 mR2 <&#61; 17&#39;d0;
else
 mR2 <&#61; 9&#39;d225 * iR;
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 mG0 <&#61; 17&#39;d0;
else
 mG0 <&#61; 9&#39;d258 * iG;
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 mG1 <&#61; 17&#39;d0;
else
 mG1 <&#61; 9&#39;d149 * iG;
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 mG2 <&#61; 17&#39;d0;
else
 mG2 <&#61; 9&#39;d188 * iG;
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 mB0 <&#61; 17&#39;d0;
else
 mB0 <&#61; 9&#39;d50 * iB;
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 mB1 <&#61; 17&#39;d0;
else
 mB1 <&#61; 9&#39;d225 * iB;
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 mB2 <&#61; 17&#39;d0;
else
 mB2 <&#61; 9&#39;d36 * iB;
end


always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 sY <&#61; 18&#39;d0;
else
 sY <&#61; ((mR0 &#43; mG0 &#43; mB0) >> 9 ) &#43; 18&#39;d16;
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 sCb <&#61; 18&#39;d0;
else
 sCb <&#61; ((mB1 - mR1 - mG1) >> 9 ) &#43; 18&#39;d128;
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 sCr <&#61; 18&#39;d0;
else
 sCr <&#61; ((mR2 - mG2 - mB2) >> 9 ) &#43; 18&#39;d128;
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 oY <&#61; 8&#39;d0;
else if(sY[8])
 oY <&#61; 8&#39;d240;
else
 oY <&#61; sY[7:0];
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 oCr <&#61; 8&#39;d0;
else if(sCr[8])
 oCr <&#61; 8&#39;d240;
else
 oCr <&#61; sCr[7:0];
end

always&#64;(posedge clk or negedge rst_n)
begin
if(~rst_n)
 oCb <&#61; 8&#39;d0;
else if(sCb[8])
 oCb <&#61; 8&#39;d240;
else
 oCb <&#61; sCb[7:0];
end


endmodule

 对应模块fmax&#61;155MHz&#xff0c;完全达到我所需求的最大fmax&#61;148.5MHz&#xff0c;当然如果要提升fmax&#xff0c;可以考虑在程序中增加几级流水线。

 

转:https://www.cnblogs.com/wuqingjianke/p/3415318.html



推荐阅读
  • 题目《BZOJ2654: Tree》的时间限制为30秒,内存限制为512MB。该问题通过结合二分查找和Kruskal算法,提供了一种高效的优化解决方案。具体而言,利用二分查找缩小解的范围,再通过Kruskal算法构建最小生成树,从而在复杂度上实现了显著的优化。此方法不仅提高了算法的效率,还确保了在大规模数据集上的稳定性能。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • Webdriver中元素定位的多种技术与策略
    在Webdriver中,元素定位是自动化测试的关键环节。本文详细介绍了8种常用的元素定位技术与策略,包括ID、名称、标签名、类名、链接文本、部分链接文本、XPath和CSS选择器。每种方法都有其独特的优势和适用场景,通过合理选择和组合使用,可以显著提高测试脚本的稳定性和效率。此外,文章还探讨了在复杂页面结构中如何灵活运用这些定位技术,以应对各种挑战。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 通过使用Sqoop导入工具,可以精确控制并高效地将表数据的特定子集导入到HDFS中。具体而言,可以通过在导入命令中添加WHERE子句来指定所需的数据范围,从而在数据库服务器上执行相应的SQL查询,并将查询结果高效地存储到HDFS中。这种方法不仅提高了数据导入的灵活性,还确保了数据的准确性和完整性。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 利用REM实现移动端布局的高效适配技巧
    在移动设备上实现高效布局适配时,使用rem单位已成为一种流行且有效的技术。本文将分享过去一年中使用rem进行布局适配的经验和心得。rem作为一种相对单位,能够根据根元素的字体大小动态调整,从而确保不同屏幕尺寸下的布局一致性。通过合理设置根元素的字体大小,开发者可以轻松实现响应式设计,提高用户体验。此外,文章还将探讨一些常见的问题和解决方案,帮助开发者更好地掌握这一技术。 ... [详细]
  • 本文探讨了POJ3177中的冗余路径问题,并详细介绍了如何利用Tarjan算法进行求解。通过分析图的强连通分量,Tarjan算法能够高效地识别出图中的关键路径和冗余路径,为解决复杂网络问题提供了有力工具。此外,文章还结合具体实例,深入讲解了算法的应用步骤和实现细节,帮助读者更好地理解和掌握这一重要算法。 ... [详细]
  • 在处理数据库中所有用户表的彻底清除时,目前尚未发现单一命令能够实现这一目标。因此,需要采用一种较为繁琐的方法来逐个删除相关表及其结构。具体操作可以通过编写PL/SQL脚本来实现,该脚本将动态生成并执行删除表的SQL语句。尽管这种方法相对复杂,但在缺乏更简便手段的情况下,仍是一种有效的解决方案。未来或许可以通过数据库管理工具或更高版本的数据库系统提供更简洁的处理方式。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • H凹变换优化技术——lhMorphConcave详解与应用摘要:本文详细介绍了lhMorphConcave技术,该技术通过优化H凹变换来提高图像处理的精度。具体而言,该函数在5×5的正方形区域内对输入图像进行二值化处理,以实现更精确的形态学分析。参数设置方面,sr参数用于控制变换的具体细节,从而确保在不同应用场景中都能获得理想的效果。此外,文章还探讨了该技术在实际项目中的应用案例,展示了其在图像分割、特征提取等领域的强大潜力。 ... [详细]
author-avatar
欢颜是胖妞妞08
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有