Professional Documents
Culture Documents
HARDWARE VHDL
fACULT40 Df tNGfNllliA
FACULTAO E INGENIERA
DIVISIN DE INGENIERA ELCTRICA
DEPARTAMENTO DE INGENIERA EN COMPUTACIN
E INGENIERA EN ELECTRNICA
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
2001
1 1 1 11]11n 1 1 1 1
G.- 612515
1
fACUlTAD Df !N6fNifll.\
--
1. INTRODUCCIN
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
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
3
Fig 1 2 Las herramientas actuales sintetizan diferentes conjuntos de/lenguaje VHDL
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
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.
Flujo de diseo.
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
6
2. ENTIDADES Y ARQUITECTURAS
2.1. Introduccin
2. 2. Entidades
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
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
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
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
VHDL permite escribir los diseos utilizando los siguiente tres estilos de
arquitecturas diferentes
10
Cada uno de estos estilos permite escribir un diseo con nivele$ diferentes de
abstraccin, incluso la combinacin de ellos
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
ll
Asignacin Condicional WH
EN ... ELSE
Sintaxis
ldentificador_de_seal<= valo
r_a WHEN condicin ELSE
valor b WHEN condicin ELSE
Ejemplo
Sintaxis
Ejemplo
Ecuaciones Booleanas
Sintaxis
12
Ejemplos
x <=y and z,
a <= (b or e or d) and e,
op1 <= op2 nor op3 nor op4,
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,
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",
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
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
> 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
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,
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
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
end if;
Ejemplo
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 =>
end case;
Ejemplo
case estado_maquina is
when estadoO =>
FOR - LOOP
Sintaxis
end loop;
17
Ejemplo
Data_out(i) <= 0 ,
end if;
end loop;
;. WHILE - LOOP
Sintaxis
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
Wait for Detiene la simulacin durante el tiempo especificado, sqlo se utiliza para
simulaciones
18
_
2.3.3. Descripcin estructural (estructural)
Ejemplo
component add
p ort(a, b, cin in std_logic,
suma, co out std_logic),
end component,
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
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
>- 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
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.
22
architecture will_work of my_and is
begin
process(a_bus)
variable tmp. bit ,
begin
tmp = 1 ' ',
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
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
>- 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
Existen dos tipos enumerados predefinidos por el estndar IEEE 1076 bit y
boolean que son definidos como
Para poder usar estos tipos es necesario escribir las siguientes lneas
library ieee,
use ieee std_logic_1164.all,
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
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,
Tipo arreglo Un objeto del tipo arreglo consiste de mltiples elementos del mismo
tipo, los ms comunes son los siguientes
"
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
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
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
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
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
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
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,
28
3. CREANDO LGICA COMBINACIONAL Y SNCRONA
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
/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
.
/
data in in std_logic_vector(B downto O);
data out out std_logic_vector(B downto O);
end fifo8x9,
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},
-- 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;
end archfifo8x9,
31
3.3. Lgica combinacional
Ecuaciones Booleanas.
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,
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)),
32
or (d(2) 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
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,
El valor lgico"--" puede ser utilizado para asignar valores"no importa" a la seal
"x" como sigue
when-else
valor_x,
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, -
Operadores Relacionales
f
we <= '1' when (sta e=wrti e and id < x"1FFF'J else 'O';
Sobrecarga de operadores
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.
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,
36
if-then-else
lf (condicin) then
hacer_algo,
else
hacer_ algo_diferente,
end if;
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
PROM/
Shadow RAM
L_._____________ 0000
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
38
similar2 process (addr)
begin
if addr > x"OF" then
step <= '1'
else
step <= '0',
end if;
end process;
addr3
addr2
addr1 Step
addrO
;
Fig 3 3 Memoria implicada resultante del constructor if-tnen E
case-when
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
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,
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"
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,
40
f (c lk'e ven t andelk = '1 ') then
q <= d,
end if;
end process;
end example,
d q
el k
d q
elk
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
es equivalente a
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,
42
q
el k
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,
utilizando la sentencia wait un ti/ en lugar de la sentencia if (clk'eyent and clk = '1 )
'
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
(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,
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
,: : 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
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;
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,
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
(grst), la cual coloca el valor del contador a "0011101 O" Tambin el contador tiene )
47
elsif enable = '1' then
cnt <= cnt + 1,
end if;
end if;
end process count;
end archcntB,
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,
48
La sentencia (others => ' O ' ) representa una agregacin de elmentos separados
por comas, por tanto
1
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,
49
if load = '1' then
cnt <=data,
elsif enable = '1' then
cnt <=cnt + 1,
end if;
end f;
end process count;
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,
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,
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
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
51
ro -----+-.
------- 9-bltregisters
rdpt2:0]
dk-4------
Fig 3 9 Diagrama a bloques de fa FIFO
3.5.1 Loops
En el diseo de la FIFO utilizamos el siguiente ciclo "for" para dar reset asncrono
a todo el arreglo FIFO
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
else
fifo(i) <= (otfters => '0],
end loop;
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
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;
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
55
ready
Outputs
State oe we
id le o o
decision o o
write o
read o
ready
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/;
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,
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
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
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
Value:
.:
,,,
iW- read)
DO
DO
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
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
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
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,
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;
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
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
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/;
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
=
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
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)
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
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
{)
.(. } - r t
1J
....___ --