今天給大俠帶來(lái)基于FPGA的單目?jī)?nèi)窺鏡定位系統(tǒng)設(shè)計(jì),由于篇幅較長(zhǎng),分三篇。今天帶來(lái)第二篇,中篇,話不多說(shuō),上貨。
隨著現(xiàn)科技的發(fā)展和社會(huì)的進(jìn)步,信息科技迅速發(fā)展,我們可從互聯(lián)網(wǎng)、電臺(tái)等媒體獲取大量信息?,F(xiàn)代信息的存儲(chǔ)、處理和傳輸變得越來(lái)越數(shù)字化。在人們的日常生活中,常用的計(jì)算機(jī)、電視、音響系統(tǒng)、視頻記錄設(shè)備、遠(yuǎn)程通訊電子設(shè)備無(wú)一不采用電子系統(tǒng)、數(shù)字電路系統(tǒng)。因此,數(shù)字技術(shù)的應(yīng)用越來(lái)越廣泛。尤其在通信系統(tǒng)和視頻系統(tǒng)中,數(shù)字系統(tǒng)尤為突出。而隨著FPGA的出世,數(shù)字系統(tǒng)更加受到人們青睞,它為數(shù)字系統(tǒng)的設(shè)計(jì)提供更加便捷的通道,使得數(shù)字系統(tǒng)設(shè)計(jì)可以芯片小型化,電路規(guī)模大型化,龐大的邏輯資源,可滿足各種數(shù)字系統(tǒng)設(shè)計(jì)。
隨著社會(huì)的發(fā)展,科學(xué)技術(shù)已經(jīng)應(yīng)用于各個(gè)領(lǐng)域,尤其是醫(yī)療領(lǐng)域尤為突出。而在醫(yī)療領(lǐng)域中,心臟電信號(hào)模擬器手術(shù)輔助儀器發(fā)展迅速。為了訓(xùn)練經(jīng)驗(yàn)少的醫(yī)生熟悉心臟手術(shù)的操作過(guò)程,而專(zhuān)門(mén)開(kāi)發(fā)心臟信號(hào)模擬儀器,讓醫(yī)生迅速掌握心臟手術(shù)操作過(guò)程,成為一個(gè)經(jīng)驗(yàn)豐富心臟手術(shù)醫(yī)生。
因此,本文將于FPGA平臺(tái),以圖像處理結(jié)合信號(hào)采集原理,實(shí)現(xiàn)醫(yī)生在做心臟模擬手術(shù)操作導(dǎo)管的過(guò)程中,不需要觀察心臟內(nèi)部情況,即可獲取導(dǎo)管頭在心臟內(nèi)部信息的功能,采用內(nèi)窺鏡攝像頭采集視頻和并對(duì)導(dǎo)管頭進(jìn)行跟蹤定位,信號(hào)采集技術(shù)可將采集到的導(dǎo)管頭在心臟內(nèi)部觸碰區(qū)域的信號(hào)采集出來(lái)送到專(zhuān)業(yè)醫(yī)用儀器,進(jìn)行心臟3D建模。
本設(shè)計(jì)的實(shí)現(xiàn)對(duì)醫(yī)院培養(yǎng)的經(jīng)驗(yàn)少的醫(yī)生盡快掌握心臟手術(shù)操作流程很有價(jià)值,未來(lái)將可以培養(yǎng)更多從事心臟手術(shù)工作的醫(yī)學(xué)專(zhuān)業(yè)畢業(yè)的學(xué)生或剛剛從事這個(gè)行業(yè)的社會(huì)醫(yī)生。
第二篇內(nèi)容摘要:本篇還會(huì)介紹硬件設(shè)計(jì),包括電源電路、FPGA外圍電路、采集電路、緩沖電路、顯示電路等相關(guān)內(nèi)容,以及介紹軟件設(shè)計(jì),包括采集模塊、緩沖模塊、處理模塊、解碼模塊、顯示模塊等相關(guān)內(nèi)容。
四、硬件設(shè)計(jì)
硬件設(shè)計(jì)包括有電源電路、FPGA外圍電路、采集電路、緩沖電路和顯示電路。
4.1 電源電路
電路設(shè)計(jì):使用接口連接電源并且附帶串口輸出,電源輸出需要VCC(5V)、3.3V、2.8V、2.5V、1.2V。其中某些外設(shè)需要VCC、和3.3V供電,而3.3V、2.8V、2.5V、1.2V是FPGA芯片和其外圍電路的供電以及攝像頭電路和SDRAM電路。
設(shè)計(jì)如圖4.1所示。
圖4.1 電源電路原理圖
4.2 FPGA外圍電路
芯片選型:本設(shè)計(jì)電路使用Altera公司的clcone IV系列的EP4CE6F17C8型芯片。
電路設(shè)計(jì):FPGA外圍電路包括JTAG電路,EPCS電路和晶振電路等主要的電路。電路圖如下,圖4.2 JTAG電路,圖4.3 EPCS電路,圖4.4 晶振電路。
圖4.2 JTAG電路原理圖
圖4.3 EPCS電路原理圖
圖4.4 晶振電路原理圖
4.3 采集電路
電路設(shè)計(jì):采集電路設(shè)計(jì)在設(shè)計(jì)時(shí),將cmos_sclk和cmos_sdat上拉4.7k電阻即可,類(lèi)似于I2C總線。設(shè)計(jì)如圖4.5所示。
圖4.5 攝像頭采集電路原理圖
4.4 緩沖電路
電路設(shè)計(jì):按照官方設(shè)計(jì)存儲(chǔ)器外圍電路如圖4.6所示。
圖4.6 SDRAM電路原理圖
4.5 顯示電路
電路設(shè)計(jì):VGA設(shè)計(jì)電路如圖4.7所示。
圖4.7 VGA電路原理圖
五、軟件設(shè)計(jì)
以下是對(duì)各個(gè)模塊具體的設(shè)計(jì)和劃分,整體設(shè)計(jì)如圖5.1所示。
圖5.1 軟件模塊設(shè)計(jì)
圖5.1可分為5大塊,采集模塊(OV7670采集圖像)、緩沖模塊(SDRAM圖像緩沖)、處理模塊(乒乓輸入、乒乓輸出、幀差、二值圖像投影并計(jì)算目標(biāo))、解碼模塊(YUV格式轉(zhuǎn)RGB565格式)、顯示模塊(打印出坐標(biāo)信息、驅(qū)動(dòng)VGA)。詳細(xì)設(shè)計(jì)在接下來(lái)的章節(jié)中一一講解。
5.1 采集模塊
5.1.1. 初始化SCCB(I2C)協(xié)議實(shí)現(xiàn)
SCCB 由OV公司生產(chǎn),通過(guò)配置寄存器,來(lái)設(shè)置攝像頭功能,從而達(dá)到采集數(shù)據(jù)的目的。通訊協(xié)議和I2C差不多,都是有一個(gè)時(shí)鐘線和一個(gè)數(shù)據(jù)線,數(shù)據(jù)線是雙向的,如圖5.2所示為SCCB主機(jī)和從機(jī)電氣連接圖。SCCB協(xié)議的主機(jī)發(fā)出啟動(dòng)停止和數(shù)據(jù)信號(hào),從機(jī)響應(yīng)應(yīng)答信號(hào)和非應(yīng)答信號(hào),主機(jī)在SCLK為高電平時(shí),將SDAT從高拉低,這時(shí)觸發(fā)啟動(dòng)信號(hào),在SCLK為高電平時(shí),將SDAT從低拉高,這時(shí)觸發(fā)停止信號(hào),至于發(fā)送數(shù)據(jù)信號(hào),只有在啟動(dòng)信號(hào)和停止信號(hào)之間,SCLK為低電平時(shí),SDAT才允許改變,但是在SCLK為高電平時(shí),SDAT必須保持不變,換句話來(lái)說(shuō),SDAT只有在SCLK為低電平時(shí)才能改變。主機(jī)使用FPGA,從機(jī)為攝像頭。每個(gè)從機(jī)都會(huì)有一個(gè)獨(dú)一無(wú)二的地址,軟件訪問(wèn)從機(jī)時(shí),識(shí)別從機(jī)地址即可。根據(jù)廠家使用手冊(cè)SCLK和SDAT需要接上拉電阻。
接下來(lái),講一下SCCB傳輸?shù)幕靖袷?,其傳輸格式與I2C基本上一樣,如圖5.3所示,總共寫(xiě)時(shí)序有三個(gè)部分。每一部分都傳輸特定的數(shù)據(jù),第一部分由8bit組成,最低位是讀寫(xiě)選擇控制,高7bit由從唯一機(jī)地址組成,最后當(dāng)從機(jī)接收到8bit數(shù)據(jù)后,會(huì)向主機(jī)反饋一個(gè)應(yīng)答信號(hào)ACK。第二部分,由8bit數(shù)據(jù)組成,其為從機(jī)內(nèi)部寄存器地址,最后當(dāng)從機(jī)接收到8bit數(shù)據(jù)后,會(huì)向主機(jī)反饋一個(gè)應(yīng)答信號(hào)ACK。第三部分,由8bit數(shù)據(jù)組成,其為從機(jī)內(nèi)部寄存器數(shù)據(jù),最后當(dāng)從機(jī)接收到8bit數(shù)據(jù)后,會(huì)向主機(jī)反饋一個(gè)非應(yīng)答信號(hào)NACK。
圖5.2 SCCB電氣連接
圖5.3 SCCB時(shí)序圖
通過(guò)ModelSim仿真可以得到相應(yīng)的SCCB時(shí)序圖,如圖5.4所示。
圖5.4 仿真時(shí)序圖
結(jié)論:SCCB總線仿真時(shí)序圖和廠家手冊(cè)時(shí)序圖一致,i2c_sdat為數(shù)據(jù)信號(hào),ui2c_sclk為時(shí)鐘信號(hào)。在時(shí)鐘高電平時(shí),數(shù)據(jù)從高拉低為起始信號(hào),數(shù)據(jù)從低拉高為停止信號(hào),在時(shí)鐘低電平時(shí),數(shù)據(jù)信號(hào)可以改變,而且可以收到應(yīng)答信號(hào),時(shí)鐘為高電平時(shí)數(shù)據(jù)保持。
5.1.2. 像素?cái)?shù)據(jù)捕獲設(shè)計(jì)
在驅(qū)動(dòng)攝像頭時(shí),攝像頭輸出時(shí)序是按照?qǐng)D5.5輸出的,本設(shè)計(jì)按照攝像頭產(chǎn)生的行有效信號(hào)HREF和捕獲時(shí)鐘PCLK對(duì)相應(yīng)的數(shù)據(jù)進(jìn)行捕獲即可。
圖5.5 攝像頭輸出時(shí)序圖
5.2 緩沖模塊
sdram控制器:動(dòng)態(tài)隨機(jī)訪問(wèn)存儲(chǔ)器(Synchronous Dynamic Random Access Memory)價(jià)廉,容量大,但控制復(fù)雜。SDRAM以及隨后的DDR2,DDR3成為當(dāng)前數(shù)字系統(tǒng)主要的存儲(chǔ)器器件,SDRAM器件電氣接口如圖5.6所示。
圖5.6 SDRAM器件的端口圖
然后介紹sdram控制器設(shè)計(jì)步驟以及相應(yīng)時(shí)序圖和仿真圖。
5.2.1. 器件初始化:
1). 加載電源(VDD和VDDQ)
2). CKE設(shè)置為低(LVTTL邏輯低電平)
3). 加載穩(wěn)定的時(shí)鐘信號(hào)
4). 等待至少100us,此時(shí)的命令保持為INHIBIT或NOP
5). 在步驟4的100us中的某個(gè)時(shí)刻,將CKE設(shè)置為高,命令仍然保持為INHIBIT或NOP
6). 步驟4的100us結(jié)束后,即可發(fā)出一個(gè)全部Bank的預(yù)充電命令(PRECHARGE ALL)
7). 等待至少tRP(行預(yù)充電最小周期),此時(shí)命令保持為NOP或DESELECT
8). 發(fā)出一個(gè)自動(dòng)刷新命令(AUTO REFRESH)
9). 等待至少tRFC(自動(dòng)預(yù)充電周期),此時(shí)的命令僅允許是NOP或INHIBIT
10). 再發(fā)出一個(gè)自動(dòng)刷新命令( AUTO REFRESH )
11). 再等待至少tRFC(自動(dòng)預(yù)充電周期),此時(shí)的命令僅允許是NOP或INH
12). 使用LMR命令設(shè)置模式寄存器
13). 等待至少tMRD(LMR命令至激活或刷新命令的最小間隔),此時(shí)的命令僅允許是NOP或DESELECT
圖5.7 sdram控制器初始化時(shí)序圖
圖5.8 sdram控制器初始化仿真時(shí)序圖
結(jié)論:仿真如圖5.8所示,達(dá)到廠家時(shí)序圖5.7所示的指標(biāo),按照廠家時(shí)序步驟設(shè)計(jì)時(shí)序仿真圖紅色光標(biāo)線標(biāo)明。要注意的是在發(fā)出上電命令之前要發(fā)出NOP指令100us以上,設(shè)計(jì)100.0025us滿足指標(biāo)。
5.2.2. sdram刷新操作
SDRAM的刷新分為自動(dòng)刷新(Auto Refresh)和自刷新(Self Refresh) ,前者由外部控制,必須定時(shí)給出刷新命令,后者在cke為低時(shí)SDRAM器件自己進(jìn)行,無(wú)需外部干預(yù)。自動(dòng)刷新(Auto Refresh)時(shí),SDRAM內(nèi)部的自動(dòng)刷新計(jì)數(shù)器定時(shí)對(duì)所有Bank的行進(jìn)行刷新。刷新期間所有操作要停止。自動(dòng)刷新命令是由外部發(fā)出的(SDRAM控制器發(fā)出)。通常存儲(chǔ)電容的充放電周期為64ms,8192行(13位行地址尋址范圍)。以下是自動(dòng)刷新步驟以及時(shí)序圖如圖5.9所示和仿真圖如圖5.10所示。
1). 所有Bank執(zhí)行預(yù)充電(關(guān)閉所有Bank的行)
2). 等待至少tRP,期間的命令保持為INHIBIT或NOP
3). 執(zhí)行Auto Refresh命令
4). 等待至少tRFC,期間不能有任何可執(zhí)行命令,僅允許INHIBIT或NOP
5). 若要執(zhí)行背靠背刷新,則執(zhí)行下一個(gè)Auto Refresh
6). 若無(wú)背靠背(Back to back, 即A10=1執(zhí)行預(yù)充電),則刷新結(jié)束,可以開(kāi)始激活新的bank
7). 自動(dòng)刷新周期保證每行(所有Bank)滿足行刷新周期64ms,因此刷新周期=64ms/8192=7.813us
注意:對(duì)所有bank充電(如果使用突發(fā)中斷指令,可以不用充電);第一次自動(dòng)刷新(第一次刷新必須);第二次自動(dòng)刷新(第二次刷新可選)。
圖5.9 sdram控制器自動(dòng)刷新時(shí)序圖
圖5.10 sdram控制器自動(dòng)刷新仿真時(shí)序圖
結(jié)論:按照廠家手冊(cè)再刷新之前需要做充電操作,然后再做兩次刷新操作,如果設(shè)置模式成頁(yè)寫(xiě)突發(fā)中斷模式,則不需要充電,只需要一次刷新即可。
5.2.3. sdram寫(xiě)操作
圖5.12為寫(xiě)操作時(shí)序圖,圖5.13為寫(xiě)操作仿真圖,以下是寫(xiě)操作步驟。
a. 發(fā)出激活指令,同時(shí)加載行地址,如圖5.11所示;
b. 經(jīng)過(guò)時(shí)間tRCD后,發(fā)出寫(xiě)指令,加載列地址和有效數(shù)據(jù);
c. 數(shù)據(jù)突發(fā)。
圖5.11 激活時(shí)序圖
圖5.12 寫(xiě)操作時(shí)序圖
圖5.13 寫(xiě)操作仿真圖
結(jié)論:寫(xiě)操作之前一定要發(fā)出激活指令,同時(shí)加載行地址,才能發(fā)出寫(xiě)命令加載數(shù)據(jù)和行地址,延時(shí)參數(shù)和廠家手冊(cè)指標(biāo)一致。
5.2.4. sdram讀操作
圖5.14為讀操作時(shí)序圖,圖5.15為讀操作仿真圖,以下是讀操作步驟。
a. 發(fā)出激活指令,同時(shí)加載行地址,如圖5.11所示;
b. 經(jīng)過(guò)時(shí)間tRCD后,發(fā)出讀指令,加載列地址;
c. 經(jīng)過(guò)CL=3,3拍潛伏期之后可讀出數(shù)據(jù);
d. 數(shù)據(jù)突發(fā)。
圖5.14 讀操作時(shí)序圖
圖5.15 讀操作仿真圖
結(jié)論:讀操作之前一定要發(fā)出激活指令,同時(shí)加載行地址,才能發(fā)出讀命令加載行地址,最后得出數(shù)據(jù),延時(shí)參數(shù)和廠家手冊(cè)指標(biāo)一致。
為了便于圖像的實(shí)時(shí)緩沖,在sdram控制器兩端專(zhuān)門(mén)設(shè)計(jì)了fifo端點(diǎn),以適應(yīng)不同時(shí)鐘域數(shù)據(jù)的緩沖,詳細(xì)設(shè)計(jì)如下。
二端點(diǎn)緩沖:sdram控制器兩端接有兩個(gè)異步fifo(一個(gè)寫(xiě)fifo和一個(gè)讀fifo),用戶(hù)可對(duì)一個(gè)寫(xiě)fifo和一個(gè)讀fifo同時(shí)進(jìn)行操作,而且sdram控制器是頁(yè)寫(xiě)突發(fā)。
圖5.16 二端點(diǎn)緩沖仿真圖
四端點(diǎn)緩沖:sdram控制器兩端接有兩個(gè)異步fifo(兩個(gè)寫(xiě)fifo和兩個(gè)讀fifo),用戶(hù)可對(duì)兩個(gè)寫(xiě)fifo和兩個(gè)讀fifo同時(shí)進(jìn)行操作,而且sdram控制器是頁(yè)寫(xiě)突發(fā)。
圖5.17 四端點(diǎn)緩沖仿真圖
結(jié)論:二端點(diǎn)緩沖要求在任意時(shí)刻一端口寫(xiě)入一幀數(shù)據(jù),另一端口在任意時(shí)刻能無(wú)損的讀出寫(xiě)入的圖像,圖5.18紅色光標(biāo)線標(biāo)明設(shè)計(jì)滿足要求;四端點(diǎn)緩沖要求在任意時(shí)刻寫(xiě)1端口寫(xiě)入一幀數(shù)據(jù),讀1端口在任意時(shí)刻能無(wú)損的讀出寫(xiě)入的圖像,在任意時(shí)刻寫(xiě)2端口寫(xiě)入一幀數(shù)據(jù),讀2端口在任意時(shí)刻能無(wú)損的讀出寫(xiě)入的圖像,圖5.17紅色光標(biāo)線標(biāo)明設(shè)計(jì)滿足要求;根據(jù)本文設(shè)計(jì)要求寫(xiě)入一端乒乓寫(xiě)入一幀圖像,另一端同時(shí)同步讀出相鄰兩幀圖像數(shù)據(jù),則需要做3端口訪問(wèn),四端點(diǎn)緩沖剛好滿足需求。
5.3 處理模塊
處理模塊總共包括三個(gè)處理模塊,乒乓輸入、幀差且乒乓輸出、投影直方圖和目標(biāo)定位模塊。
乒乓操作:包括乒乓輸入和乒乓輸出,在關(guān)鍵問(wèn)題解決方法中已經(jīng)詳細(xì)講述其原理,在這里講述設(shè)計(jì)實(shí)現(xiàn)方法及需要注意的問(wèn)題。
1). 通過(guò)sdram緩沖模塊輸出的完成信號(hào),在狀態(tài)機(jī)的控制下完成乒乓輸入切換和輸出切換。
2). 注意切換標(biāo)志信號(hào)不能使用輸入模塊(攝像頭采集模塊)或輸出模塊(VGA顯示模塊)的完成信號(hào),否則會(huì)造成sdram緩沖模塊數(shù)據(jù)未完全緩沖完畢,從而丟失數(shù)據(jù)。
幀差:在本設(shè)計(jì)中,通過(guò)乒乓操作使我采集到的相鄰的兩幀圖像同時(shí)輸出,兩幀圖像相減得到的值,到底是前一幀減去后一幀還是后一幀減去前一幀,理論上來(lái)說(shuō)都可以,如果使用兩幀相減的絕對(duì)值來(lái)輸出,不管是誰(shuí)減誰(shuí)都無(wú)所謂了。
投影直方圖和目標(biāo)定位:二值投影分為水平方向的投影和垂直方向的投影,水平方向投影就是把x軸方向各個(gè)地址所對(duì)的數(shù)據(jù)加在一塊,然后存儲(chǔ)到內(nèi)存里面,垂直方向投影就是把y軸方向各個(gè)地址所對(duì)的數(shù)據(jù)加在一塊,然后存儲(chǔ)到內(nèi)存里面。最終存儲(chǔ)起來(lái)就得到二值圖像的投影。使用狀態(tài)機(jī)檢測(cè)輸入數(shù)據(jù)是否為1來(lái)進(jìn)行直方圖計(jì)數(shù)并寫(xiě)入ram中。同關(guān)鍵問(wèn)題解決方法一節(jié)中,通過(guò)硬件描述語(yǔ)言設(shè)計(jì)出來(lái),得到相應(yīng)目標(biāo)坐標(biāo)。
5.4 解碼模塊
攝像頭配置模式為YUV(4:2:2)模式,通過(guò)攝像頭采集到的YUV格式需要轉(zhuǎn)換成RGB格式才能在VGA上輸出。在格式轉(zhuǎn)換中,需要把YUV422轉(zhuǎn)成YUV444,再把YUV444轉(zhuǎn)成RGB888,最后把RGB888轉(zhuǎn)成RGB565,其中YUV444轉(zhuǎn)成RGB888采用查找表的方式。下面詳細(xì)說(shuō)明一下轉(zhuǎn)換方法。
5.4.1. YUV422轉(zhuǎn)成YUV444,標(biāo)準(zhǔn)的視頻的YCbCr信號(hào),以Cb0 Y0 Cr0 Y1 Cb1 Y2 Cr1 Y3...,通過(guò)合并8bit到16bit(為了存儲(chǔ),16bit)后,數(shù)據(jù)變成了{(lán)Cb0 Y0}{Cr0 Y1}{Cb1 Y2}{Cr1 Y3}...,為了保持?jǐn)?shù)據(jù)的同步,同時(shí)又不能丟失任何一個(gè)byte,重新組合出一幅完整的YCbCr圖像,我們將所謂的YUV422轉(zhuǎn)成YUV444,即每一個(gè)像素都有完整的亮度色差,但是這需要幾級(jí)寄存來(lái)完成。如此,既保證了數(shù)據(jù)的同步,不至于色差錯(cuò)位,同時(shí)又有效的拼接了數(shù)據(jù),有利于保存。以下是捕獲步驟。
1). 捕獲Cb0 Y0
2). 捕獲Cr0 Y1
3). 捕獲Cb1 Y2,輸出Y0Cb0Cr0
4). 捕獲Cr1 Y3,輸出Y1Cb0Cr0
5.4.2. YUV444轉(zhuǎn)成RGB888,關(guān)于這個(gè)轉(zhuǎn)換有特定的公式,如下:
R=1.164(Y-16)+1.596(Cr-128)
G=1.164(Y-16)- 0.813(Cr-128)- 0.391(Cb-128)
B=1.164(Y-16)+2.018(Cb-128)
如果使用c語(yǔ)言方式設(shè)計(jì),它支持浮點(diǎn)運(yùn)算,非常易于實(shí)現(xiàn)。但是FPGA中僅僅只有邏輯低和邏輯高,那就需要另想辦法設(shè)計(jì)了,好在上述的一些小數(shù)我們可以量化之后再通過(guò)一位就可以實(shí)現(xiàn),這樣就不需要涉及到小數(shù)運(yùn)算和乘法運(yùn)算問(wèn)題了。具體設(shè)計(jì)如以下步驟。
1). 首先,分離變量,將公式化簡(jiǎn)
R=1.164Y+1.596Cr-222.912
G=1.164Y- 0.813Cr- 0.391Cb+135.488
B=1.164Y+2.018Cb-276.928
2). 然后進(jìn)行放大,加上移位,去掉浮點(diǎn)
XOUT[19:0]=((Y*10’d596)+ (Cr*10’d817)-18’d114131)>>9
YOUT[19:0]=((Y*10’d596)- (Cb*10’d200)- (Cr*10’d416)-18’d69370)>>9
ZOUT[19:0]=((Y*10’d596)+ (Cb*10’d1033)-18’d141787)>>9
3). 乘法器出現(xiàn)溢出,我需要截?cái)嗾?fù)溢出部分,使得數(shù)據(jù)保持在0~255范圍內(nèi)。如下:
R=XOUT[10] ? 8’h0:(XOUT[8:0] > 9’d255) ? 8’hff:XOUT[7:0];
G=YOUT[10] ? 8’h0:(YOUT[8:0] > 9’d255) ? 8’hff:YOUT[7:0];
B=ZOUT[10] ? 8’h0:(ZOUT[8:0] > 9’d255) ? 8’hff:ZOUT[7:0];
4). 最后由于硬件原因,需要將RGB888轉(zhuǎn)換成成RGB565,這一步僅僅只需要做截?cái)嗖僮骷纯伞?/p>
5.5 顯示模塊
顯示模塊分為兩大部分,第一部分為字符打印模塊,在已有圖像的基礎(chǔ)上打印出要寫(xiě)的字符或圖標(biāo);第二部分為VGA驅(qū)動(dòng)模塊,驅(qū)動(dòng)硬件設(shè)備。下面具體設(shè)計(jì)如下。
字符打印模塊:在VGA顯示圖像的基礎(chǔ)上,在畫(huà)面上打印出一串字符,并且可以控制其位置、內(nèi)容任意改變。設(shè)計(jì)結(jié)構(gòu)如圖5.18所示。其原理是根據(jù)輸入圖像的地址矩陣構(gòu)成字符或者圖標(biāo),在對(duì)應(yīng)的地址上將原始像素?cái)?shù)據(jù)替換成特定的值,這個(gè)就可以在不影響原始圖像的基礎(chǔ)上打印出想要的字符或者圖標(biāo)。
圖5.18 字符模塊設(shè)計(jì)圖
VGA驅(qū)動(dòng)模塊:標(biāo)準(zhǔn)的VGA接口有15個(gè)接口,但是真正用到的只有5個(gè)接口,分別是三個(gè)色彩信號(hào),R,G,B,場(chǎng)同步信號(hào)VSYNC,行同步信號(hào)HSYNC,時(shí)序部分要通過(guò)控制行同步信號(hào)和場(chǎng)同步信號(hào),色彩部分要控制RGB,先來(lái)看時(shí)序部分。對(duì)于一個(gè)分辨率為800*600的顯示器,簡(jiǎn)單的說(shuō)像素的刷新是從左到右,從上到下一行一行的刷新的,每一行要刷新的點(diǎn)成為行同步信號(hào)的幀長(zhǎng),有多少行稱(chēng)為場(chǎng)同步信號(hào)的幀長(zhǎng),從上到下刷新完一遍稱(chēng)為一幀,我們電腦上說(shuō)的屏幕刷新頻率就是說(shuō)屏幕一秒鐘能夠刷新多少幀,當(dāng)達(dá)到一定的幀數(shù),我們的肉眼也就分辨不出來(lái)了,這樣我們就看到我們的電腦屏幕,我們?cè)诓僮鞯臅r(shí)候是連續(xù)的了。
5.5.1. 水平時(shí)序
水平同步信號(hào)HSYNC如圖5.19所示,HSYNC使用一個(gè)負(fù)同步脈沖表示一行像素的開(kāi)始時(shí)刻,到下一個(gè)負(fù)脈沖出現(xiàn)為一行像素的結(jié)束時(shí)刻。實(shí)際的一行有效圖像數(shù)據(jù)是在25.422us的時(shí)間窗口內(nèi)發(fā)送的,而水平同步信號(hào)之間的間隔是31.77us。沒(méi)有圖像數(shù)據(jù)發(fā)送的這段時(shí)間定義為消隱區(qū),此時(shí)的圖像為黑色。如果有25.422us的時(shí)間段來(lái)輸出一行有效圖像數(shù)據(jù),做一些計(jì)算如下,640*480的VGA顯示模式下,待填充的640個(gè)像素需要在25.422us內(nèi)發(fā)送給顯示器。即每個(gè)像素的時(shí)間為 25.422us/640 = 39.71875ns。可以算得最小時(shí)間單位是 25.175MHZ,這個(gè)即驅(qū)動(dòng)VGA時(shí)FPGA所需要的時(shí)鐘頻率。
5.5.2. 垂直時(shí)序
垂直同步信號(hào)VSYNC如圖20所示,VSYNC與水平同步信號(hào)相似,只不過(guò)其同步負(fù)脈沖表示整個(gè)一幀圖像的開(kāi)始和結(jié)束。一幀圖像的有效圖像數(shù)據(jù)是在15.25ms的時(shí)間窗口內(nèi)發(fā)送的,而同步信號(hào)之間的間隔是16.68ms。同理,如果有15.25ms的時(shí)間段來(lái)輸出一幀有效圖像數(shù)據(jù),做計(jì)算如下,640*480的VGA顯示模式下15.25ms/480 = 0.031ms??梢运愕猛瓿商畛湟恍?40個(gè)有效像素?cái)?shù)據(jù)的時(shí)間為0.031ms,即每一行的頻率為31.46875Khz,顯示像素?cái)?shù)據(jù)或電子束退回到行首開(kāi)始新的水平掃描時(shí),RGB信號(hào)需要置為黑色,即全為零。
圖5.19 VGA行數(shù)據(jù)時(shí)序
注:a (行消隱) , b(行消隱后沿),c(行顯示),d(行消隱前沿),E(行時(shí)序總長(zhǎng)度)
圖5.20 VGA場(chǎng)數(shù)據(jù)時(shí)序
注:a (場(chǎng)消隱) , b(場(chǎng)消隱后沿),c(場(chǎng)顯示),d(場(chǎng)消隱前沿),E(場(chǎng)時(shí)序總長(zhǎng)度)
圖5.21 VGA行數(shù)據(jù)仿真圖
圖5.22 VGA場(chǎng)數(shù)據(jù)仿真圖
不同的分辨率下,行同步和場(chǎng)同步信號(hào)的周期是不同的,時(shí)序上的時(shí)間也不一樣。附錄2列出了VGA的常用分辨率參數(shù)。
結(jié)論:圖5.21設(shè)計(jì)為行時(shí)序滿足VGA設(shè)計(jì)行時(shí)序,圖5.22設(shè)計(jì)為場(chǎng)時(shí)序滿足VGA設(shè)計(jì)場(chǎng)時(shí)序。
本篇到此結(jié)束,下一篇帶來(lái)基于FPGA的單目?jī)?nèi)窺鏡定位系統(tǒng)設(shè)計(jì)(下),會(huì)介紹系統(tǒng)調(diào)試與測(cè)試以及結(jié)論,包括系統(tǒng)資源性能調(diào)試與分析、系統(tǒng)功能測(cè)試等相關(guān)內(nèi)容,還會(huì)有VGA的常用分辨率參數(shù)表、整體電路圖、主要程序分享等附錄。