Duda sobre el contador implementado en VHDL

1

Estoy tratando de aprender VHDL y encontré un código de ejemplo para un contador que me parece algo extraño.

Entiendo lo que hace, pero no estoy seguro de por qué está escrito como está.

El código es el siguiente:

entity counter is

generic(n: natural :=2);
port(   clock:  in std_logic;
    clear:  in std_logic;
    count:  in std_logic;
    Q:  out std_logic_vector(n-1 downto 0)
);
end counter;

architecture behv of counter is           

    signal Pre_Q: std_logic_vector(n-1 downto 0);

begin

    -- behavior describe the counter

    process(clock, count, clear)
    begin
    if clear = '1' then
        Pre_Q <= Pre_Q - Pre_Q;
    elsif (clock='1' and clock'event) then
        if count = '1' then
        Pre_Q <= Pre_Q + 1;
        end if;
    end if;
    end process;    

    -- concurrent assignment statement
    Q <= Pre_Q;

end behv;

-----------------------------------------------------

¿No podemos reemplazar esta línea?

Pre_Q <= Pre_Q - Pre_Q;

con algo como esto? (No estoy seguro de poder hacer esto)

Pre_Q <= 0;

¿Hay alguna razón por la que deba usar el primer método en lugar del segundo?

Pido disculpas por eliminar mi pregunta anterior, pero cometí un error al reescribir el código y olvidé explicar lo que realmente era mi duda.

    
pregunta Bruno Ferreira

2 respuestas

1

La única ventaja de escribirlo de la primera manera que puedo ver es que, supongo, es de tipo independiente. Tal vez el codificador original deseaba poder copiar y pegar el código sin modificarlo (aunque uno pensaría que el nombre de la señal debería modificarse de todos modos), y depender de la herramienta de síntesis para optimizarlo (o no). Personalmente, no creo que esta sea una buena justificación, es menos clara, y copiar / pegar el código sin mirarlo detenidamente nunca es una buena idea.

Su declaración de asignación cambiará dependiendo de su tipo. Pre_Q <= 0; para tipos enteros, Pre_Q <= (others => '0'); (o equivalente) para tipos de vectores, etc.

(Veo que has actualizado la pregunta y, dado que estás usando un std_logic_vector , querrías este último)

respuesta al comentario

Usted escribió:

  

No entiendo la asignación de vectores. ¿No puedo usar Pre_Q <= '0' ?

Un std_logic_vector es una matriz de std_logic , cada uno de los cuales es una enumeración de 9 valores / estados posibles (incluidos '0' y '1' ). Técnicamente no son 0s y 1s para el idioma, aunque parezca extraño. Por lo tanto, std_logic_vector no es inherentemente un tipo numérico, y solo puede tratarse como tal con sobrecargas de funciones. Si intenta asignar '0' a Pre_Q , está intentando asignar un escalar (en este caso, técnicamente un literal de carácter) a un vector, y estos tipos no son compatibles de esta manera. Tampoco puede asignar el entero literal 0 ; si bien puede ser obvio para cualquier persona lo que pretende hacer, la escritura fuerte de VHDL no lo permite.

Cuando usa (others => '0') , está usando un agregado de matriz . others es una palabra clave que se refiere a todos los índices de la matriz que no se han asignado explícitamente en el agregado (en este caso, todos ellos), por lo que cuando asigna los "otros bits" a '0' , volver a cero todo el vector. (También puedes usar una función de conversión, pero (others => '0') es el idioma más convencional)

    
respondido por el fru1tbat
0

Buena pregunta. Mi respuesta intuitiva sería que no hay diferencia y que debería escribir Pre_Q <= 0; porque expresa la intención más claramente. Pero esa es solo mi opinión, sin ninguna prueba o investigación.

Dos respuestas que son buenas independientemente de mi opinión:

  1. Pregúntale al chico que escribió esto. Y sugiérales que agreguen más documentación para que la gente entienda su código.

  2. Ejecute ambas versiones a través de una herramienta de síntesis para ver si hay alguna diferencia. (Una vez más, mi mejor conjetura es que no habrá ninguna).

respondido por el Philippe

Lea otras preguntas en las etiquetas