LFSR產生偽隨機碼Verilog描述


LFSR介紹

LFSR即線性反饋移位寄存器,用於產生可重復的偽隨機序列PRBS,該電路由n級觸發器和一些異或門構成。每個時鍾周期內,新的輸入值反饋到LFSR內部各個觸發器的輸入端,輸入值的一部分來源於LFSR的輸出端,另一部分由LFSR各輸出端進行異或運算得到。

LFSR的初始值被稱為偽隨機序列的種子。由n個觸發器構成的LFSR電路可以產生周期為2^n-1的序列。

LFSR(線性反饋移位寄存器)計數器

LFSR計數器與常規計數器不同,不進行常規加減計數。通過重復出現的某個隨機序列作為實現計數器的基礎。其特點如下所示:

  • 計數序列隨機(實際上是偽隨機),比如一個3位LFSR計數器的計數序列出現的規律是001,110,011,111,101,100,010,而不是依據二進制的計數方式來增加或減少。
  • LFSR可以使用XOR反饋或者XNOR反饋,前者使用情況下全零為非法的狀態,后者使用情況下全一為非法狀態。
  • 存在兩種類型的LFSR(多到一,一到多)。對於多到一類型,多個觸發器輸出進行異或運算,輸出結果進入一個寄存器,對於一到多類型,一個觸發器的輸出進入異或函數,計算結果驅動多個觸發器

目前常用兩種LFSR電路,分別是斐波那契LFSR和伽羅瓦LFSR。這兩種電路都產生2^n-1個序列,但是一到多型LFSR具有更高的速度,因為其兩個觸發器間僅使用一個異或門。

斐波那契LFSR

斐波那契LFSR為多到一型LFSR,即多個觸發器的輸出經過異或邏輯來驅動一個觸發器的輸入。

反饋多項式為x^3+x^2+1

即x1的輸入為x3和x2的輸出異或后的結果,電路圖如下所示:

輸出序列的順序為:111-110-100-001-010-101-011-111

接下來進行電路的設計,RTL代碼如下:

module lfsr(
    input        wire        clk,
    input         wire        rst,
    output        reg    [2:0]    q
    );

always @(posedge clk) begin
    if (rst) begin
        // reset
        q <= 3'b111;
    end
    else begin
        q <= {q[1],q[0],q[1]^q[2]};
    end
end

endmodule

testbench代碼如下:

`timescale 1ns/1ps
module tb_lfsr();

reg                    clk;
reg                    rst;
wire    [2:0]        q;

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

always #10 clk = ~clk;

lfsr inst_lfsr (.clk(clk), .rst(rst), .q(q));


endmodule

modelsim仿真波形如下所示:

 

 

伽羅瓦LFSR

伽羅瓦LFSR為一到多型LFSR,即一個觸發器的輸出經過異或邏輯來驅動多個觸發器的輸入。

對於同樣的反饋多項式x^3+x^2+1而言:

  •  觸發器x1的輸入通常來源於觸發器x2的輸出
  • x3(最高項)的輸入通常來自於x1的輸出
  • 此多項式中剩余觸發器的輸入是x1的輸出與前級輸出異或的結果
  • x2的輸入由x1的輸出與x3的輸出通過異或運算得到

其電路圖如下所示:

輸出序列的順序為:111-101-100-010-001-110-011-111

電路設計,RTL代碼如下:

module lfsr2(
    input        wire        clk,
    input         wire        rst,
    output        reg    [2:0]    q
    );

always @(posedge clk) begin
    if (rst) begin
        // reset
        q <= 3'b111;
    end
    else begin
        q <= {q[0],q[2]^q[0],q[1]};
    end
end

endmodule

 testbench代碼如下:

`timescale 1ns/1ps
module tb_lfsr();

reg             clk;
reg                rst;
wire    [2:0]    q;

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

always #10 clk = ~clk;

lfsr2 inst_lfsr2 (.clk(clk), .rst(rst), .q(q));


endmodule

 modelsim仿真波形如下:

 

總結

 LFSR可以用於構建高速計數器,與常見的計數器相比,LFSR計數器具有速度快,消耗邏輯門少的特點。在擾碼器/解碼器的應用場景中,接收電路與發送電路采用同樣的多項式即可進行通信。

在其他領域如密碼系統、BIST(內建自測試)、快速以太網及吉比特以太網中都具有應用價值。

具體的用於產生最大長度偽隨機序列的反饋多項式可以查閱文獻:Table of Linear Feedback Shift Registers

 

Reference:

[1] Verilog高級數字系統設計計數與實例分析

[2] Ward R ,  Molteno T . Table of Linear Feedback Shift Registers.  2007.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM