• 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  
  • 相关阅读:
    cocos2dx 动画控制概要
    lua与C交互 具体
    lua与C/C++交互概要
    3D图像算法
    lua 语言笔记
    iostransitiontranslate闪屏问题总结
    document.onreadystatechange()来判断页面加载完
    JavaScript装逼指南
    box-shadow 阴影
    web小技巧
  • 原文地址:https://www.cnblogs.com/uangjianghui/p/7727927.html
Copyright © 2020-2023  润新知