我需要为满足以下条件的硬件(VHDL 或 Verilog)生成的伪随机数。
- 每个数字都是 1 位(不一定是,但这会使事情变得更复杂)
- N 个伪随机数不能相互关联。
- N个伪随机数需要同时产生(每个时钟边沿)。
我了解以下内容无效: - 对给定的多项式使用 N 个不同的种子 - 它们将只是彼此的移位版本 - 对给定长度 LFSR 使用 N 个不同的多项式 - 不切实际,因为 N 可以大到 64,而且我不知道多长的 LSFR 会给出 64 个不同的抽头组合,如果可能的话太大了。
如果使用 LFSR,则长度不需要相同。对于一个小的 N,比如 4,我考虑过使用 4 个不同的质数长度(以最小化可重复性),例如 15、17、19、23,但是同样,对于一个大的 N,它会变得非常困惑。比方说,2^16 数量级的东西为 LFSR 提供了足够的长度。
有没有一种优雅的方式来处理这个问题?所谓优雅,我的意思是不必编写 N 个不同的独特模块(例如上面的 15、17、19、23)。使用 N 个不同的 Mersenne Twister 实例,使用不同的种子?我没有无限量的硬件资源(FF、LUT、BRAM),但为了本次讨论,最好忽略资源问题。
比你提前。
最佳答案
一种选择是使用加密散列,它们通常很宽(64-256 位),并且好的散列具有这样的特性,即单个位输入更改将以不可预测的方式传播到所有输出位。在哈希中运行递增计数器,并以随机值启动计数器。
AES-GCM 中使用的 GHASH 是硬件友好的,可以在每个时钟生成新的输出值。
关于algorithm - 硬件中的多个独立伪随机数生成(Verilog 或 VHDL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25985326/