首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

用System Generator实现无线通信中分组数据的检测

用System Generator实现无线通信中分组数据的检测

从自己正式学习FPGA开始算来已经有大半年了,和众多FPGA老手数十年的经验相比自己的确是菜鸟中的菜鸟。不管怎么说,今天我也要写下一点东西,一来和大家分享,二来和大家一起讨论学习和使用FPGA的方法。记得一次研讨会上我听专家说学习FPGA可以从三个方向入手,分别是,DSP,高速收发器和嵌入式。个人认为基于System Generator图形化的设计方法必将是未来DSP设计的主流方法。因为相对于传统的代码方法,System Generator图形化的操作方法使整个系统能快速地集成,比写代码明显要方便快速许多,这对于产品面世时间有严格限制的设计来说尤其具有吸引力。好了,闲话少说,下面开始正题。
无论在什么通信系统中,收发机的同步都是始终最重要最核心的问题。分组检测即帧同步是接收机前端最先需要完成的。只有正确地检测到数据的开始和结束,后续的载波同步、符号同步才能进行。无线通信中,在一组数据前面会加上事先设计好的前导序列(又称训练序列),便于接收机做帧同步。本设计针对IEEE802.11a系统,其前导结构中有连续十段长度为16的短训练序列,利用这十段序列可以完成分组检测、AGC、粗频偏估计和符号同步。这里我们将利用System Generator实现分组检测。
依据的算法是延时相关加长度保持。基本原理为:
1.将接受到的连续的两段数据作相关运算,相关的长度与每一段的训练序列相同。
2.当没有数据分组到达时,接受信号r中只有噪声,相关值应该非常小,理论上为0.
3.当有数据分组到达时,接受信号r中包含信号分量和噪声分量,因为发送的前后两段训练序列完全相同所以相关值比全是噪声的情况要大许多。
4.考虑到实际的接受机接收到的信号的能量会不断地变化,因此将上述相关值对信号能量做归一化处理。即:

若归一化之后的值大于1,且连续保持32个时钟周期,将指示信号Frame_find置高,即认为有分组数据到达。
5.训练序列之后紧跟的是我们需要发送的有效信息,当Frame_find=1时,本设计模块将接受到的信息传递给下一级处理。当发送端分组数据发送完毕,本设计模块需要判断分组数据是否结束,我采用的方法计算每一段接收信号的能量,若该能量值小于前面接收到的训练序列能量的k倍(k=16)则令end_temp=1,若它连续保持40个时钟周期则认为分组数据结束,即Frame_find=0.
延时相关算法的示意图如下:

利用system generator做DSP关键是要将算法分的足够细,能分到RTL级最好,将算法的元素与system Generator模块库中的模块做映射。不好实现的逻辑可以通过Black box模块嵌入代码来实现。设计中的Frame_detection模块就是利用黑盒子做的。下面分析算法中的各个部分是如何在System Generator中实现的。
(1)输入的实部和虚部分别通过Addressable Shift Register延时16个时钟周期,当前输入的数据与16时刻前的数据做相关运算。如果是写代码的话,完成这个过程是非常繁琐的,但在System Generator中却显得很高效,主要是调用4个乘法器模块完成两个复数的相乘运算,再调用Addressable Shift Register模块实现滑动求和运算,最后将累加和的实部、虚部取绝对值再相加作为相关值幅值C的近似。之所以做这种化简是因为求幅值需要开方运算(可以用Cordic模块做),只要对门限做适当的调整做这种简化并不会影响性能。设计如下:

(2)能量P的计算同类似,做乘法运算再相加后便是实数。设计如下:

(3)这里判决门限Threshold取1/2 ,将P向右移一位,若C>(P>>1),则begin_temp置高。
(4)因为我们需要在数据分组结束时能检测出来,所以应该判断接受信号能量值是否小于某一门限。因为实际的信道是时变的,信道对信号能量的衰减我们都不知道,所以这个门限我们不能事先自己设定。我采用的方法是,当分组数据到达时将接受到的训练序列能量P0锁存,之后接受到的信号能量与这个锁存值的k倍进行比较,若P>4)则将end_temp置高。其中需要将Frame_find反馈到end_temp模块的输入.在end_temp模块的内部调用一个Delay和And模块来检测Frame_find的上升沿.
分别如下图所示:


(5)Black box模块Frame_detection检测begin_temp是否持续拉高32个时钟周期,若是则拉高Frame_find,即分组数据到达。此时若end_temp持续拉高40个时钟,则将Frame_find置低,即分组数据结束。
(6)当Frame_find==1时,必须保证将输入的数据传递给下一级,不能有数据的丢失。同样,我调用Adrressable Shift Register对输入数据进行缓存后输出,缓存的时长必须保证不小于前面的计算-判决时长。考虑到前端ADC的精度为12bit,设计的输入bitInR(实部)、bitInI(虚部)及输出Out_Re、Out_Im的格式均为Fix12_0.整个设计的如下图:


(7)最后我们来看一下仿真结果

图中红色的信号Frame_find为输出数据有效的指示。模块的输入数据为10段训练序列后加两个周期的正弦波,输入数据被高斯噪声污染。整个设计在XC5vsx50t-3ff1136平台上的资源消耗情况如下:

总结:从上述流程我们可以看到利用System Generator进行DSP的设计是相当快速、高效的,只需简单地用鼠标将模块相连就完成了IP核的调用。在开始设计之前必须将算法划分的足够细致,以便与模块库中的模块做映射。个人觉得System Generator非常适合做“流”式的数据处理,完成并行的数据运算特别方便。对于像循环之类的算法就不是太好处理了,但是利用好SystemGenerator最关键的不是让它实现C语言式的算法,而是从算法的一开始就用并行的思维去设计,这才是最最核心的问题!
附件大小附件大小suanfa.JPG9.23 KBthreshold.JPG3.29 KBxiangguan.JPG78.96 KBnengliang.JPG30.05 KBpanjue.JPG43.83 KBtop.JPG86.46 KBsimulate.JPG88.43 KBresource.JPG58.96 KBsuocun.JPG25.33 KB
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表