¿Qué es un multiplexor?
Un multiplexor o también conocido como MUX o MPX es un dispositivo que sirve para
transmitir datos de diferentes entradas a una sola salida, es decir, todos los datos que
entran al circuito salen por el mismo lugar, dependiendo del tipo que se utilice, pueden
manejar señales analógicas o digitales.
¿Cómo funciona un multiplexor?
El funcionamiento de los multiplexores se basa en circuitos de compuertas lógicas, en
donde se conectan de tal forma que todas las entradas salen por la misma salida, con la
única condición de que se debe de seleccionar la entrada que mandara los datos hacia la
salida, es decir, que el circuito no puede leer todas las entradas al mismo tiempo, si no
una por vez.
En palabras sencillas, este circuito funciona como un conmutador que solo permite
seleccionar la lectura de una de las entradas, pero debido a la gran velocidad de
conmutación que tiene el circuito, se puede llegar a creer que puede leer todas las
entradas al mismo tiempo.
Partes de los multiplexores
Al ser un circuito combinacional este dispositivo cuenta con pocas partes y su
funcionamiento de cada parte es bastante sencilla de entender:
Entradas: Es por donde entran los datos y siempre tienen un número de entradas de 2^n
(2,4,8,16, etc).
Salida: Es la única vía para que salgan los datos del circuito, aunque cabe mencionar que
también se incorpora una salida extra que prácticamente es el inverso, es decir, si en la
salida tenemos un 1 en la inversa tenemos un 0.
Selectores: Los selectores sirven para elegir la entrada que queremos activar para leer
datos, esta selección se hace a través de números binarios.
Enable: Sirve para activar o desactivar el circuito completo
Lenguaje de descripción de hardware
Un lenguaje de descripción de hardware (HDL, hardware description language) es un lenguaje
de programación especializado que se utiliza para definir la estructura, diseño y operación de
circuitos electrónicos, y más comúnmente, de circuitos electrónicos digitales, como el convertidor
analógico-digital o cualquier antena satelital. Así, los lenguajes de descripción de hardware hacen
posible una descripción formal de un circuito electrónico, y posibilitan su análisis automático y
su simulación.
Los lenguajes de descripción de hardware se parecen mucho a otros lenguajes de programación
de ordenadores tales como el C o Java: básicamente consisten en una descripción textual con
expresiones, declaraciones y estructuras de control. Sin embargo, una importante diferencia entre
los HDL y otros lenguajes de programación está en que el HDL incluye explícitamente la noción
de tiempo.
Estructura de los HDL
Los HDL utilizan expresiones estándar basadas en texto que reflejan la estructura de los
circuitos electrónicos, si se viera dentro de una tarjeta, se podrían observar más de un
millón de compuertas a disposición del programador. Al igual que los lenguajes de
programación concurrentes, la sintaxis y semántica de los HDL incluyen notaciones
específicas para la concurrencia. Sin embargo, al contrario de lo que ocurre con la
mayoría de los lenguajes de programación, los HDL incluyen también una notación
específica para el tiempo, debido a que este es una característica fundamental en los
circuitos electrónicos reales. Los lenguajes cuyo único propósito es expresar la
conectividad entre una jerarquía de bloques son más bien clasificados como "lenguajes
de listas de conexiones" (o lenguajes "netlist"), tales como los que se usan en los
programas de diseño asistido por ordenador (CAD). Los HDL son algo más rico que estos
lenguajes de listas de conexiones, ya que no sólo permiten definir la estructura de un
circuito, sino también su comportamiento.
Así, los HDL pueden ser usados para escribir especificaciones "ejecutables" de hardware.
Es decir, un programa escrito en HDL hace posible que el diseñador de hardware pueda
modelar y simular un componente electrónico antes de que este sea construido
físicamente. Es esta posibilidad de "ejecución" de componentes lo que hace que a veces
los HDL se vean como lenguajes de programación convencionales, cuando en realidad se
debería clasificarlos más precisamente como lenguajes de modelado.
En la práctica existen distintos tipos de simuladores capaces de trabajar tanto con eventos
discretos (digitales) como continuos (analógicos), existiendo lenguajes HDL específicos
para cada caso.
Pero desde el punto de vista práctico, una gran ventaja de los HDL está en que, utilizando
un programa llamado "sintetizador" es posible inferir, a partir de la expresión textual del
programa, el conjunto de operaciones lógicas y el circuito equivalente necesarios para
realizar la función del programa. Esto permite saltar desde el ámbito de la simulación
software al de la implementación real del hardware sobre circuitos lógicos reales tales
como los ASIC o las FPGA.
Lenguajes
• VHDL
• Verilog
• ABEL HDL
Verilog es un lenguaje de descripción de hardware (HDL, del Inglés Hardware
Description Language) usado para modelar sistemas electrónicos. El lenguaje, algunas
veces llamado Verilog HDL, soporta el diseño, prueba e implementación de
circuitos analógicos, digitales y de señal mixta a diferentes niveles de abstracción.
ABEL es la abreviatura de Advanced Boolean Expression Language. Es un lenguaje de
descripción de hardware y un conjunto de herramientas de diseño para
programar dispositivos lógicos programables (PLDs).
VHDL es un lenguaje de especificación definido por el IEEE (Institute of Electrical and
Electronics Engineers) (ANSI/IEEE 1076-1993) utilizado para describir circuitos
digitales y para la automatización de diseño electrónico . VHDL es acrónimo proveniente
de la combinación de dos acrónimos: VHSIC (Very High Speed Integrated Circuit)
y HDL (Hardware Description Language). Aunque puede ser usado de forma general
para describir cualquier circuito digital se usa principalmente para
programar PLD (Programable Logic Device - Dispositivo Lógico
Programable), FPGA (Field Programmable Gate Array), ASIC y similares.
Originalmente, el lenguaje VHDL fue desarrollado por el departamento de defensa de los
Estados Unidos a inicios de los años 80 basado en el lenguaje de programación ADA con
el fin de simular circuitos eléctricos digitales. Posteriormente se desarrollaron
herramientas de síntesis e implementación en hardware a partir de los archivos VHD.
Características del lenguaje VHDL
La característica más importante del VHDL es que, al ser un lenguaje de descripción, si
se definen leyes o reglas que simbolicen conexiones, dichas reglas se hacen efectivas al
mismo tiempo, a diferencia de otros lenguajes en los cuales la ejecución es en serie, es
decir, se ejecuta una instrucción tras otra. Sin embargo, tiene también la posibilidad de
ejecutar algunos bloques de forma serie, haciendo así la descripción en dicho lenguaje
más sencilla y con un nivel de abstracción más alto que si se crearan netlists.
Arquitectura
Los pares de entidades y arquitecturas se utilizan para representar la descripción completa
de un diseño. Una arquitectura describe el funcionamiento de la entidad a la que hace
referencia, es decir, dentro de la arquitectura tendremos que describir el funcionamiento
de la entidad a la que está asociada utilizando las sentencias y expresiones propias de
VHDL.
- Define internamente el circuito.
- Señales internas, funciones, procedimientos, constantes …
- La descripción de la arquitectura puede ser estructural o por comportamiento.
architecture arch_name of entity_name is
-- declaraciones de la arquitectura:
-- tipos
-- señales
-- componentes
begin
-- código de descripción
-- instrucciones concurrentes
-- ecuaciones booleanes
-- componentes
process (lista de sensibilidad)
begin
-- código de descripción
end process;
end arch_name;
Identificadores
En VHDL existen tres clases de objetos por defecto:
- Constant. Los objetos de esta clase tienen un valor inicial que es asignado de forma
previa a la simulación y que no puede ser modificado durante ésta.
constant identificador: tipo: = valor; -
-Variable. Los objetos de esta clase contienen un único valor que puede ser cambiado
durante la simulación con una sentencia de asignación. Las variables generalmente se
utilizan como índices, principalmente en instrucciones de bucle, o para tomar valores que
permitan modelar componentes. Las variables NO representan conexiones o estados de
memoria. Pueden ser declaradas antes del begin de la architecture y/o antes del begin del
process, en su declaración se les puede asignar un valor por defecto.
- variable identificador: tipo [: = valor];
La asignación de una variable a un valor se hace mediante el operador:
= nombre variable: = valor o expresión; i: = 10;
- Signal. Las señales representan elementos de memoria o conexiones y sí pueden ser
sintetizados, dicho de otra manera, a cada objeto de nuestro código VHDL que sea
declarado como signal le corresponde un cable o un elemento de memoria (biestable,
registro …) en nuestro circuito. Por lo tanto, su comportamiento en simulación será el
esperado de ese elemento físico, aunque no lo describamos en el código explícitamente.
Tienen que ser declaradas antes del begin de la architecture.
- signal identificador: tipo;
La asignación de una señal a un valor se hace mediante el operador
<= nombre señal <= valor o expresión; A <= 10;
Reglas para el diseño de circuitos combinacionales
Condiciones para que un proceso infiera un circuito combinacional correctamente:
• Si una señal se asigna dentro de un proceso o en una sentencia de asignación
concurrente, entonces debe garantizarse que recibe un valor bajo todas las posibles
condiciones o casos. En otras palabras, el valor de la señal debe estar definido en
todos los casos.
• La lista de sensibilidad de un proceso que modela lógica combinacional debe
contener todas las señales que son leídas en el proceso, es decir, todas las señales
cuyo valor se utiliza dentro del proceso y que por tanto actúan como entradas en
el circuito resultante de la síntesis.
• Si se utilizan variables dentro de un proceso, estas deben de ser utilizadas
propiamente como variables intermedias, es decir, que deben ser escritas antes de
ser leídas.
Algunas consecuencias de las reglas anteriores:
• Para cubrir todos los casos, es conveniente que toda sentencia IF o asignación
condicional lleve una cláusula ELSE, y toda sentencia CASE o asignación
seleccionada lleve una cláusula WHEN OTHERS
• No se deben crear referencias circulares, es decir, salidas que dependen de sí
mismas, ya que se generarían lazos de realimentación asíncronos
• Se aconseja el uso de señales en lugar de variables cuando sea posible
Reglas para el diseño de circuitos secuenciales síncronos
Deben describirse mediante procesos
Debe haber una condición de flanco de reloj
IF clk’EVENT AND clk = ‘1’ THEN
IF clk’EVENT AND clk = ‘0’ THEN
• Detrás de dicha condición no puede haber ELSE
• Si se asigna una señal, no es necesario cubrir todos los casos: en los casos no
cubiertos, la señal mantiene su valor
Lista de sensibilidad: reloj + entradas asíncronas (reset)
• Las entradas de datos y las entradas síncronas no aparecen en la lista de
sensibilidad del proceso
“Plantilla” para el diseño de circuitos secuenciales síncronos
Simulaciones en ISE project navigator
Código VHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mux2a1 is
Port ( A : in STD_LOGIC_VECTOR (3 downto 0);
B : in STD_LOGIC_VECTOR (3 downto 0);
Sel : in STD_LOGIC;
SALIDA : out STD_LOGIC_VECTOR (3 downto 0));
end mux2a1;
architecture Behavioral of mux2a1 is
begin
process (A,B,Sel)
begin
if Sel = '0' then
SALIDA <= B;
else
SALIDA <= A;
end if;
end process;
end Behavioral;
RTL-Schematic
Simulaciones diferentes y explicadas.
A la hora de ir al apartado de simulación, observamos que en la parte izquierda de la
pantalla negra, se muestran los puertos de la entidad (a, b, sel, salida). Posteriormente
forzamos la constante de cada puerto, agregando un valor cualquiera, en este caso al
puerto a le asignamos el numero15 (1111), y al puerto b le asignamos el numero 3
(0011).
Después de haberle asignado un valor a cada puerto, agregamos un valor a sel
(selector), el cual dependiendo de si es 0 o 1 va a dejar pasar o seleccionar uno de los
puertos, ya sea el a o el b.
Posteriormente una vez agregados estos valores, ejecutamos la simulacion oprimiendo
en el boton señalado en un circulo rojo.
En seguida se ejecutará el programa y observaremos que cuando el valor que le
asignamos a sel = 0, en la salida de nuestro multiplexor tendremos el valor que le
asignamos al puerto b (0011).
Lo que sucede cuando a sel le asignamos el valor de 1, es que ahora en lugar de
tomar el valor de b, mostrara el valor de a(1111).
Lo que estamos comprobando con este MUX 2 a 1 de 4 bits, es que esta trabajando
correctamente. Observamos que quien decide que dato pasa por el multiplexor, es el
selector (sel).
Simulación 2
Para esta simulación, hicimos lo mismo que anteriormente, solo que esta vez
cambiamos los valores de entrada, para el canal a le asignamos el numero 10, y para el
canal b el numero 15. Observamos nuevamente que al modificar el valor del selector
entre 0 y 1, cuando tomamos el valor de 1, el resultado que selecciona y va a la salida
es el 10, y cuando sel = 0, el valor que se muestra en la salida es el 15. Comprobando
así, que nuestro multiplexor esta trabajando correctamente.
Simulación 2
Para esta simulación, hicimos lo mismo que anteriormente, solo que esta vez
cambiamos los valores de entrada, para el canal a le asignamos el número 14, y para el
canal b el número 10. Observamos nuevamente que al modificar el valor del selector
entre 0 y 1, cuando tomamos el valor de 1, el resultado que selecciona y va a la salida
es el 14, y cuando sel = 0, el valor que se muestra en la salida es el 10. Comprobando
así, que nuestro multiplexor está trabajando correctamente.
Conclusiones
Lo aprendido en esta práctica, es el funcionamiento de un multiplexor el cual es un
dispositivo que sirve para transmitir datos de diferentes entradas a una sola salida.
Observamos que el valor que determina qué dato será visualizado en la salida es el
selector, ya que este es quien recibirá el número del dato de entrada que puede mostrarse
en la salida. Adema de lograr utilizar el software ISE Design Suite 14.7 para las
simulaciones de estos circuitos, este nos permitió observar una gran ventaja que VHDL
ha introducido para el diseño de sistemas digitales, en este programa, nosotros
introducimos un código con un cierto lenguaje de programación, y este software nos
entrega un circuito digital que se mostro anteriormente en el apartado de RTL-Schematic,
y con esto nos facilita el diseño de estos multiplexores. Los pasos fueron sencillos,
simplemente primero es realizar el proyecto y agregamos el código, verificamos que
no tenga errores y posteriormente realizamos el proceso de síntesis, y una vez hechos
estos dos procesos lograremos ver el RTL Schematic.
Linkografia
[Link]/mecafenix. (2020, December 4). ¿Qué es un multiplexor y cómo
funciona? - Ingeniería Mecafenix. Retrieved December 3, 2021, from Ingeniería
Mecafenix website: [Link]
Sánchez-Élez, M. (n.d.). Introducción a la Programación en VHDL 1 F. Informática
(UCM). Retrieved from [Link]
Colaboradores de los proyectos Wikimedia. (2004, August 18). lenguaje de
programación. Retrieved December 3, 2021, from [Link] website:
[Link]
VHDL-3a Circuitos combinacionales y secuenciales —. (2015). Retrieved
December 3, 2021, from [Link] website: [Link]
electronica/circuitos-integrados-y-microelectronica/teoria_vhdl/vhdl-3a-circuitos-
combinacionales-y-secuenciales-1/view