1.m序列简介
m序列是目前广泛应用的一种伪随机序列,其在通信领域有着广泛的应用,如扩频通信,卫星通信的码分多址,数字数据中的加密、加扰、同步、误码率测量等领域。m序列在所有的伪随机序列里面的地位是最基础同样也是最重要的。它的特点就是产生方便快捷,有很强的规律特性,同时自相关性、互相关特性也很好。在IS-95的反向信道中,选择了m序列的PN码作为地址码,利用不同相位m序列几乎正交的特性来为每个用户的业务信道分配了一个相位 。简单来说,n级反馈移位寄存器的状态最多由2^n 个,同时,在线性的反馈移位寄存器中,全“0”状态永不改变,所以也就是说,它的最长的周期就是 2^n - 1。
2.m序列性质
周期为2^n-1的m序列由以下几个特点:
①随机性
在m序列的一个周期中,0和1出现概率大致相同,0码只比1码多一个,且1的个数为,0的个数为。
②移位可加性
某个周期为p的m序列与其经任意延迟移位后的序列模2相加后,其结果仍是周期为p的m序列,只是原序列某次延迟移位后的序列。
③预先可确定性
m序列是由移位寄存器的初始状态和反馈网络唯一确定的。
④游程特性
序列中取值相同的相继元素称为一个游程。游程长度指的是游程中元素的个数。在m序列中,一共有个游程。其中长度为1的游程占总游程数的一半;长度为2的游程占总游程的1/4;长度为k的游程占总游程数的,且在长度为k的游程中,连0与连1的游程数各占一半。另外,还有一个长度为n的1游程和一个长度为(n一1)的0游程。
3.特征方程
说明:①ci的值决定了反馈线的连接状态;
②在上式和后面的公式中都将“”简写为“+”;
③式中xi本身并无实际意义,它仅指明其系数是ci的值。
④特征方程f(x)决定了一个线性反馈移存器的结构,从而决定了它产生的序列的构造和周期。
4.本原多项式
使一个线性反馈移存器产生最长周期序列的充分必要条件是其特征方程f(x)为本原多项式。
本原多项式是指满足下列条件的多项式:
①是既约的,即不能分解因子的;
② 可以整除(x^m + 1),m = 2^n – 1;即是( x^m + 1 )的一个因子;
③ 除不尽( x^q+ 1 ),q < m。
常用本原多项式:
5.一般的线性反馈移存器方框
例:表示上式中仅x0, x1,和x4的系数c0 = c1 = c4 = 1,而其余系数c2 = c3 = 0。
6.Verilog代码
/******************************************************************************
功能:产生m序列 生成多项式f( x )=x^3 + x + 1
email:lidong10280528
作者:黎冬
时间:2015.07.18
****************************************************************************/
module m_sequence
(
sys_clk,
sys_rst_n,
out,shift
);
//input
input sys_clk;
input sys_rst_n;
//output
output out;//最终输出
output [ 3:0 ]shift;//4位移位寄存器值的输出
/***********************************************************************/
reg [ 3:0 ]rShift;//4位移位寄存器
reg rOut;
always @( posedge sys_clk or negedge sys_rst_n )
if( sys_rst_n == 0 )begin //初始化
rShift <= 'b0110;
rOut <= 1'b0;
end
else
begin
rShift <= { feedback,rShift[ 3:1 ] }; //移位运算
rOut <= rShift[ 0 ];
end
/************************************************************************/
wire feedback = rShift[ 0 ]^rShift[ 3 ];
assign out= rOut;
assign shift = rShift;
endmodule
7.激励文件
`timescale 1 ns/ 1ns
module m_sequence_test();
reg sys_clk,sys_rst_n;
wire out;
wire [ 3:0 ]shift;
initial
begin
sys_clk = 1'b0;
sys_rst_n = 1'b0;
#100;
sys_rst_n = 1'b1;
forever #20 sys_clk = ~sys_clk;
end
m_sequence I1
(
.sys_clk( sys_clk ),
.sys_rst_n( sys_rst_n ),
.out( out ),
.shift( shift )
);
endmodule
8.结果