Você está na página 1de 69

LENGUAJE DE DESCRIPCIN DE

HARDWARE VHDL

fACULT40 Df tNGfNllliA

FACULTAO E INGENIERA
DIVISIN DE INGENIERA ELCTRICA
DEPARTAMENTO DE INGENIERA EN COMPUTACIN
E INGENIERA EN ELECTRNICA

ING. JORGE VALERIANO ASSEM


ING. NORMA ELVA CHVEZ RODRGUEZ
M.l. ARTUO HARO RUIZ

CIUDAD UNIVERSITARIA, AGOSTO 2001


PRESENTACIN

La Facultad de Ingeniera ha decidido realizar una serie de ediciones provisionales de obras



recientemente elaboradas por acadmicos de la institucin, como mat rial de apoyo para sus
clases, de manera que puedan ser aprovechadas de inmediato por alumnos y profesores. Tal es
el caso del Manual de consulta "Lenguaje de descripcin de hardware VHDL ", elaborado por
Jorge Valeriano Assem, Norma Elva Chvez Rodrguez y Luis Arturo Raro Ruiz.

Se invita a los estudiantes y profesores a que comuniquen a los autores las observaciones y
sugerencias que mejoren el contenido de la obra, con el fin de que se ipcorporen en una futura
edicin definitiva.

i
NDICE
TEMA PGINA
1 Introduccin 3
2 Entidades y Arquitecturas 7
2 1 Introduccin 7
2 2 Entidades 7
2 2 1 Declaracin de las Entidades 8
2 2 2 Puertos 9
2 3 Cuerpo de la Arquitectura 10
2 3 1 Descripcin de flujo de datos (data-flow) 11
2 3 1 1 Estructuras de ejecucin concurrente 11
2 3 2 Descripcin por comportamiento (behavioral) 14
2 3 2 1 Estructuras de ejecucin secuencial 16
2 3 3 Descripcin estructural (structural) 19
2 4 Identificadores, objetos de datos, tipos de datos y atributos 21
2 4 1 Identificadores 21
2 4 2 Objetos de datos 21
2 4 3 Tipos de datos 23
2 4 4 Tipos y subtipos 27
2 4 5 Atributos 27
3 Creando Lgica Combinacional y Sncrona 29
3 1 Introduccin 29
3 2 Ejemplo de diseo 29
3 3 Lgica Combinacional 32
3 3 1 Utilizando sentencias concurrentes 32
3 3 2 Utilizando sentencias secuenciales 36
3 4 Lgica Sncrona 40
3 4 1 Empleo de seales de reset en lgica sncrona 44
3 4 2 Operadores aritmticos 46
3 4 3 Resets y presets asncronos 47
3 4 4 Buffers tres estados y sea/es bidireccionales 49
3 5 Diseando una FIFO 51
3 5 1 Loops 52
4 Diseo de Mquinas de Estado 53
4 1 Ejemplo de diseo 53
4 2 Maquina de estados Moore en VHDL 56
4 2 1 Controlador de memoria utilizando mquina Moore de dos procesos 59
4 2 2 Controlador de memoria utilizando mquina Moore de un procesos 64
4 3 Mquina de estados Mea/y en VHDL 67
5 Bibliografa 69

APUNTE FACUL TAO DE INGENIERIA UNAM.


104-B

2001
1 1 1 11]11n 1 1 1 1
G.- 612515

1
fACUlTAD Df !N6fNifll.\

--
1. INTRODUCCIN

Con las complejidades de los chips actuales, cerca de 50 millones de dispositivos


activos, ya no es posible el diseo de hardware usando mtodos basados en
esquemticos As inevitablemente los diseos deben ahora utilizar
exclusivamente especificaciones de alto nivel y procesos de sntesis

De esta forma actualmente se dispone de los llamados HDL, que son lenguajes de
descripcin de hardware los cuales nos permiten describir hardware utilizando
especificaciones de alto nivel, es decir utilizando un lenguaje Haciendo una
analoga los HDLs son lenguajes de alto nivel que nos sirven para crear hardware,
as como el lenguaje "C" nos sirve para generar software

Los HDLs disponibles actualmente nos permiten diferentes formas de especificar


un diseo, a estas formas se les conoce como estilos de escritura, los cuales van
desde especificaciones puramente funcionales hasta especificaciones
estructurales (lo mismo que un esquemtico)

As entonces tenemos que VHDL (Very High Speed lntegrated Cj:ircuit Hardware
Description Languaje) es uno de estos lenguajes de descripcin de hardware
VHDL es originado por el Departamento de Defensa de Estados Unidos de
Amrica a mediados de 1980

VHDL fue establecido como un estndar IEEE 1076 en 1987, y en 1993 fue
actualizado para dar lugar al estndar IEEE 1164 De esta manra VHDL se ha
convertido en un estndar industrial para la descripcin, modelado y sntesis de
circuitos y sistemas digitales Debemos destacar dos aspectos importantes, en
primer lugar VHDL nos sirve para disear solamente circuito digitales y en
segundo lugar las herramientas comerciales que existen y aceptan VHDL,
sintetizan solo un subconjunto del lenguaje Estas ideas se muestran en la Fig 1 1
y Fig 1 2

Ahora X

l._ _ _, L
Pronto '\/'
Digital Analgico

Fig 1 1 Hoy podemos disear solamente circuitos digitales con VHDL

3
Fig 1 2 Las herramientas actuales sintetizan diferentes conjuntos de/lenguaje VHDL

Por qu utilizar VHDL?

El lenguaje tiene la siguientes caractersticas

Los diseos se pueden descomponer en forma jerrquica


Cada elemento de diseo tiene una interface bien defiqida(para conectarlo a
otros elementos) y una especificacin precisa del comportamiento(para
simularlo)
Las especificaciones de comportamiento pueden usar un algoritmo o una
estructura actual de hardware para definir la operacin que realiza un
elemento
Se puede modelar la concurrencia, inherente al harware VHDL puede
manejar estructuras de circuitos secuenciales asncronos y sncronos
La operacin lgica y el comportamiento en el tiempo d e un diseo se puede
simular 1
1

VHDL comenz como un lenguaje de documentacin y modelado, permitiendo que


el comportamiento de diseos digitales se especificaran y simularan de forma
precisa La utilidad y popularidad de VHDL se ha incrementado con el desarrollo
comercial de las herramientas de sntesis para VHDL Est d s programas pueden
crear estructuras de circuitos lgicos directamente de la descripcin de
comportamiento de VHDL Es decir, usando VHDL se pue e disear, simular y
sintetizar en un chip cualquier diseo desde un circuito ombinacional simple
hasta un sistema de microprocesador completo

La razn principal para utilizar VHDL es porque con este se pueden describir y
sintetizarrpidamente circuitos de 5 1 O o 20 mil compuertas
, Diseos
equivalentes descritos con esquemticos o ecuaciones booleanas en el nivel de
transferencia de registros pueden requerir varios meses de trabajo por una
persona A continuacin citamos algunas otras razones para y tilizar VHDL
Potencia y flexibilidad.

VHDL tiene poderosos constructores con las cuales es muy sncillo escribir cdigo
que describa lgica de control compleja Soporta libreras de diseo y la creacin

4
de componentes re-utilizables Provee jerarqua de diseo para crear diseos
modulares

Diseo independiente del dispositivo.

VHDL permite crear un diseo sin tener que escoger a priori un dispositivo en el
cual implementarlo Con una sola descripcin del diseo, este se puede
implementar en muchas dispositivos con arquitecturas diferente No es necesario
concentrarse en la arquitectura particular de un dispositivo a fin de optimizar el
diseo VHDL tambin permite mltiples estilos de descripcin d un diseo

Portabilidad.

VHDL permite simular la misma descripcin del diseo que SEj sintetiza Lo cual
permite localizar errores en el funcionamiento del sistema y ccprregirlos antes de
que se implemente fsicamente el diseo Debido a que la descripcin de un
diseo en VHDL es estndar, este puede ser llevado de un si!llulador a otro, de
una herramienta de sntesis a otra y de una plataforma a otra

Migracin a un ASIC.

Cuando los volmenes de produccin alcanzan niveles apropi$dos, VHDL facilita


el desarrollo de un ASIC(Application Specific lntegrated Circuit), el cual
generalmente reduce el costo del componente y su manufacturq, ya que se reduce
el tamao fsico del chip y su consumo de potencia, adems gereralmente ofrecen
un desempeo mayor As algunas veces el cdigo usado con un PLD puede ser
usado con un ASIC Adems como VHDL es un lenguaje bien definido, se puede
estar seguro de que el vendedor de ASICs entregar un dispositivo con la
funcionalidad que se espera

Flujo de diseo.

Hay varios pasos en el proceso de un diseo basado n VHDL, a estos


usualmente se le conoce como el flujo de diseo Estos pasos se aplican a
cualquier HDL

El flujo comienza con la descripcin del sistema a un nivel de bloques Los diseos
lgicos grandes son usualmente jerrquicos y VHDL da un buen marco de trabajo
para definir mdulos y sus interfaces, complementndolos en detalle despus

El siguiente paso consiste en escribir el cdigo VHDL par los mdulos, sus
interfaces y sus detalles internos Dado que VHDL es un lengwaje basado en texto
en principio se puede escribir el cdigo en cualquier editor de texto, sin embargo,
la mayora de los ambientes de diseo incluyen un editor de texto especializado
para VHDL, el cual hace el trabajo ms fcil Estos editores incluyen herramientas
como sobresaltado de palabras reservadas de VHDL, indentacin automtica,
patrones para estructuras de programa frecuentemente usadas, etc

S
Despus de escribir el cdigo se continua con la compila9in del mismo Un
compilador de VHDL analiza en el cdigo los errores de sintaxis y checa la
compatibilidad con otros mdulos Tambin crea la informaci n interna necesaria

para que un simulador procese posteriormente el diseo

El siguiente paso es la simulacin Un simulador de VHDL per f. ite definir y aplicar


entradas al diseo y observar sus salidas, sin tener que construir fsicamente el
sistema Adems para proyectos grandes VHDL da la habili ad para crear "test
1
benches" los cuales automticamente aplican entradas y la comparan con las
salidas esperadas
1

A continuacin prosiguen las etapas de sntesis, fitting/place+route, timing


verification, las cuales dependen en gran medida de la tecnologa del dispositivo
en la que se va a implementar el diseo 1
La etapa de s ntesis convierte la
descripcin VHDL en un conjunto de primitivas o componentes que pueden ser
ensamblados en la tecnologa del dispositivo elegido Por ejemplo con PLDs o
CPLDs la herramienta de sntesis puede generar ecuaci nes de suma de
?
productos, con ASICs, esta puede generar una lista de compuertas y un netlist que
especifique como deberan ser interconectadas Aqu el diseador puede ayudar a
la herramienta de sntesis especificando ciertas restricciones en la tecnologa
especifica que eligi para implementar su diseo con un nmero mximo de
niveles lgicos o los buffers lgicos a usar En el paso de fittig, una herramienta
mapea las primitivas o componentes sintetizados en los recursos disponibles del
dispositivo Para un PLD o CPLD esto puede significar el asign r ecuaciones o las
elementos AND-OR disponibles Para un ASIC , esto puede s gnificar la creacin

de capas(layers) necesarias para compuertas individuales qu sigan un patrn y
encontrar la forma de conectarlas dentro de las restricciones fsicas del ASIC, a
esto se le conoce como el proceso de place-and-route E diseador puede
adicionalmente especificar restricciones adicionales en esta etapa, tales como la
colocacin de mdulos en el chip o la asignacin de pines a entradas y salidas
externas

El ultimo paso es la verificacin de tiempos del circuito impl mentado En esta


etapa es donde se pueden calcular con razonable precisin los retrasos en el
circuito debidos a la longitud de los alambre (internos), carga elctrica, etc Es
usual que durante este paso se apliquen los mismo casos de prueba que fueron
usados en la simulacin, solo que en este caso se aplican al circuito como
quedar al construirse

6
2. ENTIDADES Y ARQUITECTURAS

El objetivo de esta seccin es entender el concepto, utilidad y utilizacin de las


dos entidades principales del lenguaje VHDL, llamadas Entidades y Arquitecturas
1
Entidades que definen la interfaz y la funcionalidad de un sistemq

2.1. Introduccin

Los bloques constitutivos bsicos de cualquier diseo en VHDL se llaman


declaracin de entidad y cuerpo de la arquitectura Tambif1 sern explicados
tres estilos bsicos de codificacin, haciendo analogas con diseros esquemticos
y programacin en lenguajes de alto nivel con la intencin de yudar a colocar a
VHDL en un marco familiar Sin embargo exhortamos a los l ctores a ser muy
cuidadosos y no abusar de las analogas porque codificar ern VHDL es muy
diferente en relacin a codificar en lenguajes de programacin Siempre debemos
tener en mente que al usar VHDL lo hacemos para disear hardware El cdigo
producido de esta manera ser sintetizado en lgica digital para ser programado
en dispositivos lgicos

2. 2. Entidades

La entidad es la unidad primaria del lenguaje que identifica a los dispositivos



mediante la definicin de su interfaz, esto su nombre, termin les de conexin y
parmetros de instanciacin Es posible utilizarla tambin para declarar objetos
(seales y constantes, tipos de datos y subprogramas) Se puede decir que la
entidad desempea una funcin equivalente a la del smbolo de un dispositivo en
los esquemas de circuitos

Esta unidad de descripcin se construye con los elementar predefinidos del


lenguaje como son los identificadores de unidades, sentencias, declaraciones,
tipos de datos, operadores etc

Bajo estos trminos una entidad es una abstraccin de un diseo, que puede
p
representar un sistema completo, una tarjeta, un chip, una equea funcin o
hasta una compuerta lgica

As podemos pensar que una entidad en VHDL est constituida por un par llamado
declaracin de la entidad y cuerpo de la arquitectura (este ltimo ser visto ms
adelante) Esta idea se ilustra en la Fig 2 1

7
Entidad

Declaracin de Entidad

Interface de la declaracin

Cuerpo de la Arquitectura

Definicin Funcional

Fig 2 1 Entidad en VHDL

2.2.1 Declaracin de las Entidades

La declaracin de una entidad describe las entradas y salidas del diseo de una
entidad Tambin puede describir valores parametrizados E$ta descripcin de
entradas y salidas es til en la utilizacin de la entidad dertro de un diseo
jerrquico En seguida mostramos la declaracin de una entidad que corresponde
a un sumador de cuatro bits cuyo smbolo se ilustra en la Fig 2 2 Se observa la
analo g a entre la declaracin de la e nt idad y el smbolo

entityadd4 is port(
a, b in std_logic_ vector(3 downto 0),
cin in std_logic,
sum out std_logic_vector(3 downto 0),
co out std_logic);
end add4,

add4
Fig 2 2 Smbolo equivalente a la entidad add4

8
2.2.2 Puertos

Cada seal de E/S en la declaracin de una entidad se refiere 6on el nombre de


port (puerto) que es la analoga con un pin en el smbolo esquemtico Un puerto
es un objeto de datos, por tanto, como cualquier objeto de datos se le pueden
asignar valores y usar en expresiones El conjunto de puertos definidos para una
entidad se refiere como port declaration (declaracin de puerto) Cada puerto
que se declare debe tener un nombre, una direccin (conocida como modo) y un
tipo de dato asociado

Modos. El modo describe la direccin en la cual los datos son tr nsferidos hacia el
1
puerto El modo puede ser uno de cuatro valores in, out, inout y buffer En el caso
de que el modo de un puerto no sea especificado se asume que es in El uso de
estos modos es el siguiente y se ilustran en la Fig 2 3

>- In. Los datos fluyen nicamente hacia el interior de la entidad. El operador para
el puerto en este modo es externo a la entidad Este modo es utilizado
principalmente para transferir seales de entrada de reloj, e t"ltradas de control
(como carga, inicializacin, habilitacin), y entradas de datos unidireccionales

>- Out. Los datos fluyen nicamente desde la fuente en el int rior de la entidad
$
hacia el puerto de salida de la entidad. Este modo es utilizado para salidas
tales como salidas de terminacin de conteo, salidas de control, etc

>- Buffer. Se utiliza para retroalimentacin interna Esto es, el puerto tambin se
usa como un operador dentro de la misma arquitectura Un puerto que es
declarado en modo buffer es similar a un puerto que es dec l arado como modo
'1
de salida, excepto que el de salida no permite retroalimenta in Un puerto del
modo buffer se puede conectar solamente a una seal interna o a un puerto de
1
modo buffer de otra entidad, pero nunca a un puerto del tipo out o inout

>- lnout. Para el manejo de seales bidireccionales se debe declarar un puerto


del modo inout, el cual permite que los datos fluyan hacia el nterior o exterior
j
de la entidad, este modo tambin permite la retroalimentacin interna

Tipos. Adicionalmente a los identificadores de los puertos y s s modos, tambin


se debe declarar los tipos de datos de los puertos Estos tipos $on provistos por el
estndar IEEE 1076/93, que son los ms usuales y soportados por las
herramientas de sntesis Estos tipos son boolean, bit, bit_vector y integer Los
ms tiles y bien soportados son los provistos por el paquete IEEE
std_logic_1164, estos tipos son std_ulogic y std_logic as comp arreglos de estos
tipos Para que estos tipos sean reconocidos es necesario h cerlos visibles a la
entidad mediante la forma de una librera y clusulas como en los lenguajes de
programacin De esta manera la declaracin de la entidad add4 descrita

9
anteriormente no puede ser procesada por las herramientas d software hasta ser
modificada de la siguiente manera

library ieee,
use ieee std_logic_1164.all;
entity add4 is port (
a, b in std_logic_ vector(3 downto 0),
cin in std_logic,
su m out std_logic_ vector(3 downto 0),
co out std_logic),
end add4,

Modo Modo

In Out

Buffer

lnout
In

In

Out

Fig 2 3 Diferentes modos con sus seales de origen

2.3. Cuerpo de la arquitectura

La arquitectura es una unidad secundaria del lenguaje Esta1 asociada a una


determinada declaracin de entidad, se encarga de describir el funcionamiento del
dispositivo identificado por esta Para ello se sirve de los procesos, en las
descripciones funcionales y de los componentes en las e:;tructurales Esto
significa que la entidad es vista como la donde no s9bemos lo que hay
caja negra,
dentro, pero en el cuerpo de la arquitectura se describe el conteflido de ella

VHDL permite escribir los diseos utilizando los siguiente tres estilos de
arquitecturas diferentes

Descripcin de flujo de datos (data-flow)


Descripcin por comportamiento (behavioral)
Descripcin estructural (estructural)

10
Cada uno de estos estilos permite escribir un diseo con nivele$ diferentes de
abstraccin, incluso la combinacin de ellos

2.3.1. Descripcin de flujo de datos (data-flow)

En este estilo de diseo las siguientes dos caractersticas son ytilizadas en el


diseo

Se especifica como los datos son transferidos de los puertos de entrada a los
puertos de salida
Se utilizan nicamente asignaciones mediante expresiones en las que se
indica como cambian los puertos de salida en funcin de los puertos de
entrada, ya sean asignaciones condicionales mediante instrucciones
concurrentes o simples ecuaciones

Cabe destacar que en lenguajes de programacin como "C" p Pascal, cada


instruccin de asignacin es ejecutada una despus de otra en un orden
especfico, especificado por el orden de aparicin en el archivo

En VHDL todos los bloques son concurrentes, es decir se estn ejecutando en


todo momento Esto significa que dentro de una arquitectura en YHDL, no existe
un orden especfico de ejecucin de las asignaciones, por tanto el orden en que
las instrucciones son ejecutadas depende de los eventos ocurrido$ en las seales,
como sucede en un circuito Finalmente esto significa que en este estilo no se
utilizan sentencias secuenciales, sino solamente asignaciones yoncurrentes El
siguiente cdigo VHDL define en este estilo un comparador de cu tro bits
library eee,
use eee std_logic_1164 al/;
entity eqcomp4 is
port (a, b in std_logc_vector(3 do wnto O);
equals out std_logc),
end eqcomp4,

architecture dataflow of eqcomp4 is


b egin
equals <= '1' when (a = b) e ls e 'O';
end dataflow,

2.3.1.1 Estructuras de Ejecucin Concurrente

En el estilo de descripcin dataflow existen estructuras q


ue se ejecutan
concurrentemente e indican asignacin a puertos de salida er funcin de los
puertos de entrada Las estructuras comunes son

ll
Asignacin Condicional WH
EN ... ELSE

Sintaxis

ldentificador_de_seal<= valo
r_a WHEN condicin ELSE
valor b WHEN condicin ELSE

valor n WHEN condicin ELSE


valor default

Ejemplo

x <= '1' WHEN seleccion = "4" ELSE '0',

Asignacin WHIT SELECT


.. .
... WHEN

Sintaxis

WITH identificador SELECT


Seal_salida<= valor_a WHEN
identificador_valor1,
valor_b WHEN identificador_valor2,

valor_n WHEN OTHERS,

Ejemplo

WITH estados SELECT


salida<= "000" WHEN stateO,
"001" WHEN state1,
"01O" WHEN state2,
"100" WHEN state3,
"000" WHEN OTHERS,

Ecuaciones Booleanas

Sintaxis

identificador_de_seal <= ecuacin_booleana,

12
Ejemplos

x <=y and z,
a <= (b or e or d) and e,
op1 <= op2 nor op3 nor op4,

En el siguiente ejemplo presentamos el diseo de una ALU (Unidad Aritmtico


Lgica) utilizando el estilo dataflow Las funciones del ALU est n descritas en la
sig tabla

1
ENTRADAS SALIDAS
1
s1 sO z co

X and 1
o o y o
o 1 X or Y 1 o
1 o X xor Y 1 o
1 1 X + y + cin 1 cout
1
El cdigo que describe el ALU es

library ieee,
use ieee std_logic_1164 al/,
use ieee numeric_std.a/1,

entity a/u is r
port ( x, y in std_logic,
sO, s1 in std_/ogic,
ci . in std_/ogic,
z out std_logic,
co out std_logic),
end alu,

architecture a alu of afu is


signa/ seleccion unsigned (1 downto O) ,
signa/ suma std_logic,
signa/ and_op std_logic,
signa/ or_op std_logic,
signa/ xor_op . std_logc,
signa/ acarreo std_logic;

begin
and_op <= xand y,
suma <= x xor y xor ci,

13
or_op <= x or y,
acarreo <= (x and y) or (x and ci) or (y and ci);
xor_op <= x xor y,
with seleccion se/ect
z <= or_op when "01",

and_op when "00",


suma when "11 ",
xor_op when "10",
O when others,
' '

seleccion <= s 1 & sO,


co <= acarreo when seleccion = 3 else '0',
end a_alu,

2.3.2. Descripcin por comportamiento (behavioral)


Las descripciones por comportamiento son similares a las de cripciones hechas
en un lenguaje de programacin de alto nivel, debido a su nivel de abstraccin En
una descripcin de este tipo no se especifica la estructura o la forma en que se
deben conectar los componentes, sino nicamente nos limitamos a describir su
comportamiento

Una descripcin por comportamiento consiste de una serie de instrucciones, que


ejecutadas secuencialmente, modelan el comportamiento del circuito Con este
grado de abstraccin no requerimos enfocarnos a un nivel de compuerta para
implementar un diseo

En VHDL las descripciones por comportamiento implican el us f de por lo menos


un bloque Process, en el interior de estos bloques se escriben las instrucciones
de VHDL que son ejecutadas secuencialmente una despus de (j)tra

Los procesos se pueden utilizar en el interior de cualquier arquitectura definiendo


para s mismo una regin de declaraciones y otra para la codificacin secuencial
Esta regin de codificacin puede contener nicamente instrucciones
secuenciales En la zona de declaraciones se permite designar constantes,
seales, tipos de datos o algn alias Lo que hay dentro de un proceso tiene
mucha semejanza a la programacin utilizando un lenguaje de alto nivel

La sintaxis de un proceso es la siguiente

process (lista sensitiva)


-- declaraciones
begin
-- instrucciones secuenciales
end process;

14

l
La lista sensitivaes opcional y define que seales provocan que las instrucciones
dentro del bloque comiencen a ser ejecutadas De esta manera c y alquier cambio
en alguna de las seales de esa lista provoca que el proceso sea llamado Si un
proceso no tiene lista sensitiva, entonces debe contener una instruccin wait (que
se ver ms adelante) para especificar cuando deben ser ejecutadas las
instrucciones dentro del bloque

La especificacin de esta lista nos puede servir para especifi &ar si estamos
modelando lgica combinacional o secuencial Se dice que una li ta sensitiva es
parcialmente declarada cuando alguna de las seales que intervienen del lado
derecho de una ecuacin o de alguna instruccin secuencial no es mencionada
dentro de la lista

El funcionamiento del proceso es de la siguiente manera

> Las seales dentro de la lista sensitiva funcionan comb entradas de


interrupcin y las instrucciones secuenciales se encuentran dentro de la rutina
nica de servicio de interrupcin

> Cuando alguna de las seales de la lista sensible cambia, rovoca que el
proceso comience a funcionar y a ejecutar toda esta ruti a de ejecucin

secuencial con la particularidad de que lo que resulte de este p ocesamiento se
r
asigne nicamente al final de la estructura

En seguida mostramos el cdigo utilizado para generar un co m parador de dos


palabras de cuatro bits

library ieee,
use ieee std_logic_1164.all;
entity eqcomp4 is port (
a, b in std_logic_ vector(3 downto
0),
equa/s out std_logic),
end eqcomp4,

architecture behavioral of eqcomp4 is


begin
comp process (a, b)
begin
if a= b then
equals <= '1 ',
else
equals <= '0',
end if;
end process comp,
end behavioral,

Esta arquitectura nicamente tiene una instruccin concurrente constituida por el


bloque process el cual es sensible a los vectores de entrada Siempre que exista

15
un cambio en alguno de ellos, el proceso ser llamado y generar la lgica de
salida Podemos observar que la lista sensitiva est completa Cada instruccin
dentro del proceso ser ejecutada en orden secuencial y cuando todas hallan sido
ejecutadas, entonces se asigna el valor procesado a los nodos que se vieron
afectados durante el proceso Una vez terminado de ejecut$r el proceso, este se
mantendr inactivo hasta que alguno de los dos elemento en la lista sensitiva
cambie Instrucciones que se pueden ejecutar en los bloql;les secuenciales son
estudiadas a continuacin

2.3.2.1 Estructuras de Ejecucin Secuencial

IF - THEN - ELSE

Esta instruccin secuencial permite probar una condicin y elegir dos caminos de
accin diferentes dependiendo de si la condicin se cumple o no Es equivalente a
un multiplexor de dos entradas y una lnea de seleccin La sintaxis es la
siguiente

Sintaxis

lf condicin then

elseif condicin then

end if;

Ejemplo

signa/ conteo unsigned (3 downto O);

if conteo = "9"then
conteo<= (others => '0'),
else
conteo<= conteo+ 1,
end if;

CASE - WHEN

Esta instruccin secuencial permite una bifurcacin mltiple dependiendo del valor
resultante de una expresin, se elige alguna alternativa, que es la que se ejecuta,
en caso de que ninguna alternativa se cumpla, se ejecuta lo que contenga la
alternativa others La sintaxis es

16


Sintaxis

case expresin is
when alternativa 1 =>

when altemativa2 =>

when others =>

end case;

Ejemplo

type estados is (estado1, estado2, estado3, estado4)


signa/ estado_maquina estados,
signa/ motor, alarma bit,
constant encedido bit =' 1 ',
constant apagado. bit ='0',

case estado_maquina is
when estadoO =>

motor <= apagado,


when estado 1 =>
motor <= encedido;
when (estado3 or estado4) =>
alarma <= encendido;
..
when others => ;
motor <= apagado;
A
alarma <= apagado;
end case;

FOR - LOOP

Esta instruccin secuencial es un ciclo iterativo que permite repetir un bloque


secuencial un determinado numero de veces conocido previamente mediante una
variable conocida que sirve para contar las iteraciones Su sinta*is es la siguiente

Sintaxis

for identificador in rango loop

end loop;

17
Ejemplo

for i in 3 downto O loop -- i es una variable y no necesita ser declarada


lf reset(i) = '1' then
' '

Data_out(i) <= 0 ,

end if;
end loop;

;. WHILE - LOOP

Esta instruccin secuencial es un ciclo iterativo que permit repetir un bloque


secuencial un numero de veces no determinado, el n rll ero de iteraciones
depende de la condicin que se prueba al inicio del ciclo Su sintaxis es la
siguiente

Sintaxis

while condicin loop

end loop,

Ejemplo

contador = O,
resultado_tmp =O,
while contador > O loop
contador =contador- 1,
resultado_tmp = resultado_tmp + data_in,
end loop;
resultado <= resultado_tmp;

WAIT

Esta instruccin es utilizada en procesos que no tienen lista sensitiva, debido a


que esta instruccin define implcitamente la lista sensible del proceso Existen
tres variantes de esta instruccin

Wait on Espera los cambios de las seales especificadas Esta Instruccin no es


aceptada por la mayora de las herramientas de sntesis

Wait for Detiene la simulacin durante el tiempo especificado, sqlo se utiliza para
simulaciones

Wait until Espera a que se cumpla la condicin especificada Es a forma si es


sintetizable y puede utilizarse sin tener problemas

18

_
2.3.3. Descripcin estructural (estructural)

En una descripcin estructural se declaran los componentes q y e se utilizan, se


crean las instancias de los mismos (es decir se ponen los componentes) y
despus mediante los nombres de los nodos, se realizan las conexiones entre las
instancias de los componentes Las descripciones estructurales on tiles cuando
se trata de diseos jerrquicos bien modularizados

Un componente representa a una entidad declarada en un dise o o librera Para


poder utilizar una entidad que est dentro de otro diseo, es necesario llamar a la
librera y el paquete dentro del cual se encuentra esta entidad

Sintaxis de la declaracin de componentes

Component identificador_ componente j


Port(identificador{, identificador} modo tipo_de_dato
{, identificador{, identificador} modo tipo_de_dato ),
end component

Ejemplo

component add
p ort(a, b, cin in std_logic,
suma, co out std_logic),
end component,

La instanciacin del componente puede entenderse com f una instruccin


concurrente que especifica la interconexin de las seales del componente dentro
del diseo en el que est siendo utilizado Existen dos forlmas de hacer la
instanciacin de los componentes

Por asociacin de identificadores.

En este tipo es necesario utilizar el operador de asociacin "=>" para indicar como
se conectan los puertos del componente con los puertos o seales de la
arquitectura en la que est siendo utilizado dicho componente
Por ejemplo en la asociacin "a =>", tenemos que "a" perteneoe al componente y
"b" es una seal, variable o incluso una ecuacin booleana en la que intervienen
objetos de datos que pertenecen a la arquitectura donde se usa el componente

Ejemplo

architecture a_regB of regB is


signa/ clock, reset, enable std_logic,
signa/ data_in, data_ out std_logic_vector (7 downto 0),
begin
registerB port map (clk=>clock, rst=>reset, en=>enable, dataF=> data_in,

19
El identificador width puede ser utilizado en varios puntos del cdigo, de esta
manera cuando se desea cambiar la anchura del registr<:> solo es necesario
cambiar el valor de la constante, y afectar de esta manera todos los puntos donde
se usa la constante

Las constantes se pueden declarar en la zona declarativ de las entidades,


arquitecturas o procesos, y ser visible solo dentro del mbito que se declara

>- Seales. Las seales pueden representar alambres y por tanto pueden
interconectar componentes . Los puertos son seales, de hecho, los puertos
pueden ser especficamente declarados como seales. as seales pueden
ser entradas o salidas de compuertas lgicas Por ejemplo la siguiente es una
seal

signa/ count bit_vector(3 downto 0),

La seal "counf' puede representar el estado actual de un contador Tal cual en


este caso entonces representa elementos de memoria o mas especficamente
alambres conectados a las salidas de esos elementos de memoria Valores
iniciales pueden ser asignados a seales pero realmente n 9 tienen significado
para la sntesis Ejemplo

signa/ count bit_vector(3 downto O) = "0101",

El smbolo "=" indica asignamiento inmediato y es utilizado para indicar el valor


inicial de la seal Para simulacin es til, pero para sntesis no lo es, debido a que
no se sabe el estado inicial al encender el dispositivo

>- Variables. Las variables son nicamente utilizadas en procesos y


subprogramas (funciones y procedimientos), y deben ser deqlaradas en la zona
declarativa de un proceso o un subprograma Las variabls no representan
seales ni elementos de memoria Las variables son utilizadas para propsitos
computacionales El siguiente es un ejemplo de una declaracin e inicializacin
de variable

variable result: std_logic = '0',

Los asignamientos a las variables son inmediatos Las variable no tienen formas
de onda de salida, por tanto ellas solo mantienen un valor en u r tiempo, para las.
variables el smbolo"=" significa asignacin inmediata.

Para propsitos de sntesis , el uso ms comn de las variables es para el manejo


de ndices, as como para el almacenamiento temporal de datos El alcance de la
variable nicamente es el proceso en el cual ha sido declarada El siguiente
cdigo muestra el modelado de una ANO de 8 entradas utilizand d variables

22
architecture will_work of my_and is
begin
process(a_bus)
variable tmp. bit ,

begin
tmp = 1 ' ',

for i in 7 downto O loop


tmp = a_bus (i) and tmp,
end loop,
x <= tmp,
end process
end wi/1_work,

El smbolo " =
"
es utilizado para indicar una asignacin inmediata a una variable,
de esta manera las iteraciones del loop resultan en una asignaqin inmediata Al
final del proceso se hace se ejecuta la instruccin de asignar el resultado a la
variable"x", usando el operador"<=" que asigna el resultado al final del proceso

>- Archivos. Los archivos pueden contener valores de un tio especifico Se


utilizan los archivos para leer datos que sirven de estmulos y escribir datos a
la salida de los procesos de simulacin

>- Alias. Un alias es un sobrenombre con el que se conoce tambin a cualquier


identificador de algn objeto existente Al referenciar el alias es lo mismo que
referenciar al identificador original Por ejemplo

signa/ address std_logic_vector(31 downto 0),


alias top_ad std_logic_vector(3 downto O) is address (31 dowt)to 28),
alias bank O) is address (27 downt 24),
std_logic_vector(3 downto
alias row_ad std_logic_vector(11 downto O) is address (23 downto 12),

2.4.3. Tipos de dato s

Cada objeto que podemos representar con VHDL, debe perten cer a un conjunto
bien definido, el cual se conoce como tipo de datos y se encarga de agrupar
objetos con caractersticas comunes

VHDL es un lenguaje fuertemente tipificado, lo cual signific que objetos de_


diferentes tipos no pueden ser asignados entre si sin la previa onversin de tipo
A continuacin estudiaremos los diferentes tipos de datos

>- Tipo escalar. Los tipos escalares tienen un orden, lo cul permite que los
operadores de relacin sean utilizados_ Hay cuatro categoras de tipos
escalares enumeracin, enteros, flotantes y fsicos
Tipo enumeracin. Un tipo enumeracin es una lista de valores que un objeto
de ese tipo puede tener Son muy tiles cuando se trabja con maquinas de
estados Ejemplo

type states is (id/e, preamble, data, jam, nosfd, error),


signa/ current_state states,

El orden en el cual son listados en la declaracin del tipo 9 efine su relacin, El


valor de ms a la izquierda es menor que los otros valores

Existen dos tipos enumerados predefinidos por el estndar IEEE 1076 bit y
boolean que son definidos como

type boo/ean is (FALSE, TRUE),


type bit is ( 0 '1 '),
' ',

El estndar IEEE 1164 define un tipo adicional llamado p


std_ul gic

Type std_ulogic is ('U', --no inicializado


'X', --Desconocido
'0', --Cero
'1', --uno
'Z', --alta impedancia
'W', --desconocido dbil
'L ', --cero dbil
'H', --uno dbil
'
' --no importa
),

Tambin define un tipo llamado std_logic que es idntico al std_ulogic con la


diferencia de que tiene asociada una funcin de resolucin que se utiliza en cada
asignacin Los valores '0', '1', 'L' y 'H' son soportados por la sntesis Los valores
''
'Z' y - tambin son soportados por la sntesis por los drivers d tres estados y los
valores no importa Los valores 'U', 'X' y W no son soportados por la sntesis
' '

Para poder usar estos tipos es necesario escribir las siguientes lneas

library ieee,
use ieee std_logic_1164.all,

Tipo entero Los enteros y sus operadores aritmticos y relacionales son


predefinidos en VHDL Los enteros soportados son de -2,147,483,647 -(2 -1)
31
31
a 2,147,483,647 (2 -1) Una seal o variable que es del tipq entero y que va a
ser sintetizada debe tener asociado un intervalo Por ejemp1 9
Variable a integer range -255 to 255,

24
Tipo flotante. El tipo punto flotante es utilizado para aproximar nmeros
realesTambin como en los enteros se debe especificar un intervalo El
intervalo
mximo definido es -1 OE38 a +1 OE38 Este tipo no es
comnmente soportado por las herramientas de sntesis por la cantidad de
recursos requeridos
.

Tipo fsico. Los valores de tipos fsicos son utilizados como unidades de
medicin, el nico tipo predefinido es tipo time Su intervalo i r cluye al mnimo
el de los enteros Su unidad primaria es el "fs" (femtosegundo) y se define
como

type time is range -2147483647 to 2147483647 1

units l

fs, t
ps= 1000 fs,
ns = 1000 ps,
us = 1000 ns,
ms = 1000 us,
sec= 1000 ms,
min= 60 sec,
hr= 60 min,
End units,

El tipo fsico no es sintetizable, es til solamente en las simulacio es h



Tipos Compuestos. Los objetos del tipo escalar pueden rpantener solo un
valor en un tiempo de simulacin Los objetos de datos del tipo compuesto,
pueden mantener mltiples valores en un tiempo dado Estos consisten del tipo
arreglo y tipo registro.

Tipo arreglo Un objeto del tipo arreglo consiste de mltiples elementos del mismo
tipo, los ms comunes son los siguientes

type bit_ vector is array (natural range <>) of bit;


type std_ulogic_vector is array (natural range <> ) of std_ulofJic,
type std_logic_vector is array (natural range <>) of std_logio,

"
La clusula "range <> significa que el nmero de bits no es especificado, es
decir lo har el usuario en el momento de utilizar este tipo El nmero de
elementos en los tipos arreglos est acotado solo por nmeros positivos enteros
Estos tipos son comnmente utilizados para utilizar buses Por ejemplo

signa/ a std_logic_ vector (3 do wnto 0),

Sin embargo un bus puede tambin ser definido con nuestros propios tipos

25
type word is array(15 downto O) of bit,
signa/ b word,

Si el usuario define, sus propios tipos, entonces tambin tiene que definir y
sobrecargar los operadores para ese tipo Por ejemplo los arreglos de dos
dimensiones son tiles para crear tablas de verdad

type table8x4 is array(O to 7, Oto 3) of bit,


constant exclusive_or table8x4 = (
"000_0",
"001- 1"'
"010_1",
"011- O"'
"100_1",
"101_0",
"110_0",
"111_1'},

El caracter de subrayado se inserta solamente para distinguir entre las entradas y


salidas representadas en la tabla

Una asignacin del tipo

a<= X"7A",

requiere que " a" sea de ocho bits de longitud, dado que se le esta asignando un
nmero hexadecimal de dos dgitos Los especificadores de base son "X" para
hexadecimal, "O" para octal y "8" para binario

Tipo Registro. Un objeto del tipo registro tiene mltiples elementos de


diferentes tipos, los elementos individuales del registro pueden ser
referenciados por el nombre del elemento El siguiente es un ejemplo

type ioce/1 is record


buffer_inp bit_vector(? downto 0),
enable bit,
buffer_out bit_vector(7 downto 0),
end record;

signa/ busa, busb, busc ioce/1,


sign a/ vec bit_vector(? downto O;
)

busa buffer_inp <= vec, --se asigna un bit_ vector a otro bit_ve qtor
busb buffer_inp <= busa buffer_inp; --se asigna un campo entrf registros
busc <= busb, --se asigna el obJeto entero
'

26
2.4.4. T i pos y subtipos

A partir de los tipos base podemos crear otros tipos

type byte_size is integer range Oto 255,


signa/ my_int byte_size,

Aunque "byte_size" s basa en el tipo entero, este tiene su propio tipo De manera
que para este tipo operan todas las reglas especificas de los tipos, de esta forma
si declaramos la se 4 1

signa/ your_int integer range O to 255,

La siguiente operacin producir un error de compilacin

lf my_int = your_intthen ...

Los operandos en esta comparacin son de los tipos byte_size e integer, lo cual
resulta en una mezcl + de tipos
Un subtipo es igual a su tipo base solo que con algunas restricciones en su
tamao, por ejemplo, comparemos

Subtype byte is bit_ vector (7 downto O);


Signa/ byte1, byte2 yte, e
Signa/ data1, data2 byte,
Signa/ addr1, addr2 byte,

Con las declaraciones individuales

i na/ byte3, byte4 bit_ vector(? downto 0),


Sg
i na/ data3, data4. bit_ vector(? downto 0),
Sg
Signa/ addr3, addr4 bit_ vector(? downto 0),

En este caso, el siguiente cdigo no generar un error en tiempo de compilacin,


debido a que "byte" esta declarado como un subtipo entonces nunca existe mezcla
de tipos

lf byte1 = byte3 then ...

2.4.5. Atributos

'
Los atributos extra n informacin acerca de entidades, arqu itecturas , tipos y
seales Tomando en consideracin las siguientes declaraciones, mostramos los
ejemplos de la Tabla 2 1

27
type count is integer range O to 127;
type states is (id/e, decision, read, write),
type word is array (15 downto O) of std_logic,

Valor retornado Descripci del atributo


Count'left = O 'left obtiene el valor de ms a la
States'left = idle izquierda del tipo
Word'left = 15
Count'right = 127 'right obtiene el v a lor de ms a la
States'right =write derecha del tipo
1
Word'right = O
Count'high = 127 'high obtiene el valor ms grande del
States'high = write tipo
Word'high = 15
Count'low = O 'low obtiene el valor ms pequeo del
States'low = idle tipo
Word'low=O
Count'length = 128 'length obtiene el numero de elementos
States'length = 4 de un arreglo
1
Word'length = 16
Tabla 2 1 Descnpc10nes de los atnbutos

28
3. CREANDO LGICA COMBINACIONAL Y SNCRONA

El objetivo de esta seccin es describir la creacin de lgica combinacional y


sncrona utilizando los varios estilos de diseo descritos en la seccin anterior
1
(estructural, flujo de datos y por comportamiento)

3.1. Introduccin
En la seccin anterior estudiamos los conceptos de decla ra ci n de enti da d y
c er o de la arquitectura
u p En esta secciones aprenderemos con ejemplo
sencillos a utilizar mu t hos de los constructores del lenguaje para definir el cuerpo
de la arquitectura, es decir crearemos el hardware que involucra la caja negra que
conocemos como arquitectura Este enfoque se har para describir arquitecturas
combinacionales y sncronas

3.2. Ejemplo de dieo


Mostramos el cdigo VHDL de un ejemplo que maneja conceptos vistos en la
seccin anterior as como conceptos que sern aprendidos a lo largo de esta
seccin Se trata de una FIFO (cola) de 8 palabras cada una de 9 bits, con la
conocida regla que el primero que entra es el primero que sale Este ejemplo nos

va a servir para introducir constructores del lenguaje VHDL No es necesario leer a
detalle el cdigo descrito a continuacin, sino solo identificar los nuevos
constructores

Dos paquetes son '-ltilizados en este diseo std_/ogic_1164 y std_arith El


primero es incluido para poder utilizar tipos como std_logic y std_logic_ vector El i
segundo paquete es incluido para poder acceder al operador sobrecargado "+" y
poder sumar enteros con vectores

/ibrary ieee,
use ieee std_logic_1164 al/,
use work std_arith alf;
entity fifo8x9 is port (
clk, rst in std_logic,
rd, wr, rdinc wrinc in std_logic;
r
.

rdptrclr, wrptrclr in std_logic,

/
data in in std_logic_vector(B downto O);
data out out std_logic_vector(B downto O);
end fifo8x9,

architecture archfifo8x9 of fifo8x9 is


type fifo_array is array(7 downto O) of std_logic_vector(B downto O);
signa/ fifo fifo_arr y,

signa/ wrptr, rdptr std_logic_vector(2 d wnt o o 0),

29
signa/ en std_logic_vec
tor(? downto 0),
signa/ dmuxout std_logic
_vector( S downto 0),

begin

--arreglo de registros de
la tifo
reg_array process (rs
t, c/k)
begin
if rst '1' then
=
for i in 7 downto O loo
p
fifo(i) <= (others => '0'),
--agregacin
end loop;
e/sif (c/k'event and c/k
= '1') then

if wr = '1' then
for i in 7 downto O loo
p
if en(i) = '1' then
fifo(i) <= data_in,
else
fifo(i) <= fifo(i),
end if;
end loop;
end if;
end if;
end process;

--apuntador de lectura
read_count process (rst,
clk)
begin
if rst = '1' then
rdptr <= (others => '0},

elsif (clk'event and clk =


'1') then
if rdptrclr = '1' then
rdptr <= (others => '0'),
elsif rdinc = '1' then
rdptr <= rdptr + 1,
end if;
end if;
end process;

-- apuntador de escritura
write_count process (rst, clk)
begin
if rst = '1' then
wrptr <= (others
=> '0'),
e/sif (clk'event and clk =
'1') then
if wrptrclr = '1' then

30
wrptr<= (others r> '0'),
elsif wrinc = '1' thn
wrptr<= wrptr + ,
end if;
end if;
end process;

--multiplexor de datos de salida 8 a 1


with rdptr select
dmuxout<= fifo(O) Jvhen "000", ;
fifo(1) Jvhen "001",
ffo(2) Jvhen "01 O",

fifo(3) when "011",


fifo(4) when "100",
fifo(S) Jvhen "101",
fifo(6) when "110",
fifo(l) hen others;
-- decodificador selector del registro de la tifo

with wrptr select


en<= "00000001" when "000",
"0000001 O" when "00 1 ",
"00000100" when "010",
"00001000" when "O 11 ",
"00010000" when "100",
4
"001 00000" when "1 O 1 ",

"01000000') when "110",


"10000000' when others;

-- control tres estados para las salidas

three-state process (rd, dmuxout)


begin
if rd = '1' then
data out<= dmu out,
else
data_ out<= (others => 'Z'),
end if;
end process;

end archfifo8x9,

31
3.3. Lgica combinacional

La lgica combinacional puede ser descrita de diferentes formas En el ejemplo de


la FIFO la lgica combinacional est descrita por las seales "dmuxout" y "en", as
como por los buffers tres estados Las seales "dmuxout" y "en" utilizan
constructores del estilo flujo de datos mediante el uso de sentencias with-select
when Los buffers tres estados son descritos con el estilo de comportamiento
utilizando sentencias if-then-else Es decir es posible escribir l gica combinacional
tanto con sentencias concurrentes como con sentencia secuenciales Las
sentencias concurrentes son utilizadas en los estilos flujo d datos y estructural
Las sentencias secuenciales son utilizadas en descripciones por comportamiento

3.3.1 Utilizando sentencias concurrentes

Las sentencias concurrentes siempre se localizan fuera de cualquier proceso


Conceptualmente estas sentencias se ejecutan concurrentemente, por lo tanto el
orden en que aparezcan las diferentes sentencias no es importante, a
continuacin vamos a describir tres tipos de sentencias concu rrentes utilizadas en
el estilo de descripcin de flujo de datos

Ecuaciones Booleanas.

Las ecuaciones booleanas pueden ser utilizadas en sentencias tanto concurrentes


como secuenciales de asignamiento El siguiente listado desribe un multiplexor
de cuatro buses de cuatro bits cada uno, como lo ilustra la Fig 3 1

library ieee,
use ieee std_logic_1164.all;
entity mux is port (
a, b, e, d in std_logic_ vector(3 downto 0),
S in std_logic_vector(1 downto 0),
X out std_logic_vector(3 downto 0),
end mux,

architecture archmux of mux is

begin
x(3) <= (a(3) and not(s(1)) and not(s(O)))
or (b(3) and not(s(1)) and s(O))
or (c(3) and s(1) and not s(O)))
or (d(3) and s(1) and s(O)),

x(2) <= (a(2) and not(s(1)) and not(s(O)))


or (b(2) and not(s(1)) and s(O))
or (c(2) and s(1) and not s(O)))

32
or (d(2) and s(1) and s(O)),

x(1) <= (a(1) nd not(s(1)) and not(s(O)))


or (b(1) and not(s(1)) and s(O))
or (c(1) and s(1) and not s(O)))
or (d(1) and s(1) and s(O));

x(O) <= (a(O) and not(s(1)) and not(s(O)))


or (b(O) and not(s(1)) and s(O))
or (c(O) and s(1) and not s(O)))

or (d(O) and s(1) and s(O)),


end archmux ..

a[3:0]

b[3:0]
X(3:0]
c[3:0J

d[3:0]

s(1) \
s(O)
Fig 3 1 Multiplexor cudruple de cuatro a uno

i
Los operadores lg cos son la clave fundamental para
booleanas
el uso de ecuaciones
Los op radares lgicos "and, or, nand, xor, xnor" se encuentran


predefinidos para lo tipos bit y boolean as como tambin para arreglos de una
dimensin de esos mismos tipos Cabe hacer notar que los dos operandos deben 1

ser de la misma lon itud en nmero de bits Los operadores lgicos no tienen un
orden de preceden ia por tanto es necesario el uso de parntesis para dar
precedencia a los o eradores

with-select-when

Esta sentencia per ite una asignacin selectiva de seales, esto significa que un
valores asignado a una seal con base en el valor de otra seal de seleccin El
constructor es el sig W iente

with seal de seletcin select


nombre_de_la_sJ al <= valor_a when valor_1_de_la_seal_de_seleccln,
valor_b when valor_2_de_la_seal_de_seleccin,
valor_c when valor_3_de_la_seal_de_se/eccin,

valor_x when valor_n_de_la_seal_de_seleccn,

A la seal "nombre_de_la_seal" se le asigna un valor con base en el valor actual


de la seal "sea qde_seleccin" Todos los valores de la "seal de seleccin"

33
deben ser listados y mutuamente excluyentes A continuacin se lista el cdigo
que representa el multiplexor de la Fig 3 1

library ieee,
use ieee std_logic_1164 al/,
entity mux is port (
a, b, e, d in std_logic_vector(3 downto 0),
s in std_logie_veetor(1 downto 0),
x out std_logie_veetor(3 downto 0),
end mux,

architecture archmux of mux s


begin
x <= a when "00",
b when "01",
e when "10",
d when others;
end archmux,

El valor lgico"--" puede ser utilizado para asignar valores"no importa" a la seal
"x" como sigue

architecture archmux of mux s


begin
x <= a when "00",
b when "01",
e when "10",
d when "11",
"--" when others;
end arehmux,

when-else

Esta sentencia esta disponible para realizar asignamiento condicional de seales,


lo cual significa que un valor es asignado a una seal con base en una condicin
El constructor es el siguiente

nombre_de_la_seal <= valor a when eondiein1 else


valor_b when condiein2 else
valor_c when condiein3 e/se ...

valor_x,

A la seal "nombre_de_la_seal" se le asigna un valor con base en la evaluacin


de las condiciones De esta manera se le asigna el valor con qase en la primera
condicin que se evala a "verdadero" El siguiente listado muestra la descripcin
del multiplexor de la Fig 3.1, utilizando este constructor

34
library ieee,
use ieee std_logie_1164 al/,
entity mux is port (
a, b, e, d in std_logie_veetor(3 downto 0),
s in std_logie_ veetor(1 downto O);
x
o t std_logie_veetor(3 downto 0),
end mux, -

architecture arehmux of mux is


begin
x <=a when (s ="OO'J e/se
b when (s :: "01 'J else
e when (s d "10'J e/se
d; l
end arehmux, 1

Operadores Relacionales

Los operadores relacionales son utilizados para probar igualdad, desigualdad y


ordenamiento Los dperadores de igualdad y desigualdad son "= " y "/=" los cuales

son definidos para odos los tipos discutidos en este manual Los operadores de
magnitud son "
I
<, <--, >, >=" los cuales son definidos para tipos escalares o tipos
'Y

arreglo con un rang discreto Los resultados de los operadores relacionales es un


valor de verdad "v J rdadero" o "falso" Como ejemplo esta el siguiente cdigo,
donde se observa que en el caso de comparar arreglos, estos deben ser de la
misma longitud
11
signa/ stream, instrm, oldstrm std_logic_veetor(3 downto O).
signa/ state states t
signa/ we std_logi ,
signa/ id std_logi _vector(15 downto 0),

stream <= "0000" when (state=idle and start='O') else


"0001" when (state=idle and start='1 J e/se
instrm when (state=ineoming) else
o/dstrm,

f
we <= '1' when (sta e=wrti e and id < x"1FFF'J else 'O';

Sobrecarga de operadores

La sobrecarga de operadores permite utilizar los mismos operadores con mltiples


tipos de datos, en especial para aquellos que no son predefinidos en el estndar
IEEE 1076 Los operadores pueden ser sobrecargados utilizando funciones

35
definidas por el usuario, pero muchos de los operadores sob n:r cargados son ya
definidos en los estndares 1 EEE 1164 y 1076 3
1

Instanciacin de Componentes.

La instanciacin de componentes son sentencias concurrentes que especifican la


interconexin de seales en el diseo Como se ilustra en el $iguiente cdigo que
implementa un comparador de cuatro bits Esto nos sirve para ilustrar que la
instanciacin de componentes puede ser utilizada para implementar lgica
combinacional

library ieee,
use work std_logic_1164 al/,
entity compare is port (
a, b in std_logic_vector(3 downto 0),
aeqb out std_logic);
end compare,

use work gatespkg.all,


architecture archcompare of compare is
signa/ e std_/ogic_vector(3 downto 0),
begin
xO xor2 port map(a(O), b(O), c(O)),
x1 xor2 port map(a(1), b(1), c(1));
x2 xor2 port map(a(2), b(2), c(2)),
x3 xor2 port map(a(3), b(3), c(3)),

n1 nor4 port map(c(O), c(1), c(2), c(3), aeqb),


end;

Los componentes de las compuertas no son definidos por VHr.>L en su estndar,


por tanto este diseo requiere que las compuertas xor2 y nor2 sean definidas en
otro paquete, ya sea creado por uno mismo o suministrado pon el vendedor de la
herramienta

3.3.2 Usando sentencias secuenciales.

Las sentencias secuenciales son todas aquellas contenidas en un proceso, una


funcin o un procedimiento Estos dos ltimos no son tratados en este manual La .
coleccin de sentencias que constituyen el proceso a su ves co h stituyen una sola
sentencia concurrente Si un diseo tiene mltiples proceso entonces estos
procesos son concurrentes entre si mismos Sin embargo dentro del proceso,
todas las sentencias son secuenciales y por tanto es important $ el orden en que
aparezcan En esta seccin vamos a describir como utilizar procesos y sentencias
secuenciales para describir lgica combinacional

36
if-then-else

Este constructor es utilizado para elegir un conjunto


dy sentencias a ser
ejecutadas con base en la prueba de una condicin que puede ser "verdadera" o
"falsa" La sintaxis del constructor es la siguiente

lf (condicin) then
hacer_algo,
else
hacer_ algo_diferente,
end if;

Si la condicin se evala a verdadero se ejecuta el primer b oque de sentencias \


"hacer_algo", de lo contrario se evala el segundo bloque Como ejemplo
mostramos el siguiente listado que representa un decodificadpr de direccin para
el mapa de memoria de la Fig 3 2

library ieee,
use ieee std_logic_1164 al/;
entity decode is port(
address in std_logic_vector(15 downto 3),
va/id, boot-up in std_logic;
sram, prom, eeprom, shadow,
periphl, periph2 out std-logic),
end decode,
architecture mem_decode of decode is
begin
mapper process (address, va/id, boot-up) begin
shadow <= '0',
prom <= 'O';
periph1 <= '0',
periph2 <= '0',
sram <= '0',
eeprom <= '0',
if va/id = '1' then
if address >= x"OOOO" and address < x"4000" the q
if boo(_up = '1' then
shadow <= '1 ;
'

else
prom <= '1',
end if;
elsif address >= x"4000" and address < x"4008" then
periph1 <= '1',
elsif address >= x"4008" and address < x"4010" thr n
periph2 <= '1',
elsif address >= x"BOOO" and address < X"COOO" ten
sram <= '/',

37
elsif address >= X"COOO" then
eeprom <= '1 ',
end if;
end if;
end process;
end mem-decode,

,----, FFFF

EEPROM

SRAM

---- e

Per1pneral2 r=======1 4010


---------- 4
Per1pheral1

PROM/
Shadow RAM

L_._____________ 0000

Fig 3 2 Mapa de memoria

Este diseo utiliza el constructor if-then-e/se y los operadores relacionales para


identificar reas de memoria y en consecuencia
habil tar las seales
correspondientes de acuerdo al mapa de memoria de la Fig 3 2

Cuando se utiliza este constructor para especificar lgica com inacional es muy
importante especificar completamente la sentencia if-then-els o especificar el
valor por default de la asignacin esto para evitar generar un la o de memoria z no
deseado Observemos los siguientes tres fragmentos de cdigo

Signa/ step std_logic,


Signa/ addr std_logic_vector(7 downto 0),

similar1 process (addr)


begin
step <='O';
if addr > x"OF" then
step <= '1',
end if;
end process;

38
similar2 process (addr)
begin
if addr > x"OF" then
step <= '1'
else
step <= '0',
end if;
end process;

no_similar process (addr)


begin
if addr > x"OF" then
step <= '1',
end if;
end process;

Cualquiera de los procesos similar1 y similar2 asume el valor de '1' si "addr" es


mayor de "OF" en hexadecimal y 'O' en el otro caso Sin embargo el proceso
no_similar no
describe la misma lgica debido a que no existe y n valor por default
Esto da como resultado una implicacin de ciclo de memoria n deseado como se
ilustra en la Fig 3 3

addr3

addr2
addr1 Step

addrO
;
Fig 3 3 Memoria implicada resultante del constructor if-tnen E

case-when

Esta sentencia es utilizada para especificar un conjunto de sentncias a ejecutarse


con base en el valor de una seal de seleccin La sintaxis es la siguiente

Case seal_de_seleccin is
when valor_1_de_la_seal_de_seleccin =>
(hacer algo) -- conjunto de sentencias 1
when valor_2_de_la_seal_de_seleccin =>
(hacer algo) -- conjunto de sentencias 2
when valor_3_de_la_seal_de_seleccin =>
(hacer algo) -- conjunto de sentencias 3

when valor_ltimo_de_la_seal_de_seleccin = >


(hacer algo) -- conjunto de sentencias n

39
El siguiente listado describe otro decodificador de direccin utilizando esta
1

sentencia

library ieee,
use ieee std_logic_1164 al/;
entity test_case is
port (address in std_logic_vector(2 downto 0),
decode out std_logic_vector(7 downto O);
end test_ case,

architecture design of test_case is


begin
process (address)
begin
case address is
when "001" => decode <= x"11 ",
when "111" => decode <= x"42",
when "010" => decode <= x"44",
when "101" => decode <= x"BB",
when others => decode <= x"OO",
end case;
end process;
end design,

j
Esta sentencia describe como el decodificador es manipulado c n base en el valor

de la direccin de entrada La palabra reservada "others" se util a para definir
completamente el comportamiento del decodificador para todos o s posibles
valores de entrada de la entrada "address"

3.4. Lgica sncrona


1
En esta seccin mostraremos como escribir cdigo VHDL para modelar lgica
sncrona, la cual esencialmente implica bloques de lgi c a combinacional
conectada a elementos de memoria como flip-flops controlad<j>s por seales de
reloj El siguiente cdigo describe un flip-flop tipo "D" ilustrado erlla Fig 3 4

library ieee,
use ieee std_logic_1164 al/,
entity dff_logic is port (
d, clk in std_logic;
q out std_logic),
end dff_logic,

architecture example of dff_logic is


begin
process (clk) begin

40
f (c lk'e ven t andelk = '1 ') then
q <= d,
end if;
end process;
end example,

d q

el k

Fig 3 4 Diagrama a bloques del Flip-flop D

Este proceso es sensitivo nicamente a cambios en la seal "clk", esto significa



que el proceso se ejecuta solamente cuando existe una transic i n en la seal "clk"
La condicin if c/k'event es verdadera solo cuando hay un cam io en la seal "clk",
?
en otras palabras esta condicin detecta tanto el flanco de :; ubida como el de
bajada en la seal "clk" Debido a que este cambio en la sea puede ser de 'O' a
'1' (flanco de subida) o de '1' a 'O' (flanco de bajada), podmos adicionar una
condicin adicional para referirnos solo a uno de los flanc s, por ejemplo la
condicin c/k='1' es utilizada para detectar solamente el flaco de subida Las
siguientes sentencias se utilizan para detectar una flanco de subida y despus uno
de bajada respectivamente

lf (clk'event and clk='1 ') then --flanco de subida


lf (clk'event and clk='O') then --flanco de bajada
Tambin podemos describir un latch sensitivo por nivel en lugar del flip-flop
disparado por flanco Lo que se tiene que hacer es detectar 1 evento de clk e
insertar la seal de entrada "d" en la lista sensitiva, como se ilu tra en el siguiente

cdigo que representa el latch de la Fig 3 5

process (clk,d) begin


if (c/k='1 ') then
q <= d,
end if;
end process

d q

elk

Fig 3 5 Diagrama a bloques dellatch

En este caso cuando clk est en nivel alto entonces se asigna 1 entrada "q" a la
salida "d", describiendo un latch

41
d
En el caso de la descripcin del flip-flop o del latch, la especific cin incompleta de

la sentencia "if' al no incluir la parte "else", implica un element de memoria en el
cual si la condicin no se cumple se mantiene el valor de "q" lo cual es consistente
con el funcionamiento deseado Este es el motivo por el cual los siguientes dos
fragmentos de cdigo son equivalentes

f (clk'event andelk= '1 ') then


q <= d,
end if;

es equivalente a

f (c/k'event andelk= '1 ') then


q <= d,
else
q <= q,
end if;

t
En el siguiente listado mostramos el cdigo que implementa un lip-flop tipo "T"
(toggle) y en la Fig 3 6 el diagrama a bloques de una posible implementacin
Note como es mucho ms sencillo describirlo utilizando VHDL

library ieee,
use ieee.std_logic_1164.all;
entity tff_logic is port (
t, clk in std_logic,
q buffer std_logic,
end dff_logic,

architecture t_example of dff_logic is


begin
process (clk) begin
if (clk'event andelk = '1 ') then
if (t = '1 ') then
q <= not(q),
else
q <= q,
end if;
end if;
end process;
end t_example,

42
q

el k

Fig 3 6 Diagrama a bloques de un flip-flop T

Aqu es muy importante notar que todos los asignamientos de seales dentro del
proceso ocurren despus del evento en el flanco de subida del la seal clk por tal ll
j
motivo todo est sincronizado con respecto a la seal clk La Fig 3 6 muestra que
lgica secuencial es descrita por este cdigo El siguiente 9digo describe un
registro de 8 bits

1
library ieee,
use ieee std_logic_1164 al/;
entity reg_logic is port (
d in std_logic_ vector(O to 7),
clk in std_logic,
q out std_logic_vector(O to 7)
),
end reg_logic,

architecture r_example of reg_logic is


begin
process (clk) begin
if (clk'event and e lk = '1 j then
q <= d,
end if;
end process;
end r_example,

Sentencia wait until

El comportamiento de un flip-flop o de un registro tambin es asible describirlo

utilizando la sentencia wait un ti/ en lugar de la sentencia if (clk'eyent and clk = '1 )
'

como se ilustra en el siguiente cdigo

architecture example2 of dff_logic is


begin
process begin
wait until (clk = '1 j,

43
q <= d,
end process;
end example2,

Este proceso no utiliza una lista sensitiva, sin embargo el proceso inicia con la

sentencia wait until Por esta razn un proceso que utiliza est sentencia no debe
tener lista sensitiva La interpretacin es que el proceso est suspendido hasta
que la condicin establecida por la sentencia wait until s hace "verdadera"
Cuando esto ocurre entonces las sentencias que aparecen d spus del wait until
l
son ejecutadas, al terminar las sentencias se vuelve a esper r hasta que ocurra
otro flanco de subida en la seal clk De esta manera existe un 1 sincrona

Funciones rising_edge y falling_edge.

El paquete std_logic_1164 define dos funciones

pueden utilizar para sustituir las expresiones if (clk'event



llamadas rising_edge
falling_edge que son tiles para detectar flancos de subida y e bajada, estas se
nd clk = '1 ) y if '
y

(clk'event and c/k = '1 ') respectivamente A continuacin list mas el cdigo que
describe un flip-flop D utilizando la funcin rising_edge

library ieee,
use ieee std_logic_1164 al/;
entity dff_logic is port (
d, c/k in std_logic,
q out std_logic
end dff_logic,

architecture example of dff_logic is


begin
process (clk) begln
if rising_edge(clk) then
q <= d,
end if;
end process;
end example,

3.4.1 Empleo de seales de reset en lgica sncrona.

En el mundo del hardware no siempre los circuitos se inicializan en un valor


determinado Entonces si uno desea tener seales de reset q preset globales es
necesario incluirlas explcitamente en el cdigo para poder manipularlas A
continuacin mostramos el cdigo que define un flip-flbp D con reset asncrono y
que corresponde al diagrama a bloques de la Fig 3 7 Este reset es asncrono
porque el proceso se activa por un cambio en cualquiera d las seales clk o
r
reset Si el reset es activado entonces independientemente df la seal c/k el flip
flop es puesto a cero

44
archtecture rexample of dff_logic is
begin
process (clk, reset) begin
if reset = '1' then
q <= '0',
elsif rising_edge(clk) then
q <= d,
end if;
end process;
end rexample,

d ---; o a t---- q

el k

reset 1
Fig 3 7 Diagrama a bloques de un flip-flop O con reset as(ncrono

Si lo que deseamos es tener un reset sncrono entonces debemos quitar esta


seal de la lista sensitiva y colocarla solo dentro del proceso despus de la
deteccin del flanco de la seal clk para que el reset quede sincronizado con
respecto a esta seal, tal como se ilustra en el siguiente cdigo Su diagrama a
bloques se muestra en la Fig 3 8

archtecture sync_rexample of dff_logic is


begin
process (clk) begin
if rising_edge(clk) then
if reset = '1' then
q <= '0',
else
q <= d,
end if;
end if;
end process;
end sync_rexample,

,: : a q
==1
Fig 3 8 Diagrama a bloques de un flip-flop O con reset snorono

45
3.4.2 Operadores aritmticos.

l
Los operadores aritmticos ms comnmente utilizados para s ntesis son la suma
y la resta, los cuales son muy tiles para describir sumadores, restadores,
incrementadores, decrementadores, contadores etc Todop los operadores
aritmticos son predefinidos para los tipos entero y flotante A continuacin
mostramos el cdigo de un sumador de dos palabras de cuatro bits cada una

entity myadd is port (


a, b in nteger range O to 3,
sum out integer range O to 3),
end myadd,

architecture archmyadd of myadd is


begin
sum <= a + b,
end archmyadd,

Aqu el resultado de la suma es asignado a un objeto del mis o tipo entero Esto
significa que para poder utilizar estos operadores los tipos de los datos deben ser
enteros y no del tipo bit o bit_vector Si deseramos sumar dqs datos de tipo por
ejemplo std_logc_vector, sera necesario sobrecargar los operadores aritmticos
ya sea mediante funciones hechas por el usuario o dadas por la herramienta para
poder sintetizar esas operaciones En caso de no disponer de los operadores
sobrecargados se deber usar el tipo entero El estndar lit:EE 1 076 3 define
funciones para sobrecargar el operador "+" para pares de operandos de las
siguientes caractersticas (unsigned, unsigned), (unsigned, integer), (signed,
signed), (signed, integer)
Un ejemplo de como usarlos se ilu tra en el siguiente
cdigo, note que la definicin de los operadores sobrecargados estn contenidas
k
en el paquete numeric_std, el cual se hace visible con use wor numeric_std al/

library ieee,
use ieee std_logic_1164 al/,
use work numeric_stcf al/,
entity add_vec is port (
a, b in unsigned(3 downto O);
suml, sum2 out unsigned(3 downto 0),
end add_vec,
architecture adder of add_vec is
begin
suml <=a+ b,
sum2 <=e+ 1,
end;

El par de cdigos anteriores para la suma de dos nmeros no toma en cuenta la


posibilidad de existencia del acarreo resultado de la suma Es decir si los nmeros

46
a sumar son de 4 bits cada uno el resultado puede llegar a requerir cinco bits
Para considerar este bits de acarreo podemos escribir el siguie1te cdigo

library ieee,
use ieee std_logic_1164 al/;
use work numeric_std al/,
entity add_vec is po1t (
a, b in unsigned(3 downto 0),
sum out unsigned(4 downto 0),
end add_vec,

architecture adder of add_vec is


begin
sum <= ('O' & a) + b,
end;

En este caso uno de los operadores a sumar es ('O' & a) El operador "&" es el
operador de concatenacin, de manera que aqu el res ultad0 es un vector no
signado de un bit de longitud mayor que"a" al concatenarlo con \ o

3.4.3 Resets y presets asncronos.


'
1
t
El siguiente listado describe un contador de ocho bits con urila seal ascrona e

(grst), la cual coloca el valor del contador a "0011101 O" Tambin el contador tiene )

dos seales sncronas de"load" y "enable" El operador"+" es sobrecargado y se


utilizan tipos no signados
1
library ieee,
use ieee std_logic_1164 al/,
use work numeric_std.a/1,
entity cntB is port (
txclk, grst in std_logic,
enable, load in std_logic,
data in unsigned(7 downto O);
cnt buffer unsigned(7 downto 0),
end cntB,

architecture archcntB of cntB is


begin
count process (grst, txclk)
begin
if grst= '1' then
cnt <= "00111 010",
elsif (txclk 'event and txclk='1') then
if load= '1' then
cnt <= data,

47
elsif enable = '1' then
cnt <= cnt + 1,
end if;
end if;
end process count;
end archcntB,

El proceso es sensitivo a cambios en las seales grst y txc/k 1 Si la seal grst es


habilitada, entonces en forma asncrona el valor del contador es puesto a
"00111 01 O" En forma sincronizada con el flanco de subida e n la seal txclk el
contador se carga con los datos de entrada si la seal load (eSt habilitada y se
incrementa si la seal enable esta habilitada

En el siguiente cdigo mostramos como utilizar un par de seales asncronas de


reset y preset (grst y gpst) El secreto es hacer sensible al proceso para todas las
seales que se desea sean asncronas, adems de la eal de reloj que
sincroniza el resto del funcionamiento del contador como la cara y el incremento

library ieee,
use ieee std_logic_1164.all,
use work numeric_std al/,
entity cntB is port (
txclk, grst, gpst in std_/ogic,
enable, load in std_logic,
data in unsigned(l downto 0),
cnt bu ffe r unsigned(l downto O);
end cntB,

architecture archcntB of cntB s


beg in
count process (grst, gpst, txclk)
beg in
if grst = '1' then
cnt <= (others => '0'),
elsif gpst = '1' then
cnt <= (o thers => '1 ');
elsif (txclk'event and txclk='1 ') then
if load = '1' then
cnt <=data,
elsif enable = '1' then
cnt <= cnt + 1,
end if;
end if;
end process count;
end archcntB,

48
La sentencia (others => ' O ' ) representa una agregacin de elmentos separados
por comas, por tanto
1

signa/ a std_logic_vector(? downto O);


a <= ('1'' 'O'' others => '1 '1 ,

entrega el resultado para "a" de "1 0111111"

3.4.4 Buffers tres est a dos y seales bidireccionales.

La mayora de los dispositivos de lgica programable tienen salias tres estados o


bidireccionales Los buffers de salida son puestos en alta impedancia cuando no
manejan el bus en un tiempo determinado Los puertos bidir ccionales permite
compartir un conjunto de puertos para funcionar tanto comp entradas como
salidas Cabe hacer notar que no todos los dispositivos programables permiten la
utilizacin de buses internos tres estados, lo cual significa que e r ellos no pueden
ser implementados como buses internos, sino solo como bues externos Los
diseos aqu presentados que utilizan estas caractersticas estn descritos
utilizando el estilo de descripcin por comportamiento

Tres estados.

Los valores que una seal tres estados puede tener son '0', '1' y 'Z', todos ellos
son soportados por el tipo std_logic A continuacin mostramo $ un contador de
ocho bits que tiene salidas tres estados

library ieee,
use ieee std_logic_1164 al/,
use work std_arith al/,
entity cntB is port (
txclk, grst in std_logic,
enable, load in std_logic,
oe in std logic,
__ --habilitador de /os datos de salida
data in std__logic_vector(7 downto 0),
cnt_out buffer std_logic_vector(7 downto O)); --salida d f conteo
end cntB,

architecture archcntB of cntB is


signa/ cnt std_logic_vector(? downto 0), -- seal para el cont$o
begin
count process (grst, txclk)
begin
if grst = '1' then
cnt <= "00111010",
elsif rising_edge(txclk) then

49
if load = '1' then
cnt <=data,
elsif enable = '1' then
cnt <=cnt + 1,
end if;
end f;
end process count;

oes process (oe, cnt) --buffers tres estados


begin
if oe = 'O' then
cnt_out <= (others => 'Z);
else
cnt_out <=cnt,
end if;
end process oes,
end archcntB,

El proceso llamado "oes" es utilizado para describir las salidas tres estados del
contador Este proceso indica que si la seal "oe" es habilitada, entonces el valor
de "cnt" que es de uso local a la arquitectura es asignado a "cnt_out" que es la
salida del diseo, pero si "oe" no es habilitado entonces a la salida "cnt_out" se le
asigna un valor de alta impedancia

Bidireccional

Las seales bidireccionales son descritas con mucha facilidac;l, como se describe
en el siguiente cdigo El valor del contador es cargado con 1 valor actual en los
pines asociados con las salidas del contador (funcionan comG:> entradas), o estas
salidas muestran el valor de la cuenta actual (funcionan como salidas) este
funcionamiento bidireccional depende del estado del habilitador de salida "oe"

library ieee,
use ieee std_logc_1164 al/,
use work std_arith al/;
entity cntB is port (
txclk, grst in std_logic,
enable, load in std_logic;
oe in std_logic,
cnt out inout std_logic_vector(7 downto 0)), - - 1/0 bidireccional
end cntB,

architecture archcntB of cntB is


signa/ cnt std_logic_ vector(? downto 0),
begin
count process (grst, txclk)
begin

50

l
if grst = '1' then
cnt <= "00111010",
elsif (txc/k'event and txclk='1 ') then
if load = '1' then
cnt <= cnt_out, -- cnt_out port funciona como entrada
e/sif enab/e = '1' then
cnt <= cnt + 1,
end if;
end if;
end process count,

oes process (oe, cnt) begin


if oe = 'O' then
cnt_out <= (others => 'Z');
else
cnt_out <= cnt; -- cnt_out funciona como salida
end if;
end process oes,
end archcntB,

Los detalles importantes es que en este cdigo la seal cnt_out es de tipo inout
debido a que va a mostrar y recibir datos

3.5. Diseando una FIFO

Hasta este punto hemos discutido como crear lgica combinacioal y sncrona, de
manera que estamos listos para disear la FIFO introducida en la seccin 3 2, y
explicar algunos otros conceptos como el de creacin de ciclos utilizando
iteraciones Recordando deseamos crear una estructura de datqs FIFO de ocho
palabras cada una de nueve bits Cuando la seal de lectura "rcf este habilitada
deseamos mostrar la salida "data out" de la FIFO Cuando la seal de lectura "rd"
no este habilitada deseamos que la salida de la FIFO "data_out" se encuentre en
estado de alta impedancia Cuando habilitemos la seal de escritura "wr"
deseamos escribir alguno de los ocho registros de nueve bits La seales "rdinc"
y "wrinc" son utilizadas para incrementar los apuntadores de lectu ra y escritura los
cuales apuntan al registro de la FIFO que ser ledo o escrito "rdptrclr" y "wrptclr"
hacen reset a los apuntadores de lectura y escritura respectivamente "data_in" es
el dato a ser almacenado en la FIFO La Fig 3 9 es un diagram a bloques que
representa el hardware descrito en el listado de la FIFO de la seccin 3 2

El primer nuevo concepto introducido en el listado de la FIFO es la declaracin del


tipo fifo_array, que es un constructor que utilizamos para crear un arreglo de ocho
vectores std_logic_ vectors, de nueve bits cada uno A partir de este tipo creamos
una seal llamada "fifo" que es declarada de ese tipo y constituye los ocho
elementos de nueve bits cada uno Esto nos permite acceder los elementos de la
FIFO utilizando ndices fifo(6), fifo(5) etc

51
ro -----+-.
------- 9-bltregisters

rdpt2:0]

dk-4------
Fig 3 9 Diagrama a bloques de fa FIFO

3.5.1 Loops

Las sentencias de loops (ciclos) son utilizadas para implementar operaciones


repetitivas y consisten de ciclos "for" y "while" El ciclo for es ej ecutado un nmero
especfico de iteraciones con base en un valor de control Sin embargo el ciclo
"while" se ejecuta continuamente hasta que una condicin lgica lo termina al
hacerse verdadera El ciclo "for" es sintetizable por casi tods las herramientas
mientras que el ciclo "while" no lo es

En el diseo de la FIFO utilizamos el siguiente ciclo "for" para dar reset asncrono
a todo el arreglo FIFO

for i in 7 downto O loop


fifo(i) <= (others => '0'),
end loop;

En los ciclos "for" la variable de conteo es automticamente declarada Un ciclo



while puede ser utilizado, sin embargo se requiere decla rar e inicializar las
variables del ciclo dentro del proceso, como se ilustra en el siguiente fragmento de
cdigo

52
reg_array process (rst, clk)
variable i . integer. = O,
begin
if rst = '1' then
while i l o op < 8
fifo(i) <= (others => 'O');
i = i+1,
end loop;

Iteraciones condicionales

La sentencia next es utilizada para saltar alguna opera Cin con base en
condiciones especficas d
Por ejemplo supongamos que cuan o la seal de reset
"rst" es habilitada todos los registros de la FlFO con borrados excepto el registro
cuatro, entonces requerimos el siguiente fragmento de cdigo

reg_array process (rst, clk)


begin
if rst = '1' then
for i in 7 downto O loop
if i = 4 then
n ext;

else
fifo(i) <= (otfters => '0],
end loop;

Salida forzada de una iteracin

La sentencia exit es utilizada para salir de un ciclo, y puede ser utilizada para
verificar alguna condicin ilegal
Por ejemplo supongamos que la FIFO diseada va a ser instan iada en algn otro
l
Esto debe verificarse en tiem o de compilacin

diseo jerrquico y es necesario especificar su tamao mediant algn parmetro,


pero deseamos que no supere un tamao mximo y cuando eo pase termine el
ciclo y genere un error El siguiente cdigo muestra este caso

reg_array process (rst, clk)


begin
if rst = '1' then

loop1 for i in deep downto O loop


if i > 20 then
exit loop1;
else
fifo(i) <= (others => 'O');
end loop;

53
La etiqueta "loop1" es agregada solo por claridad En estos casos el ciclo fue
utilizado para una tarea muy sencilla, sin embargo pueden ser utilizados para
tareas ms complicadas Por ej emplo el segundo ciclo en la FIFO verifica cual es
g
el registro que va a ser escrito, como se observa en el cdigo si uiente

if wr = '1' then
for i in 7 downto O loop
if en(i) = '1' then
fifo(i) <= data_in,
else
fifo(i) <= fifo(i),
end if;
end loop;
end if;

En nuestra FIFO no hay nada nuevo que no hemos visto b


L s apuntadores de
lectura y escritura son simples contadores de tres bits que indiqan cual registro de
la FIFO ser escrito o ledo

54
4. DISEO DE MQUINAS DE ESTADOS


En las secciones pasadas hemos analizado los constructores b sicos del lenguaje

VHDL El objetivo en esta seccin es aplicarlos al diseo de m uinas de estados
t
Es importante tratar este tema porque las mquinas de es ado se utilizan e

implementan muy comnmente en dispositivos lgicos progra ables porque una
mquina de estados es una forma de representar un algoritr11o o secuencia de
pasos que se desea implantar en hardware Las mquinas de estados por tanto
son muy tiles en el diseo de sistemas digitales dado que nqs permite disear
algoritmos de control para alguna arquitectura Por ejemplo nos ueden servir para
disear un controlador de memoria RAM

r
Nos enfocamos a implementar maquinas de estado utiliza do el estilo de
descripcin por comportamiento, debido a que hacerlo de esa manera es tan
sencillo como traducir el diagrama de estados o carta ASM corre$pondiente

Como es conocido las maquinas de estado pueden ser de dos tipos el primero de
ellos es el tipo MOORE donde las salidas son funcin nicarlnente del estado
presente y el segundo tipo son las mquinas tipo MEALY donde las salidas son
funcin tanto del estado presente como de las entradas Aqu trataremos
detalladamente las maquinas Moore y despus indicarembs las mnimas
modificaciones que son necesarias para implementar una mquina Mealy

4.1 Ejemplo de diseo

Vamos a disear un controlador que es usado para habilitar y deshabilitar el


habilitador de escritura "we" y el habilitador de salida "oe" de un b'uffer de memoria
durante peticiones de lectura/escritura Las seales "ready" y "read_write" son
salidas de un microprocesador y entradas a nuestro controlador "we" y "oe" son
salidas del controlador Una nuva petic.in coiza con la bilitacin de la
_ - .
seal "ready" Un c1clo de reloJ despues de 1n1c1ada la petiG IOn el valor de
"read_write" si la peticin es de lectura o escritura Si "read_write" es habilitada
entonces se trata de un ciclo de lectura, de otro modo se trat de un ciclo de
escritura Un ciclo es completado habilitando la seal de "readY" despus de la
cual una nueva peticin puede ser aceptada

En la Fig 4 1 mostramos el diagrama de estados que se obtiene a partir de la


descripcin del problema Este diagrama de estados no representa ms que una.
mquina de estados del tipo Moore, porque como podemos obs*var en la tabla
adjunta las salidas "oe" y "we" son funcin nicamente del estado Rresente

55
ready
Outputs

State oe we

id le o o

decision o o

write o

read o

ready

Fig 4 1 Diagrama de estados para el controlador de m moria,


4.2 Maquina de estados Moore en VHDL

El diagrama de estados mostrado en la Fig 4 1 puede ser f cilmente traducido a


descripcin de alto nivel usando VHDL sin tener que hacer as i gnacin de estados,

siguiente con base en el tipo de flip-flop disponible Utilizand


j
generacin de la tabla de transicin o determinacin de las e uaciones del estado
VHDL cada estado
puede ser traducido a un caso especfico utilizando el constr ctor case-when Las
transiciones del diagrama de estados pueden ser esp1cificadas utilizando
sentencias if-then-else Existen fundamentalmente dos alternativas para describir
una mquina de estados, en funcin del numero de process utilizados As es
posible describir la misma maquina de estados utilizando dos procesos o
utilizando un solo proceso como se ver a continuacin

Mquina de estados utilizando dos procesos

En este mtodo uno de los procesos indica que la siguiente signacin de estado
se har con base en el presente estado y en las entradas presentes, pero no
indica cuando el siguiente estado llega a ser el presente est do Esto sucede en
forma sncrona con la seal de reloj de la forma en que se describe en un segundo
proceso Debido a estos dos procesos es que recibe el normbre de mquina de
estados utilizando dos procesos El cdigo que describe esta mquina de estados
es el siguiente

56

--
lib rary ieee,
use ieee std_logic_1
164 al/;

entity fsm2p is port(


read_write, ready, clk
in bit;
oe, we
out bit),
endfsm2p,

architecture state_ma
chine of fsm2p is
type statetype is (id/e, de
cision, read, write),
signa/ present_state, ne
xt_state statetype,
begin
process(present_stat
e, read_write, ready)
begin
case present_state is
when id/e=>
oe <= 101, we <=101,
if ready= 111 then
next_state <= decision
,
else
next_state <= id/e,
end if,
when decision=>
oe <= 101, we <= 101,
if read write= 11 1 then
next_state <=read,
else
next_state <= write;
end if,
when read=>
oe <= 11: we <=101,
if ready= 111 then
next_state <=id/e,
else
next_state <= read,
end if,"
when write=>
oe <= 101, we <::: 11:
if ready = 111 then
next_state <=id/e,
else
next_state <= write,
end if,
end case;
end process,
process(clk) begin
if {clklevent and clk=11'} the
n

57
present_state <= next_state,
end if,
end process,
end architecture state_machine,

Al inicio de la arquitectura definimos un tipo llamado "statetype" que es un


enumerado de cuatro valores "idle, decision, read, write" los uales son nombres
q
que nos representan cada uno de los cuatro estados disponibl s en la maquina de
estados del la Fig 4 1 Despus definimos dos seales de uso local a la
arquitectura llamadas "present_state y next_state" que son del tipo que acabamos
de crear y que nos van a servir para representar el estado actual y el estado
siguiente

El primer proceso es sensible al estado presente (present_stte) as como a las


seales de lectura escritura (read_write) y listo (ready) Este proceso lo que hace
es probar utilizando la sentencia case el valor del "present_sate", el numero de
casos corresponde con el nmero de estados, por tanto el contructor case tendr
tantas opciones como numero de estados tenga la mquina de estados

En cada caso contemplado por el case dos son las acciones a realizar La primera
consiste en establecer el valor de las salidas "oe" y "we" para epe estado, debido a
que se trata de una mquina de tipo Moore, estos valore$ son directamente
tomados del diagrama de estados de la Fig 4 1 La segund? accin para cada
caso consiste en definir las transiciones del estado actu$1 hacia el estado
siguiente, en otras palabras calculamos cual es el siguiente e$tado en funcin de
las entradas que sean importantes en el estado actual (readyl o read_write), esta
prueba se hace utilizando el constructor if-else y anidndolos er caso de tener que
probar varias entradas De manera que el resultado de esta prueba es asignar a
"next_state" el estado siguiente que puede ser alguno de los cuatro estados
posibles definidos por "statetype" segn corresponda

El segundo proceso es sensible a la seal de reloj "clk" y sincronizado con


respecto al flanco de subida de la misma seal de reloj El objtivo de este estado
es actualizar el valor de la seal del estado presente "present state" con el valor
de la seal del estado siguiente "next_state", que fue calc tli ado en el primer
proceso

Esto significa que la transicin del estado presente al estado siguiente est

sincronizada con respecto a la seal de reloj del sistema y aun ue se calcula en el_
proceso uno, no se asigna sino sincronizadamente con la seal de reloj en el
proceso dos Las salidas como son funcin del estado presente son actualizadas
continuamente en el proceso uno en funcin del estado presente solamente
debido a que se trata de una maquina Moore

El funcionamiento de la mquina de estados puede verificarse rpidamente


utilizando cualquier simulador que acepte entrada VHDL El cdigo mostrado para
esta maquina fue simulado utilizando el simulador de la herramienta Max+Pius 11

58

l
de Altera El resultado de la simulacin se muestra en la Fig 4 2 Donde podemos
observar los valores de los estados presente y siguiente desfasados un ciclo de
reloj, as como el valor de las salidas de acuerdo al estado pres nte La transicin
al estado siguiente es funcin del estado actual as como de las entradas El
funcionamiento est sincronizado con respecto al flanco de subida de la seal de
reloj

Time. 1672 Ons 1 lnterval: l672.0ns 1


O Ons

Value:

.:
,,,
iW- read)

DO

DO

Fig 4 2 Simulacin para el cdigo VHDL de la mquina de estados d la Fig 4 1


-
G . 0125/6
4.2.1 Controlador de memoria utilizando Maquina Moore de dos procesos.

El siguiente ejemplo de diseo es tambin un controlador de memoria, pero es


ms prctico y tiene mayor funcionalidad que el de la seccin ant rior La Fig 4 3 ,
muestra el diagrama a bloques de un sistema que utiliza una mquina de estados
para el controlador de memoria

El controlador trabaja de la siguiente manera


Cualquier dispo itivo en el bus
inicializa un acceso al buffer de memoria habilitando su identificacin de bus, en
este caso F3 en hexadecimal Un ciclo despus la seal "read_write" es habilitada
para indicar una lectura desde el buffer de memoria, la seal es de6 habilitada para
indicar un ciclo de escritura al buffer de memoria Si el acceso a la memoria es de
lectura, la lectura puede ser lectura de una simple palabra o una ectura burst de l
cuatro palabras Este tipo de lectura burst se indica habilitando a seal "burst" l
durante el primer ciclo de lectura, despus del cual el controlado accede cuatro
localidades del buffer Localidades consecutivas son acced i das siguiendo
sucesivas habilitaciones de la seal "ready" El controlador habilita ''oe" (habilitador
de salida) hacia la memoria durante el ciclo de lectura, e incremelflta los dos bits
menos significativos de la direccin en el modo burst Una escrit ra al buffer es
siempre una escritura de una sola palabra, nunca en modo burst durante un ciclo
de escritura la seal "we" es habilitada, permitiendo a la seal "data" ser escrita en
la localidad de memoria especificada por la seal "address"

59
fACVlTAD Df !N6fNlml
ni

Address Data

1
,, ,,
BUS_ID -
.,
... 1-
RESET OE -
.. ... 1

1
READ_WRITE WE
SRAM
READY State ADDR1 memory :
machina ... array
BURST ADDRO
..
..

CLK
1
1 1

1 1
1
Fig 4 3 Diagrama a bloques del controlador de memria

La Fig 4 4 ilustra el diagrama de estados de este contr lador b El diagrama


muestra como una seal de "reset" sncrona pone el contrblador en el estado
"idle" Cuando el buffer de memoria no va a ser accedid , el controlador se
mantiene en el estado "idlell Si el identificador de bus "bus_ioll es habilitado a F3
mientras el controlador est en el estado "idlell entonces la rjnaquina de estados
hace transicin al estado "decisionll En el siguiente ciclo de 1 reloj, el controlador
har transicin a cualquiera de dos estados "read1 o writell dependiendo del valor
de la seal "read_writell Si el acceso es para lectura, entonces el controlador salta
a la seccin de lectura de la mquina de estados Una simple palabra para lectura
es indicada habilitando "readyll sin la habilitacin de "burstll mientras se est en el
estado "read 111 En este caso el controlador regresa al estad p "idlell Una lectura
"burst" es indicada habilitando tanto la seal "readyll como "bu stll mientras se est
en el estado "read111 En este caso la mquina transita a travs. de cada uno de los
estados de lectura cada que se habilita "readyll La seal "oe" es habilitada durante
cada uno de los ciclos de reloj de lectura La seal "addrll es incrementada en
ciclos sucesivos de lectura siguiendo al primero

Si el acceso es para escritura, solamente se puede escribir una sola palabra Por
lo tanto despus de determinar que el acceso es para escritwra (read_write = O)
estando en el estado "decision11, el controlador salta a la s ccin de escritura e
Simplemente habilita la seal de "well del buffer de memori , esperando por la
seal de "readyll del bus y retornando al estado "idle

60

-
Reset (synchronous)

Ready burst

read_write

Ready

State oe we addr{1 :O)

id la o o 00

dacision o o 00

read1 Raady
1 o 00

read2 o 01

read3 o 10

read4 o 11

write o 1 00

Fig 4 4 Mquina de estados del controlador de memoria

61
La forma de traducir a lenguaje VHDL la mquina de estad s de la Fig 4 4, se
f.
hace de la misma manera que con la maquina de estados de la Fig 4 1 El cdigo
completo se utilizando dos procesos y un reset sncrond se muestra en el
siguiente cdigo

library ieee,
use ieee std_logic_1164.all,

entity fsm2psr is port(


reset, read_write, ready, clk, burst in std_logic,
bus id in std_logic_vector(l downto 0),
oe, we out std_logic,
addr out std_logic_vector(1 downto 0)),
end fsm2psr,

architecture state_machine of fsm2psr is


type statetype is (id/e, decision, read1, read2, read3, read4, write),
signa/ present_state, next_state statetype,
begin
process(reset, bus_id, present_state, burst, read_write, rea y) begin
q
if (reset= '1) then
oe <= '-,' we <= '-', addr <= " --", --no importa
next_state <=id/e,
\
else
case present_state is
when id/e=>
oe <= 'O'; we <='O'; addr <= "00",
if bus_id= "11110011" then --identificador F3
next_state <= decision,
else
next_state <=id/e,
end if,
when decision =>
oe <= 'O'; we <= 'O'; addr <= "00",
if read write= 1
' ' then
next_state <=read1,
else
next_state <= write,
end if,
when read1=>
oe <= '1 ', we <= 0
' ', addr <= "00 ",
if ready = 'O' then
next_state <=read1,
else if burst= 'O' then
next_state <=id/e,
else

62

--
next_state <= read2;
end if;
end if,
when read2 =>
oe <= '1 ', we <= '0', addr <= "01 ",
if ready = '1' then
next_state <= read3,
else
next_state <= read2,
end if,
when read3 =>
oe <= '1', we <= '0', addr < = "10",
if ready = '1' then
next_state <= read4,
else
next_state <= read3;
end if,
when read4 =>
oe <= '1', we <= '0', addr <= "11 ",
if ready = '1' then
next_state <=id/e,
else
next_state <= read4,
end if,
when write =>
oe <= 'O '; we '1'; addr
<= <= "00",
if ready = '1' then
next_state <=id/e,
else
next_state <= write,
end if,
end case,
end if,'
end process,

process(c/k) begin
if (c/k'event and clk='1 ') then
present_state <= next_state,
end if,
end process,
end architecture state_machine;

El cdigo del listado anterior es una descripcin de mquina de e $ tados de dos



procesos Uno de los procesos describe la lgica combinacional d l valor de las
salidas y las transiciones utilizando constructores case-when, if-t(Jeh-else y el
segundo proceso describe la sincronizacin de las transiciones de l s estados en

63
relacin a la seal de reloj "clk" Esta forma de implementcin se muestra en
diagrama a bloques en la Fig 4 5 y se puede utilizar para qualquier mquina de
estados tipo Moore

Lgica Combinacional Fllp-flos

1
entra das

Siguiente estado
Case. When CLK'EVENT
...
lf Then and 11""

El se CLK='1'

Estado Actual
1
Fig 4 5 Esquema general de la mquina de estados oore
Si deseamos un reset asncrono en lugar del reset sncrono u ilizado en la seccin t
anterior, solamente requerimos hacer sensible el proceso que sincroniza las
transiciones no solamente a la seal de reloj "clk" sino tambin a la seal de reset,
como se ilustra en et siguiente fragmento de cdigo

process(clk, reset) begin


if (reset = '1 ') then
present_state <=id/e,
e/se if(c/k'event and clk='1 ') then
present_state <= next_state;
end if,
end if,
end process,

4.2.2 Controlador de memoria utilizando Maquina Moore d e un proceso .

El mismo controlador de memoria puede ser implementado en VHDL utilizando un


solo proceso que se utiliza para describir las transiciones entre los estados y la -
sincrona de las mismas con relacin a la seal de reloj "clk" Sin embargo las
salidas de la maquina de estados son decodificada utilizando lgica
combinacional en funcin de los estados donde se deben verificar Por supuesto
esta decodificacin se hace fuera del proceso Este es el motivo por el cual se
llama mquina de un proceso El funcionamiento es equivalente al de una
mquina de dos proceso, solo que descrita de diferente manera A continuacin

64

----
se muestra el cdigo completo de la mquina de un proceso para el controlador de
memoria

library ieee,
use ieee std_logic_1164 al/;

entity fsm1par is port(


reset, read_write, ready, clk, burst in std_logic,
bus id in std_logic_vector(? dowmto 0),
oe, we out std_logic,
addr out std_logic_vector(1 downto 0)),
end fsm1par,

architecture state_machine offsm1par is


type statetype is (id/e, decision, read1, read2, read3, read4, write),
signa! state statetype,
begin
process(reset, clk) begin --reset asncrono
if (reset= '1? then
state <= id/e,
e/se if (clk'event and clk='1? then
case state is
when id/e=>
ifbus id= "11110011" then
state <= decision;
else
state <= id/e,
end if;
when decision=>
if read_write= '1' then
state <= read1,
else
state <= write,
end if;
when read1=>
if ready= 'O' then
state <= read1,
else if burst= 'O' then
state <= id/e,
else
state <= read2,
end if,
end if,"
when read2=>
if ready= '1' then
state <= read3,
end if, state <= read2 esta implcito
--

65
when read3 =>
if ready = ' 1 ' then
state <= read4,
else
state <= read3; -- no se requiere else, puede ser implcito
end if,
when read4 =>
if ready ' 1 ' then
=

state <= id/e,


else
state <= read4,
end if,"
when write =>
if ready = '1' then
state <= id/e,
else
state <= write,
end if,"
end case,
end if,
end if,
end process,

-- Salidas decodificadas combnacionalmente

with state se/ect


oe <= ' 1 ' when read 1 1 read2 1 read3 1 read4,
'O' when others;
we <= ' t ' when state = write else '0',

with state se/ect


addr <= 0 1 " when read2,
"

" 1 O" when read3,


" 1 1 " when read4,
"00" when others,

end architecture state machine,

Observamos claramente como las salidas "oe", "we" y "a dr" se decodifican_ 6



combinacionalmente fuera del proceso utilizando sentenci s wth-se/ect, esta
decodificacin se obtiene directamente de la tabla adjunta en la Fig 4 4 En la Fig
4 6 mostramos la simulacin en (a) del controlador utilizand dos procesos y en
(b) la simulacin del controlador utilizando un proceso Pode os observar que las
simulaciones son equivalentes y funcionan como lo indica la quina de estados
ilustrada en la Fig 4 4

66
(a)

ooo r

(b)
Fig 4 6 Simulacin del controlador de memoria usando (a) dos procesos y (ci) n proceso

4.3 Maquina de estados Mealy en VHDL 1

Hasta aqu hemos estudiado nicamente mquinas tipo Moore, en las cuales las
salidas son estrictamente funcin del estado actual En las mquias tipo Mealy
podemos tener salidas que son funcin del estado presente as como de las
seales de entrada actuales, esta idea y diferencia entre mquinas oore y Mealy
se ilustra en la Fig 4 7

67
Entradas
1
r
Lgica
Estado siguiente estado actual
para el Salidas
estado
.. Registros de
..
...
lgica de
..
Estado
Salida
siguiente

--+

(a)

Entradas

r
Lgica
Estado siguiente estado actual
para el
Registros de
estado ... Estado
siguiente

1
Salidas
Lgica de
Salida

...
(b)

Fig 4 7 (a) Mquina Moore y (b) Mquina Mea/y

El trabajo adicional requerido para describir una mquina Maly en contraste con
una mquina Moore es absolutamente mnimo Para implementar una mquina
Mealy simplemente se tiene que describir la salida como un$ funcin tanto de los
bits de estado como de las entradas que las afecten Por ejemplo, si tuviramos
una entrada adicional al controlador de memoria llamada "write mask" la cual
cuando se habilite prevenga que la escritura "we" sea h:tbilitada Esa nueva
condicin implica que la salida "we" no solamente depende l::! el estado en que se
habilita que es el estado seis (write), sino que tambin depende de la nueva
entrada "write_mask" Esta condicin se puede reflejar con el siguiente cdigo

if (present_state = write) and (write_mask = 'O') then


we <= '1',
else
we <= '0',
end if;

Esta ligera modificacin hace que la salida "we" sea una salida Mealy, lo mismo
puede hacerse para cualquier otra salida que lo requiera

68
5. BIBLIOGRAFA

ic K Skahill Addison-Wesley 1
a) VHDL for Programmable Log
b) The VHDL Reference U Heink First Edition 1996
el, et al John W l ey &
i Sons irst Edition
e) A VHDL Primer J Bhaske 2000
r Prentice Hall Third Edi
d) Fundamentals of Digital Logic tion 199 9
with VHDL Design S
McGraw-Hill First Br wn, Z Vranesic
i i n 2000
Ed t o
r
e) Digital Systems Design with VHD
L and Synthesis K e Ch a n IEE
Society First
Edition E Computer
1999
f) Logic and Computer Design Fundamentals.
M M o rr i Mano, Charles
s
Prentice Hall 1999 R Kime
g) Modern Digital Systems Des
ign John Y Cheu ng Ed We
st 1991

69
APUNTE FACUL TAO DE INGENIERIA UNAM.
104-B
/11/l ll 11111 11111/llll 11111111
1111111 ll*612515*
2001
G.- 612515

Esta obra se termin de imprimir


en diciembre de 2001
en el taller de imprenta del
Departamento de Publicaciones
de la Facultad de Ingeniera,
Ciudad Universitaria, Mxico, D F
e P o4s1o

Secretara de Servicios Acadmicos

El tiraje consta de 200 ejemplares


ms sobrantes de reposicin

{)
.(. } - r t
1J

....___ --

Você também pode gostar