一、移位寄存器的基本概念
1.移位寄存器
移位寄存器:指若干個寄存器排成一列,每個寄存器中存放1bit二進(jìn)制數(shù)據(jù)(0或1),每個時鐘周期向左或向右移動一個bit。下圖所示為一個向右移動的移位寄存器。
2.反饋移位寄存器
反饋移位寄存器(Feedback Shift Register,F(xiàn)SR):每個時鐘脈沖,移位寄存器向右移動一位,則移位寄存器的左左側(cè)就會空出一位。這個如果左側(cè)有輸入,則移位寄存器的右側(cè)輸出端則會有源源不斷的數(shù)據(jù)輸出。如果來自移位寄存器的某些序列根據(jù)一定的反饋函數(shù)形成左側(cè)輸入,則稱該結(jié)構(gòu)為反饋移位寄存器。
3.線性反饋移位寄存器
線性反饋移位寄存器(Linear Feedback Shift Register,LFSR):當(dāng)反饋移位寄存器的反饋函數(shù)f(x)是線性時,則稱為線性反饋移位寄存器。
線性反饋移位寄存器的反饋函數(shù)為:對移位寄存器中的某些位進(jìn)行異或。將反饋函數(shù)得到的計算結(jié)果反饋到移位寄存器的最左邊,即得到了線性反饋移位寄存器。
狀態(tài)
狀態(tài):一個LFSR當(dāng)前存儲的序列被稱為一個狀態(tài)。當(dāng)LFSR向右移動一位時,左側(cè)會被反饋函數(shù)補(bǔ)上一位計算后的數(shù)據(jù),得到一個新的LFSR序列,此時LFSR就移動到了一個新狀態(tài)。
抽頭
抽頭:線性反饋移位寄存器有些位參與異或,有些位不參與異或,其中參與異或的位被稱為抽頭。抽頭會影響下一狀態(tài)的比特位。LFSR的觸發(fā)器編號從1開始,因此抽頭的取值范圍是1~(2n-1)。
種子
種子:LFSR中的初值,種子應(yīng)該是非零的。如果為全零的話,下一狀態(tài)任意做異或也還是為0,則線性反饋移位寄存器的輸出用于0,無效。
二、LFSR的一些基本概念
1.級數(shù)和周期
級數(shù):LFSR中的寄存器個數(shù)稱為LFSR的級數(shù)。一個5級的LFSR最多同時存放5bit數(shù)據(jù)
周期:一個n級的LFSR最多只有(2n-1)個狀態(tài),即:一個n級的LFSR最多只能遍歷2n-1個序列,即最大周期為(2n-1)。
注:nbit移位寄存器能存儲的數(shù)據(jù)為0~(2n-1),即2n個狀態(tài),但是由于LFSR禁止全0狀態(tài),因此一個n級的LFSR最多只能有(2n-1)個狀態(tài)。因此一個LFSR的最大周期是(2n-1)個系統(tǒng)時鐘周期,當(dāng)用LFSR產(chǎn)生PRBS(偽隨機(jī)噪聲)時,是存在周期性的。值得注意的是:不是所有的LFSR都能達(dá)到(2n-1)個周期,這與抽頭的設(shè)計相關(guān)。只要選擇合適的反饋函數(shù)便可使序列的周期達(dá)到最大值(2n-1),周期達(dá)到最大值的序列稱為m序列。
2.特征多項式
由上圖,可以得到第n+1位的值為:
由上文可以看出,特征多項式表示的是抽頭系數(shù),抽頭的設(shè)計關(guān)系到LFSR的最大周期,一般要使LFSR得到最大周期(2^n-1),可參照如下表:
三、LFSR的分類
1.斐波那契LFSR:多到一型LFSR(many to one)
抽頭序列對應(yīng)bit位置的多個寄存器的輸出異或后驅(qū)動一個寄存器輸入
從左到右依次遞增編號
從右到左依次遞減編號
以三級LFSR,反饋函數(shù)為:f(x)=x3+x2+1為例,其兩種編號的伽羅瓦電路圖如下
1.從左到右依次遞增編號
假設(shè)初始狀態(tài)為001,則該電路的狀態(tài)跳轉(zhuǎn)為:
周期數(shù)為23-1=7
2.從左到右依次遞減編號
假設(shè)初始狀態(tài)為001,則該電路的狀態(tài)跳轉(zhuǎn)為:
周期數(shù)為23-1=7
斐波那契LFSR習(xí)慣采用“從左到右依次遞增編號”的電路。
三級斐波那契LFSR的Verilog代碼實現(xiàn)
`timescale 1ns/1ps
module fibonacci_lfsr(
input wire sclk,
input wire rst_n,
output reg flfsrn
);
reg [1:3] fibo_lfsr;//f(x)=x^3+x^2+1,從左到右依次遞增編號
always @(posedge sclk or negedge rst_n)begin
if(rst_n==1'b0)begin
fibo_lfsr<=3'b001;//initial value
end
else begin
fibo_lfsr<={fibo_lfsr[3]^fibo_lfsr[2],fibo_lfsr[1],fibo_lfsr[2]};
end
end
always @(*)begin
flfsrn=fibo_lfsr[3];
end
endmodule
仿真圖如下所示,符合預(yù)期狀態(tài)轉(zhuǎn)移過程。
2.伽羅瓦LFSR:一到多型LFSR(one to many)
最后一個寄存器的輸出通過與抽頭序列對應(yīng)位置寄存器前一級寄存器的輸出異或后驅(qū)動多個抽頭序列對應(yīng)位置的寄存器
從左到右依次遞增編號
從左到右依次遞減編號
以三級LFSR,反饋函數(shù)為:f(x)=x3+x2+1為例,其兩種編號的伽羅瓦電路圖如下
1.從左到右依次遞增編號
假設(shè)電路初始值為001,則該電路的狀態(tài)跳轉(zhuǎn)為:
周期數(shù)為23-1=7
2.從左到右依次遞減編號
假設(shè)電路初始值為001,則該電路的狀態(tài)跳轉(zhuǎn)為:
周期數(shù)為23-1=7
伽羅瓦LFSR習(xí)慣采用“從左到右依次遞減編號”電路。
三級伽羅瓦LFSR的Verilog代碼實現(xiàn)
`timescale 1ns/1ps
module galois_lfsr(
input wire sclk,
input wire rst_n,
output reg glfsrn
);
reg [3:1] galo_lfsr;//f(x)=x^3+x^2+1,從左到右依次遞減編號
always @(posedge sclk or negedge rst_n)begin
if(rst_n==1'b0)begin
galo_lfsr<=3'b000;//initial value
end
else begin
galo_lfsr<={galo_lfsr[1],galo_lfsr[3]^galo_lfsr[1],galo_lfsr[2]};
end
end
always @(*)begin
glfsrn=galo_lfsr[1];
end
endmodul
仿真圖如下所示,符合預(yù)期狀態(tài)轉(zhuǎn)移過程。
3.斐波那契LFSR與伽羅瓦LFSR的對比
伽羅瓦LFSR具有更高的速度,因為兩個觸發(fā)器之間只有一個異或門。斐波那契LFSR在首尾兩個寄存器之間有多個異或門,組合邏輯延時更大,因為為了滿足建立保持時間的要求,其頻率更?。ㄖ芷诟螅?,速度更慢。
4.LFSR的全零禁止態(tài)
由上文的分析,當(dāng)LFSR的某個狀態(tài)為全0后,無論怎么組合,0與0異或都為0,因此LFSR將一直輸出0,得不到想要的序列,因此LFSR要避免進(jìn)入全零狀態(tài)。其預(yù)防的辦法有:
(1)將寄存器置位到某個允許的狀態(tài)
if(|lfsr[n-1:0]==1'b0)begin
lfsr[n-1:0]<={{n}{1'b1}};//如果為全零狀態(tài),則下一個狀態(tài)置為全1。
end
(2)使用額外的電路使得電路進(jìn)入全零狀態(tài)后自動退出
斐波那契LFSR禁止態(tài)處理
如對于斐波那契LFSR,額外添加一個n位或非(NOR)邏輯,如下電路圖
(1)當(dāng)LFSR為全零時,F(xiàn)=1,那么LFSR的狀態(tài)跳變?yōu)椋?0…00—>00…01,LFSR從全零狀態(tài)退出
(2)當(dāng)LFSR不為全零時,F(xiàn)=0,此時
由于任何數(shù)(0或1)異或0都等于其本身,因此
故當(dāng)LFSR不為全零時,不會對電路造成影響。
如對一個三級LFSR,特征多項式為f(x)=x3+x2+1,"從左到右依次遞增編號"的斐波那契LFSR,加上“保險”后的電路為:
三級斐波那契LFSR禁止態(tài)處理的Verilog代碼實現(xiàn)
`timescale 1ns/1ps
module fibonacci_lfsr(
input wire sclk,
input wire rst_n,
output reg flfsrn
);
reg [1:3] fibo_lfsr;//f(x)=x^3+x^2+1,從左到右依次遞增編號
wire all_lfsr_not_0;
assign all_lfsr_not_0=~(fibo_lfsr!=3'b000);
always @(posedge sclk or negedge rst_n)begin
if(rst_n==1'b0)begin
fibo_lfsr<=3'b001;//initial value
end
else begin
fibo_lfsr<={fibo_lfsr[3]^fibo_lfsr[2]^all_lfsr_not_0,fibo_lfsr[1],fibo_lfsr[2]};
end
end
always @(*)begin
flfsrn=fibo_lfsr[3];
end
endmodule
仿真圖如下,當(dāng)LFSR從全0狀態(tài)啟動后,LFSR自動進(jìn)入下一狀態(tài),符合預(yù)期。
伽羅瓦LFSR禁止態(tài)處理
同理對伽羅瓦LFSR添加一個n位或非(NOR)邏輯,如下電路圖
(1)當(dāng)LFSR為全零時,F(xiàn)=1,那么LFSR的狀態(tài)跳變?yōu)椋?0…00—>01…00,LFSR從全零狀態(tài)退出
(2)當(dāng)LFSR不為全零時,F(xiàn)=0,此時
由于任何數(shù)(0或1)異或0都等于其本身,因此
故
故當(dāng)LFSR不為全零時,不會對電路造成影響。
如對一個三級LFSR,特征多項式為f(x)=x3+x2+1,"從左到右依次遞減編號"的伽羅瓦LFSR,加上“保險”后的電路為:
三級伽羅瓦LFSR禁止態(tài)處理的Verilog代碼實現(xiàn)
`timescale 1ns/1ps
module galois_lfsr(
input wire sclk,
input wire rst_n,
output reg glfsrn
);
reg [3:1] galo_lfsr;//f(x)=x^3+x^2+1,從左到右依次遞減編號
wire all_lfsr_not_0;
assign all_lfsr_not_0=~(galo_lfsr!=3'b000);
always @(posedge sclk or negedge rst_n)begin
if(rst_n==1'b0)begin
galo_lfsr<=3'b000;//initial value
end
else begin
galo_lfsr<={galo_lfsr[1],galo_lfsr[3]^galo_lfsr[1]^all_lfsr_not_0,galo_lfsr[2]};
end
end
always @(*)begin
glfsrn=galo_lfsr[1];
end
endmodul
仿真圖如下,當(dāng)LFSR從全0狀態(tài)啟動后,LFSR自動進(jìn)入下一狀態(tài),符合預(yù)期。文章來源:http://www.zghlxwxcb.cn/news/detail-606783.html
參考文獻(xiàn)
1.詳解線性反饋移位寄存器(LFSR)
2.LFSR(線性反饋移位寄存器)
3.線性反饋移位寄存器(LFSR)文章來源地址http://www.zghlxwxcb.cn/news/detail-606783.html
到了這里,關(guān)于【Verilog編程】線性反饋移位寄存器(LFSR)原理及Verilog代碼實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!