基於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個。

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