Verilog實驗 6 利用移位寄存器實現隨機數發生器


1.概念

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

2.由LFSR引出的產生方法

  LSFR:線性反饋移位寄存器。

產生偽隨機數的方法最常見的是利用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的特性,其反饋方程為X3=X1⊕X0具有該參數的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的結構如下:

--------------------然而我並不能理解上面這個圖為什么畫成這個樣子-----------------------

課本534頁的反饋方程:X8=X4X3X2X0,算出新的一位之后向左移。

  1. module RanGen(  
  2.     input               rst_n,    /*rst_n is necessary to prevet locking up*/  
  3.     input               clk,      /*clock signal*/  
  4.     input               load,     /*load seed to rand_num,active high */  
  5.     input      [7:0]    seed,       
  6.     output reg [7:0]    rand_num  /*random number output*/  
  7. );  
  8.     
  9.     
  10. always@(posedge clk or negedge rst_n)  
  11. begin  
  12.     if(!rst_n)  
  13.         rand_num    <=8'b0;  
  14.     else if(load)  
  15.         rand_num <=seed;    /*load the initial value when load is active*/  
  16.     else  
  17.         begin  
  18.             rand_num[0] <= rand_num[7];  
  19.             rand_num[1] <= rand_num[0];  
  20.             rand_num[2] <= rand_num[1];  
  21.             rand_num[3] <= rand_num[2];  
  22.             rand_num[4] <= rand_num[3]^rand_num[7];  
  23.             rand_num[5] <= rand_num[4]^rand_num[7];  
  24.             rand_num[6] <= rand_num[5]^rand_num[7];  
  25.             rand_num[7] <= rand_num[6];  
  26.         end  
  27.                 
  28. end  
  29. endmodule  


免責聲明!

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



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