FPGA学习-m序列信号发生器-FPGA常见问题社区-FPGA CPLD-ChipDebug

FPGA学习-m序列信号发生器

1.m序列简介

m序列是目前广泛应用的一种伪随机序列,其在通信领域有着广泛的应用,如扩频通信,卫星通信的码分多址,数字数据中的加密、加扰、同步、误码率测量等领域。m序列在所有的伪随机序列里面的地位是最基础同样也是最重要的。它的特点就是产生方便快捷,有很强的规律特性,同时自相关性、互相关特性也很好。在IS-95的反向信道中,选择了m序列的PN码作为地址码,利用不同相位m序列几乎正交的特性来为每个用户的业务信道分配了一个相位 。简单来说,n级反馈移位寄存器的状态最多由2^n 个,同时,在线性的反馈移位寄存器中,全“0”状态永不改变,所以也就是说,它的最长的周期就是 2^n – 1。

由于反馈的存在,移存器的输入端受控地输入信号。不难看出,若初始状态为全“0”,则移位后得到的仍为全“0”,因此应避免出现全“0”状态,又因为n级移存器共有2n-1种可能的不同状态,除全“0”状态外,剩下2n-1种状态可用。每移位一次,就出现一种状态,在移位若干次后,一定能重复出现前某一状态,其后的过程便周而复始了。反馈线位置不同将出现不同周期的不同序列,我们希望找到线性反馈的位置,能使移存器产生的序列最长,即达到周期P=2^n-1。

2.m序列性质

周期为2^n-1的m序列由以下几个特点:

①随机性

在m序列的一个周期中,0和1出现概率大致相同,0码只比1码多一个。

②移位可加性

某个周期为p的m序列与其经任意延迟移位后的序列模2相加后,其结果仍是周期为p的m序列,只是原序列某次延迟移位后的序列。

③预先可确定性

m序列是由移位寄存器的初始状态和反馈网络唯一确定的。

④游程特性

序列中取值相同的相继元素称为一个游程。游程长度指的是游程中元素的个数。在m序列中,一共有个游程。其中长度为1的游程占总游程数的一半;长度为2的游程占总游程的1/4;长度为k的游程占总游程数的,且在长度为k的游程中,连0与连1的游程数各占一半。另外,还有一个长度为n的1游程和一个长度为(n一1)的0游程。

3.线性移位反馈寄存器的结构图如下:

 

图片[1]-FPGA学习-m序列信号发生器-FPGA常见问题社区-FPGA CPLD-ChipDebug

图片[2]-FPGA学习-m序列信号发生器-FPGA常见问题社区-FPGA CPLD-ChipDebug

①ci的值决定了反馈线的连接状态;

②在上式和后面的公式中都将“”简写为“+”;

③式中xi本身并无实际意义,它仅指明其系数是ci的值。

④特征方程f(x)决定了一个线性反馈移存器的结构,从而决定了它产生的序列的构造和周期。

4.本原多项式

使一个线性反馈移存器产生最长周期序列的充分必要条件是其特征方程f(x)为本原多项式,最长周期为2^n-1。

本原多项式是指满足下列条件的多项式:

①是既约的,即不能分解因子的;

② 可以整除(x^m + 1),m = 2^n – 1;即是( x^m + 1 )的一个因子;

③ 除不尽( x^q+ 1 ),q < m。

常用本原多项式:(最高位和最低位系数必须都是1),同时n也是多项式最高项的次数和LFSR寄存器个数;

图片[3]-FPGA学习-m序列信号发生器-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

示例如下:

表示上式中仅x0, x1,和x4的系数c0 = c1 = c4 = 1,而其余系数c2 = c3 = 0,则:

图片[4]-FPGA学习-m序列信号发生器-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

n=4,m=2^4-1 g(x)=x^4+x+1;

在最长线性序列移位寄存型计数器中,存在一个“00000”,该状态构成死循环,这会使电路不具有自启动功能,为了解决这个问题,可在反馈方程中加全0校正项 (~Q1)&(~Q2)…..

例如:

此时的反馈函数F= Q1^Q4+(~Q0)&(~Q1)&(~Q2)&(~Q3)&(~Q4);

 

相应地verilog代码如下:

 

module m_sequence(

                  input             I_clk,

                  input             I_rst_p,

                  input             en,

                  input  [3:0]      D_init,

                  output            dout                 

)

wire F;

reg  [3:0] m_reg;

always@(posedge I_clk)

   if(I_rst_p)

      m_reg <= 4’b0;

   else if(en)

      m_reg <= D_init;

   else

      m_reg <= {m_reg[2:0],F };

 

assign F=(m_reg[1]^m_reg[4])|(~(|m_reg)) ;

assign dout = m_reg[3];

 

endmoduel

 

 

请登录后发表评论

    没有回复内容