愛伊米

使用 Verilog HDL 在 FPGA 上進行影象處理

該FPGA專案旨在詳細展示如何使用Verilog處理影象,從Verilog中讀取輸入點陣圖影象(。bmp),處理並將處理結果寫入Verilog中的輸出點陣圖影象。提供了用於讀取影象、影象處理和寫入影象的完整 Verilog 程式碼 。

使用 Verilog HDL 在 FPGA 上進行影象處理

在這個FPGA Verilog專案中,一些簡單的處理操作都是在Verilog中實現的,比如反相、亮度控制和閾值操作。影象處理操作由“parameter。v”檔案選擇,然後將處理後的影象資料寫入點陣圖影象 output。bmp 以供驗證。所述影象讀取Verilog程式碼作為影象感測器/攝像機的模型的Verilog,它可以是用於在實時的功能驗證真正有用的操作FPGA影象處理專案。當您想檢視 BMP 格式的輸出影象時,影象寫入部分對於測試也非常有用。在這個專案中,我在閱讀部分添加了一些簡單的影象處理程式碼來製作影象處理的示例,但是您可以輕鬆地將其刪除以獲得原始影象資料。學生提出的所有相關問題都在本文底部得到解答。首先,Verilog 不能直接讀取影象。要在 Verilog 中讀取 。bmp 影象,需要將影象從點陣圖格式轉換為十六進位制格式。下面是將點陣圖影象轉換為 。hex 檔案的 Matlab 示例程式碼。輸入影象大小為 768x512,影象 。hex 檔案包括點陣圖影象的 R、G、B 資料。

要讀取影象十六進位制資料檔案,Verilog 使用以下命令:

或readmemb 如果影象資料在二進位制文字檔案中。讀取影象。hex 檔案後,將RGB 影象資料儲存到記憶體中並讀出進行處理。

下面是影象讀取和處理部分的Verilog程式碼:

“parameter。v”檔案也是定義輸入輸出檔案的路徑和名稱。對影象進行處理後,需要將處理後的資料寫入輸出影象進行驗證。

以下Verilog程式碼是將處理後的影象資料寫入點陣圖影象進行驗證:

點陣圖影象的標頭資料非常重要,在這裡釋出。如果沒有標題資料,則無法正確顯示寫入的影象。在 Verilog HDL 中,$fwrite 命令用於將資料寫入檔案。

接下來,讓我們編寫一個測試平臺 Verilog 程式碼來驗證影象處理操作。

最後,我們擁有一切來執行模擬來驗證影象處理程式碼。讓我們使用下圖作為輸入點陣圖檔案:

使用 Verilog HDL 在 FPGA 上進行影象處理

執行模擬 6ms,關閉模擬並開啟輸出影象以檢查結果。以下是引數。v中選定操作處理的輸出影象:

反轉後輸出點陣圖影象

使用 Verilog HDL 在 FPGA 上進行影象處理

閾值操作後輸出點陣圖影象

使用 Verilog HDL 在 FPGA 上進行影象處理

減去亮度後輸出點陣圖影象

使用 Verilog HDL 在 FPGA 上進行影象處理

由於讀取程式碼是為了模擬目的而對影象感測器/相機進行建模,因此建議不要合成程式碼。如果你真的想綜合處理程式碼並直接在FPGA上執行,你需要將程式碼中的這些影象陣列(total_memory、temp_BMP、org_R、org_B、org_G)替換為塊儲存器(RAM)和設計地址生成器來讀取影象塊記憶體中的資料。

問題的答案:

此影象處理專案的完整 Verilog 程式碼可在此處下載。執行模擬大約 6ms 並關閉模擬,然後您將能夠看到輸出影象。

https://github。com/suisuisi/FPGAandImage/blob/main/Image/012_Others/Verilog_Image_Processing。zip

讀取部分作為影象感測器/相機的 Verilog 模型執行(輸出 RGB 資料、HSYNC、VSYNC、HCLK)。Verilog 影象讀取程式碼對於實時 FPGA 影象/影片專案中的功能驗證非常有用。

3。在這個專案中,我添加了影象處理部分,做一個影象增強的例子。如果您只想使用影象感測器模型來驗證您的影象處理設計,您可以輕鬆移除處理部分以僅獲取原始影象資料。

4。影象儲存到三個獨立的RGB mem中:由於Matlab程式碼是將影象16進位制檔案從最後一行寫到第一行,所以RGB儲存程式碼(org_R, org_B, org_G)在讀取temp_BMP記憶體時也是這樣做的,儲存RGB資料正確。如果您想以不同的方式進行,您可以相應地更改它。

如果您想更改影象大小,您可能會發現以下對 BMP 標題的解釋很有用:

您不應綜合此程式碼,因為它不是為在 FPGA 上執行而設計的,而是用於功能驗證目的。 如果你真的想合成這段程式碼(讀取和處理)並將影象載入到 FPGA中直接在 FPGA 上處理,請將所有 temp。 變數 (org_R, org_B, org_G, tmp_BMP = total_memory) 並生成地址以讀取影象資料(刪除 always @(start) 和所有“for 迴圈” - 這些用於模擬目的)。有兩種方式:1。 寫一段RAM程式碼,用$readmemh將影象資料初始化到記憶體中;2。 使用 Xilinx Core Generator 或 Altera MegaFunction 生成塊儲存器並將影象資料載入到儲存器的初始值(Xilinx Core Gen。 為 。coe 檔案,Altera MegaFunction 為 。mif 檔案),然後從儲存器中讀取影象資料並處理它(FSM 設計)。

在這個專案中,為了加快處理速度,同時讀取兩個偶數和舊畫素,但您可以根據您的設計更改正在讀取的畫素數。

編寫Verilog程式碼對於測試目的也非常有幫助,因為您可以看到BMP 格式的輸出。

9。如果要做實時影象處理,可以檢視camera介面程式碼這個:https://www。fpga4student。com/2018/08/basys-3-fpga-ov7670-camera。html

參考:https://www。fpga4student。com/2016/11/image-processing-on-fpga-verilog。html

NOW

學習Xilinx FPGA最好的資料其實就是官方手冊,下表總結了部分手冊的主要介紹內容,關注我,持續更新中……