如何使用VHDL以随机顺序输出数组元素

时间:2013-09-27 10:01:00

标签: vhdl

我有一个包含10个元素的数组。如何以随机顺序输出这些而不重复。

4 个答案:

答案 0 :(得分:1)

对于测试平台,使用OSVVM随机库为数组生成随机索引。或者你可以随意改变它(使用与随机库一致的Fischer-Yates Algorithm)。

如果需要合成,则将数组放入RAM块,然后生成随机地址(例如使用线性反馈移位寄存器)。

请注意,这些都不是正确随机的,只是伪随机的。如果你正在尝试任何远程加密,它们不太可能是你想要的。

答案 1 :(得分:1)

对于测试平台,OSVVM的RandomPkg使这很容易。

library osvvm ; 
use osvvm.RandomPkg.all ;
...
RandProc : process
  variable RV : RandomPtype ;
  variable IndexVals : integer_vector(0 to 9) := (others => integer'low) ;
begin
  for i in IndexVals'range loop 
    --                         min  max   ExcludeList
    IndexVals(i) := RV.RandInt(  0,   9,   IndexVals) ;
  end loop ; 

如果10个元素的连续随机生成的排列需要与前一个元素不同,则问题会变得更加有趣。为此我会使用覆盖模型。虽然10是大约排列的最大数量,我想这样做,虽然有n!排列和覆盖模型将需要存储每个生成的排列。

答案 2 :(得分:0)

接近随机性的好方法是使用线性反馈移位寄存器。

http://en.wikipedia.org/wiki/Linear_feedback_shift_register

答案 3 :(得分:0)

如果这仅用于模拟,您可以使用ieee.math_real中的统一过程来获得0到1之间的实数,并将其缩放到数组的索引范围。