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