扩频通信中伪随机序列编解码器的FPGA实现
扫描二维码
随时随地手机看文章
1 扩频通信技术及理论基础
扩频通信技术一般是将待传送的信息数据被伪随机编码(扩频序列:Spread Sequence)调制,实现频谱扩展后再传输;接收端则采用相同的编码进行解调及相关处理,恢复原始信息数据。
一种典型的扩频系统的物理模型如图1所示。
2 扩频系统的伪随机序列
在扩展频谱通信系统中,伪随机序列起着很重要的作用。在直扩系统中,用伪随机序列将传输信息展宽,在接收时又用它将信号压缩,并使干扰信号功率扩散,提高了系统的抗干扰能力;在跳频系统中,用伪随机序列控制脉冲发送的时间和持续时间。由此可见,伪随机序列性能的好坏是一个至关重要的问题。
m序列是最常用的一种伪随机序列。它是最长线性反馈移位寄存器序列的简称。是由带线性反馈的移位寄存器产生的序列,并且具有最长的周期。
带线性反馈逻辑的移位寄存器设定各级寄存器的初始状态后,在时钟触发下,每次移位后各级寄存器状态会发生变化。观察其中一级寄存器(通常位末级)的输出,随着移位时钟节拍的推移会产生移位寄存器序列。它是一个周期序列,其周期不但与移位寄存器的级数有关,而且与线性反馈逻辑有关。此外,周期还与移位寄存器的初始状态有关。
一般情况下,n极线性反馈移位寄存器的构造如图2所示。
图中,ci(i=0,1,···,n)表示反馈线的连接状态,ci=1表示连接线通,第n-i级输出加入反馈中;ci=0表示连接线断开,第n-i级输出为参加反馈。因此,一般形式的线性反馈逻辑表达式为:
将等式左边的an移至右边,并将an=C0an(C0=1)代入上式,则上式可以改写为:
并称之为线性反馈移位寄存器的特征多项式。特征多项式与输出序列的周期有密切的关系,一个产生最长线性反馈移位寄存器序列(即m序列)的n级移位寄存器,其特征多项式必须是n次的本原多项式。
3 设计模块图
设计选择用(12,8)线性分组码、5级M序列从2倍噪声中恢复原始信号, 整个系统的构架如图3所示。
整个系统分为6大模块,分别实现不同的功能。其中包括两个行为模块:信号产生即顶层测试模块(Signal)、模拟信道加噪模块(add_noise);4个可综合模块:汉明码编码和解码模块(ham_code、ham_decode)、m序列编码和解码模块(m_code、m_decode)。
首先要解决帧同步的问题,即如何在对真正信号进行m序列解码之前判断已经达到完全的同步。在发送实际信号之前,发送一个8位的同步头数据1111110,在接收端开始时每进入一个信号就进行一次乘法加法运算,选取一个比较大的阈值,只有在开始接收到一个超过阈值的信号之后才认定达到了完全的同步;在此之后进行同步解码,等收到第一个0信号之后,进入数据接收状态,这样就解决了如何同步的问题。在进入数据接收状态后,每收到480个(实际发送400个,经汉明码编码后变为480个)信号就进行下一次寻找同步的状态,也就是重新发送一个8位的同步头信号,重复上面的过程,再次达到同步,继续接收下480个信号。这样即使产生频率错位也只会在480个信号的后几个信号产生错误,不会保持很多的错码,是个很好的方案。
3.1 时钟信号
此处把M序列时钟信号连接到FPGA管脚上,clk_1及其31倍频clk_31,其中clk_31时钟频率为20MHz(如图4所示)。为验证此时钟信号,选用RIGOL DS1102CD数字存储示波器。DS1102CD数字存储示波器是可选装16通道逻辑分析仪的混合信号示波器,可以将16路数字信号和2路模拟信号同时显示到屏幕上,它具备400 MSa/s实时采样率、25 GSa/s等效采样率和1M的存储深度,且体积小巧、触发灵敏度可调,很适合日常实验使用。
3.2 ham_code,ham_decode模块
汉明码编解码模块的内部框图如图5所示,其中s_p,p_s分别为串行转并行和并行转串行模块。由于汉明码的编解码过程是对并行数据进行处理,所以需要将输入的串行数据流进行转换,编解码完毕以后再转换为串行。
两个模块联合仿真结果如图6所示,p_out_link信号为并行输出控制信号,error为错误指示位。先把串行数据流依次读入8位移位寄存器,每读入8个数据,产生一个p_out_link脉冲,将移位寄存器中的数据并行输出;经过汉明码编码后变为12位并行数据;在p_s模块,把12位并行数据读入寄存器,再依次移位输出,即完成了编码的过程。解码过程与其类似。从图中可以看到,经编码后8位数据(如11011010)变为12位(1101101011100),之后又可解码出原数据,说明这两个模块的设计达到了预期效果。
3.3 m_code模块
当本模块中的数据采样时钟信号clk_1的上升沿来临的时候,对同步头信号或者要发送的随机数据信号进行采样,并将采样值存在输入数据寄存器indata_buf中。由clk_31控制产生m序列的移位寄存器进行循环,产生相应的m序列串(包含0、1信号),完成编码的过程。在本模块中还同时进行了发送信号的调制过程,也就是在产生m序列串的同时对其完成相应的调制:将信号1调制为2位的01(带符号位的+1)信号;将信号0调制为2位的11(带符号位的-1)信号。
图7中最下边的信号shift_buf就是产生m序列的5级移位寄存器,通过查表知道产生5级m序列的本原多项式为x5+x2+1,推出其线性反馈逻辑表达式为a5=于是将一个+1数据信号编码并调制为相应的+M序列串:1 -1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 1 1 -1 -1 -1 1 1 1 1 1 -1 -1 1 1 -1 1 -1 -1;相应的0信号对应于一个-m序列串。每进来一个clk_31上升沿就根据indata_buf中存的待发数据和移位寄存器的相应关系发送一位信号,将待发送的信号转化为与之对应的±m序列串。
3.4 addnoise模块
此模块是一行为模块,模拟的是实际传输过程。这个模块相对比较简单:将前一个coder模块产生的m序列串(unnoised_data)读入之后加入带符号的2倍噪声(noise<=random % 3产生最大值为2的随机数),这样所得到的就是加入噪声的接收端信号(noised_data)。
图8中可以看到, noised_data=unnoised_data+noise。也就是说在clk_31的上升沿到来的时候,将收到的M序列串与随机噪声相加,得到加噪声的信号,在接收端进行相应的解调,恢复原有信号。
3.5 decoder模块
当接收到同步头结束信号0之后,就进入了同步解调主体部分。在coder模块中曾经说过,为了解决编码和解码时钟不完全一样的问题,在每发送480个数据之后重新进行一次同步查找过程。这由其中的一个计数器main_counter来控制,当查找到同步头结束0信号之后,开始对main_counter进行计数加1。当main_counter计数到480后,进行同步头再次检测,再次达到同步之后重复上面的步骤。所以每次解码只能得到480个数据,要进行多次的过程才可以将一个完整的信息完全发送到接收端。
在这里需要对程序中的一些细节与对应的图像进行比较详细的说明。
首先,在同步头的判断时选取的阈值是28。在寻找同步的过程中,如果接收到的31个信号和本地的31位M序列没有完全同步,则由于M序列的性质使得累加的结果比较小,一般小于10,即使在噪声的干扰下也不会超出20的水平;但是如果两者完全同步,累加的结果应当在30左右。所以在这里所选取的阈值为28。
第二,在本模块中,不论是寻找同步头还是同步解码,对解码用到的累加器所赋的初始值都为50。也就是说,在上面介绍的判断同步头的过程中,在对每一个输入数据都进行累加之后,实际选取的阈值是50+28=78。这样做的目的很简单,为了方便计算和相应的判断。因为输入的信号可能是正的也可能是负的,所以所做的运算也可能是加法或减法。如果把基准值都赋为0,那么在电路实现的过程中,举个很简单的例子:9位的累加结果寄存器如果为0(二进制表示为2’b000000000),加上输入信号-2(即带符号的3’b110),本应当产生-2的结果,但是在实际硬件实现的时候却不能得到所要的答案。它的运算方法为:
可以从上面的运算结果中清楚地看出,直接在0的基础上进行加减运算会出现预料之外的结果。这种方法只有通过相应的扩位运算才可以达到所要的结果。也就是说对于输入的3位信号(indata),必须将其扩充成为相应的9位值才可以跟sum进行加减运算。还是以上面数据为例,在indata(2’b110)数据一进来就将其扩展成为带符号位9位的数据(9’b111111110),两者都是表示带符号位的数据-2,但是后者和sum进行加减时就不会出现上面的问题。
但是这样对于这种方法来说,远不如直接将累加器sum的初始值设定为50方便,这样一来就只在正数的范围内进行考虑。同样的到达同步解码状态后,实际也不是将0定为判断基准,而是50。通过如图9所示的图像可以看出来。
上面的图形是在找到同步头之后进行同步解码的开始情况。最上面两个信号是输入信号indata和将输入信号经过绝对值运算得到的结果psumi,将带符号的3位信号转化为不带符号的2位数据,再根据与第j位+M序列符号位与输入数据符号位的比较,选取相应的加法或者减法运算。
从上图中还可以看出,累加器sum的开始的基准值为50。每进入一个数据就在50的基准上进行加减法运算。最后当计数器j从0累加到31之后,就做一次相应的判决输出:如果sum值大于50就输出信号为1,如果小于50就输出为0,见图10。
图中在计数器j达到30的时候,对应的sum值为12(小于50),于是outdata进行判断输出,输出信号为0(低电平)。这样就完成了计数累加判断的过程。
4 系统性能
在加入差错控制编码后,传输20 000个字节未发现误码。