1 votos

Duda sobre el contador implementado en VHDL

Estoy tratando de aprender VHDL y me encontré con 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 así.

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 sustituir esta línea

Pre_Q <= Pre_Q - Pre_Q;

con algo así? (No estoy seguro de poder hacerlo)

Pre_Q <= 0;

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

Pido disculpas por haber borrado mi pregunta anterior pero me equivoqué al reescribir el código y se me olvidó explicar cuál era realmente mi duda.

1voto

fru1tbat Puntos 417

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

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

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

respuesta al comentario

Usted escribió:

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

A std_logic_vector es una matriz de std_logic cada uno de los cuales es una enumeración de 9 posibles valores/estados (incluyendo '0' y '1' ). No son técnicamente 0s y 1s para el lenguaje, aunque parezca impar. Así que un std_logic_vector no es intrínsecamente un tipo numérico, y sólo puede ser tratado 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 literal entero 0 - mientras que puede ser obvio para casi cualquier persona lo que se pretende hacer, la tipificación fuerte de VHDL no lo permite.

Cuando se utiliza (others => '0') , está utilizando un matriz agregada . others es una palabra clave que se refiere a todos los índices del array que no han sido asignados explícitamente en el agregado (en este caso, todos), y por lo tanto cuando se mapean los "otros bits" a '0' estás poniendo a cero todo el vector. (También puede utilizar una función de conversión, pero (others => '0') es el lenguaje más convencional)

0voto

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

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

  1. Pregúntale al que escribió esto. Y sugiera que añadan más documentación para que la gente entienda su código.

  2. Pasa ambas versiones por una herramienta de síntesis para ver si hay alguna diferencia. (Una vez más, mi mejor suposición es que no habrá ninguna).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X