今天給大俠帶來基于FPGA的實時圖像邊緣檢測系統(tǒng)設(shè)計,由于篇幅較長,分三篇。今天帶來第二篇,中篇,話不多說,上貨。
導(dǎo)讀
隨著科學(xué)技術(shù)的高速發(fā)展,F(xiàn)PGA在系統(tǒng)結(jié)構(gòu)上為數(shù)字圖像處理帶來了新的契機。圖像中的信息并行存在,因此可以并行對其施以相同的操作,使得圖像處理的速度大大提高,這正好適合映射到FPGA架構(gòu)中用硬件算法得以實現(xiàn)。
本篇闡述了基于FPGA設(shè)計一個能夠?qū)崟r采集、實時處理并實時顯示的數(shù)字圖像處理系統(tǒng)的設(shè)計思想和流程,分析了攝像頭接口的時序;闡述了圖像信息的捕獲原理;詳細介紹了圖像邊緣檢測部分各模塊的功能;重點介紹了具有去噪功能的中值濾波模塊的設(shè)計;簡單描述了邊緣檢測算子的選用;系統(tǒng)的介紹了SDRAM的工作原理以及控制方式;介紹了VGA時序;最后針對整個系統(tǒng)做了驗證和總結(jié),包括仿真波形的驗證以及板級驗證。
該系統(tǒng)基于實體FPGA開發(fā)板實現(xiàn)了圖像數(shù)據(jù)的實時采集、實時邊緣檢測和實時顯示,運行穩(wěn)定,實時性能較高,從而也表明FPGA確實具有海量數(shù)據(jù)高速傳輸?shù)哪芰Α?/p>
本篇為本人當(dāng)年的畢業(yè)設(shè)計部分整理,各位大俠可依據(jù)自己的需要進行閱讀,參考學(xué)習(xí)。
第二篇內(nèi)容摘要:本篇會介紹FPGA實現(xiàn)圖像的邊緣檢測,包括圖像數(shù)據(jù)預(yù)處理(彩色圖像數(shù)據(jù)轉(zhuǎn)灰度圖像,中值濾波)、邊緣檢測。
還會介紹FPGA驅(qū)動VGA接口實現(xiàn)圖像邊緣信息的實時顯示,包括圖像數(shù)據(jù)的緩存(SDRAM的工作原理,SDRAM的上電刷新,SDRAM讀寫數(shù)據(jù),圖像數(shù)據(jù)緩存的FPGA實現(xiàn)) 、圖像數(shù)據(jù)的實時顯示(VGA時序分析,VGA接口的FPGA驅(qū)動)等相關(guān)內(nèi)容。
三、FPGA實現(xiàn)圖像的邊緣檢測
3.1 圖像數(shù)據(jù)預(yù)處理
為了實現(xiàn)圖像的邊緣檢測,需要對捕獲到的圖像數(shù)據(jù)進行預(yù)處理操作:后續(xù)算法適用于灰度圖像,因此首先需要將捕獲到的彩色圖像轉(zhuǎn)換為保留有亮度信息的灰度圖像;實時采集到的圖像數(shù)據(jù)往往都會伴隨著噪聲,為了使圖像處理的結(jié)果更加準(zhǔn)確,我還采用了中值濾波算法對得到的灰度圖像進行有效去噪。
3.1.1 彩色圖像數(shù)據(jù)轉(zhuǎn)灰度圖像
本系統(tǒng)所采用的算法全部適用于8位灰度圖像,因此在邊緣檢測和中值濾波之前需要將彩色圖像轉(zhuǎn)換成適于研究的8位灰度圖像,將圖像中的每個像素用下列公式(3-1)計算其灰度值,公式如下:
(3-1)
式中r、g、b分別為該像素對應(yīng)的R、G、B顏色分量,然后用求得的灰度值代替原來該像素的R、G、B分量就行了。如圖3-1所示,我在本系統(tǒng)設(shè)計中按照上述思路實現(xiàn)了從彩色圖像往灰度文件的轉(zhuǎn)換。
圖3-1 彩色圖像轉(zhuǎn)灰度文件對應(yīng)的RTL級視圖
3.1.2 中值濾波
在圖像處理中,為了保護邊緣信息和平滑噪聲,中值濾波被廣泛應(yīng)用。本系統(tǒng)設(shè)計的目的是對實時采集到的圖像進行邊緣檢測,因此邊緣信息檢測的準(zhǔn)確度在很大程度上決定了整個系統(tǒng)設(shè)計的性能,為了提高我所設(shè)計系統(tǒng)的性能,我采用了中值濾波。中值濾波是一種非線性信號處理技術(shù),基于排序統(tǒng)計理論,可以有效抑制噪聲,其基本原理是將數(shù)字圖像或者數(shù)字序列中一點的值用該點所在鄰域中各點值的中值代替,讓周圍的像素值盡可能的接近其真實值,從而能夠有效地消除孤立的噪聲點。分兩步實現(xiàn):1.采樣取出奇數(shù)個數(shù)據(jù)進行排序;2.用排序后的中值代替所要處理的數(shù)據(jù)。
本設(shè)計選擇3*3的窗口模板,調(diào)用FIFO來對圖像數(shù)據(jù)進行緩存,然后并行輸出3行數(shù)據(jù),在進行數(shù)值比較之后順序輸出中值結(jié)果,有效提高了系統(tǒng)的處理速度。
圖3-2 中值濾波模塊框圖
如圖3-2所示為該系統(tǒng)中值濾波模塊的框圖,調(diào)用四個子模塊:shift_temp模塊、compara_fifo模塊、zhongzhilvbo模塊和midnum_mem模塊。其中,shift_temp模塊、compara_fifo模塊和midnum_mem模塊均為調(diào)用的IP核,其模塊架構(gòu)如圖3-2所示。
圖3-3 中值濾波模塊架構(gòu)圖
shift_temp模塊調(diào)用的IP核是一個移位寄存器,在寫請求信號wrreq的控制下,將輸入的8bit圖像灰度信息移位寄存到24bit寄存器中并實時傳送,接著在compara_fifo模塊和midnum_mem模塊中分別調(diào)用了一個FIFO,所謂FIFO就是先入先出存儲器,這里用作數(shù)據(jù)緩存,有效地保證了中值濾波過程中所處理信息的流暢性和可靠性。中值濾波模塊的核心運算在zhongzhilvbo模塊中得以實現(xiàn),該模塊框圖如圖3-4所示。
圖3-4 zhongzhilvbo模塊框圖
中值濾波及其子模塊代碼及說明見附錄,編寫測試文件仿真運行即可得到如圖3-2所示的仿真波形。
圖3-5 中值濾波模塊的仿真波形
3.2 邊緣檢測
一幅圖像中灰度變化比較劇烈的區(qū)域一般就是圖像邊緣,圖像的邊緣信息可以通過計算灰度圖像中各區(qū)域的梯度幅值來判斷。令圖像的亮度為f(x,y),則其灰度可以用以下公式來定義:
(3-1)
幅值為:
(3-2)
方向為:
(3-3)
比較常用的邊緣檢測算子有Prewitt 邊緣檢測算子、Roberts 邊緣檢測算子、Laplacian 邊緣檢測算子、Sobel 邊緣檢測算子等。經(jīng)典Sobel邊緣檢測算法便是基于梯度的檢測,利用垂直梯度和水平梯度2個方向模板和圖像進行鄰域卷積完成。其中,垂直梯度方向模板和水平梯度方向模板分別用于檢測水平邊緣和垂直檢測。其利用Sobel算子在3*3的圖像鄰域內(nèi)和亮度數(shù)據(jù)作卷積運算,表達式如下:
(3-4)
(3-5)
我選用如圖3-6所示的數(shù)據(jù)源,并分別采用上述幾種算子實施檢測,其算子和檢測得到的結(jié)果分別如圖3-7、圖3-8、圖3-9和圖3-10所示。對比上述四幅檢測結(jié)果圖,我最終選用Sobel算子作為我的邊緣檢測算法。
圖3-6 邊緣檢測數(shù)據(jù)
圖3-7 Prewitt算子及邊緣檢測結(jié)果圖
圖3-8 Roberts算子及其邊緣檢測結(jié)果
圖3-9 Laplacian算子及其邊緣檢測結(jié)果
圖3-10 Sobel算子及其邊緣檢測結(jié)果
四、FPGA驅(qū)動VGA接口實現(xiàn)圖像邊緣的實時顯示
4.1 圖像數(shù)據(jù)的緩存
實現(xiàn)了圖像數(shù)據(jù)的邊緣檢測,接著就需要將其實時顯示,該系統(tǒng)設(shè)計最終基于VGA實現(xiàn)這一功能。這一功能說起來簡單,實現(xiàn)起來卻并不容易,由于Ov7725輸出數(shù)據(jù)的時鐘和VGA輸入的時鐘不同,導(dǎo)致無法將檢測到的數(shù)據(jù)直接對接到VGA接口并輸出。其解決方案是在VGA實時顯示之前將檢測到的圖像數(shù)據(jù)先緩存起來,這里選用SDRAM作為圖像數(shù)據(jù)的緩存器,從而解決了這一難題。
SDRAM(Synchronous Dynamic Random Access Memory)即同步動態(tài)隨機存儲器。同步是指其時鐘頻率與CPU前端總線的時鐘頻率相同;動態(tài)是指SDRAM位電容陣列,需要定期不斷的充放電來保證數(shù)據(jù)不丟失;隨機是指不是線性一次存儲數(shù)據(jù),而是可以進行隨機地址的讀寫操作。該系統(tǒng)設(shè)計選用了海力士公司生產(chǎn)的HY57V641620ETP-7,其存儲大小約為4Banks x 1Mbits x 16 = 64Mbits,最高頻率可達143Mhz,在實際設(shè)計中選定SDRAM的驅(qū)動頻率為100Mhz。
4.1.1 SDRAM的工作原理
SDRAM存儲器框圖如圖4-1所示,其主要功能是實現(xiàn)數(shù)據(jù)的高速讀寫操作,內(nèi)部模塊包括邏輯控制單元、地址寄存器和數(shù)據(jù)寄存器。在眾多的SDRAM控制器中,廠家往往會指定相關(guān)操作對應(yīng)的命令,因此在SDRAM內(nèi)部還有一個命令解碼器。SDRAM的上電刷新、讀數(shù)據(jù)和寫數(shù)據(jù)、預(yù)充電、刷新等操作實際上就是對每一個命令的操作,SDRAM的基本操作命令如圖4-2所示。
圖4-1 SDRAM存儲器框圖
圖4-2 SDRAM控制命令表
4.1.2 SDRAM的上電刷新
1)SDRAM初始化流程
在正式使用SDRAM之前,有一個非常關(guān)鍵的步驟——SDRAM的初始化,其主要功能是穩(wěn)定電路和完成SDRAM的配置,從而保證SDRAM能夠按照我們預(yù)期的工作模式來工作。SDRAM初始化的流程,如圖4-3所示。
圖4-3 SDRAM初始化流程圖
SDRAM初始化必須按照流程嚴(yán)格執(zhí)行,否則就會導(dǎo)致SDRAM在讀、寫數(shù)據(jù)出現(xiàn)問題。例如初始化流程中100us的等待時間必須給足,不然就會導(dǎo)致整個上電刷新模塊出現(xiàn)問題。SDRAM的Logicla Bank是電容結(jié)構(gòu),電容容易掉電使數(shù)據(jù)丟失,所以應(yīng)該定時給SDRAM充電,手冊中表示至少每64ms要對所有BANK進行一次刷新,確保數(shù)據(jù)正確。該系統(tǒng)設(shè)計所用SDRAM的刷新周期是 64ms/4096 = 15.625us。模式寄存器配置完成之后,輸出一個標(biāo)志信號作為外部模塊讀寫SDRAM的握手信號,從而保證圖像數(shù)據(jù)的正確讀寫。
2)模式寄存器設(shè)置
在進行SDRAM初始化的時候,必須對模式寄存器(Mode Register,MR)進行配置,模式寄存器的主要功能是配置SDRAM的讀/寫數(shù)據(jù)的突發(fā)長度(Burst Length)、突發(fā)類型(Burst Type)、潛伏期(CAS Latency)、寫突發(fā)模式(Write Mode)等設(shè)置。如果模式寄存器沒有設(shè)置好,那么SDRAM 就不會按照預(yù)先的模式工作;上電初期對模式寄存器所進行的設(shè)置,其信息將會持續(xù)保持直到下一次編程或者掉電為止,模式寄存器的地址總線及其意義如圖4-4所示。
圖4-4 SDRAM模式寄存器設(shè)置命令表
現(xiàn)對如圖4-4所示表格中的相關(guān)信息做一下說明:
⑴A2A1A0所控制的是突發(fā)長度,SDRAM進行數(shù)據(jù)讀寫時以此為單位,突發(fā)長度有1、2、4、8、全頁突發(fā)(full page)。全頁突發(fā)是指每一個bank里面的一行中所有的數(shù)據(jù),其大小取決于SDRAM的列數(shù),本系統(tǒng)設(shè)計所選用的是64Mbits的SDRAM,其列數(shù)只有256個存儲單位,這就意味著我們一頁最多可讀寫256個數(shù)據(jù)。
⑵A3控制的是突發(fā)類型,分為連續(xù)發(fā)送和交替發(fā)送兩種,面對大數(shù)據(jù)的傳輸時我們一般選擇連續(xù)發(fā)送,這樣能夠保證相對較高的速度,本系統(tǒng)設(shè)計選擇連續(xù)發(fā)送數(shù)據(jù)。
⑶A6A5A4控制的是讀寫數(shù)據(jù)的潛伏期,潛伏期有1、2、3拍三種;潛伏期越大,系統(tǒng)的運行速度就越高,本系統(tǒng)設(shè)計選擇3拍潛伏期。
⑷其余地址可以忽略。
4.1.3 SDRAM讀寫數(shù)據(jù)
SDRAM讀寫數(shù)據(jù)的方式有多種,可以根據(jù)需求讀取指定地址中的數(shù)據(jù),也可以連續(xù)讀寫最多256個數(shù)據(jù)。本系統(tǒng)設(shè)計中,所要緩存的圖像數(shù)據(jù)量比較大,因此選用突發(fā)讀寫整頁數(shù)據(jù)的方式來實現(xiàn),從而有效提高數(shù)據(jù)傳輸的帶寬。
圖4-5 SDRAM讀數(shù)據(jù)時序
如圖4-5所示為SDRAM讀數(shù)據(jù)的時序圖:在上電刷新時,需要在模式寄存器內(nèi)設(shè)置好突發(fā)長度和潛伏期,上圖中的潛伏期CL = 2,突發(fā)長度是4;分析上圖不難發(fā)現(xiàn),自發(fā)出第一次讀命令后,讀數(shù)據(jù)操作便會自動運行。
如果不想突發(fā)中斷數(shù)據(jù)的讀取,實現(xiàn)數(shù)據(jù)的連續(xù)讀取,只需控制好兩次發(fā)送讀命令的間隔周期即可。在本系統(tǒng)設(shè)計中,需要處理的是邊緣檢測以后的視頻流數(shù)據(jù),因此設(shè)置為連續(xù)的突發(fā)讀寫模式,同時選擇全頁讀寫的方式進行數(shù)據(jù)的操作,從而達到更大的帶寬、更高的效率,以實現(xiàn)更快的速度。這樣做的前提是在每次SDRAM讀數(shù)據(jù)或者寫數(shù)據(jù)時,都必須要為其準(zhǔn)備好至少256個數(shù)據(jù)緩沖器,以保證數(shù)據(jù)可以連續(xù)的讀寫,因此需要調(diào)用FIFO作為SDRAM的緩沖器。
4.1.4 圖像數(shù)據(jù)緩存的FPGA實現(xiàn)
基于是上述分析,我們就可以基于FPGA編寫SDRAM的控制器代碼,同時必須要調(diào)用兩個FIFO分別用作SDRAM的讀數(shù)據(jù)和寫數(shù)據(jù)緩沖器,如圖4-6即為工程編譯成功以后圖像數(shù)據(jù)緩存模塊所對應(yīng)的RTL級視圖。
圖4-6 圖像數(shù)據(jù)緩存模塊所對應(yīng)的RTL級視圖
4.2 圖像數(shù)據(jù)的實時顯示
VGA(Video Graphics Array,視頻圖形陣列)是一種電腦顯示標(biāo)準(zhǔn),對于現(xiàn)如今的個人電腦市場來說,這個標(biāo)準(zhǔn)已十分過時。然而,VGA卻是眾多顯示設(shè)備制造商所共同支持的一個低標(biāo)準(zhǔn),因此具有一定的通用性。因此,本系統(tǒng)設(shè)計就選擇VGA作為圖像緩存數(shù)據(jù)到顯示器的橋梁,將邊緣檢測后的視頻圖像數(shù)據(jù)實時顯示到相關(guān)的顯示設(shè)備上。如圖4-7所示,VGA接口與串口的硬件結(jié)構(gòu)相類似,分為公頭與母頭(PC接口為母頭)。
圖4-7 VGA接口示意圖
VGA接口使用15針的D型接口,擁有15根信號線,分成三組,每組5根信號線。接口編號順序為:公頭從左到右,依次遞增;母頭從右到左,一次遞減,兩者相互對應(yīng),各引腳功能描述見表4-1。
表4-1 VGA接口各引腳功能描述
4.2.1 VGA時序分析
廣義的VGA為VGA顯示器,狹義的VGA為VGA分辨率的時序。由IBM推出的采用RGB模擬信號的VGA視頻標(biāo)準(zhǔn),定義了具有60Hz刷新頻率、可產(chǎn)生16萬種色彩的640*480像素格式。VGA顯示器掃描方式分為逐行掃描和隔行掃描:逐行掃描是從屏幕左上角第一個點開始,從左向右逐點掃描,每掃描完一行,電子束回到屏幕的左邊下一行的起始位置,在這期間,CRT 對電子束進行消隱,每行結(jié)束時,用行同步信號進行同步;當(dāng)掃描完所有的行,形成一幀,用場同步信號進行場同步,并使掃描回到屏幕左上方,同時進行場消隱,開始下一幀。隔行掃描是指電子束掃描時每隔一行掃一線,掃完一屏后再返回來掃描剩下的線,隔行掃描的顯示器閃爍快速,可能會使使用者眼睛疲勞(本實驗采用逐行掃描的方式)。掃描原理清楚以后,緊接著再來看看VGA的行、列同步時序。
1)VGA行列時序
VGA列同步時序如圖4-8所示:
圖4-8 VGA列同步時序圖
VGA行同步時序如圖4-9所示:
圖4-9 VGA行同步時序圖
VGA 中定義行時序和列時序都需要同步脈沖(a 段)、顯示后沿(b 段)、顯示時序段(c 段)和顯示前沿(d 段)四部分。VGA 工業(yè)標(biāo)準(zhǔn)顯示模式要求:行同步、列同步都為負極性,即同步脈沖要求是負脈沖。
由 VGA 行時序可知:每一行都有一個負極性行同步脈沖(a 段),是數(shù)據(jù)行的結(jié)束標(biāo)志,同時也是下一行的開始標(biāo)志。在同步脈沖之后為顯示后沿(b段),在顯示時序段(c 段)為顯示器亮的過程,RGB 數(shù)據(jù)驅(qū)動一行上的每一個像素點,從而顯示一行。在一行的最后為顯示前沿(d 段)。在顯示時間段之外沒有圖像投射到屏幕,而是插入消隱信號。同步脈沖、顯示后沿和顯示前沿都是在行消隱間隔內(nèi),當(dāng)消隱有效時,RGB 信號無效,屏幕不顯示數(shù)據(jù)。
2)VGA顯示標(biāo)準(zhǔn)
“分辨率”是衡量物體精確程度的一個參數(shù),對于顯示器而言,分辨率越高,意味著顯示圖像的清晰度越高,包含跟過的信息,具有更多細節(jié)的畫質(zhì),圖像更加保真細致。由于人眼的視覺暫留特性,想要實現(xiàn)CRT顯示器畫面不閃爍,至少需要實現(xiàn)每秒至少25幀的畫面更新。而顯示器為了保證畫面流暢,視覺效果更佳,通常一般的掃描幀速在每秒60幀以上。不同像素的行/列掃描刷新時序見表4-2。
表4-2 VGA標(biāo)準(zhǔn)顯示表
以本設(shè)計的顯示標(biāo)準(zhǔn) 640*480*60Hz 為例。(640 為列數(shù),480 為行數(shù),60Hz為刷新一屏的頻率),時鐘頻率大約是 25.175Mhz。列時序:屏幕對應(yīng)的行數(shù)為800(a+b+c+d=e 段),其中 640(c 段)為顯示行;每行均有行同步信號(a 段),為96個行周期的低電平。行時序:每個顯示行包括525列(a+b+c+d=e段),其中480(c段)為有效顯示區(qū),每列均有列同步信號(a段),為2個列周期的低電平。
3)VGA驅(qū)動電路設(shè)計
由于FPGA輸出的是3.3V電平,而VGA要求0~0.714V的模擬信號,為了設(shè)計VGA的標(biāo)準(zhǔn)接口,完成電平的轉(zhuǎn)換,需要設(shè)計DAC數(shù)模轉(zhuǎn)換電路,來實現(xiàn)0~0.714V模擬視頻信號的傳輸,針對RGB的分辨率高低,可以采用不同的數(shù)模實現(xiàn)方案,在VGA驅(qū)動電路設(shè)計中,我們最需要關(guān)心的幾組信號見表4-3。
表4-3 VGA驅(qū)動電路信號表
HSYNC與VSYNC為3.3V數(shù)字信號,再設(shè)計中無須考慮電平轉(zhuǎn)換,可以直接接與FPGA互聯(lián)。而RGB為0~0.714V模擬信號,這是需要我們轉(zhuǎn)換處理的部分,本設(shè)計采用專用的視頻轉(zhuǎn)換DAC芯片,其穩(wěn)定的ASIC保證了視頻傳輸?shù)馁|(zhì)量,具有很好的性價比。采用Analog Devices的視頻轉(zhuǎn)換芯片ADV7123,其參數(shù)如下:
⑴最大采樣率是330Mhz;
⑵3路10位視頻DAC轉(zhuǎn)換器;
⑶兼容TTL電平輸入;
⑷5V/3.3V單電源工作;
⑸輸出電流達到2~26mA;
⑹低功耗。
ADV7123具體的硬件電路圖如圖4-10所示。
圖4-10 ADV7123電路結(jié)構(gòu)圖
4.2.2 VGA接口的FPGA驅(qū)動
分析了VGA接口的時序,我們就可以按照時序基于FPGA編寫相應(yīng)的VGA驅(qū)動代碼,如圖4-11所示即為系統(tǒng)工程成功編譯以后VGA驅(qū)動模塊對應(yīng)的RTL級視圖。
圖4-11 VGA驅(qū)動模塊對應(yīng)的RTL級視圖
本篇到此結(jié)束,下一篇帶來基于FPGA的實時圖像邊緣檢測系統(tǒng)設(shè)計(下),介紹系統(tǒng)驗證、結(jié)論以及各個模塊主要代碼,包括圖像實時采集模塊的主要代碼,圖像實時捕獲模塊的主要代碼,中值濾波模塊的主要代碼,邊緣檢測模塊的主要代碼,圖像緩存模塊的主要代碼,圖像實時顯示模塊的主要代碼等相關(guān)內(nèi)容。