VHDL中矩阵的随机值配置

VHDL中矩阵的随机值配置,vhdl,Vhdl,我有一个STD_逻辑_向量(3到0)的类型数组(1到4,1到4)的表 此表包含一系列介于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 modu

我有一个STD_逻辑_向量(3到0)的
类型数组(1到4,1到4)的表

此表包含一系列介于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 modus中的值相加,然后重新开始

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;
cnt:=1;
对于1到4循环中的i
对于1到4回路中的j
如果(myTable(i,j)=“0000”),则

myEmptyFlags(cnt,1)据我所知,在HDL中没有什么能像随机数生成器那样可以合成。只有伪随机的。作为一个好的伪随机发生器,您可以在开发板上使用非初始化的SRAM内存。通过逐个读取数据,您将获得伪随机值

其他的方法是基于生活游戏的原则


同时利用FPGA平台的并行性。您有16个寄存器,因此可以生成一个16位长的向量,表示给定单元格中存在/不存在0。这可以非常轻松地异步完成。然后你可以取一个“随机”数,看看它所代表的位置(比如说,低4位代表所有16个单元格)。如果给定地址上有0,则可以根据数字的最后一位将2或4放入该位置。如果不是,您可以从这个单元格开始遍历单元格,并将随机数分配给第一个空单元格。如果该算法迭代整个16个单元格,则表示游戏结束。一切都可以在2-18个时钟周期内完成

您正在用vhdl实现2048游戏,是吗?是的,我是:)您有什么想法吗?关于vhdl,我也是一个初学者。。对不起,我不知道怎么解决这个问题。谢谢!我不需要真正的随机发生器,当然,我使用的是基于移位寄存器和异或的伪随机发生器。我也想到了这个解决方案,我跳过了它,因为我认为它可能没有它可能的那么好。你认为有可能从一个随机的STD_逻辑_向量中动态选择一些位吗?我的意思是,计算表中0000的数字,然后根据该数字选择随机向量中的x位?我想,您的硬件包含嵌入式块RAM。所以你可以用其中一个。通过“伪随机”值手动对其进行预初始化,然后使用它。它将为您提供必要的地址,以便将2和4随机分配给阵列。是的,您可以计算向量中相同位的数量。尝试搜索汉明距离计算。您只需要检查16个单元格,因此我建议使用一个简单的有限状态机,循环中有16个状态。在某些信号中,您可以注意到随机生成器给出的机器初始状态,并进行迭代,直到再次达到该状态。这将以如下方式实现:
state