基于LFSR的伪随机序列发生器

伪随机序列在现在的数字电路设计中还是蛮重要的,在找工作面试中也会碰到,因此整理一下伪随机序列发生器的设计。
伪随机序列包括m序列,m序列是目前CDMA系统中采用的最基本的PN序列。 是最长线性反馈移位寄存器序列的简称。同时m序列在通信方面有很重要的作用。m序列是由线性反馈移位寄存器产生的。整理一下线性反馈移位寄存器和Verilog编写的序列发生器模块。

这里写图片描述

这是一个典型的线性反馈移位寄存器。通过选取系数的值,其中系数的值只能是0或者1,来确定反馈路径。然后给定寄存器初始值,叫做种子值,然后就可以获得2^n-1个状态。简单的实现方法如下代码所示:

//基于LFSR的Verilog的伪随机数发生器
//以下代码以g0g1g2g3g4g5g6g7g8=101110001来设计,n=8;
module RandomGen(clk,rst_n,load,seed,rand_num);
input clk;//时钟信号
input rst_n;//复位信号
input load;//置数信号
input [7:0]seed;//初始种子值;
output [7:0]rand_num;//伪随机数输出值;

reg [7:0]rand_num;

always@(posedge clk or negedge rst_n) begin 
    if(rst_n==1'b0)
        rand_num<=8'd0;
    else if(load) 
        rand_num<=seed; //将种子值赋值给线性反馈移位寄存器的每个寄存器
    else begin 
          rand_num[0]<=rand_num[7];
            rand_num[1]<=rand_num[0];
            rand_num[2]<=rand_num[1];
            rand_num[3]<=rand_num[2];
            rand_num[4]<=rand_num[3]^rand_num[7];
            rand_num[5]<=rand_num[4]^rand_num[7];
            rand_num[6]<=rand_num[5]^rand_num[7];
            rand_num[7]<=rand_num[6];
        end
end
endmodule   

testbench如下:

`timescale 1 ns/ 1 ns
module RandomGen_simulation();
reg clk;//时钟信号
reg rst_n;//复位信号
reg load;//置数信号
reg [7:0]seed;//初始种子值;
wire [7:0]rand_num;//伪随机数输出值;

RandomGen U1(.clk(clk),.rst_n(rst_n),.load(load),.seed(seed),.rand_num(rand_num));

initial begin  
  clk<=0;rst_n<=0;seed<=8'b00000000;load<=0;#40;rst_n<=1;#20;load<=1;seed<=8'b11111111;#20;load<=0;
end
always #10 clk<=~clk;
endmodule 

这里写图片描述
得到仿真波形,因为设置的移位寄存器有8位,因此状态总共有255个。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章