?(本系列只需要modelsim即可完成數字圖像的處理,每個工程都搭建了全自動化的仿真環境,只需要雙擊top_tb.bat文件就可以完成整個的仿真,大大降低了初學者的門檻!!!!如需要該系列的工程文件請關注知識星球:成工fpga,https://t.zsxq.com/DMeqH,關注即送200GB學習資料,鏈接已置頂!)
圖像的直方圖統計在上個系列有詳細的講解,本課主要完成直方圖統計的FPGA實現。
圖像的直方圖統計就是對一副圖像中0-255這256個像素點出現的次數,在FPGA中,就要用RAM將各個像素點出現的次數存儲起來,每來一個新的像素點,就以這個像素點的值為地址從RAM從取出對應的值,加一后再寫回到這個地址中去。
按照上面的分析,使用RAM進行直方圖統計還有有些麻煩的,因為讀RAM需要一個時鐘周期,寫RAM也需要一個時鐘周期,而像素點數據是一個時鐘來一個,這就要求每個時鐘都要同時讀寫RAM,雖然讀寫的地址不同。其實Xilinx的雙口RAM是不支持同時讀寫的,因為wea就是讀寫使能信號,要不是讀,要不是寫,不能同時讀寫。
其實這個問題很好解決,有時候用簡單的方式更容易實現,這兒我們可以使用數組來存儲,對于數組的操作,一個時鐘周期就可以完成讀寫操作。
還有一個問題,在視頻處理中,圖像是一幀幀流水處理的,我們要統計每幅圖像的直方圖,完成一幅圖像的直方圖統計后就要把直方圖的數據傳輸出去并把數組的內容清零,為下一副圖像的直方圖統計做準備。而通過場同步信號可以判斷一幅圖像是否處理完成,來對存儲直方圖的數組讀走和清空操作。
在\src\hist文件夾下新建hist_statistics.sv文件,使用數組hist_ram來存儲圖像的直方圖統計的信息。
有了數組,圖像直方圖統計的功能實現非常的簡單,直接以輸入的數據為索引讀寫數組即可;而且在直方圖的數據被讀取完畢后直接清空即可。
根據場同步信號,新建rd_result_domain信號,在該信號有效時間內根據wr_cnt將數組中的數據全部讀走。
最后圖像直方圖的數據dout通過dout_en的標示輸出出去,同時生成dout_done信號,用來表示直方圖的數據被讀完成。
到這兒還有一個問題,那就是可能有些像素點統計的值非常大,而有些像素點統計的值又非常的小,就是直方圖的數據很難直觀的反應出圖像的信息,這時候我們就對圖像進行歸一化都一定的范圍,以便直觀的觀察。
在\src\hist文件夾下新建hist_norm.sv文件,用來將直方圖的數據歸一化到0——NORM之間,這個避免除法的操作,直接將直方圖數據和FACTOR相乘即可。由于數據擴大了1024*1240倍,最終的結果應該直接舍棄低20位,但是這樣的話直方圖的數據整體水平都會很小(因圖像而異),所以這兒只是舍棄了低13位,讓直方圖的數據基本在0-255區間內。
top文件例化了rgb2ycbcr,hist_statistics和hist_norm這三個模塊。
在img_process_pkt包中也新建hist_fpgatask,方便圖像測試平臺和FPGA仿真數據的比對。
在tb_image_sim文件中的第二個initial塊中,將圖像測試平臺和FPGA硬件仿真的結果保存并比對。
雙擊sim文件夾下的top_tb.bat文件,完成系統的自動化仿真。
可以看到在modelsim的Transcript有如下的打印信息,圖像測試平臺和FPGA硬件仿真的結果一致。
打開img文件夾,也可以看到圖像測試平臺和FPGA硬件仿真的結果是一致的(no_seq*是圖像測試平臺處理后的圖片,seq*是FPGA硬件仿真處理后的結果)。