念念不忘,必有回响,记得去年差不多这时候在大连,当时一个同学问我M序列的问题,后来一直没有去仔细地看,没想到今天又遇到了,今天就来个一刀两断!
一、介绍
m序列是一种伪随机序列。使用n级反馈移位寄存器实现,n级反馈移位寄存器的状态最多为2^n个,同时在线性的反馈移位寄存器中,全“0”状态永不改变,也就是说其最长的周期为2^n-1。
由于反馈的存在,若初始状态为0,则移位后得到的结果仍全为“0”,因此应该避免全“0”状态,除全“0”状态外,剩下2^n-1种状态可用,每移位一次,就出现一种状态,在移位若干次之后,一定重复出现前某一状态,其后的过程便周而复始。为了满足不同要求下的反馈线长度,可通过设置状态转移公式实现。(公式马上就来)。
1、随机性:在m序列的一个周期中,0和1出现的概率大致相同,0码只比1多一个。
2、移位可加性:某个周期为p的m序列与其经任意延迟移位后的序列模2相加后,其结果仍是周期为p的m序列,只是原序列某次延迟移位后的序列。
3、预先可知性:m序列是由移位寄存器的初始状态和反馈网络唯一确定的。也就是说,是假随机,其实状态可以根据公式算出,并非真随机。
4、游程特性:序列中取值相同的相继元素称为一个游程。游程长度指的是游程中元素的个数。在m序列中,一共有个游程。其中长度为1的游程占总游程数的一半;长度为2的游程占总游程的1/4;长度为k的游程占总游程数的,且在长度为k的游程中,连0与连1的游程数各占一半。另外,还有一个长度为n的1游程和一个长度为(n一1)的0游程。
关于结构图和特征方程的解释:
ak-1表示的是移位数据寄存器的最高位,c1表示的x的系数,c2表示的x^2的系数,因为是反馈实现的,所以c0和cn必为1,所以并没有写出。
ci的值决定了反馈线的连接状态,当ci为1时,该反馈线存在,else not。
特征方程f(x)决定了线性反馈的结构,从而决定了生成序列的构造和周期,其实这句话反过来说也行,具体为什么会举例说明。
是一个线性反馈移位寄存器产生最长周期序列的充分必要条件是特征方程为本原多项式,最长周期个数为2^n-1。
常用的本原多项式:
举个栗子!
观察上面的结构图,系数c0=1,c1=1,c4=1,其余系数为0.
本原多项式就是为:f(x)=x^4+x+1
尝试将上面的本原多项式用verilog代码实现,就是4个寄存器,知道结构是什么样子,问题自然就好解决了!
主函数:
module m(
input clk,
input rst_n,
output reg [3:0]out
);
always@(posedge clk or negedge rst_n)
if(!rst_n)
out<=4'd13;
else begin
out[0]<=out[1];
out[1]<=out[2];
out[2]<=out[3];
out[3]<=out[0]^out[3];
end
endmodule
仿真代码:
`timescale 1ns/1ns
module tb;
reg clk;
reg rst_n;
wire [3:0]out;
m u0(
clk,
rst_n,
out
);
initial clk=0;
always #5 clk=~clk;
initial begin
rst_n=0;
#100;
rst_n=1;
#2000;
$stop;
end
endmodule
仿真波形:
在上面的工程中,C4=C1=C0=1,也就是说m序列的反馈为19(8进制为23)。反过来说设计一个5级m序列,反馈为45,即100101,此时C5,C2,C0=1; C4,C3,C1=0。
bye~~