FPGA豐富的邏輯資源、充沛的I/O引腳以及較低的功耗,被廣泛應(yīng)用于嵌入式系統(tǒng)和高速數(shù)據(jù)通信領(lǐng)域。現(xiàn)如今,各大FPGA生產(chǎn)廠商為方便用戶的設(shè)計(jì)和使用,提供了較多的、可利用的IP核資源,極大地減少了產(chǎn)品的開(kāi)發(fā)周期和開(kāi)發(fā)難度,從而使用戶得以更專注地構(gòu)思各種各樣創(chuàng)意且實(shí)用的功能,而不是把大量時(shí)間浪費(fèi)在產(chǎn)品的調(diào)試和驗(yàn)證中。
千兆以太網(wǎng)技術(shù)在工程上的應(yīng)用是當(dāng)前的研究熱點(diǎn)之一。相比于其他RS-232或RS-485等串口通信,千兆以太網(wǎng)更加普及和通用,可以直接與Internet上的其他終端相連;相比于百兆網(wǎng)絡(luò),千兆以太網(wǎng)傳輸速度更快、傳輸距離更遠(yuǎn),再結(jié)合UDP/IP協(xié)議棧,可以更方便地與上位機(jī)進(jìn)行通信。
本文結(jié)合FPGA和千兆以太網(wǎng)靈活與快速的優(yōu)勢(shì),設(shè)計(jì)了一個(gè)多通道并支持不同格式的數(shù)據(jù)采集系統(tǒng)。為了更好地為上位機(jī)軟件所支持,搭建了一個(gè)簡(jiǎn)單的UDP/IP數(shù)據(jù)通道來(lái)完成數(shù)據(jù)到上位機(jī)的高速傳輸。同時(shí),為了克服UDP這類不可靠的、面向無(wú)連接的協(xié)議帶來(lái)的數(shù)據(jù)錯(cuò)誤和缺失問(wèn)題,使用一塊DDR2SDRAM芯片來(lái)緩存各通道數(shù)據(jù),在應(yīng)用層制定了與上位機(jī)交互及丟包處理的通信協(xié)議,從而保證了采集數(shù)據(jù)到達(dá)上位機(jī)的可靠性。
1 系統(tǒng)總體結(jié)構(gòu)
系統(tǒng)的設(shè)計(jì)目標(biāo)是為了讓不同通道、不同格式的數(shù)據(jù)都能通過(guò)同一個(gè)網(wǎng)絡(luò)通道被快速無(wú)誤地傳遞給上位機(jī),由于設(shè)備與上位機(jī)運(yùn)行狀態(tài)的不同,采集數(shù)據(jù)速率的變化,甚至網(wǎng)線質(zhì)量,使傳輸過(guò)程中的錯(cuò)誤和丟包情況在所難免,所以需要有適當(dāng)?shù)臋C(jī)制和存儲(chǔ)器緩存來(lái)保證傳輸?shù)目煽啃浴?/p>
圖1所示即為本系統(tǒng)的總體結(jié)構(gòu),除了使用一塊DDR2 SDRAM芯片之外,網(wǎng)絡(luò)模型中物理層的功能由一塊PHY芯片來(lái)完成。目前一般PHY芯片均能兼容10Mbit·s-1、100Mbit·s-1、1 000 Mbit·s-13種速率的以太網(wǎng)傳輸,并向上層提供多種接口,如MII、GMII、RGMII和TBI接口等,對(duì)于上位機(jī)一側(cè)則直接是普通的RJ45網(wǎng)口插槽。物理層接收數(shù)據(jù)鏈路層的并行數(shù)據(jù),并將其轉(zhuǎn)換為原始的比特流;同時(shí)也將原始比特流轉(zhuǎn)化成并行數(shù)據(jù),提交給數(shù)據(jù)鏈路層。
2 FPGA模塊功能
FPGA模塊通過(guò)響應(yīng)上位機(jī)的指令,完成數(shù)據(jù)采集、打包、傳輸、丟包重傳等工作。所有工作的基礎(chǔ)是MAC子層、網(wǎng)絡(luò)層、傳輸層等OSI參考模型各層協(xié)議的可靠實(shí)現(xiàn),每一層都按照標(biāo)準(zhǔn)接口向上一層提供特定服務(wù),而把如何實(shí)現(xiàn)這些服務(wù)的細(xì)節(jié)對(duì)上一層加以屏蔽。
圖2顯示了系統(tǒng)FPGA模塊的具體結(jié)構(gòu),以及各個(gè)子模塊之間的關(guān)系。為縮短設(shè)計(jì)周期,提高設(shè)計(jì)質(zhì)量,在模塊中分別調(diào)用了Altera公司現(xiàn)有的以太網(wǎng)控制器IP核和DDR2控制器IP核資源。
2.1 DDR2讀寫(xiě)控制
若不考慮網(wǎng)絡(luò)中丟包的情況,數(shù)據(jù)一邊采集,一邊打包向上位機(jī)發(fā)送,是不需要外部存儲(chǔ)器來(lái)緩存的。但是在實(shí)際測(cè)試中發(fā)現(xiàn),目前普通配置的PC機(jī)無(wú)法承受千兆以太網(wǎng)的快速傳輸能力,丟包很常見(jiàn),尤其是增加到多個(gè)通道時(shí),設(shè)備向上位機(jī)的輸出能力加大,丟包率也立即隨之升高。所以,使用一片DDR2 SDRAM緩存各通道的數(shù)據(jù)是必要的。
設(shè)計(jì)中直接調(diào)用Altera公司提供的DDR2 SDRAM控制器,并選用一塊它可以驅(qū)動(dòng)的芯片來(lái)提高工作效率。芯片可使用的緩存空間是要重點(diǎn)關(guān)注的。每個(gè)通道都要分配固定的緩存區(qū)域,所以要將有限的內(nèi)存空間作合理的劃分。如果是圖像數(shù)據(jù),單個(gè)通道至少要有緩存兩幀以上的空間。DDR2讀寫(xiě)控制模塊直接調(diào)用DDR2 SDRAM控制器IP核,但由于該IP核提供給用戶端的接口使用不方便,需要按照其文檔上介紹的時(shí)序來(lái)進(jìn)行突發(fā)式讀寫(xiě)。
本模塊的功能主要是協(xié)調(diào)各通道采集數(shù)據(jù)的寫(xiě)入和讀出。如圖3所示,寫(xiě)操作時(shí),各通道的數(shù)據(jù)首先用FPGA資源進(jìn)行緩存,然后寫(xiě)入控制狀態(tài)機(jī)通過(guò)輪詢的方式依次檢查各個(gè)通道已經(jīng)緩存的數(shù)據(jù)量,如果足夠一次突發(fā)寫(xiě),則將其寫(xiě)入SDRAM芯片的相應(yīng)通道塊中,然后再檢查下一通道;讀操作時(shí),讀出控制狀態(tài)機(jī)也依次檢查各個(gè)通道寫(xiě)入SDRAM芯片的數(shù)據(jù)量,如果足夠一次突發(fā)讀,則將其讀出,通過(guò)網(wǎng)絡(luò)發(fā)送出去。
基于以上控制方式,設(shè)計(jì)對(duì)各通道的數(shù)據(jù)格式是不作限制,如圖1中所示,可以是PAL、Camera Link、VGA等各種格式的圖像或組合,只是在采集之前向上位機(jī)報(bào)告各個(gè)通道的數(shù)據(jù)信息。但需要說(shuō)明的是,這些數(shù)據(jù)的帶寬總和理論上不應(yīng)超過(guò)千兆以太網(wǎng)的最大傳輸速率,這是采用輪詢方式得以成功的前提。其實(shí),如今普通PC機(jī)的處理能力遠(yuǎn)遠(yuǎn)不能達(dá)到這個(gè)最大限制,當(dāng)速度到達(dá)100 Mbit·s-1時(shí),上位機(jī)丟包就已經(jīng)很嚴(yán)重。如果是將采集的數(shù)據(jù)在上位機(jī)上顯示,最多可能只有70~80 Mbit·s-1;如果還要將數(shù)據(jù)寫(xiě)入硬盤(pán),那數(shù)據(jù)率則會(huì)更低,除了配備一塊上好的硬盤(pán)之外,還需要在上位機(jī)軟件的優(yōu)化上多作努力。
2.2 以太網(wǎng)發(fā)送接收控制
本模塊的功能就是MAC子層、網(wǎng)絡(luò)層、傳輸層各層協(xié)議的具體實(shí)現(xiàn),這些子模塊作為數(shù)據(jù)傳輸?shù)耐ǖ?,需要具有一定的緩存和查錯(cuò)能力,同時(shí)為了能擴(kuò)展其他協(xié)議,還必須保持相互之間的獨(dú)立性。如圖4所示,硬件設(shè)備接收數(shù)據(jù)的過(guò)程就是以太網(wǎng)幀經(jīng)過(guò)每一層,去除各層的首部并核對(duì)校驗(yàn),最后獲得純粹的用戶數(shù)據(jù);發(fā)送數(shù)據(jù)的過(guò)程就是用戶數(shù)據(jù)每經(jīng)過(guò)一層,添加相應(yīng)的首部和校驗(yàn),直到組成一個(gè)完整的以太網(wǎng)幀。
1)MAC子層的功能。設(shè)計(jì)中直接調(diào)用Altera公司提供的三速以太網(wǎng)控制器IP核實(shí)現(xiàn)MAC子層的功能,該IP核提供了統(tǒng)一的寄存器接口,用戶可以通過(guò)它來(lái)配置以太網(wǎng)最大幀長(zhǎng)、源MAC地址、目的MAC地址和PHY地址等重要信息。如圖4所示,發(fā)送數(shù)據(jù)時(shí),MAC模塊向數(shù)據(jù)幀添加以太網(wǎng)首部,并利用CRC算法添加32位的校驗(yàn)碼;接收數(shù)據(jù)時(shí),MAC模塊同樣要進(jìn)行CRC校驗(yàn),對(duì)于不正確的數(shù)據(jù)幀要予以丟棄,用戶也可以通過(guò)配置寄存器決定是否將校驗(yàn)位一并送至上一層。
(2)UDP/IP協(xié)議棧的實(shí)現(xiàn)。相對(duì)于TCP協(xié)議的三次握手,UDP和IP協(xié)議面向無(wú)連接的性質(zhì)使其在硬件上可以快速實(shí)現(xiàn),至于連接的建立完全可以在應(yīng)用層實(shí)現(xiàn)。
如圖4所示,UDP和IP協(xié)議的功能在硬件上的實(shí)現(xiàn)有較多相同之處:對(duì)于上層發(fā)送的數(shù)據(jù)均需要添加相應(yīng)的首部和校驗(yàn)和;對(duì)于下層接收的數(shù)據(jù),檢驗(yàn)校驗(yàn)和,并去除首部,然后才能送到上一層;由于首部中有該數(shù)據(jù)包的長(zhǎng)度區(qū)域,所以無(wú)論是發(fā)送和接收,都需要將數(shù)據(jù)包全部緩存,才能確定其長(zhǎng)度大小,相當(dāng)于一種“存儲(chǔ)-轉(zhuǎn)發(fā)”的機(jī)制。
當(dāng)然,UDP協(xié)議與IP協(xié)議在實(shí)現(xiàn)時(shí)也有不同的地方,主要體現(xiàn)在校驗(yàn)和的計(jì)算方法上。UDP協(xié)議的校驗(yàn)和是將首部和數(shù)據(jù)一起校驗(yàn),而且這個(gè)首部不僅是8 Byte的UDP首部,還包括12Byte的偽首部。在UDP層計(jì)算校驗(yàn)和還用到了IP層的地址,但這違背了網(wǎng)絡(luò)分層模型的理念。IP協(xié)議的校驗(yàn)和只計(jì)算IP數(shù)據(jù)包的頭部,一般情況下只有固定的20 Byte。
2.3 應(yīng)用層協(xié)議處理
不同通道采集的數(shù)據(jù)按照規(guī)定的數(shù)據(jù)包長(zhǎng)度進(jìn)行打包,然后再發(fā)送到上面的以太網(wǎng)控制模塊,需要專門的模塊進(jìn)行組織和調(diào)度,并添加對(duì)應(yīng)通道的標(biāo)簽。同時(shí),網(wǎng)絡(luò)中也不只是設(shè)備到上位機(jī)方向的采集數(shù)據(jù)包,也有反方向的用于控制的命令包:首先要考慮的問(wèn)題是設(shè)備從何時(shí)開(kāi)始采集數(shù)據(jù),何時(shí)停止采集,這都是要上位機(jī)發(fā)送命令來(lái)控制的;其次,對(duì)于丟失包的統(tǒng)計(jì)與處理,這一部分工作稍微有些困難,但無(wú)論是設(shè)備和上位機(jī)都可以完成,顯然交給上位機(jī)處理比較適宜,然后上位機(jī)向設(shè)備發(fā)送帶丟失包序號(hào)的短數(shù)據(jù)包,設(shè)備優(yōu)先從DDR2緩存中找到該丟失的數(shù)據(jù)包,發(fā)往上位機(jī)。
系統(tǒng)中完成這些功能的模塊相當(dāng)于一個(gè)位于UDP/IP層之上的應(yīng)用層協(xié)議,而這個(gè)協(xié)議的內(nèi)容是由系統(tǒng)設(shè)計(jì)者所規(guī)定的,但必須為FPGA開(kāi)發(fā)人員和上位機(jī)軟件程序開(kāi)發(fā)人員所共享,這樣在不同機(jī)器上的對(duì)應(yīng)層就有了一個(gè)可以互相通信的對(duì)等體(Peer)。這樣制定應(yīng)用層協(xié)議,不但增加了系統(tǒng)相關(guān)功能的保密性,還可以由開(kāi)發(fā)人員自行裁剪應(yīng)用層功能,靈活地協(xié)調(diào)軟硬件應(yīng)該負(fù)責(zé)的細(xì)節(jié),最后敲定最簡(jiǎn)潔的實(shí)現(xiàn)方案。
3 上位機(jī)軟件的功能
由于本系統(tǒng)的硬件部分實(shí)現(xiàn)了UDP/IP協(xié)議棧的內(nèi)容,上位機(jī)軟件在開(kāi)發(fā)時(shí)有了較多可利用的系統(tǒng)調(diào)用,主要是Socket(套接字)原語(yǔ)的使用。相對(duì)于硬件開(kāi)發(fā)來(lái)說(shuō),軟件開(kāi)發(fā)方便實(shí)現(xiàn)一些復(fù)雜的功能和計(jì)算,所以在系統(tǒng)構(gòu)想之初就刻意將一些較難實(shí)現(xiàn)的部分交由上位機(jī)軟件來(lái)處理,主要是圖像幀間隔的識(shí)別和重傳包的統(tǒng)計(jì)。
關(guān)于數(shù)據(jù)包重傳,硬件設(shè)備在傳送各個(gè)通道的圖像時(shí),只選取一個(gè)合適的點(diǎn)開(kāi)始采集圖像,而不負(fù)責(zé)在數(shù)據(jù)包中添加圖像幀的開(kāi)始和結(jié)束等信息,因?yàn)檫@樣不僅偏離了多通道圖像和數(shù)據(jù)兼容的初衷,而且給FPGA程序的實(shí)現(xiàn)增加了困難,尤其是采集的數(shù)據(jù)要進(jìn)出DDR2 SDRAM緩存,如果在這些純數(shù)據(jù)中添加額外的標(biāo)志數(shù)據(jù),可能會(huì)打亂整個(gè)緩存區(qū)的布局。所以上位機(jī)只能根據(jù)接收的數(shù)據(jù)量來(lái)判斷各個(gè)圖像幀之間的間隔,然后無(wú)論顯示或存儲(chǔ),都以幀為單位進(jìn)行。
4 系統(tǒng)設(shè)計(jì)注意事項(xiàng)
4.1 ARP包的響應(yīng)與抑制
上位機(jī)在向設(shè)備發(fā)送UDP數(shù)據(jù)包之前,可能會(huì)先發(fā)送一個(gè)ARP包,請(qǐng)求設(shè)備的MAC地址。所以在FPGA程序中要能響應(yīng)該數(shù)據(jù)包,并發(fā)送ARP回復(fù),否則設(shè)備與上位機(jī)將不能通信。得到設(shè)備的MAC地址后,上位機(jī)會(huì)暫時(shí)將其保存,建立一個(gè)ARP表項(xiàng);一段時(shí)間后,ARP表老化,會(huì)再次向設(shè)備發(fā)送ARP請(qǐng)求。
為了能正確響應(yīng)ARP請(qǐng)求和回復(fù),必須要清楚ARP數(shù)據(jù)包的格式。如圖5所示,如果以太網(wǎng)幀“幀類型”區(qū)域的值為0x0806,則表示該幀后面的數(shù)據(jù)填充為一個(gè)ARP包。至于是ARP請(qǐng)求還是ARP回復(fù),需要根據(jù)ARP首部的操作碼來(lái)辨別:操作碼為0x0001,則是ARP請(qǐng)求包;操作碼為0x0002,則是ARP回復(fù)包。ARP請(qǐng)求包填入一個(gè)廣播幀并發(fā)向網(wǎng)絡(luò)中的所有主機(jī),所以其以太網(wǎng)目的地址為廣播幀地址0xffffffffffff,并且由于它的目標(biāo)是請(qǐng)求目的主機(jī)的MAC地址,故圖中“接收方MAC地址”區(qū)域沒(méi)有確切值,可為任意6 Byte的填充;ARP回復(fù)包已經(jīng)得到了所需的MAC地址,但是要注意,此時(shí)的發(fā)送方和接收方已經(jīng)對(duì)調(diào),相應(yīng)區(qū)域的填寫(xiě)也應(yīng)適當(dāng)改變。
以太網(wǎng)協(xié)議規(guī)定的最短幀長(zhǎng)為64Byte,這就要求其數(shù)據(jù)填充至少為46 Byte,如圖4所示,而圖5中的ARP字段共有28 Byte,所以無(wú)論是ARP請(qǐng)求還是回復(fù),均應(yīng)有18 Byte的填充數(shù)據(jù)。有些PC機(jī)會(huì)發(fā)送其他設(shè)備的ARP請(qǐng)求,即使此時(shí)只有一根直連線將設(shè)備與上位機(jī)相連。這時(shí)設(shè)備是不能響應(yīng)該請(qǐng)求的,應(yīng)當(dāng)在MAC層和IP層之間就將這樣的請(qǐng)求屏蔽,防止干擾正常的數(shù)據(jù)包傳輸。
4.2 Jumbo幀的利弊
以太網(wǎng)標(biāo)準(zhǔn)規(guī)定的最大幀長(zhǎng)度為1 518 Byte,這包括IP層和UDP層添加的首部,一般發(fā)送的數(shù)據(jù)包也都應(yīng)該限制在這一范圍內(nèi)。但千兆以太網(wǎng)有一種廠商標(biāo)準(zhǔn)的超長(zhǎng)幀格式,目前還沒(méi)有獲得IEEE標(biāo)準(zhǔn)委員會(huì)的認(rèn)可,它規(guī)定的幀格式與普通以太網(wǎng)幀相同,只是其數(shù)據(jù)填充區(qū)域可以突破原有限制,整個(gè)幀長(zhǎng)度為9 000~64 000 Byte不等,即Jumbo巨型幀。
在本系統(tǒng)中采用Jumbo幀的好處:(1)可以適當(dāng)提高網(wǎng)絡(luò)帶寬的利用率。這主要靠節(jié)省各層首部的添加得到。(2)減少操作系統(tǒng)因頻繁響應(yīng)網(wǎng)絡(luò)設(shè)備的中斷而帶來(lái)的CPU資源的過(guò)多占用。這可以說(shuō)是采用Jumbo幀的主要原因,因?yàn)橐幚砬д滓蕴W(wǎng)較高的數(shù)據(jù)率,無(wú)論上位機(jī)軟件如何優(yōu)化,CPU的占用仍然很高,這時(shí)如果能減少其他地方的CPU開(kāi)銷,將大幅增加軟件的處理能力。
但Jumbo幀在使用時(shí)也有一些不利的地方。首先,目前很多PC機(jī)的網(wǎng)絡(luò)適配器不支持Jumbo幀的傳輸,雖然Altera的以太網(wǎng)控制器IP核支持,但這不足以使兩個(gè)設(shè)備進(jìn)行通信;其次,Jumbo幀會(huì)長(zhǎng)時(shí)間占用網(wǎng)絡(luò)通道,這會(huì)影響那些對(duì)數(shù)據(jù)延遲敏感的設(shè)備和應(yīng)用;第三,Jumbo幀的丟包意味著嚴(yán)重的災(zāi)難,一幀相當(dāng)于十多個(gè)正常幀,這會(huì)將處理能力弱的PC機(jī)迅速引入重傳的陷阱,丟包越來(lái)越多,直到網(wǎng)絡(luò)帶寬被全部占用,導(dǎo)致上位機(jī)軟件崩潰。所以在考慮支持Jumbo幀之前,應(yīng)先充分權(quán)衡這些優(yōu)勢(shì)與不足。
5 結(jié)束語(yǔ)
系統(tǒng)硬件設(shè)備與上位機(jī)軟件配合工作,可以較好地完成雙路彩色PAL制數(shù)據(jù)流的采集任務(wù)。通過(guò)實(shí)際測(cè)試與分析,采用Jumbo幀進(jìn)行傳輸,有效地減少了軟件運(yùn)行過(guò)程中的系統(tǒng)中斷數(shù),從而最大限度地降低了CPU的占用。利用搭建起來(lái)的千兆以太網(wǎng)運(yùn)行環(huán)境,可以擴(kuò)展類似的高速數(shù)據(jù)傳輸應(yīng)用。
評(píng)論
查看更多