熊光陽,王 野,李志茹,張維納
(桂林電子科技大學 電子工程與自動化學院,廣西 桂林 541004)
目前,系統設計中常用的高速數據傳輸接口技術有USB、PCI/PCI-E、千兆以太網和萬兆以太網接口等。而現在的計算機都提供千兆以太網卡,利用千兆網接口有著接口普及、設計成本低等優勢[1]。
為了實現千兆以太網圖像數據的傳輸,需要在硬件上實現MAC(數據鏈路層)和PHY(物理層)。現有的千兆網接口往往采用具有MAC 功能的IP 軟核來實現該部分的功能,該方案存在移植性差和消耗FPGA 資源量大的問題[2]。本文利用FPGA 可編程邏輯門陣列的特點,使用硬件描述語言實現MAC 功能,而物理層使用專用的PHY 芯片來簡化UDP/IP 協議中對物理層設計的工作[3]。

圖1 總體設計框架Fig.1 Overall design framework
構成千兆以太網圖像數據傳輸及圖像采集接口總體設計框架如圖1 所示。
FPGA 中設計邏輯接口對型號ov5640 的攝像頭工作方式進行初始化配置,攝像頭配置好后采集圖像數據。圖像數據進入FPGA 后,因為攝像頭輸出的圖像數據和千兆數據發送模塊的數據不在同一個時鐘域,所以在數據進入FPGA 后存入FIFO 緩存,千兆數據發送模塊讀取FIFO 中的數據,在千兆數據發送模塊中根據標準的UDP 數據包格式完成數據打包,該模塊輸出的UDP 數據包通過RGMII 接口傳輸至PHY 芯片,這里PHY 芯片執行的是千兆以太網的物理層功能,數據在通過PHY 芯片后就可以經由網線傳輸給下一級數據處理模塊。PLL 時鐘管理模塊完成的是對FPGA 內部模塊提供符合設計需要的穩定時鐘。本設計選用的PHY 芯片KSZ9031RNX 支持多種工作方式,PHY 配置模塊完成是對PHY 芯片的工作方式配置。
PLL 時鐘管理模塊完成的功能是向本設計的其他模塊提供時鐘,其中攝像頭系統時鐘24MHZ,配置攝像頭的IIC 接口時鐘100KHZ。為了簡化設計,對于這兩個模塊工作時鐘來源使用的辦法是調取PLL IP 核,經過外部輸入的50MHZ 時鐘倍頻產生;對于千兆以太網,FPGA 與PHY 間通過RGMII 接口通信,RGMII 支持全雙工,具有兩條不同方向的125MHZ 時鐘線,千兆數據發送和PHY 配置模塊的時鐘,來源于PHY 芯片向FPGA 輸入方向的時鐘。

圖2 千兆數據發送Fig.2 Gigabit data sending
當配置好攝像頭的初始化后,攝像頭就會按照一定時序一直輸出圖像數據。本設計配置的輸出數據是RGB565格式,速率60sf/s,720P 的圖像。而千兆UDP 數據包來源于對讀取的緩存FIFO 數據根據標準UDP 協議的封裝[4]。連續傳入FPGA 的圖像數據和需要封裝成UDP 數據包并外傳之間的速率和是時鐘不同,因而,就需要將采集到的圖像數據在FIFO 中緩存,再讀FIFO 取出數據封裝成千兆以太網UDP 包。由于圖像輸出時鐘和從FIFO 提取數據的時鐘不同,所以調用異步FIFO 來解決這一矛盾[5]。
本文選用的攝像頭是ov5640,支持IIC 通信協議訪問內部的配置寄存器[6],綜合考慮將其配置成主要參數為720P、60sf/s、rgb565、像素時鐘84MHZ 的輸出。
PHY 芯片支持全/半雙工速率自適應工作方式,本文根據設計需要將芯片配置成1000Mbit/s、全雙工工作方式。PHY 芯片支持軟件和硬件配置兩種方式,軟件配置方式和上文攝像頭配置類似,往相應寄存器寫入設計的工作方式對應的寄存器值[7]。本文采用硬件配置的方式,即在芯片功能引腳串接一定阻值的電阻使其獲得高電平狀態,在芯片上電后,串接相應電阻而獲得的電平狀態就會寫入其對應的寄存器,從而確定芯片工作方式。
千兆數據發送功能模塊完成的是將FIFO 緩存中取出的數據進行UDP 封裝再發送給PHY 芯片的過程,該模塊框架如圖2 所示。
數據成幀模塊的功能是將緩存的數據組成初步的千兆以太網幀[8],這里的初步千兆以太網幀指的是沒有加入IP CHECKSUM、UDP CHECKSUM 以及CRC 校驗的數據幀。在checksum 添加模塊中,根據UDP 協議計算出checksum的值,將這個計算出來的值填充進去初步以太網幀。CRC添加模塊功能與checksum 添加模塊類似,計算出crc 校驗值,然后將此計算出的值填充進已經添加有checksum 的上一模塊數據流。在本設計中選用PHY 芯片完成以太網的物理層功能FPGA 與PHY 通過RGMII 接口通信,oddr_ctrl 模塊完成的是將上一模塊輸出的數據轉換為符合RGMII 接口的數據形式。

表1 UDP/IP數據幀格式Table 1 UDP/IP Data frame format
2.5.1 千兆以太網協議
千兆以太網協議主要是UDP/IP 協議和RGMII 接口協議,UDP/IP 協議是將數據封裝成符合IEEE802.3a 標準的數據包的規則[9];RGMII 接口協議是FPGA 與PHY 通信的一種接口形式。在經典以太網標準下,設計千兆以太網UDP/IP 數據幀格式見表1。
一個完整的UDP 數據包應符合表1 的格式要求,其中前同步碼為連續的7 個55、1 個d8,它們共同表示一個幀的開始[10];目的地址6 個字節存放目的設備的物理地址,即MAC 地址;源地址存放發送端設備的物理地址;0800 表示IP 協議;包自增標志是為了數據接收端驗證數據在傳輸中有無丟失;IP 長度描述的是IP 首部字節數、UDP 首部字節數和用戶數據字節數的算術和;用11 表示UDP 協議;IP_CHECKSUM、UDP_CHECKSUM 以及CRC 是對數據差錯的一個校驗;IP 源地址和IP 目的地址分別表示數據發送端和接收端的IP 地址;PORT 源和PORT 目的分別表示數據在處理他們的應用程序傳輸的端口;用戶數據填充需要傳輸的數據。
RGMII 是本設計UDP/IP 協議棧中MAC(數據鏈路層)和PHY(物理層)之間的一種數據傳輸接口協議,本設計中的千兆數據發送模塊完成的就是MAC 功能,協議形式如圖3 所示。
RGMII 采用4 位數據接口,工作時鐘125MHZ,并且在上升沿和下降沿同時傳輸數據,傳輸帶寬可以達到1000Mbps。圖3 中TXC 和RXC 為數據傳輸時鐘,TX_CTL和RX_CTL 為數據有效信號,TD 和RD 為雙沿4 比特有效數據。本設計選用的PHY 芯片支持全雙工數據傳輸方式。

圖3 RGMII接口Fig.3 RGMII Interface
2.5.2 數據成幀
千兆數據發送模塊提取采集的緩存在FIFO 中的圖像數據,然后在數據成幀模塊中完成對數據的初步封裝,按照表1 所示的數據幀格式,在FPGA 中生成數據流的基本幀格式,除了IP_CHECKSUM、UDP_CHECKSUM 以及CRC校驗位,數據幀的其他部分都可以在這一模塊完成。
設計1 個UDP 數據流中含有1280 個字節的圖像數據,設置時鐘緩存FIFO 的深度為2000,當FIFO 中存夠1280個數據后,緩存模塊可以生產一個flag,數據成幀模塊接收到flag 信號后就可以開成組幀,組幀到表1 序號17 的位置時就可以拉高一個使能,該使能信號是讀FIFO 的使能,這樣將讀取到的FIFO 數據填充到數據幀的用戶數據位置。
2.5.3 checksum添加
CHECKSUM 包 括IP_CHECKSUM 和UDP_CHECKSUM的計算以及將這兩個的計算結果填充進數據成幀模塊中原本用8’h00 代替的位置處。IP_CHECKSUM 和UDP_CHECKSUM 的計算是將一定范圍內的數據按照每相鄰2byte 即16bit 作為一組,把每組的這16bit 數據相加,如果計算和大于FFFF,那么就把超出FFFF 的部分與計算和的低16 位相加,直到結果為16bit。最后的結果取反即為CHECKSUM。其中,IP_CHECKSUM 計算的范圍包括以太網數據幀中的IP 版本到IP 目的地址之間的數據,UDP_CHECKSUM 計算的范圍包括從PORT 源到最后一個用戶數據結尾之間的部分。
因為計算CHECKSUM 結束后,數據流已經到了一幀數據的末尾,這樣就不能在正確的位置填充CHECKSUM。設計在計算CHECKSUM 的同時將數據存入RAM,待計算完成后讀取RAM 數據,然后將計算好的CHECKSUM 填充進讀出來RAM 數據的CHECKSUM 正確位置處。
2.5.4 crc添加
數據經由千兆網傳輸,實際上傳輸的是數據和校驗碼的組合——碼字,這樣的算法是對整個數據幀在傳輸過程中正確性的校驗,其中校驗碼的生成依據的是CRC 校驗算法,在數據接收端根據再計算一遍碼字與發送端的碼字相比較來判斷傳輸差錯與否。

圖4 實驗驗證系統Fig.4 Experimental verification system
2.5.5 oddr_ctrl
在千兆數據發送模塊中處理的數據是8bit 位寬,對應125Mhz 系統時鐘,FPGA 與PHY 芯片通過RGMII 接口連接。RGMII 接口協議上文已有闡述,傳輸的是雙沿4bit 數據。因此,需要在oddr_ctrl 模塊中把系統的單沿8bit 數據轉換成雙沿4bit 數據,實現與PHY 芯片的正確通信,這里的處理辦法是在vivado 中調取IP 核oddr。模塊中設計的數據位轉換條件是邊沿觸發,雙沿數據指的是在時鐘線上升沿和下降沿同時轉換數據。使用RGMII 接口可以在保證千兆帶寬的前提下,節省FPGA 的引腳使用。
實驗驗證的主要內容是硬件設計的正確性。實驗驗證系統如圖4 所示。
設計的實驗是將千兆以太網數據發送向PC,在抓包軟件wireshark 上抓取實時數據包,攝像頭采集的分辨率是1280×720、格式RGB565 的圖像。在設計UDP 包時,一包UDP 數據幀填充1280 個字節,一張圖片需要填充這樣的UDP 包1440 個,而UDP 數據幀除開用戶數據外,還有幀頭、校驗字、IP 地址等這些表1 所描述的部分,一共1332 個字節;設計FPAG 的IP 地址192.168.0.1,即以太網的IP 源地址,向PC 發送廣播包即IP 目的地址255.255.255.255;為了驗證沒有丟包設計自增1 標志每發送一包數據該標志自加1,該標志從1 計數到1440(1440 的十六進制是05a0)。觀察wireshark 界面上抓取的數據幀,抓取的實時數據傳輸到PC 端wireshark 截取界面如圖5 所示。
圖5 是截圖的一張圖片發送的第一個UDP 數據包和最后一個數據包,圖中方框標志2 處是抓取UDP 數據幀的長度,和實驗設計FPGA 發送端一樣;圖中方框標志3 是以太網接口的IP 源地址和目的地址,和實驗設計FPGA 發送端一樣;圖中方框標志4 是自增1 標志,其計數范圍和設計一樣;實驗截取的數據包的范圍在圖5 中的標志1 處,(b)圖相對(a)圖共有數據包568231-566792+1=1440。實驗結果表明本設計是正確可靠的,符合設計預期。

圖5 抓包截取結果Fig.5 Capture results
本文采用FPGA+PHY 的架構,利用FPGA 實現了千兆以太網傳輸系統。該系統具有較高的可靠性,且易于實現,對于一些成本低、體積小,速度要求較高的圖像記錄器設計具有重大的應用價值。