FPGA產生基於LFSR的偽隨機數

2021-09-06 09:57:47 字數 2678 閱讀 2519

**:

1.概念

通過一定的演算法對事先選定的隨機種子(seed)做一定的運算可以得到一組人工生成的週期序列,在這組序列中以相同的概率選取其中乙個數字,該數字稱作偽隨機數,由於所選數字並不具有完全的隨機性,但是從實用的角度而言,其隨機程度已足夠了。這裡的「偽」的含義是,由於該隨機數是按照一定演算法模擬產生的,其結果是確定的,是可見的,因此並不是真正的隨機數。偽隨機數的選擇是從隨機種子開始的,所以為了保證每次得到的偽隨機數都足夠地「隨機」,隨機種子的選擇就顯得非常重要,如果隨機種子一樣,那麼同乙個隨機數發生器產生的隨機數也會一樣。

2.由lfsr引出的產生方法

產生偽隨機數的方法最常見的是利用一種線性反饋移位暫存器(lfsr),它是由n個d觸發器和若干個異或門組成的,如下圖:

其中,gn為反饋係數,取值只能為0或1,取為0時表明不存在該反饋之路,取為1時表明存在該反饋之路;n個d觸發器最多可以提供2^n-1個狀態(不包括全0的狀態),為了保證這些狀態沒有重複,gn的選擇必須滿足一定的條件。下面以n=3,g0=1,g1=1,g2=0,g3=1為例,說明lfsr的特性,具有該引數的lfsr結構如下圖:

假設在開始時,d2d1d0=111(seed),那麼,當時鐘到來時,有:

d2=d1_out=1;

d1=d0_out^d2_out=0;

d0=d2_out=1;

即d2d1d0=101;同理,又乙個時鐘到來時,可得d2d1d0=001. ………………

畫出狀態轉移圖如下:

從圖可以看出,正好有2^3-1=7個狀態,不包括全0;

如果您理解了上圖,至少可以得到三條結論:

1)初始狀態是由seed提供的;

2)當反饋係數不同時,得到的狀態轉移圖也不同;必須保證gn===1,否則哪來的反饋?

3)d觸發器的個數越多,產生的狀態就越多,也就越「隨機」;

3.verilog實現

基於以上原理,下面用verilog產生乙個n=8,反饋係數為g0g1g2g3g4g5g6g7g8=101110001的偽隨機數發生器,它共有2^8=255個狀態,該lfsr的結構如下:

verilog源**如下:

module

rangen(

input rst_n, /*

rst_n is necessary to prevet locking up

*/input clk, /*

clock signal

*/input load, /*

load seed to rand_num,active high

*/input [7:0

] seed,

output

reg [7:0] rand_num /*

random number output

*/);

always@(posedge clk or

negedge

rst_n)

begin

if(!rst_n)

rand_num

<=8

'b0;

else

if(load)

rand_num

<=seed; /*

load the initial value when load is active

*/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

];

endend

endmodule

**波形:

以1111 1111為種子,load訊號置位後,開始在255個狀態中迴圈,可將輸出值255、143、111……作為偽隨機數。

FPGA產生基於LFSR的偽隨機數

1.概念 通過一定的演算法對事先選定的隨機種子 seed 做一定的運算可以得到一組人工生成的週期序列,在這組序列中以相同的概率選取其中乙個數字,該數字稱作偽隨機數,由於所選數字並不具有完全的隨機性,但是從實用的角度而言,其隨機程度已足夠了。這裡的 偽 的含義是,由於該隨機數是按照一定演算法模擬產生的...

基於FPGA的秒錶

功能 四位數碼管顯示,從零開始計數,前兩位顯示秒 0 59 後兩位顯示0.01秒 0 99 計滿後從零開始,有開始鍵 暫停鍵 復位鍵。當第一次按下開始鍵,秒錶從初始開始計數,led顯示器上顯示當前計時值 當緊按下 按住 暫停鍵時,秒錶暫停計時,led上顯示當前計時值,放開則繼續計時 當按下復位鍵時,...

FPGA學習 基於FPGA的簡易音訊採集系統

本篇部落格記錄乙個小專案的開發 基於fpga的簡易音訊採集系統,專案 是乙個寒假的活動的題目,直接購買了設計好的板卡,專案的基本要求如下 使用的板卡是lattice的ice40up5k,這裡首先記錄一下在lattice的軟體中開發fpga的簡單流程 參考 windows 下 ice40 fpga 開...