VHDL中矩阵中的随机值放置

时间:2014-05-24 20:39:28

标签: vhdl

我有一张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解决方案?

1 个答案:

答案 0 :(得分:1)

据我所知,HDL中的随机数生成器没有什么可以合成的。只有伪随机的。作为一个好的伪随机发生器,您可以在开发板上使用例如非初始化的SRAM存储器。通过逐个读出数据,您将获得伪随机值。

其他方法例如基于类似生命的游戏原则。

还使用FPGA平台的并行性。您已经有16个寄存器,因此您可以创建一个16位长的向量,该向量表示给定单元格中存在/不是0。这可以非常容易地异步完成。然后你可以随机选择&#34;随机&#34;编号并查看它所代表的位置(假设低4位表示所有16个单元格)。如果给定地址处有0,则可以根据数字的最后一位将2或4放在该位置。如果没有,您可以从这个单元格开始迭代,并将随机数分配给第一个空单元格。如果算法迭代整个16个单元格,则意味着游戏结束。一切都可以在2-18个时钟周期内完成。