gpt4 book ai didi

random - 如何实现(伪)硬件随机数生成器

转载 作者:行者123 更新时间:2023-12-03 21:38:04 29 4
gpt4 key购买 nike

您如何在 HDL (verilog) 中实现硬件随机数生成器?

需要考虑哪些选项?

这个问题是在self-answer之后格式。鼓励添加答案和更新。

最佳答案

正如摩根的回答中所指出的,这只会产生一个随机位。 LFSR 中的位数仅设置您在序列重复之前获得的值的数量。如果你想要一个 N 位的随机数,你必须运行 N 个周期的 LFSR。但是,如果您希望每个时钟周期都有一个新数字,另一种选择是展开循环并预测 N 个周期中的数字。重复下面摩根的例子,但每个周期得到一个 5 位数字:

module fibonacci_lfsr_5bit(
input clk,
input rst_n,

output reg [4:0] data
);

reg [4:0] data_next;

always @* begin
data_next[4] = data[4]^data[1];
data_next[3] = data[3]^data[0];
data_next[2] = data[2]^data_next[4];
data_next[1] = data[1]^data_next[3];
data_next[0] = data[0]^data_next[2];
end

always @(posedge clk or negedge rst_n)
if(!rst_n)
data <= 5'h1f;
else
data <= data_next;

endmodule

编辑:在下面添加了一个不需要您进行数学计算的新版本。把它放在一个循环中,让综合工具找出逻辑:
module fibonacci_lfsr_nbit
#(parameter BITS = 5)
(
input clk,
input rst_n,

output reg [4:0] data
);

reg [4:0] data_next;
always_comb begin
data_next = data;
repeat(BITS) begin
data_next = {(data_next[4]^data_next[1]), data_next[4:1]};
end
end

always_ff @(posedge clk or negedge reset) begin
if(!rst_n)
data <= 5'h1f;
else
data <= data_next;
end
end

endmodule

我也想让 LFSR 长度参数化,但这要困难得多,因为反馈抽头不遵循简单的模式。

关于random - 如何实现(伪)硬件随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14497877/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com