閑庭信步使用圖像驗證平臺加速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.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 …