【正点原子FPGA连载】第四十三章MT9V034摄像头RGB-LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
1)實(shí)驗(yàn)平臺(tái):正點(diǎn)原子新起點(diǎn)V2開(kāi)發(fā)板
2)平臺(tái)購(gòu)買地址:https://detail.tmall.com/item.htm?id=609758951113
2)全套實(shí)驗(yàn)源碼+手冊(cè)+視頻下載地址:http://www.openedv.com/thread-300792-1-1.html
3)對(duì)正點(diǎn)原子FPGA感興趣的同學(xué)可以加群討論:994244016
4)關(guān)注正點(diǎn)原子公眾號(hào),獲取最新資料更新
第四十三章MT9V034攝像頭RGB-LCD顯示實(shí)驗(yàn)
MT9V034是ON Semiconductor(安森美半導(dǎo)體)公司生產(chǎn)的一顆CMOS圖像傳感器,該傳感器功耗低、可靠性高以及采集速率快,主要應(yīng)用機(jī)器視覺(jué),雙目視覺(jué),寬溫度工業(yè)場(chǎng)合等領(lǐng)域。本章我們將使用FPGA開(kāi)發(fā)板實(shí)現(xiàn)對(duì)MT9V034的數(shù)字圖像采集并通過(guò)LCD實(shí)時(shí)顯示。
本章包括以下幾個(gè)部分:
4242.1簡(jiǎn)介
42.2實(shí)驗(yàn)任務(wù)
42.3硬件設(shè)計(jì)
42.4程序設(shè)計(jì)
42.5下載驗(yàn)證
43.1簡(jiǎn)介
MT9V034是一款1/3英寸單芯片圖像傳感器,其感光陣列最大可達(dá)到752*480,能實(shí)現(xiàn)最快60fps VGA分辨率的圖像采集,具有全局曝光和高動(dòng)態(tài)范圍(HDR)操作。這款CMOS圖像傳感器具有安森美半導(dǎo)體的突破性功能,實(shí)現(xiàn)了CCD圖像質(zhì)量的低噪聲和CMOS成像技術(shù)(基于信噪比和低光靈敏度),同時(shí)保持固有尺寸、成本和CMOS的集成優(yōu)勢(shì)。下表為幾個(gè)攝像頭的功能對(duì)比。
通過(guò)上述的對(duì)比可以看出,相對(duì)于其他2款攝像頭MT9V034的優(yōu)勢(shì)在于HDR模式和全局曝光。HDR模式的原理是根據(jù)不同的曝光時(shí)間的LDR(Low-Dynamic Range)圖像,利用每個(gè)曝光時(shí)間相對(duì)應(yīng)最佳細(xì)節(jié)的LDR圖像來(lái)合成最終HDR圖像,與普通的圖像相比,可以提供更多的動(dòng)態(tài)范圍和圖像細(xì)節(jié)。下圖是線性模式和HDR模式的對(duì)比圖。
圖 43.1.1 HDR模式
圖 43.1.2 線性模式
通過(guò)對(duì)比可以發(fā)現(xiàn),開(kāi)啟了 HDR,會(huì)使拍到的圖像亮度比較高的地方變暗,亮度比較低的地方變亮,總的來(lái)說(shuō)就是使圖像顯示的更均衡。
卷簾曝光的原理是通過(guò)Sensor逐行曝光的方式實(shí)現(xiàn)的。在曝光開(kāi)始的時(shí)候,Sensor逐行掃描逐行進(jìn)行曝光,直至所有像素點(diǎn)都被曝光。與卷簾曝光不同 ,全局曝光整幅場(chǎng)景在同一時(shí)間曝光實(shí)現(xiàn)的,Sensor所有像素點(diǎn)同時(shí)收集光線,同時(shí)曝光。下面為兩種模式的對(duì)比圖。
圖 43.1.3 全局曝光拍攝圖
圖 43.1.4 卷簾曝光拍攝圖
當(dāng)拍攝快速移動(dòng)的物體時(shí),全局曝光拍攝到的物體比較清晰,不會(huì)發(fā)生形變,而卷簾曝光拍攝的圖片會(huì)出現(xiàn)部分曝光(partial exposure)、斜坡圖形(skew)、晃動(dòng)(wobble) 等現(xiàn)象,也就是傳說(shuō)中的果凍了。這是全局曝光其優(yōu)勢(shì)的一面,相對(duì)于卷簾曝光也有其劣勢(shì)的一面。當(dāng)全局曝光的曝光時(shí)間長(zhǎng)(如大于500μs)時(shí),其噪點(diǎn)情況嚴(yán)重,而運(yùn)用卷簾曝光后,圖片會(huì)有更低的噪聲和更快的幀速。
下圖為MT9V034的功能框圖:
圖 43.1.5 MT9V034功能框圖
由上圖可知,除了傳統(tǒng)的并行邏輯輸出,MT9V034還具有串行低壓差分信號(hào)(LVDS)輸出。該傳感器可以在立體聲相機(jī)中操作,并且該傳感器被指定為立體聲主機(jī)時(shí),可以合并來(lái)自本身的立體聲,還可以將從屬傳感器的數(shù)據(jù)合并為一個(gè)串行LVDS流。本次實(shí)驗(yàn)只采用傳統(tǒng)的并行邏輯輸出。
MT9V034通過(guò)兩線串行接口將寄存器寫(xiě)入MT9V034和從中讀取,以此來(lái)配置窗口大小和行場(chǎng)分辨率等寄存器。MT9V034是具有四個(gè)可能ID(0x90、0x98、0xB0和0xB8)由S_CTRL_ADR0和S_CTRL_ADR1輸入引腳確定,本次實(shí)驗(yàn)所用的MT9V034的寫(xiě)器件ID是0x90。下圖是器件ID的相關(guān)內(nèi)容。
圖 43.1.6 器件地址
MT9V034使用的是兩線式接口總線,該接口總線包括SCLK串行時(shí)鐘輸入線和SDATA串行雙向數(shù)據(jù)線,分別相當(dāng)于IIC協(xié)議的SCL信號(hào)線和SDA信號(hào)線。本次實(shí)驗(yàn)所用的兩線式接口總線兼容IIC協(xié)議,是所以不對(duì)相關(guān)協(xié)議詳細(xì)介紹,有關(guān)IIC協(xié)議的詳細(xì)介紹請(qǐng)大家參考“EEPROM讀寫(xiě)實(shí)驗(yàn)”章節(jié)。
兩線式接口總線的寫(xiě)傳輸協(xié)議如下圖所示:
圖 43.1.7寫(xiě)傳輸協(xié)議
上圖中的ADDR是由7位器件地址和1位讀寫(xiě)控制位構(gòu)成(0:寫(xiě) 1:讀),MT9V034的器件地址為7’h5c,所以在寫(xiě)傳輸協(xié)議中,ID Address(W) = 8’hb8(器件地址左移1位,低位補(bǔ)0);R0x09為8位寄存器地址,在MT9V034的數(shù)據(jù)手冊(cè)中有些寄存器是可改寫(xiě)的,有些是只讀的,只有可改寫(xiě)的寄存器才能正確寫(xiě)入;Write Data為16位寫(xiě)數(shù)據(jù),每一個(gè)寄存器地址對(duì)應(yīng)16位的配置數(shù)據(jù)。上圖中的第9位ACK表示從機(jī)應(yīng)答,該位是由從機(jī)(此處指MT9V034)發(fā)出應(yīng)答信號(hào)來(lái)響應(yīng)主機(jī)表示當(dāng)前器件地址、寄存器地址和寫(xiě)數(shù)據(jù)是否傳輸完成,但是從機(jī)有可能不發(fā)出應(yīng)答信號(hào),因此主機(jī)(此處指FPGA)在此必須判斷此處是否有應(yīng)答,有應(yīng)答即說(shuō)明當(dāng)前傳輸完成,無(wú)應(yīng)答表示傳輸未完成。
我們可以發(fā)現(xiàn),MT9V034的兩線式接口總線和IIC寫(xiě)傳輸協(xié)議是極為相似的,只是在兩線式接口總線寫(xiě)傳輸協(xié)議中,一個(gè)寄存器地址寫(xiě)入16位數(shù)據(jù),而IIC寫(xiě)傳輸協(xié)議一個(gè)地址只寫(xiě)入8位數(shù)據(jù)。兩線式接口總線的讀傳輸協(xié)議和IIC有些差異,在IIC讀傳輸協(xié)議中,一個(gè)寄存器地址只讀出8位數(shù)據(jù);而兩線式接口總線傳輸協(xié)議中一個(gè)寄存器地址只讀出16位數(shù)據(jù),下圖為兩線式接口總線的讀傳輸協(xié)議。
圖 43.1.8 SCCB讀傳輸協(xié)議
由上圖可知,兩線式接口總線讀傳輸協(xié)議分為兩個(gè)部分。第一部分是寫(xiě)器件地址和寄存器地址,即先進(jìn)行一次虛寫(xiě)操作,通過(guò)這種虛寫(xiě)操作使地址指針指向虛寫(xiě)操作中寄存器地址的位置,當(dāng)然虛寫(xiě)操作也可以通過(guò)前面介紹的寫(xiě)傳輸協(xié)議來(lái)完成。第二部分是讀器件地址和讀數(shù)據(jù),此時(shí)讀取到的數(shù)據(jù)才是寄存器地址對(duì)應(yīng)的數(shù)據(jù),注意ID Address(R) = 8’hB9(器件地址左移1位,低位補(bǔ)1)。上圖中的NACK位由主機(jī)(這里指FPGA)產(chǎn)生,由于兩線式接口總線不支持連續(xù)讀寫(xiě),因此NACK位必須為高電平。
MT9V034在上電后是存在默認(rèn)寄存器的,即上電后就可以輸出752x480分辨率的圖像,如果大家需要其他的分辨率或模式就必須先對(duì)傳感器進(jìn)行初始化,可通過(guò)配置寄存器使其工作在預(yù)期的工作模式,以得到較好畫(huà)質(zhì)的圖像。因?yàn)閮删€式接口總線的寫(xiě)傳輸協(xié)議和IIC幾乎相同,因此我們可以直接使用IIC的驅(qū)動(dòng)程序來(lái)配置攝像頭。當(dāng)然這么多寄存器也并非都需要配置,很多寄存器可以采用默認(rèn)的值。ON Semiconductor公司提供了MT9V034的軟件使用手冊(cè)(MT9V034,位于開(kāi)發(fā)板所隨附的資料“7_硬件資料/7_MT9V034資料/MT9V034.pdf”),如果某些寄存器不知道如何配置可以參考此手冊(cè),下表是本程序用到的關(guān)鍵寄存器的配置說(shuō)明。
0Xd5 Fine Shutter Width Total 0x0000 細(xì)調(diào)曝光時(shí)間的寬度
MT9V034的寄存器較多,對(duì)于其它寄存器的描述可以參MT9V034的數(shù)據(jù)手冊(cè)。
下圖為MT9V034的一些特性。
圖 43.1.9 MT9V034的特性
從上圖可以看出,MT9V034的輸入時(shí)鐘頻率的范圍是13Mhz~27Mhz;本次實(shí)驗(yàn)攝像頭的輸入時(shí)鐘為24Mhz,是由外部晶振提供的;兩線式接口總線的SCLK的時(shí)鐘頻率最大為400KHz。
圖 43.1.10 PIXCLK和SYSCLK的關(guān)系
結(jié)合圖 43.1.10和圖 43.1.9可知,PIXCLK和SYSCLK是同頻不同相的2個(gè)時(shí)鐘,本次實(shí)驗(yàn)攝像頭的輸入時(shí)鐘為24Mhz,所以攝像頭的輸出時(shí)鐘也為24Mhz。
MT9V034在并行邏輯輸出的模式下僅支持10bit的YUV(亮度參量和色度參量分開(kāi)表示的像素格式),不支持其他格式。由于攝像頭采集的圖像最終要在LCD上顯示,且新起點(diǎn)開(kāi)發(fā)板上的數(shù)據(jù)接口為RGB888格式(詳情請(qǐng)參考“LCD彩條顯示實(shí)驗(yàn)”章節(jié)),因此必須將MT9V034攝像頭輸出的YUV格式的圖像像素?cái)?shù)據(jù)轉(zhuǎn)換為RGB888格式。下圖為攝像頭輸出的行時(shí)序圖。
圖 43.1.11 行時(shí)序圖
LINE_VALID:數(shù)據(jù)有效使能。當(dāng)其為高時(shí),輸出的數(shù)據(jù)為有效數(shù)據(jù)。
PIXCLK:像素時(shí)鐘。由MT9V034產(chǎn)生的對(duì)外輸出的時(shí)鐘信號(hào)。
DOUT:有效數(shù)據(jù)。攝像頭采集得到的像素?cái)?shù)據(jù),本次實(shí)驗(yàn)取其高8位。
圖 43.1.12 場(chǎng)時(shí)序圖
圖 43.1.13 信號(hào)含義
LINE_VALID:數(shù)據(jù)有效使能。當(dāng)其為高時(shí),輸出的數(shù)據(jù)為有效數(shù)據(jù)。
FRAME_VALID:幀(場(chǎng)) 同步信號(hào)。當(dāng)此信號(hào)有效的時(shí)候就表示開(kāi)始顯示新的一幀數(shù)據(jù)。
43.2實(shí)驗(yàn)任務(wù)
本節(jié)實(shí)驗(yàn)任務(wù)是使用新起點(diǎn)開(kāi)發(fā)板及MT9V034攝像頭實(shí)現(xiàn)圖像采集,并通過(guò)TFT-LCD接口驅(qū)動(dòng)RGB LCD液晶屏(支持目前正點(diǎn)原子推出的所有RGB LCD屏),并實(shí)時(shí)顯示出圖像。
43.3硬件設(shè)計(jì)
新起點(diǎn)FPGA開(kāi)發(fā)板上有一個(gè)攝像頭擴(kuò)展接口,該接口可以用來(lái)連接MT9V034/OV5640等攝像頭模塊,攝像頭擴(kuò)展接口原理圖如圖 43.3.1所示:
圖 43.3.1 攝像頭擴(kuò)展接口原理圖
圖 43.3.2 攝像頭接口
ATK-MT9V034是正點(diǎn)原子推出的一款高性能36W像素高清攝像頭模塊。該模塊通過(guò)2*9排針(2.54mm間距)同外部連接,我們將攝像頭的排針直接插在開(kāi)發(fā)板上的攝像頭接口即可,如下圖所示:
圖 43.3.3 MT9V034攝像頭連接開(kāi)發(fā)板圖
前面說(shuō)過(guò),MT9V034在YUV模式中有效數(shù)據(jù)是D[9:0],而我們的攝像頭排針上數(shù)據(jù)引腳的個(gè)數(shù)是8位,而攝像頭排針上的8位數(shù)據(jù)連接的就是MT9V034傳感器的D[9:2],所以我們直接使用攝像頭排針上的8位數(shù)據(jù)引腳即可。
需要注意的是,由圖 43.3.1可知,攝像頭擴(kuò)展口的第18個(gè)引腳定義為CMOS_PWDN,而我們的MT9V034攝像頭模塊的STB(CMOS_PWDN)引腳固定為低電平,也就是一直處于正常工作模式。MT9V034攝像頭接口的第18個(gè)引腳定義為EXP,這個(gè)引腳是攝像頭外部觸發(fā)脈沖的引腳,只在快照模式下啟用它。MT9V034攝像頭模塊內(nèi)部自帶24M晶振的,所以不需要FPGA輸出時(shí)鐘給攝像頭。
由于LCD接口和SDRAM引腳數(shù)目較多且在前面相應(yīng)的章節(jié)中已經(jīng)給出它們的管腳列表,這里只列出攝像頭相關(guān)管腳分配,如下表所示:
表 43.3.1 MT9V034攝像頭管腳分配
攝像頭TCL約束文件如下:
set_location_assignment PIN_T14 -to cmos_data[7]
set_location_assignment PIN_R14 -to cmos_data[6]
set_location_assignment PIN_N6 -to cmos_data[5]
set_location_assignment PIN_P6 -to cmos_data[4]
set_location_assignment PIN_M8 -to cmos_data[3]
set_location_assignment PIN_N8 -to cmos_data[2]
set_location_assignment PIN_P8 -to cmos_data[1]
set_location_assignment PIN_K9 -to cmos_data[0]
set_location_assignment PIN_M9 -to cmos_href
set_location_assignment PIN_R13 -to cmos_pclk
set_location_assignment PIN_R12 -to cmos_pwdn
set_location_assignment PIN_L9 -to cmos_reset
set_location_assignment PIN_N9 -to cmos_scl
set_location_assignment PIN_L10 -to cmos_sda
set_location_assignment PIN_P9 -to cmos_vsync
43.4程序設(shè)計(jì)
圖 43.4.1是根據(jù)本章實(shí)驗(yàn)任務(wù)畫(huà)出的系統(tǒng)框圖。
圖 43.4.1 頂層系統(tǒng)框圖
由上圖可知,時(shí)鐘模塊(pll_clk)為L(zhǎng)CD頂層模塊、SDRAM控制模塊以及I2C驅(qū)動(dòng)模塊提供驅(qū)動(dòng)時(shí)鐘。I2C配置模塊和I2C驅(qū)動(dòng)模塊控制著傳感器初始化的開(kāi)始與結(jié)束,傳感器初始化完成后圖像采集模塊將采集到的數(shù)據(jù)寫(xiě)入SDRAM控制模塊,LCD頂層模塊從SDRAM控制模塊中讀出數(shù)據(jù),完成了數(shù)據(jù)的采集、緩存與顯示。需要注意的是圖像數(shù)據(jù)采集模塊是在SDRAM和傳感器都初始化完成之后才開(kāi)始輸出數(shù)據(jù)的,避免了在SDRAM初始化過(guò)程中向里面寫(xiě)入數(shù)據(jù)。
MT9V034雖然在上電后不配置寄存器也能正常工作,但是此時(shí)輸出的分辨率可能不是實(shí)驗(yàn)需要的分辨率,所以必須通過(guò)配置寄存器的值來(lái)達(dá)到實(shí)驗(yàn)所需要的分辨率。配置寄存器的協(xié)議和I2C協(xié)議在寫(xiě)操作時(shí)幾乎一樣,所以需要一個(gè)I2C驅(qū)動(dòng)模塊。為了使MT9V034在期望的模式下運(yùn)行并且提高圖像顯示效果,需要配置較多的寄存器,這么多寄存器的地址與參數(shù)需要單獨(dú)放在一個(gè)模塊,因此還需要一個(gè)寄存配置信息的I2C配置模塊。在攝像頭配置完成后,開(kāi)始輸出圖像數(shù)據(jù),因此需要一個(gè)攝像頭圖像采集模塊來(lái)采集圖像;采集到的圖像先進(jìn)入SDRAM存儲(chǔ)器進(jìn)行緩存,最后LCD頂層模塊讀取SDRAM緩存的數(shù)據(jù)以達(dá)到最終實(shí)時(shí)顯示的效果。
對(duì)比“OV7725攝像頭TFT-LCD顯示實(shí)驗(yàn)”的系統(tǒng)框圖可以發(fā)現(xiàn),本次實(shí)驗(yàn)只是把外設(shè)OV7725模塊替換成了MT9V034模塊,替換了圖像采集模塊和IIC配置模塊,修改了IIC驅(qū)動(dòng)模塊和SDRAM讀寫(xiě)模塊,其余模塊基本相同。替換圖像采集模塊和修改圖像采集頂層模塊的原因在于OV7725攝像頭輸出的是RGB565格式的16bit數(shù)據(jù),而MT9V034輸出的是YUV格式的8bit數(shù)據(jù);替換IIC配置模塊和修改IIC驅(qū)動(dòng)模塊的原因在于OV7725的一個(gè)寄存器地址只寫(xiě)8bit數(shù)據(jù),而MT9V034的一個(gè)寄存器地址可以寫(xiě)16bit數(shù)據(jù);本次實(shí)驗(yàn)所采用的攝像頭 MT9V034的幀率為62幀,而LCD的屏幕的幀率有的比攝像頭低,有的比攝線頭高,而之前所采用的攝像頭OV5640和OV7725的幀率都比LCD屏的幀率低,因此兩幀的乒乓操作足以滿足之前的設(shè)計(jì)需求,但相對(duì)于本次實(shí)驗(yàn)來(lái)說(shuō)兩幀的乒乓操作已經(jīng)不能滿足設(shè)計(jì)需求,所以需要修改SDRAM讀寫(xiě)模塊。SDRAM讀寫(xiě)模塊修改后的幀切換原理如下所示:
圖 43.4.2 寫(xiě)比讀快的示意圖
圖 43.4.3 讀比寫(xiě)快的示意圖
在圖 43.4.2中的圖2是寫(xiě)操作完成了一幀的存儲(chǔ),換了一個(gè)存儲(chǔ)空間繼續(xù)寫(xiě),而讀操作還沒(méi)有讀完一幀數(shù)據(jù),繼續(xù)讀原來(lái)的存儲(chǔ)空間;因?yàn)樽x幀率和寫(xiě)幀率的幀率比沒(méi)有2倍,所以寫(xiě)操作端的第二幀還沒(méi)有寫(xiě)完,讀操作端已經(jīng)讀完了第一幀,換了一個(gè)存儲(chǔ)空間繼續(xù)讀,如圖3所示; 圖4中寫(xiě)操作端完成了第二幀的存儲(chǔ),而讀操作還沒(méi)有讀完第二幀數(shù)據(jù);同理圖5中寫(xiě)操作端完成了第三幀的存儲(chǔ),開(kāi)始第四幀的寫(xiě)入,而讀操作將要讀完第二幀數(shù)據(jù);圖6表示讀操作讀完第二幀數(shù)據(jù),而寫(xiě)操作端沒(méi)有完成第四幀的存儲(chǔ),這里將存儲(chǔ)空間跳轉(zhuǎn)了2個(gè),就是為了防止寫(xiě)操作追上讀操作,出現(xiàn)畫(huà)面撕裂的現(xiàn)象。
在圖 43.4.3中圖2是讀操作讀出了一幀的數(shù)據(jù),而本次實(shí)驗(yàn)是根據(jù)寫(xiě)存儲(chǔ)空間來(lái)判斷讀存儲(chǔ)空間的,所以繼續(xù)讀之前的存儲(chǔ)空間;圖3是寫(xiě)操作端完成了第一幀的存儲(chǔ),而讀操作還沒(méi)有讀完第二幀數(shù)據(jù);圖4是讀操作端讀完第二幀數(shù)據(jù),而寫(xiě)操作還沒(méi)有完成了第二幀的存儲(chǔ)。
頂層模塊的原理圖如下圖所示:
圖 43.4.4 頂層模塊原理圖
FPGA頂層模塊(mt9v034_rgb565_lcd)例化了以下六個(gè)模塊:時(shí)鐘模塊(pll_clk)、I2C驅(qū)動(dòng)模塊(i2c_dri)、I2C配置模塊(i2c_cfg)、圖像采集頂層模塊(cmos_data_top)、SDRAM控制模塊(sdram_top)和LCD頂層模塊(lcd_rgb_top)。
時(shí)鐘模塊(pll_clk):時(shí)鐘模塊通過(guò)調(diào)用PLL IP核實(shí)現(xiàn),共輸出3個(gè)時(shí)鐘,頻率分別為100Mhz(SDRAM參考時(shí)鐘)、100Mhz偏移負(fù)75度時(shí)鐘(用于SDRAM輸出采樣的偏移時(shí)鐘)和50Mhz時(shí)鐘,50Mhz時(shí)鐘作為I2C驅(qū)動(dòng)模塊和LCD頂層模塊的驅(qū)動(dòng)時(shí)鐘。
I2C驅(qū)動(dòng)模塊(i2c_dri):I2C驅(qū)動(dòng)模塊負(fù)責(zé)驅(qū)動(dòng)MT9V034的兩線式接口總線,用戶可根據(jù)該模塊提供的用戶接口可以很方便的對(duì)MT9V034的寄存器進(jìn)行配置,該模塊和“EEPROM讀寫(xiě)實(shí)驗(yàn)”章節(jié)中用到的I2C驅(qū)動(dòng)模塊為同一個(gè)模塊,有關(guān)該模塊的詳細(xì)介紹請(qǐng)大家參考“EEPROM讀寫(xiě)實(shí)驗(yàn)”章節(jié)。
I2C配置模塊(i2c_cfg):I2C配置模塊的驅(qū)動(dòng)時(shí)鐘是由I2C驅(qū)動(dòng)模塊輸出的時(shí)鐘提供的,這樣方便了I2C驅(qū)動(dòng)模塊和I2C配置模塊之間的數(shù)據(jù)交互。該模塊寄存需要配置的寄存器地址和數(shù)據(jù),同時(shí)該模塊輸出MT9V034的寄存器地址和數(shù)據(jù)以及控制I2C驅(qū)動(dòng)模塊開(kāi)始執(zhí)行的控制信號(hào),直接連接到I2C驅(qū)動(dòng)模塊的用戶接口,從而完成對(duì)MT9V034傳感器的配置。
圖像采集頂層模塊(top_cmos_data):攝像頭采集模塊在像素時(shí)鐘的驅(qū)動(dòng)下將傳感器輸出的場(chǎng)同步信號(hào)、行同步信號(hào)以及8位數(shù)據(jù)轉(zhuǎn)換成SDRAM控制模塊的寫(xiě)使能信號(hào)和16位寫(xiě)數(shù)據(jù)信號(hào),完成對(duì)MT9V034傳感器圖像的采集。如果LCD屏的分辨率小于MT9V034的分辨率,還要對(duì)MT9V034采集的數(shù)據(jù)進(jìn)行裁剪,以匹配LCD屏的分辨率。
SDRAM控制模塊(sdram_top):SDRAM讀寫(xiě)控制器模塊負(fù)責(zé)驅(qū)動(dòng)SDRAM片外存儲(chǔ)器,緩存圖像傳感器輸出的圖像數(shù)據(jù)。該模塊將復(fù)雜的讀寫(xiě)操作封裝成類似FIFO的用戶接口,非常方便用戶的使用。有關(guān)SDRAM控制模塊的詳細(xì)介紹請(qǐng)大家參考“SDRAM讀寫(xiě)實(shí)驗(yàn)”章節(jié)。
LCD頂層模塊(lcd_rgb_top):LCD頂層模塊負(fù)責(zé)驅(qū)動(dòng)LCD屏的驅(qū)動(dòng)信號(hào)的輸出,同時(shí)為其他模塊提供屏體參數(shù)、場(chǎng)同步信號(hào)和數(shù)據(jù)請(qǐng)求信號(hào)。有關(guān)LCD驅(qū)動(dòng)模塊的詳細(xì)介紹請(qǐng)大家參考“OV7725攝像頭RGB-LCD顯示實(shí)驗(yàn)”章節(jié)。
頂層模塊大部分的代碼在介紹“OV7725攝像頭RGB-LCD顯示實(shí)驗(yàn)”章節(jié)時(shí)已經(jīng)介紹過(guò)了,這里不再詳述,但還有部分代碼做了改動(dòng),改動(dòng)的代碼如下:
程序的第42行,修改了器件的地址。
程序的第44行,添加了參數(shù)DATA_CTRL,用以區(qū)分一個(gè)寄存器地址是寫(xiě)16位數(shù)據(jù)還是8位數(shù)據(jù)。
在程序的第139行,信號(hào)cmos_pclk是攝像頭產(chǎn)生的輸入時(shí)鐘,即攝像頭數(shù)據(jù)的采樣時(shí)鐘。
在程序的第140行,信號(hào)cmos_xclk是攝像頭的輸入時(shí)鐘,但本次實(shí)驗(yàn)的攝像頭采用的是外接24M時(shí)鐘的晶振,所以不需要cmos_xclk,但這里還是將這個(gè)信號(hào)保留下來(lái)。
I2C配置模塊寄存需要配置的寄存器地址、數(shù)據(jù)以及控制初始化的開(kāi)始與結(jié)束,代碼如下所示:
在程序的第11行,定義了一個(gè)DELAY_MAX參數(shù),用以保證在上電的時(shí)候不會(huì)立即配置寄存器,而是等待一段時(shí)間后再配置。
在程序的第12和13行定義了2個(gè)參數(shù),即本次實(shí)驗(yàn)所需要的攝像頭的分辨率。
在程序的第24至第42行,是用來(lái)對(duì)延時(shí)的計(jì)數(shù)器進(jìn)行計(jì)數(shù)和清零。
在程序的第44行和73行,是對(duì)攝像頭的行場(chǎng)分辨率進(jìn)行配置。在第58行是設(shè)置需要配置寄存器的個(gè)數(shù)。
在程序的第75行和82行,是產(chǎn)生寄存器配置結(jié)束信號(hào)。
I2C驅(qū)動(dòng)模塊做了以下修改:
代碼116行至129行表示當(dāng)狀態(tài)發(fā)生跳轉(zhuǎn)并且data_ctrl為1的時(shí)候,將狀態(tài)跳轉(zhuǎn)到st_data_wr_16,進(jìn)行16位數(shù)據(jù)的讀寫(xiě),否則跳轉(zhuǎn)到其他狀態(tài)。
代碼130行至135行表示當(dāng)st_data_wr_16狀態(tài)完成時(shí),將狀態(tài)跳轉(zhuǎn)到st_data_wr_8,因?yàn)槲覀兊?6位數(shù)據(jù)讀寫(xiě)其實(shí)是分兩部分完成的st_data_wr_16只進(jìn)行了高8位的讀寫(xiě),剩下低8位的數(shù)據(jù)還是在st_data_wr_8狀態(tài)完成的。
代碼337行至382行,表示寫(xiě)入數(shù)據(jù)的高8位。
代碼383行至428行,表示寫(xiě)入數(shù)據(jù)的低8位。
圖像采集頂層模塊的原理圖如下圖所示:
圖 43.4.5 圖像采集頂層模塊原理圖(局部)
圖像采集頂層模塊(top_cmos_data)例化了以下二個(gè)模塊:圖像采集模塊(cmos_capture_raw_gray)、圖像裁剪模塊(cmos_tailor)。有關(guān)圖像采集頂層模塊的詳細(xì)介紹請(qǐng)大家參考“OV7725攝像頭TFT-LCD顯示實(shí)驗(yàn)”章節(jié)。
由上圖可知,圖像采集模塊(cmos_capture_raw_gray)為其他模塊提供攝像頭8bit輸入數(shù)據(jù)和數(shù)據(jù)使能以及攝像頭穩(wěn)定后的行場(chǎng)信號(hào)。圖像裁剪模塊(cmos_tailor)只有在LCD的器件ID為16’h4342時(shí)起作用,即攝像頭的分辨率大于LCD屏的分辨率,起到裁剪圖像數(shù)據(jù),使圖像的有效數(shù)據(jù)達(dá)到匹配LCD屏的尺寸。有關(guān)圖像裁剪模塊的詳細(xì)介紹請(qǐng)大家參考“OV7725攝像頭TFT-LCD顯示實(shí)驗(yàn)”章節(jié)。
圖像采集模塊的代碼如下:
CMOS圖像采集模塊第3行定義了參數(shù)CMOS_FRAME_WAITCNT(寄存器數(shù)據(jù)穩(wěn)定等待的幀個(gè)數(shù)),這里設(shè)置等待幀是為了保證攝像頭輸出穩(wěn)定后才采樣數(shù)據(jù)。這里采集場(chǎng)同步信號(hào)的上升沿來(lái)統(tǒng)計(jì)幀數(shù),計(jì)數(shù)器計(jì)數(shù)超過(guò)10次之后產(chǎn)生數(shù)據(jù)有效的標(biāo)志(frame_sync_flag),開(kāi)始采集圖像。
在程序的第56行實(shí)現(xiàn)了8位數(shù)據(jù)轉(zhuǎn)16位數(shù)據(jù)的功能,這里將8位的灰度數(shù)據(jù)按照高位賦值的方式將數(shù)據(jù)按照RGB565的格式分別賦給各個(gè)顏色分量。需要注意的是攝像頭的圖像數(shù)據(jù)是在像素時(shí)鐘(cam_pclk)下輸出的,因此攝像頭的圖像數(shù)據(jù)必須使用像素鐘來(lái)采集,否則會(huì)造成數(shù)據(jù)采集錯(cuò)誤。
在程序的第97行至104行,是對(duì)2s的時(shí)間進(jìn)行計(jì)數(shù)。
在程序的第107行至123行,是對(duì)攝像頭的幀率進(jìn)行計(jì)數(shù)。在113行至117行,當(dāng)2s的時(shí)間未到且當(dāng)場(chǎng)信號(hào)的下降沿到來(lái)時(shí),對(duì)幀率計(jì)數(shù)器進(jìn)行累加,當(dāng)2s的時(shí)間到來(lái)時(shí),對(duì)幀率計(jì)數(shù)器進(jìn)行清零,把幀率計(jì)數(shù)器除以2的值賦給幀率寄存器。
SDRAM讀寫(xiě)模塊做了以下修改:
SDRAM控制模塊的改動(dòng)是非常小的,主要就是讀寫(xiě)地址乒乓操作稍微改了一下,在上文我們已經(jīng)講解過(guò),因?yàn)閿z像頭輸入速率和LCD顯示屏不匹配(有的輸入大于輸出有的輸入小于輸出)原本的的雙BANK乒乓操作已經(jīng)不再適用,會(huì)有畫(huà)面撕裂的現(xiàn)象。因此本節(jié)實(shí)驗(yàn)使用四個(gè)BANK去進(jìn)行讀寫(xiě)切換,確保讀寫(xiě)不會(huì)發(fā)生沖突。在代碼的第153行定義了寫(xiě)地址BANK的累加,每當(dāng)完成一幀圖片的寫(xiě)入,BANK地址就會(huì)加一,之后在代碼第165行更新寫(xiě)地址。而代碼182行則是讀地址的切換操作,每當(dāng)讀完一幀圖片信息后,讀地址的BANK會(huì)根據(jù)當(dāng)前寫(xiě)地址BANK進(jìn)行切換,始終保持和寫(xiě)B(tài)ANK地址相差2,這樣寫(xiě)就不會(huì)追上讀了,確保圖片不會(huì)出現(xiàn)撕裂現(xiàn)象。
到這里本節(jié)實(shí)驗(yàn)的程序設(shè)計(jì)部分就全部講解完了,如果有不清楚的可以去翻看前面的例程。
43.5下載驗(yàn)證
首先將FPC排線一端與RGB LCD模塊上的J1接口連接,另一端與新起點(diǎn)開(kāi)發(fā)板上的RGB TFTLCD接口連接。連接時(shí),先掀開(kāi)FPC連接器上的黑色翻蓋,將FPC排線藍(lán)色面朝上插入連接器,最后將黑色翻蓋壓下以固定FPC排線,如圖 43.5.1和圖 43.5.2所示。
圖 43.5.1 正點(diǎn)原子RGBLCD模塊FPC連接器
圖 43.5.2 A7開(kāi)發(fā)板連接RGB LCD液晶屏
接下來(lái)分別連接JTAG接口和電源線,并打開(kāi)電源開(kāi)關(guān)。
最后將下載器一端連電腦,另一端與開(kāi)發(fā)板上的JTAG端口連接,連接電源線并打開(kāi)電源開(kāi)關(guān)。
接下來(lái)我們下載程序,驗(yàn)證MT9V034 TFT-LCD實(shí)時(shí)顯示功能。下載完成后觀察RGB LCD模塊顯示的圖案如下圖所示,說(shuō)明MT9V034 TFT-LCD實(shí)時(shí)顯示程序下載驗(yàn)證成功。
圖 43.5.3 RGB TFT-LCD實(shí)時(shí)顯示圖像
總結(jié)
以上是生活随笔為你收集整理的【正点原子FPGA连载】第四十三章MT9V034摄像头RGB-LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 简谱播放器(初学WINDOW库)
- 下一篇: linux安装 gcc 7.2.0,Ce