Sintaxis y/o mejores prácticas para almacenar en búfer un vector en Verilog o VHDL

Tengo un bloque Verilog (Bloque A) que muestrea una señal en serie con un reloj relativamente lento y luego coloca datos en varios registros según el contenido de los datos en serie.

En última instancia, estos datos deben ingresar en varios registros esclavos AXI, ya que el Bloque A es parte de un periférico esclavo AXI más grande. Un reloj AXI más rápido impulsa otro bloque (Bloque B) que maneja las transacciones AXI con el núcleo ARM.

El reloj de muestreo registra los datos en los registros de salida del Bloque A, por lo que estos datos están esperando a ser colocados en los registros AXI. (Creo) Quiero algún tipo de registro de desplazamiento multidimensional para obtener estos datos en el dominio del reloj AXI, algo así como:

...
input wire axi_clk,
input wire [5:0] data_in,
output wire [5:0] data_out,
...

reg [5:0] data_buf[2:0];
assign data_out = data_buf[2];
...

always @ (posedge axi_clk) begin
    data_buf[2:0] <= {data_buf[1:0], data_in};
end 

En lugar de cambiar un bit a la vez cada reloj, quiero cambiar los 6 bits de data_buf en paralelo cada reloj.

¿Cómo debo configurar esto? Perdona el pseudocódigo; todo lo que he hecho hasta ahora ha arrojado errores, y no he encontrado un código de ejemplo de lo que estoy tratando de hacer, o la confirmación de que incluso es posible con un código de fácil lectura.

PD: mi equipo no quiere usar SystemVerilog, pero cualquier versión de VHDL o Verilog es aceptable.

Es aconsejable utilizar celdas/IP de CDC existentes. Diseñando uno por nosotros mismos a nivel de comportamiento, por ej. El sincronizador basado en mux a veces se optimiza con el sintetizador y aún causa metaestabilidad.

Respuestas (2)

Para transportar un vector de varios bits. en paralelo, entre dominios de reloj debe usar un FIFO asíncrono. No hay otra solución.
No intente diseñar un FIFO asíncrono usted mismo, no está preparado para eso. En su lugar, instancia uno de la biblioteca de IP. (Seleccione uno con reloj de lectura y escritura independiente).

La alternativa es transportar los datos bit a bit entre los dominios del reloj, utilizando un sincronizador de un solo bit. Dijiste que no quieres hacer eso, pero es mucho más simple. (Para sincronizadores, busque el xpm_cdc_array_singlemódulo Xilinx o cdclos bloques de IP relacionados).

No estoy por encima de hacer el transporte poco a poco. Tenía más curiosidad por saber si había una forma menos tediosa y propensa a errores de codificarlo.

Un FIFO funcionará en la mayoría de los escenarios, si no en todos, pero no es la única solución para el cruce de dominios de reloj de múltiples bits. Dado que la tasa de datos de origen es baja en su escenario en comparación con la tasa de reloj de destino, sería adecuado para un sistema basado en protocolo de enlace . Ni siquiera necesitarías la acknowledgeseñal.

Este artículo tiene una explicación decente de los principales tipos de sincronizadores y cuándo son apropiados. Por supuesto, necesitaría calcular el peor de los casos para asegurarse de que no haya posibilidad de perder ningún dato en su caso particular.

Si su objetivo principal es hacer que funcione lo más rápido posible, entonces un FIFO es una gran herramienta, pero quería señalar que hay otros si tiene que buscar la solución más eficiente posible, como suelo hacer. .

No entiendo completamente su sistema, pero lo que imagino es una señal del dominio del reloj en serie que cambia cada vez que termina de recibir una palabra en serie, y los datos en serie también se bloquean en un registro paralelo en este punto (nuevamente , en el dominio del reloj serie). La señal de alternancia luego pasaría por un elemento CDC simple de dos registros, donde luego alimentaría un detector de borde en el dominio del reloj de destino. La salida de este detector de borde sería un pulso de un solo reloj, que actuaría como una señal de habilitación para un registro de datos en el dominio del reloj de destino, bloqueando los datos directamente desde el registro de datos paralelo del dominio del reloj en serie. Suponiendo que sus palabras en serie tengan un ancho de 8 bits, creo que esto debería funcionar con un reloj de bits en serie hasta casi el doble del reloj en paralelo, pero, por supuesto, deberá verificar esto.

Para el método de protocolo de enlace, ¿usualmente establecería el retraso máximo para que los datos se enganchen en menos que el período de reloj del dominio de destino multiplicado por la cantidad de ciclos de registro de cambio utilizados para almacenar en búfer en el bit de protocolo de enlace?
@schadjo mira mi edición, espero que tenga sentido