模塊目的:生成隨機數(shù)。
模塊端口定義
輸入:時鐘信號,復(fù)位信號,重新加載信號,種子
輸出:隨機數(shù)
輸入一個種子32位,輸出16位隨機數(shù);選取時鐘,復(fù)位,重新加載種子。
代碼實現(xiàn)
// 使用32個邏輯單元用于D觸發(fā)器/加法器和8個DSP塊用于32x18=>32位乘法
module c_rand (
? input clk,???????? // 時鐘輸入
? input rst,???????? // 復(fù)位輸入
? input reseed,????? // 重新種子輸入
? input [31:0] seed_val,? // 種子值輸入
? output [15:0] out?? // 16位隨機數(shù)輸出
);
? wire [15:0] out;??? // 輸出端口
?
? reg [31:0] state;?? // 內(nèi)部狀態(tài)寄存器
? always @(posedge clk or posedge rst) begin
??? if (rst)????????? // 如果復(fù)位信號被激活,將狀態(tài)寄存器state重置為0
????? state <= 0;
??? else begin
????? if (reseed)???? // 如果重新種子信號被激活,將狀態(tài)寄存器state更新為輸入的種子值seed_val
??????? state <= seed_val;
????? else begin
??????? // 使用C運行時庫的隨機數(shù)生成算法更新狀態(tài)寄存器state
??????? state <= state * 32'h343fd + 32'h269EC3;
????? end
??? end
? end
? // 輸出隨機數(shù)是狀態(tài)寄存器的高16位,并對結(jié)果進行位與運算,僅保留低15位(15:0)
? assign out = (state >> 16) & 16'h7fff;
endmodule文章來源地址http://www.zghlxwxcb.cn/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文章來源:http://www.zghlxwxcb.cn/news/detail-767969.html
//-----命令行打印生成的隨機數(shù)-----------
always @(negedge clk) begin
? reseed = 0;
? $display ("%x",out);
end
//----時鐘翻轉(zhuǎn)間隔----
always begin
?????? #1000 clk = ~clk;?
end
endmodule
到了這里,關(guān)于如何使用Verilog生成隨機數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!