FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-工程案例-正文

FPGA项目开发:基于FPGA的伪随机数发生器(附代码)

FPGA小白FPGA小白
工程案例
7个月前
0
0
217

一、概念

随机数是专门的随机试验的结果,产生随机数有多种不同的方法。这些方法被称为随机数生成器。随机数最重要的特性是它在产生时后面的那个数与前面的那个数毫无关系。随机数分为三类,分别是伪随机数、密码学安全的伪随机数以及真随机数。

本次设计为基于FPGA生成的伪随机数发生器,什么是伪随机数呢?统计学伪随机性指的是在给定的随机比特流样本中,1的数量大致等于0的数量,同理,“10”“01”“00”“11”四者数量大致相等。类似的标准被称为统计学随机性。满足这类要求的数字在人类“一眼看上去”是随机的。

在实际应用中往往使用伪随机数就足够了。这些数列是“似乎”随机的数,实际上它们是通过一个固定的、可以重复的计算方法产生的。计算机或计算器产生的随机数有很长的周期性。它们不真正地随机,因为它们实际上是可以计算出来的,但是它们具有类似于随机数的统计特征。这样的发生器叫做伪随机数发生器。

二、设计原理

本次设计采用线性反馈移位寄存器(Linear Feedback Shift Register, LFSR)来实现伪随机数发生器。线性反馈移位寄存器是指,给定前一状态的输出,将该输出的线性函数再用作输入的移位寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位。

线性反馈移位寄存器通常由动态或静态主从型触发器构成。反馈回路由异或门构成。其特性通常由一个特征多项式表征。LFSR结构如下图所示:

FPGA项目开发:基于FPGA的伪随机数发生器(附代码) - 第1张

图1 LFSR结构示意图

对应的特征多项式为:

FPGA项目开发:基于FPGA的伪随机数发生器(附代码) - 第2张

Gm为多项式的系数,而多项式系数只能为1或0。

利用LFSR生成伪随机数,需要给它一个随机种子(seed),由于它是由N个触发器和异或门组成,所以种子不能给全0,如果给的全0,将会陷入0的死循环一直出不来,就得不到我们想要的伪随机数,在设计时,我们可以给一个任意不为0的数。

基于以上原理,我们使用本原多项式x^32+x^7+x^5+x^3+x^2+x+1来构造最大周期的LFSR。

三、架构设计

设计架构如下图:

FPGA项目开发:基于FPGA的伪随机数发生器(附代码) - 第3张

将输入时钟命名为clk,复位信号命名为rst_n,输入有效信号命名为ivalid,输入的随机种子命名为seed[31:0],生成的随机数命名为data[31:0]。

四、Verilog 代码实现

代码中data <= seed部分也可以不需要,不用输入有效信号以及随机种子,直接初始化为非零值也可。如直接初始化为非零值,则仿真代码只需进行复位即可。

设计实现代码如下:

module PRNG(

  input      wire               clk,
  input      wire               rst_n,
  
  input      wire               ivalid,
  input      wire      &#91;31:0]   seed,
  
  output     reg       &#91;31:0]   data
);

  always @ (posedge clk,negedge rst_n) begin
    if (rst_n == 1'b0)
      data &lt;= 32'd0;
    else if (ivalid == 1'b1)
      data &lt;= seed; 
    else begin
      data&#91;0] &lt;= data&#91;31];
      data&#91;1] &lt;= data&#91;0] ^ data&#91;31];
      data&#91;2] &lt;= data&#91;1] ^ data&#91;31];
      data&#91;3] &lt;= data&#91;2] ^ data&#91;31];
      data&#91;4] &lt;= data&#91;3];
      data&#91;5] &lt;= data&#91;4] ^ data&#91;31];
      data&#91;6] &lt;= data&#91;5];
      data&#91;7] &lt;= data&#91;6] ^ data&#91;31];
      data&#91;8] &lt;= data&#91;7];
      data&#91;9] &lt;= data&#91;8];
      data&#91;10] &lt;= data&#91;9];
      data&#91;11] &lt;= data&#91;10];
      data&#91;12] &lt;= data&#91;11];
      data&#91;13] &lt;= data&#91;12];
      data&#91;14] &lt;= data&#91;13];
      data&#91;15] &lt;= data&#91;14];
      data&#91;16] &lt;= data&#91;15];
      data&#91;17] &lt;= data&#91;16];
      data&#91;18] &lt;= data&#91;17];
      data&#91;19] &lt;= data&#91;18];
      data&#91;20] &lt;= data&#91;19];
      data&#91;21] &lt;= data&#91;20];
      data&#91;22] &lt;= data&#91;21];
      data&#91;23] &lt;= data&#91;22];
      data&#91;24] &lt;= data&#91;23];
      data&#91;25] &lt;= data&#91;24];
      data&#91;26] &lt;= data&#91;25];
      data&#91;27] &lt;= data&#91;26];
      data&#91;28] &lt;= data&#91;27];
      data&#91;29] &lt;= data&#91;28];
      data&#91;30] &lt;= data&#91;29];
      data&#91;31] &lt;= data&#91;30];
    end
  end

endmodule

五、仿真测试及结果

仿真代码如下:

`timescale 1ns/1ps

module PRNG_tb;

  reg                 clk;
  reg                 rst_n;
  reg                 ivalid;
  reg       &#91;31:0]    seed;
  
  wire      &#91;31:0]    data;

  PRNG PRNG_inst(

    .clk            (clk),
    .rst_n          (rst_n),
    
    .ivalid         (ivalid),
    .seed           (seed),
    
    .data           (data)
  );
  
  initial clk = 1'b0;
  always # 5 clk = ~clk;
  
  initial begin
    rst_n = 1'b0;
  ivalid = 1'b0;
  seed = 32'd0;
  # 201;
  
  rst_n = 1'b1;
  #200;
  
  @ (posedge clk);
  # 2;
  ivalid = 1'b1;
  seed = {$random} % 4294967295;
  @ (posedge clk);
  # 2;
  ivalid = 1'b0;
  seed = 32'd0;
  
  #200000;
  $stop;
  end

endmodule

本次仿真采用100M时钟进行,输入种子为非零随机数。

FPGA项目开发:基于FPGA的伪随机数发生器(附代码) - 第4张
FPGA项目开发:基于FPGA的伪随机数发生器(附代码) - 第5张

六、总结

以上是经过学习,集合了各家所长得到的结果。由于想做一个32位的伪随机数发生器,在网上找了各种资料,并没有找到有规定的标准多项式,于是随意定了一个。在实际运用当中,如果有标准的多项式系数,可能得到了一个伪随机数,就可以根据已知的特征式得出后面的结果,安全性也就大大降低了。

标签:
本文原创,作者:FPGA小白,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/8732.html
FPGA小白

FPGA小白

初级工程师
成电国芯®的讲师哦,专业FPGA已有10年。
12411.55W6.48W34.33W
分享:
成电国芯FPGA赛事课即将上线
华为智驾ADS4.0系统正式发布 支持高速L3商用
华为智驾ADS4.0系统正式发布 支持高速L3商用上一篇
AMD-Xilinx Vivado™ 2024.1 现已推出,可供下载下一篇
AMD-Xilinx Vivado™ 2024.1 现已推出,可供下载
相关文章
总数:42
FPGA实现人脸检测

FPGA实现人脸检测

一、肤色提取  首先我们需要把肤色从外界环境提取出来,在肤色识别…
工程案例
3个月前
0
0
168
0
FPGA相机边缘检测

FPGA相机边缘检测

使用MiniZedZYNQFPGASoC实现用于车道检测的实时边缘…
工程案例
7个月前
0
0
127
1
🔥FPGA学习新风尚,从入门到进阶全攻略!🚀

🔥FPGA学习新风尚,从入门到进阶全攻略!🚀

🎉成电国芯集团携最强FPGA课程来袭!面试录播+双板卡实操+专属线上辅导…
工程案例
1年前
0
0
455
0
评论表单游客 您好,欢迎参与讨论。
请输入昵称
请输入邮箱
请输入网址
0 / 100
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
暂无评论,第一个评论下?