Video-tutorial de la semana

lunes, 20 de septiembre de 2010

VHDL - FPGA - Ejemplo #3 Simulación de un Multiplexor usando Active-HDL

El objetivo de esta entrada es mostrar la edición, compilación y simulación usando el Active-HDL de un multiplexor de 2 a 1 (dos entradas, una salida), por otro lado este ejemplo también sirve para usar una nueva instrucción de VHDL, la instrucción de condición.

Multiplexor

Un multiplexor (MUX) es un dispositivo que permite dirigir la información digital procedente de diversas fuentes a una única línea para ser transmitida a través de dicha línea a un destino común.

El multiplexor más básico pose dos líneas de entrada de datos (I0 e I1 en la siguiente figura) y una única línea de salida (Y). También posee una entrada de selección de datos, que permiten elegir los datos digitales provenientes de cualquier entrada hacia la línea de salida. También se les conoce como selectores de datos. La figura siguiente muestra el diagrama lógico de un multiplexor de 2 a 1.



"I0" e "I1" son las entradas de datos, "Y" es la salida de datos y finalmente "S" es la entrada de selección, el funcionamiento del mux se puede obaervar en la tabla de verdad para el multiplexor que es la siguiente:
     S         Y    
     0         I0
     1         I1

Código VHDL del MUX 2 a 1

El código VHDL inicia con la entidad (bueno realmente inicia con las librerías pero ahorita estoy omitiendo este paso, que ya se vio en la entrada anterior de VHDL), la entidad básicamente es la declaración de terminales y para el ejemplo del mux de 2 a 1 el código con la sintaxis correcta para la entidad queda así:

entity Mux2_1 is
   port(
        I0 : in STD_LOGIC;
        I1 : in STD_LOGIC;
         S : in STD_LOGIC;
        Y : out STD_LOGIC
  );
end Mux2_1;
La arquitectura describe el funcionamiento del circuito, en nuestro caso el MUX se pude describir haciendo uso de la instrucción de condición simple que en VHDL es casi como en la gran mayoría de los lenguajes de programación, como se verá enseguida.

Instrucción de condición

Este tipo de instrucciones evalúa una condición y si es verdadera ejecuta unas instrucciones y si es falsa ejecuta otras. Enseguida se muestra la sintaxis genérica para la instrucción de condición de VHDL:

If condición then
    --Instrucciones cuando la condicicón es verdadera
Else
-- Instrucciones para cuando la condición es falsa.
End if;

Todo inicia con la palabra “if” después va la condición, para el caso del multiplexor la condición es bien simple y se puede ver en la tabla de verdad que depende de la entrada de selección (S), si s es 0 hace una cosa y si S es 1 hace otra, entonces el código VHDL va quedando así:

If s = ‘0’ then
   --Instrucciones cuando la condicicón es verdadera
Else
   -- Instrucciones para cuando la condición es falsa.
End if;

Note como se colocan apostrofes para realizar la comparación de una variable de un bit con el valor de 0 lógico.

Cuando la condicón sea verdadera, simplemente la entrada I0 pasa a la salida Y estos se puede realizar con esta instrucción:

Y <= I0;

Si la condición es falsa, pasa la entrada I1 a Y así:

Y <= I1;

Queda entonces el código completo para el if así:

If s = ‘0’ then
   Y <= I0;
Else
   Y <= I1;
End if;

Con ese código queda descrito el Mux de 2 a 1, solo que este código así como está no está completo,  falta algo como se verá en la siguiente sección, tenga cuidado con los ; a la hora de ingresar el código en el Active-HDL.

Procesos en VHDL

En VHDL las instrucciones de condición son instrucciones que no se ejecutan en paralelo que es una de las virtudes del lenguaje, estas instrucciones dependen de una condición, es decir, primero se evalúa la condición y después se ejecuta una o más instrucciones si la condición es verdadera o falsa, esto nos habla de que se ejecutan las instrucciones en forma secuencial, para que VHDL acepte las instrucciones secuenciales estas deben ser escritas dentro de un proceso.

Un proceso es una manera formal de escribir una lista de instrucciones secuenciales, la sintaxis VHDL para un proceso es así:

Process ( lista_de_sensitividad)
Begin
   --instrucciones secuenciales
End process;

Lo primero que lleva el proceso es la palabra reservada “process” seguido por la lista de sensitividad, aquí van las señales que hacen que el proceso se ejecute, las señales que se colocan en la lista, generalmente son las entradas, así pues el proceso va quedando de la siguiente forma ya con las señales de entrada del MUX en la lista de sensitividad:

Process (I0, I1, S)
Begin
  -- instrucciones secuenciales
End process;

Recuerde las señales que se colocan en lista de sensitividad hacen que las instrucciones dentro del proceso se ejecuten, cada vez que cambia de valor una señal de la lista el proceso se ejecuta.

Ahora si el código del proceso junto con las isntrucciones secuneciales queda así:

Process (I0, I1, S)
Begin
   If s = '0' then
        Y <= I0;
   Else
       Y <= I1;
   End if;
End process;

Todo eso va dentro de la arquitectura, así que el código completo para la arquitectura del MUX es así:

architecture Multiplexor of MUX2_1 is
Begin
  Process (I0, I1, S)
  Begin
       If s = '0' then
           Y <= I0;
       Else
           Y <= I1;
       End if;
   End process;
end Multiplexor;

Edición del código en Active-HDL

El siguiente video-tutorial muestra como se crea, edita y simula el código para el multiplexor de 2 a 1 usando el software Active-HDL.


Finalmente la figura siguiente muestra una pantalla del Active-HDL, como la simulación que se vio en el video, solo que con otros valores en las señales, pero es lo mismo, ahí se puede apreciar el funcionamiento exacto del mux, si S=0 pasa la señal I0 a Y como se observa en la flecha. Y si S= 1 pasa I1.

5 comentarios:

  1. Hola, porque cuando se cambia la señal de S se repite un ciclo de I0?, eso pasa en el minuto 3:48 del video, donde marcan la linea roja que dice donde se cambió estado de S en Y sale igualmente el resultado deI0 en 1 "ciclo?", porqué pasa eso?. Muchas gracias!

    ResponderEliminar
  2. Hola, justo en ese minuto (3:48) se coloca la linea roja como bien lo dices, ahí antes de la linea, S tiene un "0" y luego después de la línea S tiene un "1", ok, entonces cuando S=0, Y toma el valor exacto de la salida I0, y cuando S=1 Y toma la salida I1, checa y veras justo en ese minuto, antes de la línea roja Y esta igualito a la entrada I0(igual con los mismos ciclos) e igualmente después de la línea roja Y esta igualita a I1, así funciona el multiplexor.. saludos..

    ResponderEliminar
  3. como hacer el codigo multiplicador secuencial 4x4 basys 2

    ResponderEliminar
  4. Respuestas
    1. mmm.. que crees, ahorita he dejado lo de Vhdl, me concentro mas en los microcontroladores, por eso no te puedo ayudar.. lo siento..

      Eliminar