題目
實現攝像頭OV7670的配置及完成圖像的采集。請讀者考慮實現該功能需要哪些模塊?進行模塊劃分并給出端口定義,不需要寫出代碼。
模塊劃分
根據需配置外設交互架構,模塊劃分如圖6-16所示:
圖6-16 初步模塊劃分
進一步分析配置模塊及接口模塊。
1. 配置模塊
從OV7670的datasheet可知,完成某些必要寄存器的配置,OV7670才能正常工作,而配置不同的寄存器,又能夠實現不同的功能。配置模塊根據配置要求產生讀寫命令、數據與地址給接口模塊。配置表里包含操作碼,所有寄存器的地址以及寄存器的配置值。
下面詳細介紹配置表,以下是OV7670的部分配置表:
2
3 always@(*) begin
4 case(reg_cnt)
5 0 : add_wdata = {2'b11,16'h1204};
6 1 : add_wdata = {2'b11,16'h40d0};
7 2 : add_wdata = {2'b11,16'h3a04};
8 3 : add_wdata = {2'b11,16'h3dc8};
9 4 : add_wdata = {2'b11,16'h1e31};
10 5 : add_wdata = {2'b11,16'h6b00};
11 ……
12 163 : add_wdata = {2'b11,16'h0903};
13 164 : add_wdata = {2'b11,16'h3b42};
14 default : add_wdata = 0;
15 endcase
16 end
17
(1)REG_NUM表示此外設寄存器總數。
(2)配置表存放的格式為:“操作碼”+“地址”+“配置值”,比如:add_wdata = {2'b11,16'h1204},其操作碼是2’b11,地址是8’h12,配置值是8’h04。
(3)操作碼為2比特,00表示空操作;01表示只讀;10表示只寫;11表示先寫后讀。
(4)配置模塊讀取配置表,根據操作碼來發送命令給接口模塊。如果操作碼為00,則跳過此命令;如果操作碼為01,則產生一個讀命令給接口模塊,讀地址是配置表給出的地址;如果操作碼為10,則產生一個寫命令給接口模塊,寫地址和寫數據由配置表給出;如果操作碼為11,則先給寫命令,寫地址和寫數據由配置表給出,執行完后,再給讀命令,讀地址與本次操作的寫地址相同。
采用需配置外設交互架構,在配置具有多功能的外設的寄存器時,能夠很方便地進行調試,僅需通過修改配置表就可以實現,所以明德揚強烈推薦此類外設使用該構架。調試過程一般是確認讀操作,看能否讀1個寄存器數據,從而確保讀操作沒問題;然后寫1個寄存器再讀出來,確認讀出來的數據是不是寫進去的數據,從而確保讀寫操作沒問題;之后連續依次讀寫一組寄存器,確保每次讀寫都正確;最后把讀功能取消,只保留寫功能,作為最后的代碼。
2. 接口模塊
接口模塊需要完成兩個功能:一是完成OV7670的配置,即根據配置模塊的讀寫命令及數據產生SCCB操作時序(查閱OV7670的datasheet,OV7670的配置接口是SCCB);二是完成OV7670的圖像采集。所以模塊劃分原則一,一個功能一個模塊,接口模塊可以劃分為SCCB接口模塊與采集模塊。
綜上,模塊劃分結果如圖6-18。
圖6-18 模塊劃分框圖
模塊的端口及模塊之間數據流向
模塊劃分好后,需要進一步確認模塊的端口及模塊之間的數據流向。可參考5.1.2 模塊劃分端口規范。模塊劃分最終結果如圖6-19所示:
圖6-19 模塊劃分最終框圖
技術交流QQ群:544453837
更多FPGA技術資訊:明德揚科教
了解>>至簡設計法