基于FPGA的m伪随机数产生

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于FPGA 的m 伪随机数产生

yanwh

2014-11-28

1.概念

通过一定的算法对事先选定的随机种子(seed)做一定的运算可以得到一组人工生成的周期序列,在这组序列中以相同的概率选取其中一个数字,该数字称作伪随机数,由于所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。这里的“伪”的含义是,由于该随机数是按照一定算法模拟产生的,其结果是确定的,是可见的,因此并不是真正的随机数。伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要,如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。2.由LFSR 引出的产生方法

二进制m 序列是一种周期性变化的序列,是由线性反馈移位寄存器(LFSR )产生的。图5-8给出了由n 级移位寄存器以及若干个异或门组成的m 序列发生器。其中,n C 为反馈系数,取值为0或1,取为0时表示不存在该反馈支路,取1表示存在该反馈支路。n 个D 触发器最多可以提供1

2-n 个状态(不包括全0的状态),为了保证这些状态没有重复,n C 必须满足一定的条件。图 5.8n 级线性移位寄存器构成的m 序列发生器

以下以n=4,10=C ,01=C ,02=C ,13=C ,14=C 为例进行分析,对应的序列发生器如下图所示。

假设在开始时,11110123=D D D D (种子数据),那么在时钟到来时,有:0^_3223==out D outD D D ;1_12==out D D ;1_01==out D D ,130==out D D ,即01110123=D D D D 。同理,当下一个时钟到来时,可得11100123=D D D D ……,其状态转移图如下图所示。

从图可以看出,正好有2^3-1=7个状态,不包括全0;

如果理解了上图,至少可以得到三条结论:

1)初始状态是由Seed 数据提供的;

2)当反馈系数不同时,得到的状态转移图也不同;必须保证g n ===1,否则哪来的反馈。

3)D 触发器的个数越多,产生的状态就越多,也就越“随机”。

3.VHDL 实现

基于以上对m 序列产生的原理进行分析,下面用VHDL 产生一个n=4的m 序列发生器。其中,m 序列产生的仿真结果如下图所示。

对应的VHDL 源代码如下:

------------------------------------------------------------

--版权:

yanwh0502--文件名称:

RanGen --设计

:yanwh

--设计日期:2014-11-28

--功能简述:m伪随机序列产生器

------------------------------------------------------------library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity RanGen is

port

(

----------------------------------------------------

--System Clock and Reset signal

----------------------------------------------------

Clk:in std_logic;

Rst_n:in std_logic;

----------------------------------------------------

--port

----------------------------------------------------

RandomEn:in std_logic;

SeedData:in std_logic_vector(3downto0);

RandomData:out std_logic_vector(3downto0) );

end RanGen;

architecture arch_RanGen of RanGen is

--------------------------------------------------------

--signal declaration

--------------------------------------------------------

signal RandData_Temp:std_logic_vector(3downto0);

signal Cnt:std_logic_vector(3downto0);

begin

--------------------------------------------------------

--connect the Port

--------------------------------------------------------

RandomData<=RandData_Temp;

--RandData_Temp

process(Rst_n,Clk)

begin

if(Rst_n='0')then

RandData_Temp<=(others=>'0');

elsif rising_edge(Clk)then

if(RandomEn='1')then

RandData_Temp<=SeedData;

else

RandData_Temp(0)<=RandData_Temp(3);

RandData_Temp(1)<=RandData_Temp(0);

相关文档
最新文档