当前位置: 首页 > news >正文

闲庭信步使用图像验证平台加速FPGA的开发:第二课——RGB转YCbCr的FPGA硬件编程详解

(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程文件请关注知识星球:成工fpga,关注即送200GB学习资料,链接已置顶!)

图像由RGB转YCbCr的原理和公式在上个系列都有专门的章节讲过,本篇主要讲解FPGA的硬件编程实现

如下是RGB转YCbCr的公式,只要是稍微有FPGA编程经验的人员都知道这个公式是没有办法直接用FPGA进行硬件编程的,因为公式中有小数的乘法

学习过计算机的都知道,数据在内存中是以二进制的形式存储的,不是0就是1,根本没有存储小数点的说法,在这种情况下,我们首先要把小数转换成小数。

怎么把小数转换成整数呢?最简单的方法就是移位,上面公式中,小数点右移3位,小数就全部变成整数了,也就是数据扩大了1000倍,结果计算完毕后,再缩小1000倍即可。

上面的思路是对的,但是有问题。数据扩大1000倍计算完毕后每个数据都要除以1000,我们都知道,除法运算非常消耗逻辑资源的,而且很多时候1个时钟周期无法完成一次的除法操作,非常容易造成时序的违规

那能不能避免除法运算呢?这个是可以的。上面我们也说过了内存中是按照二进制对数据进行存储的,二进制中数据左移n位相当乘以2的n次方,数据右移n位相当除以2的n次方,那我们在让数据由小数变成整数的时候,不是乘以1000,而是乘以2的n次方,那公司计算完毕后,直接将结果的第n位舍弃,就是完成的数据的除法,几乎没有消耗逻辑资源。

如下,我们把公式的系数扩大512倍,也就是2的9次方,这其实是对数据进行了一些近似,如果想让误差更小可以将数据扩大1024倍,2048倍......相比于除法运算,适当的近似还是非常值得的

公式的系数有小数变成了整数,那就可以进行FPGA的硬件编程了,不过编程前还有两个问题需要提前考虑一下,一个就是这个公式的实现使用组合逻辑还是时序逻辑实现,如果使用时序逻辑需要几个周期;而是公式中有加减法,计算过程中怎么保证结果不要超出图像数据格式的范围,也就是不要超出0-255。

首先第一个问题,公式中是3个数的加减乘操作,最好不要用组合逻辑,因为如果一个时钟周期内无法计算出来结果,而下个时钟周期新的数据到来,计算的结果就会乱掉了。使用了时序逻辑,建议最少使用2个时钟周期完成公式的计算,这是不计资源的消耗,让所有的乘和加减并行运算,其中一个时钟周期完成所有的乘法,第二个时钟周期完成所有的加减;当然3个时钟周期更合理一些,将三四个数的加减分两个时钟周期来完成,同时判断数据是否超出范围。

第二个问题,成工一般建议加减法分别进行计算,最后再根据加减法分别的结果判断大小后再进行最后的判断。好处就是不需要过多考虑如果不够减数据补码错误的问题。

其实了解了上面的这些,FPGA的硬件编程就变得非常的简单了,成工直接上RTL代码。

首先就是定义了公式的系数参数和中间的计算变量。

第一个时钟周期完成了乘法的运算,并将结果先缩小8倍。

第二个时钟周期分别完成加法和减法(如果有)的计算,并将结果又缩小了8倍;第三个时钟周期完成最终的计算结果,并判断数据是否超出规定的范围。

最后计算花费了3个时钟周期,需要将场同步,行同步和数据有效信号都延时3拍,以便和转换后的的结果对齐

在src文件夹下的top文件中,例化rgb2ycbcr模块。

在仿真文件tb_image_sim中,对第二个initial块进行如下的操作,146行是测试平台输出的转换结果,148行是等一副图片处理完毕,161行到165行是比对图像测试平台的转换结果和FPGA硬件仿真结果的比对。

最后我们双击sim文件夹下的top_tb.bat文件,完成系统的自动化仿真。

可以看到在modelsim的Transcript有如下的打印信息,发现图像测试平台的转换数据和FPGA硬件仿真的转换数据并不一样,每个通道的数据只打印了一个数据是因为成工在compare_chnl_image这个task中,遇到第一个不一致的数据就跳出比对并打印。仔细观察一下,比对的数据虽然不一样,但是差距并不大,都是差1,我们前面也分析了,FPGA的硬件编程处理是对公式的系数进行了放大和近似,最后缩放直接用的是低位截断,所以才照成结果有差异

打开img文件夹,可以看到图像测试平台的仿真结果和FPGA硬件仿真的结果基本是一样的,至少说明了我们设计的FPGA代码应该没有什么问题。

如果想让比对的结果一样,那图像测试平台也要按照FPGA硬件编程的思路进行设计,如下在img_process_pkt包中新建一个rgb2ycbcr_fpga的task,基本就是按照上述的FPGA硬件设计思路进行的设计,如下所示。

仿真文件tb_image_sim中,对第二个initial块仅仅对146行进行修改,将task由rgb2ycbcr改为rgb2ycbcr_fpga。

重新进行仿真,modelsim的Transcript有如下的打印信息,这次图像测试平台和FPGA硬件仿真的结果就完全一样。

http://www.lryc.cn/news/582303.html

相关文章:

  • Rust单例模式:OnceLock的使用指南
  • Rust 内存结构:深入解析
  • iOS 出海 App 安全加固指南:无源码环境下的 IPA 加固与防破解方法
  • 期待在 VR 森林体验模拟中实现与森林的 “虚拟复现”​
  • 企业物资集采平台解决方案之:AI+物联网,智能预测需求,让企业库存“零呆滞”的科技实践
  • OSPFv3基础
  • 基于 STM32+FPGA 的快速傅里叶频域图像在 TFT 中显示的设计与实现(项目资料)(ID:8)
  • 关于 c、c#、c++ 三者区别
  • vue时间轴,antd时间轴,带卡片时间轴
  • 全球 AI HR 浪潮下的中国实践:从效率革命到战略重构
  • Android kotlin中 Channel 和 Flow 的区别和选择
  • 【Qt】QSignalMapper
  • 谢飞机的Java高级开发面试:从Spring Boot到分布式架构的蜕变之旅
  • 【音视频】HLS简介与服务器搭建
  • 常用的webpack配置
  • 应用俄文OCR技术,为跨语言交流与数字化管理提供更强大的支持
  • 解数独(C++版本)
  • 关于Xinference 中部署服务不能成功的若干问题整理(持续迭代)
  • 安卓10.0系统修改定制化_____安卓9与安卓10系统文件差异 有关定制选项修改差异
  • NLP:文本特征处理和回译数据增强法
  • uniapp三步完成生成一维码图片
  • C#和SQL Server连接常用通讯方式
  • 基于4.14 kernel ARM V7 单核cpu swi功能的验证方法
  • kong网关基于header分流灰度发布
  • 揭秘图像LLM:从像素到语言的智能转换
  • ClickHouse 入门详解:它到底是什么、优缺点、和主流数据库对比、适合哪些场景?
  • 【K线训练软件研发历程】【日常记录向】1.K线滑动窗口
  • 【数据结构】第七弹——Priority Queue
  • Kafka 消费者组再平衡优化实践指南
  • 赛事开启|第三届视觉语音识别挑战赛 CNVSRC 2025 启动