时间:2022-06-30 01:43:38
摘 要:介绍了集中式插入法帧同步系统的原理,分析了帧同步系统的工作流程。采用模块化的设计思想,利用VHDL设计了同步参数可灵活配置的帧同步系统,阐述了关键部件的设计方法。在Xilinx的FPGA器件XC3S200?4FT200上对帧同步系统进行了实现,利用Modelsim 6.0软件进行了仿真测试。仿真结果表明,同步系统工作稳定,满足性能要求。
关键词: 帧同步; FPGA; VHDL; 模块化
中图分类号: TN914?34 文献标识码: A 文章编号: 1004?373X(2013)15?0069?04
Design of frame synchronization system based on FPGA
DU Yong, LIU Di?ying
(Jiuquan Satellite Launch Center, Jiuquan 732750, China)
Abstract: The principles and work flow of centralized plug?in frame synchronization system are described and analyzed. Modular programming idea is used to design a frame synchronization system which synchronization parameters can be flexibly configured based on VHDL. The design methods of key components are described in detail. The frame synchronization system was implemented on XC3S200?4FT200 of Xilinx FPGA, Modelsim 6.0 software is used in the simulation test. The simulation results show that the system is stable and can meet the performance requirements.
Keywords: frame synchronization; FPGA; VHDL; modularization
0 引 言
在数字通信系统中,发送端一般以一定数目的码元组成一个个“字”或“句”,即组成一个个数据帧进行传输,因此帧是数据传输的基本单位。不同的通信系统具有不同的帧结构。帧一般分为帧同步码和数据两部分,帧同步码用于标志帧的起始位置;数据则是需要传输的有效码元。帧同步码组的插入方法主要有两种[1]:集中式插入法和间隔式插入法。集中式插入法就是在每帧的开头集中插入帧同步码组的方法;间隔式插入法则是将帧同步码组分散插入到数据流中,即每隔一定数量的信息码元插入一个帧同步码元。本文主要讨论集中式插入法帧同步的FPGA实现。
一般来讲,帧同步在位同步之后才能进行。虽然信号的频率很容易由位同步信号经过分频得到,但是帧的起始和末尾时刻则无法由位同步信号分频确定[2]。帧同步的主要任务就是要获取每个数据帧的起始及结束位置。随着可编程逻辑器件的发展,采用FPGA实现帧同步等数字系统具有速度快、使用方便、可编程配置各种参数等一系列优点,因而得到了越来越广泛的应用[3?5]。
1 集中式插入法帧同步的原理及流程
1.1 集中式插入法帧结构
集中式插入法是指在每帧数据的开始位置集中插入帧同步码序列的方法。在这种同步传输方式中,被传输的数据比特被编成帧,每帧包括多个数据,帧的首部加一个帧同步码组(也称为帧的标志字),记作U,其长度为[M](单位:b),帧内的数据比特数为[D。]接收端对接收的比特流进行搜索,一旦检测到标志字U,就知道了一帧数据的开始,并据此对帧内的数据进行分组处理,以此建立起同步传输机制。集中式插入法的数据帧格式如图1所示。
图1 集中式插入法的数据帧格式
显然,帧同步码组必须满足一定的条件[2]:首先,同步码组要求尽量与所要传输的数据不同,以免将数据误认为是同步码组;其次要求帧同步码组具有尖锐单峰的自相关特性,以便于接收端进行正确检测;第三个要求是长度不能太长,以免占用过多的信道资源。目前常用的帧同步码组主要有广义巴克(Barker)码序列,一些系统也使用具有伪随机特性的m序列作为同步码组[3?6]。
1.2 帧同步的几种状态
根据帧同步搜索的原理,在帧同步搜索过程中显然存在假锁的可能性(也称虚警概率),因为数据比特所构成的码序列,或部分的标志字与部分的数据比特所构成的长度为[M]的码序列也有可能满足检测条件,而被误认为U。因此,为了提高帧同步系统的性能(减小假锁的概率,锁定后尽量增加同步的稳定性),工程上通常通过增加同步流程的复杂性来实现改善性能的目的。一般来讲,将帧同步的过程分为三个状态:搜索态、校核态和同步态,其状态转移图如图2所示。
图2 帧同步过程的状态转移图
搜索态:在数据接收的起始时刻,或帧校核时出现未同步帧,或同步态时发现有多个连续帧未同步时转入搜索态。搜索态下,程序在数据流中持续搜索帧同步码,当从接收到的比特流中找到帧同步码时,表明已搜索到了一个同步帧头,此时输出一个脉冲信号,系统可进入校核态。
校核态:若连续经过[N]帧同步码确认搜索态中找到的帧头正确,则系统可立即转入同步状态;否则说明存在假同步,需要返回搜索态重新对帧同步码进行搜索。由首次搜索到帧同步头到进入同步态的[N]帧时间叫做后方保护时间。
同步态:帧同步系统处于同步状态时,若没有出现连续[M]帧数据未同步,则保持在同步状态。考虑到接收的数据流中可能受外界干扰而存在误码,在同步状态中只有连续[M]帧丢失同步码才进入失步状态,并返回搜索态,这个[M]帧的时间叫做前方保护时间。
2 帧同步系统的VHDL设计与仿真
2.1 总体结构设计
根据实例需求,帧同步码组长度(LenCode)、帧同步码组(FrameCode)、容错位数(ErrorNum)、帧长(LenFrame)、校核态校核帧数(CheckNum)以及同步态校核帧数(SyncNum)均以常量的形式设置,便于VHDL程序中修改同步参数。系统数据速率及时钟频率为50 MHz。
根据图2所示的结构,很容易想到采用状态机的设计方法来实现同步系统[3?5]。不论是采用状态机方式,或原理图方式进行VHDL程序设计[7],最终均可以转换成VHDL代码的形式。显然,直接采用编写VHDL代码的形式,更利于程序的修改及升级维护。因此,本文完全采用代码编写方式来进行程序设计。
图2是一个典型的状态转移图,可以将转移条件看作状态之间的信号接口。整个帧同步系统可以划分为搜索状态模块(Search)、校核状态模块(Check)及同步状态模块(Sync)。除了上电后启动搜索状态之外,当校核未通过(CheckNum帧内有一个校核帧未同步)或同步态失锁(连续SyncNum帧未同步)时也需启动搜索状态,因此搜索状态的启动信号有复位信号(rst)、校核态重搜索信号(Research_check)和同步态重搜索信号(Research_sync);校核态的启动信号仅来自于搜索态(search_over),即只有当搜索到帧同步码后才能转入校核态,如果校核通过则送出校核完成信号(check_over),校核未通过则送出重新搜索信号(Research_check);同步态的启动信号仅来自于校核态(check_over),只有校核通过后才能进入同步状态。进入同步态后,持续对同步码组进行检测,当检测到重新失锁后送出Research_sync,重新启动搜索状态。图3为帧同步系统顶层VHDL程序文件采用Synplify Pro综合后的RTL原理图。
2.2 搜索模块的VHDL设计与仿真
搜索模块的对外接口如图3所示。其中,CLK_BitSync及Data_in分别为位同步时钟信号和输入数据;Data_out为经2个时钟周期延时后的比特流数据。对输入数据的延时处理,是为了补偿产生search_over时的处理时延,以便于脉冲信号search_over与最后一位帧同步码对齐。
搜索输入比特流中的帧同步码组,首先需要将输入数据送入移位寄存器(Regdin)中,而后将Regdin中的数据与帧同步码组相比即可。程序中将多路启动信号(rst、Research_check、Research_sync)取或后,作为异步复位信号,用于启动一次搜索过程。搜索过程中,采用for循环对寄存器Regdin与同步码组进行比较,通过逐位比较,每发现1 b不相同,则计数加1,计算出两者之间的汉明距离。计算完汉明距离后,判断是否大于容错门限ErrorNum,如大于容错门限则继续搜索,否则输出同步脉冲search_over,并停止搜索。
图4为搜索模块的Modelsim仿真波形。其中,帧同步码长度LenCode=7,帧同步码FrameCode= “1011000”,容错门限ErrorNum=1。可以看出,复位后首先搜索到一次帧同步码组;当Research_check为高电平,启动另一次搜索过程,比特流中搜索到“1001000(ErrorNum=1)”时,此时容错位数设置为1,因此输出同脉冲search_over,并停止搜索过程,即使后续比特流中出现了“1011001(ErrorNum=1)”,仍然不输出同步脉冲。
图4 搜索模块Modelsim仿真波形图(ErrorNum=1)
2.3 校核模块的VHDL设计与仿真
为便于程序编写,校核模块主要由Check_Ce进程和Checking进程组成。Check_Ce进程用于检测search_over信号,检测到信号出现高电平后,产生长度为CheckNum帧数据的高电平允许信号CheckCe,并通过计数器Number来标识每帧中数据及同步码组的位置。产生了CheckCe及Number信号后,Checking进程只需在CheckCe信号为高电平的范围内对同步码组进行校核即可。校核完成后,需要使check_over(连续CheckNum帧均同步)或research_check(CheckNum帧内有一帧未同步)信号产生一个高电平脉冲。帧校核的方法与搜索同步码组的方法类似,即通过汉明距离来判断是否同步。将校核态分成Check_Ce进程和Checking进程来分别进行实现,则每个进程的功能划分更为简单,编程实现时也相对容易得多。
图5是校核模块的Modelsim仿真波形。其中,帧长度LenFrame=16,校核帧数CheckNum=2,容错门限ErrorNum=0,其余参数与搜索模块相同。从波形上很容易看出,当search_over第一次出现高电平时,其后连续两组同步码均为“1011000(ErrorNum=0)”;当search_over第二次出现高电平时,其后第一组同步码为“1001000(ErrorNum=1)”,第二组同步码为“1011000(ErrorNum=0)”。因此第一次帧校核顺利通过,校核完成后check_over输出一个高电平脉冲,research_check保持为低电平;第二次校核未通过,校核完成后research_check输出一个高电平脉冲,check_over保持为低电平。
图5 校核模块Modelsim仿真波形图(ErrorNum=0)
2.4 同步模块的VHDL设计与仿真
为了简化设计,将同步状态分为三个进程来完成,即计数器进程(Counter)、帧校验进程(FrameChecking)和同步校验进程(SyncChecking)。Counter进程用于产生帧内数据位置的计数,当检测到check_over信号为高电平时,重新开始以帧周期(LenFrame)循环计数;FrameChecking进程用于产生帧起始位置的同步脉冲,且高电平脉冲与同步码的最后1 b对齐,该进程首先需要对同步码组进行校核,如校核通过,则在同步码位置处产生一个高电平脉冲FramePosition,如果校验未通过,则在同步码位置不产生高电平脉冲;SyncChecking进程通过判断FramePosition来确定系统是否处于同步状态,即只需判断FramePosition是否连续在同步码组的位置出现低电平,如连续出现SyncNum次低电平,则判断为失锁,否则继续维持同步状态。
图6是同步模块的Modelsim仿真波形。其中同步态校核帧数SyncNum=2,其他参数与校核态相同。从图中可以看出,当检测到check_over为高电平时,计数器Number开始以周期为帧长LenFrame=16循环计数。当check_over出现高电平时,其后连续4组同步码为“1011000(ErrorNum=0)”,“1001000(ErrorNum=1)”,“1001000(ErrorNum=1)”,“1001000(ErrorNum=1)”。由于此时设置的容错门限ErrorNum=0,因此第一帧同步码校核通过,输出了同步脉冲FramePosition,此后出现连续3个校核未通过的数据帧。同步状态信号State_Sync高电平状态持续维持了2帧数据的长度,而后停止同步状态,输出失步信号research_sync,用于启动搜索过程。
图6 同步模块Modelsim仿真波形图(ErrorNum=0)
3 帧同步系统的FPGA实现及仿真
本实例的目标器件为XC3S200?4FT200,FPGA实现后,查找表资源(LUTs)占用了484个(12%),全局时钟资源(GCLKs)占用了1个(12%)。最高系统时钟频率(Maximum frequency)可达54.81 MHz。图7是帧同步系统的Modelsim仿真波形。其中,各模块的容错门限ErrorNum均为0,其他同步参数不变。
图7 帧同步系统Modelsim仿真波形图
图7实际上对帧同步系统的搜索、校核、校核未通过、失步、重新搜索、重新同步等过程进行了完整的仿真测试。下面根据图中的标号顺序对同步系统的各个状态进行分析。①系统上电,复位信号rst由高电平变为低电平后,首先启动搜索过程,搜索到同步码时输出search_over脉冲;②检测到search_over后,转入校核过程,由于连续通过2个数据帧的校核,输出校核通过脉冲check_over;③检测到check_over后,转入同步过程,在同步状态下检测到1个未同步帧(“0010000”),由于不是连续出现2个未同步帧,因此保持同步状态;④在同步状态下连续检测到2个未同步帧(“0010000”),停止同步状态,输出research_sync高电平脉冲,重启搜索过程;⑤重新搜索到同步码后,输出search_over脉冲,重启校核过程,但校核过程检测到了一个未同步帧,输出research_check脉冲;⑥research_check脉冲再次启动搜索过程,搜索到同步码后输出search_over脉冲;⑦search_over启动校核过程,且通过了校核,输出check_over脉冲;⑧check_over启动同步过程,在同步状态下,连续检测到2个未同步数据帧,再次输出失步脉冲research_sync;⑨Research_sync重启搜索过程,搜索完成后输出search_over脉冲,启动校核过程,校核通过,输出check_over脉冲信号,重新回到同步状态。
4 结 语
本文基于模块化设计思想,采用VHDL语言对帧同步系统进行设计实现,有利于程序的移置及维护。设计的关键在于理解各模块之间的信号接口关系及时序关系。在模块设计时,通过进一步合理划分模块内部的结构,可以更好地理清程序思路并提高设计效率。
参考文献
[1]樊昌信,张莆翊,徐炳祥.通信原理[M].5版.北京:国防工业出版社,2001.
[2]郭梯云,刘增基,詹道庸.数据传输[M].2版.北京:人民邮电出版社,1998.
[3]陈惠珍,包天珍.一种基于FPGA的帧同步提取方法的研究[J].电子技术应用,2003(10):70?72.
[4]李世超.基于FPGA的集中插入式巴克码帧同步的实现[J].数据通信,2010(6):33?35.
[5]孙志雄,李太君.基于FPGA的高速数字相关器设计[J].微计算机信息,2009,25(17):254?255.
[6]查光明,熊贤祚.扩频通信[M].西安:西安电子科技大学出版社,1997.
[7]杜勇.FPGA/VHDL设计入门与进阶[M].北京:机械工业版社,2011.