Conocimientos básicosPráctica 1: MultiplexorDemultiplexor
 
Qué es un multiplexorUn multiplexor es un dispositivo lógico que recibe información por sus dos o más entradas (de uno o mas bits de ancho) y mediante una señal de control decidimos cual de la entradas aparece reflejada en la salida; esto es, un convertidor de paralelo a serie. Si tienen una señal de "enable" esta hace que el multiplexor esté habilitado o no

Pulsa sobre llos botones para elegir una prácticaElige en la lista una práctica para empezar, sin más que pinchar en el botón adecuado. Para volver pulsa el botón que está al lado del título

Comentarios adicionalesLos multiplexores que hemos propuesto tienen todos señal de enable menos el primero. Las arquitecturas están realizadas solo para algunas entidades

Entidad 1

Multiplexor de un bit y dos canales sin "enable"

Entidad 2

Cómo añadir una señal de "enable"

Entidad 3

Como aumentar los bits de cada canal

Entidad 4

Cómo aumentar el número de canales

Arquitectura 1

Completar la entidad 4 con estilo algorítmico o de comportamiento

Arquitectura 2

Completar la entidad 2 con estilo flujo de datos

Arquitectura 3

Completar la entidad 2 con estilo estructural

 

Pulsa aquí para simular los ejemplos construidos.

 

Entidad 1: Multiplexor de un bit y dos canales sin "enable" Ir al principio de esta página

Este primer ejemplo es el más sencillo de todos ya que no se puede concebir un multiplexor con menos operatividad. Usaremos el tipo bit, que viene predefinido por VHDL, y sirve para indicar que la señal o variable asociada es de un sólo bit. La nomenclatura usada para designar a los puertos se mantendrá hasta el final de la práctica, no así como el nombre de la entidad, que lo cambiaremos.

entity multiplexor is port(
a,b     : in  bit;  
control : in  bit;  
c       : out bit
);
end
multiplexor;
En este caso, las entradas son a y b (por eso son del modo in), la señal de control es control (también del modo in), y la salida es c (del modo out). Todas son de un bit de ancho.

 

 

 

 

Entidad 2: Qué hacer para que tenga señal de "enable" Ir al principio de esta página

Para que nuestro diseño tenga una señal de enable, y a efectos de la entidad, solamente debemos incluirla sin más. Más adelante, en la arquitectura será donde deberemos manejar esta señal para que realice lo que nosotros queramos.

entity multiplexor is port(
a,b     : in  bit;
control : in  bit;
enable  : in  bit;
c       : out bit
);
end multiplexor;
En este caso, las entradas son a y b, la señal de control es control, la señal de enable es enable, y la salida es c. Todas vuelven a ser de un bit de ancho.

 

 

 

 

Entidad 3: Qué hacer para que cada canal sea de mas bits Ir al principio de esta página

Si queremos que cada entrada (y la salida, por supuesto), tengan más anchura, es decir, más bits, no nos sirve el tipo bit, ya que su anchura es de un bit. Para ello deberemos usar vectores de bits, que al igual que bit está predefinida en VHDL. En este ejemplo usaremos entradas de 4 bits, que para definirlos hay que escribir el número de mayor peso seguido de la palabra downto y del número de menor peso.

entity multiplexor is port(
a,b:in bit_vector(3 downto 0);
control:in bit;
enable :in bit;
c: out bit_vector(3 downto 0)
);
end multiplexor;
En este caso, las entradas son a y b, la señal de control es control, la señal de habilitación es enable, y la salida es c. Ahora, las entradas a y b son de 4 bits de ancho, pero como sólo son dos, control debe seguir siendo de un solo bit. La salida debe aumentar también para adaptarse a las entradas.

 

 

 

 

Entidad 4: Qué hacer para que tenga más canales Ir al principio de esta página

Al igual que cuando queríamos que tuviese señal de enable, si ahora queremos más canales, a efectos de la entidad, sólo debemos añadirlos.

entity multiplexor is port(
a,b,c:  in bit_vector(3 downto 0);
control:in bit_vector(1 downto 0);
enable: in bit;
d:     out bit_vector(3 downto 0);
);
end multiplexor;
En este caso, las entradas son a, b, y c, la señal de control es control, la señal de habilitación es enable, y la salida es d. Las entradas y la salida siguen siendo de 4 bits de ancho, y al haber mas de dos, control debe aumentar su anchura a dos bits.

 

control enable d
XX H HHHH
LL L a
LH L b
HL L c
HH L HHHH

 

 

 

Arquitectura 1: Estilo algorítmico  o de comportamiento usando la entidad 4 Ir al principio de esta página

El estilo algorítmico es una forma de programación en la cual se usan los elementos propios de un lenguaje de programación, es decir, ciclos forwhile, case,...  Para un multiplexor, parece hecha a la medida la sentencia case, y para comprobar si la entrada enable está habilitada un ciclo for. Una forma de implementar el multiplexor correspondiente a la entidad 4 sería la siguiente:

1
2
3
4
5
6
7
8
9
10Si cambia una o más de las variables entre paréntesis, se ejecuta el proceso.
11
12Si enable vale '1', entonces la salida d vale '1111'
13Si no se cumple lo anterior y si enable vale '0' entonces se ejecuta la sentencia case
14
15En el caso de que control valga '00', entonces la salida d vale lo que valga la entrada a
16En el caso de que control valga '01', entonces la salida d vale lo que valga la entrada b
17En el caso de que control valga '10', entonces la salida d vale lo que valga la entrada c
18En el caso de que control tenga un valor que no sea alguno de los especificados anteriormente, la salida d vale '1111'
19
20
21
22
entity multi is port(
a, b, c :in  bit_vector(3 downto 0);
enable  :in  bit;
control :in  bit_vector(1 downto 0);
d       :out bit_vector(3 downto 0)
);
end multi;
architecture archmul of multi is
begin
process (a, b, c, control, enable)
begin
if enable='1' then d<="1111";
elsif enable='0' then
    case control is
        when "00" => d <= a;
        when "01" => d <= b;
        when "10" => d <= c;
        when others => d <= "1111";
    end case;
end if;
end process;
end
archmul;
 
 
 
 
 
 
 
Cabecera del programa
Empieza el programa
Cabecera de un proceso
Empieza el proceso
  Sentencia if
     Sentencia elsif
      Sentencia case
  
  
  
  
      Acaba sentencia case
  Acaba sentencia if y elsif
 Acaba el proceso
Finaliza el programa

Debemos ver lo siguiente en este ejercicio:

Qué debes saber antes de simular Pulsa aquí para ver el código fuente Pulsa aquí para simular el ejemplo anterior

 

 

Arquitectura 2: Estilo flujo de datos usando la entidad 2 Ir al principio de esta página

El estilo de flujo de datos nos muestra la funcionalidad de un dispositivo mediante ecuaciones ejecutadas concurrentemente, es decir, todas a la vez. Mediante las sentencias and, xor, not, and,.. transformamos las entradas en las salidas. Para el ejemplo del multiplexor de dos canales de un bit con "enable" el esquema de puertas lógicas es el siguiente:

Esquema en base a puertas lógicas del multipexor de la entidad 2

1
2
3
4
5
6
7
8
9
10
11Aux1 es el producto lógico de b por control negado
12Aux2 es el producto lógico de a por control
13Aux3 es la suma lógica de aux1 más aux2
14La salida c es el producto lógico de enable y aux3
15
entity multi is port(
a,b     : in  bit;
control : in  bit;
enable  : in  bit;
c       : out bit
);

end multi;
architecture archmul of multi is
signal
aux1,aux2,aux3: bit;
begin

aux1 <= b and (not(control));
aux2 <= a and control;
aux3 <= aux1 or aux2;
c    <= enable and aux3;
end
archmul;
 
 
 
 
 
 
 
Cabecera del programa
Declaración de señales
Empieza el programa
  Sentencia concurrente
  Sentencia concurrente
  Sentencia concurrente
  Sentencia concurrente
Finaliza el programa

Recordemos que unas sentencias son concurrentes si se ejecutan todas a la vez. De este código debemos destacar estas dos cuestiones:

d <= enable and ( (b and (not(control)) or (a and control) );

Este tipo de estilo es solo recomendable usarlo en "estado puro" solo para diseños tan sencillos , siendo de verdadera utilidad al usarlo como complemento del estilo algorítmico y en ocasiones del estructural. A partir de ahora la única forma en que la veamos será esta: como complemento.

Qué debes saber antes de simular Pulsa aquí para ver el código fuente Pulsa aquí para simular el ejemplo anterior

 

 

Arquitectura 3: Estilo estructural  usando la entidad 2 Ir al principio de esta página

El estilo estructural es fácilmente reconocible porque la operatividad del programa no se puede leer del código ya que está formado íntegramente por componentes y las señales que les unen a otros. Es decir, está formado por bloques o cajas negras a los cuales metemos información y sacamos las salidas, las cuales podrán o no ir a otros bloques. Para esto debemos conocer la operatividad de estos bloques, los cuales suelen estar en librerías. Para usar las puertas que están en el paquete gatespkg debemos primero invocar a la librería ieee (léase "i e cubo") como está expuesto en la primera línea de la entidad que debemos usar. Para usar el paquete (o sub-librería) gatespkg la llamaremos de la forma en que está en la segunda línea. Estas librerías vienen incluidas en la versión 3.5 del programa WARP, de Cypress Semiconductor.

Esquema de la arquitectura correspondiente a la entidad 2

1
2

3

4
5
6
7
8
9
10
11
12
13Llamamos a la entidad INV que está en la librería GATESPKG, en la cual introducimos CONTROL y sacamos AUX0.
14Llamamos a la entidad AND2 que está en la librería GATESPKG, en la cual introducimos B y AUX0 y sacamos AUX1.
15Llamamos a la entidad AND2 que está en la librería GATESPKG, en la cual introducimos A y CONTROL y sacamos AUX2.
16Llamamos a la entidad OR2 que está en la librería GATESPKG, en la cual introducimos AUX1 y AUX2 y sacamos AUX3.
17Llamamos a la entidad AND2 que está en la librería GATESPKG, en la cual introducimos AUX3 y ENABLE y sacamos C, que es la salida.
18
19
library ieee;
use work.gatespkg.all;

entity multi is port(
a,b : in bit;
control : in bit;
enable : in bit;
c : out bit
);
end multi;
architecture archmul of multi is
signal aux0,aux1,aux2,aux3: bit;
begin
puerta0:inv  port map(control,aux0);
puerta1:and2 port map(b,aux0,aux1);
puerta2:and2 port map(a,control,aux2);
puerta3:or2  port map(aux1,aux2,aux3);
puerta4:and2 port map(enable,aux3,c);
end archmul;
Llamamos a la librería IEEE
Llamamos a la librería que tiene las puertas lógicas
 
 
 
 
 
 
 
Cabecera del programa
Declaración de señales
Empieza el programa
  Sentencia concurrente
  Sentencia concurrente
  Sentencia concurrente
  Sentencia concurrente
  Sentencia concurrente
Finalizamos el programa

En este ejemplo vemos que debemos hacer para usar las librerías que vienen predefinidas con el lenguaje VHDL y más concretamente con Warp 3.5 de Cypress Semiconductor. Para trabajar con librerías debemos tener en cuenta estos puntos:

Si alguien cambiase el contenido de la librería e hiciese que el bloque and2 dejase de ser una puerta and de dos entradas, nuestro diseño no sería correcto, ya que no haría lo que nosotros pretendemos en un principio. Por ésto, debemos estar seguros de que función realiza una parte de una librería antes de usarla.

Al igual que el estilo de flujo de datos, este estilo es poco usado en estado puro, usándose solamente para unir diseños complejos creados anteriormente.

Qué debes saber antes de simular Pulsa aquí para ver el código fuente Pulsa aquí para simular el ejemplo anterior

 

Separa01.gif (636 bytes)

ÍndiceConocimientos básicosPrincipio de esta  páginaPráctica siguiente: el Demultiplexor