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