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.