Ejemplos vhdl (parte 7) penultima

viernes, 25 de marzo de 2011

Ejemplos vhdl (parte 7) penultima


Buen dia... espero que les valla super... bueno esta es nuestra penultima entrega de ejemplos basicos en VHDL
faltaria solamente realizar secuenciales, maquinas de mealy y  moore... en la ultima entrega mostraremos estos ejemplos..que son relativamente sencillos, solo es ubicarse bien con el clock evento (rising edge)...

Ejemplo 22:
Diseñar en VHDL, un contador de 4 bits ascendente, con reloj de 1Hz.
Solucion:
ejemplo publicado en http://www.todopic.com.ar
------------------------------------------------------------------------------------
-- Contador ascendente 4 bit con 1 Hz de reloj
-- Autor: Americo Alvarez S.
-- Fecha: 05 de marzo de 2011
-- Nombre de modulo: counter_4b_1hz
-- Descripcion:
--       Una vez visto el gran inconveniente por el reloj que
--      presentaban los contadores al momento de implementarlos
--      en la tarjeta fpga. Se vio la necesidad de implementar
--      un contador con f=1Hz de frecuencia.
--      La salida se la observara en binario, en leds.   
-- Abstract:
--
-- Vercion: vercion 0
------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY counter_4b_1hz is
  Port (clock_50Mhz : in  STD_LOGIC; reset: in bit;
        F: OUT INTEGER RANGE 0 TO 15);
END counter_4b_1Hz;

ARCHITECTURE rtl OF counter_4b_1hz IS

   SIGNAL clkout: std_logic;
   CONSTANT max: INTEGER := 50000000;
   CONSTANT half: INTEGER := max/2;
   SIGNAL count: INTEGER RANGE 0 TO max;

BEGIN
 -- generando señal clock de 1Hz de frecuencia
PROCESS
BEGIN
   WAIT UNTIL clock_50Mhz'EVENT and clock_50Mhz = '1';
   IF count < max THEN count <= count + 1;
      ELSE count <= 0;
   END IF;
   IF count < half THEN clkout <= '0';
      ELSE clkout <= '1';
   END IF;
END PROCESS;

--contador 4 bits ascendente
PROCESS(clkout,reset)
   VARIABLE cuenta: INTEGER RANGE 0 TO 15;                                                     
BEGIN
   IF (reset='1') THEN
   cuenta:=0;
   ELSIF (clkout'EVENT AND clkout='0') THEN
   cuenta:=cuenta+1;
   END IF;
F <= cuenta;
END PROCESS;
END rtl;



Ejemplo 23:
Diseñar en VHDL, un contador de 4 bits ascendente, con reloj de 1Hz, y que muestre su salida en numero hexadecimal en display de 7 segmentos
Solucion:
------------------------------------------------------------------------------------------
-- Contador ascendente 4 bit con 1 Hz de reloj,
-- con salida hexadecimal en display de 7 segmentos
-- Autor: Americo Alvarez S.
-- Fecha: 25 de marzo de 2011
-- Nombre de modulo: counter_4b_7seg
-- Descripcion:
--       Una vez visto el gran inconveniente por el reloj que
--      presentaban los contadores al momento de implementarlos
--      en la tarjeta fpga. Se vio la necesidad de implementar
--      un contador con f=1Hz de frecuencia.
--      La salida se la observara en hexadecimal en display de 7seg.     
-- Abstract:
--
-- Vercion: vercion 0.1
------------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY counter_4b_7seg is
  Port (clock_50Mhz : in  STD_LOGIC; reset: in bit;
        7SEG: OUT STD_LOGIC_VECTOR (7 downto 0);
END counter_4b_7seg;

ARCHITECTURE rtl OF counter_4b_1hz IS

   SIGNAL clkout: std_logic;
   CONSTANT max: INTEGER := 50000000;
   CONSTANT half: INTEGER := max/2;
   SIGNAL count: INTEGER RANGE 0 TO max;
   SIGNAL F: INTEGER RANGE 0 to 15

BEGIN
 -- generando señal clock de 1Hz de frecuencia
PROCESS
BEGIN
   WAIT UNTIL clock_50Mhz'EVENT and clock_50Mhz = '1';
   IF count < max THEN count <= count + 1;
      ELSE count <= 0;
   END IF;
   IF count < half THEN clkout <= '0';
      ELSE clkout <= '1';
   END IF;
END PROCESS;

--contador 4 bits ascendente
PROCESS(clkout,reset)
   VARIABLE cuenta: INTEGER RANGE 0 TO 15;                                                     
BEGIN
   IF (reset='1') THEN
   cuenta:=0;
   ELSIF (clkout'EVENT AND clkout='0') THEN
   cuenta:=cuenta+1;
   END IF;
F <= cuenta;

BEGIN
    case F is
    when 0   => 7SEG :="10000001";
    when 1   => 7SEG :="11001111";
    when 2   => 7SEG :="10010010";
    when 3   => 7SEG :="10000110";
    when 4   => 7SEG :="11001100";
    when 5   => 7SEG :="10100100";
    when 6   => 7SEG :="11100000";
    when 7   => 7SEG :="10001111";
    when 8   => 7SEG :="10000000";
    when 9   => 7SEG :="10000100";
    when 10 => 7SEG :="11100010";
    when 11 => 7SEG :="11100000";
    when 12 => 7SEG :="11110010";
    when 13 => 7SEG :="11000010";
    when 14 => 7SEG :="10110000";
    when 15 => 7SEG :="10111000";
    when others  => null;
    end case
END PROCESS;
END rtl;

Bueno esperaba poderles mostrar el reloj digital y el cronometro, pero no sera posible hasta terminar el semestre ya que no tengo tiempo... una sugerencia muy util, si no pueden diseñar en leguaje vhdl la manera mas sencilla de presentar los trabajos en laboratorios de simulacion es realizar la captura esquematica utilizando el quartus2 o el  webpack ise xilinx ya que los simuladores en captura esquematica tienen todos los componentes basicos para realizar cualquier trabajo de digi y solamente es agarrar el componente y conectar con cables como el multisim o proteus

1 comentarios :

Jonnathan Tarrero dijo...

un contador de 8 bits se puede hacer utilizando este mismo codigo solo cambiando la salida a 7 downt 0???