賀婷
摘要:為使FPGA視頻監(jiān)控系統(tǒng)的顯示畫面更流暢,數(shù)據(jù)存儲采用兵乓機制設計。先將視頻數(shù)據(jù)直接存儲于SDRAM中,采用兩個異步FIFO作為緩沖器,輪流接收SDRAM的數(shù)據(jù),在將接收YUV422格式數(shù)據(jù)通過數(shù)據(jù)轉換得到RGB565格式數(shù)據(jù)并驅動顯示。該方案的頂層模塊在modelsim中仿真成功,滿足時序要求。
關鍵詞:乒乓存儲機制;視頻監(jiān)控;FPGA;
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2015)31-0189-02
1 系統(tǒng)總體方案
FPGA視頻監(jiān)控系統(tǒng)結構如圖1所示,主要包括分頻模塊、 攝像頭數(shù)據(jù)采集模塊、數(shù)據(jù)I2C配置模塊、兩個異步FIFO存儲模塊、SDRAM控制模塊、圖像數(shù)據(jù)處理模塊以及VGA控制模塊等,如圖1所示[1-3]。設計采用OV7670攝像頭,輸出速度最高能達到30幀/秒。視頻數(shù)據(jù)輸出后直接存儲于SDRAM中,采用乒乓存儲機制,保證傳輸?shù)膶崟r性與可靠性,采用異步FIFO做為數(shù)據(jù)緩沖器,在SDRAM接收到一幀的數(shù)據(jù),立即將數(shù)據(jù)輸送給其中一個深度是1024寬度為8的異步FIFO模塊,兩個FIFO模塊輪流接收SDRAM的數(shù)據(jù),之后將數(shù)據(jù)處理后通過VGA顯示。
圖1 FPGA視頻監(jiān)控系統(tǒng)結構框圖
2 I2C配置模塊
I2C總線當串行時鐘(SCL)在高電平期間串行數(shù)據(jù)(SDA)由高電平向低電平發(fā)生跳變,表示數(shù)據(jù)傳輸開始。SCL在高電平時SDA發(fā)生由低電平向高電平跳變,表示數(shù)據(jù)傳輸終止,此后SDA和SCL都處于高電平狀態(tài),總線被判定為空閑狀態(tài)。I2C總線在進行數(shù)據(jù)傳輸時每次發(fā)送一個字節(jié),在發(fā)送的字節(jié)后必有ACK應答。主機設備發(fā)送8位數(shù)據(jù)之后,將SDA設置為輸入(高阻狀態(tài)便于從設備應答),同時從機設備接受到8位數(shù)據(jù)后在第9個脈沖時輸出低電平表示應答信號,主設備在第9個脈沖時讀取SDA的狀態(tài)來判斷從機設備是否給出ACK信號,應答信號為低電平時,規(guī)定為有效應答位,表示從機設備已經(jīng)成功接收了主機設備發(fā)送的數(shù)據(jù),應答信號為高電平時,規(guī)定為非應答位,一般表示從機設備沒有成功接收主機設備發(fā)送的數(shù)據(jù)。
2.1 I2C寫數(shù)據(jù)控制
圖2 寫仿真時序圖
圖3 讀仿真時序圖
如圖2所示,i2c_sdat表示SDA,i2c_sclk表示SCL,在i2c_sclk高電平期間,i2c_sdat由高電平向低電平跳變,表示數(shù)據(jù)開始傳輸,i2c_sclk前8個時鐘周期傳輸8位數(shù)據(jù),第8位數(shù)據(jù)時低電平表示寫狀態(tài)。第9個時鐘周期時拉高i2c_sdat表示主機設備傳輸數(shù)據(jù)終止。等待從機設備應答。在下一個時鐘周期再拉低i2c_sdat表示主設備傳輸數(shù)據(jù)開始。一直循環(huán)以上步驟直到數(shù)據(jù)傳輸完成。
2.2 I2C讀數(shù)據(jù)控制
i2c_sdat表示串行數(shù)據(jù)SDA,i2c_sclk表示串行時鐘SCL,由圖3中可以看出,在i2c_sclk高電平期間,i2c_sdat由高電平向低電平跳變,表示數(shù)據(jù)開始傳輸,i2c_sclk前8個時鐘周期傳輸8位數(shù)據(jù),第8位數(shù)據(jù)時低電平表示寫狀態(tài)。第9個時鐘周期時拉高i2c_sdat表示主設備傳輸數(shù)據(jù)終止。在下一個時鐘周期時再次發(fā)送8位數(shù)據(jù),第8位是高電平,表示讀狀態(tài),再等待從設備應答。此時才完成度指定寄存器的操作,在下一個時鐘周期時讀取寄存器的數(shù)據(jù),一致循環(huán)直到數(shù)據(jù)傳輸完成。
3 SDRAM控制模塊
SDRAM的控制器主要實現(xiàn)SDRAM的初始化、自動刷新、讀寫操作以及數(shù)據(jù)乒乓存儲控制[4]-[5]。SDRAM上電進入初始化狀態(tài),先使所有存儲單元充電,充電狀態(tài)完成后 進入自動刷新狀態(tài),之后通過配置SDRAM模式寄存器來操作SDRAM的工作模式。
圖4 SDRAM控制器狀態(tài)圖
SDRAM控制器的狀態(tài)轉移圖如圖4所示,SDRAM要求定時刷新,采用33M的PCI總線時鐘,使用計數(shù)器計數(shù)420產(chǎn)生刷新命令,一次刷新操作需完成兩個刷新操作命令。SDRAM控制器仿真波形如圖5所示,其中clk為系統(tǒng)時鐘,reset_n為復位信號,addr_in是地址信號,rd_reg和wr_reg分別為讀、寫請求信號,sdram_a是數(shù)據(jù)信號。SDRAM采用地址線行列復用技術,對于存儲器單元的訪問基于頁面,而外部地址線總線是獨立的,與SDRAM的地址線并不能直接相連,這樣就需要SDRAM控制器提供一種地址映射,將外部地址的高位映射到SDRAM的行地址,低位地址映射到SDRAM頁面內(nèi)的列地址。SDRAM控制器在空閑狀態(tài)下等待讀寫信號出現(xiàn),出現(xiàn)讀寫信號后進入激活狀態(tài),控制器激活指定的存儲單元進行讀或者寫操作,讀寫操作完成之后進入預充電狀態(tài),充電完成之后進入空閑狀態(tài),等待下一次讀寫操作。所以,從仿真圖可以看出設計滿足時序要求。
圖5 SDRAM控制器仿真波形圖
4 數(shù)據(jù)處理模塊
通過配置OV7670攝像頭寄存器使數(shù)據(jù)輸出為YUV422格式,通過數(shù)據(jù)處理模塊使YUV422轉換成YUV444再轉換成RGB565[6]。
4.1 YUV422轉YUV444
YUV422格式是每采樣兩個Y分量就采樣一個UV分量,相比YUV444每一次采樣缺少一個UV分量。所以轉換過程為首先捕獲Cb0,Y0信號,之后捕獲Cr0,Y1信號,捕獲Cb1,Y2信號,捕獲Cr1,Y3,輸出Y0Cb0Cr0和Y1Cb0Cr0,則將YUV444格式缺少的UV分量補齊,轉換為YUV444格式。
4.2 YUV444轉RGB565
采用分離變量法避免浮點運算,將變量分離。YUV轉RGB公式變量分離后如式1,然后放大512倍,避免浮點運算,再右移9位,縮小512倍,輸出變量XOUT、YOUT、ZOUT,如式2。 最后為避免出現(xiàn)溢出,需截斷正負溢出的部分,使得數(shù)據(jù)保持在0-255以內(nèi),程序如式3所示,最后得到RGB565格式的數(shù)據(jù)。
[R=1.164Y+1.596Cr-222.912G=1.164Y-0.391Cb-0.813Cr+135.488B=1.164Y+2.018Cb-276.928] (1)
[XOUT[19:0]=((Y*10'd817)-18'd114113)>>9YOUT[19:0]=((Y*10'd596)-(Cb*10'd200)-(Cr*10'd416)+18'd69370)>>9ZOUT[19:0]=((Y*10'd596)+(Cb*11'd1033)-18'd141787)>>9] (2)
[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]] (3)
5 結束語
圖6 頂層模塊仿真圖
頂層模塊的仿真圖如圖7所示,通過對時序的分析可知,OV7670模塊能夠采集數(shù)據(jù),I2C模塊能夠讀寫,SCL與SDA能夠滿足規(guī)范的要求,SDRAM存儲模塊己成功完成了初始化、讀寫操作及刷新等功能,并能對圖像數(shù)據(jù)進行有效的存儲,VGA模塊能夠讀取數(shù)據(jù)并顯示,設計滿足所有模塊的時序要求。
參考文獻:
[1] 彭勃. 基于FPGA的視頻拼接系統(tǒng)的設計與實現(xiàn)[D].北京: 北京化工大學, 2013.
[2] 蔡青青, 龔立群, 黃益新. 基于FPGA的視頻監(jiān)控系統(tǒng)[J]. 微型機與應用, 2012(4): 37-39.
[3] 司孝平. 基于SDRAM的FPGA實時圖像采集系統(tǒng)的設計[J]. 西南大學學報:自然科學版, 2011(1): 128-132.
[4] 侯宏錄, 張文芳. 基于FPGA的SDRAM控制器設計方案[J]. 兵工自動化, 2012(2): 57-60.
[5] 陸軍, 高樂, 劉濤,等. 基于FPGA的全景圖像處理系統(tǒng)SDRAM控制器設計與實現(xiàn)[J]. 應用科技, 2012(1): 55-60.
[6] 蒙育. 基于FPGA視頻圖像處理系統(tǒng)設計及算法研究[D].呼和浩特: 內(nèi)蒙古大學, 2010.