【盤古100Pro+開發板實驗例程】FPGA學習 | 3X3圖像矩陣生成 | 圖像實驗指導手冊

本原創文章由深圳市小眼睛科技有限公司創作,版權歸本公司所有,如需轉載,需授權并注明出處(www.meyesemi.com)

1. 實驗簡介

實驗目的:

? ? ? 實現 3X3 圖像矩陣對應 9 個像素點圖像數據的讀取。

實驗環境:

? ? ? Window11

? ? ? PDS2022.SP6.4

? ? ? Modelsim10.6c

? ? ? MatlabR2023b(可以用別的版本)

硬件環境:

? ? ? MES2L676-100HP

2. 實驗原理

? ? ??在數字圖像處理中,部分算法需根據每個像素點及其周圍一定范圍內的像素點數據進行計算,圖像矩陣的 生成至關重要。本系列圖像處理實驗主要采用 3X3 圖像矩陣實現對應圖像處理算法。

? ? ??例如一幅完整的 5X5 圖像如下圖所示,每個方格表示一個像素點,方格內的數字表示對應像素點的像素數據。

?

? ? ??3X3 圖像矩陣的行對應圖像一行中三個連續的像素點,3X3 圖像矩陣的列對應圖像一列中三個連續的像素點,矩陣的元素對應圖像的像素數據。在 5X5 的圖像中,按圖像的掃描方式從左到右,從上到下地獲取對應 3X3 圖像矩陣的數據

?

? ? ??在圖像處理算法中,若通過每個 3X3 圖像矩陣計算中心像素點的像素數據,為保證圖像分辨率不變,在圖 像左側兩列和上方兩行的位置對像素數據補“0”操作,如下圖所示:

?

? ? ? 基于以上分析,在圖像數據按行輸入的情況下,為獲取 3X3 圖像矩陣需同時輸出三行圖像中的數據,因此 采用 FPGA 的緩存資源(fifo/ram)將接收的每一行數據進行緩存,并且在輸出 3X3 圖像矩陣數據時輸出當前 第 n 行對應位置的數據、第 n-1 行對應位置的數據以及第 n-2 行對應位置的數據。另外,為緩存第 n-1 行圖像 數據和第 n-2 行圖像數據,需調用 2 個 fifo 緩存模塊,并且實現當前數據緩存到第 n-1 行圖像數據緩存 fifo, 從第 n-1 行圖像數據緩存 fifo 讀出后再緩存到第 n-2 行圖像數據緩存 fifo,確保 3X3 矩陣輸出時讀取兩個 fifo可同時獲得第 n-1 行和第 n-2 行的數據。FPGA 實現 3X3 圖像矩陣具體方案框圖如下:

?

按行輸入的圖像數據 video_data 在數據有效期間緩存到 fifo1,同時 fifo1 讀出一行數據進入 fifo2 緩存, 且 fifo2 同時讀出一行數據,若 fifo1 或 fifo2 為空則輸出 0。數據輸出過程如下圖所示:

?

此外,實現同時輸出連續三行圖像數據后,需注意所輸出的三個數據對應在一行中的位置保持一致。

3. 接口列表

以下為 matrix_3x3.v 模塊的接口列表。

?

4. 工程說明

4.1. 代碼模塊說明

3X3 圖像矩陣生成模塊代碼如下所示:

// 3x3 矩陣生成
module matrix_3x3
#(parameter IMG_WIDTH = 11'd1920,parameter IMG_HEIGHT = 11'd1080
)
(input wire video_clk,input wire rst_n,input wire video_vs,input wire video_de,input wire [7:0] video_data,  // 3x3 矩陣輸出output wire matrix_de,output reg [7:0] matrix11,output reg [7:0] matrix12,output reg [7:0] matrix13,output reg [7:0] matrix21,output reg [7:0] matrix22,output reg [7:0] matrix23,output reg [7:0] matrix31,output reg [7:0] matrix32,output reg [7:0] matrix33
);// wire definewire [7:0] line3_data;  // 第三行數據wire [7:0] line2_data;  // 第二行數據wire [7:0] line1_data;  // 第一行數據wire wr_fifo_en;        // 寫 FIFO 使能wire rd_fifo_en;        // 讀 FIFO 使能// reg definereg [10:0] x_cnt;reg [10:0] y_cnt;// 列計數always @(posedge video_clk or negedge rst_n) beginif (!rst_n)x_cnt <= 11'd0;else if (x_cnt == IMG_WIDTH - 1)  // 計數一行x_cnt <= 11'd0;else if (video_de)  // 數據有效x_cnt <= x_cnt + 1'b1;elsex_cnt <= x_cnt;end// 行計數always @(posedge video_clk or negedge rst_n) beginif (!rst_n)y_cnt <= 11'd0;else if (y_cnt == IMG_HEIGHT - 1 && x_cnt == IMG_WIDTH - 1)  // 計數一幀y_cnt <= 11'd0;else if (x_cnt == IMG_WIDTH - 1)  // 數據有效y_cnt <= y_cnt + 1'b1;elsey_cnt <= y_cnt;end

以上代碼根據模塊接口列表,定義模塊端口及對輸入數據進行行/列計數

// 3x3 矩陣 第一行和最后一行無法構成
assign wr_fifo_en = video_de && (y_cnt < IMG_HEIGHT-1);
assign rd_fifo_en = video_de && (y_cnt > 0);reg wr_fifo_en_1d;
reg [7:0] video_data_1d;always @(posedge video_clk or negedge rst_n) beginif (!rst_n) beginwr_fifo_en_1d <= 1'd0;video_data_1d <= 8'd0;endelse beginwr_fifo_en_1d <= wr_fifo_en;video_data_1d <= video_data;end
end// 通過兩個 FIFO 與當前的輸入一起構成 3x3 矩陣
assign line3_data = video_data_1d;// fifo1
fifo_line_buffer u1_fifo_line_buffer (.wr_clk      (video_clk),    // input.wr_rst      (~rst_n),       // input.wr_en       (wr_fifo_en),   // input.wr_data     (video_data),   // input [7:0].wr_full     (),             // output.almost_full (),             // output.rd_clk      (video_clk),    // input.rd_rst      (~rst_n),       // input.rd_en       (rd_fifo_en),   // input.rd_data     (line2_data),   // output [7:0].rd_empty    (u1_empty),     // output.almost_empty()              // output
);// fifo2
fifo_line_buffer u2_fifo_line_buffer (.wr_clk      (video_clk),    // input.wr_rst      (~rst_n),       // input.wr_en       (wr_fifo_en_1d),// input.wr_data     (line2_data),   // input [7:0].wr_full     (),             // output.almost_full (),             // output.rd_clk      (video_clk),    // input.rd_rst      (~rst_n),       // input.rd_en       (rd_fifo_en),   // input.rd_data     (line1_data),   // output [7:0].rd_empty    (),             // output.almost_empty()              // output
);

以上代碼實現兩級 fifo 對圖像數據按行緩存。為確保三行數據輸出保持同步,需注意 fifo 讀出數據相較于 fifo 讀使能信號延時 1 個時鐘周期,因此 line3_data 數據需將當前輸入數據延遲 1 個時鐘周期,與 fifo 輸出的 line2_data 和 line1_data 保持同步,并且 fifo1 輸出數據寫入 fifo2 時也需要將 fifo1 的讀使能信號延時 1 個 時鐘周期再作為 fifo2 的寫使能信號。

// 數據延遲 de 延遲
reg video_de_d0;
reg video_de_d1;always @(posedge video_clk or negedge rst_n) beginif (!rst_n) beginvideo_de_d0 <= 1'd0;video_de_d1 <= 1'd0;endelse beginvideo_de_d0 <= video_de;video_de_d1 <= video_de_d0;end
end// 矩陣數據生成
always @(posedge video_clk or negedge rst_n) beginif (!rst_n) begin{matrix11, matrix12, matrix13} <= 24'd0;{matrix21, matrix22, matrix23} <= 24'd0;{matrix31, matrix32, matrix33} <= 24'd0;endelse if (video_de_d0) begin{matrix11, matrix12, matrix13} <= {matrix12, matrix13, line1_data};{matrix21, matrix22, matrix23} <= {matrix22, matrix23, line2_data};{matrix31, matrix32, matrix33} <= {matrix32, matrix33, line3_data};endelse begin{matrix11, matrix12, matrix13} <= 24'd0;{matrix21, matrix22, matrix23} <= 24'd0;{matrix31, matrix32, matrix33} <= 24'd0;end
end// 矩陣數據有效輸出
assign matrix_de = video_de_d1;
assign matrix_vs = video_vs;endmodule

以上代碼實現 3X3 圖像矩陣的生成。三行數據同時輸出,每一行的數據按“打拍”方式移位實現矩陣的位 置的移動,需注意輸出數據在生成矩陣時產生 1 個時鐘周期的延時,因此最終數據的矩陣有效信號 matrix_de 也需延時 1 個時鐘周期。

4.2. 代碼仿真

? ? ??在 modelsim 平臺,matrix_3x3 模塊的仿真激勵模塊 matrix_tb.v 生成 5x5 的圖像數據源,仿真分析結果如下:

5x5 的圖像數據源符合以下圖像示意圖:

3X3 圖像矩陣的生成符合預期。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917714.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917714.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917714.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【通用視覺框架】基于OpenCvSharp+WPF+YOLO開發的仿VisionMaster的通用視覺框架軟件,全套源碼,開箱即用

【通用視覺框架】基于OpenCvSharpWPFYOLO開發的仿VisionMaster的通用視覺框架軟件&#xff0c;全套源碼&#xff0c;開箱即用 基于OpenCvSharp、WPF和YOLO的組合&#xff0c;構建一個兼具圖像處理能力、可視化交互和實時檢測的工業級視覺框架。其核心是將底層算法與上層界面無…

微信小程序轉Vue2組件智能提示詞

角色 小程序轉Vue2組件工程師&#xff08;ElementUI專精&#xff09; 核心能力 技術專長&#xff1a;作為世界頂尖前端工程師&#xff0c;專注于將小程序組件&#xff08;.wxml/.wxss/.js/.json&#xff09;精準轉換為Vue2ElementUI組件&#xff0c;轉換邏輯零偏差&#xff0c;…

JVM 學習總結

文章目錄內存結構程序計數器什么是程序計數器&#xff1f;核心作用&#xff1a;為什么需要程序計數器&#xff1f;實現原理主要特點示例&#xff1a;PC 寄存器如何工作總結Java 虛擬機棧什么是 Java 虛擬機棧&#xff1f;棧幀的內部結構主要特點總結線程診斷本地方法棧堆堆內存…

目標檢測檢出率,誤檢率,ap,map等評估python代碼

1.deepseek版本import numpy as np from collections import defaultdictdef calculate_iou(box1, box2):"""計算兩個邊界框的交并比&#xff08;IoU&#xff09;:param box1: [x1, y1, x2, y2]:param box2: [x1, y1, x2, y2]:return: IoU"""# 計…

python的高校班級管理系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具&#xff1a;Navicat/SQLyog等都可以 在高校教…

Scrapy 工作流程深度解析:引擎驅動的完美協作

一、Scrapy 核心組件全景圖 #mermaid-svg-KWCKN9n4urijbSws {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KWCKN9n4urijbSws .error-icon{fill:#552222;}#mermaid-svg-KWCKN9n4urijbSws .error-text{fill:#552222;…

PCIe Base Specification解析(七)

文章目錄3.6 Data Integrity Mechansisms3.6.1 Introduction3.6.2 LCRC, Sequence Number, and Retry Management (TLP Transmitter)3.6.2.1 LCRC and Sequence Number Rules (TLP Transmitter)3.6.2.2 Handling of Received DLLPs3.6.3 LCRC and Sequence Number (TLP Receive…

Windows 11 使用Windows Hello使用人臉識別登錄失敗,重新錄入人臉識別輸入PIN后報Windows Hello安裝程序白屏無響應的問題解決

Windows 11 使用Windows Hello使用人臉識別登錄失敗&#xff0c;重新錄入人臉識別輸入PIN后報Windows Hello安裝程序白屏無響應的問題解決&#xff1a;遇到此種情況時&#xff1a;1、在“開始”右鍵——設置——賬號——登錄選項2、需要在PIN這里先進行刪除此登錄選項&#xff…

qq scheme

QQ intent scheme跳轉 1.跳轉指定說說(root) 2.跳轉指定說說(非root) 3. 跳轉聊天框 4. 跳轉用戶主頁 5. 跳轉加群 6. 跳轉指定用戶空間 1.跳轉指定說說(root) 該方法需root權限 app.startActivity({className: "com.qzone.reborn.base.QZoneTransparentShellActivi…

C語言基礎_隨機數、數組、函數、指針

0、隨機數&#xff1a; 要用C語言產生隨機數&#xff0c;首先在預處理程序部分要引入stdlib.h頭文件&#xff0c;然后就可以用rand()在后續程序中生成隨機數了。如果不設置隨機數種子srand()&#xff0c;后面生成的隨機數序列就是以41開頭的一個固定序列&#xff0c;因此一般以…

PHP?ORT擴展構建純PHP機器學習的推薦系統

結合 PHP?ORT 構建推薦系統的核心思想是&#xff1a;使用 ONNX 格式的機器學習模型&#xff0c;在 PHP 中本地執行推理&#xff0c;實時給出推薦結果。下面是一個完整的架構設計與實現路徑&#xff0c;適合你快速上手。&#x1f3af; 場景目標 你想在一個 PHP 網站中實現推薦功…

PromptPilot搭配Doubao-seed-1.6:定制你需要的AI提示prompt

目錄 一、PromptPilot 二、基于產品評價的用戶情感分析 2.1 使用PromptPiolt工具進行提示詞生成 2.2 基于prompt的模型調試 2.3 基于prompt的批量數據測評 2.4 基于多輪對話的prompt測試 如今&#xff0c;我們正身處一個 AI 技術飛速迭代的時代。人工智能早已不再是實驗室…

MSPM0開發學習筆記:二維云臺結合openmv實現小球追蹤

文章目錄前言一、硬件選擇二、原理介紹&#xff08;UART&#xff09;三、硬件連線三、軟件代碼1、視覺部分代碼&#xff08;Openart&#xff09;2、控制部分代碼&#xff08;MSPM0&#xff09;&#xff08;1&#xff09; UART部分&#xff08;2&#xff09; 計算函數部分&#…

【CTF-WEB-SQL】SQL注入基本流程(sql-labs的Less11)(用burp抓取post然后用sqlmap盲注)

題目 從第11less開始&#xff0c;就是POST表單了burp抓取數據包將抓取到的數據包存放到桌面&#xff0c;保存為post.txt數據包內容如下&#xff1a;POST /Less-11/ HTTP/1.1 Host: 223.112.39.132:44537 Content-Length: 39 Cache-Control: max-age0 Accept-Language: zh-CN,zh…

WPF 與 Winform :Windows 桌面開發該用誰?

WPF 與 Winform :Windows 桌面開發該用誰? 一、 WPF 與 Winform的概念 WPF:顏值與實力并存的 “后起之秀” Winform:簡單直接的 “老前輩” 二、WPF 與 Winform 的核心差異 1. 設計理念:分離 vs 耦合 2. 布局系統:靈活適配 vs 固定坐標 3. 視覺效果:絢麗動畫 vs 樸素原生…

【Git學習】入門與基礎

目錄 Git的安裝 Git 配置用戶信息 Git 初始化本地倉庫 Git 工作區、暫存區和版本庫 Git 跟蹤文件 Git 修改文件 Git 刪除文件 Git 撤銷本地文件的修改 Git 取消暫存 Git 跳過暫存區 Git 版本回退 Git 撤銷提交 Git 設置忽略文件 Git 比較文件差異 Git 代碼托管平臺…

idea添加gitlab訪問令牌

1.按下圖所示順序操作gitlab,獲取到對應的token;2.填寫對應的gitlab地址和第一步獲取的token

人工智能領域、圖歐科技、IMYAI智能助手2025年5月更新月報

2025年5月IMYAI平臺技術動態與模型更新綜述 摘要&#xff1a; 本文整理了2025年5月期間IMYAI平臺發布的主要技術更新、新模型上線信息及功能調整公告&#xff0c;涵蓋DeepSeek、Gemini、Claude、即夢、Suno等模型動態及平臺功能優化。 正文&#xff1a; 一、 模型更新與上線Dee…

機器人權利:真實還是虛幻,機器人權利研究如何可能,道德權利與法律權利

一、機器人權利&#xff1a;真實還是虛幻&#xff1f;機器人權利的討論源于技術進步對傳統法律與倫理體系的沖擊&#xff0c;其真實性取決于技術發展階段與社會接受度的互動。當前&#xff0c;機器人權利仍呈現“虛幻與真實交織”的特征&#xff1a;技術基礎&#xff1a;從工具…

通信小白產品學習碎片01

1. 云中繼&#xff08;Cloud Media Relay&#xff09; 運營商在Volte/Vonr場景中引入的核心網關鍵功能&#xff0c;用于優化媒體流的傳輸路徑&#xff0c;解決跨運營商、跨地域通信時的網絡繞行問題。 傳統&#xff1a;A終端—>A核心網—>跨網互聯點—>B核心網—>…