FPGA數據處理中常用的一些IP核有網口ETH核、DDR核、CORDIC核、DDS核、加法器、乘法器、濾波器IP、FFT等IP核,這些IP核熟練使用能減少很多工作量和提高代碼的穩定性。這些IP核的配置比較簡單,但是如何正確使確是個很大的問題。最近一直在用網口、DDR、DDS、CORDIC這些IP。一下子很難把這些IP的用法全部寫完,后續會一個一個的去介紹。
1、網口IP的框架結構和配置驗證
我用的是XILINX的Virtex-5系列的芯片,這里就以這個配置為例。這里些的配置方法主要是參考UG340這個官方文檔。
首先要對這個Tri-Mode Ethernet
MAC IP有個全局的直觀把握,這樣對理解IP核的層次核代碼會有一個很好的指導。
從這個圖來看,這是一個網口數據回環例程結構。從外到內可以分為四個層次:
1、外部接口,這里主要是IP核的輸入輸出以及時鐘核復位接口。這里由于是回環傳輸的一個例程框架圖,這個模塊還包含Address Swap Module地址交換模塊。
2、LocalLink wrapper模塊,這部分其實就是把幾個單獨的模塊例化到同一個模塊下組成一個相對完備的功能。這里主要由兩個大的模塊組成,一個是收發的數據緩存FIFO,一個是MAC的數據收發轉化的模塊。
3、Block Level Wrapper 這層就是把第四層的兩個核心模塊進行例化。
4、MAC層,這個是網絡IP的核心模塊,這個主要是實現從PHY芯片接收到的數據IDDR核ODDR的轉換和網絡鏈路層(MAC層)協議的轉換,這部分是整個IP核的核心。
上面這個結構能清晰的對網絡Tri-Mode Ethernet MAC IP進行一個直觀的描述,從上面可以看出數據的流向核各個模塊的作用。具體到IP核的配置其實很簡單。
這里面有三個選項,主要是選擇共享接口和主機類型的選擇,以及選擇一個還是兩個網口。
其中DCR設備控制寄存器,這個主要是通過總線橋對不同MAC進行控制。而在無特殊要求的時候一般選用NONE模式。
這部分主要是配置PHY的接口類型和傳輸速度。這個需要根據硬件情況進行配置。
這部分一般是對輸入輸出的控制和對一些MAC地址進行過濾。
以上就是Tri-Mode Ethernet MAC IP的基本配置。
完成了基本的配置只是實現網絡傳輸的一小部分,要想靈活的運用這個IP還需要對底層代碼進行了解,明白各個模塊的功能。
打開仿真源碼并結合上面的結構框圖可以清晰的看到IP的四層結構框架。
這部分代碼需要仔細的去看看,看明白數據的流向,ODDR和IDDR的轉化。其中最重要的就是接收和發送時鐘的來源以及去向。就不細講里面的代碼了,這部分需要自己看呀,不然講講也沒啥用。
從MODELSIM仿真中可以看到完成了一個UDP包的回環收發。通過上面一系列的操作完成了IP核的配置并且通過仿真驗證了數據能正確傳輸。
1、
基礎的傳輸協議
利用FPGA實現UDP數據傳輸時需要明白UDP一種無連接的傳輸層協議,這個就是說都是單項傳輸的,不想TCP那樣有握手機制在里面。又因為UDP在TCP/IP五層模型中處在第四層(傳輸層),處于IP協議的上一層,因此傳輸時需要知道對方的MAC地址、網絡地址。而上位機也需要知道FPGA板卡的MAC地址、網絡地址。解決這個問題可以有兩種方式:
1、若是點對點的數據傳輸,可以通過在FPGA內部初始化對應計算機的MAC地址、網絡地址、端口號等必要的信息,而計算機也通過修改網絡協議棧中的信息,把對應IP的信息由動態改為靜態即可,也就是PC機IP-MAC綁定。
更改方法為:一、首先,以管理員權限運行命令提示符(CMD)。
二、在命令提示符中運行“netsh
i i show in”查看要進行ARP綁定的網卡的idx編號。
三、在命令提示符中運行“netsh -c “i i” add neighbors idx IP MAC”進行ARP綁定,這里的idx就是上一步查到的網卡的idx編號,IP和MAC就是你要綁定的IP地址和MAC地址。例如:netsh -c “i i” add neighbors 12 192.168.1.1 D0-27-88-C9-7C-A4
四、最后在命令提示符下用“arp -a”命令查看下自己所添加的ARP項是否在列表中并且為靜態就可以了。
“arp -a”命令檢測為靜態
五、解除綁定:netsh -c “i i” delete neighbors IDX (IDX改為相應的數字) 才可刪除MAC地址綁定,然后重啟系統。
2、通過使用ARP來實現動態的獲知對方IP-MAC地址。這種方式比較靈活,實現起來也不難。
要靈活的實現UDP數據傳輸不僅需要實現UDP協議,還需要實現ARP來獲取必要的信息。然而在實際的調試應用過程中不僅需要知道網絡是否還需要知道連接是否正常,這就需要一個簡單的方式來實現,一般用ICMP協議來實現。這種方式就是可以利用上位機Ping下位機IP,通過是否又回復來判斷網絡連接是否正常。
從上面的論述可知要想相對靈活的實現UDP傳輸還需要實現ARP和ICMP這兩個協議。而這些協議是實現需要明白網絡的OSI模型,這個其實不太難理解(其實挺難的,但是實現UDP傳輸需要理解的部分就相對簡單點)。下面的圖就是網絡的層級結構和一些基礎的常用的協議。
由于每一層實際都是一個復雜的層。后面我也會根據個人實際的項目應用展開部分層的深入學習。根據我的理解我簡單的說下每個層的作用。
1、應用層則是拿到了數據想怎么用就怎么用。
2、傳輸層可以區分數據包屬于哪一個應用程序,實現了數據從端到端的傳遞(應用程序到應用程序的傳遞)。
3、網絡層實現了數據在主機之間的傳遞,每臺網絡設備都應該有自己的網絡地址,網絡層規定了主機的網絡地址該如何定義,以及如何在網絡地址和MAC 地址之間進行映射,即ARP 協議。
4、鏈路層主要是規定了數據幀能被網卡接收的條件,常見的方式是利用網卡的MAC地址識別。
5、物理層規定了傳輸需要的物理電平標準、介質特征。
在知道每個層的作用后就需要知道每個層的組成,其實這幾個層是通過層層封裝來組成的,他們的封裝包格式如下圖:
上面說了各個層的功能,下面就逐個來描述下要用到的ARP、ICMP和UDP這三個協議的組成。
ARP協議是地址解析協議,每一個PC都設有一個ARP高速緩存,這個緩存是存儲所在的網段上的各主機和路由器的IP地址到硬件地址的映射表,這個表是動態刷新的,也可以把其中一個地址由動態改為靜態。
這里需要注意的是
1、網絡上其他主機并不響應 ARP 詢問,只有接收端主機接收到這個幀時,才向發送端主機做出這樣的回應。
2、ARP 是解決同一個局域網上的主機或路由器的IP地址和硬件地址的映射問題.若所要找的主機和源主機不在同一個局域網上,那么就要通過ARP找到一個位于本局域網上的某個路由器的硬件地址,然后把分組發送給這個路由器,讓這個路由器把分組轉發給下一個網絡.剩下的工作就由下一個網絡來做。
3、從IP地址到硬件地址的解析是自動進行的,主機的用戶對這種地址解析過程是不知道的,也就是說這個是協議自動完成的,是隨機的不可控的。
4、主機或路由器要和本網絡上另一個已知 IP 地址的主機或路由器進行通信,ARP 協議會自動地將該IP地址解析為鏈路層所需要的硬件地址。
在FPGA中只需要進行ARP響應就行。在接收到ARP請求時需要把對方的MAC地址和IP信息記錄保存下來,在進行回應時應把自己的MAC和IP地址上報。ARP報文格式如下:
主機的ARP請求利用wireshark抓包可以得到一個完整的ARP請求包類型如下圖
FPGA內對ICMP的包類型和實現方式是和ARP一樣的。這里主要是要理解ARP和ICMP的關系以及為什么要在FPGA里實現這兩個協議。
在FPGA內使用ICMP目的有兩個:1、為了確保系統物理鏈路連接通暢。2、為了提高 IP 數據包交付成功的機會。在我們上位機(PC機)和FPGA進行ICMP通信時上位機得到一下兩方面從信息:1、傳輸是否通暢、傳輸延時和包的生存時間。2、可以得到目標IP的MAC地址(這個MAC地址實際是ARP獲得的)。
這里在得到目標MAC地址時是存在ICMP和ARP協同配合得到的。這兩個協議的工作方式由以下步驟實現:
1、PC1在應用層發起個目標IP為192.168.1.2的Ping請求。
2、直接使用網際層的ICMP協議,不經過傳輸層。
3、 網際層接收來處上層的數據后,根據ICMP協議進行封裝,添加PC1的IP為源IP和PC2的IP為目標IP后封裝成數據包。下傳到網絡接口層。
4、網絡接口層接收數據包后,進行封裝,源MAC地址為PC1的MAC地址,目標MAC地址則查詢自己的ARP緩存表獲取。如果PC1的ARP緩存表中沒有目標IP對應的MAC地址,
則PC1發出一個ARP廣播報文。ARP報文中源MAC地址為PC1的MAC地址,源IP地址為PC1的IP,所要請求的是PC2的IP對應的MAC地址。
5、 PC2收到ARP廣播后,進行解封裝,發現所請求的MAC地址是自己的。則PC2將PC1的MAC地址寫入ARP緩存表中。然后向PC1發送一個 ARP應答單播。該單播消息包括目標IP為PC1的IP,目標MAC為PC1的MAC地址,源IP為PC2的IP,源MAC為PC2的MAC。
6、 PC1接收到PC2的ARP應答報文后,將PC2的MAC地址存入ARP緩存中,并將PC2的MAC地址作為目標地址封裝到數據幀中。發給下層進行網絡傳輸。
7、 PC2接收這個幀后,在網絡接口層查看目標MAC地址是否指向自己。是,PC2則將幀頭去掉,向上層傳輸。
8、PC2網際層接收到這個信息包,查看包頭,發現目標IP和自己匹配,則解封裝,將數據向上層傳輸。
9、 傳輸層接收來自下層的Ping請求的UDP報文,則去掉UDP報頭,向應用層傳送。
10、 應用層收到Ping請求后,發送一個Ping回應報文給PC1。
這個過程針對于FPGA來說其實并不復雜,FPGA作為從機只需要回復ARP請求和ICMP請求即可,并且ARP回應是在ICMP回應之前。
在FPGA內部實現UDP協議其實是和ARP和ICMP是一樣的,只是包的長度發生了變化。UDP包的格式如下圖所示:
在進行UDP傳輸時需要注意的是局域網環境下,建議將UDP數據控制在1472字節以下。
簡單的實現ARP、ICMP、UDP并不難。如何在較大的數據傳輸速率下穩定可靠傳輸是一個很重要的要求。在數據傳輸過程中會出現以下三種情況,
合理的處理這幾種情況是保證數據高速無斷點傳輸必須面對的。為了解決這個幾種狀況,首先要明白數據接收和發送的規律。數據接收完全是隨機的、不可控的,而數據的發送是通過FPGA來實現的,自主可控的。并且ARP回應和ICMP回應并不要求實時的進行回復,因此為了保證UDP數據包的傳輸不會受到干擾,因此可以在UDP包傳輸間隔內進行ARP和ICMP的回應。如下圖所示:
在數據UDP發送的前后端都預留一段時間禁止ARP回應。UDP數據包前端預留時間是為了解決收到ARP請求而沒有足夠時間空間回復,所以留了一段時間。UDP數據包后端預留一段時間是為了預防PHY芯片發送過于繁忙而導致數據出錯。通過上面的方式能實現數據的有效傳輸。
通過上面的設計能解決FPGA在UDP網絡傳輸中的ARP和ICMP請求。然而在實際的解決過程中肯定會有更加優化的方法來實現這些問題。目前新的思路是通過FIFO來實現,就是所有的請求回應都按照先后順序來寫入一個公共FIFO中,然后順序讀出,這樣就可以解決ARP和UDP包沖突的問題。這些方法其實都是殊途同歸的,目的都是一樣的。
然而雖然把上面的步驟都一一實現了在實際測試中還會存在網絡在傳輸或者復位后自動斷開現象,這些情況在實際的應用中會帶來很大的麻煩。解決FPGA網絡斷開連接這個問題需要注意方方面面的情況。總的來說是三個方面:1、硬件的完好,包括網線、PC機網口、FPGA板卡的PHY芯片配置等。2、FPGA代碼的時序設計和布局布線的時序約束。3、上位機網口的一些設置。
在實際的調試中出現過以下現象:現象一:FPGA部分條件都不變下,通過網線分別連接兩臺電腦,WIN10電腦速率自適應匹配為1000Mbps,而WIN7電腦速率自適應匹配為100 Mbps。WIN10電腦能實現ARP、ICMP與FPGA的交互,并且能正確的接收FPGA上發的數據。而WIN7電腦不能與FPGA進行數據的交互。
現象二:FPGA部分條件都不變下,通過更改WIN7電腦速率為1000 Mbps固定值,連接FPGA和WIN7電腦,但無法聯通,網卡顯示如圖所示。
這個現象就是由于網線和上位機網卡驅動存在問題導致,后續更換了網線和更新了網卡驅動測試正常。這些都需要在實際調試時通過對比試驗來確定不同點,最終來實現問題定位。
現象三:能實現FPGA和PC機的通信,但PC機下發ARP或ICMP時FPGA接收到的數據經常出現錯誤。這個問題要分開來看,首先是每次PC機發送數據FPGA都能接到,但存在接收到的數據是錯誤的。因此問題定位帶FPGA應用層和PC網絡芯片發出端之間存在問題,通過chipscope抓取FPGARX端IO口的數據可知數據是正確的,因此問題定位在Tri-Mode Ethernet MAC IP的輸入和輸出存在問題,然而xilinx官方IP核很難出現問題,因此應該是例化中出現錯誤。經過查找發現是時序約束存在錯誤。
而IP的約束主要是周期約束、偏移約束、多周期約束這三個大的方面。時序約束后面會展開專門的例程來說。這里需要把官方產生的約束核自己的代碼層次結合起來,然后根據自己編譯的時序分析報告進行修改。
通過對信號約束,解決了上面提到的數據錯誤,并且還大大減少了網絡斷開連接的問題。
在進行通信時上位機網口的配置也會對數據的傳輸產生很大的影響。比如說開啟ARP減負、接收緩沖區設置、電源管理設置等都會對數據交互產生影響。
通過上面的設計基本上能實現數據的傳輸。在實際的測試中由于項目實際數據速率只有600MB/s,PC機實時的接收數據并通過ping命令不停的發送ICMP請求這樣的條件下連續運行10個小時,基本滿足了設計要求,后續改進還需要根據實際的需求進行改進。
評論
查看更多