本文為明德揚原創文章,轉載請注明出處!
很多朋友在工程模塊劃分的時候總會遇到很多問題,比如不知道如何下手、模塊劃分不合理等;當然我最初也和大家一樣不知道如何下手,學習了明德揚的課程后,再加上和老師的多多交流,我也總結出了一套方法思路,今天就通過明德揚邊緣檢測工程來與大家分享一下模塊的劃分思路。
明德揚邊緣檢測工程是明德揚的網絡班、就業班的其中一個項目,實現了圖像的實時采集、邊緣檢測算法、存儲控制以及與串口等功能,涉及到了比較全面的知識與算法。一起來看看如何劃分模塊。
一、模塊劃分要點總結
1、列出項目的功能要求(客戶提出的產品功能要求)
2、畫出硬件的系統結構框圖(添加外設)
3、框圖中每個外圍接口都對應有一個接口轉換模塊
接口轉換模塊的作用是將外圍器件的接口時序轉為通用的接口時序,或者將通用接口時序轉換為外圍器件接口時序,這樣使得FPGA內部其他模塊不用再關心外圍接口的時序了。
MDY規范通用接口時序:
l data以及對應的vld,傳輸單個數據格式
l MDY的包文格式,din,vld,SOP,EOP,MTY,ERR
l wren,waddr,wdata;rden,raddr,rdata,rdata_vld
4、考慮是否涉及指令系統(操作碼+數據格式)
上位機,例如PC,ARM,DSP或者其他的器件,只涉及到一個接口,但是卻有很多指令或者命令功能要發送,因此就需要一個指令系統。
指令系統一定會涉及到命令、地址和數據。這種情況,肯定會有一個“寄存器解析模塊”,根據命令、地址和數據,改變相應的寄存器的值。
5、考慮外圍器件是否涉及寄存器配置
項目中有某些外設,上電工作前需要進行配置才能按要求工作。因此需要對外設內部寄存器進行讀寫,這一流程是通過FPGA來進行配置。
遇到這個情況,使用MDY推薦的模塊寄存器配置結構:
寄存器配置表模塊+寄存器讀寫配置模塊+外設配置接口時序轉換模塊
6、根據實際情況,增加、補充或者拆分,優化對應模塊,隨時調整
原則:根據接口信號,看模塊間是否方便對接。接口就決定了模塊功能。所以在這一層的調整,一定要清楚接口的定義。
7、考慮是否涉及多路進一路出,要用FIFO
調度FIFO要考慮自身帶寬能否滿足多路一起突發發送時的數據量情況。如果帶寬不滿足,就要要輸出給上游模塊RDY信號。此時RDY信號有效取決于自己設置FIFO的Almost Full信號。如果帶寬滿足則不必設RDY信號。
8、考慮是否涉及到速率匹配問題,要加上RDY信號或者FIFO
首先考慮與外圍器件通信的接口上是否需要rdy信號(FPGA內部運行頻率往往與設接口速率不一致),然后考慮FPGA內部模塊間數據帶寬是否不一致,有等一等的情況。
二、邊緣檢測工程案例分析
根據前面總結的要點,通過實際項目案例來分析一下FPGA內部功能模塊是怎樣劃分的。這里我們選取已經做過的圖像邊緣檢測項目,接下來按照上面總結的模塊劃分步驟,一步步完成模塊初步劃分!
1.列出項目的功能要求
本項目功能要求:系統上電,OV7670攝像頭將實時采集圖像數據傳送給FPGA,經過FPGA算法處理獲得邊緣圖像,最終輸出邊緣圖像到顯示器上。
功能分析:
a) 選用攝像頭OV7670作為圖像采集
b) 攝像頭內部寄存器需要上電配置,因此外設需要配置按鍵
c) FPGA內部做邊緣檢測算法處理
d) 輸出給顯示器顯示(用VGA接口)
2.畫出硬件系統結構框圖
根據步驟1總結出的功能要求,找到除FPGA外需要哪些外圍器件。
外圍器件總共需要三個:
a) 按鍵
b) 攝像頭OV7670
c) 顯示器
畫出系統框圖如下所示:
3.框圖中每個外圍接口都對應有一個接口轉換模塊
a) 按鍵對應的接口轉換模塊是按鍵消抖檢測模塊;
b) OV7670攝像頭對應的接口轉換模塊是OV7670圖像采集模塊;
c) 顯示器與FPGA連接是VGA接口,因此其對應的接口轉換模塊是VGA顯示驅動模塊。
完善后框圖如下所示:
4.考慮是否涉及指令系統
本項目不涉及指令系統,因此這里可以跳過。
5.考慮外圍器件是否涉及寄存器配置
本項目中OV7670攝像頭部分涉及寄存器配置。使用MDY推薦模板:寄存器配置表模塊+寄存器讀寫配置模塊+外設配置接口時序轉換模塊;
由于外設OV7670配置接口使用的是SCCB協議,所以外設配置接口時序轉換模塊對外接口也應該是SCCB,對內是MDY規范接口。
補充后框圖如下所示:
6.根據實際情況,增加、補充或者拆分獨立對應模塊,隨時調整
到第6步,根據數據流向,需要對模塊間的接口進行詳細分析了,補充模塊或者將功能相同的模塊合并化簡。
a) OV7670圖像采集模塊輸出的圖像數據是RGB565格式,需要先將RGB565信號轉成灰度圖像,因此需要一個RGB轉灰度模塊;
b) 輸出的圖像灰度數據需要進行高斯濾波處理,因此需要一個高斯濾波模塊;
c) 為了做邊緣檢測,需要將高斯濾波處理后的灰度圖像數據轉換為單bit數據,因此需要一個灰度轉單bit模塊;
d) 轉換后的單bit數據,需要經過sobel算法處理才能得到圖像邊緣,因此需要一個sobel算法處理模塊;
e) 經過sobel算法處理模塊輸出的圖像數據就可以輸出給顯示器了,但是為了圖像連續完整輸出、不斷幀,就需要做一下緩存,因此需要一個圖像緩存模塊。
補充后如下圖所示:
接下來將功能互斥、數據流向相關且接口一致的模塊做合并化簡處理,如下圖所示:
7.考慮是否涉及多路進一路出,要用FIFo
本項目數據流方面沒有涉及多路進一路出的問題,不需要考慮此處的FIFO問題。
8.考慮是否涉及到速率匹配問題,要加上RDY信號或者FIFO
首先考慮與外圍器件通信的接口上是否需要rdy信號
OV7670配置接口采用的SCCB協議,運行頻率是100K,遠小于FPGA內部系統運行頻率25M,所以外設配置接口時序轉換模塊與配置模塊間需要設rdy信號。
再考慮FPGA內部模塊間運行速率不匹配的情況
sobel算法處理模塊輸出的圖像數據發送給圖像緩存模塊,圖像緩存模塊要緩存一幅完整圖像需要等待,需要設一個FIFO。
為了完成乒乓操作,需要設立兩個FIFO才能實現寫FIFO A一幅完整圖像數據,同時VGA顯示驅動模塊可以讀緩存好的FIFO B內完整圖像數據。
因此圖像緩存模塊需要設兩個FIFO(實際項目中用片內RAM代替了FIFO,本質相同)。
最終得到的模塊圖如下所示:
到此,根據模塊劃分步驟一步步做下來,圖像邊緣檢測工程的模塊劃分雛形初步已經完成。具體實踐中需要根據FPGA內部信號的調整,隨時拆分或獨立來增減功能模塊。
以上就是我們做模塊劃分的基本思路,大家有什么問題可以加Q群544453837進行交流,更多FPGA相關資料可以登錄明德揚論壇進行學習瀏覽:http://www.fpgabbs.cn/。