基于FPGA的m伪随机数产生
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);