3440|4

6423

帖子

17

TA的资源

版主

楼主
 

FPGA产生基于LFSR的伪随机数 [复制链接]

原文地址

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源代码如下:
  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. always@(posedge clk or negedge rst_n)
  9. begin
  10.     if(!rst_n)
  11.         rand_num    <=8'b0;
  12.     else if(load)
  13.         rand_num <=seed;    /*load the initial value when load is active*/
  14.     else
  15.         begin
  16.             rand_num[0] <= rand_num[7];
  17.             rand_num[1] <= rand_num[0];
  18.             rand_num[2] <= rand_num[1];
  19.             rand_num[3] <= rand_num[2];
  20.             rand_num[4] <= rand_num[3]^rand_num[7];
  21.             rand_num[5] <= rand_num[4]^rand_num[7];
  22.             rand_num[6] <= rand_num[5]^rand_num[7];
  23.             rand_num[7] <= rand_num[6];
  24.         end
  25.             
  26. end
  27. endmodule
复制代码
仿真波形:

以1111 1111为种子,load信号置位后,开始在255个状态中循环,可将输出值255、143、111……作为伪随机数。




此帖出自FPGA/CPLD论坛

最新回复

这个跟CRC还跟LFSR很真不一样,   CRC强调校验,且被校验数据参与计算,一般都是并行算   LFSR它本身就是随机序列而已,一般是串着来算   详情 回复 发表于 2016-6-26 22:26
点赞 关注
个人签名training
 

回复
举报

1950

帖子

4

TA的资源

版主

沙发
 
项目上用 LFSR 的就 3中情况  -- 生成随机数的,
  -- 认证上面,会混入一些唯一硬件特性,配合一长LFSR,得到 唯一硬件的唯一时间的 唯一号码
  -- 无线通信上面

实现吗,比特多的 xor 就够了,也有动态切换公式的,
逻辑资源不够的直接上RAM查询
此帖出自FPGA/CPLD论坛

点评

受教了  详情 回复 发表于 2016-6-26 20:47
个人签名MicroPython中文社区https://micropython.org.cn/forum/  
 
 

回复

6423

帖子

17

TA的资源

版主

板凳
 
5525 发表于 2016-6-26 20:06
项目上用 LFSR 的就 3中情况  -- 生成随机数的,
  -- 认证上面,会混入一些唯一硬件特性,配合一长LFSR, ...

受教了
此帖出自FPGA/CPLD论坛
个人签名training
 
 
 

回复

280

帖子

0

TA的资源

一粒金砂(高级)

4
 
crc
此帖出自FPGA/CPLD论坛

点评

这个跟CRC还跟LFSR很真不一样, CRC强调校验,且被校验数据参与计算,一般都是并行算 LFSR它本身就是随机序列而已,一般是串着来算  详情 回复 发表于 2016-6-26 22:26
 
 
 

回复

1950

帖子

4

TA的资源

版主

5
 

这个跟CRC还跟LFSR很真不一样,
  CRC强调校验,且被校验数据参与计算,一般都是并行算
  LFSR它本身就是随机序列而已,一般是串着来算
此帖出自FPGA/CPLD论坛
个人签名MicroPython中文社区https://micropython.org.cn/forum/  
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表