精华内容
下载资源
问答
  • 2019-02-10 22:40:29

    一、概述
    真随机数序列的定义:
    ①能通过所有正确的随机性检验。
    ②序列的产生是不可预知的。
    ③在完全相同的操作条件下得到的序列是不重复的
    在自然界中确实拥有作为随机数发生器能产生满足这样定义的现象与实例,我们将这样的随机数称为真随机数

    在实际应用中 最普遍的算法模式是迭代:Xi + 1 = f( Ε, Xi)

    结合真随机数的定义, 我们需要从以下几个方面重点解决伪随机数性能
    的问题:
    ①序列能否在一定置信度条件下通过所有正确的随机性检验。
    ②序列能否按照要求服从一定的概率分布。
    ③在不知道 Xn 的情况下能否保证一定不知道 Xn + 1 。
    ④在怎样的种子和参数控制下才能使序列保持较长的周期且不退化。
    ⑤不同种子控制下的序列能否不重复且能否尽可能地不相关。

    二、服从均匀分布的伪随机数
    1.目前应用最为 广泛的均匀分布伪随 机数发生器就是线性 同余伪随机发生器LCG。LCG 的迭代描述公式为:xi + 1 = ( a xi + c) ( mod m)
    2.小数开方伪随机数发生器的基本原理是基于以下定理:在这里插入图片描述
    推导出:若当某一 xi 是一个无理数时, 则其后由迭代产生的数都将是无理数, 那么该序列的每一个数显然可以保持较长的位数, 从而避免了序列的退化。在不限定取值位数的条件下, 该方法产生的序列周期 T→∞。

    function randmtx = randU2( row, col, seed, k1, k2)
    if nargin < 3
    seed = 11;
    end
    m = 4 ;
    seed2 = sqrt( seed) ;
    while seed2 < 1
    seed2 = seed2* 10 ;
    end
    n = round( seed2 /m) ;
    x = ( 10^n) * seed2;
    randmtx( 1, 1) = x - floor( x) ;
    for i = 2∶row* col
    temp = sqrt( abs( randmtx( 1, i-1) ) ) ;
    while temp < 1
    temp = temp* 10;
    end
    n = round( temp /m) ;
    x = ( 10^n) * temp;
    randmtx( 1, i) = ( x - floor( x) ) ;
    end
    randmtx = reshape( randmtx, row, col) ;
    if nargin < 4
    return
    end
    randmtx = randmtx* ( k2 - k1) + k1;
    

    3.对所生成的随机序列的统计检验
    在这里插入图片描述
    随机序列的检测手段
    三、服从其他概率分布的伪随机数
    由于最初的数字水印本身就是一个服从随机分布的正态矩阵,我们不仅要求能够得到均匀分布的随机序列, 还要求得到任意分布的随机序列, 这才能适应信息隐藏学科的需要。
    1.构造的一般思路:
    ① 产生均匀分布随机序列 X{x1, x2, …, xn } ;
    ② 令 yi = G^- 1( xi) ;
    ③ 则随机序列 Y{y1, y2, …, yn }即为所求。
    2.对于序列 Y, 满足:
    在这里插入图片描述
    即得到服从 N( μ, σ^2) 的特性。

    在 MATLAB 中, randn. m 函数就是依照式( 2. 26 ) 编写的产生正态分布随机数的
    函数。
    3.正态分布随机序列的统计检验
    引入 正态概率纸检验法
    MATLAB 中的正态概率纸函数是 normplot 函数。标准正态分布函数在正态坐标下是一条直线。
    故经过操作

    >> ans = randn( 1, 1000) ;
    >> ans2 = randU1 ( 1, 1000, 100, 0, 1) ;
    >> normplot( ans) ; hold on; normplot( ans2) ;
    

    若所得为直线,随机序列即服从正态分布。

    四、具有混沌特性的伪随机数
    1.下面是 Logistic 方程产生混沌序列的 MATLAB 函数 randCL. m。
    文件名: randCL. m
    %目的: 利用 Logistic 方程产生混沌序列
    应用举例: a = randCL( 10, 10, 0. 5, 3. 9 )
    参数说明: 此函数产生一个序列矩阵
    row: 为矩阵的行
    col: 为矩阵的列
    seed: 为初值( 0 到 1)
    u : 即为公式中的 μ( 大于 3. 5699 小于等于 4)
    %

    function randmtx = randCL( row, col, seed, u)
    randmtx( 1, 1) = seed;
    for i = 2∶row* col
    randmtx( 1, i) = u* randmtx( 1, i - 1) * ( 1 - randmtx( 1, i - 1) ) ;
    end
    randmtx = reshape( randmtx, row, col) ;
    

    在一些数字水印算法中, 就是将生成好的混沌序列按照某种规则把它转化为需要的 0, 1 二值序列作为数字水印嵌入载体的。这时的水印与混沌序列有相同的性质, 就是与初值紧密相关。
    2.混合光学双稳模型产生的混沌序列
    迭代方程的形式为:
    xn + 1 = Asin^2·( xn - xB )
    这里有两个参数 A, xB , 分别取 4 和 2. 5, 此时方程处于混沌状态, 赋给它不同的初值 x0 将得到不同的混沌序列, 下面同样给出它的 MATLAB 函数 randCS. m。
    %目的: 由混合光学双稳模型生成混沌序列
    % 应用举例: a = randCS( 10, 10 , 0. 5) ;
    % 参数说明: 此函数产生一个序列矩阵,
    % row 为矩阵的行
    % col 为矩阵的列
    % seed 为初值( 0 到 1) 即公式中初值 X0
    % 这里固定取 A = 4 , Xb = 2. 5

    function randmtx = randCS( row, col, seed)
    A = 4;
    Xb = 2. 5;
    randmtx( 1, 1) = seed;
    for i = 2∶row* col
    randmtx( 1, i) = A* sin( randmtx( 1, i - 1 ) - Xb) * sin ( randmtx( 1, i - 1 ) -
    Xb) ;
    end
    randmtx = reshape( randmtx, row, col) ;
    

    五、其他伪随机数发生器
    1.N 级线性最长反馈序列( m 序列)
    下面我们用 MATLAB 编写一个函数, 来产生这一序列。函数名叫做 mrand. m。
    在函数中使用一个 connection 数组表示连接多项式。

    function [ seq] = mrand( connection)
    m = length( connection) ;
    L = 2^m - 1;
    registers = [ zeros( 1, m - 1 ) 1] ;
    seq( 1) = registers( m) ;
    for i = 2∶L
    new_reg_cont( 1) = connection( 1) * seq( i - 1) ;
    for j = 2∶m
    new_reg_cont( j) = bitxor( registers( j - 1) , connection( j) * seq( i - 1 ) ) ;
    end
    registers = new_reg_cont;
    seq( i) = registers( m) ;
    end
    

    2.伪随机组合发生器的一般原理
    组合发生器是指用几个不同的随机数发生器组合所得到的一种发生器。
    组合发生器一算法描述如下:
    ① 用混沌映射( RandCL) 产生 N 个随机数, 存放在矢量 L = ( l1
    , l2
    , …, l N ) 中。
    ② 用线性同余发生器( RandU1 ) 产生一个小于 N 的随机整数 k。
    ③ 令 rn = lk 。然后利用混沌映射( RandCL) 再产生一个随机数 temp, 令l k = temp。
    ④ 重复②③得到新的随机序列{ r n }。

    六、随机序列在信息隐藏中的运用
    1.随机序列与信息嵌入位的选择
    Kerckhoffs 原则是信息安全的一个基本原则, 即系统的安全仅仅依赖于密钥而不是安全算法。因此,我们使用随机序列控制信息嵌入位。
    常见的随机数控制的方法有两个: 随机间隔法和随机置换法。本节主要介绍随机间隔法。随机间隔法的思想比较简单, 主要是利用随机数的大小控制前后两个嵌入位的距离。

    该程序是一个严格意义上的随机间隔选择隐藏位的程序
    function [ row, col] = randinterval( matrix, count, key)
    % 计算间隔的位数
    [ m, n] = size( matrix) ;
    interval1 = floor( m* n / count) + 1;
    interval2 = interval1 - 2;
    if interval2 == 0
    error( ′载体太小不能将秘密信息隐藏进去! ′) ;
    end
    % 生成随机序列
    rand( ′seed′, key) ;
    a = rand( 1, count) ;
    % 初始化
    row = zeros( [ 1 count] ) ;
    col = zeros( [ 1 count] ) ;
    % 计算 row 和 col
    r = 1;
    c = 1 ;
    row( 1, 1) = r;
    col( 1, 1) = c;
    for i = 2∶count
    if a( i) > = 0. 5
    c = c + interval1;
    else
    c = c + interval2;
    end
    if c > n
    r = r + 1;
    if r > m
    error( ′载体太小不能将秘密信息隐藏进去! ′) ;
    end
    c = mod( c, n) ;
    if c == 0
    c = 1;
    end
    end
    row( 1, i) = r;
    col( 1, i) = c;
    end
    
    

    2.安全 Ha sh 函数
    在随机置换法中, 由于对随机序列不加任何的限制, 不恰当的置换策略将很容易导致选择的像素位重复出现多次, 从而造成一个像素嵌入了多个信息, 后嵌入的信息破坏了先嵌入的信息, 我们称这种情况为碰撞( collision) 。解决碰撞的机制有很多,如数据结构中的开地址法等。这里我们将使用到安全 Hash 函数的伪随机置换算法,该算法可以解决碰撞问题。
    Hash 函数的作用是将任意长度的报文映射为一个长度固定的 Hash 码。Hash码是报文每一位的函数。报文任意一位的改变都将导致 Hash 码的改变。常用的安全 Hash 函数有: MD5 , SHA-1 等。这里, 我们使用 MD5。
    MD5 算法运算步骤如下:
    ( 1 ) 填充报文
    ( 2 ) 初始化缓冲区
    ( 3 ) 循环执行压缩函数
    ( 4 ) 输出 Hash码

    更多相关内容
  • 为了克服计算机处理数据的有限精度导致混沌特性退化的缺陷,改善...以新方法设计的伪随机数发生器易于软件实现,生成的序列通过随机数检测标准NIST SP800-22,从而具有良好的随机性,可用于保密通信等信息安全领域。
  • 伪随机数发生器

    2020-10-18 22:58:59
    本文包括:随机数的性质,具体的伪随机数发生器,攻击思路。 伪随机数发生器包括:线性同余法,BBS,分组密码形式,ANIS X.917,单项散列函数,密码法。

    本文包括:随机数的性质,具体的伪随机数发生器,攻击思路。

    伪随机数发生器包括:线性同余法,BBS,分组密码形式,ANIS X.917,单项散列函数,密码法。

    尝试新编辑格式!
    .

    性质

    随机性

    1. 可伸缩性:任何子序列都符合随机性
    2. 统计分布均匀:0 1 分布很好地保持在各占50%。
    3. 独立性:任何子序列不能通过其他子序列推导出来。
    4. 一致性:输入任何种子都符合随机性

    不可预测性

    在攻击者知道过去的伪随机数列的情况下,仍然无法预测下一个伪随机数。

    1. 向后不可预测性
    2. 向前不可预测性

    不可重现性

    真随机数(如白噪声,热辐射,分子无规律运动 等)。

    投骰子是真随机数。

    伪随机数发生器——PRNG

    1. 伪随机比特流:生产不限长的位流,应用于流密码。
    2. 伪随机函数(PRF):生产固定长度的位串,每轮输入包括种子+上下文。应用于对称密码 等等。

    二者除了位的数量之外,并无区别

    真随机数发生器——TRNG

    .
    .

    具体的伪随机数发生器

    1.线性同余法

    m:模 , a:乘数 , c:增量 , X0:种子

    Xn+1 =(aXn+c)mod m

    特点:

    只有随机性,不具备不可预测性,不能用于密码技术
    很多伪随机数库都是用线性同余法编写的,如C语言的rand,JAVA的java.util.Random类等,这些都不能用于密码技术

    三个标准:

    1.全周期,即 t=m-1
    2.越随机越好
    3.可以在32位运算器方便运算

    常用:

    取c=0;m=231-1.
    Xn+1 =(aXn)mod(231-1)
    虽然a的取值有很多很多,但其实满足3个标准的并不多。

    攻击:

    1.如果其他人知道了参数a,c,m,那么它只需知道一个随机数,就可以推得后续所有数列
    2.如果仅知道是线性同余法,那么只需知道连续4个随机数,也可以推得后续数列

    改进:

    1.每隔N个数,就重新输入种子(比如对时钟取模作为种子)
    2.增加一步,将随机数加时钟值再取模
    .

    .

    2.BBS发生器

    算法:

    选择两个大素数p, q, 满足 p ≡ q ≡ 3(mod 4)
    设n=pq, 找一个随机数s, s和n互素,即gcd(s,n)=1
    令 X0 = s2 mod n

    for i=1 to ∞
    Xi = (Xi-12mod n
    Bi = Xi mod 2

    S叫种子

    特点:

    随机性+不可预测性
    性能很好!

    贴个例子(抄来的):(n=383*503,s=101355)
    2
    .

    3.分组密码形式

    利用OFB和CTR模式思想的伪随机数发生器。
    在这里插入图片描述

    不同点:

    CTR模式:每次V++
    OFB模式:本轮输出作为下轮的V

    相同点:

    种子 = K + V
    (对于ASE的话,种子 = 128bit密钥 + 128bit的V)

    .
    .

    4. ANIS X.917

    史上最强?

    • 应用在金融和PGP等。

    构成:

    输入:64位的时间值 + 64位种子(任意初始值)(二者都必需不断更新)
    密钥:三个3DES模块,用同一个56bit密钥
    输出:64位随机数 + 64位种子

    过程: 图背下来
    (其中EDE([K1,K2],X)代表两个密钥的3DES。)
    在这里插入图片描述

    加密钥(图):在这里插入图片描述

    思路:

    用三次3DES保证了随机数
    即使他人知道了输出RI,也无法推出其他参数。
    换句话说:密钥保护了内部状态。

    .

    5. 单项散列函数

    具备 随机性 + 不可预测性

    散列的单向性是不可预测性的保障。
    在这里插入图片描述

    .

    6. 密码法

    在这里插入图片描述
    思路同于单项散列函数。
    密钥是不可预测性的保障。

    .
    .
    .

    攻击思路

    1. 对种子攻击

    一般 种子 由真随机数发生器生成。

    1. 对随机数池攻击

    真随机数一般不会等使用时才当场生成,
    而是提前生成一些,储备在名为随机数池的文件中。
    如果随机数池遭到攻击,那么伪随机数都可能被预测,
    虽然随机数池的数据并没有实际意义,但是我们却必须保护它。

    .
    .
    .
    .
    .
    .
    .

    展开全文
  • FPGA项目开发:基于FPGA的伪随机数发生器(附代码) 今天是画师和各位大侠见面了,执笔绘画FPGA江湖,本人写了篇关于FPGA的伪随机数发生器学习笔记,这里分享给大家,仅供参考。 一、概念 随机数是专门的随机试验...

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

    今天是画师和各位大侠见面了,执笔绘画FPGA江湖,本人写了篇关于FPGA的伪随机数发生器学习笔记,这里分享给大家,仅供参考。

    一、概念

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

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

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

    二、设计原理

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

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

    图1 LFSR结构示意图

    对应的特征多项式为:

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

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

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

    三、架构设计

    设计架构如下图:

    将输入时钟命名为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      [31:0]   seed,
      
      output     reg       [31:0]   data
    );
    
      always @ (posedge clk,negedge rst_n) begin
        if (rst_n == 1'b0)
          data <= 32'd0;
        else if (ivalid == 1'b1)
          data <= seed; 
        else begin
          data[0] <= data[31];
          data[1] <= data[0] ^ data[31];
          data[2] <= data[1] ^ data[31];
          data[3] <= data[2] ^ data[31];
          data[4] <= data[3];
          data[5] <= data[4] ^ data[31];
          data[6] <= data[5];
          data[7] <= data[6] ^ data[31];
          data[8] <= data[7];
          data[9] <= data[8];
          data[10] <= data[9];
          data[11] <= data[10];
          data[12] <= data[11];
          data[13] <= data[12];
          data[14] <= data[13];
          data[15] <= data[14];
          data[16] <= data[15];
          data[17] <= data[16];
          data[18] <= data[17];
          data[19] <= data[18];
          data[20] <= data[19];
          data[21] <= data[20];
          data[22] <= data[21];
          data[23] <= data[22];
          data[24] <= data[23];
          data[25] <= data[24];
          data[26] <= data[25];
          data[27] <= data[26];
          data[28] <= data[27];
          data[29] <= data[28];
          data[30] <= data[29];
          data[31] <= data[30];
        end
      end
    
    endmodule
    

    五、仿真测试及结果

    仿真代码如下:

    `timescale 1ns/1ps
    
    module PRNG_tb;
    
      reg                 clk;
      reg                 rst_n;
      reg                 ivalid;
      reg       [31:0]    seed;
      
      wire      [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时钟进行,输入种子为非零随机数。

    六、总结

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

    【QQ交流群】

    群号:173560979,进群暗语:FPGA技术江湖粉丝。

    多年的FPGA企业开发经验,各种通俗易懂的学习资料以及学习方法,浓厚的交流学习氛围,QQ群目前已有1000多名志同道合的小伙伴,无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有。

    【微信交流群】

    现微信交流群已建立09群,人数已达数千人,欢迎关注“FPGA技术江湖”微信公众号,可获取进群方式。

    后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

    江湖偌大,继续闯荡,愿大侠一切安好,有缘再见!

    展开全文
  • Park-Miller伪随机数发生器(PRNG)
  • 伪随机数生成的仅标头实现,支持在两个方向上生成随机数。 什么是可逆的? 大多数随机数生成仅支持在一个方向上生成数字: Rng myRng (seed) int rnd1 = myRng.next(); int rnd2 = myRng.next(); int rnd3 = ...
  • 基于量子随机游动的新型伪随机数发生器
  • 今天给大侠带来在基于FPGA的伪随机数发生器,话不多说,上货。 今天是画师本人第一次和各位大侠见面,执笔绘画FPGA江湖,本人写了篇关于FPGA的伪随机数发生器学习笔记,这里分享给大家,仅供参考。 ...

    今天给大侠带来在基于FPGA的伪随机数发生器,话不多说,上货。

     

     

     

     

    今天是画师本人第一次和各位大侠见面,执笔绘画FPGA江湖,本人写了篇关于FPGA的伪随机数发生器学习笔记,这里分享给大家,仅供参考。

     

     

    1

    概念

     

     

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

     

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

     

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

     

     

    2

    设计原理

     

     

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

     

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

    图1 LFSR结构示意图

     

    对应的特征多项式为:

     

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

     

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

     

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

     

     

    3

    架构设计

     

    设计架构如下图:

     

     

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

     

     

    4

    Verilog 代码实现

     

     

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

     

      设计实现代码如下:

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

     

     

    5

    仿真测试及结果

     

     

    仿真代码如下:

    `timescale 1ns/1psmodule PRNG_tb;  reg                 clk;  reg                 rst_n;  reg                 ivalid;  reg       [31:0]    seed;    wire      [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;  endendmodule 

     

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

     


     

     

    6

    总结

     

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

     

     

    END

     

    后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

    大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

     

     

    往期精选 

    电子版资料获取方式正确流程

    详解FPGA技术,为什么这么牛?

    干货 | 拆解FPGA芯片,带你深入了解其原理

    FPGA在人工智能时代的独特优势

    FPGA设计的8大重要知识点,你都get了吗?

    开课通知 | 2021FPGA寒假班来啦!

    展开全文
  • 各类伪随机数发生器

    2015-09-07 23:57:23
    包括三个文件:一个.cpp文件产生0-1均匀随机数,包括C自带的随机数发生器和改进的混沌随机数发生器;另一个.cpp文件产生常见的正态分布随机数、柯西分布随机数和指数分布随机数等;最后一个txt文件给了几篇关于...
  • 把由锯齿映射组成的近邻耦合映像格子作为时空混沌系统,各...在此基础上利用该伪随机数发生器构成一种简单的流密码,讨论了其安全性,发现基于近邻耦合锯齿映射的时空混沌伪随机数发生器能用来构造更高效安全的混沌流密
  • 用FPGA实现伪随机数发生器,更加快速、方便可靠
  • Mersenne Twister - 伪随机数生成 Mersenne Twister 是由 Makoto Matsumoto 和 Takuji Nishimura 在 1996/1997 开发的伪随机数生成算法。 它旨在快速生成高质量的伪随机数。 请注意,此处提供的此算法不适用于密码...
  • 针对基本元胞自动机(Cellular Automata,简称CA)、混合CA的伪随机数发生器进行了深入的研究,通过对比实验观察到混沌型基本CA输出的伪随机序列质量稳定并较优,而混合CA输出伪随机序列的相关性,尽管优于基本CA的...
  • 基于FPGA的高速任意分布伪随机数发生器.pdf
  • 而随 机局部搜索策略的关键在于随机数发生器( PRNG),从随机数发生器的周期和速度特性探索了其对随机局部 搜索的影响。主要实验方法是,测试多个实例及运行多遍程序,目的是消除随机意义的偶然性。分析了两个案 例:一个...
  • 基于超混沌的伪随机数发生器的FPGA设计
  • 利用malloc取内存地址作为随机源,利用线性同余法生成随机数
  • 伪随机数发生器与单向散列函数PPT课件.pptx
  • 伪随机数发生器与单向散列函数PPT学习教案.pptx
  • 组合方法改进MonteCarlo计算中的伪随机数发生器.pdf
  • 然而,时空混沌系统的概率密度分布不均匀,不利于保证伪随机数发生器的安全。针对此问题,提出一种新的基于时空混沌系统的伪随机发生器算法。该算法从提升时空混沌局部映射的密码学性能入手,将分段Logistic映射作为...
  • 在超素数用于生成伪随机数的基础上。结合素数性质以及算法技巧,给出一种优选乘子的超素数伪随机数法和一种更长周期的伪随机数生成方法,这两种方法都有更理想的统计性能。超素数方法的周期是M-1,而长周期方法的...
  • 著名的MT19937伪随机数发生器C源码
  • 随着科学技术的发展,工程建设与科学研究对测量定位精 度的要求越来越高。这要求测量工作者对测量的仪器、工具与设备进行研究,以此不断...在研究随机误差的影响方面,随机模拟法(蒙特卡洛法)是一种很有效的数学分析方法。
  • mickey伪随机数发生器

    2017-02-16 09:59:08
    mickey伪随机数发生器 使用codeblock编写
  • 基于mebedtls中ctr_drbg的实现实例 使用vs2015编写

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,475
精华内容 14,590
关键字:

伪随机数发生器

友情链接: company.rar