Está en la página 1de 87

Noviembre 23 de 2006

MODULO
SISTEMAS DIGITALES BASICOS

MIGUEL PINTO APARICIO

miguelpintoaparicio@gmail.com

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD

BUCARAMANGA

2006
INTRODUCCION

El curso de Circuitos Digitales Básicos es del Campo de Formación


Profesional específica para el programa de Ingeniería Electrónica, con dos
créditos académicos, es Metodológico y a distancia. Busca darle la capacidad
de describir al estudiante de manera suficiente las nociones, los conceptos y
los procedimientos necesarios para el análisis y diseño de Circuitos Digitales.

Este curso es un abre bocas al maravilloso mundo digital, y pretende dar una
formación básica a los futuros diseñadores digitales, que con dispositivos como
PLDs, FPGAs, DSPs, etc. podrán llevar a la vida real aquellas ideas que le
permitan interactuar al hombre con la máquina.

La Electrónica Digital ha experimentado un rápido crecimiento tecnológico; Los


circuitos digitales son comúnmente usados en productos de consumo, equipos
industriales y de control, equipos de oficina, equipos médicos, militares y de
comunicaciones. Este uso extensivo de los circuitos digitales ha sido gracias a
los avances tecnológicos que han reducido los costos en los circuitos
integrados y la capacidad de los mismos, así como la aplicación de displays,
memorias y tecnología computarizadas.

El curso consiste de dos Unidades, la primera detalla todos los conceptos


básicos, procedimientos y métodos de reducción de circuitos digitales; la
segunda unidad es una fundamentación en el uso del Lenguaje VHDL, el cual
es empleado para el diseño asistido por Computador de los Circuitos Digitales.

El enfoque para el aprendizaje autónomo de este curso es del tipo teórico-


práctico, en donde la teoría es fácilmente llevada a la práctica por medio de
talleres diseñados para tal fin. De tal manera, que el estudiante pueda depurar
su conocimiento y dominio del tema por medio de su aplicación inmediata.
Inicialmente el estudiante entenderá como desde una ecuación Booleana se
puede construir físicamente un circuito digital y cómo estos cumplen con las
operaciones básicas del Algebra de Boole.

Este enfoque será gracias al estudio independiente que se desarrolla a través


del trabajo personal y del trabajo en pequeños grupos colaborativos de
aprendizaje, y de acompañamiento tutorial desarrollado a través de la tutoría
individual, en pequeños grupos colaborativos y de tutoría en grupo de curso.

Así mismo busca fomentar la cultura investigativa y de lectura en el estudiante


a través del uso de tecnologías que faciliten el acceso a la información y la
obtención de fuentes bibliográficas, de manera que fortalezca su aprendizaje
autónomo.

En cuanto al sistema de evaluación del curso, este se basa en lo contemplado


y definido en el Reglamente General Estudiantil, de forma que permita
comprobar el nivel de avance del auto-aprendizaje alcanzado a lo largo del
curso. Por lo tanto, se emplearán tres tipos de evaluación alternativas y
complementarias:

Autoevaluación: evaluación que realiza el estudiante para valorar su


propio proceso de aprendizaje.
Coevaluación: se realiza a través de los grupos colaborativos, y
pretende la socialización de los resultados del trabajo personal.
Heteroevaluación: Es la valoración que realiza el tutor.

Para el desarrollo del curso es importante el papel que juegan los siguientes
recursos tecnológicos como medio activo, buscando la relación tutor-
estudiante:

• Módulos y guías escritos para estudio temático y orientación pedagógica.


• El Computador como herramienta informática para estudio con CD ROM,
conexión a Internet y editores de texto.
• Sistemas y plataformas tecnológicas institucionales para favorecer la
comunicación sincrónica, tales como; videoconferencia, Chat. Estas
permiten encuentros presénciales directos o mediados, favoreciendo una
interacción inmediata.

• Y las comunicaciones asincrónicas tales como: Grupos de interés, páginas


WEB, Correo electrónico, grupos de noticias, servidores FTP. Estas
permiten la comunicación en forma diferida favoreciendo la disposición del
tiempo del estudiante para su proceso de aprendizaje.

Para facilitar el auto-aprendizaje es necesario consultar la bibliografía


recomendada, utilizar la biblioteca virtual y el acceso a Internet, con esto se
está también potenciando en los estudiantes la capacidad de investigación y de
auto gestión para adquirir conocimiento según sean sus necesidades y/ó
debilidades encontradas durante cada uno de los pasos del proceso a seguir,
es decir el modelo pedagógico a desarrollar son las habilidades de
pensamiento.

El acceso a documentos adquiere una dimensión de suma importancia en


tanto la información sobre el tema exige conocimientos y planteamientos
preliminares, por tal razón es imprescindible el recurrir a diversas fuentes
documentales y el acceso a diversos medios como son: bibliotecas
electrónicas, hemerotecas digitales e impresas, sitios Web especializados.

En la medida que el estudiante adquiera su rol, se interiorice y aplique los


puntos abordados anteriormente, podrá obtener los logros propuestos en este
curso. Es importante ser consciente de las fortalezas y debilidades, prestando
atención a pulir las primeras y mejorar en las segundas, y lo mejor para llevarlo
a cabo con Disciplina.
PRIMERA UNIDAD DIDÁCTICA

SISTEMAS DIGITALES BASICOS

CAPÍTULO 1. OPERACIONES BINARIAS

Desde la antigüedad el hombre ha tenido la necesidad de contar, y para


hacerlo ha desarrollado diferentes sistemas de numeración, como el Decimal,
binario, Octal, etc; Estos sistemas de numeración se diferencian entre sí por la
base que empleen, es decir, por el número de dígitos que empleen para
contar. De tal forma que el sistema decimal tiene los dígitos 0,1,2,3,4,5,6,7,8,9;
el sistema Octal tiene los dígitos 0,1,2,3,4,5,6,7; el sistema binario tiene los
dígitos 0,1; de donde podemos concluir que la base del sistema decimal es 10,
del sistema Octal es 8 y el sistema binario es 2.

Cualquier sistema de numeración que se emplee puede ser representado de la


siguiente manera:

0
an an −1.....a2 a1a0 = ∑ ai bi = anb n + an −1b n −1 + ... + a1b1 + a0b 0 (Ecuación No. 1)
i=n

Donde an an −1...a2 a1a0 representa la distribución de los dígitos en el número


representado por el sistema numérico, es decir, si hablamos del sistema
decimal, a0 representaría el dígito de las unidades, a1 representaría el dígito
de las decenas, a2 representaría el dígito de las centenas, y así
sucesivamente. En la sumatoria expresada en la Ecuación No. 1, la i
representa la posición relativa del dígito en el número representado, y esta
numeración de la posición se inicia desde 0 y en el sentido derecha a izquierda.
Y el término bi , representa la base del sistema de numeración empleado
elevado a la i.

El lado derecho de la Ecuación No. 1 enfatiza la manera como los dígitos y la


relación de su posición en el número representado puede llevarse a su valor
numérico, es decir, sabemos que para el sistema decimal las unidades tienen
un valor de 1, las decenas tienen un valor de 10, las centenas tienen un valor
de 100, etc.; que es lo mismo que decir, que como las unidades están en la
posición 0 del número es tener a la base (b=10) elevada a la posición 0
( b 0 = 100 = 1 ), las decenas están en la posición 1 entonces es tener b1 = 101 = 10 ,
las centenas están en la posición 2 entonces es tener b 2 = 10 2 = 100 , etc..
Ahora, si tenemos el valor de la posición que le corresponde a cada dígito,
entonces el dígito y su valor de posición son multiplicados, y el producto de
todos los dígitos y su valor son sumados para obtener el valor numérico del
número representado. Esto lo podemos comprender en el siguiente ejemplo

2197 = 2*103 + 1*10 2 + 9*101 + 7 *100

Explicación
Tenemos el número 2197, el cual tiene el dígito 2 en la posición tres, el dígito 1
en la posición dos, el dígito 9 en la posición uno y el dígito 7 en la posición
cero; tenemos en cuenta que este número está representado en base 10, por lo
tanto, para expresarlo de forma numérica hacemos la sumatoria de cada dígito
multiplicado por la base elevada a la posición representativa del dígito en el
número. De esta manera tenemos que

2197 = 2*1000 + 1*100 + 9*10 + 7 *1 = 2000 + 100 + 90 + 7 .

Podemos Observar otro ejemplo con la siguiente gráfica:


La principal diferencia entre los diferentes sistemas numéricos existentes, es la
cantidad de dígitos que disponen para el proceso de contar, en la siguiente
tabla se comparan los sistemas decimal, binario, octal, hexadecimal:

DECIMAL BINARIO OCTAL HEXADECIMAL


1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
16 10000 20 10
17 10001 21 11
18 10010 22 12
19 10011 23 13
20 10100 24 14

Sistema Octal
El sistema octal tiene 8 dígitos para su numeración (0, 1, 2, 3, 4, 5, 6 y 7) por lo
cual se considera que su base es 8. Un procedimiento sencillo para pasar del
sistema decimal al octal es el siguiente:

Tomemos como ejemplo la conversión del número decimal 1977 al sistema


octal, para ello se realizarán divisiones sucesivas por 8 así:

Se toma en orden inverso a su aparición el resultado final y los residuos


correspondientes, de tal manera, que el correspondiente número en octal es
3671
Sistema Binario

Nosotros empleamos el sistema de numeración decimal, es decir, empleamos


la base 10 para contar, pero en el caso de los sistemas digitales, ellos sólo
tienen dos estados posibles, dos posibles dígitos, el 0 y el 1, por lo tanto,
emplean el sistema binario. Así que para poder expresar nuestro mundo en el
mundo digital necesitamos representarlo en los requerimientos de este.

Teniendo en cuenta la ecuación No. 1 y conociendo que la base de los


sistemas digitales es 2, se puede definir el valor numérico en decimal de un
número binario de la siguiente manera:

an an −1...a2 a1a0 = an * 2 n + an −1 * 2 n −1 + ... + a2 * 22 + a1 * 21 + a0 * 20 (Ecuación No. 2)

En donde, se mantiene que an an −1...a2 a1a0 representa el valor de cada dígito


según su posición relativa, pero con una característica especial, cada dígito
sólo puede tomar el valor 1 o el valor 0, lo que nos puede dar a entender que
cada posición de un dígito representado en un número binario tiene un valor fijo
si este es uno, es decir, la posición cero vale 1, la posición uno vale 2, la
posición dos vale 4, la posición cuatro vale 8, y así sucesivamente si vamos
resolviendo las potencias que se muestran en la Ecuación No. 2.

Nota Importante:
Antes de continuar, tenemos que definir para este módulo (como es
acostumbrado en casi todos los textos) que cuando tengamos un número
representado, este debe ir acompañado de un subíndice que nos indique
el sistema numérico en el cual se está representando, es decir:
 si el subíndice es 2, es porque es sistema Binario, ejemplo:
111012
 si el subíndice es 8, es porque es sistema Octal, ejemplo:
56038
 si el subíndice es 10, es porque es sistema Decimal, ejemplo:
985610

Como podemos observar de la Ecuación 2, las posiciones de los dígitos tienen


un peso numérico relacionado con una potencia de 2, es decir, ha medida que
la posición del dígito incrementa, su valor numérico se incrementa en potencias
de dos:

110 , 210 , 410 , 810 , 1610 , 3210 , 6410 , 12810 , 25610 , 51210 ,........

Para convertir un número Decimal en un número Binario se puede implementar


el método explicado en el siguiente ejemplo:

 Convertir el número 87510 al sistema Binario


Para poder realizar la conversión de este número se busca la potencia de
dos que sea igual o menor al número dado, en este caso es 51210 por lo cual
se asume que la posición nueve del número Binario será un uno. Ahora
sólo tenemos en cuenta las unidades restantes entre el número original y la
potencia encontrada, las cuales son 36310 .
Para las 36310 unidades restantes, la potencia encontrada es 25610 por lo
cual la octava posición del número Binario será un uno, y las unidades
restantes en este caso son 10710 .
Para las 10710 unidades restantes, la potencia encontrada es 6410 por lo cual
la sexta posición del número Binario será un uno, y las unidades restantes
en este caso son 4310 .
Para las 4310 unidades restantes, la potencia encontrada es 3210 por lo cual
la quinta posición del número Binario será un uno, y las unidades restantes
en este caso son 1110 .
Para las 1110 unidades restantes, la potencia encontrada es 810 por lo cual la
tercera posición del número Binario será un uno, y las unidades restantes
en este caso son 310 .
Para las 310 unidades restantes, la potencia encontrada es 210 por lo cual la
primera posición del número Binario será un uno, y la unidad restante en
este caso es 110 lo cual nos indica que la posición cero será un uno. Por lo
tanto la respuesta es
87510 ⇔ 11011010112
En muchos casos tendremos que convertir un número binario en decimal, para
lo cual tendremos en cuenta que cada posición del dígito en el número binario
está representado por un valor equivalente a una potencia de dos, por ejemplo
para el número 1101010112 sabemos que cada posición de los dígitos equivale
a:

1.1 Suma y Resta

En cualquier sistema numérico, las técnicas empleadas en las operaciones de


suma y resta son iguales, se siguen los mismos criterios de adición y
sustracción; cuando sobrepasamos el máximo número de dígitos disponibles
generamos un acarreo al dígito siguiente más significativo, de similar manera si
estamos restando a un dígito que es menor al valor que se le resta se procede
a solicitar un préstamos al dígito siguiente más significativo. Se mantiene la
norma de comenzar a sumar o restar desde el dígito menos significativo o
dígito de la posición cero.

1.1.1 Definición
La suma binaria la definiremos de la siguiente manera:
 Si adicionamos dos dígitos cuyos valores son cero, el resultado es cero.
 Si adicionamos un dígito cuyo valor es uno con un dígito cuyo valor es
cero, su resultado es uno
 Si adicionamos dos dígitos cuyos valores son unos, el resultado es cero,
pero generamos un dígito adicional que lo llamaremos acarreo y cuyo
valor es uno; el dígito de acarreo será un componente a adicionar a los
dígitos inmediatamente más significativos.

La resta binaria la definiremos de la siguiente manera:


 El orden de la resta se define del primer dígito dado menos el segundo
dígito dado, por lo tanto, en la mayoría de los casos el primer número
binario dado para la resta debe ser mayor al número binario sustraendo.
Si esto no se cumple, en la mayoría de los casos se implementa una
representación binaria conocida como representación en Complemento
a dos, la cual nos permite diferenciar números binarios positivos de
números binarios negativos.
 Si el primer dígito es cero y se le resta un segundo dígito que es cero, el
resultado es cero.
 Si el primer dígito es uno y se le resta un segundo dígito que es cero, el
resultado es uno.
 Si el primer dígito es uno y se le resta un segundo dígito que es uno, el
resultado es cero.
 Si el primer dígito es cero y se le resta un segundo dígito que es uno,
estaríamos solicitándole al dígito inmediatamente más significativo un
préstamos de una unidad permitiendo un resultado de uno; este
préstamo se convierte en una resta adicional a la que se efectuara en el
siguiente dígito más significativo.

1.1.2 Ejercicios Prácticos

Realicemos la suma del número 11010 2 con el número 10112 :

Procedimiento:
 Primero que todo agrupamos los dos números binarios uno encima del
otro de tal manera que los dígitos de la misma posición se encuentre en
la misma columna o uno sobre el otro:

11010 2 +
010112

 Noten que agregamos un cero a la izquierda en el segundo número


binario sólo para igualar el número de dígitos en ambos (es algo que con
la experiencia no necesitaremos).
 Los dígitos de la posición cero son 0 y 1 respectivamente, por lo tanto su
resultado es 1.
 Los dígitos de la posición uno son 1 y 1 respectivamente, por lo tanto su
resultado es 0, pero generan un dígito de acarreo con valor 1 para ser
sumado con el resultado de la suma de los dígitos de la posición dos.
 Los dígitos de la posición dos son 0 y 0 respectivamente, por lo tanto su
resultado es 0, pero tenemos un dígito de acarreo que proviene de la
suma anterior, este dígito lo adicionamos al presente resultado lo que
nos da 1.
 Los dígitos de la posición tres son 1 y 1 respectivamente, por lo tanto su
resultado es 0, pero generan un dígito de acarreo con valor uno para ser
sumado con el resultado de la suma de los dígitos de la cuarta posición.
 Los dígitos de la cuarta posición son 1 y 0 respectivamente, por lo tanto
su resultado es 1, pero tenemos un dígito de acarreo que proviene de la
suma anterior, este dígito lo adicionamos al presente resultado lo que
nos da 0, y generamos un dígito más de acarreo para la siguiente suma.
 Resulta que no tenemos más dígitos para sumar, pero tenemos un
acarreo de un 1, por lo tanto consideramos que los dígitos de la quinta
posición son ceros y su suma es 0, adicionándole el dígito de acarreo
tendremos un resultado de 1. Por lo tanto el resultado es el siguiente:

011010 2 +
0010112
1001012
Realicemos ahora la resta del número 11010 2 con el número 10112 :

Procedimiento:
 Primero que todo agrupamos los dos números binarios uno encima del
otro de tal manera que los dígitos de la misma posición se encuentre en
la misma columna o uno sobre el otro:

11010 2 −
010112

 Agregamos de nuevo un cero a la izquierda en el segundo número


binario sólo para igualar el número de dígitos en ambos.
 Los dígitos de la posición cero son 0 y 1 respectivamente, por lo tanto
solicitamos un préstamo al dígito siguiente más significativo del primer
número binario, el resultado es 1, y una resta adicional de un 1 para la
operación de los dígitos siguientes.
 Los dígitos de la posición uno son 1 y 1 respectivamente, por lo tanto su
resultado es 0, pero como tenemos generado un préstamo de la
operación anterior, tenemos un resta de un 1 pendiente para esta
posición; como a un 0 le vamos a quitar un 1 debemos solicitar un
préstamo al siguiente dígito generando un nuevo dígito de préstamo; el
resultado es 1.
 Los dígitos de la posición dos son 0 y 0 respectivamente, por lo tanto su
resultado es 0, pero tenemos un dígito de préstamo que proviene de la
resta anterior, este dígito lo restaremos al presente resultado lo que nos
da 1, y generamos un dígito de préstamos más.
 Los dígitos de la posición tres son 1 y 1 respectivamente, por lo tanto su
resultado es 0, pero tenemos un préstamo que debemos restar en esta
operación, por lo tanto, el resultado es 1 y un nuevo dígito de préstamo.
 Los dígitos de la cuarta posición son 1 y 0 respectivamente, por lo tanto
su resultado es 1, pero tenemos un dígito de préstamo pendiente así
que el resultado es 0. Por lo tanto el resultado es el siguiente:

011010 2 −
0010112
0011112
1.2 Multiplicación y división
De similar manera a la suma y resta de números binarios, la multiplicación y
división de números binarios mantiene los mismos procedimientos que en el
sistema decimal.

1.2.1. Definición
La multiplicación binaria la definiremos de la siguiente manera:
 Si multiplicamos dos dígitos cuyos valores son 0 su resultado es 0.
 Si multiplicamos un dígito cuyo valor es 0 con un dígito cuyo valor es 1,
su resultado es 0.
 Si multiplicamos dos dígitos cuyos valores son 1 su resultado es 1.
 Si multiplicamos un número de varios dígitos con otro de varios dígitos el
proceso es similar al que realizamos con números decimales (ver
sección 1.2.2.)

La división binaria la definiremos de la siguiente manera:


 Si dividimos un dígito cuyo valor es 1 entre otro cuyo valor es 1 su
resultado es 1.
 Si dividimos un dígito 0 entre un dígito 1 su resultado es 0
 En los sistemas binarios también se considera como un valor
indeterminado la división entre 1 y 0, y entre 0 y 0.
 Cuando se dividen dos números binarios de varios dígitos se
implementa la misma metodología que cuando se divide en el sistema
digital

1.2.2 Ejercicios Prácticos


Realicemos ahora la multiplicación del número 11010 2 con el número 10112 :

Procedimiento:
 Primero que todo agrupamos los dos números binarios uno encima del
otro de tal manera que los dígitos de la misma posición se encuentre en
la misma columna o uno sobre el otro:

 Ahora de la misma manera que en el sistema digital, el dígito de la


posición cero del segundo número binario se multiplica por todo el
primer número binario:
 De igual manera el dígito de la posición uno del segundo número binario
se multiplica por todo el primer número, pero su resultado se coloca a
partir de la columna correspondiente a la posición uno:

 Ahora el dígito de la posición dos del segundo número binario se


multiplica por todo el primer número, pero su resultado se coloca a partir
de la columna correspondiente a la posición dos; se procede de similar
manera con la posición tres y cuatro, lo que nos da

 De igual manera que en el sistema decimal, procedemos a sumar


columna por columna, por lo tanto el resultado es:

Realicemos ahora la división del número 11001010 2 con el número 10112 :

Procedimiento:
 Primero que todo agrupamos los dos números binarios de la misma
manera que cuando realizamos una división en el sistema decimal:

 El divisor tiene cuatro dígitos, por lo tanto, procedemos a tomar de


izquierda a derecha cuatro dígitos del dividendo; el número que forman
estos cuatro dígitos debe ser mayor al número divisor, si no es así se
tomaría un dígito más en el dividendo. Cuando este número es mayor
que el divisor, se coloca un 1 en la zona del resultado de la división y se
procede a restar como sigue:

 Al resultado de la resta se le agrega a su derecha el siguiente dígito que


sigue a los cuatro inicialmente tomados en el dividendo; se examina si el
nuevo número que se forma es mayor al divisor, si no es el caso se
agrega el dígito siguiente, y en la zona del resultado se coloca un cero
(en este caso debemos recurrir una vez más a este procedimiento):

 Ahora que el número generado es mayor que el divisor, colocamos un 1


en la zona del resultado y restamos de nuevo el divisor a este número
obteniendo.

 Aún nos falta por bajar un dígito del dividendo, pero el número que se
forma no es mayor que el divisor, así que agregamos un cero al número
de la zona de resultado:

 De donde el resultado de la división es el número 10010 2 y el residuo de


esta división es el número 100 2

EJERCICIOS:

1. Realice las siguientes sumas binarias:


2. realice las siguientes restas binarias:

3. Realice las siguientes multiplicaciones binarias:

4. Realice las siguientes divisiones binarias:


2. CIRCUITOS DIGITALES

Los circuitos digitales son un conjunto de componentes electrónicos que


permiten manejar el voltaje que se les suministra para representar y manipular
número binarios; este proceso de representación del número binario está
relacionado con el nivel de voltaje que se encuentra ya sea a la entrada del
circuito o a la salida del mismo, de donde se precisa un nivel “alto” o “bajo”
con muy clara diferencia entre los mismos; esto es fácilmente aclarado en el
tema 2.2 y 2.3

El poder diferenciar claramente los niveles de voltaje en la salida o la entrada


del circuito nos permite nombrar estos niveles como “1” y “0”,
respectivamente. Esta asignación nos acerca más al término de sistema
binario, y nos permite comprender de alguna manera el porqué los circuitos
digitales sólo trabajan con números binarios.

Cada entrada o salida del circuito digital representa un dígito binario, por lo
tanto, estos se conocen como bit, del término inglés BInary DigiT. Por lo cual,
se acostumbra a hablar de un circuito digital de n bits de entrada o n bits de
salida. En la figura No. 1 tenemos el ejemplo de la representación de un circuito
digital de 3 bits de entrada y 5 bits de salida:

Figura No. 1
Circuito Digital de 3 bits de entrada y 5 bits de salida

2.1 Compuertas Lógicas


Un circuito digital es muy similar a un sistema, con sus entradas, sus salidas y
un proceso interno que establece la relación entre las entradas al mismo y sus
salidas. Este llamado proceso interno se puede representar por medio de
ecuaciones matemáticas, cuyas variables y números son NO REALES, por lo
tanto, no aplicamos las mismas operaciones y propiedades que conocemos,
sino que recurrimos a las definidas en el Algebra de Boole.

2.1.1 Definición
Una compuerta lógica es aquel circuito digital que tiene la capacidad de aplicar
un proceso interno a sus n bits de entrada, que cumple con alguna de las
operaciones definidas en el Álgebra de Boole, y que cuyos resultados son
manifiestos en sus bits de salida. En la figura No. 2 podemos observar las
operaciones del Algebra de Boole, sus tablas de verdad y representación
gráfica.
Figura No. 2 Propiedades del Algebra de Boole:
Tablas y representación gráfica
2.1.2 Aplicaciones de las Compuertas
Las compuertas lógicas digitales son implementadas para representar las
funciones booleanas que representan los sistemas digitales, y que permiten
realizar algún tipo de aplicación como control de un proceso industrial,
operaciones aritméticas (sumas, restas, multiplicaciones y divisiones de
números binarios), etc.

Un ejemplo de esto se representa en la figura No. 3, en donde está la función


boolena de un sistema digital y la representación del mismo empleando
compuertas lógicas (Este tema será ampliado en la sección 3.1).

Figura No. 3 Función boleana y su representación por medio de


Compuertas lógicas

2.2. Familia TTL


Como se comentó en la sección 2.1, los circuitos digitales trabajan con “1” y
“0”, los cuales representan un rango de voltaje en el bit de entrada o salida del
mismo; la característica especial de estos rangos es que el voltaje de los bits
sólo deben estar dentro de los rangos de voltaje determinados para cada
estado, de tal manera que existe una zona de voltaje entre los rangos
asignados al “1” y “0” que nunca estará presente en el comportamiento
eléctrico de los mismos. Si recordamos el componente Electrónico llamado
Transistor NPN (ver figura No. 4), este tiene tres Zonas de trabajo: La zona
activa, la de corte y la de saturación.

La zona activa funciona como un amplificador lineal de corriente y/o voltaje


dependiendo de la configuración del circuito en el cual se emplee el transistor;
las otras dos zonas funcionan de igual manera que un interruptor eléctrico, en
la zona de corte funciona como circuito abierto y en la zona de saturación
funciona como un corto circuito; esto permite configurar un circuito en el cual el
transistor puede acercarse a un voltaje cercano a cero o cercano al voltaje de
alimentación, lo que asumimos como un “0” y “1” respectivamente. Ahora,
con una adecuada configuración de varios circuitos que contengan transistores
se pueden generar comportamientos entre las entradas y salidas del circuito
que cumplan con el comportamiento de las operaciones booleanas.
Figura No. 4 Transistor NPN

2.2.1 Definición
Los circuitos digitales implementados con la lógica Transistor–Transistor son
conocidos como circuitos integrados TTL (sigla del término en inglés,
Transistor-Transistor Logic), y todo circuito integrado que contenga cualquier
tipo de compuerta lógica que se genere con este tipo de circuito lógico se
relaciona con la Familia TTL.

2.2.2 Características
 Los circuitos integrados de la Familia TTL se alimentan con 5V con una
variación aceptable de ± 0.25V y funcionan adecuadamente en
temperaturas ambientales entre los 0° a 70° C.
 La Familia TTL configura la zona de voltaje para definir el “0” entre 0V y
0.8V, y para definir el “1” entre 2.4V y 5.0V.
 La velocidad de cambio de estado lógico del bit de salida a razón del
cambio lógico de los bits de entrada alcanza en algunas versiones de la
familia hasta 250 Mhz, claro está que esto incrementa el consumo de
potencia del circuito integrado
 Cuando una de las entradas del circuito lógico no se conecta sino que se
deja al aire, el sistema lo toma como un “1”; pero es recomendable
conectar la entrada por medio de una resistencia de 1kΩ a 5V para
garantizar el estado del mismo.
 La Familia TTL tiene un limitante en cuanto al número de compuertas
que se pueden interconectar entre sí (fan out), esta característica está
impuesta por la capacidad de corriente que puede suministrar o recibir.

2.2.3 Tipos de Circuitos Integrados


La familia TTL es una de las familias de Circuitos Integrados (CI) más
utilizados, son reconocidos por la serie estándar 74 e incluyen una amplia
variedad de compuertas, flip-flops, multivibradores monoestales, registros de
corrimiento, contadores, decodificadores, memorias y circuitos aritméticos.
Dependiendo de la combinación entre velocidad de respuesta y consumo de
potencia la serie se clasifica como:
 Serie 74L, ofrece bajo consumo de potencia.
 Serie 74H, ofrece alta velocidad.
 Serie 74S, configuración Schottky.
 Serie 74LS, configuración Schottky de bajo consumo de potencia.
 Serie 74AS, configuración Schottky avanzada.
 Serie 74ALS, configuración Schottky avanzada con bajo consumo de
potencia.

La familia TTL también se clasifica dependiendo del tipo de salida con que
cuenta:
 Salida TTL con colector abierto.
 Salida TTL de tres estados.

2.3. Familia CMOS


Otro tipo de transistores aplicados en los CI son los transistores MOS (MOS, de
la sigla en inglés Metal-Oxide Semiconductor) los cuales consumen y disipan
menos energía por compuerta; este dispositivo puede modelarse como una
resistencia controlada por voltaje con tres terminales, de tal forma que opera
con una resistencia muy alta (“1”) o muy baja(“0”) (Ver figura No. 5). Este
transistor tiene dos configuraciones que son complementarias conocidas como
NMOS y PMOS, los cuales al ser implementados en un circuito forman la lógica
MOS Complementaria (CMOS), con la cual también se pueden implementar los
comportamiento de las diferentes operaciones boolenas, como por ejemplo una
compuerta inversora (Ver figura No. 6).

Figura No. 5 Transistor MOS


Figura No. 6 Circuito Inversor CMOS

2.3.1 Definición
Se denominan circuitos integrados de la Familia CMOS a aquellos en los
cuales se ha implementado la lógica booleana por medio de circuitos lógicos
CMOS.

2.3.2 Características
 Los circuitos integrados de la Familia CMOS se alimentan con valores
entre 3V y 18V (claro que las series más nuevas definen su rango de
alimentación entre 2V y 6V), y los estados lógicos “1” y “0” se definen
en los rangos Vcc-0.7Vcc y 0.3Vcc-0V, respectivamente.
 Estos integrados son especialmente susceptibles a daños por carga
electrostática, aunque las últimas generaciones de CI CMOS vienen
protegidos contra estas descargas.

2.3.3 Tipos de Circuitos Integrados


La familia CMOS en sus comienzos fue conocida como la serie 4000; aunque
tenía un bajo consumo de potencia, era bastante lenta y de muy difícil conexión
con la familia TTL. Este aspecto fue mejorado por la serie 74HC (CMOS de
alta velocidad) y la 74HCT (CMOS de alta velocidad, compatible con TTL).
Después se introdujo la serie 74AC (CMOS avanzada) y la 74ACT (CMOS
avanzada, compatible con TTL).

2.4 CIRCUITOS INTEGRADOS


El Circuito Integrado (CI) es un chip de Silicio en el cual se han fabricado una o
más compuertas lógicas (Ver figura No. 7), se caracterizan por venir en un
paquete de cerámica o plástico con contactos metálicos en su periferia que
permiten establecer conexión eléctrica para el suministro de energía y de las
señales de entrada y salida; lo que interesa conocer de un CI es su
comportamiento eléctrico y funcional. Normalmente un CI se conecta en una
tarjeta de Circuito Impreso (PCB, del término inglés Printed-Circuit Board) para
poder establecer su interconexión con otros circuitos integrados según la
funcionalidad que tenga en el sistema implementado. Nosotros lo
interconectaremos principalmente en Protoboards.

Figura No. 7 Imagen de un Circuito Integrado

INVESTIGACION:

1). En qué consiste la lógica de diodos? Dé ejemplo de circuitos que la


implementen.

2). Cómo se configura un inversor lógico por medio de un transistor NPN?.

3). Qué otros tipos de lógicas circuitales se han implementado para poder
implementar las operaciones booleanas?

4). Investigue cuáles son los circuitos integrados más comúnmente usados y
qué características poseen.
3. PRINCIPIOS DE DISEÑO DE LOGICA COMBINACIONAL

Un circuito lógico combinacional es aquel en el cual sus bits de salida


dependen solamente del estado actual de los bits de entrada. El
comportamiento de estos circuitos se analiza inicialmente por medio de un
diagrama lógico de dónde se obtiene la descripción formal de la función ya sea
por medio de una tabla de verdad o una expresión lógica.

3.1 ALGEBRA DE CONMUTACION


Basados en el trabajo del matemático George Boole y las observaciones del
investigador Claude E. Shannon se han fundamentado las técnicas formales
para el análisis de los circuitos digitales.

3.1.1 Definición
Señal lógica: Es el estado que se registra en los bits de entrada o salida de
un circuito combinacional; se han definido el estado “1” o ALTO y el estado “0”
o BAJO. En el álgebra de Boole una variable simbólica (por ejemplo X) será
quien represente la señal lógica en un bit de entrada.

Operaciones Binarias básicas

NOT: una de los axiomas principales del álgebra de Boole es que si X = 0 ,


entonces X ≠ 0 ; y por analogía si X = 1 , entonces X ≠ 0 . Ahora si definimos
la acción de negar una variable como la manera en la cual si su estado es “0”,
al negarla su estado sería “1”, o viceversa; y si definimos el universo de los
circuitos lógicos en los cuáles sólo son posibles dos estados (1 y 0),
___
entenderíamos que si X = 1 , su complemento sería X ' = X = 0 , y si X = 0 ,
___
entonces X ' = X = 1 . Esto es lo que se conoce como la operación NOT o
inversor (ver figura No. 2).

AND: Para una multiplicación lógica tenemos que si las entradas son X y Y, su
representación algebraica sería F = X ⋅ Y , en donde el punto de multiplicación
(⋅) indica una operación AND o multiplicación lógica (Ver figura No. 2) y cuyo
resultado sólo es “1” cuando todas las entradas son “1”.

OR: una suma lógica u operación OR, la cual se representa por medio de un
signo más ( F = X + Y ), tiene como salida “0” si y solamente si todas las
entradas son “0” (Ver figura No. 2).

Basados en estas tres operaciones básicas tenemos los siguientes teoremas


para una variable:
El álgebra de Boole cumple los siguientes postulados:
1. las operaciones OR y AND son conmutativas:

X +Y = Y + X X ⋅Y = Y ⋅ X (ecuación No. 3)

2. Cada operación (AND y OR) es distributiva para la otra, es decir:

X + (Y ⋅ Z ) = ( X + Y ) ⋅ ( X + Z ) (ecuación No. 4)
X ⋅ (Y + Z ) = ( X ⋅ Y ) + ( X ⋅ Z ) (ecuación No. 5)
3. las operaciones OR y AND son asociativas:

( X + Y ) + Z = X + (Y + Z ) = X + Y + Z (ecuación No. 6)
( X ⋅ Y ) ⋅ Z = X ⋅ (Y ⋅ Z ) = X ⋅ Y ⋅ Z (ecuación No. 7)

4. Para cada par de elementos se cumple que (Propiedad de absorción o


cobertura):
X + X ⋅Y = X (ecuación No. 8)
X ⋅ (X + Y) = X (ecuación No. 9)

5. La propiedad de combinación consiste en:


___
X ⋅Y + X ⋅ Y = X (ecuación No. 10)
___
(X + Y ) ⋅ (X + Y ) = X (ecuación No. 11)

6. El Teorema de Morgan consiste en:


________________ ___ ___ ___
(X + Y + Z) = X ⋅ Y ⋅ Z (ecuación No. 12)
__________ __ ___ ___ ___
X ⋅Y ⋅ Z = X + Y + Z ecuación No. 13)

7. El teorema de Shannon define el complementario de una función como


aquel en el cual cada variable se reemplaza por su complementaria y, al
mismo tiempo, se intercambian las operaciones AND y OR, es decir:
________________ ___ ___ ___
f ( X , Y , Z ,...,+,⋅) = f ( X , Y , Z ,...,⋅,+) (ecuación No. 14)

8. El teorema de Expansión consiste en:

 ___  ___
f ( X , Y , Z ,...) = [ X + f (0, Y , Z ,...)] ⋅  X + f (1, Y , Z ,...) = X ⋅ f(1, Y, Z,...) + X ⋅ f (0, Y , Z ,...)
 

(ecuación No. 15)

En donde el desarrollo o la expansión puede realizarse en función de


cualquiera de las variables presentes.
3.1.2 Ejercicios
Ahora aplicaremos los teoremas del álgebra de Boole para resolver ecuaciones
lógicas:
___
 Probemos que ( X + Y ) ⋅ Y = X ⋅ Y

Procedimiento:
1. Tomaremos el término de la izquierda del igual, y por medio de la
propiedad distributiva (Ec. No. 5) eliminaremos el paréntesis:
___
X ⋅Y + Y ⋅Y = X ⋅Y
___
2. Si observamos el segundo término del lado izquierdo del igual ( Y ⋅ Y ),
notaremos que están cumpliendo la propiedad del complemento para la
multiplicación lógica, por lo tanto el resultado de este término es “0”:

X ⋅Y + 0 = X ⋅Y

3. Ahora el lado izquierdo del igual se asemeja a la propiedad de la


identidad para la suma lógica, por lo tanto

X ⋅Y = X ⋅Y

De donde queda demostrada la igualdad

__________ ____
 Aplique el Teorema de Morgan en A ⋅ (B + C)

Procedimiento:
1. El Teorema de Morgan dice que toda variable es reemplazada por su
complemento, las operaciones AND y OR son reemplazadas por su inverso
(OR y AND) (Ver ecuaciones No. 12 y 13). Inicialmente colocaremos los
complementos de A y del término que va entre paréntesis, y la operación
inversa de la multiplicación lógica, lo cual nos da:
__________ ____ ___ _________
A ⋅ (B + C) = A + (B + C) =
2. Ahora, el término entre paréntesis está negado, cuando aplicamos la
negación los términos B y C son reemplazados por sus complementos y la
operación de la suma lógica se reemplaza por la multiplicación lógica:
__________ ____ ___ _________ ___ ___ ___
A ⋅ (B + C) = A + (B + C) = A + B ⋅ C
Por lo tanto
______________ ___ ___ ___
A ⋅ (B + C) = A + B ⋅ C
3.2 ANALISIS Y SINTESIS DE CIRCUITOS COMBINACIONALES

Para el análisis de Circuitos Combinacionales nosotros manejamos funciones


booleanas que nos representan el comportamiento de los mismos en función
del estado de sus entradas. Una función booleana sencilla es la siguiente:
___
f (X ) = X
Esta función indica que para cada valor de X la respuesta de la misma es el
complemento, como X sólo puede tomar dos valores (0 y 1), las respuestas
serán sus complementos (1 y 0).

Como en el álgebra, las funciones pueden tener varias variables,


___
f ( X ,Y ) = ( X + Y ) ⋅ Y
Para esta función en particular podemos notar que cuando
__
f (0,0) = (0 + 0 ) ⋅ 0 = (0 + 1) ⋅ 0 = 1 ⋅ 0 = 0
__
f (0,1) = (0 + 1 ) ⋅ 1 = (0 + 0) ⋅ 1 = 0 ⋅ 1 = 0
__
f (1,0) = (1 + 0 ) ⋅ 0 = (1 + 1) ⋅ 0 = 1 ⋅ 0 = 0
__
f (1,1) = (1 + 1 ) ⋅ 1 = (1 + 0) ⋅ 1 = 1 ⋅ 1 = 1

Y como habíamos probado en la sección 3.1.2, esta función es lo mismo que


tener la multiplicación lógica de X y Y, de donde la salida sólo es “1” cuando
las dos entradas son “1”, y la salida es “0” en los demás casos.

La representación básica de una función lógica es la tabla de verdad, la cual,


para la función anterior la podemos ver en la figura No. 8; como se observa, el
número de columnas de la tabla de verdad está dado por el número de
variables de la función seguido de su resultado. El número de filas de la tabla
de verdad está dado por el número máximo de diferentes posibles
combinaciones de los estados de las entradas ( 2 n , n= número de variables),
por ejemplo, si tenemos 3 variables en una función serán 8 filas en la tabla de
verdad y cuatro columnas.

Figura No. 8 Tabla de Verdad de la función


___
f ( X ,Y ) = ( X + Y ) ⋅ Y
Como se pudo observar, por medio de la función booleana se definió el
comportamiento de la tabla de verdad; de similar manera, nosotros podemos
partir de una tabla de verdad para poder deducir la función booleana, el
problema es que se pueden obtener una multitud de funciones booleanas que
tendrán el mismo comportamiento, así que nuestra misión será encontrar la
función que este lo más simplificada posible.

3.2.1 Descripción de Diseño y circuitos


A partir de una tabla de verdad se pueden obtener varias funciones booleanas
que expresan el comportamiento descrito en la tabla; todas estas funciones
serán equivalentes, y unas se podrán deducir de otras por medio de las
propiedades del álgebra de Boole.

Lo generalmente más empleado para la deducción de las expresiones


resultantes de una tabla de verdad, son las formas canónicas. Estas se
caracterizan porque en todos los términos de estas expresiones aparecen
todas las variables.

Para entender una forma canónica debemos comprender lo siguiente:

 Término producto: Es la multiplicación lógica de dos o más variables,


__ ___
ejemplos: XYZ , X Y Z , A ⋅ B ⋅ C

 Expresión de suma de productos: Es la suma lógica de términos


___ __
productos, ejemplo: X + X ⋅ Y + XY Z

 Término suma: Es la suma lógica de dos o más variables; ejemplos:


___ __
X +Y + Z , X +Y + Z+ A

 Expresión de producto de sumas: Es el producto lógico de términos


__ ___ ___ ___ ___
suma, ejemplo: X ⋅ ( X + Y ) ⋅ ( X + Y + Z ) ⋅ ( X + Y + Z + A)

 Término normal: Es un producto o término suma en el que ninguna


__
variable aparece más de una vez. Ejemplos: XYZ , X + Y , A + B + C + D

 Mintérmino: Es un término de producto normal con n variables.


___ __ ___ ___ ___
Ejemplos: X ⋅ Y ⋅ Z , X ⋅ Y ⋅ Z , X ⋅ Y ⋅ Z

 Maxtérmino: Es un término suma normal con n variables. Ejemplos:


___ ___ ___ __ __
X +Y + Z +W , X + Y + Z +W , X + Y + Z+W
Existe una relación entre la tabla de verdad y los mintérminos y maxtérminos
de una función:

 Un mintérmino puede definirse como un término producto que es “1” en


una de las filas de la tabla de verdad; como es un producto, la única
manera que logramos que sus entradas nos den como resultado un “1”
es haciendo que todas sean “1”, por lo tanto, el mintérmino tendrá las
variables que sean “0” complementadas (Ver figura No. 9)

 Un maxtérmino puede definirse como un término suma que es


exactamente “0” en una de las filas de la tabla de verdad; de similar
manera al mintérmino, el resultado del máxtermino debe ser un “0”, así
que todas las variables que sean “1” serán complementadas (ver figura
No. 9)

Figura No. 9 Ejemplo de Mintérminos y Maxtérminos


para dos variables

Ahora si estamos capacitados para entender cómo las formas canónicas son
empleadas para deducir expresiones lógicas que describen un circuito lógico a
partir de la tabla de verdad correspondiente. La primera forma canónica es la
Suma Canónica de la función lógica, la cual es la suma de los mintérminos
correspondientes a las filas de la tabla de verdad en las cuales los resultados
sean un “1”, como ejemplo, la suma canónica de la tabla de verdad de la figura
No. 8 es
F = XY

La suma canónica se compone de un solo término porque solamente una fila


tiene como resultado un “1”, ahora si aplicamos toda la tabla de verdad en esta
expresión notaremos que la cumple (esto se propone como ejercicio al
estudiante)

La segunda forma canónica es el Producto Canónico de la función lógica, y


consiste en el producto de los maxtérminos correspondientes a las
combinaciones de las entradas para las cuales la salida es un “0”. Por
ejemplo, el producto canónico de la tabla en la figura No. 8 es

___ ___
F = ( X + Y )( X + Y )( X + Y )
De similar manera, se propone al estudiante representar toda la tabla de
verdad en la expresión resultante para confirmar que cumple con las
condiciones de la tabla.

Ahora el punto que debe preocuparnos es si las dos expresiones resultantes


son realmente equivalentes? Para confirmarlo deduciremos de la expresión de
productos de maxtérminos la expresión de suma de mintérminos, así que
nuestra expresión inicial es la siguiente:

___ ___
F = ( X + Y )( X + Y )( X + Y )

Procedimiento:
1. Hemos dicho que las operaciones OR y AND son asociativas (Ver Ecuación.
No. 7), por lo tanto, agruparemos los dos primeros maxtérminos como sigue:
___ ___
F = [( X + Y )( X + Y )]( X + Y )

2. La ecuación No. 5 nos dice que la operación OR es distributiva, así que


asumiremos que el primer maxtérmino es una sola variable y el producto del
mismo por el segundo maxtérmino será distribuido de la siguiente manera
___ ___
F = [( X + Y ) X + ( X + Y ) Y )]( X + Y )

3. Con la expresión resultante redistribuiremos el producto de cada variable por


el maxtérmino que lo multiplica:
___ ___ ___
F = [ XX + YX + X Y + Y Y ]( X + Y )

4. Ahora aplicando el teorema de Idempotencia y complemento obtenemos


___ ___
F = [ X + YX + X Y + 0]( X + Y )
___ ___
F = [ X + YX + X Y ]( X + Y )

5. Simplificando el primer término de la multiplicación tendremos:


___ ___
F = [ X (1 + Y + Y )]( X + Y )

6. Ahora, una variable que es sumada con un “1” y con su complemento nos
da la misma variable, por lo cual
___
F = [ XY ]( X + Y )
___
F = XY ( X + Y )

7. Aplicando la ley distributiva tenemos


___
F = XY X + XYY
8. Aplicando la ley conmutativa
___
F = YX X + XYY

9. y por el teorema del complemento para la multiplicación

F = Y ⋅ 0 + XYY = 0 + XYY = XYY

10.y por el teorema de Idempotencia aplicado a la variable Y

F = XY

Por lo cual obtenemos la misma expresión resultante para la suma canónica de


la tabla en la figura No. 8

Ya tenemos unas herramientas básicas para generar expresiones lógicas de


una tabla de verdad, pero de dónde se genera la tabla de verdad? Por regla
general, la tabla de verdad se deduce de una descripción verbal de un
problema descrito por alguien o por nosotros mismos. Esta descripción puede
ser un listado de combinaciones de varias entradas para las cuales debe estar
activo o desactivo un bit en especial (salida del sistema).

3.2.2 minimización de Circuitos Combinacionales


Cuando obtenemos una expresión lógica que describe una situación especial o
un comportamiento requerido en un circuito, el paso siguiente sería el
implementarlo en un circuito electrónico, pero en la mayoría de los casos, la
implementación directa de una suma o multiplicación canónica no es la más
fiable económicamente hablando pues el número de mintérminos y
maxtérminos crece exponencialmente con el número de variables.

Esta es una de las causas por las cuáles la minimización es una de las mejores
herramientas para optimizar el circuito lógico diseñado, de tal manera, que la
expresión final sea la de menor número y tamaño de compuertas electrónicas
necesarias para construirla. Los medios que tenemos para optimizar una
expresión booleana son:

 Utilizando Propiedades y Teoremas del álgebra de Boole.


 Utilizando el método de los mapas de Karnaugh

3.2.3 Teorema de Morgan


Normalmente las formas canónicas no son las expresiones más simplificadas,
pero el procedimiento para hacer la simplificación no tiene un método analítico,
hay que basarse en la experiencia y el conocimiento de las propiedades del
álgebra de Boole. Un ejemplo de simplificación de expresiones lógicas fue
realizado en la sección 3.2.1. A continuación veremos otro ejemplo:
Ejercicio resuelto:
Minimizar la siguiente expresión:
___ ___
F = X Z + XY + X Y Z

Procedimiento:
1). Podemos aplicar la ley asociativa de la suma lógica para los dos últimos
términos así
___ ___
F = X Z + ( XY + X Y Z )

2) Aplicando el procedimiento inverso para la ley distributiva de la multiplicación


lógica con respecto a la suma tendremos
___ ___
F = X Z + X (Y + Y Z )

___
3). Para el término (Y + Y Z ) aplicamos la ley distributiva según la Ecuación
___
No. 4, de tal forma que obtenemos (Y + Y ) ⋅ (Y + Z ) , y como para la suma de
complementos se cumple que es igual a “1” tendríamos (1) ⋅ (Y + Z ) = (Y + Z ) ,
así que reemplazando en la expresión:
___
F = X Z + X (Y + Z )

4). Aplicando la ley distributiva y conmutativa tendremos:


___ ___ ___
F = X Z + X (Y + Z ) = X Z + XY + XZ = X Z + XZ + XY

5). Agrupando los dos primeros términos tendremos


___ ___
F = X Z + XZ + XY = ( X + X ) Z + XY

6). De donde por la propiedad de la suma de complementos


___
F = ( X + X ) Z + XY = (1) Z + XY = Z + XY
F = Z + XY

De donde podemos observar que de requerir inicialmente una compuerta OR


de tres entradas, dos compuertas AND de dos entradas, una compuerta AND
de tres entradas y dos compuertas inversoras; al realizar la minimización
llegamos a necesitar solamente una OR de dos entradas y una AND de dos
entradas. Por lo tanto en la mayoría de casos el proceso de minimización
reduce notablemente la cantidad de componentes electrónicos requeridos en el
montaje de un Circuito Digital (Ver figura No. 10). Queda como tarea para el
estudiante el construir las tablas de verdad de las dos expresiones y comprobar
que se comportan igual.
Figura No. 10 Acción de Minimización:
Circuito de una expresión lógica original y Minimizada

3.2.4 Mapas de Karnaugh


Un mapa de Karnaugh es una representación gráfica de la tabla de verdad de
una expresión lógica. Básicamente es una tabla de cuadros de 2 i filas por
2 j columnas, en donde i + j = n , siendo n el número de variables, además se
cumple que 2 n = 2 i * 2 j , es decir, la tabla tendrá tantos cuadros como posibles
combinaciones de las variables de entrada (Ver figura No. 11). Como el mapa
de Karnaugh es otra forma de representar la tabla de verdad, debemos asignar
un número i de variables para designar las filas y un número de j variables para
designar las columnas, se acostumbra colocar las primeras i variables de la
tabla de verdad a las filas y las j variables restantes a las columnas (ver figura
No. 12).

Figura No. 11 Ejemplo de un mapa de Karnaugh


para una expresión de 4 variables

Las expresiones 2 i y 2 j indican el número de posibles combinaciones que se


pueden realizar con las i y las j variables respectivamente, es por eso que las
filas y las columnas son el mismo número de combinaciones posibles de cada
grupo de variables asignadas a cada lado del mapa de Karnaugh; pero el truco
es no colocar las posibles combinaciones en el mismo orden en que se
generarían como si estuviésemos contando en binario (00, 01, 10, 11); las
posibles combinaciones de las variables asignadas en las filas y columnas,
deben de una a la siguiente combinación variar uno sólo de sus dígitos es
decir:

00, 01, 11, 10

Podemos ver la aplicación de este concepto en la figura No. 13. Tenga en


cuenta que el primer dígito de cada término (sea en la fila o la columna)
corresponde a la primera variable asignada para la fila o la columna; de
manera similar se hace con los demás dígitos, es decir, el segundo dígito va
con la segunda variable, el tercer dígito con la tercera variable, etc.

Figura No. 12 Ubicación de las variables en un mapa de Karnaugh


para una expresión de 4 variables

Lo que nos falta es relacionar cada línea de la tabla de verdad con cada cuadro
del Mapa de Karnaugh. Para hacerlo, lo que hacemos es analizar cada una de
las intersecciones entre las filas y las columnas, por ejemplo, la fila dos y la
columna tres en la Figura No. 13 es la intersección entre el término 01 y el
término 11, lo que nos indica que debe ser el término de la expresión
correspondiente a F(X,Y,Z,W) = F(0,1,1,1); de similar manera, la intersección
entre la fila tres y la columna cuatro es el término de la expresión
correspondiente a F(X,Y,Z,W) = F(1,1,1,0). En otras palabras cada cuadro del
mapa de Karnaugh tiene un mintérmino correspondiente en la tabla de verdad;
y en cada cuadro se colocará el resultado esperado para cada uno de ellos. Es
importante tener en cuenta que existen columnas y filas adyacentes en el mapa
de Karnaugh en las cuales una de las variables es “1” y no varía, esto lo
podemos observar en la figura No. 14.
Figura No. 13 Mapa de Karnaugh para una expresión de 4 variables

Figura No. 14 Mapa de Karnaugh para:


a) Dos variables b). Tres variables c). Cuatro variables

Ahora llevemos a la práctica lo hasta el momento aprendido. Realicemos el


mapa de Karnaugh de la siguiente tabla de verdad y halle la expresión mínima:

Procedimiento:
1. Identificamos que es una tabla de verdad con tres variables, por lo tanto,
necesitaremos un mapa con dos filas y cuatro columnas como la
observada en el Item b) de la figura No. 14.
2. Cada uno de los mintérminos de la tabla de verdad será relacionada con
cada uno de los cuadros del mapa de Karnaugh, por lo cual, en cada
cuadro relacionado colocaremos los resultados esperados según la tabla
de verdad:

3. Ya tenemos el mapa de Karnaugh, pero requeremos minimizar la


expresión que se representa de la tabla de verdad, por lo tanto, la
minimizaremos por medio de la suma de productos (mintérminos):
___ ___ ___ ___ ___ ___
F ( A, B, C ) = A B C + A B C + A BC + A B C + ABC

De donde, aplicando la ley conmutativa para la suma y la operación


___
contraria a la idempotencia para la suma en el término A BC tendremos
___ ___ ___ ___ ___ ___ ___
F ( A, B, C ) = A B C + A BC + A B C + A BC + A B C + ABC

Ahora la ley asociativa


___ ___ ___ ___ ___ ___ ___
F ( A, B, C ) = ( A B C + A BC ) + ( A B C + A BC ) + ( A B C + ABC )

Y por la ley distributiva podemos hacer lo siguiente


___ ___ ___ ___ ___
F ( A, B, C ) = A ( B C + BC ) + A B ( C + C ) + A( B C + BC )
Y luego
___ ___ ___ ___ ___
F ( A, B, C ) = A C ( B + B ) + A B( C + C ) + AC ( B + B)

De donde por el teorema de complemento obtenemos


___ ___
F ( A, B, C ) = A C (1) + A B (1) + AC (1)

Y con el teorema de Identidad


___ ___
F ( A, B, C ) = A C + A B + AC

Por la ley conmutativa


___ ___
F ( A, B, C ) = A C + AC + A B

Y aplicando de nuevo la ley asociativa y distributiva


___ ___
F ( A, B, C ) = ( A C + AC ) + A B
___ ___
F ( A, B, C ) = C ( A + A) + A B

Y por el teorema del complemento y la identidad


___
F ( A, B, C ) = C (1) + A B
___
F ( A, B, C ) = C + A B
De donde obtenemos la mínima expresión lógica para la tabla de verdad
dada

4. Ahora podemos confrontar el resultado anterior con el resultado que


obtengamos con el mapa de Karnaugh, para ello tendremos en cuenta
las siguientes normas:
a. Sólo tendremos en cuenta los unos que identificamos en los
cuadros del mapa de Karnaugh

b. Realizaremos grupos de estos unos de tal manera que formemos


grupos con número de elementos potencias de dos y que sean
líneas horizontales, ó líneas verticales, ó que formen rectángulos,
ejemplos
c. Seleccionamos el grupo o los grupos que mejor relacionen los
unos del mapa de Karnaugh, ejemplo

d. Para cada uno de los grupos seleccionados determinamos qué


variables sólo participan con uno sólo de sus estados (1 ó 0) y los
seleccionamos con la misma representación como lo hacemos
para los mintérminos, ejemplo

e. Ahora, como la representación inicial de las variables en el mapa


de Karnaugh era con mintérminos, y como los mintérminos son
empleados para la minimización por la forma canónima de suma
de productos, estos dos resultados serán nuestra respuesta, la
cual es la misma que nos dió en el punto 3
___
F ( A, B, C ) = C + A B

EJERCICIOS:

1). Investigue en qué consiste la convención de lógica positiva y lógica


negativa?

2) Realice las siguientes operaciones

1+ 0 = 1+1 = 1⋅ 0 = 1 ⋅1 =

X +0= Y +1 = X ⋅0 = X+X =

___ ___
Z ⋅Z = X+X = X⋅X = X + X ⋅Y = 0

Y (Y + X ) = X + XY + Y =

3). Aplique el Teorema de Morgan:


__________ ______
____________
a). XY + CD⋅ Z =

__________ _________
b). ( XY + ZW ) ⋅ V =

4). Obtenga las tablas de verdad de las siguientes expresiones:

___ ___ ___ ___ ___


F = X ⋅Y + X ⋅ Y ⋅ Z F = X ⋅ Y + X ⋅Y
___ __ __ __
F = X ⋅Y + X ⋅Y F = XY Z + X Y Z + X YZ

5) Obtenga las suma y el producto canónico, el mapa de Karnaugh y la


minimización de las expresiones de las siguientes tablas:
6) realice la minimización de las siguientes expresiones lógicas empleando los
dos métodos de minimización y el mapa de Karnaugh:

___ ___ ___ ___


a. F = A C D + B CD + A C D + BCD
__ ___
b. F = WX Z + W X YZ + XZ
___ ___ ___ ___ ___
c. F = ( X + Y ) ⋅ (W + X + Y ) ⋅ (W + X + Z )
___ ___ ___ ___ __ ___
d. AB C D + A B C + ABD + A CD + BC D

7). Investigue cómo se trabajan los mapas de Karnaugh para cinco o más
variables.

8). Determine la expresión mínima de los siguientes mapas de Karnaugh


4. PRINCIPALES CIRCUITOS INTEGRADOS

Una de las principales aplicaciones de las compuertas lógicas en los circuitos


digitales es como convertidores de códigos. Los códigos más usados son los
binarios, BCD (8421), Octal, hexadecimal y el decimal. Como sabemos hasta
ahora los circuitos digitales trabajan con “1” y “0”, pero las personas en la
mayoría de los casos, no son capaces de manipular largas cadenas de “1” y
“0”, por lo cual es necesario convertir la numeración binaria a la decimal o
viceversa.

4.1 Decodificadores BCD a Decimal y BCD a Siete Segmentos


El código BCD (de las siglas en inglés Binary Coded Decimal) se conoce como
Decimal Codificado Binario, el cual codifica los dígitos 0 a 9 por sus
representaciones binarias sin signo de 4 bits, del 0000 2 al 10012 . Los términos
del 1010 2 al 11112 no son empleados.

El Código Siete Segmentos hace relación a los Display de Siete Segmentos,


los cuales son segmentos formados por diodos emisores de luz, que son
empleados para representar visualmente los números decimales y
hexadecimales (Ver figura No. 15); cada uno de los segmentos que forman
parte de un display tiene un carácter asociado (ver figura No. 16), de tal
manera que cuando por ejemplo deseamos representar el número 2, debemos
iluminar los segmentos a, b, g, c y d.

Figura No. 15 Display Siete Segmentos

Figura No. 16 Asignación de letras a cada Segmento de un Display


4.1.1 Definición
Codificador BCD a Decimal: Es aquel circuito lógico combinacional con cuatro
entradas (las cuales se restringen a los códigos BCD) y diez salidas, las cuales
representan cada uno de los diez dígitos decimales (0, 1, 2, 3, 4, 5, 6, 7, 8 y 9).

Codificador BCD a Siete Segmentos: Es aquel circuito lógico combinacional


con cuatro entradas (las cuales se restringen a los códigos BCD) y siete
salidas, las cuales serán conectadas a un display siete segmentos para
representar los correspondientes dígitos del código BCD de la entrada.

4.1.2 Circuito Básico de Funcionamiento


Codificador BCD a Decimal: La tabla de verdad relacionada con el
comportamiento del codificador BCD a Decimal es la siguiente:

En la tabla se puede apreciar que el código BCD es el valor correspondiente a


cada dígito en decimal con su valor en binario, por lo cual, cada posición
binaria de la entrada ha sido asignada con las letras A, B, C y D, siendo esta
asignación en orden ascendente a su correspondiente valor numérico. Ahora,
se entiende que el sistema tiene diez salidas, las cuales corresponden a cada
uno de los dígitos decimales según el correspondiente código binario en la
entrada, y cada una de ellas se activará (estado en “1”) solamente cuando su
respectivo código binario esté en la entrada del sistema. Por lo tanto, para
analizar el esquema lógico a emplear, se puede pensar en la tabla como el
resultado de condensar diez tablas con las mismas entradas, pero con cada
una de las salidas correspondientes a cada uno de los dígitos decimales.
Podemos analizar cada una de las tablas por medio de mintérminos, de dónde
sólo analizaremos los correspondientes a las salidas en “1”, de tal forma que
tendremos las siguientes diez expresiones lógicas:

___ ___ ___ ___


F ( D, C , B, A) = D C B A (Para el dígito cero)
___ ___ ___
F ( D, C , B, A) = D C B A (Para el dígito uno)
___ ___ ___
F ( D, C , B, A) = D C B A (Para el dígito dos)
___ ___
F ( D, C , B, A) = D C B A (Para el dígito tres)
___ ___ ___
F ( D, C , B, A) = D C B A (Para el dígito cuatro)
___ ___
F ( D, C , B, A) = D C B A (Para el dígito cinco)
___ ___
F ( D, C , B, A) = D C B A (Para el dígito seis)
___
F ( D, C , B, A) = D C B A (Para el dígito siete)
___ ___ ___
F ( D, C , B, A) = D C B A (Para el dígito ocho)
___ ___
F ( D, C , B, A) = D C B A (Para el dígito nueve)

De donde podemos obtener el diagrama lógico de la Figura No. 17.

Codificador BCD a Siete Segmentos: La tabla de verdad relacionada con un


codificador BCD a Siete Segmentos es la siguiente, teniendo en cuenta que el
segmento se iluminará cuando el estado de salida correspondiente sea “1”:
Figura No. 17 Circuito lógico para el conversor BCD a Decimal

En la tabla anterior, usted podrá notar que para los valores binarios del 1010 2 al
11112 el sistema tiene unas salidas activadas (segmentos), esas salidas a qué
información en conjunto corresponde?. Como ejercicio práctico, encuentre la
mínima expresión lógica para cada una de las salidas (segmentos) y realice el
circuito lógico correspondiente al conversor BCD – Siete Segmentos.

En la figura No. 18 podemos observar el circuito lógico empleado en el CI


MC14511B, conversor BCD – Siete Segmentos, junto a la tabla de verdad y a
la distribución de pines (cortesía de On semiconductor, www.onsemi.com)
Figura No. 18 Circuito lógico y Tabla de Verdad del CI MC14511B
Conversor BCD – Siete Segmentos
4.2 codificadores
Los códigos son cadenas de n bits en las cuales la manera como se combinen
sus estados pueden llegar a representar números o adquirir otros significados,
ya tenemos el caso del código BCD, en el cual, por medio de 4 bits se
representan los dígitos decimales.

4.2.1 Definición
Un codificador es aquel circuito lógico que hace la conversión de un código a
otro código; algunos de estos códigos son el GRAY; el código de Caracteres;
los códigos para acciones, condiciones y estados (empleado en la
comunicación del teclado con el PC); los códigos para detectar y corregir
errores; códigos Bidimensionales; códigos para la transmisión y el
almacenamiento de Datos en Serie (NRZI, BPRZ, AMI; etc.)

4.2.2 Circuito Básico de Funcionamiento


Otra forma de expresar dígitos decimales en binario es por medio del código
2421, el cual tiene la siguiente tabla de relación que a la vez puede ser la tabla
de verdad:

De donde podemos deducir las siguientes expresiones lógicas (los números


presentes en las expresiones son las variables de las entradas):

2 F (0,1,2,3,4,5,6,7,8,9) = 5 + 6 + 7 + 8 + 9
4 F (0,1,2,3,4,5,6,7,8,9) = 4 + 6 + 7 + 8 + 9
2 F (0,1,2,3,4,5,6,7,8,9) = 2 + 3 + 5 + 8 + 9
1 F (0,1,2,3,4,5,6,7,8,9) = 1 + 3 + 5 + 7 + 9

Y cuyo circuito lógico es el indicado en la Figura No. 19.


Figura No. 19 circuito Lógico del conversor Decimal – 2421

4.3 Multiplexores
En muchas situaciones de la vida nos hemos visto obligados a hacer fila y
esperar nuestro turno, en algunos de esos casos, son varias las filas que
esperan a que un solo funcionario sea el que les atienda, y en esos casos, el
funcionario decide a cual de las filas empieza a atender. Una situación similar
se presenta en los dispositivos electrónicos, por ejemplo un bus de transmisión
de Datos, al que muchos dispositivos desean acceder pero deben esperar su
turno para hacerlo.

4.3.1 Definición
Un multiplexor es un conmutador digital; es el encargado de encauzar datos de
una fuente entre n fuentes posibles, a una sola salida.

4.3.2 Circuito Básico de Funcionamiento


Realicemos un multiplexor de 4 entradas y una salida, en donde además se
requiere indicarle al circuito cuál de las entradas se desea obtener en la salida,
por lo tanto se requiere dos entradas adicionales para direccionar los datos
deseados; a continuación podemos observar la tabla de verdad de este circuito.
Por primera vez incorporamos en la tabla una “X” dentro de los estados lógicos,
esta “X” indica que el estado de la variable que la tenga no interesa para el
análisis en la respectiva salida:
En la tabla anterior, hemos empleado la designación de las entradas como D0,
D1, D2 y D3 haciendo referencia al término Datos; Las direcciones se han
designado como A1 y A0 haciendo alusión al término de dirección en inglés
(Address); y la Salida se ha denominado O en relación al término de salida en
inglés (out). Por lo cual se puede deducir la siguiente expresión lógica:
___ ___ ___ ___
F ( D3, D 2, D1, D0, A1, A0) = D0 A0 A1+ D1 A0 A1+ D 2 A0 A1+ D3 A0 A1

De dónde el circuito lógico correspondiente se puede analizar en la Figura No.


20.

Figura No. 20 Circuito lógico de un multiplexor de cuatro entradas y una salida


4.4 compuertas OR Exclusivas y Circuitos de Paridad
Una compuerta OR exclusiva (XOR) es aquella compuerta de dos entradas
cuya salida es “1” sólo cuando una sola de sus entradas es “1”, es decir,
cuando sus entradas son diferentes.

4.4.1 Definición
La operación XOR algunas veces se reconoce por el símbolo “ ⊕ ” y se define
como
___ ___
X ⊕Y = X Y + X Y

Una de las mayores aplicaciones de la operación XOR es la conformar un


circuito de Paridad. Un circuito de Paridad se puede definir como aquel circuito
lógico que indica si una secuencia o conjunto de bits tiene un número par o
impar de “1”, por lo cual, existen circuitos lógicos de paridad par y circuitos
lógicos de paridad impar.
Un ejemplo de paridad puede tomarse del número 1010 2 , en donde existen
sólo dos “1”, por lo tanto el número tiene paridad par.

4.4.2 Circuito Básico de Funcionamiento


En la Figura No. 21 se puede observar la compuerta representativa de la
operación XOR y el circuito lógico.

Figura No. 21 Compuerta representativa, Tabla de verdad y circuito lógico


de la operación XOR

En la figura No. 22 se puede observar el circuito lógico de un Circuito de


Paridad impar para cuatro entradas

Figura No. 22 Circuito de Paridad impar de cuatro entradas


4.5 comparadores
Es muy común que en un computador o en sistemas de Interconexión de
dispositivos o periféricos se requiera la comparación de dos palabras binarias,
ya sea para poder acceder a una dirección, ya sea para comparar la clave de
acceso, etc.
Algo que es importante definir es el concepto de Byte. Un byte es un conjunto
de 8 bits, que en algunos casos representan números binarios, caracteres,
códigos, etc. Y al conjunto de uno o más Bytes se les conoce como palabra
binaria, en donde se adquiere la idea que esta palabra ya no representa
exclusivamente un número binario.

4.5.1 Definición
Un Comparador es un circuito lógico que compara dos palabras binarias
indicando si son iguales o no.

4.5.2 Circuito Básico de Funcionamiento


Ya conocemos el funcionamiento de la operación XOR, y hemos notado que
cuando las entradas son iguales, la salida de esta operación es un “0” y en
caso contrario es “1”; Ahora si empleamos una compuerta XOR para la
comparación de cada uno de los bits de entrada de las palabras que se desean
comparar, y las salidas de cada una de esas comparaciones se lleva a una
compuerta OR, obtendremos un comparador básico, en donde un “1” nos
indica que son diferentes y un “0” nos indica que son iguales. En la figura No.
23 podemos observar el circuito lógico de un comparador de dos palabras de 4
bits cada una.

Figura No. 23 Circuito de Paridad Impar


de cuatro entradas
4.6 Sumadores
Una de las mayores aplicaciones de los circuitos electrónicos es el desarrollo
de operaciones matemáticas, pero nosotros desarrollamos nuestras
operaciones en el sistema decimal, así que tenemos que codificar la
numeración decimal a binaria, realizar las operaciones en binario y después
volver a codificar los números a decimales para su visualización. Una de las
operaciones más utilizadas en los circuitos electrónicos es la suma y es la base
para el desarrollo de algunas otras operaciones.

4.6.1 Definición
Un sumador es el circuito encargado de realizar la operación de la suma
aritmética a dos números binarios.

4.6.2 Circuito Básico de Funcionamiento


De acuerdo al procedimiento visto en el primer capítulo para sumar números
binarios, comenzaremos con un circuito que permita sumar dos bits, por lo
tanto, el resultado de la suma de estos dos bits debe darnos el resultado
correspondiente a la posición original de los dos bits, y un resultado
relacionado con el acarreo necesario para la suma de los bits de la siguiente
posición, según lo anterior, podemos plantear la siguiente tabla de verdad

Para la columna del resultado, claramente se nota la operación XOR, y para la


columna de acarreo la operación AND. Para el caso en el cual, se realice la
suma de los bits de la posición uno en adelante, la tabla de verdad requiere de
otra entrada, la cual está relacionada con el acarreo proveniente de la suma
anterior, por lo tanto, la tabla de verdad se modifica de la siguiente manera:
Para la salida del Resultado, el circuito a emplear lo podemos entender como
un circuito de paridad impar para tres bits; para la salida de acarreo podemos
tomarlo como el circuito lógico de la siguiente expresión

AcarreoSalida ( A, B 0, B1) = A( B 0 + B1) + B1.B 0

Donde las variables A, B0 y B1 son el Acarreo de Entrada, el bit0 y el bit1


respectivamente. En la figura No. 24 podemos observar los circuitos para
sumar los bits de la posición cero y para sumar los bits de la posición uno en
adelante.

Figura No. 24. Circuitos sumadores:


a). Circuito sumador de dos bits
b). circuito sumador de dos bits con acarreo de entrada
4.7 Restadores

4.7.1 Definición
El circuito de Resta es aquel que realiza la operación de sustraer entre dos
valores binarios.

4.7.2 Circuito Básico de Funcionamiento


Para analizar el circuito de resta, tendremos en cuenta como entradas el bit B0
(Minuendo), el bit B1 (Sustraendo) y el bit P (Indicando el Préstamo entrante de
anteriores restas); las salidas del circuito son el bit D (la diferencia resultante) y
el bit Psal (Indica el Préstamo saliente para una próxima resta); De estas
entradas y salidas, las expresiones lógicas que las relaciona son:

D = B 0 ⊕ B1 ⊕ P
___ ___
Psal = B0 B1 + B0 P + B1.P

En la figura No. 25 podemos observar el circuito lógico correspondiente a las


expresiones lógicas del circuito restador.

Figura No. 25 Circuito Lógico de un Restador Completo


4.8 ALU
El término ALU viene de las siglas de la frase en inglés “Arithmetic and Logical
Unit” que significa unidad Aritmética y lógica; esta unidad hace parte de
Microprocesares y Microcontroladores, y es la encargada de realizar las
operaciones matemáticas.

4.8.1 Definición
La unidad Aritmética y Lógica (ALU) es un circuito combinacional especializado
en el desarrollo de operaciones aritméticas y lógicas diferentes a dos valores
binarios dados; la selección del tipo de operación requerido se realiza por
medio de las entradas destinadas para este fin. Por lo tanto, este tipo de
circuito tiene las entradas para los dos valores binarios y entradas adicionales
para especificar el tipo de operación a realizar.

4.8.2 Circuito Básico de Funcionamiento


Uno de los circuitos integrados con funciones de ALU es el 74LS181, el cual es
una ALU de 4 bits que puede desarrollar 16 posibles operaciones sobre dos
números de 4 bits. En la figura No. 26 se puede observar la distribución de
pines, el circuito lógico y la tabla de verdad de este CI.

4.9 Multiplicadores Combinacionales


Cuando estuvimos manejando la multiplicación binaria, observamos que en
realidad es un proceso de corrimientos y sumas que emulan la forma como
nosotros multiplicamos con papel y lápiz en el sistema decimal. Pero estos
corrimientos y sumas no indican un comportamiento secuencial o que dependa
del tiempo, es posible expresar la acción de la multiplicación por medio de una
tabla de verdad.

4.9.1 Definición
Un multiplicador combinacional es un circuito lógico con una tabla de verdad
que expresa el producto de dos palabras de entrada de n bits como una función
combinacional.

4.9.2 Circuito Básico de Funcionamiento


Realicemos el circuito que realiza la multiplicación de dos palabras de 2 bits, en
donde la primera palabra será designada por la letra a ( a1a0 ) y la segunda con
la letra b ( b1b0 ), y como resultado de esta multiplicación tendremos una palabra
de 4 bits, designada por la letra c ( c3c2c1c0 ). De tal manera que la operación de
la multiplicación al hacerla en el papel sería:
Figura No. 26 CI 74LS181
De donde podemos obtener las siguientes expresiones lógicas:

c0 = a0b0
c1 = a0b1 ⊕ a1b1
c 2 = a1b1 ⊕ (( a 0 b1 )( a1b0 ))
c3 = (a1b1 )(a0b1 )(a1b0 )

Por lo tanto, podemos observar en la figura No. 27 el circuito correspondiente a


un multiplicador combinaciones de dos palabras de 2 bits.

Figura No. 27 circuito lógico de un Multiplicador Combinacional


de dos palabras de 2 bits

Ejercicios:
1). Diseñe un decodificador de 3 a 8 para decodificar un código Gray.

2). Investigue sobre el Circuito Integrado 74LS139, analice el correspondiente


diagrama lógico.

3). Investigue sobre el CI 74LS49 y el CI 74LS47, descargue del Internet las


hoja de Datos de estos componentes y compárelos (un posible sitio es
www.ti.com)

4) Investigue sobre el CI 74LS148, qué hace y cómo funciona?


5. DISPOSITIVOS LOGICOS PROGRAMABLES

Un Dispositivo Lógico Programable (PLD del término Programmable Logic


Device) es un circuito integrado que le permite al diseñador adecuarlo según
las necesidades específicas para las que se requiere. El diseño del PLD
permite a su usuario final programarlo para realizar la función requerida en el
diseño final en donde se empleará.

5.1 Memoria ROM


El término ROM viene de la sigla de Read-Only Memory que significa memoria
de sólo lectura, por lo tanto, una memoria ROM sólo permite leer su contenido,
y este contenido está relacionado con la tabla de verdad que relacione cada
una de sus posiciones de memoria y su valor respectivo; esto nos permite
deducir que la memoria ROM es un circuito combinacional que almacena por
medio de una función lógica cierta información.

Es de aclarar que este tipo de memoria es una memoria no volátil, pues su


contenido se preserva aunque no esté conectada la energía eléctrica. Otro
punto importante con este tipo de memorias es que su contenido es definido
desde su fabricación o cuando se programa pues el usuario final no tiene
posibilidad de variar su contenido.

5.1.1 Definición
Una memoria ROM es un circuito combinacional con n entradas y b salidas, en
donde las entradas se conocen como entradas de Dirección y tradicionalmente
por el término en inglés Address cada una de ellas se les llama A0 , A1 , …,
An−1 ; las salidas se conocen como Salidas de Datos y a cada una de ellas se
les llama D0 , D1 , …, Db −1 .

5.1.2 Circuito Básico de Funcionamiento


Para la memoria ROM podemos hablar de una estructura básica y no de su
circuito básico, pues dependiendo de su contenido, este se puede representar
como un circuito lógico o por medio de una función lógica; en la figura No. 28
podemos observar la estructura básica de una ROM de n entradas y b salidas
( 2 n xb ).

5.1.3 Aplicaciones
Como se había comentado antes, una memoria ROM puede almacenar la
relación establecida en una tabla de verdad y por lo tanto, con un solo CI se
puede reemplazar el número necesario de compuertas discretas para construir
el circuito lógico que represente esa tabla de verdad. Por lo tanto, se puede
construir una memoria ROM para almacenar cualquier tabla de verdad que
satisfaga la cantidad de entradas y salidas requeridas para la misma.
Figura No. 28 Estructura básica de una ROM de 2 n xb

Un ejemplo muy claro es construir con una memoria ROM de 256 x 8 un


multiplicador binario de 4 bits x 4 bits, lo que nos representaría usar una
memoria ROM de 8 entradas (4 entradas para el multiplicando y 4 para el
multiplicador) y 8 salidas (el producto de dos números binarios de 4 bits nos da
un número de máximo 8 bits), este ejemplo se puede ver en la figura No. 29, la
tabla lógica a almacenar en la memoria ROM sería la correspondiente a la
multiplicación de todos los posibles términos de los dos números binarios de 4
bits.

Figura No. 29 configuración de la memoria ROM 256 x 8


Para realizar una multiplicación binaria de 4 x 4

5.2 PLD Combinacional


A diferencia de la memoria ROM, algunos dispositivos se pueden programar
después de la fabricación del mismo ó permite varias programaciones, un
ejemplo de estos dispositivos son los PLD Combinacionales.

5.2.1 Definición
Un PLD combinacional es cualquier dispositivo lógico cuya función es
especificada por el usuario final después de ser fabricado el dispositivo. Otro
nombre con el cual se conoce este tipo de dispositivo es PLA (de las siglas de
Programmable Logic Array) , también conocido como un arreglo lógico
programable.
5.2.2 Circuito Básico de Funcionamiento
Un ejemplo de un Arreglo Lógico Programable puede ser como el de la figura
No. 30, en donde se tiene un dispositivo AND-OR de dos niveles combinacional
que puede programarse de tal forma que se pueda aplicar una expresión lógica
de suma de mintérminos; el procedimiento de la programación consiste en
dañar los fusibles que se colocan antes de la compuerta AND, de tal manera
que quedan funcionando sólo los que estén relacionados con los mintérminos
seleccionados.

Figura No. 30 Ejemplo de dispositivo PLA tal como sale de fábrica

Un ejemplo real de un PLA es el componente de Signetics 82S100 el cual tiene


16 entradas, 48 compuertas AND y ochos salidas. De donde podemos concluir
que tiene 1536 fusibles para el arreglo AND y 384 fusibles para el arreglo OR

5.2.3 Aplicaciones
En algunos casos, los PLAs o PLDs se emplean como memorias ROM; como
se había planteado, una memoria ROM se puede representar con una tabla de
verdad en donde las entradas identifican la dirección de memoria y las salidas
indicarían el valor almacenado en esa posición de memoria, ahora, si esta tabla
de verdad la representamos con varias expresiones de suma de mintérminos y
estas expresiones se programan en un PLA, podemos obtener una memoria
ROM implementada con este tipo de dispositivos.

Con este tipo de CI es fácil realizar la implementación de grandes circuitos


lógicos, con mayor complejidad, empleándose un menor número de CI y por lo
tanto, un menor espacio empleado.
5.3 Memoria RAM
El término RAM viene de las siglas en inglés de Random Access Memory, lo
cual significa Memoria de Acceso Aleatorio. Una memoria RAM no es conocida
como un dispositivo lógico programable, pero es igual de estructurado. Cuando
se habla de Memorias, se tiene en cuenta el término volátil; cuando se dice que
una memoria es volátil se entiende que cuando el dispositivo se apaga (se deja
de suministrarle energía) toda la información contenida en ella se pierde.

5.3.1 Definición
Una memoria RAM es un dispositivo semiconductor que puede ser leído o
escrito por una unidad central de procesamiento u otros dispositivos, y es
empleado para el almacenamiento de datos.

5.3.2 Circuito Básico de Funcionamiento


Un circuito integrado de memoria RAM es el CI 74F189, el cual es una
memoria RAM de 64 bits de lectura/escritura, en la figura No. 31 se observa el
símbolo lógico con el que se representa la memoria 74F189.

Figura No. 31 Símbolo lógico del CI 74F189

5.3.3 Aplicaciones
La memoria RAM es una memoria volátil ampliamente usada en computadores
para mantener información de datos y programas temporalmente.

Investigación:

1). Investigue qué tipos de ROM comerciales existen.


2). Qué otro tipo de entradas requieren las memorias ROM para su
funcionamiento?

3). Qué tipos de memoria RAM existen?


BIBLIOGRAFIA

WAKERLY , John F. (1992). Diseño Digital: Principios y Prácticas. USA:


Prentice-Hall Hispanoamericana.

TOKHEIM, Roger L. (1994). Schaum's outlines of theory and problems of


digital principles. Tercera Edición, McGraw-Hill.

LU, Mi (2004). Arithmetic and logic in computer systems. John Wiley and Sons,
Inc Publication.

Zbar, Paul. Malvino Albert, Miller Michael (2001) Prácticas de Electrónica,


séptima edición. Alfaomega

Universidad Nacional de Colombia (2003). "Electrónica Digital I". En:


http://www.virtual.unal.edu.co/cursos/ingenieria/2000477/index.html
SEGUNDA UNIDAD DIDÁCTICA

LENGUAJE VHDL

CAPÍTULO 1. INTRODUCCION AL LENGUAJE VHDL

El lenguaje VHDL es un lenguaje descriptor de Hardware o, en otras palabras,


es un lenguaje para la descripción de sistemas electrónicos digitales y de esta
descripción el sistema o circuito real puede ser implementado

El lenguaje VHDL se soporta en el lenguaje de descripción de Hardware


VHSIC; en donde la abreviación VHSIC viene del término inglés Very High
Speed Integrated Circuits (Circuitos integrados de muy alta velocidad). Esta
versión inicial fue iniciativa del Departamento de Defensa de los Estados
Unidos en la década del 80. Actualmente, la IEEE (Institute of Electrical and
Electronics Engineers) tiene el Estándar de este lenguaje como el IEEE 1076, y
un estándar posterior, el IEEE 1164.

El lenguaje VHDL es un estándar, por lo cual, el lenguaje es independiente de


la tecnología o el fabricante que lo emplee en sus dispositivos, y esto lo hace
portátil y reutilizable. Este lenguaje es principalmente utilizado en el campo de
los dispositivos lógicos programables y en Circuitos Integrados de aplicación
Específica (ASIC, del término en inglés Application Specific Integrated Circuits).

El lenguaje VHDL es un lenguaje de programación como tal, pues incluye tipos


de Datos, Paquetes, Instrucciones secuenciales, Procedimientos, Funciones,
Estructuras de control y archivos de entrada y salida; además, este lenguaje
contiene estructuras para definir y simular eventos, sincronización y
concurrencia. A la vez, facilita la documentación de instrucciones según la
arquitectura, estados de máquina, estructuras y jerarquías de diseño de
hardware. Pero existen diferencias entre el diseño de un paquete de software
y el diseño de un sistema electrónico las cuales son:

 Un sistema electrónico es un sistema en paralelo. Todos los circuitos en


un sistema electrónico siempre están funcionando. En cambio, en un
sistema de software se tiene la noción de flujo del programa, en donde
secuencias de instrucciones son ejecutadas por lazos o por estructuras
condicionales.
 Un paquete de software casi siempre está enfocado al diseño del
comportamiento del sistema. En un sistema electrónico, no solamente el
comportamiento del sistema se tiene en cuenta, también se analiza la
estructura del sistema, la forma como se distribuyen las funciones, el
tipo de tecnología a emplear, la sincronización del sistema, etc.
 En el diseño de sistemas electrónicos, la posibilidad de probar el sistema
en su aplicación final es muy limitada, a diferencia de los sistemas de
software que por medio de múltiples recopilaciones del diseño se puede
optimizar el producto final. Por ejemplo, en el caso del diseño de un
circuito integrado complejo, en el cual, sólo existe una oportunidad de
enviarlo a la fábrica de circuitos integrados y obtener una versión del
mismo en una pastilla, es muy importante tener las herramientas de
soporte que permitan en el diseño una detallada simulación y evaluación
del mismo, que garanticen que el diseño enviado a fabricar es el óptimo.

1.1 DESCRIPCIÓN DE LA ESTRUCTURA

Un sistema electrónico se representa como un módulo con entradas y salidas,


en donde el comportamiento de las salidas está representado por una
expresión lógica dependiente del estado de las entradas. En la figura No. 32
se observa la representación estructural de un sistema digital de dos entradas
(X, Y) y una salida (F); en términos del lenguaje VHDL todo el sistema es
conocido como una entidad (ENTITY = es el símbolo o nombre que
representará al sistema) y las entradas y salidas se conocen como puertos
(ports)

Figura No. 32 Representación estructural de un sistema digital


De dos entradas y una salida

Como la salida del sistema está representada por una expresión lógica, esta
expresión lógica nos indica la manera como se compone el sistema en
pequeñas partes o sub-módulos. Cada uno de estos sub-módulos son
conocidos como instancias o casos (instance), y los puertos de estas
instancias son interconectados por señales (signals). Como ejemplo, podemos
observar en la figura No. 33 las instancias que conformarían la representación
estructural de la figura No. 32. Téngase en cuenta que cada una de las
instancias A, B y C pueden estar compuestas a su vez por otro tipo de
instancias.

3.2 DESCRIPCIÓN DEL COMPORTAMIENTO

La expresión lógica que permite determinar el comportamiento de un sistema


digital es conocida como descripción del comportamiento o descripción
funcional (functional or behavioural description). Esta descripción del
comportamiento lógico del sistema es el código apropiado en lenguaje VHDL
que lo describe, y es ubicado en la sección de arquitectura (architecture).
Algunas de estas descripciones del comportamiento lógico están ubicadas en
la sección de la librería (library), la cual es una colección de las partes de
código más comúnmente usadas, las cuales se pueden usar en diferentes
diseños. El código empleado para una librería es usualmente escrito en forma
de funciones (functions), procedimientos (procedures) o componentes
(components), y todo lo anterior es ubicado dentro de paquetes.

Figura No. 33 Ejemplo de una representación estructural


de un sistema digital por medio de instancias

3.2 DESCRIPCIÓN DEL PROCESO DE DISEÑO

Es costumbre seguir los siguientes pasos para el diseño de un sistema


electrónico:

 Realizar una descripción del comportamiento del sistema a diseñar.


 Realizar una simulación del comportamiento del sistema deseado.
 Realizar una descripción estructural del sistema en diseño.
 Implementar el diseño realizado en el tipo de tecnología seleccionada.

Para el caso de diseñar sistemas electrónicos con el lenguaje VHDL, los pasos
anteriores se realizan en paralelo, es decir, la descripción del comportamiento,
la descripción estructural y la simulación se realizan a la par, lo que nos permite
obtener al final un listado de interconexiones que al ser implementada se
obtiene un CI con las características deseadas.

Las secciones básicas de un código VHDL se pueden observar en la figura No.


34 en donde se puede observar la sección de librería, entidad y arquitectura.
Para declarar el uso de una librería en el código VHDL es necesario ubicar al
principio las siguientes dos líneas de comando:

LYBRARY nombre_de_la_librería;
USE nombre_de_la_librería.nombre_del_paquete.partes_del_paquete;

En la primera línea se indica el nombre de la librería a emplear, en la segunda


línea se especifica cual de los paquetes de la librería se manejará y en detalle
cada una de las partes del mismo. Casi siempre los paquetes que más se
emplean son:
 ieee.std_logic_1164 el cual pertenece a la librería ieee y especifica un
sistema lógico multinivel.
 entro d de la librería std, especifica recursos como tipos de datos,
textos de entrada y salida, etc.
 work de la librería work, es donde se almacenan los diseños realizados.

Figura No. 34 Secciones básicas de un código VHDL

Para la sección de la entidad es necesario el siguiente código básico:

ENTITY nombre_de_la_entidad IS
PORT (
Nombre_del_puerto : modo_de_funcionamiento tipo_de_señal;
Nombre_del_puerto : modo_de_funcionamiento tipo_de_señal;
. . . . . );
END nombre_de_la_entidad;

Como se había comentado, una entidad es un sistema lógico que contiene


entradas y salidas denominadas puertos, cada uno de estos puertos tienen un
nombre asignado por el programador, y dependiendo de su función en el
sistema, cada uno de los puertos tiene un modo de funcionamiento (mode) el
cual indica si es una entrada (IN), una salida (OUT), una entrada-salida
(INOUT) o una interfaz (BUFFER). Cuando hablamos de interfaz, nos
referimos a que este puerto será una salida que tendrá una influencia dentro
del comportamiento del mismo sistema (realimentación).

Para cada puerto, se tiene la posibilidad de indicar qué tipo de señal manejará,
es decir, si será un bit (BIT), un estado lógico (STD_LOGIC), un entero
(INTEGER), etc.

En cuanto al nombre de la entidad, se puede cualquiera siempre y cuando no


sea una de las palabras reservadas por el código VHDL (consultar el estándar
1164 de la IEEE).

Tomemos como ejemplo el código que describe una compuerta OR, cuyas
entradas se llaman A y B, y su salida C:
ENTITY compuerta_OR IS
PORT(A, B : IN BIT;
C : OUT BIT);
END compuerta_OR ;

Para la sección de la arquitectura se tiene en cuenta el siguiente código:

ARCHITECTURE nombre_de_la_arquitectura OF nombre_de_la_entidad IS


(declaraciones)
BEGIN
(código)
END nombre_de_la_arquitectura;

En el mismo caso que del nombre de la entidad, puede ser cualquier nombre
de la arquitectura excepto las palabras reservadas por el lenguaje VHDL. En la
parte de las declaraciones, la cual es opcional, se realiza una declaración de
las señales y constantes presentes en el sistema. En la parte del código se
incorpora la descripción del comportamiento lógico del sistema. Continuemos
con el ejemplo de la compuerta OR, en cuyo caso el código correspondiente en
la sección de arquitectura sería:

ARCHITECTURE comp_OR OF compuerta_OR IS


BEGIN
C <= A OR B;
END comp_OR;

1.4 DESCRIPCIÓN DEL LEXICO A EMPLEAR

En el lenguaje VHDL se tienen identificados los siguientes ítems:

1.4.1 Comentarios
Los comentarios en el lenguaje VHDL comienzan con dos guiones seguidos (--)
y representa como comentario toda la escritura que sigue a los guiones hasta
el final del renglón correspondiente. Los comentarios los puede emplear el
programador como instrumento de explicación o aclaración con relación a
alguna parte del programa desarrollado.

1.4.2 identificadores
Los identificadores son las palabras reservadas por el lenguaje y los nombres
definidos por el programador (variables, señales, rutinas, etc). Estos
identificadores se deben establecer de la siguiente manera:

Identifier ::= letras ( letras_o_digitos)

En los identificadores definidos por el programador no existen diferencias entre


las letra minúsculas y mayúsculas, por lo cual, es lo mismo el término Numero
a numero. Los identificadores no pueden contener caracteres especiales (ver
más adelante) ni empezar por un número o subrayado.
1.4.3 Números
Los números literales se pueden expresar en cualquier base numérica; si el
número tiene un punto se entiende que se está representando un número real,
en caso contrario se está representando un número entero. Los números
literales decimales se definen como:

Literal_decimal ::= integer [ . entero] [ exponente ]


Entero ::= digit ( [ underline ] digito )
Exponente ::= E [ + ] entero E – entero

Ejemplos:
0 1 123_456_789 852E6 --enteros literales
0.0 0.5 2.756_45 12.4E-9 --reales literales

Cuando se representan números literales de bases numéricas diferentes a la


decimal, se representan de la siguiente manera:

Literal_base ::= base # entero_base [ . entero_base ] # [ exponente ]


Base ::= entero
Entero_base ::= digito_extendido ( [underline ] digito_extendido )
Digito_extendido ::= digito letra

En estos casos, la base y el exponente se representan en el sistema decimal;


el exponente indica la potencia por la cual el número literal es multiplicado.
Para el caso del sistema hexadecimal, las letras de A hasta la F son
empleados para representar los dígitos del 10 al 15, por lo cual estos dígitos se
pueden representar en minúscula o mayúscula.

Ejemplos:
2#1100_0100# 16#C4# 4#301#E1 -- el número entero 196
2#1.1111_1111_111#E+11 16#F.FF#E2 -- el número real 4095.0

1.4.4 Caracteres
En algunos casos, se necesitará tener el código ASCII de algunos caracteres
como el valor de una variable, para tal caso, al asignar el valor del carácter es
necesario colocarlo entre comillas sencillas, ejemplos:

‘A’ ‘2’ ‘5’ ‘‘ ‘,’

Además, existen símbolos o caracteres especiales representados por un solo


caracter ( + - / * ( ) . , : ; & ‘ > < = ι # ) o por dos caracteres ( ** =>
:= /= >= <= <> -- )
1.4.5. Cadena de caracteres
Una cadena de caracteres es un conjunto de caracteres asignados a una
variable, en la mayoría de los casos es una oración, un nombre, etc. Las
cadenas de caracteres se forman colocándolos entre comillas dobles.
Ejemplos:
“sistemas digitales básicos”
“una cadena de caracteres “especial””

1.4.6. Cadena de Bits


En el lenguaje VHDL se permite la manera de especificar arreglos de cadenas
tipo bit, es decir, cuyo contenido está relacionado con “1” y “0”. La manera de
especificar este tipo de cadenas es:

Cadena_de_bits ::= base_especifier “ bit_value “


Base_especifier ::= B O X
Bit_value ::= dígito_extendido ( [ undeline ] digito_extendido )

Para especificar la base numérica se tiene en cuenta que la B indica binario, la


O indica octal y la X indica hexadecimal. Ejemplos:

B”110110101”
O”134” --el número equivalente sería B”001_011_100”
X”65” --el número equivalente sería B”0110_0101”

1.4.7 Operadores
El lenguaje VHDL tiene pre-establecido las siguientes clases de operadores:

 Operadores de Asignación:
Son usados para asignar valores a las señales, variables y constantes.
Ellos son:

o <= asigna un valor a una señal


o := asigna un valor a una variable, constante o genéricos.
Establece también valores iniciales.
o => asigna valores a elementos individuales de un vector.
Ejemplos:
SIGNAL A : STD_LOGIC;
VARIABLE B : STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL C : STD_LOGIC_VECTOR (0 TO 7);
-- entonces las siguientes asignaciones son correctas:
A <= ‘1’; --se asigna el valor ‘1’ a la señal A usando “<=”
B := “0000”; --se asigna el valor “0000” a la variable B usando “:=”
C <= “10000000” --el bit menos significativo es “1” y el resto es “0”
C <= ( 0 => ‘1’, OTHERS => ‘0’); -- el bit menos significativo es “1” y el
--resto es “0”
 Operadores de Concatenación:
Son usados para concatenar matrices de tal forma que la dimensión de
la matriz resultante es la suma de las dimensiones de las matrices
originales, ejemplo:
Raiz<=x&y --Esta operación construye una matriz Raiz colocando a la
matriz x en las primeras posiciones y a la matriz y en las últimas

 Operadores lógicos:
Son usados para ejecutar operaciones lógicas, pero los objetos deben
ser de tipo BIT, STD_LOGIC, o STD_ULOGIC; los operadores lógicos
son:
o NOT
o AND
o NAND
o OR
o NOR
o XOR
o XNOR
 Operadores aritméticos:
Son usados para realizar operaciones aritméticas; los datos deben ser
de tipo INTEGER, SIGNED, UNSIGNED y REAL. Los operadores son:

 + suma
 - resta
 * multiplicación
 / división
 ** exponenciación
 MOD módulo
 REM Residuo
 ABS valor absoluto
 ** Exponencial

 Operadores de comparación o relacionales


Son usados hacer comparaciones entre datos dando como respuesta un
valor de tipo booleano (TRUE o FALSE); los operadores de comparación
son:

o = igual a
o /= no es igual a
o < menor que
o > mayor que
o <= menor o igual que
o >= mayor o igual que

 Operadores de desplazamiento
Son usados para realizar desplazamientos de datos. Los operadores de
desplazamiento son:
 SLL desplazamiento lógico a la izquierda –las posiciones
a la derecha del dato son reemplazadas por ‘0’
 SRL desplazamiento lógico a la derecha –las posiciones a
la izquierda del dato son reemplazadas por ‘0’
 SLA desplazamiento aritmético a la izquierda --conserva
el signo, es decir mantiene el valor del bit más significativo
 SRA desplazamiento aritmético a la derecha --conserva
el signo del bit más significativo.
 ROL rotación a la izquierda
 ROR rotación a la derecha

1.4.8 Instrucción IF
La instrucción IF permite seleccionar la ejecución de un código en dependencia
de una o más condiciones. Las líneas de códigos para esta instrucción son:

IF condición THEN
Secuencia_de_instrucción --si cumple la condición se realiza la instrucción
ELSIF condición THEN
Secuencias_de_instrucción
ELSE
Secuencia_de_instrucción --en el caso que no se cumpla, se realiza esta
END IF;

1.4.9 Instrucción CASE


La instrucción CASE realiza o ejecuta un código si el valor de una expresión se
encuentra dentro de las condiciones planteadas. La línea de código para esta
instrucción es:

CASE expresión_condicional IS
Instrucción_alternativa_en_caso_de cumplirse_la_condición
END CASE;

Instrucción_alternativa_en_caso_de cumplirse_la_condición ::=


WHEN selección =>
Secuencia_de_instrucciones

Selección ::= choice


Choice ::=
Expresión_simple

La selección de la expresión debe resultar o en un objeto tipo discreto o un


arreglo unidimensional de caracteres. Cuando la alternativa planteada es
seleccionada de una lista de selecciones, se ejecuta una instrucción destinada
por esa selección, por lo cual, todas las posibles selecciones deben ser
distintas.

1.4.10 Instrucción LOOP


La instrucción LOOP permite ejecutar una instrucción una cantidad de veces.
Las líneas de código para esta instrucción son:

Nombre_del_LOOP :
WHILE condición LOOP
Secuencia_de_instrucciones
END LOOP nombre_del_loop ;
1.4.11 Instrucción NULL
La instrucción NULL no tiene ningún efecto sobre el programa, indica que en
ciertos casos no se realiza nada, es muy empleada como instrucción en
algunas selecciones de la instrucción CASE.

1.4.12 Instrucción ASSERTION


Esta instrucción indica la afirmación de una expresión, en muchos casos se
emplea para verificar la no violación de una condición y en tal caso reportarlo.
Las líneas de código empleadas para esta instrucción son:

ASSERT condición
REPORT expresión
SEVERITY expresión ;

1.4.13. Palabras reservadas


Las palabras reservadas son aquellas que tienen un significado especial para
el lenguaje VHDL. Son instrucciones, elementos y órdenes que se utilizan para
definir sentencias.

Las palabras reservadas para el VHDL’87 son:

ABS ACCESS AFTER ALIAS


ALL AND ARCHITECTURE ARRAY
ASSERT ATRIBUTE BEGIN BLOCK
BODY BUFFER CASE COMPONENT
CONFIGURATION CONSTANT DISCONNECT DOWNTO
ELSE ELSIF END ENTITY
EXIT FILE FOR FUNCTION
GENERATE GENERIC GUARDED IF
IN INOUT IS LABEL
LIBRARY LINKAGE LOOP MAP
MOD NAND NEW NEXT
NOR NOT NULL OF
ON OPEN OR OTHERS
OUT PACKAGE PORT PROCEDURE
PROCESS RANGE RECORD REGISTER
REM REPORT RETURN SELECT
SEVERITY SIGNAL SUBTYPE THEN
TO TRANSPORT TYPE UNITS
UNTILL USE VARIABLE WAIT
WHEN WHILE WITH XOR

Las palabras que complementan la lista anterior en el VHDL’93 son:

GROUP IMPURE INERTIAL LITERAL


POSTPONED PURE REJECT ROL
ROR SHARED SLA SLL
SRA SRL UNAFFECTED XNOR
CAPÍTULO 2.
PRINCIPIOS DEL LENGUAJE VHDL

2.1 DISEÑO JERARQUICO

Como se ha descrito hasta el momento, un sistema electrónico se puede


representar en el lenguaje VHDL por medio de lo que se ha denominado
entidades, y a la vez, se ha descrito que cada una de esas entidades puede ser
compuesta por múltiples sub-entidades. Estas múltiples sub-entidades son las
que conforman bloques internos que permiten estructurar el comportamiento de
la entidad por secciones o sectores. Esta subdivisión de la entidad en
pequeños bloques internos es lo que permite el diseño jerárquico, es decir,
determinar que elemento del sistema prevalece sobre los demás, en este caso,
la jerarquía se basa en la conformación de los diferentes bloques y su
interrelación.

Como se observó en los ejemplos del capítulo anterior, en las secciones del
código relacionado con la entidad y la arquitectura del mismo, es donde se
establecen los diferentes bloques e interrelaciones de los mismos; se
establecen la funcionalidad de los puertos y sus modos de trabajo (IN, OUT,
etc.)

2.2 OBJETOS

Los objetos en el lenguaje de programación hacen referencia a las entidades o


elementos que contienen un valor determinado de ciertas propiedades (tipos –
types) y que permiten el almacenamiento del mismo o su transferencia a otras
entidades. Existen cuatro tipos de objetos en el lenguaje VHDL:

 Constante (constant)
 Señal (signal)
 Variable (variable)
 Archivo (file)

Cada uno de estos objetos debe declararse dentro del código VHDL ya sea
como una declaración (en la sección de arquitectura), como parte de un lazo de
control o decisión, como el parámetro de un sub-programa, o como puerto de
entrada o salida de un bloque.

2.2.1 Constante
Es un objeto cuyo valor asignado no cambia, es estático. Para declarar una
constante se siguen las siguientes líneas de comando:

CONSTANT nombre_de_la_constante : tipo_de_constante := valor_asignado;

Ejemplo:
CONSTANT cambio : INTEGER := 4;

En donde se declara una constante llamada cambio cuyo valor será el entero 4.
2.2.2 Variable
Es un objeto de cualquier tipo que es comúnmente usado como una memoria
temporal, y cuyo valor es fácilmente cambiado o alterado según los
requerimientos del código empleado. Para declarar una variable se sigue la
siguiente línea de comando:

VARIABLE nombre_de_la_variable : tipo_de_variable ;

2.2.3 Señal
Se llama señal a la interconexión existente entre los puertos presentes en el
sistema electrónico que se diseña, por lo cual, una señal represente el cable
que se usaría para la interconexión o el nivel de voltaje presente en el mismo.
También permite establecer un control temporizado e indicar retardos. Las
señales son comúnmente declaradas en la sección de arquitectura, pero su
comportamiento está relacionado con el modo declarado para el puerto que se
relacione con la señal, es decir:

 si el puerto es declarado como entrada, la señal correspondiente se


puede leer pero no se puede modificar.
 Si el puerto es declarado como salida, la señal correspondiente se
puede modificar pero no se puede leer.
 Si el puerto es declarado entrada-salida, la señal correspondiente se
puede modificar y leer.
 Si el puerto es declarado como interfaz, la señal correspondiente se
puede leer y sólo la puede modificar la fuente correspondiente.

Para declarar una señal se sigue la siguiente línea de comando:

SIGNAL nombre_de_la_señal : tipo_de_señal <= valor_asignado ;

2.3 TIPOS Y SUBTIPOS


El tipo y subtipo de un objeto permite indicar las restricciones sobre los valores
que pueden asumir, así como la manera como se pueden manipular. Dentro de
los tipos y subtipos de datos u objetos permitidos por el lenguaje VHDL
tenemos:

2.3.1 Tipos de Datos pre-definidos


Existen en los estándares IEEE 1076 e IEEE 1164 una serie de tipos de datos
predefinidos, los cuales especifican el rango de valores que puede asumir el
objeto, estos rangos están almacenados en el paquete STANDARD que está
dentro de la librería STD. Estos rangos de valores representan restricciones
que en el código VHDL se conocen como CONSTRAINT; Existen cuatro clases
de tipos de objetos:

 Escalar (scalar)
 Compuesto (composite)
 De acceso o de entrada (access)
 De archivo (file)
2.3.1.1 Tipo Escalar
Existen cuatro tipos de objetos escalares:

 Escalar de enumeración (enumeration)


o Es un arreglo de identificadores o caracteres que ya tiene un valor
numérico asignado, como por ejemplo:
 TYPE BOOLEAN IS (FALSE, TRUE);
 TYPE BIT IS (‘0’, ‘1’);
 TYPE CHARACTER IS (NUL, SOH, …, ‘A’, ‘B’, …, DEL);

 Escalar entero (integer)


o Son tipos numéricos, es decir, el objeto puede asumir un valor
numérico dentro de un rango (RANGE) permitido, ejemplo:
 TYPE INTEGER IS RANGE -65536 TO 65536 ;

 Escalar físico (physical)


o Son usados en simulaciones para representar medidas de
algunas cantidades como tiempo o distancia.

 Escalar de punto flotante o real (floating point)


o Estos tipos de objetos permiten el uso de números reales.

2.3.1.2 Tipo Compuesto


Un objeto tipo compuesto es un conjunto de objetos de tipo escalares y
compuestos, los cuales pueden ser organizados como:

 Arreglo o colección (array)


o Un objeto de tipo arreglo es un conjunto de números escalares o
de objetos compuestos, los cuales todos son del mismo tipo;
existen dos tipos de arreglos:
 Cadena de caracteres (string)
• Es un arreglo en el cual, todos los elementos
presentes son del tipo carácter.
 Vector de Bits (bit_vector)
• Es un ejemplo de un arreglo unidimensional en
donde se especifica el nombre, el rango y el tipo de
elementos presentes.

 Relación o registro (record)


o Un objeto de tipo relación es un conjunto de objetos de todo tipo.

2.3.1.3 Tipo de Acceso


Este tipo de objeto es usado para declarar objetos que acceden de forma
dinámica a variables, es decir, continuamente están revisando o consultando
los valores de ciertas variables, y para ello requieren tener un direccionamiento
de las mismas que les permita acceder fácilmente a ellas. Este tipo de Acceso
puede direccionarse solamente a Objetos escalares, Objetos de Arreglo (array),
y objetos de relación (record)
2.3.1.4 Tipo de Archivo
Este tipo de objetos representan objetos almacenados en el ambiente de
desarrollo en el cual se está programando

2.3.1.5 Subtipos
Un subtipo es un tipo con una limitación al rango de valores original; la
preferencia de generar un subtipo y no un nuevo tipo de objeto se deriva de la
facilidad con la cual el subtipo hereda todas las cualidades del tipo original,
claro está con las limitaciones impuestas en la nueva definición. Ejemplo de
definición de subtipos:

SUBTYPE corto IS INTEGER RANGE 1 TO 10;


SUBTYPE largo IS INTEGER RANGE 1 TO 20;
SIGNAL X : corto;
SIGNAL Y : largo;

2.4 ORGANIZACIÓN DE DISEÑO


Como se había comentado, en un código VHDL se distinguen fácilmente tres
secciones diferentes: la de la librería, la de la entidad y la de la arquitectura;
cada una de estas secciones tiene un código general para ser declaradas:

 Entidad:
ENTITY identificador IS

GENERIC Listado_general_componentes
PORT Listado_general_de_puertos
BEGIN
Instrucciones_entidad
END identificador ;

 Arquitectura:

ARCHITECTURE identificador OF nombre_de_la_entidad IS


Declaración_del_Subprograma
Declaración_de_tipos
Declaración_de_subtipos
Declaración_de_constantes

Declaración_de_señales ::=
SIGNAL lista_de_identificadores : subtipos clase_de_señal :=
expresión ;

Declaración_de_componentes ::=
COMPONENT identificador
Descripción_del_componente
END identificador;

Configuración_y_uso
BEGIN
Instrucciones
END identificador ;
GENERIC define y declara propiedades o constantes del módulo que están
siendo declaradas en la Entidad.
PORT Define las entradas y salidas del módulo que se está definiendo.

2.5 Manejo de Flujo de Datos


Para poder establecer ciertas sentencias que permitan hacer asignaciones por
medio de condicionales, debemos tener claro el funcionamiento de cada uno de
ellos:

2.5.1 WHEN … ELSE


Para emplear este condicional se debe seguir la estructura siguiente:

Señal<=valor WHEN condición ELSE

Se pueden colocar varios condicionales anidados, ejemplo:

S<=’1’ WHEN a=b ELSE


‘0’ WHEN a>b ELSE
‘2’;

2.5.2 WITH ... SELECT … WHEN


Esto se emplea cuando se desea hacer una asignación de valor que dependa
del resultado de una expresión determinada. La estructura condicional de este
condicional es la siguiente:

WITH expresión SELECT


Señal <= forma_de_onda WHEN caso;

Un ejemplo de la aplicación del mismo sería:

WITH status SELECT


Luces_semáforo <= “ROJO” WHEN “00”,
“VERDE” WHEN “01”,
“AMARILLO” WHEN “10”,
“NO_FUNCIONA” WHEN “11”;

2.5.3 BLOCK
La funcionalidad de este condicional es la de crear subdivisiones de
condicionales de ejecución dentro de una misma entidad. La estructura básica
de este condicional es:

nombre_del_bloque:
BLOCK Expresión IS
Declaraciones_opcionales
BEGIN
Sentencias_condicionales
END BLOCK nombre_del_bloque;
CAPITULO 3

DISEÑO LOGICO COMBINACIONAL CON VHDL

3.1 MULTIPLEXORES 4 A 1
Recordemos la tabla lógica del multiplexor 4 a 1 vista anteriormente:

El código ejemplo para este multiplexor sería:

-----------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
-----------------------------------------------------------------------------
ENTITY multiplexor_4_a_1 IS
PORT ( D3, D2, D1, D0 : IN BIT;
direccion : IN STD_LOGIC_VECTOR ( 1 DOWNTO 0) ;
Salida : OUT BIT );
END multiplexor_4_a_1 ;
-----------------------------------------------------------------------------
ARCHITECTURE ejemplo OF multiplexor_4_a_1 IS
BEGIN
PROCESS ( D3, D2, D1, D0, direccion, salida)
BEGIN
IF ( direccion = “00” ) THEN
Salida <= D0;
ELSIF ( direccion = “01”) THEN
Salida <= D1;
ELSE (direccion = “10”) THEN
Salida <= D2;
ELSE
Salida <= D3;
END IF;
END PROCESS ;
END ejemplo ;

En el ejemplo anterior, se indican la entradas D3, D2, D1 y D0 como bits, la


dirección como un vector de 2 bits, y la salida como un bit; en la declaración de
la arquitectura de este ejemplo se emplea la instrucción IF para seleccionar la
salida en el multiplexor dependiente del estado de la dirección. Este mismo
multiplexor se puede implementar en código VHDL empleando operaciones
lógicas de la siguiente manera:

-----------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
-----------------------------------------------------------------------------
ENTITY multiplexor_4_a_1 IS
PORT ( D3, D2, D1, D0, A1, A0: IN STD_LOGIC;
Salida : OUT STD_LOGIC );
END multiplexor_4_a_1 ;
-----------------------------------------------------------------------------
ARCHITECTURE ejemplo_lógico OF multiplexor_4_a_1 IS
BEGIN
Salida <= (D0 AND NOT A1 AND NOT A0) OR
(D1 AND NOT A1 AND A0) OR
(D2 AND A1 AND NOT A0) OR
(D3 AND A1 AND A0);
END ejemplo_lógico ;

También se puede implementar por medio de la instrucción WHEN:

-----------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
-----------------------------------------------------------------------------
ENTITY multiplexor_4_a_1 IS
PORT ( D3, D2, D1, D0: IN STD_LOGIC;
Dirección: IN STD_LOGIC_VECTOR (1 DOWNTO 0);
Salida : OUT STD_LOGIC );
END multiplexor_4_a_1 ;
-----------------------------------------------------------------------------
ARCHITECTURE ejemplo_when OF multiplexor_4_a_1 IS
BEGIN
Salida <= D0 WHEN dirección=”00” ELSE
D1 WHEN dirección=”01” ELSE
D2 WHEN dirección=”10” ELSE
D3;
END ejemplo_when ;

O por medio de la instrucción SELECT:

-----------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
-----------------------------------------------------------------------------
ENTITY multiplexor_4_a_1 IS
PORT ( D3, D2, D1, D0: IN STD_LOGIC;
Dirección: IN STD_LOGIC_VECTOR (1 DOWNTO 0);
Salida : OUT STD_LOGIC );
END multiplexor_4_a_1 ;
-----------------------------------------------------------------------------

ARCHITECTURE ejemplo_select OF multiplexor_4_a_1 IS


BEGIN
WITH direccion SELECT
Salida <= D0 WHEN ”00” , --noten el uso de un “,” en lugar de la “;”
D1 WHEN ”01” ,
D2 WHEN ”10” ,
D3 WHEN OTHERS; --noten que no se puede emplear “D3
--WHEN “11”” por lo cual se emplea el
--término OTHERS que indica
--“las demás posibles opciones”
END ejemplo_when ;

3.2 CONVERTIDORES BCD A SIETE SEGMENTOS


Recordemos la tabla de verdad del conversor BCD a siete segmentos:

El código ejemplo para este tipo de conversor sería:

-----------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
-----------------------------------------------------------------------------
ENTITY siete_segmentos IS
PORT ( entrada : IN BIT_VECTOR ( 3 DOWNTO 0) ;
Salida : OUT BIT_VECTOR (6 DOWNTO 0) );
END siete_segmentos ;
-----------------------------------------------------------------------------
ARCHITECTURE siete_segmentos OF siete_segmentos IS
BEGIN
PROCESS (entrada)
BEGIN
CASE entrada IS
WHEN “0000” => salida <= “1111110”;
WHEN “0001” => salida <= “0110000”;
WHEN “0010” => salida <= “1101100”;
WHEN “0011” => salida <= “1111001”;
WHEN “0100” => salida <= “0110011”;
WHEN “0101” => salida <= “1011011”;
WHEN “0110” => salida <= “0011111”;
WHEN “0111” => salida <= “1110000”;
WHEN “1000” => salida <= “1111111”;
WHEN “1001” => salida <= “1110011”;
WHEN “1010” => salida <= “1110111”;
WHEN “1011” => salida <= “0011111”;
WHEN “1100” => salida <= “1001110”;
WHEN “1101” => salida <= “0111101”;
WHEN “1110” => salida <= “1001111”;
WHEN “1111” => salida <= “1000111”;
END CASE;
END PROCESS;
END siete_segmentos;
-----------------------------------------------------------------------------

Ejercicios:

1. Realice la descripción de la Entidad en lenguaje VHDL del circuito


siguiente:
2. CAPÍTULO 4

DISEÑO DE CIRCUITOS ARITMETICOS CON VHDL

4.1 SUMADORES
Recordemos el sumador de dos bits con acarreo de entrada de la figura No. 24
b), el cual se representa en la figura No. 35. El código VHDL para este
sumador sería:

ENTITY sumador IS
PORT (B0, B1, A: IN BIT;
Resultado, Acarreo_de_Salida: OUT BIT;
END sumador;
---------------------------------------------------------------------
ARCHITECTURE dataflow OF sumador IS
BEGIN
Resultado <= B0 XOR B1 XOR A;
Acarreo_de_Salida <= (B0 AND B1) OR (B0 AND A) OR (B1 AND A);
END dataflow

En este código, el nombre de la entidad es sumador, y es donde se realiza la


descripción de los puertos de entrada y salida a emplear, también se realiza
una descripción de la arquitectura de la entidad, en donde se describe el
comportamiento lógico del circuito.

Figura No. 35 Sumador de dos bits con acarreo de entrada

Es importante tener en cuenta que dependiendo del software compilador y del


tipo de tecnología en el cual se empleará el código, será la manera de
implementar las expresiones lógicas descritas en la parte de la arquitectura en
el código VHDL. Por ejemplo, si la tecnología escogida son los PLDs o FPGAs,
la expresión para el bit de Acarreo_de_Salida tendría dos opciones:

 Acarreo _ de _ Salida ( A, B 0, B1) = A.B 0 + A.B1 + B1.B 0


 Acarreo _ de _ Salida ( A, B 0, B1) = A( B 0 + B1) + B1.B0

Por otro lado, si la tecnología seleccionada fuera por medio de ASICs, la


implementación de la expresión lógica para el bit de Acarreo_de_Salida sería
CMOS; un ejemplo de esta representación se puede observar en la figura No.
36

Figura No. 36 Representación en tecnología CMOS del


bit Acarreo_de_Salida

Cuando se realiza la simulación del sistema sumador, la mayoría de programas


generan formas de onda que describen el comportamiento del mismo; para
este sistema las formas de onda se puede observar en la figura No. 37.

Figura No. 37 formas de Onda al simular el sistema sumador

4.2 MULTIPLICADORES PARALELOS


Realicemos el código de un multiplicador binario de 4 bits, en donde al
multiplicarsen dos números de cuatro bits obtendremos un resultado de 8 bits.
En este caso se emplean puertos de entrada sin signo de 4 bits, y un puerto de
salida de 8 bits sin signo El código VHDL sería:
-----------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
-----------------------------------------------------------------------------
ENTITY multiplicador IS
PORT ( a, b : IN SIGNED (3 DOWNTO 0);
resultado : OUT SIGNED ( 7 DOWNTO 0)) ;
END multiplicador ;
-----------------------------------------------------------------------------
ARCHITECTURE ejemplo1 OF multiplicador IS
BEGIN
Resultado <= a * b;
END ejemplo1 ;
-----------------------------------------------------------------------------

Noten que en este ejemplo se están empleando funciones aritméticas, para lo


cual se usa la librería aritmética.
CAPÍTULO 5

DISEÑO DE CONTROL LOGICO CON VHDL

5.1 SEGUIDOR DE SECUENCIAS


Un circuito seguidor de secuencias se encarga de recibir secuencias de
números y vigilar cuando una secuencia particular ha sido recibida. Este tipo
de circuitos es empleado, por ejemplo, en cerraduras electrónicas, en donde un
código es recibido y a la vez comparado con la palabra clave para poder dar
acceso al lugar. El código VHDL descrito enseguida, se encarga de revisar una
secuencia de cuatro dígitos proveniente de un teclado; este teclado contiene
los números del 0 al 6, una tecla de CLEAR, la cual le indica al sistema que
reinicie el análisis de los dígitos. La clave en este caso es el número 1234.

-----------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
-----------------------------------------------------------------------------
ENTITY cerradura IS
PORT ( SIGNAL teclas : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL clear, chequear: IN STD_LOGIC;
SIGNAL puerta : OUT STD_LOGIC_VECTOR(0 TO 1) );
END cerradura ;
-----------------------------------------------------------------------------
ARCHITECTURE logica_cerradura OF cerradura IS
TYPE decodificador IS (RESET, PRIMER_NUMERO, ESPERA_PRIMER,
SECUNDO_NUMERO, ESPERA_SEGUNDO, TERCER_NUMERO,
ESPERA_TERCER, CUARTO_NUMERO);
SIGNAL estado_presente : decodificador;
BEGIN
Salida_seleccionada : PROCESS(estado_presente)
BEGIN
CASE estado_presente IS
WHEN RESET => puerta <= “10”;
WHEN PRIMER_NUMERO SEGUNDO_NUMERO
TERCER_NUMERO CUARTO_NUMERO => puerta
<= “01”;
WHEN OTHERS => puerta <= “11”;
END CASE;
END PROCESS;

Salida_seleccionada : PROCESS
VARIABLE proximo_estado: decodificador;
BEGIN
WAIT UNTIL ( chequear’EVENT AND chequear=’1’);
Proximo_estado := estado_presente;
IF clear=’0’ THEN
Proximo_estado := RESET;
ELSE
CASE estado_presente IS
WHEN RESET =>
CASE teclas IS
WHEN “0001” => proximo_estado :=
primer_numero;
WHEN OTHERS => NULL;
END CASE;
WHEN primer_numero =>
CASE teclas IS
WHEN “0010” => proximo_estado :=
Segundo_numero;
WHEN “0001” => proximo_estado :=
Espera_primer;
WHEN OTHERS => proximo_estado :=
RESET;
END CASE;
WHEN espera_primer =>
CASE teclas IS
WHEN “0010” => proximo_estado :=
Segundo_numero;
WHEN “0001” => NULL;
WHEN OTHERS => proximo_estado :=
RESET;
END CASE;
WHEN segundo_numero =>
CASE teclas IS
WHEN “0011” => proximo_estado :=
tercer_numero;
WHEN “0010” => proximo_estado :=
Espera_segundo;
WHEN OTHERS => proximo_estado :=
RESET;
END CASE;
WHEN espera_segundo =>
CASE teclas IS
WHEN “0011” => proximo_estado :=
tercer_numero;
WHEN “0010” => NULL;
WHEN OTHERS => proximo_estado :=
RESET;
END CASE;
WHEN tercer_numero =>
CASE teclas IS
WHEN “0100” => proximo_estado :=
cuarto_numero;
WHEN “0011” => proximo_estado :=
Espera_tercer;
WHEN OTHERS => proximo_estado :=
RESET;
END CASE;
WHEN espera_tercero =>
CASE teclas IS
WHEN “0100” => proximo_estado :=
cuarto_numero;
WHEN “0011” => NULL;
WHEN OTHERS => proximo_estado :=
RESET;
END CASE;
WHEN cuarto_numero =>
CASE teclas(0) IS
WHEN ‘0’ => proximo_estado :=
RESET;
WHEN OTHERS => NULL;
END CASE;
WHEN OTHERS => NULL;
END CASE;
END IF;
Estado_presente <= proximo_estado;
END PROCESS;
END logica_cerradura;
-----------------------------------------------------------------------------

5.2 GENERADOR DE SECUENCIAS RANDÓMICAS


Un generador de secuencias randómicas es un circuito que envía secuencias
de números aleatorios. Este tipo de generadores generalmente inician su
proceso de una ‘semilla’, o una secuencia base para producir secuencias a su
salida diferentes a la original. A continuación se enuncia el código ejemplo
para este tipo de circuitos:

-----------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all; --este paquete se empleará para el tipo XOIZ
USE dzx.logic_utils.all; --este paquete se empleará para el tipo XOIZ_VECTOR
USE work.control_logic.rnd_gen; --es un generador de secuencias randómico
-----------------------------------------------------------------------------
ENTITY generador IS
PORT ( CLK, RESET : IN XOIZ;
BUS_EXT : OUT XOIZ_VECTOR (3 DOWNTO 0)) ;
END generador ;
-----------------------------------------------------------------------------
ARCHITECTURE ejemplo OF generador IS
SINAL REG_RANDOM : XOIZ_VECTOR(REG_RANDOM’range);
BEGIN
WAIT UNTIL (CLK=’0’ AND CLK’event);
IF RESET = ‘1’ THEN
VRANDOM_REG := REG_RANDOM; --se emplea el último patrón
ELSE
FOR k IN REG_RANDOM’range LOOP
IF k=REG_RANDOM’left THEN
VRANDOM_REG(k) := ‘1’;
ELSE
VRANDOM_REG(k) := ‘0’;
END IF;
END LOOP;
END IF;
RND_GEN(VRANDOM_GEN); --se genera nuevo patrón
REG_RANDOM <= VRANDOM_REG;
END PROCESS
BUS_EXT <= REG_RANDOM;
END
Resultado <= a * b;
END ejemplo ;
-----------------------------------------------------------------------------
BIBLIOGRAFIA

NAYLOR, D y Jones S. (1997). VHDL: a logic synthesis approach. Chapman


& Hall.

COHEN, Ben (1995). VHDL: Coding styles and methodologies. Kluwer


Academic Publisher.

PEDRONI, Volnei A (2004), Circuit Design with VHDL. MIT Press.

ASHENDER, Peter J. (1990), the VHDL Cookbook. First Edition, Department


Computer science, University of Adelaide, South Asutralia.

Department of Computer Science & Electrical Engineering, University of


Maryland, Batimore County (2005). "VHDL reference material". En:
http://www.csee.umbc.edu/help/VHDL.html

PARDO, F y José A. B. (2004). VHDL: Lenguaje para síntesis y modelado de


circuitos. Alfaomega Ra-Ma, 2° Edición.

También podría gustarte