sábado, 25 de mayo de 2013

Autoevaluación máquina ASM con respuestas (Simulada en Altera)



Una máquina de estado algorítmica dispone en su procesador de datos de un Contador 74190  ( C ) y de un flip-flop J-K (M)  para manejar un  motor DC, y responde al siguiente diagrama ASM:
  


 RESPUESTAS:
1)  Simulación en Altera del funcionamiento de la máquina:


2) Implementación de la Unidad de Control:

Simulación del control:

3) Procesador de datos:


viernes, 5 de abril de 2013

Contador descendente prefijado con Gal22V10 en ABEL

Ejercicio:  Diseñar un contador que inicie en 9 decimal, y al recibir una órden cuente en forma descendente hasta llegar a cero, en donde se bloquea, y se genera un pulso negativo para disparar un 555 como Monoestable no redisparable. Al finalizar el tiempo del monoestable (10 segundos) el contador debe estar nuevamente tal como al principio para poder repetir la operación. Durante los 10 segundos que se active el monoestable debe funcionar un motor DC de 5 voltios que debe estar optoacoplado para evitar ruidos que incidan en una falla en el circuito.

Solución: Trabajamos con ISPlever clasicc 1.6 para generar el contador por tabla de estado en lenguaje ABEL:
Verificamos su comportamiento simulando sus formas de onda:

Observamos que debido al Reset Power On disponible en la GAL22V10 los flip-flops inician en nivel bajo, y en el primer flanco de subida de reloj al estar la entrada Inicio = 0, el contador permanece en 9 decimal, y luego al pasar Inicio a 1, se da el conteo en forma descendente.

Se genera símbolo esquemático para seguir trabajando el ejercicio esquemáticamente y obtener la salida para disparar el monoestable y resetear el astable:


Debido a que el contador por defecto inicia resetaeado hay que usar Or de 3 entradas tal como se muestra para generar el Trigger para evitar que el monoestable se dispare desde el principio.

Se puede simular para verificar el buen comportamiento de lo requerido:

 Como el Monoestable es no Redisparable no importa el "Glitch" que se observa en la onda del trigger.

Podemos proceder entonces al diseño LINK y FIT que nos garantice que la GAL22V10 puede cumplir con lo exigido. 
El Chip Report nos indica como debemos efectuar la implementación de la GAL en el protoboard:
A las salidas del contador se coloca el decodificador 7447 ó 7448 para manejar el display de 7 segmentos de Anodo o Cátodo común que se disponga.


En muchas ocasiones se hace indispensable, para evitar ruidos que pueden incidir en un mal funcionamiento de un circuito secuencial, el uso de un optoacoplador que aisle la carga del circuito secuencial. Para este situación es muy util implementar una salida optoacoplada con el PC817, tal como se muestra en el siguiente esquema:
Si la Entrada es 0 el relé está desenergizado y se activa el LED de potencia, y si la entrada es 1 se energiza el relé y se activa el MOTOR DC.  Como el motor funciona al crearse un campo electromagnético en el,  si no existiera el aislamiento eléctrico causará ruido y molestaría en el circuito lógico que lo está activando.

 El  Optoacoplamiento, quiere decir que el acoplamiento del motor y del LED de potencia con el circuito lógico que lo activa, se hace en forma óptica, a través del diodo infrarojo y el fototransistor que existen en el interior del chip de 4 pines PC817. Con el 0 lógico el led infrarojo no emite luz, y el fototransistor está abierto, en cambio, si se tiene un 1 lógico a la entrada, el led emite luz. y el fototransistor conduce.

Observe además que se están utilizando  tanto los contactos normalmente abiertos como los normalmente cerrados, o sea los 5 pines de que dispone el relé de 5 voltios.El diodo rectificador 1N4001 dispuesto inversamente y en paralelo con la bobina del relevo actúa como supresor de picos de corriente cotrarrestando la Ley de Lenz (  VL = - L di / dt), y evitando que el voltaje autoinducido negativo que se genera en la bobina del relevo queme el transistor 2N2222A que se está utilizando como interface entre la salida del optoacoplador y la bobina o entrada del relevo.

Mas información sobre este interesante tema del optoacoplamiento se puede obtener en http://es.wikipedia.org/wiki/Optoacoplador

sábado, 2 de febrero de 2013

Contador binario ascendente descendente de 5 bits con VHDL en FPGA de Spartan 3E

Ejercicio: Diseñar con VHDL e implementar en la tarjeta Digilent con FPGA Spartan 3E un contador binario de 5 bits tanto ascendente como en forma descendente, que trabaje a 1 Hz de frecuencia. El contador dispone además de entrada de habilitación con la cual se puede bloquear.


Solución:  Creamos el proyecto contador0al31 tal como se ha indicado en entradas anteriores de este blog, definiendo como VHDL el modo jerárquico de trabajo.


Como no vamos a trabajar nada en Esquemático lo aconsejable es elaborar un gráfico que resuma el diseño, para elaborar los diferentes módulos VHDL requeridos.


Observamos que hay un bloque principal CONTADOR5BITS de entradas: CLK50Mhz, Habilitador y Dirección y salidas: Q4,Q3,Q2,Q1,Q0.  Hay dos bloques sen su interior: el Divisor_Frecuencia de entradas: CLKentrada y Reset, y salida: CLK1Hz.  El otro bloque es el contador0al31 cuyas entradas son: Reloj y ModoConteo y salidas: Salida4,...,Salida0.

Vamos a elaborar un programa VHDL  para cada bloque en el siguiente órden:

  • contador0al31
  • Divisor_Frecuencia
  • CONTADOR5bits (que enlace los dos anteriores de acuerdo al gráfico)


Al crear Módulo VHDL  como nueva fuente para contador0al31 defina las entradas y salidas tal como se indica a continuación:


Observe que la Salida se configura como vector (Bus de 5 bits) .

El ISE 10.1  nos lleva a la ventana para escribir el programa en VHDL del contador el cual lo editamos así:


Para escribir lo concerniente a la arquitectura ...después de begin nos ayudamos de las plantillas de VHDL.

Para ello vaya a Edit --> Language Templates ... --> VHDL --> Synthesis Constructs --> Coding Examples --> Counters --> Binary --> Up/Down Counters --> Simple Counter

La plantilla nos muestra:

 process (<clock>) 
begin
   if <clock>='1' and <clock>'event then
      if <ModoConteo = '1' then   
         <count> <= <count> + 1;
      else
         <count> <= <count> - 1;
      end if;
   end if;
end process;

Editamos de acuerdo al nombre dado nuestras entradas, así:


process (Reloj) 
begin
   if   Reloj = '1' and Reloj'event then
      if ModoConteo = '1' then   
        cuenta <= cuenta + 1;
      else
         cuenta <=  cuenta - 1;
      end if;
   end if;
end process;


Copiamos y pegamos al comienzo (begin) de la arquitectura ... en el archivo en VHDL, y cerramos la plantilla. Salvamos el archivo VHDL, y chequeamos la sintaxis para saber si está bien en este aspecto.

Vemos que se presenta error de sintaxis...



Se indica en el reporte que  se presenta un error porque no se ha definido la variable "cuenta"

Procedemos entonces a declarar esa variable "cuenta" como una señal auxiliar interna SIGNAL antes de comenzar el proceso del reloj  y así mismo después de finalizar el mismo proceso hay que señalar que lo que está en "cuenta" hay que enviarlo a la "Salida" del contador.

Después de haber efectuado las correcciones el programa queda así:


Al chequear sintaxis vemos que ahora no se presenta error.Luego continuamos con la simulación del circuito.

Creamos el archivo de chequeo de formas de onda, que llamamos contador0al31_tb.



Configure la ventana de tiempos de inicialización como se indica:


Cuando la entrada ModoConteo = 1, el contador lo hace ascendentemente, y si vale 0 cuenta en forma descendente. Dibujamos dicha entrada arbitrariamente, para observar en la simulación el comportamiento del contador:


Salvamos el archivo del banco de pruebas y cerramos la ventana de las formas de onda, y procedemos a efectuar su simulación:


Podemos verificar con las formas de onda que el contador responde a lo solicitado.


Procedemos ahora con el divisor de frecuencia el cual no simulamos.


De este blog en la entrada (Intermitencia en encendido y apagado de un Led) copiamos el respectivo programa VHDL , lo copiamos, editamos para que se acople a las entradas y salidas que le asignamos en nuestro gráfico donde presentamos los bloques,  salvamos y chequeamos sintaxis:


Vamos ahora a enlazar los dos bloques o programas, de acuerdo al gráfico inicial, al cual le adicionamos una señal interna  X   necesaria  para el diseño:



Creamos el programa final VHDL  CONTADOR5bits para enlazar los dos anteriores:


Fijamos entradas y salidas, como se indica en color amarillo en el gráfico.

El programa final es el siguiente:

--Programa final que enlaza Contador0al31 con Divisor_Frecuencia

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity CONTADOR5bits is
    Port ( CLK50Mhz :    in  STD_LOGIC;
           Habilitador : in  STD_LOGIC;
           Direccion :   in  STD_LOGIC;
           Q :          out  STD_LOGIC_VECTOR (4 downto 0));
end CONTADOR5bits;

architecture Comportamiento of CONTADOR5bits is

    component Divisor_Frecuencia is
        Port (
        CLKentrada: in  STD_LOGIC;
        Reset     : in  STD_LOGIC;
        CLK1Hz    : out STD_LOGIC
           );
        end component;

component contador0al31 is
                Port ( Reloj : in  STD_LOGIC;
                ModoConteo : in  STD_LOGIC;
           Salida : out  STD_LOGIC_VECTOR (4 downto 0));
      end component;

signal X : STD_LOGIC;

begin

 C1:  Divisor_Frecuencia port map
( CLKentrada => CLK50Mhz, Reset => Habilitador, CLk1Hz => X); 

C2: contador0al31 port map
 ( Reloj => X, ModoConteo => Direccion , Salida => Q); 

end Comportamiento;


Chequeamos sintaxis para estar seguros que no se presenta error alguno, y puede ser compilado.


Sigue ahora la asignación de pines a la FPGA para el archivo CONTADOR5bits.vhd final:



Damos doble click en Floor Area /IO/ Logic-Post-Synthesis para entrar al editor PACE donde se asignan los pines a las entradas y salidas:


 Observe que se ha fijado el iterruptor  L13 para la dirección y  el pulsador K17 para habilitar el contador.

Salvamos el archivo de asiganación de pines y cerramos el editor PACE.

Damos doble click en Implement Design ( que presenta un interrogante color naranja a su derecha):



Corroboramos observando en el  resumen del diseño (View Design Summary), el reporte de pines (Pinout Report), dando click en la columna (Signal Name) que los pines están localizados correctamente:


Alimentamos la tarjeta Digilent Spartan 3E y conectamos el cable USB para efectuar la programación de la FPGA dando doble click en Configure Target Device. 

Al programar la FPGA vimos que el comportamiento del contador presentaba problemas al manejar el pulsador K17.  Se decidió cambiarlo por el interruptor N17; para ello editamos el archivo de asignación de pines CONTADOR5bits.ucf   y efectuamos el cambio en la entrada Habilitador de K17 por N17 (interruptor al extremo izquierdo de la tarjeta)


Como variamos la asignación de pines, después de salvar el archivo .ucf,  se requiere volver a implementar el diseño.  Damos doble click en Implement Design (que aparece nuevamente con interrogante color naranja).

Verificamos en el Pinout Report del resúmen del diseño, dando click en la columna de nombre de señal, que se haya verificado el cambio respectivo:


Configuramos el dispositivo en la tarjeta para que se genere el archivo de programación nuevamente, ya con el cambio efectuado.Luego volver a efectuar la programación de la FPGA, alimentando la tarjeta y conectando el cable USB.

En el video podemos observar su correcto funcionamiento:


miércoles, 30 de enero de 2013

Contador binario de 4 bits Esquemático-VHDL con FPGA Spartan 3E

Ejercicio: Utilizando 4 leds disponibles en la tarjeta Digilent Spartan 3E visualizar un contador binario ascendente de 4 bits, que disponga  de entrada de habilitación manejada mediante un interruptor.

Solución:  En el navegador del Xilinx ISE 10.1 creamos nuevo proyecto: Cont0al15, y designamos Esquemático como jerarquía superior de trabajo.



Luego debe elaborar el program VHDL del contador, guardarlo  y chequear sintaxis para  asegurarnos  que no tiene errores.



Simulamos el contador, cambiando la fuente de implementación a simulación, y creando archivo de chequeo de  formas de onda:


Verificamos que efectivamente el contador trabaja como se desea, y efectuamos la síntexis del mismo.

Luego en Implementación como fuente, Utilidades de diseño, creamos el símbolo esquemático del contador, para ser utilizado posteriormente.

En una entrada anterior de este blog (encendido y apagado de un led con Spartan 3E) copiamos, pegamos, chequeamos sintaxis del archivo Clk1hz el cual requerimos para acoplarlo al contador.


Generamos también su símbolo esquemático después de haber efectuado su síntesis. Para este programa VHDL no efectuamos simulación, pues ya se probó que funciona correctamente en la tarjeta de Spartan.

Luego creamos como nueva fuente para la FPGA xc3s500e  un archivo en esquemático que llamamos final para enlazar  los dos símbolos esquemáticos: el contador y Clk1hz.


Vamos al Editor Gráfico, y por medio del filtro de símbolos ( Symbol Name Filter ) llamamos los dos símbolos esquemáticos para poderlos enlazar:


Procedemos ahora a etiquetear las entradas y el bus de salida.


Salvamos este archivo final. 

En Implementación se puede observar la jerarquía en el diseño del proyecto.


Procedemos entonces a la asignación de pines post-síntesis del archivo esquemático final:



Asignamos los pines en la ventana de  Xilinx PACE  para generar el archivo final.ucf    y   programar la FPGA:


Salvamos el archivo final.ucf  y cerramos el editor  PACE (Pinout and Area Constrints Editor)  de asignación de pines  del  Xilinx  ISE (Integrated Software Environment), versión  10.1.

Damos ahora doble click en Implement Design que aparece con un interrogante color naranja, para corregir inconsistencias en el diseño y se puedan aceptar los pines asignados.


Luego generamos el archivo de programación y configuramos la FPGA en la tarjeta Digilent Spartan 3E.

Obviamente se requiere que la tarjeta esté alimentada y el cable USB esté conectado al computador, que es  por donde se efectúa su programación JTAG ( Joint Test Action Group )



Damos Bypass para que no se programe ni  la CPLD ni la PROM, y sobre la FPGA con el botón derecho damos click en program asignando el archivo final.bit 




Cuando aparece el aviso de que la programación se ha efectuado exitosamente, podemos luego verificar que si habilitamos el contador colocando el interruptor a Vcc (Reset = 1) los Leds visualizan el conteo del 0 al 15 repetitivamente con una frecuencia de 1 Hz. 

Si el interruptor que actúa como Reset se coloca en nivel bajo se bloque el conteo en el estado que se encuentre el contador, debido a que se suspende el paso de pulsos de reloj de 50 Mhz debido a que pulsos toma el valor de Cero en el archivo VHDL de Clk1hz.

Veamos un video con nuestro proyecto: Contador binario ascendente de 4 bits con entrada de habilitación:




lunes, 28 de enero de 2013

Intermitencia de encendido y apagado de LED en Spartan 3E con VHDL

Ejercicio: Un Led disponible en la tarjeta Digilent Spartan-3E debe parpadear cada segundo.

Solución:

La tarjeta Digilent Spartan-3E dispone de un reloj a cristal de 50 Mhz, y el Led hay que hacerlo encender y apagar con una frecuencia de 1 Hz, de tal manera que lo primero requerido es un divisor de frecuencia.

El divisor de frecuencia es un componente para reducir la frecuencia de entrada. Éste se implementa con ayuda de una Escala  y un contador, donde la Escala  es la relación o división entre la frecuencia de entrada y la frecuencia de salida deseada: 

Escala = \frac{f_{entrada}}{f_{deseada}}  


Recordemos que la frecuencia y el periodo de la señal son inversamente proporcionales, tal como se observa en las ondas mostradas, las cuales corresponden a un contador binario ascendente de 3 bits.

Como el contador cuenta del 0 al 7 (modo 8) al dividir la señal de entrada (50 Mhz) por 8 nos dá 6.25 Mhz, en el bit más significativo del contador.

Como el cristal tiene una frecuencia de 50MHz ( frecuencia de entrada) y deseamos una salida de  1 Hz, tenemos que:
Escala = 50 Mhz / 1Hz = 50 000 000 

Si el reloj tiene el mismo tiempo en alto que en bajo:

t_{alto} = t_{bajo} = \frac{50 000 000}{2} = 25 000 000

SI empezamos el conteo desde cero, y  un contador al llegar a  24 999 999 genera un pulso, esto quiere decir que la frecuencia de salida , de los pulsos generados,  debe ser de 1 Hz.

Veamos el programa en VHDL:


--Divisor de frecuencia de 50MHz a 1Hz para parpadeo de LED
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
 entity clk1Hz is
    Port (
        clk50Mhz: in  STD_LOGIC;
        reset   : in  STD_LOGIC;
        led     : out STD_LOGIC
    );
end clk1Hz;

architecture Behavioral of clk1Hz is
    signal pulso: STD_LOGIC;
    signal contador: integer range 0 to 24999999 := 0;
begin
    divisor_frecuencia: process (reset, clk50Mhz) begin
        if (reset = '0') then
            pulso <= '0';
            contador <= 0;
        elsif rising_edge(clk50Mhz) then
            if (contador = 24999999) then
                pulso <= NOT(pulso);
                contador <= 0;
            else
                contador <= contador+1;
            end if;
        end if;
    end process;
     led  <= pulso;
end Behavioral;


El contador dispone de una entrada de reset que se activa con nivel bajo, es decir si reset = 0, sin importar el flanco del reloj el contador se resetea. 
La primera vez que el contador llega al 24999999, la señal interna pulso pasa del nivel bajo a nivel alto, el contador pasa a 0, y vuelve a comenzar a contar, mientras la entrada reset sea alta, y al volver a llegar a  

24999999,pulso pasa ahora de 1 a 0, completando un pulso completo, o sea un periodo de reloj; 

de esta forma la salida es de solo 1 Hz.


¡ Cada 50 millones de pulsos a la entrada se produce 1 pulso a la salida !

Con captura esquemática es imposible lograr esto; en cambio con lenguaje VHDL se hace de una
forma muy sencilla. Por eso VHDL se impone cada día mas, como lenguaje para describir hardware y efectuar en forma simple y práctica el diseño digital, pero se requiere, por ejemplo, de una FPGA 
donde el programa se pueda aplicar e implementar.


Con el navegador de proyectos de Xilinx ISE 10.1  creamos como nuevo proyecto: LedParpadeo, y como nueva fuente en Módulo VHDL: clk1Hz. 

Copiamos y pegamos el programa ya visto, salvamos y chequeamos sintaxis

Para este caso no es necesario efectuar la simulación.

Procedemos a elaborar la síntesis y la asignación de pines.



Verificamos en Pinout Report que los pines quedaron bien asignados, 

implementamos el diseño y generamos el archivo de programación, para

configurar el dispositivo.