当前位置:   article > 正文

如何使用Verilog生成随机数_verilog 随机数 位宽 可重复的随机

verilog 随机数 位宽 可重复的随机

模块目的:生成随机数。

模块端口定义

输入:时钟信号,复位信号,重新加载信号,种子

输出:随机数

输入一个种子32位,输出16位随机数;选取时钟,复位,重新加载种子。

代码实现

// 使用32个逻辑单元用于D触发器/加法器和8个DSP块用于32x18=>32位乘法

module c_rand (

  input clk,         // 时钟输入

  input rst,         // 复位输入

  input reseed,      // 重新种子输入

  input [31:0] seed_val,  // 种子值输入

  output [15:0] out   // 16位随机数输出

);

  wire [15:0] out;    // 输出端口

 

  reg [31:0] state;   // 内部状态寄存器

  always @(posedge clk or posedge rst) begin

    if (rst)          // 如果复位信号被激活,将状态寄存器state重置为0

      state <= 0;

    else begin

      if (reseed)     // 如果重新种子信号被激活,将状态寄存器state更新为输入的种子值seed_val

        state <= seed_val;

      else begin

        // 使用C运行时库的随机数生成算法更新状态寄存器state

        state <= state * 32'h343fd + 32'h269EC3;

      end

    end

  end

  // 输出随机数是状态寄存器的高16位,并对结果进行位与运算,仅保留低15位(15:0)

  assign out = (state >> 16) & 16'h7fff;

endmodule

测试文件:

Tb文件

`timescale 1ns / 1ps

module rand_test ();

reg clk, rst, reseed;

wire [15:0] out;

reg [31:0] seed_val;

c_rand c (.clk(clk),.rst(rst),.reseed(reseed),.seed_val(seed_val),.out(out));

initial begin

       rst = 0;

       clk = 0;

       seed_val = 32'd1234;

       #10 rst = 1;

       #10 rst = 0;

       #10 reseed = 1;

end

//-----命令行打印生成的随机数-----------

always @(negedge clk) begin

  reseed = 0;

  $display ("%x",out);

end

//----时钟翻转间隔----

always begin

       #1000 clk = ~clk; 

end

endmodule

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号