模块目的:生成随机数。
模块端口定义
输入:时钟信号,复位信号,重新加载信号,种子
输出:随机数
输入一个种子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文章来源地址https://www.toymoban.com/news/detail-767969.html
测试文件:
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文章来源:https://www.toymoban.com/news/detail-767969.html
//-----命令行打印生成的随机数-----------
always @(negedge clk) begin
reseed = 0;
$display ("%x",out);
end
//----时钟翻转间隔----
always begin
#1000 clk = ~clk;
end
endmodule
到了这里,关于如何使用Verilog生成随机数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!