¿Cuál es el método VHDL sintetizable para el módulo de bucle o memoria?

0

Tengo una aplicación de procesamiento de imágenes, el primer paso es realizar una operación de umbralización (binarización). No sé realmente si es mejor usarlo para un bucle (matriz bidimensional) o usar una memoria. Si uso la memoria, ¿cómo puedo acceder a cada elemento (el tamaño de la imagen es 640 * 480) utilizando la descripción VHDL?

    
pregunta khama

1 respuesta

2

Supongo que los datos de tu video serán transmitidos, píxel por píxel.
Esto significa que cada píxel viene en un valor después del otro, y se procesa uno por uno en una fila. Esta suele ser la forma en que se transmiten y reciben los datos de video.

No importa si almacena sus datos en la memoria o no, tendrá que usar un bucle para recorrer los datos (a medida que entran, escribir y leer en la memoria).

Por lo general, la memoria se usa por las siguientes razones:

  • Las velocidades de tu reloj de escritura y de lectura son diferentes.
  • Necesitas una cantidad de ciclos de reloj para realizar tu operación de procesamiento y este búfer te da este tiempo.

El requisito de la memoria depende mucho de la situación, por lo que no puedo decirle si debe usarlo sin conocer un poco más de detalle sobre sus requisitos exactos.

Sin embargo, el bucle. En VHDL, no es necesario utilizar una instrucción de bucle for para recorrer cada muestra de datos por muestra. Al incluir un reloj en la lista de sensibilidad del proceso (la parte entre corchetes después de la palabra "proceso"), el proceso se ejecutará en cada ciclo de reloj. Así, por ejemplo, si desea umbral de un flujo de datos (ejemplo muy básico, fuera de mi cabeza):

threshold_data : process(clk,reset) -- sensitivity list, with clock
begin
    if (reset = '1') then           -- here I say what my signals should be during reset
        threshold_data_out <= '0';
    elsif (rising_edge(clk)) then   -- detect a new clock cycle
        -- This is where the thresholding happens:
        -- threshold_data_in is the current sample 
        if (threshold_data_in > threshold) then -- if above threshold
            threshold_data_out <= '1';        -- make this whatever number you want.
        else 
            threshold_data_out <= '0';
        end if;
    end if;
end process;

¿Pero dónde está el bucle? Este es el truco, la declaración del proceso se activa cada vez que cambia el reloj (porque está en la lista de sensibilidad), por lo que esencialmente el proceso se repite una vez en cada ciclo de reloj. Estamos utilizando la propiedad inherente de la lista de sensibilidad del proceso para crear un comportamiento de bucle, sin llamar explícitamente a un bucle.

¿Qué pasa si quiero acceder a la memoria? Luego puedes agregar esto a tu bucle

    -- in your reset section:
    memory_address <= (others => '0');

    -- in your process proper
    memory_address <= memory_address + "1"  -- make sure memory address is an unsigned! 

ahora, cada ciclo de reloj que está accediendo al siguiente bloque de memoria. Para un cuadrado de píxeles almacenados en la memoria, necesita un esquema de asignación de coordenadas verticales y horizontales de cada píxel a los bloques de memoria.

Además, recuerde tener en cuenta cualquier latencia en la memoria, puede escribir la dirección ahora, pero los datos válidos para esa ubicación solo podrían estar disponibles 1 o 2 ciclos de tiempo más tarde. Por lo general, es 1, a veces más dependiendo de cómo haya configurado su memoria.

    
respondido por el stanri

Lea otras preguntas en las etiquetas