jueves, 3 de marzo de 2011

  • Ejemplos VHDL (entrega 6)

    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.
  • 2 comentarios:

    zghet dijo...

    Hola como estas espero que muy bien, sabes tus trabajos son increibles, estoy iniciando en esta parte de programación en vhdl, yo trabajo con el GHDL y simulo todo pero actualmente tengo un problema con el contador de 4 bits que hago por que puse la libreria unsigned y me marca un error que no la encuentra no se si me pudieras apoyar ya que no encuentro esa libreria para añadirla, saludos y sigue asi, me gusta tu trabajo saludos.

    Anónimo dijo...

    Hola!! em dic josep David i m´agrada molt el teu bloc perquè els meus alumnes no aprenen res amb mi. Soc el millor i ma mare m ´ho diu. Amunt València!! ostie che fotre

    Copyright @ 2009 AmericoAlvarezSurci.