verilog 产生m序列

m序列是最常用的伪随机序列,是最长线性反馈移位寄存器序列的简称。如果是4级的寄存器(下面都假设n=4),那么最长周期是2^4-1=15。

m序列的特征多项式必须是4次的本原多项式。必须满足条件:

1、既约的;

2、可整除x^15+1,这里15=2^4-1;

3、不可整除x^q+1,q<15。

若已知4次的本原多项式为x^4+x+1,那么反馈逻辑就是a4 = a1 + a0(mod 2)。然后赋予初状态,那么由线性反馈逻辑和初状态就能决定m序列了。

veirlog代码如下

module m_sequence
(
	input				clk,
	input				rst,
	output		 		out,
	output  reg [3:0]	shift
);

always @( posedge clk)
	if( rst == 1'b0) 
		shift <= 'b0001;
	else 
		begin
			shift <= (shift >> 1'b1); 
			shift[3] <= shift[0]^shift[1];
		end

assign out = shift[0];

endmodule
测试文件
`timescale 1ns/1ns
module tb_m();
reg clk;
reg rst;
wire [8:0]	O_m;
wire 		O_m_0;

initial 
begin
	clk=0;
	rst=0;
	#50 
	rst=1;
end

always #10 clk=~clk;

m_sequence m_sequence_inst(
	.clk(clk),
	.rst(rst),
	.out(O_m),
	.shift(O_m_0)
);

//将modelsim数据保存到txt文件
reg  i =0;  
always @ (posedge clk)  
begin  
    if (!rst)  
        i <=0;  
    else if (i<700)     
        i <= i+1;  
    else  
        i<= 700;  
end  
      
  
integer w_file;  
    initial w_file = $fopen("data_out_1.txt");  
    always @(i)  
    begin  
        $fdisplay(w_file,"%d",O_m_0);  
        if(i == 8'd609)    //共写入254个数据  
            $stop;  
    end     
endmodule


 
   
  


使用matlab进行数据对比:

matlab m序列的产生使用

 

 p_i = commsrc.pn('GenPoly',		[4 1 0], ...
              'InitialStates',	[zeros(1, 3), 1],   ...
              'NumBitsOut',		16-1);

pn_i=[generate(p_i)].'; 
使用上式产生的序列周期为15,频谱图如下图所示


modelsim采样得到的数据频谱图如下图所示



在做对比时一定要注意matlab 产生m序列的初始状态

              'InitialStates',	[zeros(1, 3), 1],   ...
应与verilog给的初始状态一致。

你可能感兴趣的:(FPGA)