本文為明德揚原創文章,轉載請注明出處!
很多朋友在工程模塊劃分的時候總會遇到很多問題,比如不知道如何下手、模塊劃分不合理等;我開始也是這樣的,在學習了明德揚的幾項工程以后,按照老師分享的思路,也對模塊劃分有了一定的小經驗,今天通過案例的方式與大家分享。
今天分享的案例是千兆以太網工程。該工程是明德揚的網絡班、就業班的其中一個項目,涉及到MAC協議、ARP協議、IP協議和UDP協議的實現,協議較多,劃分的模塊也較多。
一、模塊劃分要點總結
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.列出項目的功能要求
本項目功能要求:FPGA內部產生要發送的包文數據,通過UDP協議,發送給PC;PC發送UDP格式包文數據,FPGA需要解析UDP協議,提取出用戶數據;ARP協議實現定期發送ARP協議,獲取對方電腦的物理地址。
功能分析:
a) FPGA內部產生發送的包文數據;
b) 要通過UDP協議發送,就需要添加MAC協議頭部,IP協議頭部,UDP協議頭部;
c) FPGA接收到PC發來的UDP報文,要一層層解析協議頭部信息,先解析出MAC頭,然后是IP頭,UDP頭,最后才能獲取用戶數據;
d) FPGA定期發送ARP協議請求報文;
e) FPGA接收到PC發來的ARP協議應答報文,要解析出源MAC地址;并在發送包文數據中,將獲取的MAC地址作為目的MAC地址進行打包發送。
2.畫出硬件系統結構框圖
根據步驟1總結出的功能要求,找到除FPGA外需要哪些外圍器件。分析得出:
FPGA與PC通信是以千兆以太網的形式,需要將FPGA輸出的信號調制成千兆以太網信號,本項目選取了外部PHY芯片RTL8211來實現此通信調制功能。同理PC端發送的數據通過千兆以太網網線傳輸,需要經過PHY解調后輸出給FPGA;
為了設計方便,FPGA發送的報文數據中,完成FCS校驗的計算交給了MAC IP核來完成;同理,接收端接收到PC發來的報文數據也由MAC IP核完成FCS校驗;
前期為了驗證設計,考慮添加按鍵作為觸發MAC IP核初始化的啟動條件。
外圍器件總共需要三個:
a) 按鍵
b) 2PHY(RTL8211)
c) 3PC
畫出系統框圖如下所示:
3.框圖中每個外圍接口都對應有一個接口轉換模塊
a) 按鍵對應的接口轉換模塊是按鍵消抖檢測模塊;
b) PHY對應的接口轉換模塊是MAC IP核模塊。
添加后框圖如下所示:
4.考慮是否涉及指令系統
本項目不涉及指令系統
5.考慮外圍器件是否涉及寄存器配置
本項目中MAC IP核涉及寄存器配置。使用MDY推薦模板:寄存器配置表模塊+寄存器讀寫配置模塊+外設配置接口時序轉換模塊;
由于MAC IP配置接口使用的是Avalon協議(與MDY接口協議不同之處在于waitrequest信號),所以外設配置接口時序轉換模塊對外接口也應該是Avalon,對內則是MDY規范接口。
完善后如下所示:
6.根據實際情況,增加、補充或者拆分獨立對應模塊,隨時調整
到第6步,根據數據流向,需要對模塊間的接口進行詳細分析了,補充模塊或者將功能相同的模塊合并化簡。
從發送側數據流向思考:
a) FPGA內部產生要發送的數據,因此需要一個數據產生模塊;
b) 產生的發送數據需要先添加UDP頭部,所以需要一個添加UDP協議頭部模塊;
c) 然后添加IP頭部,需要一個添加IP協議頭部模塊;
d) 最后添加MAC頭部,就完成了完整的發送UDP協議報文,因此需要一個添加MAC協議頭部模塊;
e) 同時需要定期發送ARP協議請求報文,需要一個ARP請求報文模塊;
f) 由于ARP報文需要定時產生,所以需要一個計時模塊。
從接收側數據流向思考:
FPGA接收到PHY解調出的PC發送來的UDP報文或者ARP應答報文,經過MAC IP核驗證FCS后,解析出正確或者錯誤的UDP、ARP報文:
a) 經過MAC IP核輸出的報文需要進行MAC頭部檢查,正確則輸出UDP、ARP報文,錯誤則做丟包處理。所以需要一個MAC頭部解析模塊;
b) 經過MAC頭部解析模塊處理后輸出的是正確的IP報文,此時需要進行IP頭部檢查,正確則輸出報文,錯誤則做丟包處理。所以需要一個IP頭部解析模塊;
c) 經過MAC頭部解析模塊處理后輸出的是正確的ARP應答報文,此時需要進行ARP報文解析,獲取發送端MAC地址。所以需要一個ARP應答解析模塊;
d) 同1、2兩步原理,輸出UDP報文需要進行UDP頭部檢查,所以需要一個UDP頭部解析模塊。
經過UDP頭部解析模塊解析出來的報文數據即是PC端發來的正確用戶數據,輸出即可。
補充后如下圖所示:
接下來將功能互斥、數據流向相關,接口一致的模塊做合并化簡處理,如下圖所示:
7.考慮是否涉及多路進一路出,要用FIFO
本項目數據流方面涉及多路進一路出的問題。
在進行模塊優化時,注意到產生的用戶數據和定時ARP請求報文不能同時輸出給MAC IP核,需要一個發送調度模塊來完成多路輸入一路輸出的調度,是發送打包模塊送來的UDP報文還是發送ARP請求報文。
8.考慮是否涉及到速率匹配問題,要加上RDY信號或者FIFO
首先考慮與外圍器件通信的接口上是否需要rdy信號。
外圍PHY芯片與FPGA通信是經過MAC IP核來處理,時序MAC IP核已經做好了,所以不需要設rdy信號。
再考慮FPGA內部模塊間運行速率不匹配的情況,根據數據流方向來考慮:
發送側:
a) 發送報文打包模塊需要時間(計算各個協議頭部校驗和,長度等信息),所以需要在數據產生模塊和數據打包模塊間設FIFO并設rdy信號。
b) 數據打包模塊和ARP請求報文發送模塊同時發送給報文調度模塊,發送包文調度模塊不能同時響應,需要FIFO來緩存,考慮到突發情況FIFO會溢出,所以需要與數據打包模塊和ARP請求報文定時發送模塊間設FIFO并設RDY信號。
接收側:
接收側模塊間速率匹配,不需要設FIFO和RDY信號。
最終得到的模塊圖如下所示:
到此,根據模塊劃分步驟一步步做下來,千兆網工程的模塊劃分雛形初步已經完成。具體實踐中需要根據FPGA內部信號的調整,隨時拆分或獨立來增減功能模塊。
以上就是我們做模塊劃分的基本思路,大家有什么問題可以加Q群544453837進行交流,更多FPGA相關資料可以登錄明德揚論壇進行學習討論:http://www.fpgabbs.cn/!