李 林
(江西師范高等專科學校物聯網學院,江西 鷹潭 335000)
隨著傳感網絡、射頻識別技術、大數據技術和云計算能力的不斷發展,物聯網被廣泛地應用于各行各業,可實現智慧交通、智能醫療、智慧農業、智能電網、智能安防、智慧物流、智能家居和智能環境監測等[1-8]。基于物聯網的環境監測系統越來越復雜,集成度也越來越高。數據傳輸的種類越來越多,傳輸的數據容量也越來越大。在環境監測系統的前端,傳統數據傳輸通常采用串行通信(Universal Serial Bus, USB)總線接口、外圍設備互聯(Peripheral Component Interconnect, PCI)控制總線接口、局域網控制器(Controller Area Network, CAN)總線接口和ZigBee 無線通信技術等。USB2.0 總線的最高傳輸速率為480 Mbps,具有開發周期短、穩定性較高等優勢,且目前具有成熟的產品,但是其存在傳輸距離短的缺點,嚴格限制了連接設備之間的位置[9]。PCI總線結構復雜,最高傳輸速率為266 Mbps,且在設備連接狀態時不能隨意進行熱插拔操作[10]。CAN 總線具有開發周期短、強大的抗干擾能力和實時性等特點,被廣泛地應用在車載設備中。然而CAN 總線的通信速率最高只有1 Mbps,很難滿足大容量和高速率的數據傳輸需求[11]。ZigBee 技術是一項新型的無線通信技術,具有傳輸速率低、距離短、功耗低、成本低等優點,被廣泛地應用于傳感控制中[12]。隨著網絡技術的發展和普及,以太網已經成為一種非常成熟的技術,千兆以太網技術已經成為物聯網環境監測系統研究的熱點和趨勢。與傳統的通信技術相比,千兆以太網最大的優點在于傳輸速度快、傳輸距離遠,尤其是在傳輸距離和組網構架等方面具有巨大的技術優勢[13]。
本課題以XILINX 公司的FPGA 硬件作為平臺,利用FPGA 芯片資源的優勢。設計了一套以FPGA 為硬件平臺,基于UDP(User Datagram Protocol, UDP)協議的千兆以太網環境監測系統數據傳輸構架。重點闡述了基于UDP 協議的千兆以太網數據傳輸系統構架的實現方案,然后采用仿真軟件對該系統構架進行仿真驗證,最后在實際的FPGA 硬件平臺上具體實現和完成功能性驗證,并給出了最終的硬件平臺實際測試結果。
基于物聯網的環境監測系統主要完成對環境中各種類型信號的采集監測,例如環境中的視頻圖像信號、溫濕度、煙霧數據信息、消防安全信號等。所有的這些信號首先通過相應的傳感器進行采集,然后通過數據傳輸系統將數據傳輸至上位機進行回讀分析。根據物聯網環境監測系統的工作流程,可劃分在FPGA 內部系統的邏輯功能框圖如圖1所示。

圖1 環境監測系統整體設計框圖
各類傳感器首先采集環境中相應的信號,然后通過對應的控制器將采集到的信號存儲在各自的數據緩沖器FIFO 中,再由數據存儲序列控制器通過相應的控制算法將數據通過DDR3 控制器接口存儲到DDR3 硬件中。然后由千兆以太網控制器將存儲于DDR3 內存中的數據取出來,通過以太網接口傳輸至上位機。在以太網數據傳輸過程中,主要涉及TCP/IP 協議中的數據傳輸層、網絡層和數據鏈路層。通過FPGA 編程實現數據的處理和傳輸以及UDP 協議中相關的協議。對于物理層則采用商用的以太網PHY芯片來實現,這樣使得外部接口電路的配置相對簡單,從而降低了系統的開發難度。文章參考了國內外有關的千兆以太網的設計經驗[14],完成了基于UDP協議的千兆以太網的設計和實現,以滿足目前大部分物聯網數據采集系統的實際需求。
本系統中千兆以太網UDP 協議的內部構架方案如圖2 所示。主要包含了UDP 模塊(UDP 接收模塊和UDP 發送模塊)、MAC 層功能模塊(MAC 層數據接收模塊和MAC 層數據發送模塊)、IP 層模塊(IP 層發送模塊和IP 層接收模塊)、ARP 功能模塊(ARP 發送模塊和ARP 接收模塊)、ICMP 功能模塊和PHY 模塊等。其中,UDP 模塊主要實現UDP 的相關協議,具體包括數據的接收和發送。MAC 層模塊實現以太網數據鏈路功能,管理數據輸入輸出接口(Management Data Input/Output, MDIO),并對PHY 模塊的寄存器進行相應的配置,來對PHY 的功能進行管理。對于PHY 模塊,則采用商業的以太網芯片來實現。

圖2 UDP協議內部構架
MAC 層由MAC 層發送模塊和MAC 層接收模塊兩部分構成。MAC 層發送模塊按照標準以太網幀的格式組裝MAC 幀頭,然后再結合IP 發送層或ARP 發送層的數據形成一個完整的MAC 數據幀發送出去。MAC 層接收模塊將接收到的數據按照以太網的標準幀格式逐字節進行解析,根據接收到的類型字節進行相應的判斷并存儲相應的有效信息。
2.2.1 MAC 層接收
在MAC 接收層接收到數據的有效標志信號為高電平時,對以太網幀進行逐字節統計。當接收到有效信號時,開始進行字節計數,當幀數據的有效標志位信號為低電平時則停止計數。具體的實現步驟采用如圖3 所示的狀態機來實現。首先,在IDLE 狀態下判斷接收到的數據有效信號是否為高電平,若為高電平,則進入REC_PREAMBER 前導碼狀態,接收以太網幀的前導碼。之后狀態機跳轉到REC_MAC_HEAD 頭部接收狀態,此時將目的MAC 地址、源MAC 地址、以太網幀類型緩存起來,同時在此狀態下判斷接收到的前導碼是否正確,如果錯誤則進入REC_ERROR 錯誤狀態。否則進入REC_IDENTIFY狀態,并在此狀態判斷接收到的幀類型是IP 協議類型還是ARP 協議類型。若接收到幀類型數據為0X0800 則為IP 協議類型;若為0X0806,則為ARP 類型。其次,狀態機跳轉到REC_DATA 接收數據狀態,并將接收到的數據送到下游的IP 層模塊或ARP 功能模塊,與此同時將接到的數據進行CRC 處理,等待IP 層或ARP 層數據接收完畢,則狀態機跳轉到REC_CRC 狀態,接收CRC 校驗數據,將接收到的CRC 數據與在接收數據狀態計算得到的CRC 數據進行對比。根據比對結果判斷接收到的數據是否正確,正確則進入REC_END狀態,錯誤則進入REC_ERROR狀態。

圖3 MAC層接收狀態機
2.2.2 MAC 層發送
MAC 層發送模塊的功能是先根據標準以太網數據幀的格式生成以太網幀頭,然后再結合IP 層或ARP 層發送過來的數據形成一個完整的以太網幀發送出去。具體的狀態機實現流程如圖4 所示。一開始狀態機處于SEND_START 狀態,等待MAC 層發送準備信號mac_tx_ready。若接收的準備信號有效,則表明ARP 或IP 數據已經準備好了,可以進行數據發送。此時狀態機跳轉到發送前導碼狀態SEND_PREAMBER,前導碼發送完畢之后,拉高數據發送請求信號,請求IP 或ARP 的數據,隨后進入到數據發送狀態SEND_DATA,等數據發送完畢后,進入發送SEND_CRC 狀態。在發送數據的過程中,同時需要進行CRC校驗。
ARP 模塊主要包含ARP 請求模塊和ARP 發送模塊兩部分。ARP 請求模塊主要用于檢測接收到的ARP 是請求包還是發送包。ARP 發送包是根據接收到的ARP 請求包的類型來生成相應的應答幀信號。

圖4 MAC層發送狀態機
2.3.1 ARP 接收模塊
ARP 接收模塊主要實現ARP 數據的接收,具體的狀態流程圖如圖5 所示。一開始,系統處于IDLE狀態下,當接收到MAC 層發送過來的ARP 請求信號后,狀態跳轉到ARP 接收狀態,在該狀態下,系統根據ARP 數據協議報提取出接收到的信號的源MAC地址、目的MAC 地址、源IP 地址和目的IP 地址,并判斷檢測接收到的操作碼類型是ARP 請求信號還是ARP應答信號。如果是請求信號,則再判斷接收到的目的IP地址和本機的IP地址是否匹配,如果匹配,則發出應答請求信號,否則忽略該幀信號。如果是應答信號,則再判斷接收到的目的IP 地址和目的MAC 地址是否和本機一致,如果一致,則發出匹配一致信號,表明接收到對方發過來的地址信息,并將接收到的MAC地址和IP地址存入到系統緩存中。

圖5 ARP接收狀態流程圖
2.3.2 ARP 發送模塊
ARP 發送模塊實現ARP 應答幀信號的發送功能。具體的工作流程圖如圖6 所示。系統一開始處于IDLE 狀態,等待ARP 接收模塊過來的發送請求信號或ARP 應答請求信號,之后系統進入請求或應答狀態,并通知MAC 發送模塊數據已經準備好了,然后等待MAC 數據請求信號,系統進入請求或數據發送狀態,按照ARP 協議幀的格式生成ARP 應答信號,在發送數據時,若數據不足46 字節,則需要補全46字節發送。

圖6 ARP發送數據流程圖
IP 模塊根據功能劃分為接收模塊和發送模塊兩個功能模塊。接收模塊按照如圖7 所示的IP 協議報格式對接收到的數據進行解析。首先是解析協議報頭信息,根據接收到的報頭長度字段判斷報頭占據多少個字節,然后從中提取數據報所攜帶的一些關鍵信息;如IP 數據總長度、目的IP 地址、源IP 地址、IP 協議類型和報頭校驗和。根據接收到的IP 協議類型代碼判斷接收到的數據報是UDP 協議還是ICMP 協議,若協議類型代碼為0X01,為ICMP 協議;若協議類型代碼為0X11,為UDP 協議。接收IP 報頭的同時,對接收到的IP 報頭進行校驗和求解,然后將接收到的校驗和與求解的校驗和進行比較,若不一致,則丟棄該數據報。否則繼續接收數據,并且根據協議的類型與代碼將接收到的數據發送到ICMP 模塊或UDP模塊。發送模塊根據需要發送的數據類型(ICMP 或UDP)按照相應的IP 協議報的格式生成相應的IP 首部,形成一個完整的IP 數據報發送給MAC 層模塊。
ICMP 模塊的主要功能是檢測主機和路由器之間的網絡是否連通、主機能否到達指定地點等,是TCP/IP 協議簇中的一個子層協議,包含在IP 數據段中。本課題要實現的ICMP 模塊首先是接收其他設備發送過來的ICMP 數據,然后判斷接收的類型是否是請求包,若為請求包,先將數據存入到RAM 中,并計算校驗和,判斷校驗和是否正確,若校驗和正確,僅進入ICMP 發送狀態,根據如圖8 所示的ICMP數據報文格式生成相應的應答包。此時生成的應答包中,需要在MAC 層將請求包中的MAC 地址和IP地址互換,并且需要將ICMP 報文中的協議類型轉變成應答類型。

圖7 IP協議報格式

圖8 ICMP報文格式
UDP 模塊包含了發送和接收兩個模塊,主要以如圖9 所示的UDP 協議報格式完成UDP 數據的接收和發送。
1)UDP 接收模塊。完成UDP 數據有效性的檢測和數據的接收兩大功能。具體操作流程如下:
①校驗和計算。將接收到的UDP 首部和UDP 數據轉換成反碼運算求和,若UDP 的數據總數為奇數,則在數據尾部填充0X00 構成偶數進行運算,最后將得到的求和結果再求反碼即可得到UDP 的校驗和。
②數據有效性判斷。根據上面解析得到的數據內容,判斷接收到的數據是否為UDP 協議、目的IP地址與本機IP 是否匹配、目的端口號是否是本機的端口號。最后再判斷接收到的UDP 校驗和與計算的UDP 校驗和是否一致。若其中有一個不匹配,則判斷該幀信號為無效幀,做丟棄處理。
③數據接收。根據第二步數據的有效性判斷,若數據有效,去除接收到的數據中的IP 首部、UDP 首部,即可得到UDP 數據。
2)UDP 發送模塊。完成UDP 首部校驗和的計算、數據幀的組裝和發送功能。首先,將需要發送的UDP 數據緩存到RAM 中,當數據容量存儲到一定時再將數據讀出。其次,將需要發送的UDP 首部和數據轉換為反碼求和,對求和結果再次轉換為反碼運算即可得到需要發送的UDP 報首部校驗和。最后,將UDP 首部和數據按照如圖9 所示的UDP 數據報格式生成UDP 數據幀發送到IP 模塊。

圖9 UDP協議報格式
系統軟件在設計完之后,為了驗證其邏輯功能的正確性,本文設計了如圖10 所示的仿真結構,并采用Modelsim 仿真軟件進行功能驗證。系統仿真框圖主要由以太網模塊、數據發生器和數據接收器等組成。仿真中利用數據發生器生成需要發送的數據,將生成的數據通過以太網發送端口發送出去,然后再由以太網從接收端口回接數據,這樣就能夠對所設計系統中的各個模塊進行完整的仿真。

圖10 系統驗證仿真結構
仿真平臺搭建完成以后,對MAC 地址、IP 地址和端口號等信息進行設置。然后由數據發生器模塊對需要發送的數據進行設置。最后啟動仿真程序,對比數據發生器模塊發送的數據和數據接收模塊接收到的數據,若二者一致,則表明本文的設計方案合理且邏輯正確。仿真結果如圖11 所示,從仿真結果可以看出,發送端的數據在接收端都能夠完整地接收,所設計的系統構架在功能上是完全可行的。
功能仿真完成以后,可以借助相關的工具在實驗室中的FPGA 板卡上進行性能測試和驗證。首先,需要對FPGA 板卡和上位機的物理地址、IP 地址和端口號進行設置。然后,上位機采用相應的測試方法進行測試。第一步通過上位機進行PING 功能來測試網絡是否連通,測試結果如圖12(a)所示,從中可以看出網絡已經連通;第二步采用網絡助手進行網絡結構的收發功能測試,測試結果如圖12(b)所示,從測試結果可以看出,發送數據和接收數據完全保持一致,表明所設計的以太網收發模塊功能正常。

圖11 仿真測試結果

圖12 PING 功能和UDP 收發模塊功能驗證結果
最后,可以通過網絡抓包工具Wireshark 來觀察通信數據結構,分析傳輸數據。還可以對測試數據的傳輸速率進行測試,確定所設計的系統是否滿足要求。還可以通過任務管理器中的網絡資源來對速度進行進一步的驗證,測試結果如圖13 所示。在0.087 917 s 的時間內接收到了10 000 個數據包,每個數據包的數據為1 000 個字節,所設計的千兆以太網的實時數據傳輸速率為10 000*1 000*8/0.087 917=909.95 Mbps。在任務管理器窗口的聯網菜單中可以看到,網絡使用率為94.2%,網絡為千兆網,網速大約為950 Mbps,大于Wireshark 抓包計算最低速度。這是因為在任務管理器窗口計算網速的時候是將以太網數據幀的報頭也放在數據部分一起計算,這樣一來通過任務管理器的聯網菜單計算得到網速與Wireshark 計算相吻合,而且傳輸速度非常穩定。

圖13 實際速度測試結果
本課題以XILINX 的FPGA 硬件為平臺,設計并實現了基于UDP 協議的千兆以太網環境監測系統數據傳輸構架。首先,詳細介紹了UDP 協議千兆以太網的實現方式;其次,采用仿真軟件對所設計的系統構架進行功能仿真;最后,在XILINX 的FPGA 硬件平臺上進行實際性能測試。測試結果表明:筆者設計的基于UDP 協議的千兆以太網傳輸邏輯是正確的,傳輸速率最高可達到910 Mbps,能夠滿足大部分物聯網數據采集系統的實際需求,具有良好的可維護性、移植性和實際的推廣價值。