一种基于FPGA的无线局域网接入实现
无线局域网是目前通信领域研究的一个热点,其MAC层协议采用的是一种载波侦听多址接入/冲突避免(CSMA/CA)的方式。对于无线局域网的分布式系统(DS)而言,可以采用有线的方式来实现,因此无线网与有线网的互连互通显得很要害。本文将介绍一种基于现场可编程门阵列(FPGA)来实现以太网(IEEE802.3)数据与无线局域网(IEEE802.11)数据的桥接与转换,以完成有线接入与无线传输的网桥功能。
FPGA是与传统PLD不同的一类可编程ASIC,它是将门阵列的通用结构与PLD的现场可编程特性结合于一体的新型器件,最早由美国Xilinx公司于1985年推出。FPGA具有集成度高、通用性好、设计灵活、开发周期短、编程方便、产品上市快捷等特点,它的门数可达100万门以上。近年来,FPGA在通信系统的硬件设计方面应用的越来越广泛。
系统硬件平台设计及功能描述
该系统(以下称为MAC板)处于PHY层(物理层)基带处理板与客户多媒体数据接入之间,一方面要将用户数据接入系统,经过基带处理后进行无线传输;另一方面,无线端解调解码后的数据要经过该系统转送给用户。系统的硬件平台设计首先考虑采用专用ASIC芯片,对于板内、板间自定义的接口采用FPGA编程来实现,见图1。
发送方式(Ethernet 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结合来进行设计,大大简化了硬件设计的规模,很轻易做到灵活性与高性能的结合,为下一步实现无线局域网的访问控制与静态路由等功能升级带来很大方便。