Contadores
Bueno continuamos con los ejemplos en vhdl, hoy les traigo 3 ejemplos mas para completar nuestro avance. las proximas entregas se pondra mas interesante. Ademas empezamos un proyecto en vhdl.Ejemplo 19:
Diseñar en VHDL, un contador de 4 bits. Flanco descendente.
Solucion:
Como es flanco descendente clock'EVENT AND clock='0' (podemos tb utilizar rising edge). . Tambien por comodidad y para que observen, se utilizo el tipo de dato integer (osea entero) para la salida, osea si ponemos 0 to 15 entonces vhdl generara automaticamente una salida de 4 bits que representan en binario los numeros de 0 a 15. ahora si ponemos Integer range 0 a 26 por decir algun valor
, pues el programa generara automaticamente 5 bits de salida para representar estos numeros.
--------------------------------------------------- -- electronico-etn.blogspot.com -- Contador binario ascendente de 4 bits. --------------------------------------------------- ENTITY contador_4bits IS PORT( clock, reset: IN BIT; salida : OUT INTEGER RANGE 0 TO 15); END conta_rs; ARCHITECTURE rtl OF contador_4bits IS BEGIN PROCESS (clock, reset) VARIABLE cuenta :INTEGER RANGE 0 TO 15; BEGIN IF (reset='1') THEN cuenta:=0; ELSIF (clock'EVENT AND clock='0') THEN cuenta:=cuenta+1; END IF; salida <= cuenta; END PROCESS; END rtl;
|
Ejemplo 20:
Diseñar en VHDL, un contador ascendente descendente de 4 bits.
Solucion:
--------------------------------------------------- -- electronico-etn.blogspot.com -- Contador binario ascendente descendente de -- 4 bits. --------------------------------------------------- ENTITY Contador_asc_desc IS PORT( clock, enable, asc_des : IN BIT; salida : OUT INTEGER RANGE 0 TO 15); END Contador_asc_desc; ARCHITECTURE rtl OF Contador_asc_desc IS BEGIN PROCESS (clock) VARIABLE cuenta :INTEGER RANGE 0 TO 15; BEGIN IF (clock'EVENT AND clock='0') THEN IF (enable = '1' AND asc_des = '1') THEN cuenta:=cuenta+1; ELSIF (enable = '1' AND asc_des = '0') THEN cuenta:=cuenta-1; END IF; END IF; salida <= cuenta; END PROCESS; END rtl;
|
Ejemplo 21:
Diseñar en VHDL, un contador ascendente de 8 bits.
Solucion:
En este codigo, pues variamos el tipo de variable de la salida, en los anteriores ejemplos era integer, pero veamos que pasa cuando se lo representa como un vector de 7 downto 0. Pues les dire desde ya no pasa nada el tratamiento es el mismo se suma 1 (o se puede restar si fuera tambien descendente). se utilizo un rising edge para el flanco descendente, ademas para hacerlo mas interesante se puso un habilitador (enable) para iniciar o no la cuenta.
--------------------------------------------------- -- electronico-etn.blogspot.com -- Contador binario ascendente descendente de -- 4 bits. --------------------------------------------------- library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity contador8bits is port ( cout :out std_logic_vector (7 downto 0); enable :in std_logic; clk :in std_logic; reset :in std_logic ); end contador8bits; architecture rtl of contador8bits is signal count :std_logic_vector (7 downto 0); begin process (clk, reset) begin if (reset = '1') then count <= (others=>'0'); elsif (rising_edge(clk)) then if (enable = '1') then count <= count + 1; end if; end if; end process; cout <= count; end rtl;
|
Ahora bien todos los ejemplos anteriores teoricamente dan bien cuando se los implementa, PERO realmente esto no sucede asi, cuando uno graba estos codigos en las tarjetas fpga, pues a la salida no ve absolutamente ninguna cuenta, y esto sucede por el clock que utilizemos.
Cuando yo tuilize las tarjetas fpga de la facu.. tan solo defini como la entrada de clock de nuestro programa contador, una entrada externa de clock de la tarjeta. ahora bien si no quieren utilizar la entrada externa y quieren utilizar el oscilador interno de la fpga,m utilizando un divisor de frecuencias (antes visto) , pues esperen la proxima entrega en los cuales utilizaremos el clock de 1 hz + un contador de estos.
Pero desde ya les digo que pueden utilizar una descripcion estructurada deficiendo la pata de salida del clock de 1 hz como la entrada del clock de nuestro contador.