关闭

verilog 产生m序列

标签: verilog m序列
246人阅读 评论(0) 收藏 举报
分类:

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
测试文件
<pre name="code" class="plain">`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序列的初始状态

<span style="color:#ff0000;"><strong>              'InitialStates',	[zeros(1, 3), 1],   ...</strong></span>
<span style="color:#ff0000;"><strong>应与verilog给的初始状态一致。</strong></span>

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:467次
    • 积分:33
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档