我有一张type array(1 TO 4, 1 TO 4) OF STD_LOGIC_VECTOR(3 DOWNTO 0);
此表包含0到16之间的一系列数字:
0 2 0 2
2 2 4 4
8 8 16 16
8 16 16 16
我想随机生成一个2或4到一个包含零的单元格。 (这些现在位于1,1和1,3位,但可能在任何地方)。这不是一个静态的情况。 我试图通过迭代数组并将位置添加到新数组来解决这个问题,但这似乎不是VHDL方式而且它没有合成。显然,模数运算符也不能与动态输入一起工作。在生成随机值后,我将L / R / U / D模式中的值相加并重新开始。
cnt := 1;
FOR i IN 1 TO 4 LOOP
FOR j IN 1 TO 4 LOOP
IF (myTable(i,j) = "0000") THEN
myEmptyFlags(cnt,1) <= i;
myEmptyFlags(cnt,2) <= j;
cnt:=cnt+1;
END IF;
END LOOP;
END LOOP;
res :=(conv_integer(randomValue(3 downto 0)) MOD cnt)+1;
IF (conv_integer(randomValue(3 downto 1)) > 3) THEN
--put 2 in cell nr res
myTable(myEmptyFlags(res,1),myEmptyFlags(res,2)) <= "0001";
ELSE
--put 4 in cell nr res
myTable(myEmptyFlags(res,1),myEmptyFlags(res,2)) <= "0010";
END IF;
nextstate <= st_end;
对于这个问题,什么是正确的VHDL解决方案?
答案 0 :(得分:1)
据我所知,HDL中的随机数生成器没有什么可以合成的。只有伪随机的。作为一个好的伪随机发生器,您可以在开发板上使用例如非初始化的SRAM存储器。通过逐个读出数据,您将获得伪随机值。
其他方法例如基于类似生命的游戏原则。
还使用FPGA平台的并行性。您已经有16个寄存器,因此您可以创建一个16位长的向量,该向量表示给定单元格中存在/不是0。这可以非常容易地异步完成。然后你可以随机选择&#34;随机&#34;编号并查看它所代表的位置(假设低4位表示所有16个单元格)。如果给定地址处有0,则可以根据数字的最后一位将2或4放在该位置。如果没有,您可以从这个单元格开始迭代,并将随机数分配给第一个空单元格。如果算法迭代整个16个单元格,则意味着游戏结束。一切都可以在2-18个时钟周期内完成。