(本系列只需要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.pswp.cn/news/914065.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914065.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914065.shtml

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

相关文章

RK3566/RK3568 Android11 修改selinux模式

概述RK3566/RK3568 Android11 SDK默认的selinux是Enforcing模式(强制模式)。Enforcing:强制模式:SELinux在运行中,且已经开始限制domain/type之间的验证关系 Permisssive:宽容模式:SELinux在运行中,如果验证…

iOS Widget 开发-3:Widget 的种类与尺寸(主屏、锁屏、灵动岛)

iOS 支持多种类型的 Widget,分布在主屏幕、锁屏、灵动岛、待机模式、控制中心等多个系统位置。每种 Widget 都有各自的尺寸、交互能力与限制。 本篇将系统梳理 iOS 当前支持的 Widget 类型与尺寸规格。主屏 Widget(Home Screen Widgets) 主屏…

ffmpeg 中 write_option()函数详细注释

author: hjjdebug date: 2025年 07月 11日 星期五 10:51:23 CST descrip: ffmpeg 中 write_option()函数详细注释 文章目录1. 函数原型1.1 参数说明1.2 SpecifierOpt 说明符选项结构2. write_option 代码注释2.1 谁调用了write_option 函数?3. 小结:write_option()不仅在ffmpe…

PandaCoder重大产品更新-引入Jenkinsfile文件支持

写在前面 安装这个插件可以直接平替 Jenkinsfile Pro ,节省200元关于插件介绍的处女篇:https://mp.weixin.qq.com/s/fwMEhmx8vxVlvfnipx09Ag为什么叫「熊猫编码助手」? 熊猫是中国的国宝,备受世界喜爱,代表着中国特色和…

链表算法之【判断链表中是否有环】

目录 LeetCode-141题 LeetCode-141题 给定一个链表的头节点,判断链表中是否存在环 class Solution {public boolean hasCycle(ListNode head) {// checkif (head null || head.next null)return false;// 定义两个指针,一个快指针[fast]&#xff0c…

Ubuntu 22.04安装SQL Server指南

看起来在安装过程中出现了问题,导致 mssql-server 没有正确安装。以下是排查和修复步骤:1. 检查是否成功安装了 mssql-server 运行以下命令,确认是否已安装: dpkg -l | grep mssql-server如果没有任何输出,说明 mssql-…

Vue+ElementUI聊天室开发指南

Hi,我是布兰妮甜 !在现代Web应用中,实时聊天功能已成为许多社交平台、协作工具和客户支持系统的核心需求。本文将详细介绍如何使用Vue.js框架配合ElementUI组件库实现一个功能完整的聊天室应用。我们将从项目搭建开始,逐步实现用户…

提升你的AI交互技能:使用Anthropic互动提示教程

探索Anthropic的互动式提示工程教程:让Claude与你更默契 在当今人工智能世界中,熟练掌握有效的提示工程成为了与AI进行高效沟通的关键。Anthropic推出了一款全面且互动性强的教程,名为“Prompt Engineering Interactive Tutorial”&#xff0…

从 JavaFX WebView 迁移至 JxBrowser

长久以来,JavaFX 一直包含一个内置的 WebView 组件,这是在 Java 应用中渲染 Web 内容的一个稳定方案。然而,在更复杂或要求更高的使用场景中,它可能就不够用了。因此,许多开发者转向了像 JxBrowser 这样的替代方案。 …

将 Go 应用从 x86 平台迁移至 Amazon Graviton:场景剖析与最佳实践

简介 近年来,Amazon Graviton 处理器以其优越的性价比和强劲的性能,成为了构建高效、可扩展云原生应用的重要选择。Graviton 采用基于 Arm64 架构的芯片,与传统的 x86 架构相比存在不少架构差异。虽然 Go 天生对 Arm64 具有良好支持&#xf…

arcgis api for js 设置地图服务请求带有请求头信息

通过地图的config模块的请求拦截器来设置请求头信息,如下示例: 1、引入:‘esri/config’ 1、设置请求头信息 import { loadArcgisModules } from /utils/map/mapLoadUtil export default { mounted() {this.loadMap()}, methods: {/** ****…

工业通信升级新选择:耐达讯CCLINKIE转Modbus TCP网关

在工业自动化系统中,协议转换网关的选择直接影响系统稳定性与通信效率。对于CCLINKIE转Modbus TCP场景,耐达讯通信技术网关凭借以下特性,成为多个项目中的优选方案。技术选型要点协议兼容性支持CCLINKIE的令牌环机制与Modbus TCP的TCP/IP协议…

使用python的 FastApi框架开发图书管理系统-前后端分离项目分享

今天给大家分享一个 我最近使用python 框架 fastapi 写的一个web项目 ,叫图书管理系统。项目主要是来巩固 python的编程技术。使用的是前端后 分离开发。 主要实现的功能: 1、用户管理:可以新增、编辑、删除用户信息。 2、图书管理&#xff1…

上位机知识篇---Docker

Docker 详细介绍 一、Docker 是什么 Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包到一个标准化的单元(称为容器)中,确保应用在任何环境中都能以相同的方式运行。 简单来说,Docker 解决了 &…

蓝桥杯第十六届(2025)真题深度解析:思路复盘与代码实战

> 省一选手的血泪经验:**避免这些坑,你也能冲进国赛!** 2025年蓝桥杯省赛已落下帷幕,作为近年来**难度最高的一届竞赛**,不少选手在考场上遭遇了“滑铁卢”。本文将以C++ B组真题为例,逐题解析解题思路,并提供**优化后的AC代码与详细注释**。笔者最终排名省一前40%,…

使用gdal读取shp及filegdb文件

一、使用qgis开源工具构建两个文件,分别是filegdb和shp,每个文件包含一个图层,图层内容只包含一个字段:id,有两个数据行,图层几何为多边形,图层都是如下的效果。二、使用rust读取上述文件 rust依…

从0开始学习R语言--Day44--LR检验

之前我们提到用LM检验的方式,来判断数据在空间上是否受到邻近数据及其残差的影响,但是LM检验是采用直接计算的方式,只关注了数据的残差平方和,没有数据关于依赖项的考虑,容易被结果误导。而LR检验虽然在结果上有时候跟…

openEuler 24.03 (LTS-SP1) 下私有镜像仓库部署与自签 SSL 全流程目标

目录 openEuler 24.03 (LTS-SP1) 下私有镜像仓库部署与自签 SSL 全流程 1 创建根 CA 与服务器证书(修正版:SAN 写法兼容所有 OpenSSL) 2 配置 Docker Compose 文件 3 客户端节点信任 CA 3.1 Docker 3.2 containerd 4 推送 / 拉取测试 …

mysql的LIMIT 用法

常见用法1. 限制返回行数-- 返回前5条记录 SELECT * FROM products LIMIT 5;2. 分页查询(带偏移量)-- 跳过前10条,返回接下来的5条记录(第11-15条) SELECT * FROM products LIMIT 10, 5;-- MySQL 8.0 也支持这种语法 S…

maven 发布到中央仓库之持续集成-03

maven 系列 maven-01-发布到中央仓库概览 maven-02-发布到中央仓库常用脚本 maven-03-发布到中央仓库之持续集成 maven-04-发布到中央仓库之 Ignore Licence maven-05-maven 配置进阶学习 maven-06-maven 中央仓库 OSSRH 停止服务,Central Publishing Portal …