Estoy utilizando la placa DE2-115 para hacer un recorrido en una estructura de datos forestales en una frecuencia de 50 MHz. Se han almacenado varios árboles en la ROM del chip, ahora debo configurar la dirección que puede apuntar a un determinado nodo en un determinado árbol durante la operación de decisión.
La asignación de direcciones se convertirá en una larga ecuación como: (Utilizando Verilog)
vip_rom_addr_out_1 = (2251*( {total_tree_cnt[5:0], 1'b0} )) +
+ 75 + (now_i_1 - 15)*68 + leaf_cnt;
Encontré que esta ecuación parece que no se puede calcular en un ciclo de reloj (50 MHz), porque el resultado muestra que "vip_rom_addr_out_1" no es correcto en el tablero.
¿Debo convertir la ecuación en múltiples tuberías? ¿Existen métodos eficaces para acceder a una gran cantidad de árboles en FPGA que puedan permitir el acceso a la memoria en un ciclo de reloj?
Gracias por tus sugerencias.
Detalle de la estructura de datos
Cada árbol es un árbol binario completo con 16 hojas. Cada dirección correspondiente a 1 palabra (cada palabra es de 8 bits).
Algunos datos se almacenan en cada división de cada árbol, estos datos se enumeran a continuación: (Divisiones significa los nodos que tienen dos hijos, un total de 15 divisiones en cada árbol)
1. Two data numbers "a0" and "a1", each number is 2 byte.
2. One data number "b" of 8 bits.
Hay 68 pares de números (m, n) almacenados en cada hoja, m y n son los 8 bits:
Leaf 0:
(m0_0, n0_0)
(m1_0, n1_0)
(m2_0, n2_0)
......
(m67_0, n67_0)
------------
Leaf 1:
(m0_1, n0_1)
(m1_1, n1_1)
(m2_1, n2_1)
......
(m67_1, n67_1)
------------
Leaf 2:
...
Detalle de memoria
100 árboles binarios como se mencionó anteriormente se han almacenado en la ROM en chip de 2 puertos.
[For Tree 1]
address 0: [a0 for split 0, lower 8 bits]
address 1: [a0 for split 0, higher 8 bits]
address 2: [a0 for split 1, lower 8 bits]
address 3: [a0 for split 1, higher 8 bits]
...
address 28: [a0 for split 14, lower 8 bits]
address 29: [a0 for split 14, higher 8 bits]
--------------------------------------------
address 32: [a1 for split 0, lower 8 bits]
address 33: [a1 for split 0, higher 8 bits]
address 34: [a1 for split 1, lower 8 bits]
address 35: [a1 for split 1, higher 8 bits]
...
address 58: [a1 for split 14, lower 8 bits]
address 59: [a1 for split 14, higher 8 bits]
--------------------------------------------
address 60: [b for split 0]
address 61: [b for split 1]
address 62: [b for split 2]
...
address 74: [b for split 14]
-----------------------------------
address 75: m0 for leaf 0
address 76: m1 for leaf 0
address 77: m2 for leaf 0
......
address 142: m67 for leaf 0
-----------------------------------
address 143: m0 for leaf 1
address 144: m1 for leaf 1
address 145: m2 for leaf 1
......
address 210: m67 for leaf 1
-----------------------------------
......
-----------------------------------
address 1163: n0 for leaf 0
address 1164: n1 for leaf 0
address 1165: n2 for leaf 0
......
address 1230: n67 for leaf 0
-----------------------------------
address 1231: n0 for leaf 1
address 1232: n1 for leaf 1
address 1233: n2 for leaf 1
......
address 1298: n67 for leaf 1
-----------------------------------
......
-----------------------------------
......
address 2250: n67 for leaf 15
----------------------------------
[For Tree 2]
address 2251: [a0 for split 0, lower 8 bits]
address 2252: [a0 for split 0, higher 8 bits]
......
Quiero leer el contenido de "m" en cierta hoja, y uso la ecuación para acceder a la memoria: (todo el índice está basado en 0)
address_index = 2251*(Tree_Index) + 75 + (node_index - 15)*68 + (m_index);
Por lo tanto, uso 3 registros de 3 contadores:
total_tree_cnt is the index of Tree.
now_i_1 is the index of nodes, (now_i_1 - 15) is the index of leaf(0~15).
leaf_cnt is the index of m(0~67).
Utilizo dos estados para leer los datos de la memoria, configuro "vip_rom_addr_out_1" en el estado_1 como se mencionó anteriormente, después de que se hayan activado 2 relojes de flanco ascendente, el FSM salta al estado_2 y se deben leer los datos, pero he comprobado el contenido de vip_rom_addr_out_1 y obtuvo la dirección incorrecta (0x24d), y los datos leídos de la ROM parecen provenir de la dirección 0.
No hay errores durante la compilación. Por eso creo que la velocidad de la multiplicación importa. Cualquier sugerencia será apreciada.