Si necesito acceder a la memoria celda por celda, ¿debo cambiar o indexar?

1

Tengo un trozo de memoria que necesito para acceder celular por celda:

parameter RAM_LENGTH = 1024;
reg [7:0] mem [RAM_LENGTH - 1:0];

Necesito iterar las células secuencialmente. Parece que hay al menos dos formas de hacer esto. El primer enfoque es indexar la memoria como si fuera una matriz de bytes C:

reg [7:0] ram_addr = 0;    
reg [7:0] current;

y luego

current = mem[ram_addr];
ram_addr = ram_addr + 1;

Esto es barato para la CPU. ¿Pero qué pasa si el constructor Verilog intentará construir un multiplexor de ancho de byte de 1024 canales 1024 para mí? Este sería un circuito digital de un tamaño tremendo que esta memoria puede no merecer. ¿O es el constructor Verilog lo suficientemente inteligente como para implementar el acceso por índice de manera más razonable?

El enfoque alternativo sería cambiar las celdas cada vez que se necesite el valor:

current <= mem[0];
for (i = 1; i < RAM_LENGTH; i++)
  mem[i] <= mem[i-1];

en este caso, espero que el constructor genere un registro de desplazamiento en lugar de un multiplexor demasiado grande, ya que todos los valores que definen el bucle son constantes.

¿Qué enfoque es más razonable y normalmente lo usaría un desarrollador de Verlilog con experiencia?

    
pregunta h22

2 respuestas

3

Ambos enfoques son viables, dependiendo de lo que desea que sea la implementación sintetizada.

La versión indexada se usaría normalmente si desea que la memoria se implemente utilizando el ram del bloque interno en el dispositivo de destino. En este caso, la velocidad del reloj está limitada por el tiempo de acceso a la memoria.

La versión del registro de desplazamiento utilizará los registros en las celdas lógicas, o en el caso de Xilinx podría usar el modo de registro de cambio SRL de las LUT. El modo de registro de cambios podría ser potencialmente más rápido, pero utilizará más recursos de enrutamiento y LUT.

En cualquier caso, siempre puede instanciar directamente bloques lógicos específicos de FPGA para eliminar cualquier ambigüedad sobre cómo se sintetizan las cosas. Las funciones "generar IP personalizada" de los entornos de desarrollo de FPGA le permiten generar memorias de tamaño personalizado, FIFO, registros de desplazamiento, etc.

    
respondido por el crj11
0

Usa el bloque RAM para construir un búfer FIFO. Todos los proveedores de FPGA tienen un "asistente" de algún tipo para ayudar a configurar los FIFO, ya que es un subcircuito de uso común.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas