用于FPGA的Verilog中的1024位伪随机生成器

时间:2019-01-20 16:51:35

标签: random verilog fpga mersenne-twister

我想在verilog中生成长度为1024的随机向量。我看过某些实现,例如Tausworth生成器和Mersenne Twisters。 大多数Mersenne扭曲器具有32位/ 64位输出。我想模拟一个概率为p的1024位错误模式。因此,我使用Mersenne Twister生成了一个32位随机数(均匀分布)。由于我有32位随机数,因此该数字的范围为0到2 ^ 32-1。之后,如果从这个32位值生成的数字小于p *(2 ^ 32-1),则将数字设置为1,否则该数字将映射到我的1023位向量中的0。基本上,每个32位数字用于根据概率分布在1023向量中生成一个位。

上述方法意味着我需要1024个时钟周期来生成每个1024位向量。还有其他方法可以让我快速执行此操作吗?我知道我可以使用不同的种子值并行使用多个Mersenne Twister实例,但是我担心这些数字不会真正是随机的,并且会发生冲突。是否有我做错的事情或缺少的事情?非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

好的, 因此,我从wikipedia中大致了解了有关梅森·Twisters的信息。我接受我并没有完全理解所有这些,但是我得到了:给定种子值(用于初始化数组),模块将生成32位随机数。

现在,根据上面的描述,计算一个随机数需要一个周期。

因此,您的问题基本上归结为数学问题,而不是像这样verilog

我会尽力解释它的数学原理。

您有一个32位均匀分布的随机数。因此,任意一位为highlow的概率为0.5正好(接近,导致伪随机)。

让我们忘记这是一个伪随机生成器,因为那是您将要获得的最佳效果(因此,我们将其视为我们的理想选择)。

即使我们一个接一个地生成5个数字,每个数字都是任意特定数字的概率仍然是均匀分布的。因此,如果我们将这五个数字串联起来,我们将得到一个160位完全随机的数字。


如果仍然不清楚,请考虑这种方式。

我要解决这个问题。假设我们有一个4位随机数生成器(RNG),而我们需要16位随机数。

RNG的每个输出将是一个具有均匀概率分布的十六进制数字。因此,获得某个特定数字(例如... A)的概率为1/16。现在,我想输入一个4位数的十六进制数字(例如... 0xA019)​​。

将A作为最高有效位的概率= 1/16

以数字2 = 0的概率= 1/16

将1作为数字3的概率= 1/16

获得9作为最低有效位的概率= 1/16

因此,获得0xA019 = 1/(2^16)的概率。 实际上,获得任何四位数十六进制数的概率将完全相同。现在,将相同的逻辑扩展到具有32位数字的Base-32 Number系统作为所需输出,即可解决问题。


因此,我们看到,只需对梅森捻线器进行32次重复操作即可获得1024位输出(这将花费32个周期,仍然有点慢)。您还可以做的是并行地合成32个捻线机(这将使您一冲程获得输出,但就面积,功率限制而言,fpga将会非常繁琐)。

解决此问题的最佳方法是尝试一些中间立场(也许4个平行的捻线机以8个周期运行)。这实际上是一个问题,即模块的最终应用以及该应用所需的功率和时序约束。

关于给出不同的种子值,大多数PRNG通常提供输入种子的目的只是为了增加随机性,根据我在Mersenne Twisters上的阅读,它的情况相同。

希望能回答您的问题。