如何使用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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值