無線局域網是目前通信領域研究的一個熱點,其MAC層協議采用的是一種載波偵聽多址接入/沖突避免(CSMA/CA)的方式。對于無線局域網的分布式系統(DS)而言,可以采用有線的方式來實現,因此無線網與有線網的互連互通顯得很關鍵。
本文將介紹一種基于現場可編程門陣列(FPGA)來實現以太網(IEEE802.3)數據與無線局域網(IEEE802.11)數據的橋接與轉換,以完成有線接入與無線傳輸的網橋功能。
FPGA是與傳統PLD不同的一類可編程ASIC,它是將門陣列的通用結構與PLD的現場可編程特性結合于一體的新型器件,最早由美國Xilinx公司于1985年推出。FPGA具有集成度高、通用性好、設計靈活、開發周期短、編程方便、產品上市快捷等特點,它的門數可達100萬門以上。近年來,FPGA在通信系統的硬件設計方面應用的越來越廣泛。
系統硬件平臺設計及功能描述
該系統(以下稱為MAC板)處于PHY層(物理層)基帶處理板與客戶多媒體數據接入之間,一方面要將用戶數據接入系統,經過基帶處理后進行無線傳輸;另一方面,無線端解調解碼后的數據要經過該系統轉送給用戶。系統的硬件平臺設計首先考慮采用專用ASIC芯片,對于板內、板間自定義的接口采用FPGA編程來實現,見圖1。
發送方式(Ethe.net To Wireless):客戶端數據(模擬信號)由雙絞線從RJ-45接口進入隔離變壓器,隔離變壓器主要功能是隔離直流等干擾;模擬信號進入PHY芯片,濾波,整形,4B/5B解碼,從MII(Media Independent Interface)變為4位數據并行輸出;并行信號進入FPGA實現串行MPDU(MAC Protocol Data Unit)的生成;最后從基帶接口發送給后續部分,以實現無線傳輸。
接收方式(Wireless To Ethernet):接收是發送的逆過程。從PHY層基帶處理模塊來的串行MPDU數據流經FPGA處理后變成4位并行的符合IEEE802.3格式的數據幀,PHY芯片從MII接收數據,4B/5B編碼,轉化為MLT3(多電平傳輸)格式模擬信號,預整形,發送到隔離變壓器;信號經隔離變壓器,到RJ-45接口、雙絞線到達用戶端。
需要說明的是,該系統的MPDU并沒有完全按照無線局域網IEEE802.11規范來設計,而是作了很大的簡化,只力求把以太網的數據無線轉發同時能接收進來就可以,目的是給后續的研究提供一個基礎。IEEE802.3數據幀和MPDU幀格式如圖2所示。把IEEE802.3幀除去Preamble之外的部分當作MPDU的數據,內部并不作處理。由于最長的以太網幀為1518字節,所以Data域實際上控制在1.5K字節左右,用12bit表示長度已經夠了。
MII數據與MPDU之間的轉換
根據需求和成本綜合考慮,這里FPGA采用Xilinx公司的Virtex-E XCV300E器件。它具有高性能、大容量、處理速度快等優點,而且比起Virtex-Ⅱ系列的器件價格低廉。FPGA在這里實現的其實就是一個連續幀數據流的幀頭處理及并/串轉換。按照功能來說分為發送(Ethernet To Wireless)和接收(Wireless To Ethernet)兩個相對獨立的模塊。
發送模塊
主要負責給無線局域網PHY層提供數據流,大體描述其工作過程為:(1)從MII接收來的數據去掉Preamble后經雙口RAM緩存,再經一個4位寄存器作并/串轉換后輸出;(2)根據MPDU的需要,在數據輸出之前要先輸出表示幀長的Length,它由Write計數器計數產生,經Length存儲器緩存,再經一個12位寄存器作并/串轉換后輸出;(3)由兩個狀態機為核心構成控制部分,完成對整個數據流的控制。圖3給出了發送功能的框圖。下面將就主要模塊分別簡要說明。
前端同步處理:發送時10MHz以太網數據到達MII時分成4路并行,并提供2.5MHz輸入時鐘;接收時基帶處理部分除了提供數據MPDU,還提供了6.25MHz的輸入時鐘??紤]到數據、使能以及時鐘之間的相位關系可能會受傳輸路徑的影響而發生錯位,所以在接入時讓數據和使能都先經過由該時鐘觸發的D觸發器,使它們與時鐘的相位關系重新明確,以便于后續的處理。
DLL分頻模塊:由于該系統的需要,FPGA的工作時鐘不止一個,有的由輸入提供,有的必須由本地晶振產生再經FPGA分頻后得到。同時,隨MPDU一起輸出的6.25MHz時鐘也要由本地時鐘分頻得到。盡量利用FPGA的DLL資源(Delay-Locked Loop)來分頻,這樣可以提高時鐘質量。
雙口RAM:發來的每一幀不一定能及時處理(有可能這一幀還沒處理完,后面又來了很多幀),而且接收和發送時鐘頻率還不一樣。雙口RAM就是起到數據緩存的作用。這里收發兩個雙口RAM都是4bit 16K,即每個存儲單元為4bit,存儲深度是16K。每個RAM都是單向的,一端只負責收,另一端只負責發,收發時鐘獨立。實現上Xilinx ISE開發工具提供了RAM的IP Core,使用的是FPGA內的Block RAM資源。
Length存儲器:每一幀的數據長度不是一定的,而是有一個范圍,所以要用一個存儲器把雙口RAM里每一幀的長度(這里指Nibble數,每4bit稱為一個Nibble)都存起來。這樣一方面在讀數時能與讀計數器有個比較,知道什么時候這一幀讀完了;另一方面也是MPUD幀格式本身的需要,MPDU幀頭部分要加上12bit Length來表示幀長。
寫控制狀態機:寫控制狀態機由4個狀態組成,分別為空閑狀態(Idle)、判決狀態(Decision)、寫狀態(Write)、結束狀態(End)。
Idle狀態:把所有計數器、寄存器清零,等待著數據幀的到來。
Decision狀態:如果數據使能信號出現高電平,就跳到該狀態,完成的功能就是根據幀頭的Preamble來決定這一幀是接收還是丟棄。Preamble由15個1010和一個1011組成,如果連續收到8個或8個以上1010,然后再收到一個1011,那么就可以認為這一幀有效,否則就認為這一幀已經出現了嚴重的誤碼,或是使能信號置高是由于外界干擾而出現的假象,所以將這一幀丟棄,重新回到Idle狀態。
Write狀態:在該狀態下主要完成3件事。將數據并行寫入雙口RAM;啟動Write計數器,記錄這一幀共有多少Nibble;然后把Write計數器的值存入Length存儲器。
End狀態:這個狀態一方面完成全部使能信號的歸零,另一方面如果由于前面的處理使得數據和使能信號發生了錯位,在這個狀態就可以調整。
讀控制狀態機:根據需要,筆者設計的讀控制狀態機分別由搜索狀態(Search)、Length發送狀態(Tran_Length)、讀狀態(Read)、結束狀態(End)4個狀態組成。圖5給出了狀態轉移圖。
Search狀態:每15個時鐘周期就檢測一下雙口RAM中有沒有完整的幀。之所以要15個時鐘周期才檢測一次,而不時時刻刻都在檢測,是因為筆者要求每個MPDU之間的間隔至少為15個時鐘周期。如果有一個或一個以上完整的幀,而且基帶部分已經準備好,那么就跳到下一個狀態。
Tran_Length狀態:這個狀態下,12位寄存器里的值(表示的是該幀的Nibble數)轉換成Byte數,再串行移位發送出去。
Read狀態:這里開辟了一個控制計數器,從00到11以4個時鐘為周期循環計數,每個周期內都把雙口RAM里的一個Nibble裝載到4位寄存器內,然后再串行移位輸出,這樣就完成了數據的并/串轉換。同時啟動Read計數器,計數的值與12位寄存器里的值比較,如果相等說明該幀已經發送完畢了,就停止讀數。
End狀態:跟寫數時一樣,這個狀態主要完成使能信號歸零和錯位調整。
幀計數器:用來記錄雙口RAM里完整的幀的數量,只有當它的值大于或等于1時才能讀數,這樣才不至于讀空。 接收模塊
接收是發送的逆過程,在實現上與發送模塊有很大的相似性,本文不再贅述。
系統調試驗證
為了驗證該系統(MAC板)能否工作正常,可以搭建這樣一個實驗平臺。如圖6所示,去掉PHY層的基帶處理和無線傳輸部分,把兩塊MAC板直接相連,如果能實現兩臺計算機之間通信,就說明系統工作正常。
這里我們采用ping命令的方式進行驗證,主要考慮到,ping命令采用的是ICMP協議,并且會要求對方及時的返回ICMP Reply包,因此可以驗證該系統MAC板的雙向通路連通性。驗證結果表明,可以正確實現預期的功能要求。
結束語
該系統目前正應用在OFDM演示系統中。它采用專用ASIC和FPGA結合來進行設計,大大簡化了硬件設計的規模,很容易做到靈活性與高性能的結合,為下一步實現無線局域網的訪問控制與靜態路由等功能升級帶來很大方便。