基于FPGA的LFSR16位伪随机数产生算法实现,可以配置不同的随机数种子和改生成多项式,包含testbench

这篇具有很好参考价值的文章主要介绍了基于FPGA的LFSR16位伪随机数产生算法实现,可以配置不同的随机数种子和改生成多项式,包含testbench。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.算法仿真效果

2.算法涉及理论知识概要

3.Verilog核心程序

4.完整算法代码文件


1.算法仿真效果

vivado2019.2仿真结果如下:

fpga产生随机数,FPGA通信和信号处理,fpga开发,matlab,LFSR,伪随机数

fpga产生随机数,FPGA通信和信号处理,fpga开发,matlab,LFSR,伪随机数

2.算法涉及理论知识概要

          LFSR(线性反馈移位寄存器)提供了一种在微控制器上快速生成非序列数字列表的简单方法。生成伪随机数只需要右移操作和 XOR 操作。LFSR 完全由其多项式指定。例如,6千-次多项式与每个项存在用方程 x 表示6+ x5+ x4+ x3+ x2+ x + 1。有 2 个(6 - 1)= 32 个这种大小的不同可能多项式。与数字一样,一些多项式是素数或原始数。我们对原始多项式感兴趣,因为它们会在移位时为我们提供最大长度周期。n 次的最大长度多项式将有 2n- 1个不同的州。每个班次后都会转换到新状态。因此,6千-次多项式将有 31 种不同的状态。1 到 31 之间的每个数字在重复之前都会出现在移位寄存器中。在基元 6 的情况下千-次多项式,只有六个。表 1 列出了所有基元 6千-次多项式及其各自的多项式掩码。多项式掩码是通过采用多项式的二进制表示并截断最右侧的位来创建的。掩码用于实现多项式的代码中。实现 n 的多项式掩码需要 n 位千-次多项式。

        每个基元多项式都有奇数项,这意味着基元多项式的每个掩码都有一个偶数 1 位。每个原始多项式还定义了第二个原始多项式,即它的对偶。可以通过从每项的多项式次数中减去指数来找到对偶。例如,给定 6千-次多项式,x6+ x + 1,它的对偶是 x6-6+ x6-1+ x6-0,等于 x6+ x5+ 1.在表 1 中,多项式 1 和 2、3 和 4、5 和 6 是彼此的对偶。表 2 列出了每个不同大小多项式的周期以及每个大小存在的基元多项式的数量。表 3 列出了每个不同大小的多项式的一个多项式掩码。它还显示了当 LFSR 初始化为 1 时,LFSR 在连续班次后将保持的前四个值。此表应有助于确保实现正确。

       LFSR 的值永远不会为零,因为归零的 LFSR 的每个偏移都会将其保留为零。LFSR 必须初始化,即种子,为非零值。当 LFSR 保持 1 并移动一次时,其值将始终为多项式掩码的值。当寄存器除最高有效位外全部为零时,接下来的几个偏移将显示高位偏移到零填充的低位。例如,任何具有基元多项式的 8 位移位寄存器最终将生成序列 0x80、0x40、0x20、0x10、8、4、2、1,然后生成多项式掩码。

        一般来说,基本的LFSR不会产生非常好的随机数。通过选择较大的LFSR并使用较低的位作为随机数,可以改进更好的数字序列。例如,如果您有一个 10 位 LFSR 并且想要一个 8 位数字,则可以将寄存器底部的 8 位作为您的号码。使用此方法,您将看到每个 8 位数字四次和零,三次,然后 LFSR 完成一个周期并重复。这解决了得到零的问题,但数字仍然没有表现出非常好的统计特性。相反,您可以将 LFSR 的子集用于随机数,以增加数字的排列并改善 LFSR 输出的随机属性。

       在获得随机数之前多次移动LFSR也可以改善其统计特性。将LFSR移动其周期的一个因子将使总周期长度减少该因子。表2列出了各期间的因素。

       LFSR 相对较短的周期可以通过将两个或多个不同大小的 LFSR 的值异或相处来解决。这些异或LFSR的新周期将是周期的LCM(最小公倍数)。例如,基元 4 位和基元 6 位 LFSR 的 LCM 是 LCM(15, 63),即 315。以这种方式加入 LFSR 时,请确保仅使用最小位数的 LFSR;使用少于此量是更好的做法。对于 4 位和 6 位 LFSR,不应使用超过底部的 4 位。在图 2 中,底部的 16 位用于 32 位和 31 位 LFSR。 请注意,对两个相同大小的 LFSR 进行异或运算不会增加周期。

       LFSR的不可预测性可以通过用反馈项对一点“熵”进行异或来增加。这样做时应该小心——加上熵位,LFSR 到所有零的可能性很小。如果定期添加熵,LFSR 的归零将自行校正。这种与反馈项进行异或的方法就是CRC(循环冗余校验)的计算方式。

       多项式不是生而相等的。有些多项式肯定会比其他多项式更好。表 2 列出了可用于最大 31 位大小的基元多项式的数量。尝试不同的多项式,直到找到满足您需求的多项式。表3中给出的掩模是随机选择的。

       可以使用NIST的统计测试套件进行更广泛的测试。NIST还有几本出版物描述了随机数测试和对其他测试软件的引用。

       通过一定的算法对事先选定的随机种子(seed)做一定的运算可以得到一组人工生成的周期序列,在这组序列中以相同的概率选取其中一个数字,该数字称作伪随机数,由于所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。

       这里的“伪”的含义是,由于该随机数是按照一定算法模拟产生的,其结果是确定的,是可见的,因此并不是真正的随机数。伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要,如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。

fpga产生随机数,FPGA通信和信号处理,fpga开发,matlab,LFSR,伪随机数

       产生伪随机数的方法最常见的是利用一种线性反馈移位寄存器(LFSR)。它是由n个D触发器和若干个异或门组成的,如图: 

fpga产生随机数,FPGA通信和信号处理,fpga开发,matlab,LFSR,伪随机数

       其中,gn为反馈系数,取值只能为0或1,取为0时表明不存在该反馈之路,取为1时表明存在该反馈之路;n个D触发器最多可以提供2^n-1个状态(不包括全0的状态),为了保证这些状态没有重复,gn的选择必须满足一定的条件。下面以n=3,g0=1,g1=1,g2=0,g3=1为例,说明LFSR的特性,具有该参数的LFSR结构如下图:fpga产生随机数,FPGA通信和信号处理,fpga开发,matlab,LFSR,伪随机数

3.Verilog核心程序

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 

// Create Date: 2023/03/24 15:39:40
// Design Name: 
// Module Name: TEST
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module TEST();
 
reg          i_clk;  	
reg          i_rst;    	 
reg          i_load;  		 
reg  [15:0]	 i_seed;   	//随机种子
wire [15:0]	 o_rand;  	//16位随机数



tops uut(
			   	    .i_clk  (i_clk),  	
					.i_rst  (i_rst),    	 
					.i_load (i_load),  		 
					.i_seed (i_seed),     	//随机种子
					.o_rand (o_rand)  	    //16位随机数
);


initial
begin
i_clk=1'b1;
i_rst=1'b1;
i_load=1'b1;
i_seed=16'd12315;
#1000
i_rst=1'b0;
#100
i_load=1'b0;
#500;
i_load=1'b1;
i_seed=16'd5285;
#500;
i_load=1'b0;
#800;
i_load=1'b1;
end

always #5 i_clk=~i_clk;


endmodule

4.完整算法代码文件

V文章来源地址https://www.toymoban.com/news/detail-667317.html

到了这里,关于基于FPGA的LFSR16位伪随机数产生算法实现,可以配置不同的随机数种子和改生成多项式,包含testbench的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在MATLAB产生正态(Gauss)分布随机数

    在 MATLAB 中内置了有产生标准正态(Gauss)分布的随机数函数,使用方法如下: 其中 m、n 为产生矩阵的行数和列数, p 为产生矩阵的个数,产生的矩阵中的每个元素均为服从 N ( 0 , 1 ) N(0, 1) N ( 0 , 1 ) 的标准正态分布的元素。 使用如下命令产生一个 100x1 的服从 标准正态(Gauss)分布

    2024年02月02日
    浏览(34)
  • C语言随机数的产生(rand、srand、time函数细节讲解)

    先上代码,再详细解释: 我们先来查询下rand函数 网站旧版我放在这儿,可以查询库函数等https://legacy.cplusplus.com/reference/cstring/strcat/ rand函数的头文件是stdlib.h。 rand函数无需传参数,返回类型是一个伪随机的整数范围是0到RAND_MAX。那这个RAND_MAX所对应的值是多少呢?我们同样

    2024年02月08日
    浏览(38)
  • Google Earth Engine(GEE)——土地分类精度分析randomColumn产生伪随机数然后进行混淆矩阵计算

    我们在进行土地分类时,需要进行精度验证,但是之前我们要进行样本点的随机分类,也就是分出一部分作为训练样本另外一部分作为,这是我们要想产生随机种子赋值给我们所选定的训练样本,这样我们就可以随机将样本进行分成训练样本和验证样本,而我们使用的函数

    2024年02月09日
    浏览(36)
  • JS - 生成随机数的方法汇总(不同范围、类型的随机数)

    (1)使用 random() 方法可以返回一个介于 0 ~ 1 之间的伪随机数(包括 0,不包括 1)。 (2)下面是一个测试样例 (1)这种最简单,因为和 random 的特点保持一致。只需使用如下公式即可: (2)比如下面生成 [10,15) 范围内的随机浮点数。 因为 random 的特点,要取得这几个区间

    2023年04月08日
    浏览(37)
  • Unity 中的随机数的基础常用的随机数生成方法

    在 Unity 中,可以使用 Random 类来生成随机数。以下是一些常用的随机数生成方法: Random.Range(min, max):生成一个在[min, max)范围内的随机整数。 Random.value:生成一个在[0, 1)范围内的随机浮点数。 Random.insideUnitCircle:生成一个在单位圆内的随机二维向量。 Random.insideUnitSphere:生成

    2024年02月20日
    浏览(41)
  • Hutool 生成随机数和随机字符串

    官方文档: https://www.hutool.cn/docs/#/core/工具类/随机工具-RandomUtil 整理完毕,完结撒花~

    2024年02月16日
    浏览(44)
  • MySQL、Oracle 生成随机ID、随机数、随机字符串

    UUID():是由128位的数字组成的全局唯一标识符。每次都生成一个新的随机数。 它通常以32个十六进制数的形式表示,分为5个部分,以连字符分隔。 UUID的长度是36个字符,包括32个十六进制数字和4个连字符。 UUID的标准格式是由 8-4-4-4-12 个十六进制数字组成的,其中每个部分的

    2024年01月16日
    浏览(44)
  • 随机数算法,SQL

    记录 id      权重 1       5 2       10 3       50 4      100 找权重最大的那个值,调用rand()函数,它会随机生成一个0-1的值 然后 rand * 100 得出一个随机值  它的范围  0 =  随机值   100 例如本次随机值为2,那么找到 大于2的所有记录,然后升序 此时查询结果为 2     

    2024年02月09日
    浏览(27)
  • Qt之随机数

            介绍使用qsrand和qrand生成随机数。         生成随机数主要用到了函数qsrand和qrand,qsrand用来设置种子点,该种子为qrand生成随机数的起始值。如果不调用qsrand,那么qrand()就会自动调用qsrand(1),即系统默认将1作为随机数的起始值。使用相同的种子生成的随机数一样

    2024年02月09日
    浏览(26)
  • mysql随机数函数

    declare@iint select@i=count(*)fromA while@i0 begin UpdateAsetB=ceiling(rand()*150+50)whereid=@i set@i=@i-1 id是表A里的自增长列,不清楚你的表里有没有,若是没有的话,可以自己造个临时表,插入数据。 本回答由提问者推荐 UUID是一个由5位十六进制数的字符串表示的128比特数字,其格式为aaaaaaaa-

    2023年04月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包