今天給大俠帶來在FPGA設(shè)計中,,產(chǎn)生LFSR偽隨機(jī)數(shù),話不多說,,上貨,。
一、概述
通過一定的算法對事先選定的隨機(jī)種子(seed)做一定的運(yùn)算可以得到一組人工生成的周期序列,,在這組序列中以相同的概率選取其中一個數(shù)字,,該數(shù)字稱作偽隨機(jī)數(shù),由于所選數(shù)字并不具有完全的隨機(jī)性,,但是從實用的角度而言,,其隨機(jī)程度已足夠了,。
這里的“偽”的含義是,由于該隨機(jī)數(shù)是按照一定算法模擬產(chǎn)生的,,其結(jié)果是確定的,,是可見的,因此并不是真正的隨機(jī)數(shù),。偽隨機(jī)數(shù)的選擇是從隨機(jī)種子開始的,,所以為了保證每次得到的偽隨機(jī)數(shù)都足夠地“隨機(jī)”,隨機(jī)種子的選擇就顯得非常重要,,如果隨機(jī)種子一樣,,那么同一個隨機(jī)數(shù)發(fā)生器產(chǎn)生的隨機(jī)數(shù)也會一樣。
二,、由LFSR引出的產(chǎn)生方法
產(chǎn)生偽隨機(jī)數(shù)的方法最常見的是利用一種線性反饋移位寄存器(LFSR),,它是由n個D觸發(fā)器和若干個異或門組成的,如下圖:
其中,,gn為反饋系數(shù),,取值只能為0或1,取為0時表明不存在該反饋之路,,取為1時表明存在該反饋之路,,n個D觸發(fā)器最多可以提供2^n-1個狀態(tài)(不包括全0的狀態(tài))。為了保證這些狀態(tài)沒有重復(fù),,gn的選擇必須滿足一定的條件,。
下面以n=3,g0=1,,g1=1,g2=0,g3=1為例,,說明LFSR的特性,具有該參數(shù)的LFSR結(jié)構(gòu)如下圖:
假設(shè)在開始時,,D2D1D0=111(seed),,那么,當(dāng)時鐘到來時,,有:
D2=D1_OUT=1,;
D1=D0_OUT^D2_OUT=0;
D0=D2_OUT=1,;
即D2D1D0=101,;同理,又一個時鐘到來時,,可得D2D1D0=001,。
畫出狀態(tài)轉(zhuǎn)移圖如下:
從圖可以看出,正好有2^3-1=7個狀態(tài),不包括全0,;
如果你理解了上圖,,至少可以得到三條結(jié)論:
1)初始狀態(tài)是由SEED提供的;
2)當(dāng)反饋系數(shù)不同時,,得到的狀態(tài)轉(zhuǎn)移圖也不同,;必須保證gn===1,否則不會有反饋,;
3)D觸發(fā)器的個數(shù)越多,,產(chǎn)生的狀態(tài)就越多,也就越“隨機(jī)”,。
三,、verilog實現(xiàn)
基于以上原理,下面用verilog產(chǎn)生一個n=8,,反饋系數(shù)為g0g1g2g3g4g5g6g7g8=101110001的偽隨機(jī)數(shù)發(fā)生器,,它共有2^8=255個狀態(tài),該LFSR的結(jié)構(gòu)如下:
verilog源代碼如下:
仿真波形:
以1111 1111為種子,,load信號置位后,,開始在255個狀態(tài)中循環(huán),,可將輸出值255,、143、111……作為偽隨機(jī)數(shù),。
本篇就說到這里,,各位大俠,有緣再見,。