Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ApuntesED PDF
ApuntesED PDF
ii
iii
A mis padres.
ndice general
ndice general
1
Introduccin
1.1.
Introduccin a la tcnica digital . . . . . . . .
1.2.
Bits y niveles lgicos . . . . . . . . . . . . . .
1.3.
Tecnologas para implantar circuitos digitales
1.4.
Niveles de diseo . . . . . . . . . . . . . . . .
1.5.
Ejercicios . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
4
7
14
17
lgebra de Boole
2.1.
Definiciones y teoremas del lgebra de Boole .
2.2.
Funciones lgicas no bsicas . . . . . . . . . .
2.3.
Formas normales de una funcin booleana . .
2.4.
Simplificacin usando diagramas de Karnaugh
2.5.
Ejercicios . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
19
19
23
24
28
33
Sistemas de numeracin
3.1.
Introduccin . . . . . . . . . . . . . . . . . . . .
3.2.
Sistemas de numeracin posicionales . . . . . .
3.3.
Conversin entre bases . . . . . . . . . . . . . .
3.4.
Rangos . . . . . . . . . . . . . . . . . . . . . . .
3.5.
Sistemas hexadecimal y octal . . . . . . . . . . .
3.6.
Operaciones matemticas con nmeros binarios
3.7.
Representacin de nmeros enteros . . . . . . .
3.8.
Rangos en los nmeros con signo . . . . . . . . .
3.9.
Operaciones matemticas con nmeros con signo
3.10. Otros cdigos binarios . . . . . . . . . . . . . . .
3.11. Ejercicios . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
37
37
38
40
42
43
45
48
53
54
58
63
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
67
67
68
70
74
.
.
.
.
.
.
.
.
.
.
.
.
v
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
vi
NDICE GENERAL
4.5.
4.6.
4.7.
5
78
82
86
Circuitos Aritmticos
5.1.
Sumador de un bit . . . . . . . . . . .
5.2.
Sumador de palabras de n bits . . . .
5.3.
Restador de n bits . . . . . . . . . . .
5.4.
Sumador/Restador de n bits . . . . .
5.5.
Multiplicadores . . . . . . . . . . . . .
5.6.
Sumador de nmeros en BCD natural
5.7.
Ejercicios . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
87
87
89
106
107
108
113
115
Bloques Combinacionales
6.1.
Multiplexor . . . . .
6.2.
Demultiplexores . .
6.3.
Codificadores . . . .
6.4.
Decodificadores . . .
6.5.
Comparadores . . .
6.6.
Ejercicios . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
117
117
120
121
127
127
133
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
135
135
136
137
146
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
149
149
149
151
158
165
169
174
Registros
9.1.
Introduccin . . . . . . . . . . . . . . .
9.2.
Registros de entrada y salida en paralelo
9.3.
Registros de desplazamiento . . . . . .
9.4.
Ejercicios . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
177
177
177
180
186
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10 Contadores
189
10.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
10.2. Contador binario ascendente . . . . . . . . . . . . . . . . . . . . . 189
NDICE GENERAL
10.3.
10.4.
10.5.
10.6.
10.7.
10.8.
10.9.
10.10.
vii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
191
193
194
196
198
201
203
206
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
209
209
210
216
222
232
241
Bibliografa
243
ndice alfabtico
245
Captulo 1
Introduccin
En este captulo se realiza una introduccin a los conceptos bsicos que se utilizarn a lo largo del texto. Se expone la diferencia entre un sistema digital y uno
analgico, remarcando las ventajas de los primeros frente a los segundos. A continuacin se define qu es un bit y cmo se representa en un circuito. Se presentan a
continuacin algunas de las funciones bsicas que se pueden realizar con los circuitos digitales y se termina el captulo introduciendo los tipos de circuitos usados
para disear sistemas digitales, haciendo especial nfasis en los circuitos digitales
programables y el flujo de diseo seguido para configurarlos.
1.1.
Introduccin
1.1.1.
Muestreo y cuantizacin
1 Introduccin
El que la conexin entre el telfono y la centralita sea analgica es por razones histricas.
Cuanto se digitaliz la red telefnica era ms fcil cambiar las centralitas que cambiar los telfonos
de todas las casas.
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 1
Introduccin
Las distancias entre centrales pueden ser mayores, al ser las seales digitales
ms inmunes al ruido
Por la misma razn la calidad de la llamada es mayor.
En una lnea digital, gracias a la multiplexacin, se pueden enviar varias
llamadas por un solo cable. En el caso ms simple, mediante un solo par de
cobre (lnea E1) pueden enviarse 30 llamadas. Si se usa fibra ptica, una sola
fibra OC-192 puede llegar a transportar 150336 llamadas. Obviamente esto
presenta un gran ahorro de costes para la compaa telefnica que se supone
deben trasladar a los clientes.
1.2.
1 Introduccin
hay un 0 y si la tensin est entre VIH y V cc, interpretar que en dicha entrada hay
un 1.
A la vista de lo anterior, conviene resaltar que:
Como se puede apreciar en la figura 1.4 hay una diferencia entre VOL y VIL ,
a la que se denomina margen de ruido inferior y entre VOH y VIH , a la que se
denomina margen de ruido superior. La razn de estos mrgenes es conseguir
que el circuito siga funcionando incluso en presencia de un ruido que perturbe
la comunicacin entre el circuito de salida y el de entrada.
Los valores de VOL , VOH , VIL , VIH y Vcc dependen de la tecnologa de fabricacin
del circuito. Existen en el mercado varias familias lgicas y cada una de ellas
tiene una valor determinado para todas estas tensiones. Por ejemplo, en la
figura 1.4 se han mostrado los valores para la familia lgica 74HC. Estos
valores estn publicados en las hojas de caractersticas de los dispositivos
digitales.
Ningn circuito que funcione correctamente tendr en rgimen permanente
una tensin de salida entre VOL y VOH . Otra cosa son los transitorios, en los
cuales obviamente la tensin ha de pasar por esa zona.
No est definido qu har un circuito si la tensin de entrada est comprendida entre VIL y VIH . Existe una tensin umbral, denominada Vth , en la cual
el circuito deja de ver un 0 para pasar a ver un 1 en su entrada. El problema
es que esta tensin umbral vara de unos dispositivos a otros, depende de
la temperatura, de la tensin de alimentacin,2 de la edad del componente,
etc. Por ello el fabricante del circuito lo nico que garantiza es que Vth est
comprendido entre VIL y VIH ; es decir, que VIL < Vth < VIH .
Introduccin
AND
OR
NOT
Bits y Bytes
A la vista de lo anterior, es posible disear un circuito que trabaje con un dgito,
el cual slo puede tomar los valores 0 y 1. A este dgito se le denomina dgito binario
o bit, que es una contraccin del ingls Binary digIT.
Con un slo bit lo nico que podemos expresar, aparte de los dos nmeros
0 y 1, es el resultado de una expresin lgica que puede ser slo cierta o falsa.
Tradicionalmente se asigna 0 a falso y 1 a cierto. En el captulo 2 demostraremos
que cualquier expresin lgica puede realizarse usando tan slo tres operaciones
bsicas: AND, OR y NOT. La gracia del asunto es que se pueden construir circuitos
digitales que realizan tambin estas tres operaciones bsicas. En la figura 1.6 se
representan los smbolos de estos tres circuitos.
Si se desea trabajar con otro tipo de informacin distinta de los valores lgicos
verdadero/falso, es necesario agrupar varios bits. Por ejemplo con dos bits tenemos
cuatro combinaciones: 00, 01, 10 y 11. Por tanto con dos bits se puede representar
una magnitud que tenga slo cuatro posibles valores. Si se necesita un rango mayor
de valores basta con aadir ms bits.
A las agrupaciones de varios bits se les denomina palabras y la palabra ms
famosa es el Byte, que tiene 8 bits. Su popularidad radica en que es muy usada en
informtica porque como se ver en el captulo 3, con 8 bits se pueden representar
256 valores y stos son suficientes para representar las letras del alfabeto. Aunque
en un sistema digital pueden usarse palabras de cualquier nmero de bits, en
informtica las palabras se restringen a mltiplos de 8 bits para que cualquier
palabra pueda dividirse en Bytes. As por ejemplo, en un PC pueden usarse datos
de 8, 16, 32 y 64 bits.
1 Introduccin
5V
R1
Entrada
Sistema
Digital
S1
1.3.
Los circuitos digitales se construyen a partir de puertas lgicas como las que se
han mostrado en la figura 1.6. A lo largo de la historia se han usado distintas tecnologas para implementar estas puertas. Las primeras puertas lgicas electrnicas
se construyeron usando vlvulas de vaco. Un ejemplo clsico de este tipo de tecnologa es el primer ordenador electrnico, llamado ENIAC,4 construido en 1946 en
4
int main(void)
{
printf("Hola\n");
return 0;
}
Introduccin
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 5
1 Introduccin
Ley de Moore
El crecimiento en la integracin de circuitos ya fue predicho por uno de los
fundadores de Intel, Gordon Moore, en el ao 1965. Viendo la tendencia pasada
en la integracin de circuitos predo que el nmero de transistores que se podran
integrar en un chip se incrementara cada dos aos. No se trata de una ley fsica,
sino de una observacin estadstica que se ha mantenido hasta hoy gracias a las
continuas inversiones de la industria de semiconductores en I+D; las cuales han
permitido mejorar continuamente los procesos de fabricacin.
Un ejemplo de esta mejora lo tenemos en la propia Intel, que dicho sea de paso fueron los creadores del primer microprocesador. ste, denominado el 4004, fue
fabricado en 1971 con una tecnologa de 10m (10,000nm) y constaba de 2300 transistores.7 Un procesador actual como el Intel Core i72600 se est fabricando con
7
10
Introduccin
1.3.1.
Lgica programable
Aunque los primeros circuitos integrados se diseaban con una funcin fija:
unas cuantas puertas lgicas, un microprocesador, una memoria, etc. a finales
de los aos 70 se empezaron a desarrollar circuitos cuya funcionalidad poda ser
configurada por el usuario. A este tipo de circuitos se les denomina con el nombre
genrico de lgica programable.8
Los primeros dispositivos programables, denominados PAL (Programmable Array
Logic) fueron introducidos por MMI (Monolithic Memories, Inc.) en 1978. Su estructura es la mostrada en la figura 1.9. Como veremos en el captulo 2, cualquier
funcin lgica puede implantarse mediante dos niveles de puertas AND-OR. Por
ello, estos circuitos ofrecan una serie de puertas AND que al fundir los fusibles
adecuados quedaban conectadas a una entrada o a su negada; pudiendo configurarse as cualquier funcin lgica. Este tipo de circuitos se populariz rpidamente,
pues permitan integrar en un solo chip el equivalente a varios circuitos SSI. Adems
si ocurra un fallo de diseo no era necesario hacer un circuito nuevo; bastaba con
reprogramar la PAL.
de los componentes que pueden integrarse en el chip.
8
En este contexto por programable se entiende que existen en el circuito una serie de puertas
lgicas cuya conexin puede ser configurada por el usuario. Es importante distinguir este uso del
trmino programable con el que se le da en el mbito del software, en el que se dice que un ordenador
es programable porque se le dan una serie de instrucciones para que las ejecute secuencialmente.
11
1 Introduccin
12
Introduccin
3. Al ser dispositivos ms densos, las FPGA suelen incluir, adems de los bloques
lgicos elementales, una serie de bloques con funcionalidad fija. Por ejemplo
la familia Cyclone II de Altera contiene multiplicadores de 18x18 bits y 29 kB
de memoria RAM.
Microcontroladores
Tanto las CPLD como las FPGA son circuitos que se pueden configurar para contener un circuito lgico formado por miles de puertas. En este caso la inteligencia
del circuito est formada precisamente por la forma de interconectar esas miles de
puertas. La otra alternativa para darle inteligencia a un circuito es mediante un
microprocesador en el que se ejecuta un programa, que es donde reside ahora dicha
inteligencia. Al primer modelo se le denomina lgica cableada, pues el comportamiento del circuito se define por cmo se cablean sus componentes. Al segundo
modelo se le denomina lgica programada, pues el comportamiento del sistema se
define por el software que ejecuta el microprocesador.
El primer ejemplo de circuito con lgica programada fue una calculadora de la ya
difunta empresa japonesa Busicom. Dicha calculadora estaba basada en el microprocesador Intel 4004 mencionado anteriormente. No obstante el 4004 necesitaba
de varios chips a su alrededor para funcionar: una memoria ROM para el programa,
una RAM para los datos y una serie de chips de entrada/salida para interactuar
con el exterior [Augarten, 1983]. Un poco despus (1974) Texas Instruments sac al
mercado el TMS1000, que es considerado el primer microcontrolador. La diferencia
con el 4004 es que integraba en el mismo chip un microprocesador, una ROM de 1
Kbit, una RAM de 256 bits y la circuitera de entrada/salida. Por tanto, a diferencia
del 4004, podemos darle inteligencia a un circuito sin ms que aadir un solo
chip.
Los microcontroladores modernos son mucho ms potentes que estos chips pioneros, pero la filosofa sigue siendo la misma. En la figura 1.11 se muestra el diagrama de bloques del microcontrolador ATmega328, que es el usado en las placas
Arduino, muy populares entre los aficionados a la electrnica. Como puede observar el microcontrolador incluye una CPU con una memoria FLASH para almacenar
el programa y una memoria RAM para los datos. El resto de elementos son circuitos de soporte de la CPU, como circuitera de programacin, reloj, etc. y circuitos
para facilitar la entrada/salida. As, dispone de un conversor A/D, temporizadores,
circuitos de comunicaciones y puertos de entrada/salida digitales.
1.3.2.
1 Introduccin
13
remedio que usar lgica cableada. En estos casos se elige una CPLD si el diseo no
es muy complejo o una FPGA en caso contrario.
Las ventajas de usar lgica programable frente a lgica discreta son muchas:
Flexibilidad: al ser elementos reconfigurables, cualquier cambio en el diseo
no necesita cambiar el circuito fsico, sino simplemente reconfigurar los dispositivos programables.
Menor espacio: al poder integrar millones de puertas en un solo chip el espacio
ocupado en la placa de circuito impreso es mucho menor.
Mayor velocidad: al estar todos los componentes situados en el mismo chip,
las seales pueden viajar ms rpido entre ellos.
Menor coste: al reducirse el tamao de la placa de circuito impreso, esta ser
14
Introduccin
1.4.
Niveles de diseo
1.4.1.
1.4.2.
Nivel de transistor
15
1 Introduccin
1
3
2
1
7408
7404
2
1
3
7432
2
7408
1.4.3.
Nivel de puerta
En este nivel los circuitos se construyen usando puertas lgicas en lugar de transistores. Por ejemplo, en la figura 1.13 se muestra el mismo multiplexor mostrado
en el apartado anterior pero diseado a nivel de puerta. Para demostrarlo, basta
con observar que el circuito implementa la funcin lgica Z = S A + S B. Por tanto,
cuando S = 0 la ecuacin anterior queda como Z = 1 A + 0 B = A y de la misma
forma cuando S = 1 la salida Z = B.
Es fcil darse cuenta que en este nivel el diseo de circuitos es ms fcil que en
el nivel de transistores. No obstante, en ocasiones los circuitos pueden ser menos
ptimos. Por ejemplo en este caso el multiplexor necesita 14 transistores,11 mientras
11
16
Introduccin
74157
A
1A
1B
2A
2B
14
3A
13
3B
11
4A
10
4B
15
1Y
2Y
3Y
12
4Y
1.4.4.
Nivel de bloque
En el diseo digital hay bloques que se usan en muchos diseos. Uno de ellos
es precisamente el multiplexor. Por ello los fabricantes de circuitos tienen en su
catlogo chips MSI que implementan estos bloques. Por ejemplo el circuito 74HC157
contiene 4 multiplexores de dos entradas, por lo que para construir el multiplexor
que hemos diseado en las secciones anteriores slo tenemos que conectar las
entradas y salidas al chip, tal como se muestra en la figura 1.14.
Al usar como elementos constructivos del circuito digital bloques con una funcionalidad ms compleja que las puertas lgicas elementales, el diseo se realiza de
forma mucho ms cmodo y rpido.
1.4.5.
1 Introduccin
17
library IEEE;
use IEEE. std_logic_1164 .all;
entity Mux2 is
port( a, b, s: in std_logic ;
z
: out std_logic );
end Mux2;
architecture RTL of Mux2 is
begin
z <= a when s = 0 else b;
end RTL;
Las primeras dos lneas definen una serie de libreras usadas por el sintetizador
y el simulador. Piense en ellas como una especie de #include <stdio.h> de C. Las
siguientes 4 lneas definen las entradas y salidas del circuito, que en la terminologa
de VHDL es una entity. En este caso se definen como entradas las seales a, b y s
y como salida la seal z. Por ltimo, las 4 ltimas lneas definen el comportamiento
del circuito, que en la terminologa de VHDL es la arquitectura del circuito. En
este caso se est especificando que la salida z ha de ser igual a la seal a cuando s
valga 0 o a la seal b cuando s valga 1.
Como conclusin, conforme hemos ido subiendo de nivel, el mismo circuito se
ha ido especificando de manera ms compacta, lo que aumenta la productividad
del diseador y hace posible que circuitos con miles de millones de transistores se
puedan disear en un tiempo razonable.
1.5.
Ejercicios
Esta es la razn por la que el sonido telefnico no es de muy alta fidelidad que se diga.
18
Introduccin
R1
Salida
Entrada
C1
1
S1
Captulo 2
lgebra de Boole
En electrnica digital se trabaja con variables que pueden tener slo dos valores,
0 1. Por suerte los primeros ingenieros que trabajaron con electrnica digital ya
encontraron las matemticas necesarias desarrolladas, pues en 1854, mucho antes
de que se hubiera inventado el transistor, George Boole defini un lgebra para
manipular variables que slo podan tener los valores cierto y falso, lo cual permita
segn Boole investigar las leyes del pensamiento [Boole, 1854]. En este captulo se
introducen los conceptos bsicos de este lgebra.
2.1.
2.1.1.
x=1
(2.1)
Operacin NOT
La operacin NOT, tambin llamada complemento o negacin se define como:
0
19
(2.2)
20
lgebra de Boole
Operacin AND
La operacin AND, tambin llamada producto lgico o booleano se define como:
00
01
10
11
(2.3)
Operacin OR
La operacin OR, tambin llamada suma lgica o booleana se define como:
0+0
0+1
1+0
1+1
(2.4)
2.1.2.
Teoremas
1x =x
(2.5)
2 lgebra de Boole
21
0+x
0
1
x
0
1
Por tanto, como para todos los posibles valores de x, 0 + x = x, el teorema queda
demostrado.
Elemento nulo
x +1=1
x 0=0
(2.6)
Ntese que este teorema aparece la primera diferencia con el lgebra elemental: si
a cualquier variable le sumamos 1, el resultado es 1 independientemente del valor
de la variable.
Propiedad conmutativa
x y=yx
x +y=y+x
(2.7)
y
0
1
0
1
x +y
0
1
1
1
y+x
0
1
1
1
x (y + z ) = x y + x z
x + (y z ) = (x + y) (x + z )
(2.8)
En primer lugar cabe destacar que al igual que en el lgebra elemental, el producto booleano tiene precedencia sobre la suma booleana, por lo que x y + x z es
equivalente a (x y) + (x z ).
En segundo lugar ntese que al contrario que en el lgebra elemental, en el
lgebra de Boole tambin existe la propiedad distributiva respecto de la suma.
Elemento complementario
x +x =1
x x =0
(2.9)
22
lgebra de Boole
Idempotencia
x x =x
x +x =x
(2.10)
Convolucin
x=x
(2.11)
Ley de absorcin
x +x y=x
x (x + y ) = x
(2.12)
Ambas propiedades pueden demostrarse fcilmente mediante manipulacin algebraica aplicando los teoremas anteriores:
int main(void)
{
printf("Hola\n");
return 0;
}
x + x y = x (1 + y ) = x 1 = x
(2.13)
x (x + y ) = x x + x y = x + x y = x
(2.14)
Propiedad asociativa
x (y z ) = (x y) z
Realice el ejercicio 1
x + (y + z ) = (x + y) + z
(2.15)
(x + y) (x + z ) (y + z ) = (x + y) (x + z ) (2.16)
Teorema de De Morgan
Este teorema recibe su nombre en honor a su descubridor: Augustus De Morgan.
(x + y) = x y
(x y ) = x + y
(2.17)
(x + y + z ) = x y z
(x y z ) = x + y + z
(2.18)
(2.19)
2 lgebra de Boole
23
(2.20)
en lugar de:
(x y + z ) = x + y z ERROR
(2.22)
(x y + z ) = (x + y) z Correcto
(2.23)
Realice el ejercicio 2
xi f (x1 , , 1, , xn ) +
(2.24)
+xi f (x1 , , 0, , xn )
f (x1 , , xi , , xn )
(xi + f (x1 , , 0, , xn ))
(2.25)
(xi + f (x1 , , 1, , xn ))
2.2.
Aunque cualquier funcin lgica puede expresarse a partir de las tres funciones
bsicas definidas por el lgebra de Boole (AND, OR y NOT), existen cuatro funciones
lgicas que al ser usadas frecuentemente en la prctica se les ha dado un nombre
y al igual que con las funciones bsicas existen en el mercado circuitos que las
implantan. En las siguientes secciones se muestran estas cuatro funciones.
2.2.1.
int main(void)
{
printf("Hola\n");
return 0;
}
Estas funciones no son ms que una AND y una OR con la salida negada, es
decir, la funcin NAND es:
f =ab
y la funcin NOR es:
f =a+b
24
lgebra de Boole
ON
0
0
0
0
1
1
1
1
P
0
0
1
1
0
0
1
1
V
0
1
0
1
0
1
0
1
Al
0
0
0
0
0
1
1
1
2.2.2.
La funcin XOR aparece en los circuitos sumadores, como veremos ms adelante. Dicha funcin se define como:
f =ab =ab+ab
int main(void)
{
printf("Hola\n");
return 0;
}
Adems esta funcin nos permite saber si dos variables lgicas son distintas, lo cual
puede demostrarse fcilmente obteniendo la tabla de verdad a partir de la definicin
anterior.
La funcin XNOR es una XOR con la salida negada y nos permite averiguar si
dos variables lgicas son iguales. Su definicin es:
f =ab =ab+ab
2.3.
2 lgebra de Boole
25
2.3.1.
Teniendo en cuenta que cada minitrmino slo vale 1 para una combinacin
de las entradas, podemos asociar a cada fila de una tabla de verdad un nico
minitrmino que valdr 1 slo cuando las entradas tomen el valor de esa fila. De
la misma manera, se puede asociar tambin a cada fila de una tabla de verdad el
maxitrmino que vale cero para dicha fila. En el cuadro 2.2 se muestra la asociacin
de minitrminos y maxitrminos a la tabla del ejemplo de la alarma. Ntese que el
minitrmino asociado a una fila puede obtenerse multiplicando todas las variables
de la funcin, negando las que valen 0 en la fila. De la misma forma, el maxitrmino
se obtiene sumando todas las variables y negando las que valen 1 en esa fila de la
tabla.
Forma normal disyuntiva: suma de minitrminos
Si se suman todos los minitrminos asociados a las filas en las que la funcin
lgica vale 1, tendremos una ecuacin que representa el comportamiento lgico
especificado en la tabla de verdad. A dicha expresin se le conoce como forma
normal disyuntiva o suma de minitrminos. En el ejemplo de la alarma, la suma de
minitrminos es la siguiente:
Al = ON P V + ON P V + ON P V
26
lgebra de Boole
ON
0
0
0
0
1
1
1
1
P
0
0
1
1
0
0
1
1
V
0
1
0
1
0
1
0
1
Al
0
0
0
0
0
1
1
1
Minitrminos
ON P V
ON P V
ON P V
ON P V
ON P V
ON P V
ON P V
ON P V
Maxitrminos
ON + P + V
ON + P + V
ON + P + V
ON + P + V
ON + P + V
ON + P + V
ON + P + V
ON + P + V
(0, 1, 2, 3, 4)
ON,P,V
Tanto la forma normal conjuntiva como la forma normal disyuntiva nos permiten
obtener una ecuacin lgica a partir de una tabla de verdad. A partir de este momento tenemos toda la potencia del lgebra de Boole para manipular dicha expresin y
simplificarla o tambin podemos implantarla usando puertas lgicas.
Tambin conviene destacar que, como se acaba de demostrar, cualquier tabla
de verdad se puede expresar como una suma de productos o como un producto
de sumas. Por tanto, tal como se haba adelantado en la introduccin, cualquier
circuito digital puede implantarse mediante puertas AND, OR y NOT. Por otro lado, esta propiedad es la que permite disear circuitos lgicos programables como
2 lgebra de Boole
27
el mostrado en la figura 1.9 formado por dos niveles de puertas AND y OR para
implantar funciones lgicas expresadas como suma de productos.
2.3.2.
(2.26)
Esta ecuacin ya no es una forma normal, pero sigue siendo una suma de productos
y se le denomina precisamente as. La diferencia con la forma normal disyuntiva es
obvia: es mucho ms simple de implementar, al necesitar slo dos puertas AND y
una OR, ambas de dos entradas; frente a tres puertas AND y una OR, las cuatro de
tres entradas.
El mismo procedimiento puede realizarse con la forma normal conjuntiva. En
este caso se aplica el teorema de idempotencia para duplicar el primer trmino:
AL
=
=
28
lgebra de Boole
2.4.
El mtodo de simplificacin mostrado en la seccin anterior se basa en buscar dos trminos de producto, o dos trminos de suma, en los que una variable
aparece negada y sin negar; para a continuacin sacar factor comn y simplificar
dicha variable. El problema es que no siempre es fcil encontrar estos trminos.
Los diagramas de Karnaugh nos ayudan precisamente a eso, aunque tienen como
limitacin el no ser aplicables a funciones de ms de cinco variables.2
2.4.1.
2.4.2.
29
2 lgebra de Boole
AB
CD
00
11
01
10
00
BC
00
11
01
(a) 2 variables
DE
11
01
12
13
15
14
11
10
(c) 4 variables
A=0
00
10
(b) 3 variables
BC
11
0
01
10
10
00
BC
DE
A=1
00
11
01
10
00
0
01
16
17
19
18
20
21
23
22
28
29
31
30
24
25
27
26
01
4
12
13
15
14
11
10
11
11
10
10
(d) 5 variables
(5, 6, 7)
ON,P,V
30
lgebra de Boole
N Fila
0
1
2
3
4
5
6
7
ON
0
0
0
0
1
1
1
1
P
0
0
1
1
0
0
1
1
V
0
1
0
1
0
1
0
1
Al
0
0
0
0
0
1
1
1
PV
00
ON
01
11
10
00
01
03
02
04
15
17
16
(2.27)
Que como puede comprobar es el mismo que el obtenido en la seccin 2.3.2 (vase la
ecuacin 2.26). Adems, si se fija con detenimiento observar que el proceso seguido
ha sido el mismo, slo que usando el diagrama de Karnaugh ha sido fcil identificar
las variables que se pueden simplificar y tambin ver que el minitrmino n 7 es
necesario duplicarlo para la simplificacin.
Por ltimo, otra buena noticia es que no es necesario realizar el proceso que
se acaba de describir para obtener el trmino de producto resultante de un grupo
de casillas. Al contrario, ste se forma multiplicando las variables que no cambian
dentro del grupo, negando las que valen 0. As, en el grupo formado por las casillas
5 y 7 las variables que no cambian dentro del grupo son ON y V . Como ambas
valen 1, el grupo genera el trmino de producto ON V . De la misma forma el grupo
formado por las casillas 7 y 6 genera el trmino de producto ON P.
Por otro lado, la adyacencia se generaliza a grupos de 2n casillas que formen un
rectngulo. As, el mtodo general puede resumirse en el siguiente algoritmo:
1. Formar grupos con las casillas que estn a uno hasta cubrir todos los unos.
Para ello se comienza buscando las casillas aisladas, a continuacin los grupos de 2 casillas que no pueden ampliarse a 4, luego los grupos de 4 que no
pueden ampliarse a 8; y as sucesivamente. Ntese que los grupos han de ser
cuadrados o rectngulos de 2, 4, 8 o 16 casillas.
2. Obtener los trminos de producto generados por cada casilla multiplicando
las variables que no cambian dentro del grupo, negando las que valgan 0.
3. Sumar todos los trminos obtenidos en el proceso anterior.
2 lgebra de Boole
31
Ejemplos
Lo mejor para ilustrar el proceso es ver algunos ejemplos. En primer lugar simplificaremos la ecuacin dada por la suma de productos:
F =
A,B,C,D
2.4.3.
32
lgebra de Boole
CD
CD
00
01
11
10
00
00
11
13
02
01
14
15
17
16
1 12 0 13 1 15 1 14
11
1 12 0 13 1 15 1 14
08
10
08
00
01
11
10
00
00
11
13
02
01
14
15
17
16
11
10
AB
09
AB
1 11 0 10
09
1 11 0 10
P
A,B,C,D
Vcc
a
b
c
d
Circuito a disear s
33
2 lgebra de Boole
a
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
b
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
c
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
d
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
S
X
X
X
X
X
X
X
1
X
X
X
1
X
0
0
X
cd
ab
00
00
01
X
0
01
10
X
4
11
1
5
11
X 12 0 13 X15
10
X8
X9
014
111 X10
Figura 2.5: Tabla de verdad y diagrama de Karnaugh del circuito de la figura 2.4.
2.5.
Ejercicios
F1 = W X Y Z W X Y Z + W X Y Z + W X Y Z + W X Y Z
F2 = A B + A B C D + A B D E + A B C E + C D E
2. Simplifique las siguientes expresiones lgicas usando el teorema de Morgan
generalizado:
34
lgebra de Boole
F3 = A + B C + A
i
F 4 = A + B (C + A )
3. Obtenga las tablas de verdad de las funciones NAND, NOR, XOR y XNOR a
partir de sus definiciones mostradas en la seccin 2.2.
4. Demuestre que las funciones NAND y NOR no cumplen la propiedad asociativa, es decir:
X Y Z ,X Y Z
X + Y + Z ,X + Y + Z
5. Simplifique usando diagramas de Karnaugh las siguientes funciones lgicas
expresadas como suma de minitrminos o producto de maxitrminos. Para
cada una de las funciones lgicas ha de obtener la expresin ms simple
posible, ya sea sta una suma de productos o un producto de sumas. Adems
deber dibujar un circuito digital para implantar cada una de las funciones
lgicas.
F1 =
(2.28)
(2.29)
(0, 2, 8, 10)
(2.30)
A,B,C,D
F2 =
Y
A,B,C,D
F3 =
X
A,B,C,D
F4 =
(2.31)
A,B,C,D,E
35
2 lgebra de Boole
U2
7408
U2
7432
1
3
2
U1
9
7432
8
10
U1
4
6
5
7408
7408
Captulo 3
Sistemas de numeracin
3.1.
Introduccin
XXVII = 10 + 10 + 5 + 1 + 1 = 27
IX = 10 1 = 9
El mayor inconveniente de este sistema de numeracin, aparte de su legibilidad,
es que no es fcil realizar operaciones con ellos. Existen algoritmos para sumar y
restar que son relativamente fciles. Sin embargo la multiplicacin es compleja y
la divisin es imposible. Aunque en [Chu-Carroll, 2006] se muestran los algoritmos
para operar con nmeros romanos, ciertamente es ms cmodo realizar la operacin
convirtiendo los nmeros a decimal, hacer la operacin y luego volver a convertir a
nmeros romanos:
XXVII + IX = 27 + 9 = 36 = XXXVI
Debido a esto, se estableci un sistema de numeracin ms potente, el decimal,
que aparte de ser mucho ms legible y poder representar nmeros grandes,1 permite
realizar operaciones fcilmente.
1
El mayor smbolo de los nmeros romanos es el M (1000), por lo que para representar por
ejemplo el nmero 1.000.000 sera necesario escribir 1.000 M seguidas.
37
38
3.2.
Sistemas de numeracin
3.2.1.
3.2.2.
39
3 Sistemas de numeracin
n 1
X
di bi
i =0
+ d1 b1 + + dm bm =
n 1
X
di b i
i =m
= 1 100 + 2 10 + 3 1 + 4 0, 1 + 2 0, 01
Por otro lado, es conveniente resaltar que el nmero de smbolos necesarios para
representar cada dgito es igual a la base. As en el sistema decimal se necesitan
diez smbolos: 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9.
3.2.3.
El sistema binario
40
Sistemas de numeracin
Las operaciones son muy sencillas. Por ejemplo las reglas de la suma son slo
4 frente a las 100 de los nmeros decimales:
0+0=0
0+1=1
1+0=1
1 + 1 = 10
Ntese que en la ltima ecuacin 10 representa el nmero dos en decimal, no
el 10.4
En conclusin los sistemas digitales slo pueden trabajar con nmeros binarios,
pero a nosotros nos resulta incmodo trabajar directamente con ellos. La solucin
consiste en dejar a los sistemas digitales que trabajen en binario, trabajar nosotros
en decimal y realizar las conversiones de bases cuando tengamos que transferir un
nmero a/desde un sistema digital.
3.3.
3.3.1.
n 1
X
di b i
i =0
n 1
X
di b i
i =m
Realice el ejercicio 1
4
Existe una frase graciosa, slo apta para frikis: Existen 10 tipos de personas: las que saben
binario y las que no.
3 Sistemas de numeracin
3.3.2.
41
13 2
1 6 2
0 3 2
1 1 2
1 0
Por tanto, 13 = 11012 .
El algoritmo anterior slo es vlido para la parte entera del nmero. La parte
decimal se convierte mediante multiplicaciones sucesivas. Para ello se toma dicha
parte decimal y se multiplica sucesivamente por dos. La parte entera del resultado
es el bit resultante de la conversin y la parte decimal se vuelve a multiplicar por
dos. El algoritmo finaliza cuando la parte decimal del resultado sea cero o cuando
hayamos obtenido el nmero de bits deseado para la parte fraccionaria. El nmero
en binario se forma leyendo de arriba a abajo las partes enteras obtenidas de las
multiplicaciones. Al igual que antes, lo mejor es ilustrar el algoritmo mediante un
ejemplo:
0, 375 2 = 0, 75
0, 75 2 = 1, 5
0, 5 2 = 1, 0
Por tanto, 0, 375 = 0, 0112 y teniendo en cuenta la conversin anterior, 13, 375 =
1101, 0112 .
Si la parte fraccionaria no es divisible entre dos no se puede representar con un
nmero finito de bits. Por ejemplo, la conversin a binario de 0, 3 se realiza:
0, 3 2 = 0, 6
0, 6 2 = 1, 2
0, 2 2 = 0, 4
0, 4 2 = 0, 8
0, 8 2 = 1, 6
0, 6 2 = 1, 2
42
Sistemas de numeracin
e=
0, 3 0, 296875
0, 3
100 % = 1, 04 %
e=
numerooriginal numeroaproximado
numerooriginal
100 %
Por ejemplo, al convertir 13, 3 a binario usando 6 bits para la parte fraccionaria, el
resultado es 1101, 0100112 , siendo el error de cuantizacin:
int main(void)
{
printf("Hola\n");
return 0;
}
e=
100 % = 0, 0235 %
Realice el ejercicio 2
3.4.
Rangos
3 Sistemas de numeracin
43
3.5.
3.5.1.
44
Sistemas de numeracin
Decimal
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Binario
00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
Octal
00
01
02
03
04
05
06
07
10
11
12
13
14
15
16
17
20
Hexadecimal
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
10
izquierda para completar el ltimo grupo. Una vez agrupados los bits, se convierte
cada grupo por separado. Lo mejor, como siempre, es realizar unos ejemplos:
1001111010012 = 100 111 101 0012 = 47518
11111100002 = 001 111 110 0002 = 17608
La conversin de octal a binario se realiza convirtiendo por separado cada dgito
del nmero octal. Para ello puede ayudarse del cuadro 3.1. Por ejemplo:
47518 = 100 111 101 0012 = 1001111010012
3.5.2.
Y de hexadecimal a binario:
Realice el ejercicio 3
45
3 Sistemas de numeracin
a i + bi + c i
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
ci +1
0
0
0
1
0
1
1
1
si
0
1
1
0
1
0
0
1
ai (bi + ci )
0
0
0
0
0
1
0
1
0
0
1
1
1
0
0
1
0
1
1
1
0
1
1
1
ci +1
0
1
1
1
0
0
0
1
si
0
1
1
0
1
0
0
1
ai bi
0 0
0 1
1 0
1 1
si
0
0
0
1
3.5.3.
3.5.4.
3.6.
3.6.1.
Para sumar dos nmeros binarios el procedimiento es el mismo que para sumar
nmeros en base 10: se va sumando dgito a dgito, empezando por los dos dgitos
menos significativos. Si en la suma se produce un acarreo, ste se suma a los
6
46
Sistemas de numeracin
1 1
01101100
+
01001110
10111010
Para empezar se suman los dos bits menos significativos: 0 + 0, y el resultado es 0
con acarreo 0. A continuacin se suman los dos siguientes bits: 0 + 1, obtenindose
como resultado un 1 con acarreo 0. Despus se suma 1 + 1 y se obtiene como
resultado 0 con un acarreo de 1, A continuacin se suman los dos siguientes bits
ms el acarreo anterior: 1 + 1 + 1, obtenindose un 1 como resultado y un 1 como
acarreo. Como puede comprobar en el ejemplo el proceso continua as hasta el
ltimo dgito.
Desborde en la suma
En la seccin 3.4 se ha comentado que en un sistema digital el nmero de bits
para representar un nmero binario es fijo, por lo que slo puede representarse
un rango de nmeros naturales. Cuando se realiza una suma de dos nmeros el
resultado suele representarse con el mismo nmero de bits que los operandos.7 No
obstante esto presenta un grave problema, ya que el resultado de una suma puede
salirse del rango si ambos sumandos son suficientemente grandes. Por ejemplo el
resultado de sumar 200 + 200 con 8 bits en binario es:
1
11001000
+
11001000
110010000
que como se puede apreciar necesita 9 bits para representarse. Si el resultado
se trunca a 8 bits porque el sistema digital que se est usando es de 8 bits, el
resultado obtenido ser: 100100002 = 144 que no se parece en nada al resultado
real de 400. Por tanto en un sistema digital ha de detectarse cundo se produce un
desbordamiento para no tener en cuenta el resultado.8
7
En la prctica no se realizan operaciones aisladas, sino una serie de clculos en los cuales el
resultado de una operacin se utiliza como operando para la siguiente. Piense por ejemplo en un
programa de ordenador. Si cada vez que se hace una suma hay que aadir un bit para garantizar
que no se desborda el resultado, al final se acabara con un elevado nmero de bits. Por tanto, lo
ms prctico es usar el mismo nmero de bits para todos los nmeros dentro del sistema digital y
hacer que dicho nmero de bits sea suficiente para representar todas las magnitudes con las que
va a trabajar el sistema digital.
8
Esto es lo que ocurre en una calculadora digital: si intenta sumar dos nmeros muy grandes
la calculadora muestra un error en lugar del resultado.
3 Sistemas de numeracin
47
3.6.2.
01101100
0 110101111 1 0
00011110
3.6.3.
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 4
48
Sistemas de numeracin
0
10
101
1000
1
1
1
0
1
0
0
0
1
0
0
0
10
01
10
0
010
En primer lugar se multiplica el multiplicando por la primera cifra del multiplicador.10 Como es un 1, el resultado es 1010. A continuacin se multiplica el multiplicando por la segunda cifra del multiplicador, escribiendo el resultado desplazado
una cifra a la izquierda. Como en el ejemplo la segunda cifra es un 0, la segunda fila
es 0000. El algoritmo continua as hasta llegar a la ltima cifra del multiplicador.
Para terminar se suman los cuatro productos parciales. Como puede observar la
multiplicacin en binario es mucho ms fcil que en decimal, pues al ser las cifras
del multiplicador 0 o 1 los productos parciales son o 0 o el multiplicando.
Desborde en la multiplicacin
Como puede deducirse del algoritmo anterior, si se multiplican dos nmeros de
n bits, el resultado necesita 2 n bits para representarse. Si se trunca el resultado
a n bits se producir un desbordamiento si alguno de los n bits ms significativos
estn a 1. En el ejemplo anterior se ha realizado la multiplicacin 10 13, obtenindose 130. Como puede observarse se han multiplicado dos nmeros de 4 bits y el
resultado ha necesitado 8 bits para representarse. Si slo se dispusiera de 4 bits
para el resultado, se habra obtenido un 2 como resultado, que obviamente es errneo; lo cual se detecta viendo que hay bits a 1 en los 4 bits ms significativos del
resultado. Si en cambio se multiplica 7 2:
0
0
0
1
000
0000
0001
int main(void)
{
printf("Hola\n");
return 0;
}
1
0
0
1
0
11
10
00
1
110
3.7.
Para distinguir entre nmeros positivos y negativos, nosotros usamos dos smbolos adicionales: el + para los positivos, omitido normalmente en la prctica, y el
10
3 Sistemas de numeracin
49
para los negativos. En un sistema digital, como se ha dicho anteriormente, slo existen dos smbolos: el 0 y el 1; por lo que es necesario buscar formas de representar
los nmeros negativos sin usar los smbolos + y .
3.7.1.
La primera tcnica que se nos viene a la cabeza para representar nmeros con
signo es usar un bit para representar el signo, asignando el 0 para el + y el 1 para
el . Este bit, al que se denomina bit de signo, se escribe al principio del nmero
binario (bit ms significativo). As, si se dispone de 4 bits, se reserva el primero para
el signo y los tres restantes para la magnitud. Por ejemplo, el +2 se representar en
este caso como 0010 y el 2 como 1010.
A la vista del ejemplo anterior cabe preguntarse cmo sabe un sistema digital si
la secuencia de bits 1010 es un 2 o un 10. La respuesta es que el sistema digital
no lo sabr nunca, pues no es un ser inteligente. Somos nosotros los encargados de
interpretar cada secuencia de bits sabiendo de antemano cmo estn codificados. En
el ejemplo anterior, sabiendo que la secuencia de bits 1010 representa un nmero en
signo magnitud podremos obtener su valor. Para ello, al ser el bit ms significativo
un 1 sabemos que es un nmero negativo. Para obtener la magnitud tomamos los
bits restantes (010) y los convertimos a decimal, obteniendo un 2. Por tanto, si la
secuencia de bits 1010 representa un nmero en signo-magnitud, dicho nmero es
el -2.
La desventaja de este sistema de representacin es que es complejo operar con
l, tal como se discute en la seccin 3.9.1. Por ello se han desarrollado otros mtodos
que aunque son menos intuitivos, facilitan mucho las operaciones.
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 7
3.7.2.
Esta tcnica es la ms usada en la prctica, pues como se ver ms adelante simplifica las operaciones matemticas entre nmeros con signo. Esta representacin
se basa en obtener el complemento a dos de los nmeros negativos, por lo que antes
de empezar conviene mostrar cmo se obtiene el complemento a dos de un nmero.
Complemento a dos
Para obtener el complemento a dos de un nmero binario existen dos algoritmos:
El primero consiste en invertir todos los bits del nmero binario y sumar uno
al resultado. Por ejemplo, para obtener el complemento a dos de 0110, en
primer lugar se invierten todos los bits:
0110
1001
Al resultado obtenido se le suma 1:
50
Sistemas de numeracin
1001
+
0001
1010
El segundo mtodo es mucho ms fcil y consiste en copiar cada bit del
nmero de derecha a izquierda hasta que se encuentre el primer 1. A partir de ese momento se copia el inverso de cada bit. En el ejemplo anterior,
para obtener el complemento de 0110, se empieza copiando el nmero hasta
encontrar el primer 1, con lo que en ese momento habremos escrito:
0110
10
El resto de bits se copian invertidos, obteniendo al final el complemento a dos
del nmero:
0110
1010
Ambos algoritmos son sencillos de realizar, pero quizs el lector no entienda en
realidad qu es lo que se est haciendo. Pues bien, obtener el complemento a dos
de un nmero x no es ms que calcular 2n x en donde n es el nmero de bits del
nmero x. Por ejemplo, para obtener el complemento a dos del nmero de 4 bits
0110 hay que hacer la siguiente operacin:
10000
10
01010
101011
Lo que ocurre es que la resta anterior es difcil de hacer, tanto para nosotros como para nuestros queridos circuitos digitales. Ahora bien, teniendo en cuenta que
10000 = 1111 + 1, la anterior operacin se puede descomponer en 1111 0110 + 1.
La ventaja de hacer esta operacin as es que, tal como se aprecia en el ejemplo:
1111
0110
1001
restar 1111 0110 es equivalente a invertir los bits del sustraendo. Esto es cierto
siempre que el minuendo sea todo unos, pues no se producen acarreos entre cifras
y 1 0 = 1 y 1 1 = 0.
Para terminar de calcular el complemento a dos se suma 1 al resultado anterior:
1
1001
+
0001
1010
3 Sistemas de numeracin
51
52
Sistemas de numeracin
binario a decimal. As, como el primer nmero del ejemplo tiene el bit de signo a 0,
ste es positivo y por tanto se trata del:
00001011C2 = 0 27 + 0 26 + 0 25 + 0 24 + 1 23 + 0 22 + 1 21 + 1 20 = 11
En cambio el segundo nmero tiene el bit de signo a 1, por lo que en primer
lugar hay que obtener su complemento a dos:
11111011
00000101
int main(void)
{
printf("Hola\n");
return 0;
}
El resultado anterior es el valor absoluto del nmero en binario, por lo que hay que
convertirlo a decimal:
000001012 = 0 27 + 0 26 + 0 25 + 0 24 + 0 23 + 1 22 + 0 21 + 1 20 = 5
Por tanto el nmero 11111011C2 es el 5.
(3.1)
0010
+
1110
10000
Pero como tanto los operandos como el resultado son nmeros son de 4 bits y no
tenemos en cuenta el acarreo final, el resultado de la operacin anterior es 0000C2 ,
como debe ser. Ntese que en esta operacin el acarreo final no indica desborde, tal
como ocurre en la suma sin signo mostrada en la seccin 3.6.1. En la seccin 3.9.2
se muestra cmo detectar el desbordamiento cuando se suman nmeros con signo
representados en complemento a dos.
53
3 Sistemas de numeracin
3.7.3.
154
77
1
2
38
0
2
19
3.8.
12
En este libro, a los nmeros representados en exceso 127 se les pondr XS 127 como subndice.
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 10
54
3.9.
Sistemas de numeracin
Las operaciones descritas en el apartado 3.6 slo son vlidas para nmeros
binarios naturales (sin signo). Para realizar operaciones de nmeros enteros es
necesario modificar los algoritmos segn el tipo de codificacin usada.
3.9.1.
(3.2)
En primer lugar se observa que el segundo nmero es negativo (2), por lo que la
operacin a realizar ser:
0011 0010 = 0001
(3.3)
Para realizar una resta el proceso es el mismo, por lo que no merece la pena emplear ms tiempo en ello. Para multiplicar dos nmeros el proceso es similar: se
multiplican las magnitudes y el signo resultante se obtiene estudiando el signo de
los operandos.
Aunque esta forma de operar no es complicada para nosotros, si lo es para un
circuito. Por ello, tal como se mencion en la seccin 3.7.1, los nmeros codificados
en signo-magnitud prcticamente no se usan en la prctica.
3.9.2.
00011011
+
11011100
11110111
Y el resultado, teniendo en cuenta que es un nmero representado en complemento
a dos, es 9, tal como era de esperar.
Otra de las ventajas de usar nmeros en complemento a dos es que las restas se
pueden hacer sumando el sustraendo cambiado de signo, no siendo necesario usar
el algoritmo de resta que tan difcil suele resultar de aplicar. Es decir, suplantamos
el algoritmo de resta por el de obtener el complemento a dos (muy fcil) y el de sumar
(ms fcil que el de restar). Esta simplificacin no solo es buena para nosotros, sino
3 Sistemas de numeracin
55
que tambin lo es para los circuitos digitales, tal como veremos ms adelante. Por
ejemplo, para restar 00001111 00000110, lo que en realidad hacemos es:
1. Obtenemos el complemento a dos del sustraendo: 11111010C2
2. Sumamos el minuendo ms el sustraendo:
1 1 1 1 1 1
00001111
+
11111010
100001001
3. Despreciamos el acarreo final, con lo que el resultado es 00001001C2 , que es
9, como era de esperar despus de restar 15 6.
Desborde en la suma en complemento a dos
Al igual que en la suma sin signo, si los nmeros a sumar son demasiado
grandes puede ocurrir que el resultado no pueda representarse con el nmero de bits
finito usado para representarlo. Por ello despus de realizar una suma es necesario
verificar si se ha producido un desbordamiento para marcar el resultado como
errneo. Existen dos formas de evaluarlo, que como siempre es mejor discutir con
un ejemplo: realicemos la suma de 103 + 103 en complemento a dos usando 8 bits:
1 1
1 1 1
01100111
+
01100111
11001110
El resultado obtenido es 11001110C2 , que en decimal es 50 en lugar de 206, lo
cual es una prueba de que algo no ha ido bien con la suma. El problema es que un
sistema digital no es capaz de darse cuenta de este tipo de error si no buscamos
una forma fcil de averiguarlo. Existen dos maneras:
Si el signo de ambos sumandos es el mismo y el del resultado es distinto
se ha producido un desbordamiento. Obviamente si despus de sumar dos
nmeros positivos obtenemos uno negativo es seal de que algo no ha ido
bien. De la misma forma si sumamos dos nmeros negativos el resultado ha
de ser otro nmero negativo y si nos sale positivo ms vale que lo tiremos a
la basura. Si el signo de ambos sumandos es distinto obviamente el resultado
ser menor que ambos sumandos, por lo que es imposible que se produzca
un desbordamiento.
Otra alternativa para detectar el desbordamiento es analizar los dos ltimos
acarreos. Si son iguales es seal de que ha ido todo bien, pero si son distintos
es que ha ocurrido un desbordamiento. Si volvemos al ejemplo anterior:
0 1 1
Dos u
ltimos acarreos.
1 1 1
01100111
01100111
11001110
56
Sistemas de numeracin
Vemos que los dos ltimos acarreos son distintos, lo que indica que se ha producido
un desbordamiento y por tanto el resultado no es correcto. Si en cambio se realiza
la suma 103 + (2):
Dos ultimos
acarreos.
1 1 1 1 1
int main(void)
{
printf("Hola\n");
return 0;
}
10011001
11111110
110010111
Los dos ltimos acarreos son iguales y por tanto el resultado es correcto, lo cual
puede comprobar usted mismo convirtiendo el resultado a decimal.
Realice el ejercicio 11
3.9.3.
3.9.4.
57
3 Sistemas de numeracin
0
00
000
000
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
1
0
1
0
0
0
0
0
1
1
0
1
0
1
0
0
0
0
1
0
1
0
1
0
0
0
1
0
1
0
1
0
0
1
0
1
0
1
0
1
1
1
0
0
10
01
10
0
1110110
Del resultado de la multiplicacin anterior slo se toman los 8 bits menos significativos, obtenindose entonces 11110110C2 , que como puede comprobar es -10.
Desborde en la multiplicacin de nmeros en complemento a 2
Al igual que con la multiplicacin de nmeros naturales, si el resultado se expresa con n + m bits, siendo n y m el nmero de bits del multiplicando y el multiplicador;
no se producir ningn desbordamiento. Si se desea truncar el nmero de bits del
resultado, habr que verificar que el resultado est dentro del rango. Para ello basta con verificar que los bits que se eliminan del resultado son todos iguales al bit
de signo del nmero resultante. En el ejemplo anterior, si queremos expresar el
resultado original (11110110C2 ) con 4 bits vemos que los 4 bits que se eliminan
(1111) aunque iguales entre s son distintos al bit de signo del nmero resultante
(0110C2 ). Por tanto se produce un desbordamiento, lo cual es fcil de comprobar,
ya que 0110C2 es 6, en lugar de -10.
Si por ejemplo se realiza la multiplicacin de 2 3 con 4 bits:
0
00
000
000
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
1
0
1
1
0
0
0
0
0
0
1
1
0
1
1
0
0
0
0
0
1
0
1
1
0
0
0
0
1
0
1
1
0
0
0
1
0
1
1
0
0
1
0
1
1
0
10
11
10
0
1111010
58
int main(void)
{
printf("Hola\n");
return 0;
}
Sistemas de numeracin
3.10.
Realice el ejercicio 12
3.10.1.
Cdigos BCD
59
3 Sistemas de numeracin
B3 B2 B1 B0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
BCD Natural
0
1
2
3
4
5
6
7
8
9
BCD Aiken
0
1
2
3
4
5
6
7
8
9
BCD XS-3
0
1
2
3
4
5
6
7
8
9
Convertir los siguientes nmeros BCD a decimal. El proceso a seguir es el inverso del ejemplo anterior, teniendo en cuenta qu cdigo BCD usa el nmero:
1001 0110 0011, teniendo en cuenta que est codificado en BCD Natural:
963.
int main(void)
{
printf("Hola\n");
return 0;
}
0100 1000 1100 1011, teniendo en cuenta que est codificado en BCD
XS-3: 1598
Signo magnitud
Al igual que en binario, se reserva el dgito ms significativo para el signo (0001
para y 0000 para +). As, el nmero +27 se representa en BCD natural como 0000
0010 0111 y el -27 como 0001 0010 0111.
60
Sistemas de numeracin
Complemento a 10
El complemento a 10 de un nmero x se calcula del mismo modo que el complemento a 2 de los nmeros binarios: 10n x, siendo n el nmero de dgitos del
nmero x. Por ejemplo el complemento a 10 del nmero 127 se calcula como:
1000
127
873
Por tanto, el complemento a 10 del nmero BCD natural 0001 0010 0111 es el 1000
0111 0011.
Para codificar nmeros enteros en BCD usando complemento a 10 el proceso es
el mismo al seguido con los nmeros binarios:
Si el nmero es positivo, se codifica dicho nmero en BCD. En este caso hay
que asegurarse que el dgito mas significativo sea menor que 5.
Si el nmero es negativo, se codifica en BCD el complemento a 10 del nmero.
En este caso el dgito ms significativo ha de ser mayor o igual que 5.
int main(void)
{
printf("Hola\n");
return 0;
}
Por ejemplo, si queremos codificar el nmero +27 en BCD natural usando dos
dgitos, como es positivo, se codifica tal cual: 0010 0111. Al ser el dgito ms significativo menor que 5 es seal de que el resultado es correcto.
Para codificar el nmero -27 en BCD natural usando dos dgitos, como es negativo, es necesario codificar su complemento a 10, que es 100 27 = 73. Por tanto
-27 se codifica como 0111 0011. Nuevamente, como el dgito ms significativo es
mayor que cinco, el resultado es correcto.
Si nos dan un nmero entero en BCD codificado en complemento a 10 y queremos saber de qu nmero se trata, basta con realizar el algoritmo anterior a la
inversa, tal como hicimos con los nmeros binarios en complemento a 2.
En conclusin, como ha podido observar, el complemento a 10 en los nmeros
BCD es igual que el complemento a 2 en los nmeros binarios.
Suma de nmeros en BCD
El algoritmo para sumar nmeros en BCD es ligeramente distinto al usado para
sumar nmeros en binario. Adems dicho algoritmo vara en funcin del cdigo BCD
usado. Para sumar nmeros codificados en BCD natural o BCD Aiken, el algoritmo
es el siguiente:
Se suma el nmero dgito a dgito.
Para cada dgito, si el resultado es un cdigo invlido (los marcados con un
guin en la tabla 3.3) o si se produce un acarreo a la siguiente cifra, hay que
sumar 6 al resultado anterior.
Para ilustrar el proceso nada mejor que mostrar un ejemplo. A continuacin se
realiza la suma 197 + 385 = 582 en BCD natural:
61
3 Sistemas de numeracin
0011
0011
0001
0011
0101
1001
1000
0010
0110
1000
1110
0111
0101
1100
0110
0010
La suma del primer dgito da como resultado 1100, que como puede apreciar en
la tabla 3.3 es un cdigo invlido. Por tanto se ha sumado 6 al resultado (se han
omitido los acarreos intermedios para no complicar la figura) para obtener un 2,
que es el resultado esperado. Ntese que como resultado de esta ltima suma se
produce un acarreo al siguiente dgito, el cual ha de tenerse en cuenta. La suma del
segundo dgito da como resultado 0010, que es un cdigo vlido, pero como se ha
producido un acarreo al siguiente dgito, es necesario sumar 6 al resultado anterior;
obteniendo un 8 que de nuevo es el resultado esperado. Por ltimo, en la tercera
cifra el resultado es 0101 que al ser un cdigo vlido y al no haberse producido
acarreo a la siguiente cifra no hace falta realizarle ningn ajuste.
El algoritmo para nmeros BCD XS-3 es ligeramente distinto y un poco ms
complejo al tener que realizar restas:
Se suma el nmero dgito a dgito.
Para cada dgito, si hay acarreo a la siguiente cifra se suma 3. Si no hay
acarreo a la siguiente cifra se resta 3.
Por ejemplo, la suma 197 + 485 = 682 en BCD XS-3 se realiza:
1111
0100
0111
1100
0011
1001
1111
1100
1011
1000
0011
1011
0000
1010
1000
0010
0011
0101
Como puede observar, en los dos primeros dgitos la suma ha producido un acarreo
a la siguiente cifra, por lo que se ha sumado 3 al resultado. Por el contrario, en
el ltimo dgito no se ha producido ningn acarreo, por lo que se ha restado 3 al
resultado. El nmero final ha sido 1001 1011 0101, que si lo convierte a decimal
obtendr 682, como era de esperar.
3.10.2.
Cdigo Gray
La caracterstica del cdigo Gray es que entre dos nmeros consecutivos slo
cambia un bit. Si se fija en los diagramas de Karnaugh, las filas y columnas estn
numeradas segn este cdigo (00, 01, 11 y 10) para conseguir que entre casillas
adyacentes slo difiera un bit. La otra aplicacin prctica de los nmeros en cdigo
Gray son los codificadores angulares. Estos dispositivos permiten medir ngulos
mediante unos sensores luminosos y una rueda codificada segn el cdigo Gray,
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 17
62
Sistemas de numeracin
3 Sistemas de numeracin
63
int main(void)
{
printf("Hola\n");
return 0;
}
b0 = g3 g2 g1 g0
As, el nmero en cdigo Gray 0110 se codifica en binario como 0100.
3.11.
Ejercicios
Realice el ejercicio 18
64
Sistemas de numeracin
6. Multiplique 14 11 en binario usando nmeros de 4 bits. Es posible representar el resultado tambin con 4 bits?
7. Represente +77 y -77 en binario signo-magnitud usando 8 bits.
8. Represente los nmeros +77, -77, +128 y -128 en complemento a 2 usando
8 bits.
9. Si las siguientes secuencias de bits representan nmeros en complemento a 2, qu nmeros representan?: 00100110C2 , 10010111C2 , 11111111C2 ,
01010111C2 .
10. Codifique +28 y -28 con 8 bits usando signo-magnitud, complemento a 2 y
XS-127.
11. Realice las siguientes operaciones, indicando cundo el resultado es correcto y cundo se produce un desbordamiento. Todas las operaciones son con
nmeros codificados en complemento a dos de 4 bits:
a) 1001C2 + 0111C2
b) 0101C2 + 1111C2
c) 0111C2 + 0001C2
d) 1100C2 + 1011C2
12. Realice las siguientes multiplicaciones usando nmeros en complemento a 2
de 4 bits. Indique cuando el resultado puede expresarse slo con 4 bits.
a) 1001C2 0111C2
b) 0101C2 1111C2
c) 0111C2 0010C2
d) 1110C2 0011C2
13. Convierta los siguientes nmeros a BCD Natural, BCD Aiken y BCD XS-3:
a) 1267
b) 45
c) 3987
14. Convierta los siguientes nmeros de BCD a decimal.
a) 0001 1000 1001 0110, sabiendo que est codificado en BCD Natural.
b) 0011 1100 1110 0000, sabiendo que est codificado en BCD Aiken.
c) 0100 0111 1100 0011, sabiendo que est codificado en BCD XS-3.
15. Codifique los siguientes nmeros enteros en BCD natural en complemento a
10 usando nmeros de 4 dgitos:
a) 1267
b) 45
c) -3987
d) -5678
3 Sistemas de numeracin
65
16. Las siguientes secuencias de bits son nmeros enteros codificados en BCD
natural en complemento a 10. Indique qu numero decimal representan.
a) 0001 1000 1001 0110.
b) 0111 0000 0110 0010.
17. Realice la suma 398 + 582 en BCD natural. Para ello convierta ambos sumandos a BCD natural y realice la suma aplicando el algoritmo mostrado en la
seccin 3.10.1, indicando los acarreos intermedios. Repita el ejercicio codificando ambos nmeros en BCD XS-3.
18. Convierta el nmero 1001 de cdigo Gray a binario y el nmero 0111 de
binario a cdigo Gray.
Captulo 4
4.1.
Introduccin
El lenguaje VHDL se desarroll a mediados de los aos 80 en un proyecto financiado por el departamento de defensa de los Estados Unidos de Amrica y el
IEEE.1 El objetivo del lenguaje era permitir la especificacin de circuitos integrados
de alta velocidad y de ah precisamente es de donde viene el nombre VHDL, que
es un acrnimo de VHSIC Hardware Description Language, en donde VHSIC es otro
acrnimo de Very High Speed Integrated Circuit.2
La utilidad de un lenguaje de especificacin de hardware es poder construir
descripciones de circuitos que sean inequvocas. Si se usa un lenguaje natural
es fcil que se produzcan imprecisiones en la descripcin, que al ir pasando de
ingeniero en ingeniero generen errores al interpretar cada uno la especificacin
de una manera. Sin embargo, al usar un lenguaje como VHDL, la descripcin se
hace tan inambigua que hasta un programa de ordenador es capaz de simularla
y verificar el funcionamiento del circuito. As pues, el objetivo inicial del lenguaje
VHDL fue precisamente este: poder especificar un circuito sin ambigedades para
que se pudiera simular.
Aunque poder documentar y simular un circuito era ya un avance, lo que ya
fue un avance increble fue el desarrollo de sintetizadores que a partir de una
especificacin en VHDL eran capaces de generar un circuito automticamente. Esto
ha permitido un aumento en la productividad de los diseadores, ya que como
veremos ms adelante, mediante unas cuantas lneas de cdigo VHDL seremos
capaces de generar circuitos con miles de puertas lgicas.
Existen otros lenguajes de descripcin de hardware, siendo Verilog el ms popular. Curiosamente, en U.S.A se usa ms Verilog y en Europa se usa ms VHDL, a
1
67
68
Error
Diseo de
la jerarqua
Codicacin
de los bloques
Compilacin
Error
OK
Simulacin
Funcional
OK
Error
OK
Sntesis
Error
OK
Simulacin
Temporal
OK
Implantacin
Fsica
4.2.
Flujo de diseo
4.2.1.
69
4.2.2.
Una vez diseada la jerarqua, se pasa a codificar cada uno de los bloques.
Esta codificacin la puede realizar con su editor de texto favorito, o bien puede
usar el editor que traen los sistemas de desarrollo como Quartus II. La ventaja de
estos ltimos es que incluyen plantillas con las estructuras de cdigo ms usuales,
generan bancos de prueba automticamente, permiten llamar al compilador con
una pulsacin de ratn etc.
Tal como se muestra en la figura 4.1, a veces es necesario volver atrs en el
flujo de diseo, por ejemplo cuando nos damos cuenta que el bloque que queremos
disear es demasiado complejo o necesita alguna entrada o salida que no hemos
tenido en cuenta al disear la jerarqua. No obstante, en general, estas iteraciones
en el proceso de diseo no suelen consumir demasiado tiempo.
4.2.3.
Compilacin
4.2.4.
Simulacin funcional
Cuando el cdigo en VHDL compila sin errores podemos pasar a una primera
simulacin, denominada simulacin funcional. En este primer paso slo se tiene
informacin del funcionamiento lgico del circuito, pues al no haber realizado la
sntesis lgica no sabemos con qu puertas se va a implantar el circuito y por tanto
no tenemos informacin acerca de los retardos de las seales dentro del circuito. La
ventaja de esta simulacin es que es muy rpida, por lo que el ciclo de simulacin,
deteccin de errores, edicin del cdigo VHDL para corregirlos, compilacin y vuelta
a simular es muy rpido.
4.2.5.
70
4.2.6.
Simulacin temporal
Al finalizar la etapa anterior ya conocemos los retardos de todas las seales del
circuito, por lo que podemos realizar una simulacin muy exacta del circuito final
y verificar que el dicho circuito sigue funcionando a pesar de los retardos de las
seales. Si no es as, al igual que antes, las alternativas son o cambiar de tecnologa
de implantacin (por ejemplo una FPGA ms rpida), guiar al sintetizador para que
intente generar circuitos ms rpidos o cambiar el cdigo VHDL para especificar
otro circuito que cumpla con las especificaciones temporales. En cualquiera de los
casos, los errores detectados en esta etapa son bastante ms costosos de arreglar;
aparte de que cada iteracin lleva mucho tiempo al tener que volver a repetir el
proceso de compilacin, sntesis y place & route.
4.2.7.
Implantacin fsica
4.3.
Un archivo en VHDL contiene la descripcin de un bloque jerrquico. Por ejemplo, el archivo siguiente contiene la descripcin del multiplexor de 2 a 1 estudiado
71
en el captulo 1.
1
-- Mutiplexor de 2 a 1 de 1 bit.
2
3
4
library IEEE;
use IEEE. std_logic_1164 .all;
5
6
7
8
9
10
entity Mux2 is
port(a0 , a1 : in std_logic ;
sel
: in std_logic ;
z
: out std_logic );
end Mux2;
-- Entradas de datos
-- Entrada de seleccin
-- Salida seleccionada
11
12
13
14
15
4.3.1.
entity NombreDeEntidad is
[ generic ( declaraciones de parmetros ); ]
72
entity Comparador2Bits is
port( a, b : in std_logic_vector (1 downto 0);
a_mayor_b , a_menor_b , a_igual_B : out std_logic );
end Comparador2Bits ;
Identificadores en VHDL
Existen unas reglas bsicas que han de cumplir los identificadores en VHDL:
Ha de comenzar por una letra.
Slo debe de contener letras del alfabeto ingls, dgitos o el carcter de subrayado _. No est permitido que haya dos caracteres de subrayado seguidos
ni que el ltimo carcter sea el subrayado.
5
73
4.3.2.
Sintaxis de la arquitectura
74
con el nombre del archivo VHDL. Despus se escribe is y a continuacin vienen las
declaraciones de las seales internas que se necesiten en la arquitectura. Adems
de seales pueden declararse tambin constantes, funciones, tipos de datos nuevos,
etc. No obstante todos ellos sern objetos locales a la arquitectura.
La arquitectura propiamente dicha se especifica mediante una serie de sentencias VHDL entre las palabras claves begin y end. Por ltimo, despus de end ha de
escribirse obligatoriamente el nombre dado a la arquitectura.
4.4.
Ejemplos
(4.1)
:
:
:
:
in
in
in
out
std_logic ;
std_logic ;
std_logic ;
std_logic );
------
end CircuitoAlarma ;
architecture behavioral of CircuitoAlarma is
signal P1 , P2 : std_logic ;
-- Productos intermedios
begin -- behavioral
P1
<= conexion and ventana ;
P2
<= conexion and puerta ;
alarma <= P1 or P2;
end behavioral ;
75
Figura 4.2: Resultado de la sntesis del circuito de alarma con Quartus II.
Ntese que hemos creado dos seales intermedias, P1 y P2 para contener los
dos productos. El objetivo ha sido precisamente el de mostrar cmo se crean. Como
puede observar, stas se declaran entre el is y el begin y consisten en la palabra
clave signal seguida del nombre de las seales, dos puntos, y el tipo de datos usado
para la seal, std_logic en este caso.
Sentencias concurrentes
as:
1
2
3
4
5
6
7
76
Figura 4.3: Resultado de la sntesis del circuito de alarma sin seales intermedias.
nueva seal que ha cambiado. Si no, se pone muy contento porque ya no tiene que
hacer nada ms hasta que cambie otra entrada.
Sin seales intermedias
La misma arquitectura anterior se puede especificar prescindiento de las seales
intermedias, que recuerde que las pusimos en el ejemplo anterior ms que por su
necesidad, por mostrar cmo se declaraban y usaban.
1
2
3
4
4.4.1.
Descripcin estructural
port (
a, b : in std_logic ;
s
: out std_logic );
77
-- Entradas
-- Salida
end PuertaAnd ;
architecture behavioural of PuertaAnd is
begin
-- behavioural
s <= a and b;
end behavioural ;
Como puede observar no hay nada nuevo en esta descripcin. En cambio, la descripcin del circuito de alarma es ahora totalmente distinta, al usarse una descripcin
estructural para instanciar las dos puertas AND descritas en el bloque anterior. El
archivo CircuitoAlarma2.vhd queda:
1
2
3
4
5
6
library IEEE;
use IEEE. std_logic_1164 .all;
7
8
entity CircuitoAlarma2 is
9
10
11
12
13
14
port (
conexion
puerta
ventana
alarma
:
:
:
:
in
in
in
out
std_logic ;
std_logic ;
std_logic ;
std_logic );
15
16
------
end CircuitoAlarma2 ;
17
18
19
20
21
22
23
24
25
26
78
27
28
29
30
31
32
begin -- structural
i1: PuertaAnd
port map (
a => conexion ,
b => ventana ,
s => P1);
33
34
35
36
37
38
i2: PuertaAnd
port map (
a => conexion ,
b => puerta ,
s => P2);
39
40
41
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 1
4.5.
Las seales y constantes en VHDL han de tener un tipo de datos asociado. Este
tipo de datos define el rango de valores vlidos, el conjunto de operadores que se
pueden aplicar a los datos, etc.
Por otro lado el VHDL es un lenguaje de tipado fuerte, lo cual es una manera
educada de decir que si intentamos asignar un tipo de dato a otro distinto el compilador nos mandar a paseo. No obstante no se preocupe, que existen funciones de
conversin entre tipos.
En VHDL existen tipos de datos predefinidos por el lenguaje y tipos definidos
por el usuario. De stos ltimos, algunos como el std_logic han sido definidos por
organizaciones de estandarizacin como el IEEE y son ampliamente usados en la
industria.
79
aremos para generar retardos en los testbench. Tambin es usado por los
fabricantes para especificar los retardos de los circuitos para que se puedan
realizar las simulaciones temporales.
boolean. Almacena el resultado de una operacin lgica, que puede ser true
o false.
severity_level. Se usa en para dar avisos en simulacin.
string. Es una cadena de caracteres.
real. Almacena un nmero en coma flotante.
bit. Como su propio nombre indica, almacena un bit que puede tomar los
valores 0 y 1. No ha de usarse en la prctica, siendo mejor usar std_logic.
bit_vector. Es un vector de datos de tipo bit. Tampoco debe de usarse en
la prctica, siendo recomendable usar std_logic_vector en su lugar.
Tipos de datos definidos por el usuario
Los tipos definidos por el usuario ms usados en la prctica son std_logic y
std_logic_vector, que como habr supuesto no es ms que un vector de std_logic.
Ambos estn definidos en el paquete std_logic_1164 de la librera ieee. Estos
tipos, al contrario de bit definen una lgica de 9 valores para describir el estado de
las seales. 9 valores! estar pensando. Pero si en digital slo hay ceros y unos!
Si, es cierto, pero no todos los ceros y los unos son iguales. Los nueve valores que
define std_logic son:
U Sin inicializar.
X Valor desconocido. Es imposible calcular el valor de la seal.
0 El cero lgico.
1 El uno lgico.
Z Alta impedancia.
W Desconocido dbil.
L Cero dbil.
H Uno dbil.
- dont care.
80
Sin entrar en demasiados detalles (ya los iremos viendo a lo largo del texto), estos
valores permiten simulaciones ms acordes con la realidad. Por ejemplo, cuando
arranca la simulacin, el simulador pone todas las seales a U, de forma que si
hacemos por ejemplo una OR entre una seal a 0 y una sin inicializar, la salida se
pone tambin a U. As, si metemos la pata nos daremos cuenta en seguida porque
se nos llenar la pantalla del simulador de UUUU. Si en cambio hubisemos usado
seales de tipo bit, como slo puede valer 0 o 1, el simulador no puede decirnos
que estamos haciendo algo mal y nos daremos cuenta cuando sea demasiado tarde.
Otro caso tpico es cortocircuitar dos salidas. En este caso si en la simulacin una
de ellas est a uno y otra a cero, es imposible saber el valor de la seal, por lo que
el simulador la pondr a X.
Definicin de tipos
Si lo necesitamos, podemos crear un tipo usando la siguiente sintaxis:
4.5.1.
Constantes
4.5.2.
81
Vectores
En VHDL, al igual que en todos los lenguajes, tambin se pueden crear vectores.
stos son tambin tipos derivados, y al contrario que otros lenguajes como C, antes
de crear un vector es necesario crear un tipo. La sintaxis bsica es:
82
+
*
/
mod
rem
abs
**
Aritmticos
suma
resta
multiplicacin
divisin
mdulo
resto
valor absoluto
exponenciacin
Lgicos
and
or
not
nand
nor
xor
xnor
>
<
=
/=
<=
>=
Relacionales
mayor
menor
igual
distinto
mayor o igual
menor o igual
4.5.3.
Operadores
El lenguaje define una serie de operadores sobre los tipos predefinidos, los cuales
se listan en el cuadro 4.1.
Los operadores aritmticos estn predefinidos para los tipos integer, real9 y
time. Los operadores lgicos estn definidos para los tipos bit y std_logic. Por ltimo, los operadores relacionales estn definidos para integer, std_logic_vector
y bit_vector. El resultado de estos operadores es un valor de tipo boolean que
slo puede ser usado en expresiones condicionales, como veremos a continuacin.
Por ltimo, sobre los vectores se define el operador concatenacin &. As, la
expresin "01"& 1 & "010" es equivalente a "011010".
4.6.
Sentencias concurrentes
En VHDL existen dos tipos de sentencias que permiten asignar valores a seales
en funcin de una expresin lgica o de un valor. La primera es la sentencia when,
que la hemos usado ya en el ejemplo del multiplexor. La segunda es la sentencia
with, que nos ser muy til para implantar tablas de verdad.
4.6.1.
Sentencia when
Excluyendo
83
2
3
4
library ieee;
use ieee. std_logic_1164 .all;
5
6
entity Comparador2Bits is
7
8
9
10
11
12
port (
a, b
a_mayor_b
a_menor_b
a_igual_b
:
:
:
:
in
out
out
out
13
14
end Comparador2Bits ;
15
16
17
18
begin
-- behavioral
19
20
21
22
23
24
25
26
27
end behavioral ;
Como puede apreciar se ha utilizado la sentencia when para poner a uno las
salidas del comparador cuando sus respectivas comparaciones son ciertas y a cero
en caso contrario.
4.6.2.
Sentencia with
84
A1 A0 B1 B0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
a_mayor_b
a_menor_b
a_igual_b
0
0
0
0
1
0
0
0
1
1
0
0
1
1
1
0
0
1
1
1
0
0
1
1
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
3
4
5
library ieee;
use ieee. std_logic_1164 .all;
6
7
entity Comparador2BitsT is
8
9
10
11
12
13
port (
a, b
a_mayor_b
a_menor_b
a_igual_b
:
:
:
:
in
out
out
out
85
14
15
end Comparador2BitsT ;
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
end behavioral ;
Para facilitar la escritura de la tabla se han agrupado las entradas en un solo
vector usando el operador &, tal como puede apreciar en la lnea 24. Una vez hecho
esto, son la sentencia with se asigna un valor a la seal salidas en funcin del
valor de las entradas segn la tabla de verdad. En las lneas 25 a 27 este vector
salidas se asigna a cada una de las salidas individuales del comparador.
86
4.7.
Ejercicios
Captulo 5
Circuitos Aritmticos
5.1.
Sumador de un bit
5.1.1.
Semisumador
ab
ab+ab =ab
88
Circuitos Aritmticos
a+b
0 0
0 1
1 0
1 1
c
0
0
0
1
s
0
1
1
0
ci + ai + bi
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
ci +1
0
0
0
1
0
1
1
1
si
0
1
1
0
1
0
0
1
5.1.2.
Sumador completo
(5.1)
(5.2)
Este circuito se puede construir a partir de dos semisumadores y una puerta OR,
tal como se muestra en la izquierda de la figura 5.2. El primer semisumador calcula
la suma de ai + bi y el segundo le suma al resultado anterior el bit ci . En la derecha
de la figura se muestra una representacin del bloque, ya que lo usaremos para
construir sumadores de n bits en la siguiente seccin.
5 Circuitos Aritmticos
89
5.2.
Para realizar la suma de dos palabras de n bits basta con usar n sumadores completos como el estudiado en la seccin anterior. Existen dos mtodos para gestionar
los acarreos: acarreo serie, que es fcil de construir pero lento y con prediccin de
acarreo, que es ms rpido pero necesita ms lgica.
5.2.1.
Los sumadores con acarreo serie son los ms fciles de construir y de entender. Estos sumadores gestionan los acarreos de la misma forma que lo hacemos
nosotros cuando realizamos la suma con lpiz y papel. El acarreo correspondiente
al bit menos significativo es cero y el resto de bits toman como acarreo de entrada
el acarreo salida de la etapa anterior. El circuito resultante es el mostrado en la
figura 5.3, donde se muestra un sumador para nmeros de 4 bits. Tenga en cuenta
que el acarreo de salida c4 , aunque parezca intil, sirve para averiguar si se ha
producido un desbordamiento en la suma, tal como se estudi en el captulo 3.
Ntese que ampliar este sumador a un nmero mayor de bits es bien simple:
basta con aadir tantos sumadores como bits nos hagan falta y conectar los acarreos
90
Circuitos Aritmticos
en serie.
Retardo en la salida
A pesar de su gran sencillez, el sumador con acarreo serie presenta un grave
inconveniente: es muy lento, ya que la suma slo ser vlida cuando el acarreo se
haya propagado por todas las etapas. Por ejemplo si realiza la suma:
1 1 1
1111
+
0001
10000
notar que el acarreo generado al sumar los dos bits menos significativos ha de
propagarse por el resto de los bits hasta llegar al final. En general, para un sumador
de n etapas, si suponemos que todos los bits de los datos a y b llegan a la vez a las
entradas, el retardo en realizar la suma ser:
tsuma = ta0 b0 c1 + (n 1) tci ci +i
En donde ta0 b0 c1 es el retardo desde las entradas del sumador para los bits menos
significativos hasta la salida de acarreo de dicho sumador y tci ci +i es el retardo entre
la entrada de acarreo de un sumador intermedio hasta su salida de acarreo.
Descripcin en VHDL
La descripcin de un sumador de n bits en VHDL puede hacerse de forma estructural usando en primer lugar un bloque para implementar el sumador completo
de un bit y a continuacin crear un bloque que instancie n sumadores de un bit
conectando los acarreos en serie. La descripcin del sumador de un bit se realiza a
partir de las ecuaciones (5.1) y (5.2).
1
2
3
4
5
library ieee;
use ieee. std_logic_1164 .all;
6
7
entity Sumador1Bit is
8
9
10
11
12
13
14
port (
a_i , b_i
c_i
s_i
c_i_mas_1
:
:
:
:
in
in
out
out
std_logic ;
std_logic ;
std_logic ;
std_logic );
-----
Entradas de datos
Acarreo de entrada
Salida
Acarreo de salida
91
5 Circuitos Aritmticos
15
end Sumador1Bit ;
16
17
18
19
begin
-- behavioral
20
21
22
s_i
<= c_i xor (a_i xor b_i );
c_i_mas_1 <= (a_i and b_i) or (( a_i xor b_i) and c_i );
23
24
end behavioral ;
Lo nico que hay que destacar del cdigo ha sido la necesidad de aadir parntesis en la lnea 22, ya que la precedencia de los operadores lgicos en VHDL para
el tipo std_logic no est definida.
El sumador de 4 bits se crea instanciando cuatro sumadores de 1 bit y conectando sus acarreos en serie, tal como se ha mostrado en la figura 5.3. Adems el acarreo
del bit cero se conecta a 0 y el acarreo de la ltima etapa se deja como salida para
poder detectar el desbordamiento en la suma de nmeros sin signo.
La sentencia for ... generate
Igual est temblando ante la idea de tener que instanciar cuatro componentes
directamente en VHDL, pero no se preocupe, que afortunadamente no vamos a
tener que teclear tanto, sobre todo cuando tengamos que crear un sumador de 32
bits. Por suerte los diseadores del lenguaje pensaron en una manera de instanciar
varias veces el mismo componente mediante la sentencia for ... generate. Por
tanto antes de estudiar cmo implantar el sumador vamos a ver la sintaxis de dicha
sentencia:
3 downto 0.
92
Circuitos Aritmticos
4
5
6
library ieee;
use ieee. std_logic_1164 .all;
7
8
entity Sumador4Bits is
9
10
11
12
13
port (
a, b : in std_logic_vector (3 downto 0); -- Entradas
s
: out std_logic_vector (3 downto 0); -- Salida
c_out : out std_logic );
-- Acarreo de salida
14
15
end Sumador4Bits ;
16
17
18
19
20
21
22
23
24
25
26
27
-- Acarreos
-- intermedios
component Sumador1Bit
port (
a_i , b_i : in std_logic ;
c_i
: in std_logic ;
s_i
: out std_logic ;
c_i_mas_1 : out std_logic );
end component ;
begin -- structural
28
29
30
c(0) <= 0;
c_out <= c(4);
31
32
33
34
35
36
37
5 Circuitos Aritmticos
38
39
40
41
93
c_i
=> c(i),
s_i
=> s(i),
c_i_mas_1 => c(i+1));
end generate GenSum ;
42
43
end structural ;
En primer lugar conviene destacar que en la lnea 18 se han creado cuatro
seales para los cuatro acarreos que necesita el circuito. A continuacin se declara el
componente y se pasa a describir la arquitectura. En sta, en primer lugar (lneas 29
y 30) se pone el acarreo inicial c(0) a cero y se conecta el final c(4) a la salida de
acarreo c_out.
Para instanciar los cuatro sumadores se ha usado un bucle for ... generate
en el que se usa i como variable de control y se la hace variar de 0 a 3. Para cada
valor de la variable, se genera un sumador de un bit al que se conectan las seales
a(i), b(i), etc. Lo nico destacable es que en la lnea 40 se ha conectado la salida
de acarreo del sumador a la seal de acarreo de entrada del siguiente, que no es
otra que c(i+1). As, en la primera iteracin del bucle (i=0), el componente que se
instancia sera:
Sumador1Bit_1
port map (
a_i
b_i
c_i
s_i
c_i_mas_1
: Sumador1Bit
=>
=>
=>
=>
=>
a(0),
b(0),
c(0),
s(0),
c(1));
Por si no se cree que esto funciona, en la figura 5.4 se muestra en circuito generado por el sintetizador del entorno Quartus II. El retardo obtenido en la simulacin
ha sido de 14,002 ns.
5.2.2.
Para evitar el excesivo retardo de la propagacin del acarreo en el sumador anterior existe una alternativa que permite calcular los acarreos de todos los sumadores
94
Circuitos Aritmticos
de un bit en paralelo. Para realizar este clculo recordemos que la ecuacin del
acarreo obtenida en la seccin 5.1.2 es:
ci +1 = ai bi + (ai bi ) ci
Si nos fijamos en la ecuacin, vemos que cuando el trmino ai bi es 1 se produce
siempre un acarreo de salida. Decimos entonces que ai bi genera un acarreo en
la etapa i y a esta expresin la denominamos gi . Por otro lado, el trmino ai bi
produce un acarreo en la salida slo si ci es uno, es decir, si hay un acarreo en la
entrada. Decimos entonces que el trmino ai bi propaga el acarreo en la etapa i y lo
denominamos pi . Teniendo esto en cuenta, la ecuacin anterior la podemos escribir
como:
ci +1 = gi + pi ci
A partir de esta ecuacin el clculo de los acarreos para cada bit es sencillo. Si por
ejemplo tenemos un sumador de cuatro bits, las ecuaciones de los acarreos de cada
etapa sern:
c1
g0 + p0 c0
(5.3)
c2
g1 + p1 c1
(5.4)
c3
g2 + p2 c2
(5.5)
c4
g3 + p3 c3
(5.6)
Hasta ahora no hemos conseguido nada, porque en estas ecuaciones se sigue usando el acarreo de la etapa anterior para el clculo de la siguiente. No obstante, si
sustituimos la ecuacin (5.3) en la ecuacin (5.4) obtenemos:
c2 = g1 + p1 (g0 + p0 c0 ) = g1 + p1 g0 + p1 p0 c0
(5.7)
Esta ecuacin puede leerse como: habr acarreo hacia la etapa 2 si o bien en la
etapa 1 se ha generado un acarreo (g1 ) o si la etapa 1 ha propagado un acarreo y la
etapa 0 lo ha generado (p1 g0 ) o si las etapas 1 y 0 lo han propagado y haba un
acarreo a la entrada de la etapa 0 (p1 p0 c0 ).
Repitiendo el proceso para la etapa siguiente, si sustituimos la expresin de c2
que acabamos de obtener en la ecuacin (5.5) obtenemos:
c3 = g2 + p2 c2 = g2 + p2 (g1 + p1 g0 + p1 p0 c0 ) = g2 + p2 g1 + p2 p1 g0 + p2 p1 p0 c0 (5.8)
Por si no se ha dado cuenta, aparece un patrn comn en las ecuaciones, que
seguro que si obtenemos la siguiente lo ve ms claro. Repitiendo el proceso para la
siguiente etapa se obtiene:
c4 = g3 + p3 g2 + p3 p2 g1 + p3 p2 p1 g0 + p3 p2 p1 p0 c0
(5.9)
5 Circuitos Aritmticos
95
g0 + p0 c0
c2
g1 + p1 g0 + p1 p0 c0
c3
g2 + p2 g1 + p2 p1 g0 + p2 p1 p0 c0
c4
g3 + p3 g2 + p3 p2 g1 + p3 p2 p1 g0 + p3 p2 p1 p0 c0
96
Circuitos Aritmticos
Descripcin en VHDL
La descripcin del sumador con prediccin de acarreo es simular a la realizada
para el sumador con acarreo serie. En primer lugar se describe el sumador de un
bit, que es muy similar al usado para el sumador anterior, con la salvedad de que
en lugar de generar un acarreo de salida ci +1 calcula las seales de generacin y
propagacin de acarreo gi y pi .
1
2
3
4
5
6
library ieee;
use ieee. std_logic_1164 .all;
7
8
entity Sumador1BitPG is
9
10
11
12
13
14
port (
a_i , b_i : in std_logic ;
c_i
: in std_logic ;
s_i
: out std_logic ;
p_i , g_i : out std_logic );
-----
Entradas de datos
Acarreo de entrada
Salida
Pred y Gen de Acarreo
15
16
end Sumador1BitPG ;
17
18
19
20
begin
-- behavioral
21
22
23
24
25
26
end behavioral ;
Ntese que en la lnea 23 aparece repetido el trmino a_i xor b_i. Esto no
genera un circuito ineficiente porque el sintetizador se encarga de detectar este tipo
de situaciones y genera la lgica adecuada, tal como se demuestra en la figura 5.6.
Si no se queda tranquilo se puede declarar una variable para almacenar este
valor intermedio, ya que en VHDL no se puede leer el valor de una salida. En este
caso el cdigo de la arquitectura quedara:
5 Circuitos Aritmticos
97
2
3
4
library ieee;
use ieee. std_logic_1164 .all;
5
6
entity CarryLookAhead is
7
8
9
10
11
12
13
port (
-- Entradas de propagacin y generacin
g, p : in std_logic_vector (3 downto 0);
c_0 : in std_logic ;
-- Acarreo de entrada
-- Acarreos de salida
c
: out std_logic_vector (4 downto 1));
14
15
end CarryLookAhead ;
16
17
18
19
20
begin
-- behavioral
98
21
22
23
24
25
26
27
Circuitos Aritmticos
c_0 );
g(0)) or
g(1)) or
and p(0)
g(2)) or
and p(1)
and p(1)
28
29
end behavioral ;
Por ltimo, el sumador de cuatro bits es muy parecido al anterior. Lo nico
que cambia ahora es la presencia de las seales de generacin y propagacin y la
instanciacin del componente CarryLookAhead para la prediccin de los acarreos.
1
2
3
4
5
6
library ieee;
use ieee. std_logic_1164 .all;
7
8
entity Sumador4BitsPA is
9
10
11
12
13
port (
a, b : in std_logic_vector (3 downto 0); -- Entradas
s
: out std_logic_vector (3 downto 0); -- Salida
c_out : out std_logic );
-- Acarreo de salida
14
15
end Sumador4BitsPA ;
16
17
18
19
20
21
22
23
24
25
26
27
28
29
component Sumador1BitPG
port (
a_i , b_i : in std_logic ;
c_i
: in std_logic ;
s_i
: out std_logic ;
p_i , g_i : out std_logic );
end component ;
30
31
component CarryLookAhead
5 Circuitos Aritmticos
32
33
34
35
36
99
port (
g, p : in std_logic_vector (3 downto 0);
c_0 : in std_logic ;
c
: out std_logic_vector (4 downto 1));
end component ;
37
38
begin
-- structural
39
40
41
c(0) <= 0;
c_out <= c(4);
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
end structural ;
5.2.3.
100
Circuitos Aritmticos
Figura 5.7: Circuito sumador de 4 bits con propagacin de acarreo generado por
Quartus II.
darle el valor que necesitemos, creando as un componente adaptado a cada momento. Para ilustrar el uso de esta funcionalidad del VHDL vamos a disear un
sumador con propagacin de acarreo con un nmero genrico de bits.
La sentencia generic
Al definir el interfaz de un componente se puede incluir adems de las definiciones de puertos, las definiciones de parmetros (generic). En la seccin 4.3.1 se
mostr la sintaxis para definir la interfaz del bloque, aunque no se entr en detalle
sobre los genricos. La sintaxis incluyendo dichos genricos es:
entity NombreDeEntidad is
[ generic (
parametro_1 : tipo := valor_por_defecto ;
parametro_2 : tipo := valor_por_defecto ;
parametro_n : tipo := valor_por_defecto ); ]
port ( nombres de seales : modo tipo;
nombres de seales : modo tipo;
5 Circuitos Aritmticos
101
4
5
6
library ieee;
use ieee. std_logic_1164 .all;
7
8
9
10
11
12
13
14
entity SumadorNBits is
generic (
g_data_w : integer := 4);
-- N bits de los datos
port (
a, b : in std_logic_vector (g_data_w -1 downto 0);
s
: out std_logic_vector (g_data_w -1 downto 0);
c_out : out std_logic );
-- Acarreo de salida
15
16
end SumadorNBits ;
17
18
19
20
21
22
23
24
25
26
27
28
component Sumador1Bit
port (
a_i , b_i : in std_logic ;
c_i
: in std_logic ;
s_i
: out std_logic ;
c_i_mas_1 : out std_logic );
end component ;
102
Circuitos Aritmticos
29
30
begin
-- structural
31
32
33
c(0) <= 0;
-- El acarreo inicial es cero
c_out <= c( g_data_w ); -- y el final c( g_data_w )
34
35
36
37
38
39
40
41
42
43
44
45
46
47
end structural ;
En primer lugar destacar que el genrico creado se ha inicializado al valor por
defecto de 4. As, si al instanciar el componente no decimos nada, se crear el mismo
componente descrito en la seccin anterior. Por otro lado, si compara este sumador
con el de 4 bits, ver que lo nico que hemos hecho es sustituir el 3 de los ndices
de los vectores y el rango del for por g_data_w-1 y el 4 de la salida del acarreo
(lnea 33) por g_data_w. El resto de la descripcin es exactamente igual.
Para instanciar el componente, lo nico que hay que hacer es incluir una sentencia generic map en la que se especifica el valor que queremos darle al genrico.
As, para instanciar un sumador de 8 bits bastara con declararlo e instanciarlo, tal
como se muestra a continuacin:
-- structural
5 Circuitos Aritmticos
103
Figura 5.8: Sumador de 32 bits usando un componente genrico con Quartus II.
SumadorNBits_1 : SumadorNBits
generic map (
g_data_w => 7)
port map (
a
=> a,
b
=> b,
s
=> s,
c_out => c_out );
end structural ;
Si en lugar de instanciarlo en una descripcin VHDL desea incluir el componente
en un esquema, los entornos CAD permiten tambin instanciar estos componentes y
nos dejan cambiar fcilmente el parmetro. Por ejemplo, en la figura 5.8 se muestra
un ejemplo en Quartus II en el que se ha creado un sumador de 32 bits usando este
componente genrico.
5.2.4.
Dado que el sumador es un componente fundamental en los sistemas digitales, los sintetizadores de VHDL permiten generar sumadores mucho ms fcilmente de lo que hemos visto en esta seccin. Por ello, aunque el VHDL nativo
slo soporta la suma para los tipos enteros y reales, se ha desarrollado el paquete
ieee.numeric_std que define los tipos signed y unsigned sobre los que si es posible usar el operador de suma. Ambos tipos son tambin vectores cuyos elementos
son std_logic, pero con la ventaja de que el operador suma est definido para
ellos. Adems de estos tipos se definen en el mismo paquete funciones para convertir entre std_logic_vector y los tipos signed y unsigned. Tambin se pueden
definir seales (o puertos) de este tipo siendo la sintaxis la misma que para un
std_logic_vector:
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 1
104
Circuitos Aritmticos
Funciones de conversin
Para convertir una seal del tipo std_logic_vector a signed o unsigned y
viceversa existen las funciones:
5 Circuitos Aritmticos
105
4
5
6
7
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
8
9
10
11
12
13
entity Sumador4BitsAN is
port (
a, b : in std_logic_vector (3 downto 0); -- Entradas
s
: out std_logic_vector (3 downto 0); -- Salida
c_out : out std_logic );
-- Acarreo de salida
14
15
end Sumador4BitsAN ;
16
17
18
19
20
21
22
23
106
Circuitos Aritmticos
Vcc
Desborde
24
25
int main(void)
{
printf("Hola\n");
return 0;
}
end behavioral ;
En primer lugar destacar que se ha creado una seal de tipo unsigned para
almacenar el resultado de la suma en 5 bits y as poder obtener el acarreo. A continuacin se ha procedido a aadir un cero como bit ms significativo a los datos de
entrada a y b y a convertirlos al tipo unsigned antes de sumarlos. Con ello se realiza
la suma con 5 bits. Una vez realizada la suma, se procede a copiar los 4 bits menos
significativos a la salida, convirtindolos previamente a std_logic_vector para que
el compilador no se queje. Por ltimo se copia el bit ms significativo al acarreo de
salida. Dado que el tipo unsigned no es ms que un vector de std_logic, al obtener
un elemento del vector obtenemos un std_logic y por tanto no es necesario realizar
ninguna conversin para asignarlo a c_out.
Realice el ejercicio 2
5.3.
Restador de n bits
5 Circuitos Aritmticos
107
s/r
Desborde
dos bits ms significativos es distinto, tal como se expuso en la seccin 3.9.2. Para
detectar esta situacin se usa una puerta XOR.
5.4.
int main(void)
{
printf("Hola\n");
return 0;
}
Sumador/Restador de n bits
En un ordenador es necesario tanto hacer sumas como restas, pero como stas
no se hacen al mismo tiempo, podemos aprovechar un mismo circuito para que
pueda hacer ambas operaciones en funcin de una seal de control. Para ello en
primer lugar tenemos que conseguir que el nmero b pueda pasar al sumador
invertido o sin invertir. Si recordamos la tabla de verdad de la puerta XOR:
i
0
0
1
1
b
0
1
0
1
s
0
1
1
0
podemos ver que cuando la entrada i vale cero, la salida s coincide con la entrada b,
pero cuando i es igual a uno, la salida s es igual a la entrada b invertida. Teniendo
esto en cuenta podemos usar una puerta XOR en lugar de un inversor para poder
invertir o no la entrada b del sumador/restador en funcin de la operacin que
se desee hacer. Esto es lo que se ha hecho en la figura 5.10, donde como puede
apreciar una entrada de las XOR se ha conectado a una seal de control a la que
se ha denominado s/r. As, cuando esta seal sea cero la entrada b no se invertir
y cuando sea uno se invertir.2
Para obtener el complemento a dos de b, adems de invertir todos sus bits,
hemos de sumar uno. Para ello, tal como hemos realizado en la seccin anterior
2
La notacin usada para la seal s/r es muy comn en los sistemas digitales. Cuando una
seal de control tiene dos acciones asociadas en funcin de su valor, el nombre de la seal consta
de dos smbolos separados por / y al smbolo que representa la funcin realizada cuando la seal
vale cero se le pone una lnea encima. En este caso el nombre s/r nos recuerda que el circuito
realiza una suma cuando esta seal vale cero y una resta cuando vale 1.
108
int main(void)
{
printf("Hola\n");
return 0;
}
Circuitos Aritmticos
basta con poner a uno la entrada c0 del sumador; lo cual se consigue conectando la
seal de control s/r a c0 , ya que sta vale uno cuando queramos restar.
En definitiva, el circuito mostrado en la figura 5.10 realiza la operacin a + b + 0
cuando la entrada de control s/r = 0 y la operacin a + b + 1 = a b cuando s/r = 1.
5.5.
Multiplicadores
(pp0 )
(pp1 )
(pp2 )
(pp3 )
+
p7
a3 b3
p6
a3 b2
a2 b3
p5
a3 b1
a2 b2
a1 b3
p4
a3
b3
a3 b0
a2 b1
a1 b2
a0 b3
p3
a2
b2
a 2 b0
a 1 b1
a 0 b2
a1
b1
a1 b0
a0 b1
a0
b0
a 0 b0
p2
p1
p0
Ntese que cada producto parcial ppi se calcula como la AND entre el multiplicando
y el bit i del multiplicador. Para obtener el producto final p es necesario sumar los
cuatro productos parciales. Todas estas operaciones se pueden realizar con una
matriz de sumadores y de puertas AND, tal como se muestra en la figura 5.11. En
dicha figura, la primera fila de puertas calcula el producto parcial pp0 , la segunda el
producto parcial pp1 y as sucesivamente. El primer sumador calcula la suma entre
los dos primeros productos parciales, es decir realiza pp0 + pp1 . El resultado de esta
operacin se suma al producto parcial pp2 en el segundo sumador y as sucesivamente. Fjese que el acarreo de salida de cada sumador es necesario sumarlo al
ltimo bit del sumador siguiente.
5.5.1.
Descripcin en VHDL
109
5 Circuitos Aritmticos
(pp0 )
(pp1 )
(pp2 )
(pp3 )
0
0
0
0
p7
0
0
0
a3 b3
p6
0
0
a3 b2
a2 b3
p5
x
0
a3 b1
a2 b2
a1 b3
p4
a3
b3
a3 b0
a2 b1
a1 b2
a0 b3
p3
a2
b2
a2 b0
a1 b1
a0 b2
0
p2
a1
b1
a1 b0
a0 b1
0
0
p1
a0
b0
a0 b0
0
0
0
p0
3
4
5
6
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
7
8
entity Multipl4BitsBr is
9
10
11
port (
a, b : in
-- Entradas
110
12
Circuitos Aritmticos
-- Salida
13
14
end Multipl4BitsBr ;
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
end behavioral ;
Como puede observar se han creado cuatro seales de tipo unsigned para almacenar los productos parciales. Lo nico a destacar es que cuando aadimos slo
un cero, al ser una seal del tipo std_logic hay que encerrarlo entre comillas simples. En cambio, cuando hemos aadido varios bits, al ser un vector, es necesario
encerrarlo entre comillas dobles.
Por ltimo, destacar cmo se ha realizado la suma:
5.5.2.
111
5 Circuitos Aritmticos
cador de la seccin anterior usando bucles para crear dichos productos parciales;
tal como se muestra a continuacin:
1
2
3
4
5
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
6
7
entity Multipl4Bits is
8
9
10
11
port (
a, b : in std_logic_vector (3 downto 0);
p
: out std_logic_vector (7 downto 0));
-- Entradas
-- Salida
12
13
end Multipl4Bits ;
14
15
16
112
17
18
Circuitos Aritmticos
signal pp : t_vec_uns ;
begin -- behavioral
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
end behavioral ;
Lo primero a destacar del cdigo anterior es la creacin de un vector de unsigned
para almacenar los productos parciales. Para ello, tal como se mostr en la seccin 4.5.2, en primer lugar es necesario definir un tipo y es lo que se ha realizado
en la lnea 16; en donde se ha creado un tipo para albergar vectores de 4 elementos
de unsigned de 8 bits. En la lnea siguiente se ha creado una variable de este tipo
a la que se ha denominado pp.
Para generar los productos parciales se han usado varios bucles anidados. El
primero genera el producto parcial pp(i) y dentro de este bucle tenemos otros tres.
El primero, con etiqueta b1, genera los ceros en la parte menos significativa del
producto parcial. El bucle b2 genera los bits del producto parcial que no son cero
(a0 b0 , a1 b0 , etc) y el ltimo bucle (b3 genera los ceros en la parte ms significativa
del producto parcial.
Por ltimo, la suma final de los productos parciales se ha realizado igual que
antes.
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 7
5.5.3.
Al igual que con la suma, los tipos signed y unsigned soportan la operacin de
multiplicacin, con lo que la descripcin se simplifica en gran manera:
1
2
3
4
5
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
113
5 Circuitos Aritmticos
6
7
entity Multipl4BitsAN is
8
9
10
11
port (
a, b : in std_logic_vector (3 downto 0);
p
: out std_logic_vector (7 downto 0));
-- Entradas
-- Salida
12
13
end Multipl4BitsAN ;
14
15
16
17
18
19
20
end behavioral ;
5.6.
114
Circuitos Aritmticos
d3
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
d2
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
d1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
d0
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
I
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
00
01
11
10
00
00
01
03
02
01
04
05
07
06
11
1 12 1 13 1 15 1 14
10
08
09
Sumador Binario
Sumador Binario
Sumador BCD
1 11 1 10
115
5 Circuitos Aritmticos
Sumador BCD
1 Dgito
Sumador BCD
1 Dgito
Sumador BCD
1 Dgito
Sumador BCD
1 Dgito
5.7.
Ejercicios
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 8
116
Circuitos Aritmticos
Captulo 6
Bloques Combinacionales
6.1.
Multiplexor
Un multiplexor permite elegir cul de las varias entradas de datos de que dispone
se copia a su salida, todo ello en funcin de una serie de entradas de control.
Un multiplexor dispone de n entradas de control, 2n entradas de datos y una
nica salida. A modo de ejemplo, en la figura 6.1 se muestra un multiplexor de 4 a
1, es decir, un multiplexor con 4 entradas de datos denominadas E3, E2, E1 y E0 y
una salida S. Al disponer de 4 entradas de datos, son necesarias log2 n = log2 4 = 2
entradas de control, denominadas C1 y C0.
El funcionamiento del multiplexor es muy simple: el nmero binario formado
por las entradas de control (C1 C0 en el ejemplo de la figura 6.1) indica el nmero
de la entrada que se conecta a la salida. As, si en el circuito de la figura 6.1 C1=1 y
C0=0, como el nmero binario formado es un dos, la salida tomar el mismo valor
que la entrada E2.
E0
E1
S
E2
E3
C0
C1
118
Bloques Combinacionales
C1
0
0
0
0
1
1
1
1
C0
0
0
1
1
0
0
1
1
E3
x
x
x
x
x
x
0
1
E2
x
x
x
x
0
1
x
x
E1
x
x
0
1
x
x
x
x
E0
0
1
x
x
x
x
x
x
S
0
1
0
1
0
1
0
1
C1
0
0
1
1
C0
0
1
0
1
S
E0
E1
E2
E3
6.1.1.
6.1.2.
Descripcin en VHDL
-- Multiplexor de 4 a 1
119
6 Bloques Combinacionales
E0
E0
E1
E1
E0
2
E1
E2
E2
E2
2
E3
E3
C0
C1
C0
C1
E3
C0
C1
3
4
library ieee;
use ieee. std_logic_1164 .all;
5
6
entity Mux4a1 is
7
8
9
port (
e3 , e2 , e1 , e0 : in
10
11
12
sel
s
13
14
end Mux4a1 ;
15
16
17
18
begin
-- behavioral
19
20
21
22
23
24
25
26
27
28
end behavioral ;
Si queremos describir un multiplexor de ms entradas basta con tomar como
modelo la descripcin anterior, teniendo en cuenta la relacin entre las n entradas de
control y las 2n entradas de datos. Por otro lado, si se desea describir un multiplexor
para entradas de varios bits, basta con cambiar las seales de datos y la salida de
std_logic a std_logic_vector.
int main(void)
{
printf("Hola\n");
return 0;
}
120
Bloques Combinacionales
C1
0
0
1
1
C0
0
1
0
1
S3
0
0
0
E
S2
0
0
E
0
S1
0
E
0
0
(b) Smbolo
S0
E
0
0
0
S0
S1
E
S2
C1
S3
C0
6.2.
Demultiplexores
Como su propio nombre indica, el demultiplexor es un circuito con la funcionalidad contraria al multiplexor. El circuito dispone de una entrada de datos, n de
control y 2n salidas, de forma que el valor de la entrada se copia a la salida cuyo
nmero indican las entradas de control. El resto de salidas permanecen a cero.
En la figura 6.3 se muestra la tabla de verdad de un demultiplexor de 1 a 4 y su
smbolo. Como se puede apreciar, cuando la seal de control toma el valor binario
00, la salida S0 toma el valor de la entrada E; cuando la seal de control es 01, es
la salida S1 la que toma el valor de E y as sucesivamente.
A partir de la tabla de verdad es fcil obtener las ecuaciones lgicas de las cuatro
salidas. Como cada salida vale E slo para una fila de la tabla, el valor de la salida
ser el producto entre la entrada E y el minitrmino correspondiente a la fila en la
que aparece dicha entrada:
6.2.1.
S0
C1 C0 E
S1
C1 C0 E
S2
C1 C0 E
S3
C1 C0 E
6 Bloques Combinacionales
6.2.2.
121
Descripcin en VHDL
Al igual que con el multiplexor, aunque el demultiplexor podra describirse mediante las ecuaciones lgicas que acabamos de obtener, existen construcciones en el
lenguaje que facilitan la descripcin. En este caso la ms apropiada es la asignacin
condicional, tal como se muestra en el cdigo siguiente:
1
-- Demultipexor de 1 a 4 de 1 bit
2
3
4
library ieee;
use ieee. std_logic_1164 .all;
5
6
entity DeMux1a4 is
7
8
9
port (
e
: in
-- Entrada de datos
-- Entrada de control
sel : in std_logic_vector (1 downto 0);
s0 , s1 , s2 , s3 : out std_logic );
-- Salidas
10
11
12
std_logic ;
13
14
end DeMux1a4 ;
15
16
17
18
begin
-- behavioral
19
20
21
22
23
24
25
26
27
s0 <= e when
0;
s1 <= e when
0;
s2 <= e when
0;
s3 <= e when
0;
28
29
end behavioral ;
Como puede apreciar, cada salida se asigna a la entrada e solo cuando la entrada
de seleccin sel toma el valor correspondiente a la salida. As, a la salida s0 se le
asigna la entrada e slo cuando la entrada de seleccin sel es igual a "00".
6.3.
Codificadores
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 4
122
Bloques Combinacionales
E3 E2 E1
E0
0
0
0
0
0
0
0
1
0
0
1
0
0
1
0
0
1
0
0
0
Resto combinaciones
(b) Smbolo
S1
0
0
0
1
1
X
S0
0
0
1
0
1
X
E0
E1
S0
E2
S1
E3
E1 E0
11
01
10
E3 E2
00
01
11
10
E3 E2
00
00
01
X3
02
00
00
01
X3
12
01
14
X5
X7
X6
01
04
X5
X7
X6
11
X 12 X 13 X 15 X 14
11
X 12 X 13 X 15 X 14
10
18
10
18
X9
X 11 X 10
S1
X9
X 11 X 10
S0
lgico es que disponga de m = 2n entradas, ya que stos son los nmeros binarios
que se pueden formar con n bits. Se dice entonces que el codificador es completo.
No obstante, tambin se pueden crear codificadores en los que se cumple que el
nmero de entradas m es menor que 2n . En estos casos se dice que el codificador
es incompleto.
Por ejemplo, en la figura 6.4 se muestran la tabla de verdad y el smbolo de un
codificador completo de 4 entradas. En este codificador se ha supuesto que slo
puede estar activa una entrada a la vez, por lo que para simplificar las salidas se
han puesto a dont care en todas las combinaciones de entradas en las que hay
varias de ellas activas, tal como puede apreciarse en la tabla de verdad. A este tipo
de codificadores se les denomina codificadores sin prioridad.
Las ecuaciones lgicas del circuito pueden obtenerse a partir de los diagramas
de Karnaugh. Ntese que al existir un montn de filas en la tabla como dont care
los diagramas estn llenos de X, lo que nos permite crear grupos muy grandes que
dan lugar a ecuaciones muy simples, las cuales son:
S1
E3 + E2
S0
E3 + E1
123
6 Bloques Combinacionales
las salidas estn a X, el resultado es que dicha entrada no influye en el valor de las
salidas. La consecuencia prctica de todo esto es que es imposible saber cundo la
entrada E0 est activa. Para ello se aade a los codificadores una salida denominada I que se pone a 1 cuando todas las entradas estn inactivas. La tabla de verdad
en este caso es:
E3 E2 E1
E0
0
0
0
0
0
0
0
1
0
0
1
0
0
1
0
0
1
0
0
0
Resto combinaciones
S1
0
0
0
1
1
X
S0
0
0
1
0
1
X
I
1
0
0
0
0
0
(6.1)
-- Codificador de 4 entradas
1
Cuando se pone una salida a X (dont care) en una fila de la tabla de verdad lo que queremos
decir realmente es que nos da igual lo que valga la salida para esa combinacin de entradas pues
dicha combinacin no se va a producir nunca. El problema lo tendremos cuando se produzca esta
combinacin de entradas, pues la salida valdr cualquier cosa.
124
Bloques Combinacionales
2
3
4
library ieee;
use ieee. std_logic_1164 .all;
5
6
entity Codificador4Entradas is
7
8
9
10
11
port (
e : in std_logic_vector (3 downto 0);
s : out std_logic_vector (1 downto 0);
i : out std_logic );
-- Entradas
-- Salidas
12
13
end Codificador4Entradas ;
14
15
16
17
begin
-- behavioral
18
19
20
21
22
23
24
25
26
with e
s <=
"00"
"00"
"01"
"10"
"11"
"--"
select
when
when
when
when
when
when
"0000" ,
"0001" ,
"0010" ,
"0100" ,
"1000" ,
others ;
27
28
29
30
31
end behavioral ;
Lo nico destacable de esta descripcin se encuentra en la lnea 26, en la que
se asigna a la salida el valor dont care para el resto de combinaciones de la entrada
e que no se han especificado en las cinco lneas anteriores. Ntese que en VHDL el
valor dont care se representa mediante el smbolo -.
6.3.1.
125
6 Bloques Combinacionales
E3
0
0
0
0
1
E2
0
0
0
1
X
E1
0
0
1
X
X
E0
0
1
X
X
X
(b) Smbolo
S1
0
0
0
1
1
S0
0
0
1
0
1
I
1
0
0
0
0
E0
E1
S0
E2
S1
E3
E1 E0
11
01
10
E3 E2
00
01
11
10
E3 E2
00
00
01
03
02
00
00
01
13
12
01
14
15
17
16
01
04
05
07
06
11
1 12 1 13 1 15 1 14
11
1 12 1 13 1 15 1 14
10
18
10
18
19
1 11 1 10
19
S1
1 11 1 10
S0
E2
0
0
E1
1
1
E0
0
1
S1
0
0
S0
1
1
I
0
0
E3 + E2
S0
E3 + E2 E1
E3 E2 E1 E0
126
Bloques Combinacionales
6.3.2.
descripcin en VHDL
2
3
4
library ieee;
use ieee. std_logic_1164 .all;
5
6
entity Codificador4EntradasPrioMayor is
7
8
9
10
11
port (
e : in std_logic_vector (3 downto 0);
s : out std_logic_vector (1 downto 0);
i : out std_logic );
-- Entradas
-- Salidas
12
13
end Codificador4EntradasPrioMayor ;
14
15
16
17
begin
-- behavioral
18
19
20
21
22
23
e(3)
e(2)
e(1)
e(0)
=
=
=
=
1
1
1
1
else
else
else
else
24
25
26
27
28
end behavioral ;
Como la asignacin condicional mediante when ... else asigna el valor asociado a la primera condicin que se cumpla, la prioridad se gestiona adecuada-
127
6 Bloques Combinacionales
E1
0
0
1
1
E0
0
1
0
1
S3
0
0
0
1
S2
0
0
1
0
(b) Smbolo
S1
0
1
0
0
S0
1
0
0
0
S0
E0
S1
E1
S2
S3
6.4.
int main(void)
{
printf("Hola\n");
return 0;
}
Decodificadores
E1 E0
S1
E1 E0
S2
E1 E0
S3
E1 E0
6.5.
Comparadores
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 7
128
Bloques Combinacionales
a
0
0
1
1
b
0
1
0
1
a_ma_b
a_ma_b_i
0
1
a_ma_b_i
a_ig_b
a_ig_b_i
0
0
a_ig_b_i
(b) Smbolo
a_me_b
a_me_b_i
1
0
a_me_b_i
a
b
a_ma_b_i
a_ig_b_i
a_me_b_i
a_ma_b
a_ig_b
a_me_b
de n cifras. Por ejemplo si nos piden que comparemos el nmero 270 con el 243,
empezamos comparando los dos dgitos ms significativos. Como ambos son iguales,
no podemos sacar an una conclusin, por lo que pasamos a estudiar el siguiente
dgito. En este caso, como el 7 es mayor que el 4 ya podemos decir que el 270
es mayor que el 243, sin necesidad de seguir mirando el resto de los dgitos. Si
comparamos el 273 con el 273, llegaremos al dgito menos significativo sin encontrar
uno mayor que otro, con lo que concluimos que ambos nmeros son iguales.
El proceso anterior se puede realizar tambin para comparar nmeros binarios. As, si nos piden comparar el 1001 con el 1010, empezaremos por el bit ms
significativo y nos daremos cuenta que en ambos nmeros es un uno, por lo que
pasaremos a estudiar el bit 2. Con este bit nos pasar lo mismo, por lo que pasaremos a estudiar el bit 1 y ah nos daremos cuenta que el segundo nmero es mayor
que el primero pues dicho bit 1 vale uno para el 1010 y cero para el 1001.
6.5.1.
Comparador de 1 bit
Para implantar un comparador siguiendo esta tcnica lo primero que necesitamos es un comparador de 1 bit. La tabla de verdad y el smbolo del comparador se
ilustra en la figura 6.9. Como puede observar, el circuito dispone de tres salidas para
indicarnos el resultado de la comparacin: a_ma_b se pondr a 1 cuando la entrada
a sea mayor que b, a_me_b se pondr a 1 cuando la entrada a sea menor que b y
a_ig_b se pondr a 1 cuando ambas entradas sean iguales. Por otro lado, el circuito
dispone de cinco entradas: a y b que son los dos bits que se comparan y a_ma_b_i,
a_ig_b_i y a_me_b_i por las que se introduce el resultado de la comparacin de
los bits menos significativos. Estas entradas, como puede apreciar en la tabla de
verdad slo se usan cuando las entradas a y b son iguales, pues en este caso el
circuito no puede saber el resultado de la comparacin y tiene que preguntrselo
a los comparadores de los bits de menor peso, tal como veremos a continuacin.
Las ecuaciones lgicas del comparador se extraen fcilmente de su tabla de
129
6 Bloques Combinacionales
b(0) a(0)
b(1) a(1)
a
b
a_ma_b
a_ma_b_i
a_ig_b_i
a_me_b_i
a_ig_b
a_me_b
b(2) a(2)
a
b
a_ma_b_i
a_ig_b_i
a_me_b_i
a_ma_b
a_ig_b
a_me_b
b(3) a(3)
a
b
a_ma_b_i
a_ig_b_i
a_me_b_i
a_ma_b
a_ig_b
a_me_b
a
b
a_ma_b_i
a_ig_b_i
a_me_b_i
a_ma_b
a_mayor_b
a_ig_b
a_igual_b
a_me_b
a_menor_b
verdad:
a_ma_b
a_ig_b
a_me_b
6.5.2.
Comparador de n bits
6.5.3.
Descripcin en VHDL
-- Comparador de 1 bit
2
3
4
library ieee;
use ieee. std_logic_1164 .all;
5
6
entity Comparador1Bit is
130
Bloques Combinacionales
7
8
9
10
11
12
13
14
15
port (
a, b
a_ma_b_i
a_ig_b_i
a_me_b_i
a_ma_b
a_ig_b
a_me_b
:
:
:
:
:
:
:
in
in
in
in
out
out
out
std_logic ;
std_logic ;
std_logic ;
std_logic ;
std_logic ;
std_logic ;
std_logic );
-- Entradas
-- Entradas del comparador
-- anterior
-- Salidas
16
17
end Comparador1Bit ;
18
19
20
21
begin
-- behavioral
22
23
24
25
26
27
end behavioral ;
Para crear un comparador de n bits se instancian n comparadores de 1 bit. Para
ello se usa una descripcin estructural en la que mediante un for ... generate
se instancian los n comparadores, de la misma forma que se hizo para el sumador.
As, si queremos crear un comparador de 4 bits como el de la figura, basta con
hacer:
2
3
4
library ieee;
use ieee. std_logic_1164 .all;
5
6
entity Comparador4Bits is
7
8
9
10
11
12
port (
a, b
a_ma_b
a_ig_b
a_me_b
:
:
:
:
in
out
out
out
13
14
end Comparador4Bits ;
15
16
17
6 Bloques Combinacionales
18
19
20
21
22
23
24
25
26
27
28
29
30
31
component Comparador1Bit
port (
a, b
: in std_logic ;
a_ma_b_i : in std_logic ;
a_ig_b_i : in std_logic ;
a_me_b_i : in std_logic ;
a_ma_b
: out std_logic ;
a_ig_b
: out std_logic ;
a_me_b
: out std_logic );
end component ;
32
33
begin
-- structural
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
-- Las
-- del
a_ma_b
a_ig_b
a_me_b
60
61
end structural ;
131
132
Bloques Combinacionales
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 8
1
2
3
4
5
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
6
7
entity Comparador4BitsAN is
8
9
10
11
12
13
port (
a, b
a_ma_b
a_ig_b
a_me_b
:
:
:
:
in
out
out
out
14
15
end Comparador4BitsAN ;
16
17
18
19
begin
-- behavioral
20
21
22
23
24
25
26
27
6 Bloques Combinacionales
6.6.
133
Ejercicios
Captulo 7
7.1.
Introduccin
Los circuitos que se han estudiado hasta ahora tenan como caracterstica fundamental el que las salidas eran una funcin del valor actual de las entradas. Precisamente por esto se les denomina circuitos combinacionales ya que las salidas son
una combinacin de las entradas. En este captulo se estudia otro tipo de circuitos
en los que las salidas dependen no slo del valor actual de las entradas, sino tambin de los valores pasados. A este tipo de circuitos se les denomina secuenciales,
ya que su salida depende de la secuencia de valores que toman las entradas.
Para ilustrar cmo es posible que un circuito dependa del valor anterior de las
entradas nada mejor que ver un ejemplo. En la figura 7.1 se muestra un circuito
secuencial en el que la salida S se ha conectado a una de las entradas de la puerta
OR. En el cronograma de la derecha se puede ver la evolucin temporal del circuito.
Si se supone que la salida S y la entrada E valen cero inicialmente, como 0 + 0 = 0
la salida permanecer a cero mientras la entrada E siga a cero. Cuando E se ponga
a uno, la salida S pasar a valer uno despus del retardo de la puerta y a partir de
ese momento, como E + 1 = 1 la salida permanecer a uno indefinidamente, haga
lo que haga la entrada E.
Como puede apreciar, la salida de este circuito depende no slo del valor actual
de la entrada E, sino de la historia pasada de dicha entrada. As, si la entrada E
nunca ha valido uno, la salida S valdr cero, pero si la entrada E ha tomado alguna
vez el valor uno, la salida S ser igual a uno, independientemente del valor actual
de la entrada E.
E
S
E
S
t
136
E=0
E=0
E=1
Cero
Uno
S=0
S=1
E=1
Ntese que este circuito, al igual que el resto de los circuitos secuenciales, tiene
memoria, que es lo que le permite reaccionar a una secuencia de entradas. En este
caso la memoria no es muy til, ya que se pone a uno y no hay forma de volver a
ponerla a cero; pero en seguida veremos circuitos en los que es posible memorizar
cualquier valor. En cualquier caso hay que destacar que la memoria se consigue
mediante la realimentacin de las salidas. En este circuito se ha realimentado la
salida S a una de las entradas de la puerta OR.
7.2.
Conceptos bsicos
Estado
Un circuito secuencial est en cada momento en un estado u otro en funcin
del valor almacenado en sus elementos de memoria. El paso de un estado a otro
est gobernado por el valor de las entradas del circuito. Adems las salidas tambin
dependen del estado del circuito.
Por ejemplo, en el circuito de la figura 7.1 existen dos estados posibles, uno
al que denominaremos Cero que es el estado inicial del circuito y otro, al que denominaremos Uno que es el estado al que se llega cuando la entrada E se pone a
uno.
Diagrama de estados
El comportamiento de los circuitos secuenciales puede representarse grficamente mediante un diagrama de estados. En estos diagramas cada estado se representa mediante un crculo y las transiciones entre estados mediante flechas. Las
transiciones se activan cuando las entradas del circuito toman un determinado valor, el cual se marca en la flecha. Por ejemplo, en la figura 7.2 se muestra el diagrama
de estados del circuito de la figura 7.1. Normalmente el valor de las salidas del circuito se asocian a estados y se representan en el diagrama dentro del crculo. En el
ejemplo de la figura 7.2 cuando el circuito est en el estado Cero la salida vale cero.
137
Sincronizacin
El circuito mostrado en la figura 7.1 cambia de estado en cuanto lo hace su
entrada. A este tipo de circuitos se les denomina asncronos.
Cuando existen varios elementos de memoria, es preciso que todos cambien de
estado a la vez. Se dice entonces que el circuito es sncrono. En este caso existe
una seal, denominada reloj, que es la que marca los instantes de tiempo en los
que se puede cambiar de estado; es decir, es la que sincroniza el sistema.
Reloj
El reloj no es ms que una seal cuadrada peridica, tal como se muestra en
la figura 7.3. Esta seal est definida por su periodo (o frecuencia) y por su factor
de servicio (duty cycle), definido como el tiempo que permanece el reloj a uno entre
el periodo total, es decir, FS = tH /T . En la prctica los relojes tienen un factor de
servicio del 50 %.
7.3.
Biestables
Asncronos
Sncronos por nivel (latch)
Sncronos por flanco (flip-flop)
Lgica de disparo
RS
JK
RS
JK
D
RS JK D T
138
S
1
0
0
1
R
0
1
0
1
Qt +1
1
0
Qt
0
Qt +1
0
1
Qt
0
Puesta a 1 (Set)
Puesta a 0 (Reset)
Mantenimiento
Prohibido
7.3.1.
Biestable RS asncrono
139
140
Vcc
Vcc
Por ltimo, cuando las dos seales S y R pasan de valer "11" a valer "00" el
funcionamiento del circuito es errneo. En este caso, como ambas salidas estn a
cero, al ponerse simultneamente las dos entradas a cero ambas puertas ven dos
ceros en sus entradas, por lo que despus de su retardo de propagacin pondrn
a 1 sus salidas. En este momento Q y Q pasan a valer 1. Cuando este valor llega
a las entradas de las puertas, ambas decidirn que tienen que poner a cero sus
salidas, pero eso ocurrir despus del tiempo de propagacin. As volveremos al
estado anterior, repitindose el proceso indefinidamente.
Normalmente la oscilacin anterior o no se dar o terminar tarde o temprano,
pues llegar un momento en el que una puerta d su salida un poco antes que la
otra, con lo que ganar la carrera y el circuito se quedar en ese valor. Por ejemplo,
si en el circuito anterior la puerta P1 es ms rpida que la P2 , cuando se desactiven
S y R simultneamente la salida Q se pondr a uno antes que Q, con lo que le habr
ganado la carrera y el biestable se quedar en el estado Q = 0, Q = 1. Obviamente
si la puerta ms rpida es la P2 el resultado ser justo el contrario. Esto presenta
un grave problema, y es que no podemos saber a ciencia cierta qu ocurrir con la
salida del biestable desactivamos ambas entradas simultneamente. Es por ello que
este estado del biestable se le ha denominado prohibido, pues no est permitido su
uso para evitar este tipo de problemas.
Aplicacin prctica
La aplicacin fundamental de este tipo de biestables es la de permitir controlar
una salida a partir de dos seales, una para activarla y otra para desactivarla. Por
ejemplo, supongamos que queremos encender un LED cuando pulsemos un botn
y apagarla cuando pulsemos otro botn. El circuito para realizarlo es el mostrado
en la figura 7.6. Si ambos botones estn sin pulsar las entradas R y S del biestable
estarn a cero y el LED mantendr su valor anterior. Cuando se pulse el botn On se
141
S
0
1
1
0
R
1
0
1
0
Qt +1
1
0
Qt
1
Qt +1
0
1
Qt
1
Puesta a 1 (Set)
Puesta a 0 (Reset)
Mantenimiento
Prohibido
7.3.2.
Realice el ejercicio 1
7.3.3.
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 2
Clk
0
1
1
int main(void)
{
printf("Hola\n");
return 0;
}
D
X
0
1
Qt +1
Qt
0
1
Biestable R-S
Sincronizador
Qt +1
Qt
1
0
Manten.
Puesta a 0
Puesta a 1
142
Clk
0
1
D
X
X
0
1
Qt +1
Qt
Qt
0
1
Qt +1
Qt
Qt
1
0
Manten.
Manten.
Puesta a 0
Puesta a 1
salidas slo pueden cambiar cuando el reloj est activo, permaneciendo inmviles
cuando el reloj est inactivo. De estos biestables el nico que tiene inters en la
prctica el el tipo D, cuyo circuito se muestra en la figura 7.8.
Como puede apreciar el circuito consta de un biestable RS con puertas NAND
al que se le ha conectado un circuito sincronizador que mediante la seal de reloj
Clk controla cundo se puede actualizar la salida del biestable. As, cuando esta
seal vale cero las dos entradas del biestable RS estarn a uno y por tanto la salida
del biestable se mantiene con su valor anterior, independientemente del valor de la
entrada D. Cuando Clk se pone a uno, si D vale cero la entrada de la puerta inferior
del sincronizador se pondr a cero, dando un Reset al biestable, con lo que ste
se pondr a cero. Si por el contrario la entrada D vale uno, ser la puerta superior
del sincronizador la que se pondr a cero dando un Set al biestable, con lo que su
salida se pondr a uno.
En resumen, este biestable copia el valor de su entrada D en sus salidas mientras
la entrada de reloj est activa y mantiene el ltimo valor cuando la entrada de reloj
se desactiva. Por tanto este biestable nos permite almacenar un dato y de ah es
precisamente de donde viene su nombre: D de Dato.
7.3.4.
El inconveniente de los biestables por nivel es que mientras el reloj est a uno
la salida es una copia de la entrada, por lo que si en la entrada se produce algn
parpadeo (glitch) ste se transferir a la salida. En los biestables sncronos por flanco
el biestable slo modifica sus salidas cuando se produce un flanco en la seal de
reloj. En la figura 7.9 se muestra un flip-flop tipo D junto con un cronograma de su
funcionamiento y su tabla de verdad.
Las diferencias frente al latch tipo D existen obviamente slo en la forma de
sincronizacin. En primer lugar en el smbolo del biestable se aade un tringulo
en la entrada de reloj para indicar que es un biestable disparado por flanco. En
segundo lugar en la tabla de verdad puede observar que tanto cuando el reloj vale
cero como cuando vale uno la salida del biestable se mantiene a su valor anterior.
Slo cuando se produce un flanco de subida, indicado en la tabla mediante una
flecha, el biestable copia en su salida el valor de la entrada.
Por ltimo, en el cronograma se observa que la salida slo se actualiza en los
143
Clk
0
1
D
X
X
0
1
Qt +1
Qt
Qt
0
1
Qt +1
Qt
Qt
1
0
Manten.
Manten.
Puesta a 0
Puesta a 1
flancos de subida del reloj, aunque al igual que en el latch un tiempo de propagacin
tp despus.
int main(void)
{
printf("Hola\n");
return 0;
}
7.3.5.
Clk
0
1
T
X
X
0
1
Qt +1
Qt
Qt
Qt
Qt
Qt +1
Qt
Qt
Qt
Qt
Manten.
Manten.
Manten.
Inversin
Realice el ejercicio 3
144
Clk
0
1
Tipo JK
Tipo D
Tipo T
J
X
X
0
1
0
1
K
X
X
0
0
1
1
Qt +1
Qt
Qt
Qt
1
0
Qt
Qt +1
Qt
Qt
Qt
0
1
Qt
Manten.
Manten.
Manten.
Puesta a 1
Puesta a 0
Inversin
7.3.6.
Este biestable recibe su nombre en honor a Jack Kilby, su inventor. En la figura 7.12 se muestra su smbolo y su tabla de verdad. Si observa la tabla ver que
es similar a la del biestable RS salvo que cuando ambas entradas estn activas a
la vez, en lugar de entrar en un estado prohibido el flipflop invierte el valor de la
salida.
La principal ventaja de este biestable es el englobar el funcionamiento de los
tres anteriores: RS, D y T; es decir, puede considerarse como un flip-flop universal.
El comportamiento como RS se obtiene usando la entrada J como S y la K como
R, pues como puede ver en la tabla de verdad la J pone a uno el flipflop y la K a
cero. Si se hace que K sea el inverso de J, el biestable funciona como un tipo D,
pues cuando D sea cero se hace una puesta a cero y cuando sea uno se hace una
puesta a uno. Por ltimo, si unimos la J con la K tenemos un T, pues cuando ambas
entradas son cero la salida se mantiene y cuando son uno se invierte.
7.3.7.
Entradas asncronas
145
de que ocurra un flanco en el reloj. Por ltimo indicar que aunque en la figura se
han supuesto todos los retardos iguales por simplificar, en la prctica los retardos
de propagacin desde las entradas asncronas a las salidas suelen ser distintos de
los retardos desde el reloj a las salidas.
7.3.8.
Parmetros tecnolgicos
Aunque los biestables los trataremos siempre a nivel lgico, al igual que las puertas estn compuestos por circuitos que necesitan que se respeten ciertos tiempos y
ciertos niveles de tensin. En cuanto a estos ltimos, los requisitos son los mismos
que los de las puertas lgicas, que ya se expusieron en la seccin 1.2. En cuanto a
los primeros, existen varias restricciones que pasamos a enumerar a continuacin:
146
7.4.
Ejercicios
147
iIH = 1 A
VOL = 0, 1V
VOH = 3, 1V
2. Modifique el circuito de la figura 7.6 para usar un biestable con puertas NAND.
3. En la figura 7.9 se muestra un cronograma con el funcionamiento de un flip
flop tipo D. Repita este cronograma para representar en funcionamiento de
un latch tipo D sometido a estas mismas entradas.
Captulo 8
8.1.
Introduccin
8.2.
Nomenclatura
(X, Qt )
(Qt )
En donde la funcin est sincronizada normalmente por un reloj activo por flanco. Una representacin grfica de este tipo de mquinas puede observarse en la
figura 8.1.
149
150
Memoria
Clk
Mquina de Mealy
Al igual que la mquina de Moore, este tipo de mquinas se denominan as en
honor a su inventor, George H. Mealy. A diferencia de las mquinas de Moore, las
salidas dependen del estado y de las entradas; es decir, las funciones y son:
Qt +1
(X, Qt )
(X, Qt )
Memoria
Clk
151
E=1
E=0
E=1
E=0
S=0
E=1
Estado0
S=0
S=1
S=1
E=1
Estado1
S=1
Estado0
Estado1
E=0
E=0
S=0
Mealy
Moore
8.2.1.
Representacin grfica
8.3.
El proceso de diseo de una mquina de estados consiste en obtener las funciones y a partir de las especificaciones del circuito. El proceso es algo tedioso,
aunque afortunadamente los lenguajes de descripcin de hardware nos permiten
describirlas y hacer la sntesis automticamente. Incluso hay paquetes de software
que permiten dibujar un diagrama de estados y a partir de ste obtienen el cdigo
en VHDL o Verilog. No obstante, antes de ver cmo se describe una mquina de
estados en VHDL vamos a estudiar cmo disearla a mano.
El proceso de diseo consta de las fases que se indican en la figura 8.4. La parte
creativa y un poco complicada a veces es el paso de la especificacin del sistema al
diagrama de estados. Una vez realizado este paso, el resto es algo sistemtico que
Especificacin
del sistema
Diagrama
de estados
Codificacin
de estados
Tabla de
transicin
Tabla de
excitacin
Tabla de
salida
Simplificacin
Circuito
lgico
152
8.3.1.
E=1
E=1
Esp1
S=0
Clk
E=1
Pulso
S=1
Esp0
S=0
E
S
E=0
E=0
Esp1
Pulso
Esp0
Esp1
Reset_n=0
Figura 8.5: Diagrama de estados y cronograma del detector de flanco por Moore.
153
Estadot
Esp1
Esp1
Pulso
Pulso
Esp0
Esp0
Q1t
0
0
0
0
1
1
Q0t
0
0
1
1
0
0
E
0
1
0
1
0
1
Q1t +1
0
0
0
1
0
1
Q0t +1
0
1
0
0
0
0
Estadot +1
Esp1
Pulso
Esp1
Esp0
Esp1
Esp0
Estadot
Esp1
Esp1
Pulso
Pulso
Esp0
Esp0
Q1t
0
0
0
0
1
1
Q0t
0
0
1
1
0
0
E
0
1
0
1
0
1
Q1t +1
0
0
0
1
0
1
Q0t +1
0
1
0
0
0
0
Estadot +1
Esp1
Pulso
Esp1
Esp0
Esp1
Esp0
D1
0
0
0
1
0
1
D0
0
1
0
0
0
0
Tabla de transicin
A partir del diagrama de estados podemos obtener la tabla de transicin de estados, que contiene la misma informacin que el diagrama pero de forma tabular.
Dicha tabla contiene a su izquierda el estado actual y el valor de las entradas de la
mquina y a su derecha el estado siguiente. El estado es conveniente representarlo de forma simblica y codificado. La primera representacin es para facilitarnos
la lectura de la tabla a nosotros, mientras que la segunda es necesaria para la
obtencin del circuito lgico.
En la tabla 8.1 se muestra la tabla de transicin del detector de flanco. Como
puede observar los estados se han codificado mediante codificacin binaria. Ntese
que al necesitar dos bits para representar el estado, a stos se les ha denominado
Q1 y Q0 , usando el superndice t para indicar el estado actual y el superndice t + 1
para indicar el estado siguiente.
Tabla de excitacin
A partir de la tabla anterior se crea la tabla de excitacin, en la que se indica
el valor que han de tener las entradas de los flipflops para que se produzca la
transicin deseada del estado. Por tanto, antes de crear esta tabla es necesario
decidir qu tipo de flipflop se va a usar para representar el estado. Lo ms fcil es
usar flipflop tipo D, ya que en este tipo de flipflop si queremos que la salida se
ponga a 0 o 1 basta con poner su entrada a dicho valor.
En la tabla 8.2 se muestra la tabla de excitacin, que como puede observar es
una copia de la tabla de transicin a la que se le han aadido las columnas D1 y D0
154
en las que se especifica el valor que han de tener las entradas de los flipflops para
que el estado siguiente (t + 1) sea el especificado. Al usarse flipflops tipo D estas
columnas coinciden con las correspondientes al estado siguiente Q1t +1 y Q0t +1 .
Tabla de salida
Una vez creada la tabla de excitacin, que nos permitir obtener la funcin , es
necesario crear la tabla de salida, a partir de la que se obtendr la funcin . Como
en la mquina de Moore las salidas dependen slo del estado actual, en esta tabla
se especifica a la izquierda el estado junto con su codificacin y a la derecha el valor
de la salida correspondiente al estado; tal como se muestra en la tabla 8.3.
Simplificacin
En la tabla de excitacin tenemos ya todos los datos que necesitamos para
obtener las ecuaciones de la funcin . Por un lado las entradas son Q1t , Q0t y E y
las salidas son D1 y D0 . Por tanto podemos escribir los diagramas de Karnaugh para
ambas funciones, los cuales se muestran en la figura 8.6. A partir de estos diagramas se obtienen las ecuaciones lgicas de las entradas de los flipflops encargados
de almacenar el estado, las cuales son:
D1
Q1 E + Q0 E
D0
Q1 Q0 E
Circuito lgico
El ltimo paso es el diseo del circuito lgico a partir de las ecuaciones obtenidas
en el paso anterior. El circuito obtenido en este ejemplo se muestra en la figura 8.7.
Ntese que se han usado dos flipflops para almacenar el estado Q1 y Q0 . Ambos
flipflops se han conectado a la seal de reloj (CLK) para sincronizarlos y a la de
reset (Reset) para llevarlos al estado inicial, que recuerde que se ha codificado como
00. Como la entrada PRE no es necesaria en ambos flipflops se ha conectado a uno
Estadot
Esp1
Pulso
Esp0
Q1t
0
0
1
Q0t
0
1
0
S
0
1
0
155
00
01
11
10
00
01
13
02
04
15
X7
X6
00
01
11
10
00
11
03
02
04
X7
X6
00
11
02
X3
para desactivarla. Por ltimo se han implantado las ecuaciones de las entradas D1
y D0 obtenidas en el apartado anterior, as como la de la salida S.
8.3.2.
int main(void)
{
printf("Hola\n");
return 0;
}
E
Q
CLK
Vcc
CLK
CLK
Realice el ejercicio 1
156
E=0
S=0
E=1
S=0
E=1
S=1
Cero
Clk
Uno
E
S
E=0
S=0
Uno
Cero
Cero
Reset_n=0
Figura 8.8: Diagrama de estados y cronograma del detector de flanco por Mealy.
Estadot
Cero
Cero
Uno
Uno
Qt
0
0
1
1
E
0
1
0
1
Q t +1
0
1
0
1
Estadot +1
Cero
Uno
Cero
Uno
S
0
1
0
0
la entrada sigue valiendo cero seguiremos en el mismo estado y la salida valdr cero,
pues no hay ningn flanco. Si por el contrario la entrada vale uno en este estado,
se realizar una transicin en el siguiente flanco de reloj al estado Uno y adems se
pondr a uno la salida S para indicar que se ha producido un flanco de subida en
la seal de entrada. Segn se aprecia en el cronograma de la figura 8.8, el pulso de
salida dura ahora el tiempo desde que la seal de entrada se pone a uno hasta que
se realiza el cambio de estado en el siguiente flanco de reloj. Es decir, la salida est
ahora asociada a la transicin entre el estado Cero y Uno, no a la permanencia en
un estado determinado como ocurre en las mquinas de Moore. Cuando estemos
en el estado Uno, si la entrada sigue valiendo 1 permanecemos en dicho estado y si
vale cero pasamos al estado Cero. En ambos casos la salida valdr cero para indicar
que no hay flancos de subida en la seal de entrada.
Codificacin de estados
En este caso vamos a usar tambin la codificacin binaria. Al tener slo dos
estados asignaremos 0 al estado Cero y 1 al estado Uno.
157
Estadot
Cero
Cero
Uno
Uno
Qt
0
0
1
1
E
0
1
0
1
Q t +1
0
1
0
1
Estadot +1
Cero
Uno
Cero
Uno
J
0
1
X
X
K
X
X
1
0
S
0
1
0
0
Tabla de excitacin
Al igual que con la mquina de Moore, a partir de la tabla de transicin de
estados es necesario crear la tabla de excitacin de los flipflops. En este caso
vamos a usar un flipflop tipo JK para almacenar el bit de estado Q. En este caso
la obtencin de la tabla de excitacin es un poco ms complicada que con los flip
flops tipo D, ya que en este tipo flipflops el estado final que queremos conseguir
depende del estado de partida. En la tabla siguiente se muestra la tambin llamada
tabla de excitacin del flipflop JK:
Qt
0
0
1
1
Qt +1
0
1
0
1
J
0
1
X
X
K
X
X
1
0
En esta tabla se definen los valores que han de tener las entradas J y K para que
se produzca la transicin deseada en el flipflop. En la primera fila de la tabla se
puede ver que si el estado anterior del flipflop es cero y queremos que siga a cero,
la entrada J ha de ser 0 y la K da igual lo que valga. Esto es as porque si J y K
valen 0, el flipflop mantiene su valor anterior y si J = 0 y K = 1 la salida del flipflop
se pone a cero, con lo que se conseguir de la misma forma que Qt +1 = 0. En la
segunda fila se puede ver que si Qt es cero y queremos que Qt +1 sea uno tenemos
dos formas de conseguirlo: o bien hacemos que J y K valgan 1, con lo que el flipflop
invierte su salida, o bien hacemos que J sea 1 y K sea 0, con lo que el flipflop pone
su salida a 1. El resto de las filas de la tabla se obtienen de la misma forma.
A partir de esta tabla de excitacin del flipflop JK se obtiene la tabla de excitacin de la mquina de estados, la cual se muestra en la tabla 8.5. Para la
obtencin de esta tabla basta con observar en la tabla de transicin el valor de Qt y
Qt +1 y elegir los valores correspondientes de la tabla de excitacin del flipflop JK,
copindolos a sus columnas correspondientes.
Simplificacin
A partir de la tabla de excitacin se obtienen los diagramas de Karnaugh de la
figura 8.9; y a partir de stos las ecuaciones de las entradas del flipflop y de la
158
salida:
QE
int main(void)
{
printf("Hola\n");
return 0;
}
Circuito lgico
A partir de las ecuaciones anteriores se obtiene el circuito lgico, mostrado en
la figura 8.9
Realice el ejercicio 2
8.4.
Descripcin en VHDL
La descripcin de mquinas de estado en VHDL necesita sentencias ms potentes de las que hemos estudiado hasta ahora. Por tanto, antes de pasar a describir
una mquina de estados en VHDL es necesario introducir estas nuevas sentencias.
8.4.1.
Los process
Las sentencias VHDL que hemos estudiado hasta ahora son sentencias concurrentes. Cada una de ellas describe un elemento hardware y por ello podemos pensar
que se ejecutan en paralelo. Adems de estas sentencias existen otras que permiten describir el comportamiento de un componente hardware de forma secuencial, aunque para integrarlas con el resto de sentencias han de agruparse dentro de
un process. Este process es equivalente a una sola sentencia concurrente que se
ejecuta en paralelo con el resto de sentencias.
La sintaxis del process es la siguiente:
seal_n)
Vcc
00
11
X2
X3
X0
X1
12
03
1
E
00
11
02
03
CLK
CLK
Figura 8.9: Diagramas de Karnaugh y circuito lgico del detector de flanco por Mealy.
159
sentencia_secuencial ;
end process [ Etiqueta ];
Lo nico destacable de esta sintaxis es la lista de sensibilidad, que es una serie de
seales que se escriben entre parntesis justo despus de la palabra clave process.
Esta lista de seales ha de contener todas las seales que se leen en el process
ya que dicho process solo se ejecutar cuando cambie alguna de las seales
indicadas en la lista de sensibilidad. Esta particularidad se usa para optimizar
la simulacin, ya que cuando el simulador detecta un process en el que no ha
cambiado ninguna de sus seales de la lista de sensibilidad no lo evala y as se
ahorra tiempo. El problema ocurre cuando el sintetizador genera el circuito, pues
ste estar siempre activo y por tanto los resultados de simulacin no coincidirn
con los obtenidos en el hardware real, lo cual puede ser catastrfico si por ello no
detectamos un error hasta tener el chip fabricado.
Por ejemplo, para especificar una puerta AND usando un process podemos
hacer:
process (a, b)
begin
s <= a and b;
end process ;
Ya se que es un ejemplo poco til, pero sirve para indicar dos cosas: que han de
escribirse ambas entradas a y b en la lista de sensibilidad (pero no la salida) y que
el operador de asignacin es el mismo tanto dentro como fuera de un process.
Si en el ejemplo anterior escribimos:
process (a)
begin
s <= a and b;
end process ;
El sintetizador genera exactamente el mismo circuito, pero el simulador slo actualizar la salida de la puerta cuando cambie la seal a, pero no cuando cambie la
b, lo cual generar diferencias entre la simulacin y la realidad.
8.4.2.
La sentencia if
if condicin then
160
sentencia ;
sentencia ;
[ elsif condicin then
sentencia ;
sentencia ; ]
[else
sentencia ;
sentencia ; ]
end if;
Como puede apreciar, tanto el elsif como el else son opcionales.
Por ejemplo, si queremos matar pulgas a caonazos e implantar una puerta AND
con una sentencia if podemos hacer:
process (a, b)
begin
if a = 1 and b = 1 then
s <= 1;
else
s <= 0;
end if;
end process ;
Observe en el ejemplo que el if se ha escrito dentro de un process, ya que es
una sentencia secuencial.
Una de las utilidades prcticas del if es la de implementar circuitos sncronos.
Para ello en la condicin se detecta el flanco de reloj y se ejecutan las sentencias
que queramos sincronizar dentro del if. Por ejemplo, para implementar un biestable
sincronizado por flanco tipo D podemos hacer:
process (clk , d)
begin
if clk event and clk = 1 then
q <= d;
end if;
end process ;
es:
En este cdigo hay otro elemento nuevo: el atributo de una seal, cuya sintaxis
seal atributo
Estos atributos permiten obtener informacin adicional de una seal. Por ejemplo
el atributo event es verdadero cuando ocurre un flanco en la seal sobre la que
se aplica o falso en caso contrario. As, para detectar un flanco en la seal clk
basta con escribir: clkevent. Si adems queremos detectar un flanco de subida
se comprueba que adems despus del flanco la seal valga uno, que es lo que se
hace en la condicin del if.
161
8.4.3.
La sentencia case
case expresin is
when valor =>
sentencia ;
sentencia ;
when otro_valor =>
sentencia ;
sentencia ;
when others =>
sentencia ;
sentencia ;
end case;
y su funcionamiento es similar al del with...select: se compara la expresin con
los valores valor, otro_valor, etc. Si se encuentra una coincidencia se ejecutan
las sentencias que siguen a dicho valor. Si no se encuentra ninguno, se ejecutan las
sentencias que siguen al when others. ste ltimo when es en realidad opcional,
pero como veremos ms adelante lo normal es usarlo siempre.
Por ltimo comentar que es posible asociar sentencias a varios valores separndolos por el operador |.
Por ejemplo, un multiplexor se describira de la siguiente manera con un case:
162
when 1 =>
s <= a1;
when others =>
s <= 0
end case;
end process ;
En este caso es muy importante asignar en todos los when un valor a la salida s. Si
nos dejamos uno en el que la salida no se actualiza, como por ejemplo:
8.4.4.
163
denominado t_estado para almacenar las variables de estado. Este tipo es un tipo
enumerativo que slo puede tomar en este caso los valores Esp1, Pulso o Esp0. Esto
permite evitar errores si intentamos asignar un valor arbitrario a las variables de
estado. El cmo se codifican estas variables de estado en binario es tarea del sintetizador, el cual realizar dicha asignacin para generar un circuito ptimo. Una vez
definido se han creado dos seales de tipo t_estado: estado_act para almacenar
el valor actual de las variables de estado (la salida de los flipflops de estado) y
estado_sig para almacenar el valor que debe tomar el estado en el siguiente flanco
(que ser la entrada de los flipflops).
La mquina de estados se ha implementado mediante tres process. El primero
especifica los flipflop donde se almacenan las variables de estado. Como puede observar el process actualiza el estado (estado_act) con el estado siguiente (estado_sig)
cuando se produce un flanco en el reloj. Este process tambin se encarga de gestionar el reset asncrono, llevando la mquina a su estado inicial Esp1.
El segundo process describe el circuito combinacional que calcula el siguiente
estado en funcin de las entradas y el estado actual. Dicho clculo se realiza en
un process, en el que con un case se selecciona el estado siguiente en funcin
del estado actual. Para ello, dentro del when de cada estado se verifica si se activa
alguna de las condiciones que hacen que cambie el estado y si es as se actualiza
el estado siguiente con el nuevo valor. Para simplificar, antes de entrar en el case
se le da al estado siguiente el valor del estado actual y as no es necesario escribir
esta asignacin en todos los when cuando no se activa ninguna seal que cambie de
estado.
Por ltimo, en el tercer process se describe la lgica de las salidas. Al igual que
en el process anterior, es ms cmodo dar un valor inicial a las salidas y as slo
poner los estados en los que las salidas valen uno. Para dejar constancia de que en
ciertos estados no hay que dar un valor a la salida distinto del de por defecto se pone
como sentencia un null que no quiere decir nada ms que el diseador ha dicho
que no es preciso hacer nada en este caso. Esto evita pensar a otros diseadores que
vean nuestro cdigo, o a nosotros mismos cuando lo veamos dentro de un tiempo,
que se nos olvid especificar el valor de las salidas en un estado.
1
2
3
4
library ieee;
use ieee. std_logic_1164 .all;
5
6
entity DetectorFlanco is
7
8
9
10
11
12
port (
e
reset_n
clk
s
:
:
:
:
in
in
in
out
std_logic ;
std_logic ;
std_logic ;
std_logic );
-----
Entrada
Inicializacin
Reloj del sistema
Salida
164
13
14
end DetectorFlanco ;
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
165
begin
-- Por defecto la salida vale cero
s <= 0;
case estado_act is
when Esp1 =>
null;
when Pulso =>
s <= 1;
when Esp0 =>
null;
when others =>
null;
end case;
end process Salidas ;
end behavioral ;
8.5.
Detector de secuencia
Para terminar el captulo nada mejor que estudiar un ejemplo completo un poco
ms complejo que el detector de flanco. El ejemplo usado va a ser una cerradura
electrnica que detecte una secuencia de pulsacin de dos teclas y abra la cerradura
cuando se introduzca la secuencia correcta. El sistema dispondr de dos pulsadores
P1 y P0 y una salida S. La salida se activar cuando se pulse P1, luego P0 y por
ltimo otra vez P0. La salida permanecer activa hasta que se pulse otra tecla.
En primer lugar hay que tener en cuenta que como el reloj del sistema es mucho
ms rpido que el usuario, una pulsacin de una tecla durar muchos ciclos de
reloj. Por tanto se necesitan dos estados para detectar una pulsacin completa: uno
para detectar la pulsacin y otro para detectar la liberacin. Esto es lo que se ha
hecho en el diagrama de estados mostrado en la figura 8.10.1 Para simplificar el
diagrama en las transiciones se muestran tan solo el valor de las dos entradas p1
y p0. Para que no haya lugar a dudas del orden, en la esquina superior izquierda
p1p0
del diagrama se ha escrito s para indicar que en las transiciones el primer bit es
p1 y el segundo p0 y que en los estados el valor de la salida corresponde a s. Esto
ltimo no sera estrictamente necesario en este circuito con una sola salida, pero es
indispensable cuando existan ms salidas.
El circuito arranca en el estado Reposo, donde espera a que se pulse la tecla p1.
Cuando se pulse se ir al estado PulP1, donde se esperar su liberacin, pasando al
estado LibP1. En el caso hipottico que justo cuando se libera p1 se pulse p0 se ira
directamente al estado PulP0, ya que estaramos dentro de la secuencia p1, p0. Si
antes de liberar p1 se pulsa p0 (11), esto se considera un error, por lo que se vuelve
1
Otra alternativa que se mostrar ms adelante es usar un detector de flanco para que cada
pulsacin de tecla genere un pulso de slo un ciclo de reloj.
166
p1 p0
s
10
00, 01, 11
00
11
01
11
11
10
01
00
Reposo
0
PulP1
0
PulP0
0
LibP1
0
10
11
01
Reset_n=0
01
00
01
00
11, 00
LibP0
0
10
10
SecOK
1
10
al estado de reposo. Desde el estado LibP1 se pasar a PulP0 cuando se pulse p0. Al
igual que antes, si se pulsan las dos teclas a la vez se volver al estado de reposo. Si
por el contrario se pulsa p1 se considera que est empezando una nueva secuencia,
por lo que se vuelve al estado PulP1. En el estado PulP0 se esperar a la liberacin
de p0 para pasar a LibP0. Al igual que antes la pulsacin de las dos teclas lleva
el circuito al estado de Reposo y la pulsacin de p1 simultnea a la liberacin de
p0 llevar al circuito a PulP1. El comportamiento del circuito en el estado LibP0 es
similar al del estado LibP1, slo que ahora se espera a que se pulse p0 para pasar
al estado SecOK donde se activar la salida para abrir la cerradura. En este estado
se permanecer mientras siga pulsada p0. Cuando se libere o se pulsen las dos
teclas volveremos a Reposo y si se libera p0 y a la vez se pulsa p1 (cosa que es muy
difcil que ocurra en un solo ciclo de reloj) se ir al estado PulP1 por considerarse el
principio de una nueva secuencia.
8.5.1.
Descripcin en VHDL
3
4
5
library ieee;
use ieee. std_logic_1164 .all;
6
7
entity DetectorSecuencia is
8
9
10
11
port (
reset_n : in
clk
: in
std_logic ;
std_logic ;
-- Inicializacin
-- Reloj del sistema
167
12
13
p1 , p0
s
: in std_logic ;
: out std_logic );
-- Pulsadores
-- salida
14
15
end DetectorSecuencia ;
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
168
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
169
100
101
102
103
104
105
106
107
108
null;
when LibP0 =>
null;
when SecOK =>
s <= 1;
when others =>
null;
end case;
end process ;
109
110
end behavioral ;
El resultado de la simulacin se muestra en la figura 8.11. En la simulacin se
ha introducido en primer lugar una secuencia correcta. Observe que justo cuando
se pulsa p0 por segunda vez la salida s se activa, mantenindose activa mientras
dura la pulsacin de p0. Seguidamente se introduce una secuencia incorrecta (p1,
p0 y p1), quedndose la salida sin activar. No obstante este ltimo p1 es el inicio de
una secuencia correcta, por lo que despus de dos pulsaciones de p0 la salida se
vuelve a activar.
8.6.
170
Vcc
p1
Detector
Flanco
Detector
secuencia
Vcc
p0
Detector
Flanco
p1 p0
s
00
00, 01, 11
00, 10
10
EP1
0
11
Reset_n=0
00
01
01
Reposo
0
11, 01
11
EP1P0P0
1
EP1P0
0
10
10
paso del estado Reposo al EP1 se da cuando se pulse la tecla p1. Mientras no se pulse
otra tecla seguiremos en este estado. Tambin si se vuelve a pulsar p1 seguiremos
en este estado, pues seguimos teniendo la primera tecla de la secuencia. Si se pulsa
p0 pasaremos al estado EP1P0, esperando ah mientras no se pulse otra tecla. Si se
vuelve a pulsar p0 pasaremos al estado EP1P0P0 donde se activar la salida pues
se ha completado la secuencia. Si desde cualquiera de estos estados se pulsa p1
volveremos al estado EP1, pues esta pulsacin puede ser el comienzo de una nueva
secuencia.
171
8.6.1.
Descripcin en VHDL
-----
5
6
7
library ieee;
use ieee. std_logic_1164 .all;
8
9
entity DetectorSecuenciaFl is
10
11
12
13
14
15
port (
reset_n
clk
p1 , p0
s
:
:
:
:
in
in
in
out
std_logic ;
std_logic ;
std_logic ;
std_logic );
-----
Inicializacin
Reloj del sistema
Pulsadores
salida
16
17
end DetectorSecuenciaFl ;
18
19
20
21
22
23
24
25
26
27
28
29
30
31
component DetectorFlanco
port (
e
: in std_logic ;
reset_n : in std_logic ;
172
32
33
34
35
clk
: in std_logic ;
s
: out std_logic );
end component ;
begin -- behavioral
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
DetectorFlanco_2 : DetectorFlanco
port map (
e
=> p0 ,
reset_n => reset_n ,
clk
=> clk ,
s
=> entradas (0) );
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
173
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
end behavioral ;
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 3
174
8.7.
Ejercicios
El emisor tendr una entrada (Act_Emisor) para activarlo y una salida (Rec)
que se pondr a 1 lgico cuando reciba la luz infrarroja reflejada en el usuario
o a 0 cuando no reciba nada. La cisterna dispondr de una electrovlvula que
se controlar con la seal Cisterna, de forma que cuando dicha seal est a
1 se abrir la electrovlvula para descargar la cisterna.
El funcionamiento del circuito ser el siguiente: en el estado inicial, para evitar
consumir demasiada energa, el emisor de infrarrojos estar desactivado. De
este estado se ir a otro en el que se activar el emisor. Si no se detecta a
nadie se volver al estado inicial para volver a repetir el ciclo. Si se detecta a
alguien, se esperar a que ste se marche para descargar la cisterna y volver
al estado inicial.
En el diseo ha de incluir el diagrama de estados y la descripcin en VHDL
del circuito.
5. El profesor Bacterio le ha pedido ayuda para que le disee el circuito de
control de la nueva puerta secreta que se va a instalar en el cuartel general de
la T.I.A. La puerta secreta ha sido convenientemente disimulada en un cartel
publicitario de un conocido fabricante de puertas, tal como se muestra en la
figura siguiente:
175
Puertas
E.S.teban
Sm
Sf
La puerta secreta est diseada para ser usada nica y exclusivamente por
la pareja de superagentes ms famosa de la agencia: Mortadelo y Filemn.
Para ello se han colocado dos sensores a ambos lados de la puerta justo a la
altura de la cabeza de cada uno de los dos agentes, representados en la figura
mediante Sm y Sf. El funcionamiento de la puerta secreta es el siguiente: para
activar el mecanismo Mortadelo y Filemn han de colocarse a ambos lados
de la puerta, justo delante de su sensor correspondiente. Cuando el sistema
detecte esta situacin se encendern dos luces que se han disimulado justo
detrs de las letras E. y S. del cartel. A continuacin Filemn tendr que
colocarse delante de la puerta para que el sensor Sf deje de detectarlo. Para
confirmar este paso el circuito apagar la letra S. Cuando Mortadelo vea
que se ha apagado la luz se pondr tambin delante de la puerta para que el
sensor Sm deje de detectarlo. El circuito entonces activar una seal para abrir
la puerta y otra para avisar al Sper de la llegada de sus agentes favoritos,
de forma que pueda encomendarles una nueva y peligrosa misin. Ambas
seales slo deben durar un ciclo de reloj. Una vez iniciada la secuencia, si
en algn paso se realiza una accin equivocada, como por ejemplo que sea
Mortadelo en lugar de Filemn el primero en ponerse delante de la puerta, se
activar una alarma para alertar a todos los agentes de la T.I.A. de un posible
intento de asalto a su sede. Dicha alarma seguir activa hasta que se vuelva
a inicializar el circuito con la seal de reset.
Notas:
Los sensores Sm y Sf dan un 1 cuando detectan una persona enfrente de
ellos y un 0 en caso contrario.
El diseo ha de incluir el diagrama de estados y la descripcin en VHDL
del circuito.
Captulo 9
Registros
9.1.
Introduccin
Un registro no es ms que un conjunto de biestables que almacenan una palabra. Los ms usados son los de entrada y salida en paralelo, que almacenan una
palabra de n bits. No obstante en sistemas de comunicaciones son muy tiles los
denominados registros de desplazamiento, que como veremos nos permiten enviar
una palabra de n bits por un solo cable, enviando los bits en serie de uno en uno.
9.2.
d2
d1
d0
clk
reset_n
q3
q2
q1
q0
178
Registros
-- Registro de 4 bits
2
3
4
library ieee;
use ieee. std_logic_1164 .all;
5
6
entity Registro is
7
8
9
10
11
12
port (
clk
reset_n
d
q
:
:
:
:
in
in
in
out
std_logic ;
-- Entradas de control
std_logic ;
std_logic_vector (3 downto 0); -- datos
std_logic_vector (3 downto 0));
13
14
end Registro ;
15
16
17
18
begin
-- behavioral
19
20
21
22
23
24
25
26
27
28
29
end behavioral ;
9.2.1.
179
9 Registros
d3
d2
0
1
d1
0
1
d0
0
1
0
1
clk
reset_n
en
q3
q2
q1
q0
Descripcin en VHDL
En este caso se aade a la descripcin anterior un if (lneas 2628) para que la
salida slo se actualice cuando la seal de enable (en) est activa:
1
2
3
4
library ieee;
use ieee. std_logic_1164 .all;
5
6
entity RegistroEn is
7
8
9
10
11
12
13
port (
clk
reset_n
en
d
q
:
:
:
:
:
in
in
in
in
out
std_logic ;
-- Entradas de control
std_logic ;
std_logic ;
-- Habilitacin carga
std_logic_vector (3 downto 0); -- datos
std_logic_vector (3 downto 0));
14
15
end RegistroEn ;
16
17
18
19
begin
-- behavioral
20
21
22
23
24
25
26
27
28
180
Paralelo
1 0 1 1 0 0 1 0
Sistema Digital
Sistema Digital
1
0
1
1
0
0
1
0
Sistema Digital
Sistema Digital
Registros
Serie
29
30
end if;
end process ;
31
32
end behavioral ;
9.3.
Registros de desplazamiento
9.3.1.
Este registro permite convertir una secuencia de n bits que entran en serie en
una palabra de n bits. El diagrama del circuito (para palabras de 4 bits) se muestra
en la figura 9.4. Como puede observar, consta de 4 flipflops en los que la salida
de cada uno se conecta a la entrada del siguiente, de forma que en cada flanco de
reloj la palabra binaria que almacena se desplaza a la derecha. El hueco dejado
por la palabra en el bit 3 se rellena con el valor de la entrada serie e_s y el bit 0
desaparece. En la figura 9.5 puede ver un diagrama de tiempos de la simulacin del
funcionamiento del circuito.
Descripcin en VHDL
Para describir el registro de desplazamiento en VHDL lo primero que necesitamos
es crear una seal interna para almacenar el registro (a la que se ha denominado
precisamente registro), ya que el lenguaje impide obtener el valor de una seal de
181
9 Registros
e_s
clk
reset_n
s_p(3)
s_p(2)
s_p(1)
s_p(0)
salida y como podemos ver en el esquema del circuito las salidas de los flipflops
tambin se conectan a las entradas de los siguientes.
La descripcin de registro propiamente dicha es similar a la del registro paralelo
paralelo: cuando se activa el reset se pone el registro a cero y si el reset no est activo
cuando se produce un flanco de subida del reloj se desplaza el contenido del registro.
La descripcin del desplazamiento se realiza en las lneas 26 y 27. En la primera se
dice que la entrada serie se guarda en el bit tres del registro y en la segunda se dice
que los bits 3 al 1 se guardan en los bits 2 al 0. Esta asignacin se hace en el mismo
orden en el que se describe, es decir, el bit 3 se conecta al 2, el bit 2 al 1 y el 1 al 0.
Por ltimo, en la lnea 31 se conecta el registro a la salida. Ntese que esta
conexin se realiza fuera del process, aunque se podra haber realizado dentro
obteniendo el mismo resultado. Se ha realizado as para dejar dentro del process
solamente la descripcin del registro.
1
2
3
4
5
library ieee;
use ieee. std_logic_1164 .all;
6
7
entity RegSerPar is
8
9
10
11
12
13
port (
clk
reset_n
e_s
s_p
:
:
:
:
in
in
in
out
std_logic ;
std_logic ;
std_logic ;
-- Entrada serie
std_logic_vector (3 downto 0)); -- salida
14
15
end RegSerPar ;
16
17
18
19
20
182
Registros
Figura 9.5: Simulacin del registro con entrada serie y salida en paralelo.
21
22
23
24
25
26
27
28
29
30
int main(void)
{
printf("Hola\n");
return 0;
}
31
32
Realice el ejercicio 1
9.3.2.
183
9 Registros
e_p(3)
e_p(2)
0
1
e_p(1)
0
1
e_p(0)
0
1
0
1
s_s
clk
reset_n
c_d
Descripcin en VHDL
La descripcin es similar a la del registro serieparalelo. La nica diferencia
radica ahora en la descripcin de la carga paralelo que se realiza mediante el if de
la lnea 27, de forma que cuando la seal c_d vale 0 se carga la entrada paralelo
e_p en el registro y cuando vale 1 desplaza el contenido del registro, introduciendo
un 0 por el bit 3.
1
2
3
4
5
library ieee;
use ieee. std_logic_1164 .all;
6
7
entity RegParSer is
8
9
10
11
12
13
14
port (
clk
reset_n
c_d
e_p
s_s
:
:
:
:
:
in
in
in
in
out
std_logic ;
std_logic ;
std_logic ;
-- Carga (0) o desplaza (1)
std_logic_vector (3 downto 0); -- Entrada
std_logic );
-- Salida serie
15
16
end RegParSer ;
17
18
19
20
21
22
23
24
25
26
27
184
Registros
Figura 9.7: Simulacin del registro con entrada paralelo y salida en serie.
28
29
30
31
32
33
34
35
int main(void)
{
printf("Hola\n");
return 0;
}
36
37
38
9.3.3.
185
9 Registros
e_p(3)
e_p(1)
e_p(2)
e_p(0)
esi
3 2 1 0
3 2 1 0
3 2 1 0
esd
3 2 1 0
clk
reset_n
ssi
ssd
s_p(3)
s_p(2)
s_p(1)
s_p(0)
Descripcin en VHDL
La descripcin en VHDL es similar a la del resto de registros, slo que ahora
mediante el if de la lnea 34 se selecciona qu ha de hacer el circuito en el flanco
en funcin de la seal de control. As cuando es 00 se desplaza a izquierda, cuando
es 10 se realiza la carga paralelo y cuando es 11 se desplaza a derecha. Ntese que
no se ha incluido en el if el valor 01 ya que en este caso el registro mantiene su
valor y por tanto no hay que hacer nada.
1
2
3
4
5
------
6
7
8
library ieee;
use ieee. std_logic_1164 .all;
9
10
entity RegDespl is
11
12
13
14
15
16
17
18
19
port (
clk
reset_n
c
esd
esi
e_p
s_p
:
:
:
:
:
:
:
in
in
in
in
in
in
out
std_logic ;
std_logic ;
std_logic_vector (1 downto 0); -- Control
std_logic ;
-- entrada serie Der.
std_logic ;
-- entrada serie Izq.
std_logic_vector (3 downto 0);-- E. paralelo
std_logic_vector (3 downto 0);-- S. paralelo
186
Registros
ssd
ssi
20
21
: out std_logic ;
: out std_logic );
22
23
end RegDespl ;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
9.4.
Ejercicios
1. Modifique el registro de entrada serie y salida en paralelo mostrado en la seccin 9.3.1 para que el desplazamiento en lugar de realizarse en cada flanco de
reloj se realice slo cuando se indique mediante una seal de entrada, a la que
se denominar enable. As, cuando esta seal valga 0 el registro mantendr
su valor, incluso aunque lleguen flancos de reloj. Si por el contrario la seal
vale 1 cuando llegue un flanco de reloj el circuito realizar un desplazamiento
9 Registros
187
100000
010000
001000
000100
000010
000001
000010
000100
001000
010000
100000
Para disear el circuito dispone de un reloj de 2 Hz. Realice en primer lugar un
circuito usando puertas lgicas, flipflops, multiplexores, etc. A continuacin
describa el circuito diseado en VHDL. Nota: Es fcil implantar el circuito
anterior mediante un registro de desplazamiento que pueda desplazar en los
dos sentidos.
5. Despus del xito conseguido con el diseo del problema anterior, decide actualizar un poco el juego de luces para el tuning de su coche. El circuito ser
capaz de controlar 6 lmparas. Al inicializarlo con la seal de reset se apagarn todas las lmparas. Despus de medio segundo se encender la lmpara
izquierda, despus de otro medio segundo se encender la que sigue, continundose la secuencia hasta que se hayan encendido todas las luces. Entonces
se continuar la secuencia apagando la luz derecha, luego la que est a su
izquierda, etc. La secuencia completa ser la mostrada a continuacin:
188
Registros
000000
100000
110000
111000
111100
111110
111111
111110
111100
111000
110000
100000
000000
Para disear el circuito dispone de un reloj de 2 Hz. Realice en primer lugar un
circuito usando puertas lgicas, flipflops, multiplexores, etc. A continuacin
describa el circuito diseado en VHDL. Nota: Es fcil implantar el circuito
anterior mediante un registro de desplazamiento que pueda desplazar en los
dos sentidos.
6. Disee un circuito digital para mostrar en dos displays la temperatura mxima y mnima. El valor de la temperatura lo proporciona un sensor en formato
signo/magnitud de 7 bits. Adems de la entrada de temperatura, existir otra
seal para inicializar el sistema poniendo la temperatura actual como mxima
y mnima.
Para disear el circuito suponga que dispone de comparadores para nmeros
de 7 bits en formato signo/magnitud.
Realice en primer lugar un diagrama de bloques del circuito y a continuacin
describa el circuito en VHDL.
Captulo 10
Contadores
10.1.
Introduccin
10.2.
190
Contadores
Vcc
clk
s(0)
s(1)
s(2)
s(3)
0 1
clk
reset_n
s(0)
s(1)
s(2)
9 10 11 12 13 14 15 0
s(3)
en los que la salida s(0) vale 1.1 Lo ms fcil para generar la salida s(1) es usar
un flipflop tipo T y conectar su entrada a s(0). La salida s(2) slo cambia en los
flancos en los tanto s(0) como s(1) valen 1. Por ello se ha generado mediante un
flipflops tipo T en el que se ha conectado a su entrada la AND de s(0) y s(1). Por
ltimo, la salida s(3) cambia en los flancos en los que s(0), s(1) y s(2) valen 1.
Para generarla, al igual que antes, se ha usado un flipflops tipo T en el que se ha
conectado a su entrada la AND de s(0), s(1) y s(2). Para implementar esta AND
se ha usado el resultado de la AND de s(0) y s(1), al que se le ha hecho la AND
con s(2).
Si se fija en el circuito es fcil ampliarlo a un nmero mayor de bits. Basta con
ir aadiendo un flip-flop tipo T y una puerta AND, conectndolos del mismo modo
que se ha hecho para el ltimo flipflop del circuito de la figura 10.1.
10.2.1.
Descripcin en VHDL
2
3
4
5
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
6
7
entity ContadorAscendente is
1
Fjese que en este caso los retardos juegan a nuestro favor, pues justo cuando llega el flanco
de reloj s(0) todava vale 1 y ser despus del retardo de propagacin del flipflop cuando se ponga
a cero.
191
10 Contadores
Vcc
clk
s(0)
s(1)
s(2)
s(3)
0 15 14 13 12 11 10 9
clk
reset_n
s(0)
s(1)
s(2)
1 0
s(3)
8
9
10
11
12
port (
clk
: in std_logic ;
reset_n : in std_logic ;
s
: out std_logic_vector (3 downto 0));
-- Salida
13
14
end ContadorAscendente ;
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
s <= contador ;
end behavioral ;
10.3.
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 1
192
Contadores
10.3.1.
Descripcin en VHDL
2
3
4
5
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
6
7
entity ContadorDescendente is
8
9
10
11
12
port (
clk
: in std_logic ;
reset_n : in std_logic ;
s
: out std_logic_vector (3 downto 0));
-- Salida
13
14
end ContadorDescendente ;
15
16
17
18
19
20
21
22
23
24
25
26
27
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 2
28
29
30
s <= contador ;
end behavioral ;
193
10 Contadores
Vcc
0
1
0
1
clk
a_d
s(0)
s(1)
s(2)
s(3)
0
1
clk
reset_n
a_d
0 1
s(0)
s(1)
s(2)
1 0
s(3)
10.4.
10.4.1.
Descripcin en VHDL
2
3
4
5
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
6
7
8
entity ContadorAscDesc is
194
9
10
11
12
13
Contadores
port (
clk
reset_n
a_d
s
:
:
:
:
in std_logic ;
in std_logic ;
in std_logic ;
-- asc (0)/ desc (1)
out std_logic_vector (3 downto 0)); -- Salida
14
15
end ContadorAscDesc ;
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
s <= contador ;
end behavioral ;
10.5.
10 Contadores
1
2
195
3
4
5
6
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
7
8
entity ContadorAscDescEnable is
9
10
11
12
13
14
15
port (
clk
reset_n
a_d
enable
s
:
:
:
:
:
in
in
in
in
out
std_logic ;
std_logic ;
std_logic ;
-- asc (0)/ desc (1)
std_logic ;
-- 1 cuenta , 0 mant
std_logic_vector (3 downto 0)); -- Salida
16
17
end ContadorAscDescEnable ;
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
s <= contador ;
end behavioral ;
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 3
196
10.6.
Contadores
Contadores mdulo m
3
4
5
6
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
7
8
entity ContadorAscModulo10 is
9
10
11
12
13
14
port (
clk
reset_n
enable
s
:
:
:
:
in
in
in
out
std_logic ;
std_logic ;
std_logic ;
-- 1 cuenta , 0 mant
std_logic_vector (3 downto 0)); -- Salida
15
16
end ContadorAscModulo10 ;
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
10 Contadores
197
32
33
34
35
end if;
end if;
end if;
end process ;
36
37
38
s <= contador ;
end behavioral ;
El circuito sintetizado a partir de la descripcin anterior se muestra en la figura 10.4. A la vista de la figura conviene destacar varias cosas:
En las FPGA slo existen flipflops tipo D, por lo que el contador se implanta
como n flipflops tipo D para almacenar los n bits de la cuenta y un sumador
para sumar 1.
El final de la cuenta se detecta con un comparador con 9, de forma que
cuando la comparacin es cierta, mediante un multiplexor se pone el valor 0
en la entrada D de los flipflops. As en el siguiente flanco el contador pasar a
valer 0. Cuando la cuenta es distinta de 9 el multiplexor conecta a la entrada
D la salida del sumador, que contiene el valor de la cuenta mas 1. De esta
forma se incrementar el contador en el siguiente flanco de reloj.
Los flipflops tipo D tienen una entrada de habilitacin ENA, la cual cuando
vale 0 mantiene el valor almacenado en el flipflop aunque llegue un flanco de
reloj y cuando vale 1 permite la carga de la entrada D en el flipflop cuando
llega un flanco de reloj.
198
10.6.1.
Contadores
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 4
if reset_n = 0 then
contador <= ( others => 0);
elsif clk event and clk = 1 then
if enable = 1 then
if contador = "0000" then
contador <= "1001";
else
contador <= std_logic_vector ( unsigned ( contador ) -1);
end if;
end if;
end if;
end process ;
10.7.
10 Contadores
199
1
2
3
4
5
6
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
7
8
entity ContadorAscMod10Co is
9
10
11
12
13
14
15
port (
clk
reset_n
enable
co
s
:
:
:
:
:
in
in
in
out
out
std_logic ;
std_logic ;
std_logic ;
-- 1 cuenta , 0 mant
std_logic ;
-- acarreo
std_logic_vector (3 downto 0)); -- Salida
16
17
end ContadorAscMod10Co ;
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
200
Contadores
Figura 10.7: Simulacin del contador ascendente decimal de tres cifras errneo.
36
end process ;
37
38
39
40
41
10.7.1.
Si el contador es descendente, el acarreo a la siguiente cifra es necesario generarlo en el paso de 0 a 9, pues es en ese momento en el que la siguiente cifra ha
201
10 Contadores
carga
e_p[3..0]
1
0
int main(void)
{
printf("Hola\n");
return 0;
}
10.8.
En los contadores mostrados hasta ahora existe una seal de reset que los inicializa a cero, pero a partir de este momento el contador slo puede incrementarse
o decrementarse. No obstante existen situaciones en las que es preciso poder cambiar el valor de la cuenta de un contador. Por ejemplo piense en un reloj digital. Si
queremos ponerlo en hora es necesario poder modificar el valor de la cuenta.
Para la realizacin de la carga paralelo basta con aadir un multiplexor a la
entrada de los flipflops que almacenan el valor de la cuenta, tal como se muestra
en la figura 10.8, en la que se ha aadido una carga paralelo al contador ascendente
mdulo 10 de la figura 10.4. Dicho multiplexor se controla mediante la seal carga,
de forma que cuanto esta seal es cero el contador cuenta en cada flanco de reloj y
cuando es 1 carga el valor presente en la entrada paralelo e_p en el contador cuando
se produzca el flanco de reloj.
202
Contadores
Descripcin en VHDL
Para describir en VHDL del contador anterior lo nico que hay que hacer es
aadir en la descripcin de los puertos las dos nuevas entradas (lnea 14) y dentro
del process un if para modelar el multiplexor (lnea 30).
1
2
3
4
5
6
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
7
8
entity ContadorAscMod10Co is
9
10
11
12
13
14
15
16
17
port (
clk
reset_n
enable
carga
e_p
co
s
:
:
:
:
:
:
:
in
in
in
in
in
out
out
std_logic ;
std_logic ;
std_logic ;
-- 1 cuenta , 0 mant
std_logic ;
-- carga paralelo
std_logic_vector (3 downto 0); -- e. par.
std_logic ;
-- acarreo
std_logic_vector (3 downto 0)); -- Salida
18
19
end ContadorAscMod10Co ;
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
203
10 Contadores
a_d enable
s
X0
X0
X0
X0
01
01
Uno
0001
Tres
0011
11
Reset_n=0
01
01
Siete
0111
Cinco
0101
11
X0
01
11
11
Nueve
1001
11
40
end process ;
41
42
43
44
45
10.9.
Hasta ahora, los contadores que hemos diseado cuentan segn una secuencia
de nmeros naturales consecutivos. No obstante en algunas situaciones se necesitan contadores que cuenten segn otra secuencia. Por ejemplo en la introduccin
se mencion la existencia de contadores que se saltan el 13 para no herir la sensibilidad de las personas supersticiosas.
En las secciones anteriores hemos visto que los contadores normales se implantan como una serie de flipflops tipo T o como un conjunto de flipflops tipo D
con un sumador para incrementar (o decrementar) la cuenta. Esto es as precisamente porque estos contadores generan una secuencia de nmeros consecutivos.
En los contadores de secuencia arbitraria, la nica alternativa para implementarlos
es usar una mquina de estados en la que cada valor de la cuenta se representa por
un estado.
Por ejemplo, si queremos disear un contador ascendente/descendente que
cuente segn la secuencia 1, 3, 5, 7, 9, la mquina de estados quedara como
la mostrada en la figura 10.9. Dicha mquina dispone de dos entradas: a_d para
seleccionar el sentido de la cuenta (0 ascendente, 1 descendente) y enable para
habilitar la cuenta, de forma que cuando esta seal vale cero el contador no cambia
de estado y mantiene el valor de la cuenta y cuando vale 1 cambia de estado en
sentido ascendente o descendente en funcin de la seal a_d.
Para la implantacin fsica de la mquina de la figura 10.9 existen dos alternativas. La primera es codificar los estados de forma independiente al valor de las
salidas, al igual que hemos hecho en todas las mquinas de estados diseadas en el
captulo 8. En este caso si usamos una codificacin de estados binaria, en general se
necesitarn menos flipflops para almacenar el estado; pero a cambio ser necesario
aadir una lgica para generar las salidas del contador a partir del estado actual.
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 8
204
Contadores
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 9
1
2
3
4
5
library ieee;
use ieee. std_logic_1164 .all;
6
7
entity ContadorSecArb is
8
9
10
11
12
13
14
port (
clk
reset_n
a_d
enable
s
:
:
:
:
:
in
in
in
in
out
std_logic ;
std_logic ;
std_logic ;
std_logic ;
std_logic_vector (3 downto 0));
15
16
end ContadorSecArb ;
17
18
19
20
21
10 Contadores
22
23
24
205
25
26
begin
-- behavioral
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
206
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Contadores
85
86
87
s <= estado_act ;
end behavioral ;
10.10.
Ejercicios
1. Modifique el cdigo del contador binario ascendente mostrado en la seccin 10.2 para que el nmero de bits del contador sea un parmetro genrico.
2. Modifique el cdigo del contador binario descendente mostrado en la seccin 10.3 para que el nmero de bits del contador sea un parmetro genrico.
3. Sustituya en el contador ascendente descendente con habilitacin de la cuenta
de la seccin 10.5 las seales enable y a_d por las seales cuenta_arriba y
cuenta_abajo. El funcionamiento del contador con estas nuevas seales ser
el siguiente: en cada flanco de reloj si est activa la seal cuenta_arriba el
contador se incrementar y si est activa la seal cuenta_abajo el contador
se decrementar. Cuando ambas seales estn activas a la vez o desactivas,
el contador mantendr su valor.
4. Modifique el contador ascendente mdulo 10 de la seccin 10.6 para convertirlo en un contador ascendente/descendente mdulo 10.
5. Modifique el contador ascendente mdulo 10 con acarreo de la seccin 10.7
para convertirlo en un contador ascendente/descendente. Tenga en cuenta
que existir una sola salida de acarreo co que se activar cuando el contador
10 Contadores
207
Captulo 11
11.1.
Introduccin
Ruta de datos
Entradas de control
Seales de estado
Circuito de control
Seales de control
Salidas de estado
Datos de salida
210
un lado existe una parte encargada de encaminar los datos por el circuito, realizando ciertos procesos sobre ellos. A esta parte se le denomina ruta de datos, camino
de datos o datapath en ingls. El camino de datos est compuesto por registros
donde se almacenan los datos, circuitos aritmticos donde se hacen operaciones
con los datos, multiplexores para regular el trasiego de datos entre bloques, contadores, etc. Podemos pensar en ella como el lugar en el que se hace el trabajo
duro del sistema. Para ello, la ruta de datos contendr una serie de seales para
controlarla. Por ejemplo los registros tendrn seales de enable para habilitarlos,
los multiplexores tienen entradas de seleccin, etc. Por otro lado la ruta de datos
tambin dispondr de una serie de seales que nos informan sobre el su estado.
Por ejemplo, los contadores nos informarn del fin de una cuenta, los sumadores si
ha ocurrido un desbordamiento, etc.
La segunda parte consiste en un circuito que mediante la lectura de las seales
de estado y el manejo de las seales de control de la ruta de datos es capaz de
conseguir que el circuito realice su funcin. Este circuito tambin necesita seales
externas, como por ejemplo un pulsador que le indique que tiene que comenzar su
trabajo o un led con el que indique si se ha producido un error. Se puede decir
por tanto que este circuito es el que aporta la inteligencia al sistema digital y
normalmente se construye mediante una mquina de estados.
Lamentablemente no hay una metodologa rgida para realizar el proceso de
diseo, por lo que en este captulo vamos a introducirla mediante el estudio de una
serie de ejemplos que ilustrarn como enfrentarse al diseo de un sistema digital
complejo.
11.2.
211
sube
baja
fc_arr
fc_abj
det_coche
en_cnt
clk
E
Contador FC
fin_cuenta
reset_n
11.2.1.
Camino de datos
El camino de datos en este caso es muy sencillo, pues consta tan solo de un contador para realizar la temporizacin de cinco segundos y de las seales de entrada
y salida para controlar la barrera, tal como puede verse en la figura 11.2.
Si suponemos que el reloj del sistema es de 50 MHz, necesitaremos un contador
que cuente hasta:
cuenta = 5 s 50 000 000 Hz = 250 000 000
Como:
11.2.2.
Circuito de control
212
resto
resto
resto
det_coche = 1
Reposo
Subiendo
sube
resto
det_coche = 0
fc_arr = 1
Espera5
en_cnt
Abierta
det_coche = 1
e
ch
co
t_
de
Reset_n=0
resto
=
1
fc_abj = 1 &
det_coche = 0
&
1
=
a 0
t
n =
ue e
_c ch
fin t_co
de
Bajando
baja
implementarlo con una mquina de estados, cuyo diagrama se muestra en la figura 11.3. En este diagrama se ha usado una notacin menos formal que la usada en
el captulo 8 aunque ms prctica cuando tenemos un gran nmero de seales. En
ella se ha puesto en cada transicin slo la entrada o combinacin de entradas que
la activa. El resto de combinaciones de entradas hace que la mquina permanezca
en el mismo estado, lo cual se representa con la transicin al mismo estado con
la palabra resto. De la misma forma en cada estado slo se han representado las
salidas que se ponen a uno en dicho estado, limitndonos a poner su nombre. El
resto de salidas permanecern a cero en dicho estado.
Como se puede ver en la figura 11.3, el comportamiento del circuito de control
es el especificado en el apartado anterior. Cuando se detecte un coche se pasar
al estado Subiendo, donde se subir la barrera. En este estado permaneceremos
hasta que se active el fin de carrera fc_arr que detecta que la barrera ha subido
por completo; pasando al estado Abierta. En este estado permaneceremos hasta
que deje de detectarse el coche. En este momento pasaremos al estado Espera5,
donde arrancaremos el contador y esperaremos a que nos indique mediante su
salida fin_cuenta que han pasado los 5 segundos. Si antes de que esto ocurra se
vuelve a detectar otro coche se pasar de nuevo al estado Abierta, pues es necesario
mantener la puerta abierta hasta que termine de pasar el coche si no queremos
causarle graves perjuicios a su dueo. Si no se detecta un coche pasados los 5
segundos, pasamos al estado Bajando para bajar la barrera. Si se detecta un coche
en este estado pasaremos al estado Subiendo para darle paso. Si no se detecta y
vemos que la barrera ha llegado abajo pasamos al estado de Reposo a esperar un
nuevo coche.
11.2.3.
213
Descripcin en VHDL
3
4
5
6
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
7
8
entity BarreraAparcamiento is
9
10
11
12
13
14
15
16
17
port (
clk
reset_n
fc_arr
fc_abj
det_coche
sube
baja
:
:
:
:
:
:
:
in
in
in
in
in
out
out
std_logic ;
std_logic ;
std_logic ;
std_logic ;
std_logic ;
std_logic ;
std_logic );
------
18
19
end BarreraAparcamiento ;
20
21
22
23
24
25
26
27
28
29
30
214
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
-- Camino de datos.
----------------------------------------------------------Conta5Seg : process (clk , reset_n )
begin -- process Conta5Seg
if reset_n = 0 then
contador <= ( others => 0);
elsif clk event and clk = 1 then
if en_cnt = 1 then
contador <= contador + 1;
else
contador <= ( others => 0);
end if;
end if;
end process Conta5Seg ;
fin_cuenta <= 1 when contador = 249999999 else
0;
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
215
if det_coche = 0 then
estado_sig <= Espera5 ;
end if;
when Espera5 =>
if det_coche = 1 then
estado_sig <= Abierta ;
elsif fin_cuenta = 1 then
estado_sig <= Bajando ;
end if;
when Bajando =>
if det_coche = 1 then
estado_sig <= Subiendo ;
elsif fc_abj = 1 then
estado_sig <= Reposo ;
end if;
when others =>
estado_sig <= Reposo ;
end case;
end process ;
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 1
216
11.3.
En esta seccin vamos a disear un circuito que nos han pedido los organizadores de los festejos taurinos de Navas del Olivo. Dicho circuito ha de ser capaz
de medir la velocidad de los toros antes de adquirirlos. Para ello han ideado un
sistema que consiste en un pasillo de 10 metros de longitud en cuyo inicio y fin se
han situado dos clulas fotoelctricas que se activan al paso del toro, tal como se
muestra en la figura 11.5. Para medir la velocidad del toro se colocar a ste al principio del pasillo y desde el final se le ensear un capote para que salga corriendo
en su busca. El circuito ha de medir el tiempo que emplea en recorrer los 10 m y a
partir de ste calcular su velocidad media. Para medir este tiempo, se arrancar un
temporizador cuando se active la primera clula (seal cel_ini) y se parar cuando
llegue al final (seal cel_fin). Mientras se est midiendo el tiempo se activar la
salida midiendo para indicarlo. Una vez medido el tiempo, si la velocidad media
supera los 20 km/h se dar el toro por bueno y se activar la seal toro_bueno.
Si por el contrario la velocidad es menor o igual a los 20 km/h se activar la seal
toro_malo para que dicho toro sea desechado. Ambas seales han de mantenerse
activas hasta que se de el reset al circuito o hasta que pase otro toro por la clula
inicial.
10 m
cel_ini
cel_fin
C.C.T.
midiendo
toro_bueno
toro_malo
217
midiendo_i
puesta_a_0
en_cnt
clk
reset_n
clr
en
co
CntDecSeg
puesta_a_0
co_decimas
clk
reset_n
tmp_toro
clr
en
TmpToro
18
midiendo
toro_bueno
<
>=
Comparador
toro_malo
11.3.1.
Ruta de datos
Pensando un poco el problema anterior, lo nico que necesitamos hacer es calcular el tiempo que empleara un toro en recorrer los 10 metros del pasillo si fuese a
20 km/h de media y comparar ese tiempo con el empleado por el toro cuya calidad
se desea comprobar. Si el tiempo es menor el toro ser bueno y si es mayor o igual
el toro ser malo.
Para calcular el tiempo, teniendo en cuenta la ecuacin del movimiento rectilneo
y uniforme se obtiene:
v=
s
t
t=
s
v
10m
20 km/h
10 m
20 000 m/3600 s
10 3 600 s
20 000
= 1, 8 s
218
resto
resto
cel_ini = 1
Reposo
Reset_n=0
CelIni
puesta_a_0
Carrera
midiendo_i
en_cnt
=1
cel_fin
11.3.2.
Circuito de control
El circuito de control es un poco ms simple que el de la barrera de aparcamiento, tal como se muestra en el diagrama de estados de la figura 11.7. Cuando se
activa cel_ini se pasa al estado CelIni donde se activa la seal puesta_a_0 para
poner a cero los temporizadores. De este estado se pasa a Carrera donde se activa
la seal midiendo_i y se da el enable a los contadores. Cuando el toro llegue al
final de la carrera y se active la seal cel_fin se pasa al estado de Reposo, donde
se desactiva el enable de los contadores y la seal midiendo_i. Al haber quitado
el enable de los contadores, stos mantienen su valor, con lo que en las salidas
del comparador tendremos si el tiempo empleado ha sido menor de 1,8 segundos y
por tanto el toro es bueno o viceversa. Al haber desactivado la seal midiendo_i el
resultado del comparador se mostrar en las salidas hasta que salgamos de dicho
estado.
1
Otra alternativa de diseo a la propuesta es construir un temporizador similar al diseado
en la seccin anterior que incrementase su cuenta en cada ciclo de reloj y comparar la salida
del dicho temporizador con 1,8 s 50MHz = 90 106 . Aunque la solucin tambin es vlida, para
comparar el valor del temporizador con 90 106 necesitaremos un comparador de 27 bits, ya que
log2 (90 106 ) = 26, 42. Obviamente la solucin propuesta, al necesitar slo un comparador de 5
bits, necesita menos hardware.
11.3.3.
219
Descripcin en VHDL
3
4
5
6
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
7
8
entity ControlCalidadToros is
9
10
11
12
13
14
15
16
port (
clk
reset_n
cel_ini , cel_fin
midiendo
toro_bueno
toro_malo
:
:
:
:
:
:
in
in
in
out
out
out
std_logic ;
std_logic ;
std_logic ;
std_logic ;
std_logic ;
std_logic );
-- clulas fotoelct.
17
18
end ControlCalidadToros ;
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
220
40
begin
-- behavioral
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
221
0;
tmp_menor_18 <= 1 when tmp_toro < 18 else
0;
87
88
89
90
91
-- Leds de salida
toro_bueno <= tmp_menor_18 and (not midiendo_i );
toro_malo <= tmp_mayor_ig_18 and (not midiendo_i );
midiendo <= midiendo_i ;
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
222
128
129
130
131
132
133
134
135
136
137
138
139
140
puesta_a_0 <= 0;
en_cnt <= 0;
case estado_act is
when Reposo =>
null;
when CelIni =>
puesta_a_0 <= 1;
when Carrera =>
midiendo_i <= 1;
en_cnt <= 1;
when others => null;
end case;
end process Salidas ;
141
int main(void)
{
printf("Hola\n");
return 0;
}
Realice el ejercicio 2
142
end behavioral ;
Una simulacin del circuito se muestra en la figura 11.8. En ella se ha cambiado
el valor de la contador de dcimas a 4 para poder realizar la simulacin en un tiempo
razonable y poder visualizarla mejor.
11.4.
11.4.1.
El algoritmo DoubleDabble
223
de bits del nmero binario. Por ejemplo, si queremos convertir el nmero binario
1100 (12), empezaramos escribiendo:
Dec.
Unid.
Bin.
1100
El algoritmo se basa en desplazar tantas veces como bits tengamos para ir introduciendo los bits del nmero binario en las posiciones reservadas para los dgitos
en BCD. As, tras los tres primeros desplazamientos tendremos:
Dec.
Unid.
1
11
110
Bin.
1100
100
00
0
Que de momento no indican ningn peligro, ya que tanto las decenas como
las unidades contienen dgitos BCD vlidos. El problema viene al realizar el cuarto
desplazamiento, ya que el dgito de las unidades se convierte en un dgito invlido:
Dec.
Unid.
1
11
110
1100
Bin.
1100
100
00
0
Para arreglar semejante desaguisado habra que sumar 6 y acarrear (es decir
sumar) uno a la siguiente cifra. No obstante el acarreo a la siguiente cifra nos
lo podemos ahorrar si nos damos cuenta que al desplazar a la izquierda estamos
multiplicando por dos. Teniendo esto en cuenta, si en lugar de desplazar y sumar
6 si vemos que el dgito BCD contiene un valor mayor o igual a 10, sumamos 3 si
el dgito tiene un valor mayor o igual a 5 y luego desplazamos; matemticamente
estamos haciendo lo mismo. La diferencia prctica de la segunda opcin sin embargo
es considerable. Si tenemos en cuenta que 5 + 3 = 8 y el 8 en binario es 1000, cuando
realicemos el desplazamiento, el 1 del 1000 va a pasar a la siguiente cifra, con lo que
nos estamos ahorrando el acarreo. Con el resto de nmeros nos ocurrir lo mismo
al sumar 3: el acarreo nos saldr gratis. Por tanto el algoritmo queda:
Accin
Despl.
Despl.
Despl.
Suma 3
Despl.
Dec.
Unid.
1
11
110
1001
0010
Bin.
1100
100
00
0
0
224
11.4.2.
Cent.
1
1
10
2
Dec.
Unid.
1
1
11
0110
1001
0010
0010
0101
5
1
11
111
1010
0101
1000
0001
0011
0011
0111
1010
0100
4
Bin.
1111
1111
1111
1111
1111
1110
1110
110
10
10
0
0
1110
110
10
0
0
Camino de datos
225
puesta_a_0
en_cnt
clk
reset_n
clr
en
puesta_a_0
despl
suma_3
es
ss
RegDespl
Bin2BCD
clk
reset_n
d_ss
clk
reset_n
co
fin_cnt
CntBits
puesta_a_0
despl
suma_3
es
ss
RegDespl
Bin2BCD
u_ss
clk
reset_n
puesta_a_0
despl
suma_3
es
ss
RegDespl
Bin2BCD
reg_bin(7)
clk
reset_n
c_bcd
d_bcd
u_bcd
crg_bin
despl
RegDesplBin
Un registro de desplazamiento de entrada paralelo salida serie denominado RegDesplBin en el que se carga el nmero en binario (mediante la seal
crg_bin) y luego se desplaza para realizar la conversin (mediante Despl).
Tres registros de desplazamiento de entrada serie salida paralelo denominados RegDesplBin2BCD. Estos registros disponen de tres entradas de control:
puesta_a_0 para ponerlos a cero al inicio de la conversin, despl para desplazar un bit a la izquierda y suma_3 que hace que el circuito sume 3 a su
contenido si ste es mayor que 4. En caso contrario la seal suma_3 no har
nada.
Los cuatro registros se han conectado en serie para que la salida serie de cada uno
de ellos sea la entrada del registro situado a su izquierda.
11.4.3.
Circuito de control
226
resto
fin_cnt = 0
conv = 1
Reposo
Carga
crg_bin
puesta_a_0
Desplaza
despl
en_cnt
con
v=
nt
fi n
_c
resto
Reset_n=0
Suma3
suma_3
FinConv
hecho
11.4.4.
Descripcin en VHDL
3
4
5
6
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
7
8
entity RegDesplBin2BCD is
9
10
11
12
13
14
15
16
17
18
port (
clk
reset_n
es
despl
suma_3
pst_a_0
n_bcd
ss
:
:
:
:
:
:
:
:
in std_logic ;
in std_logic ;
in std_logic ;
-- Entrada serie
in std_logic ;
-- Desplazamiento
in std_logic ;
-- Suma 3 (si procede )
in std_logic ;
-- Puesta a 0
out std_logic_vector (3 downto 0); -- Salida BCD
out std_logic );
-- Salida serie
19
20
end RegDesplBin2BCD ;
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
227
43
44
45
46
47
-- Asignacin de salidas
n_bcd <= std_logic_vector ( n_bcd_i );
ss <= n_bcd_i (3);
-- La salida serie es el MSB
end behavioral ;
En segundo lugar se ha descrito el resto de la ruta de datos, la cual instancia
tres registros de desplazamiento de los descritos en el archivo anterior. En el mismo
archivo tambin se describe la mquina de estados de control. Fjese que tanto la
ruta de datos como el circuito de control son un reflejo de las figuras 11.9 y 11.10
1
2
3
4
5
6
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
7
8
entity ConvBin2BCD is
9
10
11
12
13
14
15
16
17
port (
clk
reset_n
n_bin
conv
hecho
u_bcd
d_bcd
:
:
:
:
:
:
:
in
in
in
in
out
out
out
std_logic ;
std_logic ;
std_logic_vector (7 downto 0); -- Entr. bin.
std_logic ;
-- Arranca conversin
std_logic ;
-- Fin conversin
std_logic_vector (3 downto 0); -- Unid. BCD
std_logic_vector (3 downto 0); -- Dec. BCD
228
18
c_bcd
19
20
end ConvBin2BCD ;
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
component RegDesplBin2BCD
port (
clk
: in std_logic ;
reset_n : in std_logic ;
es
: in std_logic ;
despl
: in std_logic ;
suma_3 : in std_logic ;
pst_a_0 : in std_logic ;
n_bcd
: out std_logic_vector (3 downto 0);
ss
: out std_logic );
end component ;
50
51
52
53
54
begin -- behavioral
-------------------------------------------------------------- Ruta de datos
-------------------------------------------------------------
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
if crg_bin = 1 then
reg_bin <= unsigned (n_bin );
elsif despl = 1 then
-- Despl . a izq.
reg_bin (7 downto 1) <= reg_bin (6 downto 0);
reg_bin (0)
<= 0; -- Se rellena con ceros .
end if;
end if;
end process RegDesplBin ;
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
229
230
106
107
n_bcd
ss
=> c_bcd ,
=> open );-- La ltima salida serie se descarta
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
-- Reset asncrono
-- ( activo bajo)
-- Flanco de subida
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
231
end behavioral ;
Una simulacin del circuito se muestra en la figura 11.11.
232
11.5.
mosi (Master Out Slave In). Salida de datos desde el maestro hacia el esclavo.
miso (Master In Slave Out). Entrada de datos provenientes del esclavo hacia
el maestro.
233
Master
Slave
SCLK
MOSI
MISO
sclk
ce_n
Ciclo
miso z
mosi
234
dato_in
miso
bit_rec
Q
en_bit_rec D
carga
en
despl
clk
reset_n
clk
reset_n
puesta_a_0
co
clr
en_div_reloj
en
clk
DivReloj
reset_n
dato_out
es
reg_bin(7)
ss
set_ce
ce_n
Q
clear_ce S
R
clk
reset_n
mosi
RegDespl
fin_semi_per_clk
clk
reset_n
sclk puesta_a_0
en_cnt_bits
clk
reset_n
co
clr
en
fin_cnt_bits
CntBits
responde nada, por lo que el maestro ha de descartar los bytes recibidos durante
el envo de la direccin. De la misma forma, para que el esclavo enve el dato al
maestro, ste ha de enviarle algo, aunque sea basura que el esclavo se encargar de
descartar.
11.5.1.
Ruta de datos
235
resto
resto
envia = 1
fin_semi_per_sclk = 1
BajaCE
carga
puesta_a_0
clear_ce
Reset_n=0
resto
env
i
a=
SubeCE
set_ce
hecho
EspFlSub
en_div_reloj
fin_cnt_bits = 0
Reposo
Muestrea
en_div_reloj
en_bit_rec
resto
Desplaza
EspFlBaj
en_div_reloj
en_div_reloj
en_cnt_bits
despl
fin_semi_per_sclk = 1
fin_cnt_bits = 1
11.5.2.
Circuito de control
236
dato varias veces si la seal envia est activa demasiado tiempo, en este estado se
espera a que dicha seal pase a cero antes de volver al estado de reposo.
11.5.3.
Descripcin en VHDL
3
4
5
6
library ieee;
use ieee. std_logic_1164 .all;
use ieee. numeric_std .all;
7
8
entity MaestroSPI is
9
10
11
12
13
14
15
16
17
18
19
20
port (
clk
:
reset_n :
dato_in :
dato_out :
envia
:
hecho
:
ce_n
:
sclk
:
miso
:
mosi
:
in
in
in
out
in
out
out
out
in
out
std_logic ;
std_logic ;
std_logic_vector (7 downto 0);
std_logic_vector (7 downto 0);
std_logic ;
std_logic ;
std_logic ;
std_logic ;
std_logic ;
std_logic );
21
22
end MaestroSPI ;
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
237
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
238
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
if en_div_reloj = 0 then
div_reloj <= ( others => 0);
sclk_i <= 0;
else
if div_reloj = c_semi_per_sclk then
div_reloj <= ( others => 0);
sclk_i <= not sclk_i ;
else
div_reloj <= div_reloj + 1;
end if;
end if;
end if;
end process DivReloj ;
fin_semi_per_sclk <= 1 when div_reloj = c_semi_per_sclk
else 0;
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
239
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
240
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
if fin_semi_per_sclk = 1 then
estado_sig <= Muestrea ;
end if;
when Muestrea =>
estado_sig <= EspFlBaj ;
when EspFlBaj =>
if fin_semi_per_sclk = 1 then
estado_sig <= Desplaza ;
end if;
when Desplaza =>
if fin_cnt_bits = 1 then
estado_sig <= SubeCE ;
else
estado_sig <= EspFlSub ;
end if;
when SubeCE =>
if envia = 0 then -- Por si enva est an activo
estado_sig <= Reposo ;
end if;
when others =>
estado_sig <= Reposo ;
end case;
end process ;
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
241
213
214
215
216
217
218
219
220
221
222
223
224
225
226
en_div_reloj <= 1;
en_bit_rec <= 1;
when EspFlBaj =>
en_div_reloj <= 1;
when Desplaza =>
en_div_reloj <= 1;
en_cnt_bits <= 1;
despl <= 1;
when SubeCE =>
set_ce <= 1;
hecho <= 1;
when others => null;
end case;
end process Salidas ;
227
228
int main(void)
{
printf("Hola\n");
return 0;
}
end behavioral ;
Una simulacin del circuito se muestra en la figura 11.16.
11.6.
Ejercicios
Realice el ejercicio 4
242
4. A partir del maestro SPI diseado en la seccin 11.5, disee un esclavo SPI.
Para ello tenga en cuenta lo siguiente:
Al igual que el maestro dispondr de una seal de entrada paralelo
(dato_in) y de otra seal de salida paralelo (dato_out).
Las seales de reloj sclk y de habilitacin ce_n sern ahora entradas.
La seal miso ser ahora una salida y la seal mosi ser una entrada.
Cuando la seal ce_n se ponga a cero cargar el dato presente en la
entrada paralelo dato_in en el registro de desplazamiento.
El esclavo no necesita generar el reloj, limitndose a muestrear el dato
cuando llegue un flanco se subida y a desplazarlo cuando llegue un
flanco de bajada.
El circuito dispondr de una salida fin_tr para indicar que ha terminado una transmisin correcta y que por tanto (si procede) habr un dato
disponible en la salida dato_out.
La seal fin_tr se activar cuando se hayan recibido los 8 bits.
Si antes de haber recibido los 8 bits se desactiva la seal ce_n es porque
ha ocurrido algn error en la transmisin y por tanto no hay que tener
en cuenta ninguno de los bits recibidos. Se pasar entonces al estado de
reposo sin activar la seal fin_tr.
Bibliografa
[Augarten, 1983] Augarten, S. (1983). State of the Art. A photographic history of the
integrated circuit. Tichnor & Fields, New Haven and New York, 1 edition.
[Boole, 1854] Boole, G. (1854). An investigation of the laws of thought. http:
//www.archive.org/details/investigationofl00boolrich. [Online; ltimo
acceso 13 de Febrero de 2011].
[Chu-Carroll, 2006] Chu-Carroll, M. C. (2006). Good math, bad math : Roman numerals and arithmetic. http://scienceblogs.com/goodmath/2006/08/roman_
numerals_and_arithmetic.php. [Online; ltimo acceso 10 de Mayo de 2010].
[Goldstine and Goldstine, 1996] Goldstine, H. and Goldstine, A. (1996). The electronic numerical integrator and computer (ENIAC). Annals of the History of Computing, IEEE, 18(1):1016.
[Intel, 1973] Intel (1973).
4004 schematics.
http://www.intel.com/about/
companyinfo/museum/exhibits/4004/docs.htm. [Online; ltimo acceso 10 de
Febrero de 2011].
[Marks II, 1991] Marks II, R. J. (1991). Introduction to Shannon Sampling and Interpolation Theory. Springer-Verlag.
[Van der Spiegel, 1995] Van der Spiegel, J. (1995). Eniac-on-a-Chip project web
page. http://www.ese.upenn.edu/~jan/eniacproj.html. [Online; ltimo acceso 20 de Enero de 2011].
[Wikipedia, 2010] Wikipedia (2010). Maya numerals Wikipedia, the free encyclopedia. http://en.wikipedia.org/w/index.php?title=Maya_numerals&oldid=
358828137. [Online; ltimo acceso 10 de Mayo de 2010].
[Wikipedia, 2011] Wikipedia (2011). Apollo guidance computer Wikipedia, the free
encyclopedia.
http://en.wikipedia.org/wiki/Apollo_Guidance_Computer.
[Online; ltimo acceso 5 de Febrero de 2011].
243
ndice alfabtico
245