Está en la página 1de 77

8 MQUINAS DE ESTADO

Las mquinas de estado finito (FSM) constituyen una especial tcnica de


modelado de los circuitos lgicos secuenciales. Este modelo puede ser muy
til en el diseo de ciertos tipos de sistemas, especialmente aquellos cuyas
tareas forman una secuencia bien definida (controladores digitales, por
ejemplo). Comenzamos el captulo mediante la revisin de los conceptos
fundamentales
relacionados
con
el
FSM.
Introducimos
VHDL
correspondientes tcnicas de codificacin, seguidos de ejemplos de diseo
completo.
Nota: VHDL es un lenguaje definido por el IEEE (Institute of Electrical and Electronics
Engineers), usado por ingenieros y cientficos para describir circuitos digitales o modelar
fenmenos cientficos respectivamente. VHDL es el acrnimo que representa la
combinacin de VHSIC y HDL, donde VHSIC es el acrnimo de Very High Speed
Integrated Circuit y HDL es a su vez el acrnimo de Hardware Description Language.
8.1 Introduccin
La figura 8.1 muestra el diagrama de bloques de una sola fase de mquina
de estado. Como se indica en la figura, la seccin inferior contiene la lgica
secuencial (flip-flops), mientras que la seccin superior contiene la lgica
combinacionales.
Los combinacionales (seccin superior) tiene
dos entradas, siendo uno pr_state (estado
actual) y el otro la entrada externa correcta.
Tambin tiene dos salidas, nx_state (estado
siguiente) y la salida externa adecuada.
La secuencial (seccin inferior) tiene tres
entradas (reloj, reset y nx_state) y una salida
(pr_state). Dado que todos los flip-flops son en
esta parte del sistema, reloj y reset debe
estar conectado a ella.
Si la salida de la mquina no slo depende del estado actual sino tambin
en la entrada actual, se denomina una mquina Mealy. De lo contrario, si
slo depende de la situacin actual, se llama una mquina de Moore.
Ejemplos de ambos se mostrar ms tarde.
La separacin del circuito en dos secciones (figura 8.1) permite que el
diseo sea dividido en dos partes. Desde una perspectiva de VHDL, es
evidente que la parte inferior, siendo secuencial, exigir un proceso,
mientras que la parte superior, siendo combinacional, no lo har. Sin
embargo, recordar que el cdigo secuencial puede implementar ambos tipos
de lgica, combinacionales as como secuenciales. Por lo tanto, si se desea,
la parte superior tambin puede implementarse a travs de un proceso.
Las seales de reloj y reset normalmente aparecen en la lista de la
sensibilidad de la parte inferior de la seccin del proceso. Cuando el reset es
reclamado, pr_state se establece en el estado inicial del sistema. Otra cosa,
en el buen reloj de borde el flip-flops almacenar nx_state, transfiriendo a la
seccin inferior de salida (pr_state).

Un aspecto importante relacionado con el FSM enfoque es que, aunque


cualquier circuito secuencial en principio puede ser modelada como una
mquina de estado, esto no siempre es ventajosa.
La razn es que el cdigo podra alargarse, ms complejo y ms propenso a
errores que en un enfoque convencional. Esto es a menudo el caso de
simple circuitos registrados, como contadores. Otro aspecto importante, que
ya se destac en el comienzo del captulo 5, es que no todos los circuitos
que poseen memoria son necesariamente secuencial.
Una memoria RAM (Memoria de Acceso Aleatorio) fue dada como un
ejemplo. En l, la operacin de lectura de memoria slo depende de los bits
de direccin aplica actualmente a la RAM (entrada de corriente), con el valor
recuperado que no tiene nada que ver con los accesos a la memoria
anteriores (entradas anteriores). En tales casos, el enfoque de los FSM no es
aconsejable.
8.2 Diseo Estilo #1
Varios enfoques puede ser concebida para disear un FSM. Describiremos
en detalle un estilo que est bien estructurado y fcilmente aplicable. En
ella, el diseo de la seccin inferior de la mquina de estado (figura 8.1)
est completamente separada de la de la parte superior de la seccin. Todos
los estados de la mquina siempre se declaran explcitamente mediante un
tipo de datos enumerado. Despus de la introduccin de ese estilo de
diseo, examinaremos desde un datos perspectiva de almacenamiento, a fin
de comprender ms y perfeccionar su construccin, que conducir a un
estilo diseo #2.
Diseo de la seccin inferior (secuencial)
En la figura 8.1, los flip-flops estn en la parte inferior de la seccin, de
modo reloj y reset estn conectados a l. La otra entrada de la seccin
inferior es nx_state (estado siguiente), mientras que el pr_state (estado
actual) es su nica salida. Siendo el circuito de la seccin inferior secuencial,
se requiere un proceso, en el que cualquiera de las instrucciones
secuenciales (IF, WAIT, CASE or LOOP, captulo 6) pueden ser empleadas.
Una plantilla de diseo tpico para la seccin inferior es la siguiente:

El cdigo mostrado anteriormente es muy simple. Se compone de un reset


asncrono, que determina el estado inicial del sistema (estado0), seguida
por el almacenamiento sincrnico de nx_state (en la transicin positiva del
reloj), la cual producir pr_state en la parte inferior de la seccin de salida
(figura 8.1).
Desde la seccin 7.5, sabemos que el nmero de flip-flops inferido a partir
del cdigo anterior es simplemente igual al nmero de bits necesarios para

codificar todos los miembros de la FSM (porque la nica seal a la que se


asigna un valor a la transicin de otra seal es pr_state). Por lo tanto, si el
defecto (binario) estilo de codificacin (seccin 8.4) se usa, simplemente
log2n
flip-flops ser entonces necesario, donde n es el nmero de
miembros.
Diseo de la seccin superior (Combinacionales)
En la figura 8.1, la seccin superior est totalmente combinacionales, por lo
que su cdigo no deben ser secuenciales; cdigo concurrente puede
utilizarse como bien. Sin embargo, en la plantilla de diseo se muestra a
continuacin, el cdigo secuencial fue contratado, con la instruccin CASE
jugando el papel central.

Como puede verse, este cdigo tambin es muy simple, y hace dos cosas:
(a) asigna el valor de salida y (b) se establece el siguiente estado. Todas las
seales de entrada estn presentes en la lista sensibilidad y todas las
combinaciones de entrada/salida estn especificados.
Plantilla de diseo de la mquina de estado estilo #1
Una plantilla completa se muestra a continuacin. Observe que, adems de
los dos procesos presentados anteriormente, tambin definida por el usuario
contiene un tipo de datos enumerado (aqu llamado estado), que enumera
todos los posibles estados de la mquina.

Ejemplo 8.1:
Un contador Contador BCD es un ejemplo de mquina de Moore, por la
salida slo depende de la almacenada (estado actual). Como un simple
circuito y registrado como un secuenciador, puede aplicarse fcilmente en
cualquiera de los dos enfoque: convencional (como ya hemos hecho en
anteriores captulos) o tipo de FSM. El problema con este ltimo es que
cuando el nmero de Estados es grande resulta engorroso enumerarlos
todos, un problema evitado fcilmente utilizando la instruccin LOOP en un
enfoque convencional.
El estado diagrama de un 0-en-9 Contador circular se muestra en la figura
8.2. Los Estados fueron llamados cero, uno, ..., 9, cada nombre
correspondiente al valor decimal de la salida.
Un cdigo VHDL, semejante a la del estilo de diseo de plantilla #1, se
presenta abajo. Un tipo de datos enumerado (Estado) aparece en las lneas

11 a 12. El diseo de la seccin inferior (sobre aceleracin) es presentado


en las lneas 16 a 23, y de la seccin superior (combinacionales), en las
lneas 25 a 59. En este ejemplo, el nmero de registros es log2 (10)=4.
Los resultados de la simulacin se muestran en la figura 8.3. Como puede
verse, la salida (count) crece de 0 a 9 y, a continuacin, reinicia desde el 0
de nuevo.

Ejemplo 8.2: Simple FSM #1


figura 8.4 muestra la Diagrama de estados de una muy simple el FSM. El
sistema tiene dos estados (stateA y stateB) y debe cambiar de una a otra
cada vez d = '1' es recibido. La salida deseada es x = a cuando la mquina
est en stateA o x = b cuando en stateB. El estado inicial (reset) es state A.
Un cdigo VHDL para este circuito, empleando un estilo diseo #1, se
muestra a continuacin.

Resultados de simulacin relativa al cdigo anterior se muestran en la figura


8.5. Observe que el circuito funciona como se espera. De hecho, buscando
en los archivos de informe, se verificar que, como se esperaba, slo un flipflop fue requerido para implementar este circuito debido a que slo hay dos
estados que se van a codificar. Observe tambin que la seccin superior
est hecho com- binacionales, para la salida (x), que en este caso no
dependen de las entradas (a o b, dependiendo de en qu estado se
encuentra en la mquina), vara al variar a o b, independientemente de clk.
Si se requiere una salida sincrnica y, a continuacin, estilo de diseo #2
deberan ser utilizados.
8.3 Diseo Estilo #2 (salida) almacenados

como hemos visto, en un diseo de estilo #1 slo pr_state es almacenado.


Por lo tanto, el circuito global pueden resumirse como en la figura 8.6(a).
Observe que en este caso, si se trata de una mquina de Mealy (cuya salida
depende de la entrada actual), la salida podra cambiar cuando los cambios
de entrada (salida asncrona). Hacer Mealy mquinas sincrnicas, la salida
debe ser almacenada, como se muestra en la figura 8.6(b).
Esta estructura es el objeto de estilo de diseo #2.
Para implementar esta nueva estructura, se necesitan muy pocas
modificaciones. Por ejemplo, podemos usar una seal adicional (es decir,
temperatura) para calcular el valor de salida (superior seccin)

pero slo superan su valor real a la seal de salida cuando se produce un


evento de reloj (seccin inferior). Estas modificaciones pueden ser
observados en la plantilla se muestra a continuacin.
Plantilla de diseo de la mquina de estado estilo #2

Comparar la plantilla de estilo de diseo #2 con ese estilo de diseo #1,


comprobamos que el nico diferencias son aquellos relacionados con la
introduccin de la seal interna temp. Esta seal causar que la salida de la
mquina de estado para ser almacenada, para su valor se pasa a la salida
slo cuando clk'evento ocurre.
Ejemplo 8.3: Simple FSM #2
Consideremos el diseo de ejemplo 8.2 una vez ms. Sin embargo,
supongamos que ahora queremos la salida para ser sncrona (cambiar slo
cuando el reloj se eleva). Dado que se trata de una mquina de Mealy, estilo
de diseo #2 es necesaria.

Los resultados de la simulacin se muestran en la figura 8.7. Hay que


recordar que cuando una seal est almacenado, su valor ser
necesariamente permanecer esttico entre dos bordes reloj consecutivas.
Por lo tanto, si la entrada (A o B en el ejemplo de arriba) cambia durante
este intervalo, el cambio podra no ser observadas por el circuito; adems,
cuando se observa, ser retrasado con respecto a la entrada (que es propia
de los circuitos sincrnicos).

Ejemplo 8.4: Detector de cadena


Queremos disear un circuito que toma como
entrada un flujo de bits en serie y emite un '1'
cuando la secuencia ''111'' se produce. Se
superpone tambin debe ser considerado, es
decir, si 0111110 . . . ocurre, que la salida
debe permanecer activo durante tres aos
consecutivos en ciclos de reloj.
El diagrama de estado de nuestra mquina se
en la figura 8.8. Hay cuatro estados, que hemos
denominado cero, uno, dos y tres, con el
nombre correspondiente al nmero consecutivo
de '1's detectadas. La solucin se muestra a
continuacin utiliza un diseo de estilo #1.

muestra

Observe que en este ejemplo la salida no depende de la entrada actual.


Este hecho puede observarse en las lneas 28, 33, 38 y 43 del cdigo
anterior, que demuestran que todas las asignaciones de q son
incondicionales (es decir, no dependen de la d). Por lo tanto, la salida es
automticamente una mquina sncrona (Moore), por lo que el uso de un
diseo de estilo #2 es innecesario. El circuito requiere dos flip-flops, que
codifican los cuatro estados de la mquina de estado, a partir de la cual se
calcula q.
Los resultados de la simulacin se
muestran en la figura
8.9. Como se puede
observar, la secuencia
de
datos
d
=
''011101100''
fue
respuesta
q
=

aplicado al circuito, resultando


''000100000'' en la salida.

la

Ejemplo 8.5: Controlador de semaforo (TLC)


Como se mencion anteriormente, controladores digitales son buenos
ejemplos de circuitos que pueden ser e implementado cuando modela
suficiente como mquinas de estado. En el presente ejemplo, queremos

disear un TLC con las caractersticas que se resumen en la tabla de la


figura 8.10, es decir:

tres modos de funcionamiento: Normal, prueba y espera.


Modo normal: cuatro miembros, cada uno con un independiente,
tiempo programable, pasa al circuito por medio de una constante.
Modo de prueba: permite todos los tiempos pre-programados para ser
reemplazada (por un interruptor manual) con un valor pequeo, de tal
manera que el sistema puede probarse fcilmente durante el
mantenimiento- nance (1 segundo por estado). Este valor tambin
debe ser programable y pasan al circuito mediante una constante.
Modo de espera: si se establece (por un sensor acusando averiada,
por ejemplo, o un manual switch) el sistema debe activar las luces
amarillas en ambas direcciones y siguen sindolo mientras la seal de
espera est activo.
Supongamos que un reloj de 60 Hz (obtenido de la propia lnea de
alimentacin) est disponible.

Pag 178
El nmero previsto de flip-flops necesarios para implementar este circuito es
15; tres para almacenar pr_state (la mquina tiene cinco estados, por lo que
se necesitan tres bits para codificarlos), ms de doce para el contador (es
un contador de 12 bits, para ello debe contar hasta timeMAX = 2,700).
Resultados de la simulacin se muestran en la figura 8.11. Para que los
resultados que se ajustan adecuadamente en los grficos, hemos adoptado
los valores de tiempo pequeos, con todas las CONSTANTES iguales a 3
excepto timeTEST, que se hizo igual a 1 Por lo tanto, el sistema es cambiar
el estado cada tres ciclos de reloj cuando est en operacin regular, o cada
ciclo de reloj si est en modo de prueba. Estos dos casos se pueden
observar en los dos primeros grficos de la figura 8.11, respectivamente. El
tercer grfico muestra el modo de espera se active. Como era de esperar,
STBY es asncrona y tiene mayor prioridad que la prueba, haciendo que el
sistema de quedarse en estado YY (estado 4), mientras que STBY est
activo. La seal de prueba, por otra parte, es sncrona, pero no tiene que
esperar a que el estado de temporizacin actual termine para ser activado,
como se puede observar en el segundo grfico.
Ejemplo 8.6: Generador de Seal
Queremos asignar un circuito que, a partir de una seal de reloj CLK, de
origen a la seal outp como se muestra en la figura 8.12 (a). Observe que el
circuito debe funcionar en ambos bordes

(Subida y bajada) de CLK.


Para evitar el aspecto de dos bordes (seccin 6.9), una alternativa es
implementar dos mquinas, una que opera exclusivamente en la transicin
positiva de clk y otro que exclusivamente en el flanco negativo, generando
as las seales intermedias OUT1 y OUT2 presentados en la figura 8.12 (b).
Estas seales pueden ser mediante ANDed para dar origen a la seal outp
deseada. Tenga en cuenta que este circuito no tiene componentes externos
(a excepcin de CLK, por supuesto), la salida slo puede cambiar cuando
cambia clk (salida sincrnica).

8.12
Formas de onda de ejemplo 8.6: (a) outp seal de que se generen a partir
clk y (b) seales intermedias OUT1 y OUT2 (outp = OUT1 y OUT2)

Resultados de la simulacin del circuito sintetizado con el cdigo anterior se


muestran en la figura 8.13.

8.4 Estilo de Codificacin: De binario a OneHot


Para codificar los estados de una mquina de estados, podemos seleccionar
uno entre varios estilos disponibles. El estilo predeterminado es binario. Su
ventaja es que requiere el menor nmero de flip-flops.

En este caso, con n flip-flops (n bits), hasta 2n estados pueden ser


codificados. La desventaja de esta codificacin es que requiere ms lgica y
es ms lento que los otros.
En el otro extremo est el estilo de codificacin onehot, que utiliza flip-flop
por estado.
Por lo tanto, exige el mayor nmero de flip-flops. En este caso, con n flipflops (n bits), slo el n estados pueden ser codificados. Por otra parte, este
enfoque requiere la menor cantidad de lgica adicional y es el ms rpido.
Un estilo que es entre medio de los dos estilos de arriba es el esquema de
codificacin twohot, que presenta dos bits activos por estado. Por lo tanto,
con n flip-flops (n bits), hasta (n-1) / 2 estados pueden ser codificados.
El estilo onehot se recomienda en aplicaciones donde flip-flops son
abundantes, como en FPGAs (Field Programmable Gate Arrays). Por otro
lado, en ASICs (Application Specific Integrated Circuits) generalmente se
prefiere el estilo binario.
Como ejemplo, decir que nuestra mquina de estados tiene ocho estados.
Entonces la codificacin podra ser la indicada en la tabla 8.1. El nmero de
flip-flop requerida en cada uno es de tres (para binario), cinco (twohot), u
ocho (onehot). Otros detalles tambin se presentan en la tabla.

8.5 Problemas
Cada solucin a los problemas que se proponen a continuacin debe ir
acompaada de sntesis y simulacin de resultados. Verificar, al menos, los
siguientes: nmero de flip-flop funcionalidad inferido y el circuito.
Problema 8.1: FSM
Escriba un cdigo VHDL que implementa el FSM descrita por el diagrama de
estados de la figura P8.1.
Problema 8.2: Generador de Seal # 1
Utilizando el enfoque FSM, el diseo de un circuito capaz de generar las dos
seales representadas en la figura p8.2 (OUT1, OUT2) a partir de una seal
de reloj CLK. Las seales son peridicas y tienen el mismo perodo. Sin
embargo, mientras se cambia slo en el flanco ascendente de CLK, el otro
tiene cambios en ambos bordes.
Problema 8.3: Generador de Seal # 2
Diseo de una mquina de estados finitos capaz de generar dos seales,
arriba y abajo, como se ilustra en la figura P8.3. Estas seales son
controladas por dos entradas, GO y STOP. Cuando GO cambia de '0' a '1', la
UP salida debe ir a '1' tambin, pero T 10 ms tarde. Si GO vuelve a '0',
entonces UP debe volver a '0' inmediatamente. Sin embargo, la ABAJO
salida debe ahora ir a '1', de nuevo 10 ms tarde, volviendo a '0' de
inmediato si

GO cambia a ' 1 ' . Si se afirma STOP de entrada , entonces ambas salidas


deben ir a "0" inmediata e incondicional. Supongamos que un reloj de 10
kHz est disponible.
Problema 8.4 : Teclado circuito antirrebote y Encoder
Considere el teclado se muestra en el diagrama de la figura P8.4 . Una
forma comn de leer una pulsacin de tecla es por medio de una
exploracin o sondeo tcnica, lo que reduce el nmero de cables necesarios
para interconectar el teclado para el circuito principal . Consiste en el envo
de baja una columna a la vez , mientras que la lectura de cada uno
secuencialmente fila. Si se pulsa una tecla , la fila correspondiente ser baja
, mientras que los otros siguen siendo altos (debido a las resistencias pull-up
).

Codificacin: Cada dgito debe ser codificado utilizando el cdigo ASCII (7


bits, con los correspondientes valores hexadecimales enumerados en la
tabla de la figura P8.4). Cuando una nueva lectura est disponible en la
salida, el bit new_data se debe establecer en "1". Esto evitar la
interpretacin de una tecla pulsada durante mucho tiempo como una larga
serie del mismo carcter.
Supresin de rebotes: Un problema inherente a los interruptores
mecnicos es cambiar rebotes, que se producen antes de que finalmente se
estableci un contacto firme. El asentamiento generalmente toma hasta
unos pocos milisegundos. Por lo tanto, la eleccin de la frecuencia de reloj
es muy importante. Se le pide que elegirlo de manera que al menos tres
lecturas ocurren en un intervalo de 5 ms. Por lo tanto el bit de new_data
debe girarse alta slo cuando se obtiene el mismo resultado en todas las
lecturas consecutivas dentro de un intervalo de 5 ms.
Problema 8.5: Controlador Semforo
Usando su herramienta de sntesis, ms un kit de desarrollo de CPLD / FPGA,
implementar el TLC del ejemplo 8.5. Verificar, en los archivos de informes
generados por el software, los cuales fueron asignados pines del chip a las
entradas (clk, ESPERA, prueba) y de las salidas (r1, y1, g1, r2, y2, g2). A
continuacin, realice las siguientes conexiones fsicas en su tablero:
* A 60 Hz seal de onda cuadrada (de un generador de seal), con los
niveles lgicos adecuados, al pin CLK.

* A VDD / GND cambiar al pin STBY.


* Un interruptor VDD / GND a prueba de alfiler.
* Un LED (rojo, si es posible), con una resistencia en serie 330-1kohm, a la
clavija (r1 resistencia conectada entre r1 y el nodo del LED, y el ctodo
conectado a GND).
* Un LED (amarillo, si es posible) a la clavija y1, con una resistencia de
series como anteriormente.
* Un LED (verde, si es posible) a la clavija g1, con una resistencia de series
como anteriormente.
* Finalmente, instalar otros 3 LEDs, como los anteriores, por r2, y2, y g2.
Ahora descargar el programa filefrom su PC para el kit de desarrollo y
verificar el funcionamiento del TLC. Juega con los interruptores de fin de
probar todos los modos de operacin. Tambin puede aumentar la
frecuencia de reloj para acelerar la transicin del rojo al amarillo, etc.
Problema 8.6: Generador de Seal # 3
Resuelve un problema 8.2 sin utilizar el enfoque de mquina de estados
finitos.
Problema 8.7: Generador de Seal # 4
Resuelva ejemplo 8.6 sin utilizar el enfoque FSM.
Para ms trabajo es esta rea, ver los problemas 9.3, 9.4 y 9.6 del captulo
9.
9 Diseo de Circuitos Adicionales
En los anteriores captulos, vimos una serie de ejemplos de diseo
completos, que utilizan cdigo VHDL. Cada diseo incluye:

Diagrama de nivel superior del circuito, con su descripcin.


Revisin de conceptos bsicos cuando sea necesario.
Cdigo VHDL completo.
Resultados de la simulacin.
Comentarios adicionales cuando sea necesario.

Este captulo concluye la primera parte del libro. En este captulo, se


presentan una serie de ejemplos de diseo adicionales. Estos ejemplos,
como todos los otros diseos que se muestran hasta el momento, son
tambin a nivel de circuito (es decir, autnomos en el cdigo principal). En
la segunda parte, vamos a hacer lo mismo; es decir, vamos a concluir la
segunda parte con un captulo que contiene ejemplos de diseo de sistemas
adicionales.
Los diseos presentados en este captulo son los siguientes:

Desplazador de tonel (seccin 9.1)


Comparadores con signo y sin signo (seccin 9.2)
Sumadores con acarreo de onda y acarreo de vista (seccin 9.3)
Divisin de punto fijo (seccin 9.4)
Controlador de la mquina expendedora (seccin 9.5)

Receptor de datos seriales (seccin 9.6)


Convertidor de paralelo a serie (seccin 9.7)
Desempeo con un SSD (seccin 9.8)
Generadores de seal (seccin 9.9)
Memorias (seccin 9.10)
Por ltimo, tambin se incluye una lista de problemas (seccin 9.11).

Nota: Una lista completa de todos los diseos presentados en el libro se


muestra en la seccin 1.5.

9.1 Desplazador de tonel


El diagrama de un desplazador de tonel se muestra en la figura 9.1. La
entrada es un vector de 8 bits. La salida es una versin desplazada de la
entrada, con la cantidad de desplazamiento definido por los'' Bits de
Seleccin '' de entrada (de 0 a 7). El circuito consta de tres desplazamientos
de tonel individuales, cada uno similar a la observada en el ejemplo 6.9.
Observe que el primer desplazamiento slo tiene un '0'

Figura 9.1 Desplazador de Tonel

Figura 9.2 Resultados de la simulacin del desplazador de tonel de la


figura 9.1
conectado a uno de los multiplexores (esquina inferior izquierda), mientras
que el segundo tiene dos, y el tercero tiene cuatro. Para los vectores ms
grandes, tendramos slo que seguir duplicando el nmero de '0' entradas.
Si los bits de seleccin son iguales a '' 001 '', por ejemplo, slo el primer
desplazador debe provocar un cambio; Por otro lado, si los bits de seleccin

son iguales a '' 111 '', entonces todos los desplazadores deben causar un
cambio.
Un cdigo VHDL para el circuito de la figura 9.1 se presenta a continuacin.
Los resultados de la simulacin, la verificacin de la funcionalidad del
circuito, se muestran en la figura 9.2. Como puede verse en este ltimo, la
salida es igual a la entrada cuando los bits de seleccin son iguales a 0 (es
decir, los bits de seleccin iguales a '' 000 ''). Tambin puede verse que,
siempre y cuando ningn bit de valor '1' se desplaza fuera del tonel, la
salida es igual a la entrada multiplicada por 2 (1 bit de seleccin) cuando los
bits de seleccin son iguales a 1 ('' 001 ''), multiplicamos por 4 (2 bits de
seleccin) cuando los bits de seleccin son iguales a 2 ('' 010 ''),
multiplicamos por 8 (3 bits de seleccin) cuando los bits de seleccin son
iguales a 3 ('' 011 ''), y as sucesivamente.

9.2 Comparadores con signo y sin signo


La figura 9.3 muestra el diagrama de nivel superior de un comprador. El
tamao de los vectores de ser comparados es genrico (n+1). Tres salidas
se deben proporcionar: una correspondiente a a>b, otra a a=b y finlemnte
una relativa a a<b. tres soluciones se presentan: la primera considera a y b
como nmeros con signo, mientras las otras dos consideran los valores sin
signo. Los resultados tambin se incluyen en la simulacin.
Comparador con signo

Ntese la presencia del paquete std_logic_arith en el cdigo de abajo (lnea


4), l cual es necesria para operar tipos de datos con SIGNO ( o SIN SIGNO),
(a y b fueron declarados como nmeros con SINGO en la lnea 8)

Los resultados de la simulacon se muestran en la figuar 9,4. Como puede


verse, 127>0, pero 128<0 y tambin 255<0 (porque en complemento a 2 la
notacin 127 es el propio 127 decimal, pero 128 es el decimal -128, y 255
en efecto es -1 )
.
Comparador sin signo #1
El cdigo VHDL de abajo es la contraparte del cdigo que acamamos de
presentar (comparador con signo). Ntese de nuevo la presencia del

paquete std_logic_arith (lnea 4), la cual es necesaria para operar con dato
SIN SINGO (O CON SIGNO) (a y b fueron declarados como nmeros SIN
SIGNO en la lnea 8)

Comparador sin signo #2

Comparador sin signo puede tambin ser implementado con


STD_LOGIC_VECTORS, en cuyo caso no hay necesidad de declarar el

paquete std_logic_arith. Una solucin de este tipo se presenta a


continuacin.

Los resultados de la simulacin (de cualquier comparacin sin signo) se


muestran en la figura 9.5.
Contrariamente a la figura 9.4, ahora 128 es 255 y de hecho es ms grande
que 0

9.3 Acarreo de rizado y Sumador de acarreo delantero


Acarreo de rizado y Sumador de acarreo delantero son dos enfoques
clsicos en el diseo de
sumadores . El primero tiene la ventaja de requerir menos hardware ,
mientras que el segundo es
Ms rpido. A continuacin se discuten ambos enfoques.
Sumador con acarreo de rizado

La figura 9.6 muestra un sumador de acarreo de rizado de 4 bits sin signo.


Para cada bit , una unidad de sumador completo ( FAU , seccin 1.4 ) se
emplea . Tambin se muestra la tabla de verdad de la FAU . En ella, a y b
representan los bits de entrada, cin es el bit de acarreo de entrada, s es el
bit de suma y cout es el bit de acarreo de salida. s debe ser alto cuando el
nmero de entradas que son altos es impar (funcin de paridad) , mientras
que cout debe ser alta cuando dos o ms entradas son altas (mayora de la
funcin). Observe en la figura 9.6 que cada FAU se basa en el bit de acarreo
producido por la etapa anterior. Este enfoque minimiza el tamao de los
circuitos, a expensas del aumento de retardo de propagacin .
En base a la tabla de verdad de la figura 9.6 , una manera muy simple de la
computacin s y cout es el seguimiento:

Por lo tanto, una implementacin VHDL del sumador con acarreo de rizado
es sencillo.
La solucin se muestra a continuacin funciona para cualquier nmero (n)
de bits de entrada , definido por los medios de una declaracin genrica de
la lnea 5. Resultados de la simulacin del circuito sintetizados con el cdigo
de abajo se muestra en la figura 9.7 .

Operador predefinido +
Ya hemos visto que un sumador se puede implementar directamente con el
operador + (Adicin ) (seccin 4.1 ) . En este caso , un tipo de solucin
del acarreo de solucin ser normalmente implementado por el
sintetizador . Si, sin embargo , si queremos que la solucin sea de un tipo
determinado (como el que se presenta a continuacin) , entonces un cdigo
explcito debe ser escrito .

Sumador de acarreo delantero

Un diagrama de Sumador de acarreo delantero un 4 bits se muestra en la


figura 9.8 . Su implementacin se basa en el concepto de generar y
propagar, que da al circuito mayor velocidad que su contraparte sumador
de acarreo de rizado ( a expensas de una mayor rea de silicio) .
Considere dos bits de entrada, a y b . Los (p) seales generar ( g ) y
propagar son
definido como:

Observe que estas seales pueden ser calculados de antemano, porque


ninguna depende del bit de acarreo.
Si consideramos ahora dos vectores de entrada, a=a(n-1) a(1)a(0) y
b=b(n-1) g(1)g(0) y p=p(n-1) p(1)p(0), donde

Consideremos ahora el vector de acarreo, c=c(n-1) c(1)c(0). Los bits de


acarreo pueden ser calculados desde g y p:

Observe que, contrariamente al sumador acarreo de rizado, cada bit de


acarreo ms arriba se calcula independientemente; es decir, ninguna de las
expresiones anteriores depende del acarreo clculos , y esa es la razn por
la que este circuito es ms rpido . Por otro lado, la complejidad del
hardware crece muy rpido , lo que limita este enfoque de tan slo unos
pocos bits (normalmente cuatro). Agrandar la mirada llevar adelante
sumadores se pueden implementar mediante la asociacin de tales 4 -bit - o
-so unidades.
La implementacin del sumador de la figura 9.8 es ahora sencillo. El PGU
(Propagar - Generar Unidad ) calcula p y g ( se requieren cuatro unidades ) ,
adems de la suma real ( s ) , mientras que el CLAU (Sumador de acarreo
delantero) calcula los bits de acarreo.
Nota : Con el fin de construir grandes Sumadores de acarreo delantero, el
bloque de CLAU figura 9.8 debe poseer Grupo Propagar ( GP ) y el Grupo de
Generacin de salidas ( GG) , que se omitieron en la figura porque esta
aplicacin est destinada a cuatro bits slo.

Cualitativamente, los resultados de simulacin obtenidos a partir del


circuito sintetizados con el cdigo de seguridad son similares a los del
sumador Sumador de acarreo delantero presentado en la figura 9.7 .

9.4 Divisin de punto fijo


Vimos en el captulo 4 que la divisin '' / '' predefinida del operador acepta
slo el poder de dos divisores, es decir, es de hecho un 'operador' 'cambio'.
En esta seccin, vamos a discutir la implementacin de la divisin genrica,
en la que el dividendo y el divisor puede ser cualquier nmero entero.
Comenzamos describiendo el algoritmo de divisin, entonces se presentan
dos soluciones VHDL seguidos de los resultados de simulacin.
Algoritmo de divisin
Digamos que queremos calcular y = a / b, donde a, b, e y tiene el mismo
nmero (n + 1) de bits. El algoritmo se ilustra en la fi gura 9.9, para a = ''
1,011 '' (decimal 11) y b = '' 0011 '' (decimal 3), de la que se espera y = ''
0011 '' (decimal 3) y el resto '' 0010 '' (decimal 2). Primero se crea una
versin desplazada de b, cuya longitud es 2n + 1 bits (que se muestran en
la columna b-related de la figura 9.9). b_inp (i) es simplemente b desfasados
a la izquierda por i posiciones (notar los caracteres subrayados en la
columna b-related)

El clculo del cociente se realiza como sigue. A partir de la parte superior de


la tabla, comparamos a_inp (i) con b_inp (i). Si el primero es ms grande o
igual a este ltimo, que y (i) = '1' y b_inp (i) se resta de a_inp (i); de lo
contrario, y (i) = "0" y simplemente proceder a la siguiente lnea. Despus
de iteraciones NTH1, el clculo se completa y el valor de la izquierda en
a_inp es el resto.
Nota: Es obvio que, para restar b_inp de a_inp, el nmero de bits de a_inp
no puede ser menor que de b_inp, por lo que la longitud real de a_inp debe
incrementarse, lo que se logra simplemente llenando a_inp con n '0 de en su
lado izquierdo ('0 no es mostrado en la fi gura 9.9).
Otra forma de presentar el algoritmo de la divisin es la siguiente. Se
multiplica por 2 b ** n, donde n + 1 es el nmero de bits. Esto, por
supuesto, corresponde a los cambios de bn posiciones a la izquierda, pero
sin tirar a cabo cualquiera de sus bits (lo que el nuevo b-vector debe ser n
bits ms largo que el vector original). Si a es mayor que el nuevo b,
entonces y (n) = '1', y B (el nuevo valor) deben restarse de una; de lo
contrario, y (n) = '0'. Ahora pasamos a la siguiente iteracin. Se multiplica b
(el valor original) por 2 ** (n-1), que es equivalente a desplazar el vector

original n-1 posiciones a la izquierda, o cambiando el valor de b acaba de


utilizar en el clculo anterior volver una posicin a la derecha. Entonces lo
comparamos, como lo hicimos antes, para decidir si y (n-1) debe ser "1" o
"0", y as sucesivamente.
Divisores VHDL
A continuacin se presentan dos soluciones para el problema de divisin.
Ambos utilizan cdigo secuencial: Si se utiliza en la primera, mientras que
BUCLE, ms si se emplean en el segundo. La primera solucin es un cdigo
de paso a paso, por lo que el algoritmo de la divisin se ha descrito
anteriormente se puede observar claramente. El segundo es ms compacto
y tambin es genrico (notar que n se defini por medio de una declaracin
genrica de la lnea 6). Las soluciones incluyen tambin una revisin de
rutina b = 0.
Resultados de la simulacin se muestran en la fi gura 9.10.

9.5 Controlador de mquinas expendedoras


En este ejemplo, vamos a disear un controlador para una mquina
expendedora, que vende barras de caramelo a veinte cinco centavos. Como
se ha visto en el captulo 8, este es el tipo de diseo en el que el FSM
(mquina de estado finito) modelo es til. Las entradas y salidas del
controlador se muestran en la fi gura 9.11. La seales de entrada nickel_in,
dime_in y quarter_in indican que una moneda se ha depositado. Dos
entradas adicionales, clk (reloj) y primera (reset), tambin son necesarias.

El controlador responde con tres salidas: candy_out, para distribuir una


barra de chocolate, adems de nickel_out y dime_out, afirm que el cambio
es debido.
Figura 9.11 tambin muestra los estados de los Estados Federados de
Micronesia correspondiente. Los nmeros dentro de los crculos representan
la cantidad total depositada por el cliente (slo cinco, diez, y se aceptan
trimestres). Estado 0 es el estado de reposo. A partir de ella, si se deposita
una moneda, la mquina se mueve a otro 5; si una moneda de diez
centavos, a estado 10; o si una cuarta parte, al 25. Situaciones similares se
repiten para todos los estados, hasta el estado 20. Si se alcanza el estado
25 estado, a continuacin, una barra de chocolate se dispensa, sin cambios.
Sin embargo, si se alcanza el estado 40, por ejemplo, entonces un nquel se
entrega, pasando por lo tanto el sistema a estado 35, desde el cual se
entrega una moneda de diez centavos y una barra de caramelo dispensado.
Los tres estados marcados con crculos dobles son aquellas de las que se
entrega una barra de chocolate y la mquina vuelve al estado 0.
Este problema se dividir en dos partes: en la primera, se tratan los
aspectos fundamentales relacionados con el diseo del controlador de la
mquina expendedora (fi gura 9.11); en el segundo, se aaden funciones

adicionales (e imprescindibles). La primera parte se estudia en esta seccin,


mientras que el segundo se plantea como un problema (problema 9.3). La
introduccin de tales caractersticas adicionales es necesario por razones de
seguridad; ya que se trata de dinero, tenemos que asegurar que ninguna de
las partes (la mquina o del cliente) se lesion en la transaccin.
Cdigo AVHDL, tratar slo las caractersticas bsicas del problema
representado en la fi gura 9.11, se presenta a continuacin. Hemos asumido
que las caractersticas adicionales propuestas en el problema 9.3
efectivamente se llevarn a cabo, en el que fallos de casos son aceptables
en la primera parte de la solucin. Por lo tanto, el estilo de diseo # 1
(seccin 8.2) puede ser empleado.
El tipo de estado empadronada (lnea 12) contiene una lista de todos los
estados que se muestran en el diagrama de la FSM fi gura 9.11. Hay diez
estados, por lo que cuatro bits son necesarios para codificar ellos (por lo
cuatro flip-fl ops se desprendern). Recordemos que el compilador codifica
tales estados en el orden en que aparecen, por lo st0 = '' 0000 '' (decimal
0), st5 = '' 0001 '' (decimal 1), ..., ST45 = '' 1001 ''(decimal 9). Por lo tanto,
en las simulaciones, estos nmeros se muestran en lugar de los nombres de
estado.

Resultados de la simulacin se presentan en la fi gura 9.12. Como puede


verse, se depositaron tres monedas de cinco y cuarto. Tenga en cuenta que,
al fi primer flanco positivo del reloj despus de que se deposit el nquel en
primer lugar, los movimientos FSM desde st0 Estado (decimal 0) para ST5
(decimal 1);

Despus de la segunda de nquel de, al st10 estado (decimal2); despus de


la tercera, a ST15 Estado (decimal 3); y, despus de la cuarta parte ha sido
depositada, a ST40 Estado (decimal 8). Despus de eso, un nquel se
devuelve al cliente (nickel_out = '1'), haciendo que el FSM para pasar a
ST35 Estado (decimal 7), a la que se entrega un centavo (dime_out '1' =) y
una barra de chocolate se dispensa (candy_out = '1'). El sistema vuelve
luego a su estado de reposo (st0).
Como se mencion anteriormente, las caractersticas adicionales (como el
apretn de manos) son necesarias para aumentar la seguridad de las

transacciones. Por favor, consulte problema 9.3 para una continuacin de


este diseo.
9.6 Recepcin datos serial
El diagrama de un receptor de datos en serie como se muestra en la figura
9.13. Contiene una entrada serial de datos, din, y una salida de datos en
paralelo, dato(6:0). Tambin se necesita una seal de reloj en la entrada.
Dos seales de supervisin son generadas por el circuito: err (error) y
data_valid.
El tren de entrada consta de diez bits. El primer bit es un bit de inicio, que
cuando est en alto, el circuito inicia la recepcin de datos. Los prximo
siete son los bits de datos reales.
El noveno bit es un bit de paridad, cuyo estado debe ser "0" si el nmero de
los de datos es par, o '1' de otra manera. Finalmente, el dcimo es un bit de
parada, que debe ser alto si la transmisin es correcta. Se ha detectado un
error cuando ya sea la paridad no comprueba o el bit de parada no es un '1'.
Cuando la recepcin se concluye y si no se ha detectado ningn error,
entonces los datos almacenados en los registros internos (reg) se transfiere
a los datos(6:0) y la salida data_valid se afirma.
Un cdigo VHDL para este circuito se presenta a continuacin. Se utilizaron
unas pocas variables: contar, para determinar el nmero de bits recibidos;
reg, que almacena los datos; y la temporalmente para calcular el error.
Observe en la lnea 37 que REG (0) = din se utiliza en lugar de reg (0) = '0',
porque queremos que el intervalo de tiempo inmediatamente despus del
bit de parada para ser considerado como posiblemente contiene un bit de
inicio para el prximo tren de entrada.

Los resultados de la simulacin se presentan en la figura 9.14. La secuencia


de entrada es din = {start = 1, din = 0111001, paridad = 0, parada = 1}.
Como puede verse en el grfico superior, no se detect ningn error en este
caso, debido a que la paridad y los bits de parada son correctos. Por lo
tanto, despus del conteo el tamao es 9, los datos estn disponibles, es
decir, data = 0111001, a partir de datos (0) hasta datos (6), cada uno
corresponde al decimal 78, y el bit data_valid es positivo.

Observe que la salida permanece as por un tiempo indefinido, a menos que


se reciba un nuevo tren de entrada.
La nica diferencia en el grfico inferior es que un bit de inicio aparece
inmediatamente despus del bit de parada. Como puede verse, la variable
de recuento comienza entonces a contar y todo el proceso se repite.
9.7 Convertidor paralelo a serie.
Un convertidor de paralelo a serie es una aplicacin tpica de registros de
desplazamiento. Consiste en el envo de un bloque de datos en serie. La
necesidad de tales convertidores surge, por ejemplo, en chips ASIC cuando
no hay suficientes pines disponibles a la salida de todos los bits de datos
simultneamente.
Un diagrama de un convertidor de paralelo a serie se presenta en la fi gura
9.15. d (7: 0) es el vector de datos para ser enviados, mientras dout es la
salida real. Tambin hay otras dos entradas: clk y la carga. Cuando la carga
es afirmada, d se almacena de forma sincrnica en el registro de
desplazamiento reg. Mientras que la carga se mantiene alta, el MSB, d (7),
sigue estando disponible en la salida. Una vez que la carga se vuelve a '0',
los bits posteriores se presentan en la salida en cada borde positivo de CLK.

Despus de los ocho bits se han enviado, la salida permanece baja hasta la
prxima transmisin.

Resultados de la simulacin del circuito sintetizado con el cdigo anterior se


muestran en la fi gura 9.16. d = '' 11011011 '' (decimal 219) fue escogido.

Como se puede ver, d (7) = '1' se presenta en la salida en el borde primera


subida de CLK despus de la carga se ha afirmada, permaneciendo all
mientras la carga sigue siendo alta (para ilustrar este hecho, la carga se
mantuvo alta durante la Segunda reloj ciclos). Los otros bits siguen tan
pronto como la carga vuelve a '0'. Note que despus se han transmitido
todos los bits, la salida se mantiene baja.

Figura 9.16
Resultados de la simulacin del convertidor paralelo a serie.

Resultados de la simulacin del circuito sintetizados con el cdigo anterior se


muestran en la averiguar 9.16= '' 11011011 '' (decimal 219) fue elegido.
Como puede verse, d (7) =1' es presentado en la salida en la primera flanco
ascendente de CLK despus de la carga se ha afirmado, permanecer all
mientras que la carga sigue siendo alta (para ilustrar este hecho, la carga se
mantuvo alta durante dos ciclos de reloj). Los otros bits siguen tan pronto
como la carga vuelve a '0'. aviso que despus se han transmitido todos los bits,
la salida se mantiene baja.
9.8 Jugando con un display de siete segmentos

Queremos disear un pequeo juego con un SSD (display de siete


segmentos). El alto nivel diagrama del circuito se muestra en la figura 9.17.
Contiene dos entradas, clk y detener, y una salida, dout (6: 0), que alimenta el
SSD. Supongamos que Fclk = 1 kHz.

Pgina 2

Nuestro circuito debe causar un movimiento en sentido horario continua de


los segmentos de SSD. Tambin, con el fin de hacer que el movimiento
circulatorio ms realista, queremos mo- mentneamente solaparse segmentos
vecinos.En consecuencia, la secuencia debe ser
con la combinado estados (ab, bc, etc.) que duran slo unos pocos
milisegundos.Si se afirma parada, entonces el circuito de debe volver al estado
una y permanecer as hasta la parada se activa baja de nuevo. Desde el
captulo 8, est claro que este es un circuito para que el enfoque es FSM
apropiado. El diagrama de estados se presenta en la figura 9.18.Queremos que
el sistema permanecer en los estados a, b, c, etc., para tiempo1=80 ms, y en
los estados combinados, ab, ac, etc., durante el tiempo 2= 30 ms. Por lo tanto,
un contador de contar hasta 80 (el perodo de reloj es 1 ms) o hasta 30 se
pueden emplear para determinar cundo pasar al siguiente estado.
Una solucin VHDL se muestra a continuacin. Observe que se trata de una
aplicacin recta de la plantilla FSM visto en la seccin 8.2.En las lneas 11-12,
fueron declarados tiempo1 y time2 como dos constantes.Los valores pequeos
(4 y 2, respectivamente) se utilizan aqu para que el resultados de la
simulacin para encajar bien en una trama, pero 80 y 30, respectivamente, se
utilizaron en el implementacin fsica real.Una seal denominada flip se
utiliza para cambiar de tiempo1 a tiempo 2, y viceversa.Observe que los
decimales correspondientes estn marcados lado cada valor de dout, por lo
que puede ser fcilmente verificado en los resultados de la simulacin.

Pgina 3

Resultados de la simulacin se presentan en la figura 9.19.Como puede verse,


el sistema permanece en los estados individuales, a, b, etc., durante cuatro
ciclos de reloj (TIME1= 4 aqu) y en la combinada
estados, ab, bc, etc., para dos ciclos de reloj (Time 2= 2).Observe tambin que
los decimales detectado por el simulador coincide con los decimales que
figuran en el cdigo VHDL.

Pgina 6

9.9 Generadores de Seal


Digamos que, a partir de una seal de reloj (CLK), queremos obtener la forma
de onda se muestra en la figura 9.20.En este tipo de problema, podemos
utilizar el enfoque FSM o una convencional enfoque. Ambos tipos de
soluciones se ilustran a continuacin.

FSM Enfoque

La seal de la figura 9.20 se puede modelar como una FSM 8-estado.El uso de
un contador desde
0 a 7, se puede establecer que la onda ='0' (primero pulso) cuando el recuento
de = 0, onda= '1' (segundo pulso) cuando el recuento de= 1, y as
sucesivamente, creando as la seal se muestra en la figura. Esta
implementacin requiere un total de cuatro flip-flops: tres a nmero de tiendas
(tres bits),ms uno para almacenar onda (un bit).Recordemos del captulo 8,
apartados 8,2 a 8,3, que el salida de un FSM slo se registra si el estilo de
diseo # 2 se emplea, (seccin 8.3) aqu, porque fallos no son aceptables en
un generador de seal. El cdigo VHDL correspondiente, usando el estilo
dsign # 2 (seccin 8.3), se muestra a continuacin.
Resultados de la simulacin aparecen en la figura 9.21.Comprobacin del
archivo de informe creado por el sin- herramienta de tesis, se compruebe que
un total de cuatro flip-flops fueron efectivamente deducirse de este cdigo.

Enfoque convencional . Un diseo convencional, con la instruccin IF, se


muestra a continuacin.Observe que el recuento y
ola se asigna tanto en la transicin de otra seal (clk).Por lo tanto, de acuerdo
a lo que se vio en la seccin 7.5, ambos se almacenarn (es decir, cuatro flipflops sern inpreferido, tres para el recuento y uno para la onda).Resultados de la
simulacin se muestran en la figura 9.22.
--------------

9.10 Memoria Diseo


En esta seccin, el diseo de los siguientes circuitos de memoria se presenta:
ROM
RAM con entrada / salida buses de datos separados
RAM con bidireccional en bus de entrada / salida de datos
ROM (Read Only Memory)
Figura 9.23 muestra el diagrama de una ROM.Dado que es una memoria de
slo lectura, no hay reloj seal o escribir a habilitar pin es necesario.Como
puede verse, el circuito contiene una pila de palabras pre-almacenados, siendo
la seleccionada por la entrada de direccin (addr) presentado en la de salida
(datos).
En el cdigo se muestra a continuacin, las palabras (lnea 7) representa el
nmero de palabras almacenadas en la memoria, mientras que los bits (lnea
6) representa el tamao de cada palabra. Para crear una ROM, un conjunto de
valores constantes se puede utilizar (lneas 15-22).En primer lugar, un nuevo
tipo, llamado vector_array, fue definido (lneas 13-14), que se utiliz en la
declaracin de un CONSTANTE memoria llamada (lnea 15).Un 8 ROM 8
se ilustra en este ejemplo, con los siguientes valores (decimales) almacenados
en las direcciones de 0 a 7: 0, 2, 4, 8, 16, 32, 64, y 128 (lneas 15-22).Lnea 24
muestra un ejemplo de llamada a la memoria; La salida (datos) es igual a la
palabra almacenada en la direccin addr .Al aplicar una ROM, sin datos
registros son inferido, porque ninguna asignacin de seales se produce en la
transicin de an-otra seal. Puertas lgicas, formando un (tabla de bsqueda)
LUT, se utilizan en su lugar.

1 ------------------------------------------------- Ieee 2 BIBLIOTECA;


3 USO ieee.std_logic_1164.all;
4 ------------------------------------------------- 5 ENTIDAD rom ES
6
GENRICOS (bits: INTEGER: = 8;
- # De bits por palabra
7
palabras: INTEGER: = 8);- # De palabras en la memoria
8
PORT (dir: EN INTEGER rango de 0 a palabras-1;
9
datos: std_logic_vector OUT (bits-1 DOWNTO 0));
Rom 10 END;
11 ------------------------------------------------- 12 ARQUITECTURA DE rom rom ES
13
TIPO vector_array ES ARRAY (0 A palabras-1) DE
14
Std_logic_vector (bits-1 DOWNTO 0);
15
Memoria CONSTANTE: vector_array: = ("00000000",
16
"00000010",
17
"00000100",
18
"00001000",
19
"00010000",
20
"00100000",
21
"01000000",
22
"10000000");
23 COMENZAR
24
datos <= memoria (dir);
Rom 25 END;

26 ------------------------------------------------- -

Resultados de la simulacin se muestran en la figura 9.24.Como puede verse,


los cambios de direccin de 0 a 7, a continuacin, se reinicia desde 0, con las
salidas que coinciden con los valores listados en la cdigo de seguridad.
RAM con entrada separada y salida buses de datos
Una RAM (Random Access Memory), con buses de datos de entrada y salida
independientes, es se ilustra en la figura 9.25.De hecho, este circuito ya fue
discutido en el ejemplo 6.11, pero se repiti aqu para facilitar la comparacin
con los otros circuitos de memoria pretende en esta seccin.
Diseos adicionales de circuito

Pgina 11

Como puede verse en la figura 9.25 (a), el circuito tiene un bus de entrada de
datos (data_in), un dato bus de salida (data_out), un bus de direcciones (dir),
adems de reloj (CLK) y habilitacin de escritura (wr_ena) pasadores.Cuando
wr_enable se afirma, en el siguiente flanco ascendente de CLK el vector
presente en data_in se debe almacenar en la posicin especificada por
addr.data_out, en el Por otra parte, debe mostrar constantemente los datos
seleccionados por addr. Desde el registro de punto de vista, el circuito se
puede resumir como en la figura 9.25 (b).
Cuando wr_ena es baja, q est conectado a la entrada del flip-flop, y la
terminal d es abierta, por lo que no hay datos nuevos se escribir en la
memoria.Sin embargo, cuando es wr_ena gir a alta, d est conectada a la
entrada del registro, por lo que en el siguiente flanco ascendente de
clk d se almacenar. Un cdigo VHDL que implementa el circuito de la figura
9.25 se muestra a continuacin. Los capacidad elegida fue de 16 palabras de
longitud de ocho bits cada uno. Observe que el cdigo es totalmente
genrico. Resultados de la simulacin se muestran en la figura 9.26.

RAM con bidireccional de entrada / salida de bus de datos


Una RAM con bidireccional de entrada / salida del bus de datos se ilustra en
la figura 9.27.El general estructura es similar a la de la figura 9.25, excepto
por el hecho de que ahora el mismo bus (BIDIR) se utiliza para escribir datos
en la memoria, as que leer datos de l.
Desde el registro de punto de vista, el circuito se puede resumir como en la
figura 9.27 (b). Cuando wr_ena es baja, la salida del registro est conectada a
su entrada, as que no hay cambio en la tienda se producirn datos.Por otro
lado, cuando se afirma wr_ena, q es conconectado a d, lo que permite nuevos datos que se almacenan en el siguiente
flanco ascendente de CLK. Un cdigo VHDL que implementa el circuito de la
figura 9.27 se muestra a continuacin. Los capacidad elegida fue de 16
palabras de longitud de ocho bits cada uno.Tenga en cuenta que este cdigo es
tambin totalmente genrico.Resultados de la simulacin se muestran en la
figura 9.28.

10. Paquetes y componentes

10.1 Introduccin
En la parte I del libro, estudiamos todo el fondo y tcnicas de codificacin de
VHDL, entre las que figuran las siguientes:
- Cdigo de estructura: declaraciones de la biblioteca, entidad arquitectura
(captulo 2)
- Tipos de datos (captulo 3)
, los operadores y los atributos (captulo 4)
- declaraciones simultneas y cdigo concurrente (captulo 5)
- instrucciones secuenciales y cdigo secuencial (captulo 6)
- Seales, variables y constantes (captulo 7)
- Diseo de mquinas de estado finito (captulo 8)
- diseos de circuitos adicionales (captulo 9)
Por lo tanto, en trminos de la figura 10.1, podemos decir que hemos
cubierto en detalle todo lo que se necesita para construir el tipo de cdigo
que aparece representado en su lado izquierdo. Una buena comprensin de

que el material es indispensable, independientemente del diseo que se


acaba un circuito pequeo o un gran sistema.
En la parte II, simplemente vamos a aadir nuevos bloques de construccin
para el material ya presentado.
Estos nuevos bloques de construccin se destina principalmente para la
asignacin de la biblioteca, que se muestra en la parte derecha de la figura
10.1. Ellos son:
- Los paquetes (captulo 10)
- Componentes (captulo 10)
- Funciones (captulo 11)
- Procedimientos (captulo 11)

Estas nuevas unidades pueden ser ubicadas en el propio cdigo principal (es
decir, en el lado izquierdo de la figura 10.1). Sin embargo, dado que su
finalidad principal es permitir a los fragmentos de cdigo comn para ser
reutilizada y compartida, es ms usual para colocarlos en una biblioteca.
Esto conduce tambin al cdigo de particionamiento, lo cual es til cuando
se trata de cdigos de largo. En resumen, Frecuentemente utilizado trozos
de cdigo puede ser escrita en la forma de los componentes, funciones o
procedimientos, entonces se colocan en un paquete, que finalmente se
compilan en la biblioteca de destino.

Ya hemos visto (captulo 2) que al menos tres bibliotecas son generalmente


necesarias en un diseo: ieee, std, y work. Despus de estudiar la parte II,
podremos construir nuestras propias bibliotecas, que luego pueden ser
aadidos a la lista anterior.

10.2 Paquete

Como se mencion anteriormente, frecuentemente utilizado trozos de


cdigo VHDL, usualmente se escriben en forma de componentes, funciones
o procedimientos. Dichos cdigos se colocan luego dentro de un paquete y
compilado en la biblioteca de destino. La importancia de esta tcnica es que
permite el particionado de cdigo, cdigo compartido, y la reutilizacin de
cdigo.
Empezamos por describir la estructura de un paquete. Adems de los
componentes, funciones y procedimientos, tambin puede contener
definiciones de tipos y constantes, entre otros. Su sintaxis es presentada a
continuacin.

Como se puede ver, la sintaxis se compone de dos partes: el paquete y el


cuerpo del paquete. La primera parte es obligatoria y contiene todas las
declaraciones, mientras que la segunda parte es necesario slo cuando uno
o ms subprogramas (funcin o procedimiento) se declaran en la parte
superior, en cuyo caso deber contener las descripciones (cuerpo) de los
subprogramas. Paquete y cuerpo del paquete debe tener el mismo nombre.

Las declaraciones lista puede contener los siguientes: Componente, funcin,


procedimiento, tipo, constante, etc.
Ejemplo 10.1: Paquete simple
El ejemplo siguiente muestra un paquete llamado my_paquete. Slo
contiene el tipo y las declaraciones de constantes, de modo que un cuerpo
de paquete no es necesaria.

Ejemplo 10.2: paquete con una funcin


Este ejemplo contiene, adems de las declaraciones de tipos y constantes,
una funcin. Por lo tanto, un cuerpo de paquete es ahora necesario (detalles
sobre cmo escribir una funcin se ver en el captulo 11). Esta funcin
devuelve TRUE cuando un borde positivo ocurre en clk.

Cualquiera de los paquetes anteriores (ejemplo 10.1 o 10.2) ahora pueden


ser compilados, convirtindose en parte de nuestra biblioteca de trabajo (o
cualquier otro). Para hacer uso de l en un cdigo VHDL, tenemos que
aadir una nueva clusula USE para el cdigo principal (USE
work.mi_package.all), como se muestra a continuacin

10.3 COMPONENTE

Un componente es simplemente un pedazo de cdigo convencional (es


decir, declaraciones de biblioteca + entidad + arquitectura, tal como se vio
en el captulo 2). Sin embargo, declarando ese cdigo como un componente,
puede entonces ser utilizado dentro de otro circuito, permitiendo as la
construccin de diseos jerrquicos.
Un componente es tambin otra forma de particionar un cdigo y
proporcionar cdigo compartido y la reutilizacin de cdigo. Por ejemplo,
circuitos utilizados comnmente, como flip-flops, multiplexores, sumandos,
compuertas bsicas, etc., pueden ser colocados en una biblioteca, de modo

que cualquier proyecto puede hacer uso de ellas sin tener que reescribir
explcitamente tales cdigos.
Utilizar (instanciar) un componente, primero debe ser declarado. La sintaxis
correspondiente se muestra a continuacin.
Declaracin de componentes:

Componente instanciacin:

Como se puede ver, la sintaxis de la declaracin es similar a la de una


entidad (seccin 2.3); es decir, los nombres de los puertos debe ser
especificado, junto con sus modos (IN, OUT o INOUT, buffer) y tipos de datos
(STD_LOGIC_VECTOR, Integer, Boolean, etc.). Para crear una instancia de un
componente se requiere una etiqueta, seguido por el nombre del
componente y un puerto Mapa de declaracin. Por ltimo, puerto_list es
simplemente una lista de los puertos del circuito real a los puertos de la prediseado que se crean instancias de componentes.

Ejemplo: consideremos un inversor, que ha sido diseada previamente


(inverter.vhd) y compilado en la biblioteca de trabajo. Podemos hacer uso de
l mediante el cdigo que se muestra a continuacin. La etiqueta elegida
para este componente fue de U1. Los nombres de los puertos en el circuito
real son x e y, que estn siendo asignados para a y b, respectivamente, de
la pre-diseado inversor (esto se denomina asignacin posicional, por
primera seal en uno corresponde a la primera seal de la otra, la segunda
en uno al segundo en el otro, y as sucesivamente).

Existen dos formas bsicas para declarar un componente (figura 10.2). Una
vez que hemos diseado y colocada en la biblioteca de destino, podemos
afirmar que en el propio cdigo principal, como se muestra en la figura
10.2(a), o podemos declararla usando un paquete, como en la figura 10.2
(b). Este ltimo se evita la repeticin de la declaracin cada vez que se crea
una instancia del componente. Ejemplos de ambos enfoques se presentan a
continuacin.

Ejemplo 10.3: Componentes declarados en el Cdigo Principal


Queremos implantar el circuito de la figura 10.3, empleando solamente los
componentes (inversor, NY_2 y NY_3), pero sin crear un paquete especfico
para declararlas, as como en la figura 10.2(a). A continuacin, cuatro trozos
de cdigo VHDL son necesarios: uno para cada componente, ms uno para
el proyecto (cdigo principal). Los cuatro archivos se muestran a
continuacin. Observe que, dado que no hemos creado un paquete, los
componentes deben ser declarados en el cdigo principal (en la parte
declarativa de la arquitectura). Los resultados de la simulacin se presentan
en la figura 10.4.

Ejemplo 10.4: Componentes declarados en un paquete


Deseamos implementar el mismo proyecto del ejemplo anterior (figura
10.3). Sin embargo, ahora vamos a crear un paquete donde todos los
componentes (inversor, NY_2 y NY_3) ser declarada, como en la figura
10.2(b). Por lo tanto ahora cinco piezas de cdigo VHDL son necesarios: uno
para cada componente, uno para el paquete, y finalmente uno para el
proyecto. A pesar de tener un archivo extra (paquete), tal archivo extra
debe ser creada una sola vez, evitando as la necesidad de declarar los
componentes en el cdigo principal cada vez que se crea una instancia.
Observe que una clusula Use extra (utilice work.mi_components.all) es
necesario ahora, para hacer el paquete my_componentes visibles en el
diseo. Los resultados de la simulacin son, evidentemente, los mismos que
los de la figura 10.4.

10.4 MAPA DEL PUERTO


Hay dos formas de asignar los puertos de un componente durante su
ejemplificacin: mapeo de posicin y cartografa nominal. Consideremos el
siguiente ejemplo:

En ella, el mapeo es posicional; es decir, empalmes X e Y corresponden a a


y b, respectivamente. Por otra parte, un mapeo nominal sera la siguiente:

Mapeo posicional es ms fcil de escribir, pero mapeo nominal es menos


propenso a errores.
Los puertos tambin se pueden dejar sin conectar (utilizando la palabra
clave OPEN). Por ejemplo:

10.5 MAPA GENRICO


Unidades genricas (que se examinan en la seccin 4.5) tambin se pueden
crear instancias. En ese caso, un mapa genrico debe ser utilizado en la
creacin de instancias de componentes para pasar informacin a los
parmetros genricos. La nueva sintaxis se muestra a continuacin.

Figura 10.5
Generador de paridad genrica a una instancia en el ejemplo 10.5.

Como puede verse, las nicas diferencias con respecto a la sintaxis ya


presentados son la inclusin de la palabra genrica como de una lista de
parmetros. El propsito es informar que esos parmetros se deben
considerar como genrico. El uso de MAP GENERIC se ilustra en el siguiente
ejemplo.
Example 10.5: Instantiating a Generic Component
Consideremos el generador de paridad genrica del ejemplo 4.3 (repetido
en fi gura 10.5), lo que aade un bit para el vector de entrada (en su lado
izquierdo). Dicho bit debe ser un '0' si el nmero de unos en el vector de
entrada es par, o un' 1 'si es impar, tal que el vector resultante ser siempre
contiene un nmero par de unos.
El cdigo que se presenta a continuacin es genrico (es decir, funciona
para cualquier entero positivo n). Dos archivos se muestran: un con
respecto al componente (par_generator, que, de hecho, podemos asumir
que previamente diseado y disponible en la biblioteca de trabajo), y uno en
relacin con el mismo (cdigo principal) del proyecto, donde se crea una
instancia del componente par_generator.
Observe que el valor predeterminado (n = 7) de genricos en el archivo
COMPONENTE (parity_gen) se sobrescribirn por el valor n = 2 se le ha
pasado por medio de la declaracin MAPA genrica en la creacin de
instancias COMPONENTE. Ntese tambin que la declaracin genrica que
aparece junto con la declaracin de componente en el segundo archivo es
necesario, ya que es parte de la entidad (del componente) originales. Sin

embargo, no es necesario declarar su valor por defecto de nuevo.


Resultados de la simulacin del circuito sintetizado con el cdigo de abajo
se muestran en la fi gura 10.6.

Ejemplo 10.6: ALU Hecho de COMPONENTES

En el ejemplo 5.5, se presenta el diseo de una ALU (unidad aritmtica


lgica) (diagrama repite en fi gura 10.7). En este ejemplo, el cdigo era
autnomo (es decir, ningn componente externo, funcin o procedimiento
se llama). En el presente ejemplo, sin embargo, vamos a suponer que
nuestra biblioteca contiene los tres componentes (logic_unit, arith_unit y
mux) con los que la ALU se puede construir.
En el cdigo que se muestra a continuacin, adems del cdigo principal
(alu.vhd), tambin hemos incluido el diseo de los tres componentes
mencionados anteriormente. Como puede verse, los componentes fueron
declarados en el propio cdigo principal. Resultados de la simulacin se
muestran en la gure10.8 fi, que son similares a las del Ejemplo 5.5.

También podría gustarte