在硬件中生成多个独立的伪随机数(Verilog或VHDL)

在硬件中生成多个独立的伪随机数(Verilog或VHDL)

问题描述:

我需要满足以下条件的硬件(VHDL或Verilog)生成的伪随机数。
- 每个数字都是1位(不一定是,但会使事情更复杂) - N个伪随机数不能相互关联。 - N个伪随机数需要同时生成(每个时钟沿)。在硬件中生成多个独立的伪随机数(Verilog或VHDL)

据我所知,以下将不起作用: - 使用N个不同的种子给定的多项式 - 将它们简单转移的相互 版本 - 采用N个不同的多项式对于给定长度LFSR - 由于N不实际能大到64,并且我不知道LSFR会给64个不同的分接头组合多长,如果可能的话,这个数字太大了。

如果使用LFSR,长度不需要相同。对于一个小的N,比如说4,我想过使用4个不同的素数长度(以使重复性最小),例如15,17,19,23,但是对于大的N,它又变得非常混乱。比方说,2^16量级的东西给了LFSR足够的长度。

有没有一种优雅的方式来处理这个问题?通过优雅,我的意思是不必编写N个不同的独特模块(上面的15,17,19,23作为例子)。使用不同种子的Mersenne Twister的不同实例?我没有无限的硬件资源(FF,LUT,BRAM),但为了讨论,最好忽略资源问题。

比你提前。

+0

这不像是一个编程问题,而是更多的数学问题。 – Morgan 2014-09-23 07:04:14

+0

'15,17,19,23,但是,对于大的N,它变得非常混乱。比方说,2^16量级的东西给了LFSR足够的长度。' 15,17等是你的长度,2^16是指什么? – Morgan 2014-09-23 07:05:56

+0

是的,它绝对可以被看作是一个数学问题。我刚刚专注于HDL设计,所以一直在寻找一种方法来实现,而不需要太深入的数学... – mxo 2014-09-24 03:07:06

一种选择是使用加密散列,这些散列通常是很宽的(64-256位),而且良好的散列具有这样的特性,即单个位输入更改将以不可预知的方式传播到所有输出位。在散列中运行递增计数器并以随机值启动计​​数器。

AES-GCM中使用的GHASH是硬件友好的,可以在每个时钟生成新的输出值。