Estoy intentando escribir datos en una instancia del generador de interfaz de memoria Xilinx que recibo de un UART. Estoy usando VHDL en Vivado.
El UART presenta datos de 8 bits a la vez, con bastantes ciclos de reloj entre cada información nueva. La entrada de datos MIG es un vector de 512 bits.
signal s_app_wdf_data : STD_LOGIC_VECTOR(511 downto 0); -- Output to MIG
signal s_uart_data : STD_LOGIC_VECTOR(7 downto 0); -- input from UART
Deseo rellenar el vector con datos recibidos del UART. Actualizaré cada parte del vector y luego, cuando reciba el último byte de UART, habilitaré las señales de escritura en el MIG.
Creé un contador para realizar un seguimiento de qué posición en el vector era la posición relevante para escribir los datos de UART, por lo que cada vez que hay datos nuevos en el UART, haga algo como esto:
s_app_wdf_data(v_position downto v_position - 7) <= s_uart_data;
v_position := v_position - 8;
Sin embargo, esto tomó aproximadamente una hora para realizar el diseño de la ruta, y dio errores de tiempo (holgura negativa).
Estaba pensando que para que eso funcione, las herramientas tendrían que sintetizar algo que esencialmente permita el acceso aleatorio a cualquier parte del vector, así que tal vez podría ayudar a aclarar las herramientas que solo ciertas partes del vector siempre se ha accedido, ya que la posición solo cambia en decrementos de 8. Escribí
if (v_position = 511) then
s_app_wdf_data(511 downto 504) <= s_uart_data;
elsif (v_position = 503) then
s_app_wdf_data(503 downto 496) <= s_uart_data;
elsif (v_position = 495) then
s_app_wdf_data(495 downto 488) <= s_uart_data;
etc, etc
Fue laborioso teclearlo (un signo claro de que algo está mal), y al final tuvo errores de sincronización aún peores.
Luego traté de evitar el código que accedía a lugares arbitrarios en el vector, intenté usar desplazar y actualizar solo el byte más bajo.
s_app_wdf_data(511 downto 8) <= s_app_wdf_data(503 downto 0);
s_app_wdf_data(7 downto 0) <= s_uart_data;
Este tuvo la peor holgura negativa total del lote.
¿Cuál es el enfoque correcto aquí? ¿O qué técnicas debería estar investigando?