本站點博客將逐步遷移至http://ninghechuanblogs.cn/html
本篇要分享的是基於Xilinx FPGA的視頻圖像採集系統,使用攝像頭採集圖像數據,並無用到SDRAM/DDR。這個工程使用的是OV7670 30w像素攝像頭,用雙口RAM作存儲,顯示窗口爲320x240,並且都知道7670的顯示效果也不怎麼樣,這是一次偶然的機會我獲得的資源,便在basys三、zybo、國產FPGA PGT180H上移植成功,整體的顯示效果也是可能達到7670應有的標準,7670能夠說是最基礎的攝像頭,基礎到你都不想學驅動它,由於畫質不好,還有一款基礎的攝像頭是OV7725,也是30w像素和7670比起來,差異咋就這麼大呢(看價格就明白了)。固然這只是一個基礎,博主往後也會着手去深刻學習基於FPGA的攝像頭的驅動。微信
這是本系統簡單的結構框圖,主要有攝像頭配置模塊、圖像數據採集模塊、像素數據存儲模塊、VGA顯示驅動模塊組成。 學習
攝像頭模塊須要用SCCB協議進行配置,SCCB即咱們常說的I2C總線。設計
該部分由兩個模塊構成,I2C總線模塊,攝像頭寄存器存儲模塊,經過I2C總線,也就是下文的SCCB總線,將攝像頭寄存器存儲模塊中的數據發送到OV7670內,完成攝像頭的得配置。視頻
SCCB總線在寫寄存器時,先寫設備地址(0x42),收到從設備應答後再寫寄存器地址,最後寫將要寫入的寄存器的值。 htm
SCCB總線的讀取寄存器時序:SCCB總線在讀寄存器時,分兩個階段:第一階段爲先寫設備地址(0x42),而後再寫寄存器地址;第二階段爲寫設備地址(0x43),而後讀出寄存器地址的值,從而完成對一個寄存器值的讀取,blog
I2C協議有兩條總線,時鐘總線sclk和數據總線sdat,咱們在時鐘總線爲高電平的中心時採集數據,在時鐘總線爲低電平的中心改變數據,每發送8位數據會有一個應答。資源
I2C協議寫操做,先給一個寫命令,而後接着兩組8位的數據,這個工程裏OV7670一共有165個寄存器須要配置,當第165個寄存器配置完成後config_finished信號拉高,表示寄存器配置完成。開發
從模塊引腳上咱們能夠看到,7670是8位的像素數據輸出,場信號(默認低有效),和行信號有效的同時,開始捕獲數據,寄存第一個數據, 拼接到第二個數據, 實現一個完整像素的輸出。get
像素數據存儲採用的是雙口RAM,將RAM數據位寬設置爲16,由於我才用的zybo開發板是16位的,深度設置爲320x240 = 76800。這是RAM IP Core的頂層實例化。
最後是VGA顯示模塊,將儲存的數據讀出,顯示在VGA顯示器上,這樣這個視頻採集系統就完成了。這裏值得一提的是在使用zybo開發板進行攝像頭配置的時候出現了以下問題,最後經上網查閱資料最後得以解決,出現這個問題的緣由是,遇到上面的問題是由於咱們將外部輸入的一個時鐘管腳 OV7670_PCLK(攝像頭輸出給FPGA的像素時鐘)分配到了一個普通的IO口上面,若是是用一個專用的時鐘管腳,好比說ZedBoard有專有時鐘管腳 Y9就不會出現這樣的錯誤了。
由於是IO管腳上,因此其周圍沒有全局時鐘 BUFG,因此咱們在 XDC 裏使用:set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets {OV7670_PCLK_IBUF}] 來屏蔽 Xilinx 的檢測,從而經過編譯。這個方式在軟件提示的錯誤中也提供瞭解決方法,
我這裏使用的迪芝倫官方出品的zybo開發板,確定有朋友好奇個人攝像頭是怎麼插上去的——杜邦線啊,引腳約束文件但是我精心設計的,因此只須要18根連排杜邦線便可,使用杜邦線的顯示效果基本不會受影響,若是你的顯示效果不好,可不能怪杜邦線確定是你時序的問題。
這是最終的顯示效果圖,原始圖像是沒有白框的,可是這個工程會讓最開始幾列像素數據顯示不出來,因此我本身加上白邊,遮蓋掉每行圖像的前幾個像素點,其餘的數據照常顯示。
這裏只是大概介紹下視頻圖像採集系統的設計思路,沒有詳細介紹每個部分,後面博主計劃嘗試使用FPGA驅動OV7725 sensor,到時會詳細記錄開發過程,但願你們可以相互關注而且共同窗習。哪裏很差歡迎提出,歡迎指點。
若是你想得到該設計的工程源碼請關注個人微信訂閱號:開源FPGA,後臺回覆「開源FPGA」便可得到該工程源碼,歡迎加入開源FPGA-交流羣-I進行討論,羣號碼:677163633。
轉載請註明出處:NingHeChuan(寧河川)
我的微信訂閱號:開源FPGA
若是你想及時收到我的撰寫的博文推送,能夠掃描左邊二維碼(或者長按識別二維碼)關注我的微信訂閱號
知乎ID:NingHeChuan
微博ID:NingHeChuan