Académique Documents
Professionnel Documents
Culture Documents
59
59
3.2.1. Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
61
3.2.3. Entidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
3.2.4. Arquitectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
63
63
65
67
3.3.1. Multiplexor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
3.3.2. Descodificador . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
3.3.3. Sumador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
69
69
71
72
74
75
. . . . . . . . . . . . . . . . . . . . .
75
3.5.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
78
58
El empuje de la electrnica de los ltimos aos permite disponer de dispositivos con mayores escalas de integracin y consumos menores, proceso que se acenta
con el paso de los aos. Actualmente es posible disponer de dispositivos programables
que superan el milln de puertas equivalentes, por no hablar de los dispositivos programables a nivel de mscaras, que la superan ampliamente. Esta enorme capacidad
hace posible la implementacin de diseos digitales de gran complejidad, cuya realizacin a base de ecuaciones lgicas o captura esquemtica es prcticamente imposible,
consumiendo un tiempo de diseo prohibitivo. En este sentido, los lenguajes de descripcin hardware surgen como una herramienta fundamental para el ingeniero a la hora
de abordar estos diseos. Utilizando un smil histrico, los lenguajes de descripcin
hardware suponen algo as como la evolucin desde el trabajo artesanal a la produccin industrial.
La amplia popularidad de estos lenguajes ha posibilitado que su uso no se limite
nicamente a dispositivos de gran capacidad, sino que tambin se encuentra en entornos de desarrollo de dispositivos de pequea capacidad.
En este captulo se estudiar una versin muy reducida del lenguaje VHDL. Se
omitirn aquellos tipos, variables, estructuras de control y otros elementos que no sean
imprescindibles para realizar un diseo pequeo que pueda implementarse en un dispositivo lgico de baja capacidad.
3.1 Introduccin
59
3.1. Introduccin
Un lenguaje de descripcin hardware (HDL, Hardware Description Language) permite
el diseo y simulacin de circuitos electrnicos digitales complejos con un nivel de abstraccin
muy superior a las tcnicas tradicionales, como son los mapas de Karnaugh o las ecuaciones
Booleanas. Los lenguajes HDL han supuesto para la electrnica un avance similar al que
supuso la aparicin de lenguajes de alto nivel, como el C, frente a la programacin en ensamblador. En este tema se va a estudiar el lenguaje de descripcin hardware ms popular
llamado VHDL (VHSIC HDL; donde VHSIC: Very High Speed Integrated Circuits).
Las ventajas fundamentales que aporta un lenguaje como VHDL frente a las tcnicas
tradicionales son las siguientes:
Potencia y flexibilidad.
VHDL permite realizar descripciones esquemticas o de comportamiento de los circuitos. Es un lenguaje de simulacin y de sntesis. La sntesis consiste en la traduccin del
cdigo VHDL a puertas lgicas.
Independencia de la tecnologa.
VHDL permite la descripcin funcional previa de un circuito sin especificar un dispositivo concreto para su implementacin final.
Portabilidad.
VHDL es un estndar que permite que el cdigo sea portable y reutilizable entre entornos de trabajo de distintos fabricantes.
Reduccin del ciclo de diseo1 .
Como consecuencia de lo anterior, el diseo con VHDL permite un flujo de diseo rpido
puesto que el cdigo puede simularse y depurarse antes de realizar la sntesis. Es decir,
se puede verificar la lgica del circuito antes de su traduccin a puertas lgicas. De esta
forma se acelera el diseo, los plazos de entrega y la colocacin de un nuevo producto en
el mercado.
En el mercado existe gran variedad de herramientas para la simulacin y sntesis de
circuitos digitales con el lenguaje VHDL. La gran competencia entre ellas ha ocasionado que
las prestaciones que ofrecen sean muy similares.
60
El primer ejemplo es muy simple y muestra como se disea una puerta AND de 2 entradas en VHDL. Se aprecia claramente las 3 partes o elementos necesarios para el diseo de un
circuito con este lenguaje: libreras, entidad y arquitectura.
LIBRARY ieee;
ieee.std_logic_1164.ALL;
USE
ENTITY and2 IS
PORT (
a,b: IN std_logic;
s:
OUT std_logic
);
END and2;
Pines de entrada
Pin de salida
Las dos primeras lneas son dos sentencias utilizadas habitualmente en el cdigo VHDL
para incluir el paquete estndar std_logic_1164. Esta librera define un tipo de dato llamado
std_logic, utilizado habitualmente en la sntesis y simulacin de circuitos digitales. A continuacin se declara la entidad, que incluye las entradas y salidas, y, finalmente, la arquitectura, que es la descripcin de una puerta AND, utilizando el operador AND de VHDL.
Las palabras reservadas del lenguaje VHDL se escribirn en maysculas en este documento para distiguirlas del resto. En los entornos de desarrollo de VHDL no es necesario
hacerlo ya que disponen de editores que las muestran con otro color por lo que no es necesario
utilizar las maysculas para destacarlas.
Los identificadores utilizados por el usuario no pueden ser iguales a estas palabras reservadas y pueden estar formados por letras, dgitos o el carcter "_". El primer carcter
siempre debe ser una letra, y un identificador no puede acabar con el carcter "_", as como
tampoco se pueden usar dos seguidos "__". Por ejemplo, son identificadores legales:
tx_clk, T hree_State_Enable, sel7D, HIT _1029
Por contra no son vlidos los identificadores:
_tx_clk, 8B10B, large#num, register, clk_, link__bar
Como es habitual en cualquier lenguaje de programacin, estn prohibidas las vocales acentuadas as como la letra "".
La estructura genrica de un cdigo VHDL es la indicada a continuacin. El doble carcter indica que el texto que viene a continuacin, hasta el final de la lnea, es un
comentario.
LIBRARY ieee;
ieee.std_logic_1164.ALL;
USE
ENTITY eee IS
PORT (
declaracin de los puertos de entrada y salida
);
END eee;
ARCHITECTURE aaa OF eee IS
declaraciones de tipos de datos y objetos
BEGIN
lneas de cdigo
END aaa;
61
3.2.1. Objetos
Los objetos que se manejan en un cdigo VHDL son constantes, seales y variables.
Todos ellos deben ser declarados en su lugar correspondiente dentro de la arquitectura. La
declaracin genrica de un objeto es la siguiente:
OBJETO nombre : TIPO [ := expresin ]
: BOOLEAN := true;
CONSTANT ciclo
: TIME
:= 20ns;
Seales (SIGNAL). Las seales pueden representar cables o elementos de memoria. Los
puertos de entrada o salida de la declaracin de la entidad son seales que se pueden
utilizar en el bloque de la arquitectura sin necesidad de volverlos a declarar. La siguiente declaracin podra ser un contador de 4 bits declarado dentro de la arquitectura:
SIGNAL contador : std_logic_vector(3 DOWNTO 0);
std_logic y std_logic_vector. Constituyen los tipos lgicos estndar para diseos digitales, y se dispone de ellos incluyendo el paquete std_logic_1164. Los valores definidos en
este estndar aparecen en la tabla 3.1.
Sintaxis
0
1
Z
L
H
Valor
fuerza un cero lgico.
fuerza un uno lgico.
alta impedancia.
cero lgico dbil (pull-up). No se usar.
uno lgico dbil (pull-down). No se usar.
no importa.
62
Los operadores que se pueden aplicar a los datos de un diseo son los siguientes:
Lgicos
OR
AND
NOR
NAND
XOR
NOT
3.2.3.
Relacionales
= (igual que)
/= (distinto que)
> (mayor que)
< (menor que)
>= (mayor o igual que)
<= (menor o igual que)
Aritmticos
+,-,*,/
(valor absoluto)
Abs
(mdulo)
Mod
(Resto)
Rem
(potencia)
**
(concatena vectores/matrices)
&
Entidad
Una declaracin de una entidad describe el mdulo cuya descripcin VHDL se va a implementar (como si se tratase de un smbolo de una captura esquemtica). Cada entrada o
salida en la declaracin de una entidad se denomina puerto. El puerto se define indicando
su nombre, modo y tipo. El nombre es un identificador vlido, segn las reglas expuestas. El
modo define la direccin en la que se transfiere el dato a travs de ese puerto. La siguiente
tabla 3.2 muestra los diferentes tipos de puertos y sus modos de funcionamiento.
Tipo
IN
OUT
INOUT
BUFFER
Modo de operacin
el dato slo entra a la entidad a travs del puerto.
el dato slo sale de la entidad a travs del puerto.
el dato es bidireccional, es decir, entra o sale de la entidad a travs del puerto.
el dato sale de la entidad a travs del puerto, pero es realimentado internamente,
pudiendo actuar de entrada a elementos de la arquitectura. Una seal de salida es tipo buffer
cuando aparece en el lado derecho de una asignacin o cuando acta como condicin.
Es decir, cuando influye en el valor de otra seal interna o de otro puerto de salida.
In
Out
Buffer
Inout
In
In
Out
63
Por ejemplo, la declaracin de una entidad correspondiente a un sumador de 4 bits (figura 3.2) y su esquema seran de la forma:
ci
ENTITY add4 IS PORT(
a,b: IN std_logic_vector(3 DOWNTO 0);
IN std_logic;
ci:
sum: OUT std_logic_vector(3 DOWNTO 0);
co:
OUT std_logic);
END add4;
a[3:0]
sum[3:0]
co
b[3:0]
3.2.4. Arquitectura
La arquitectura describe la funcionalidad de la caja negra declarada anteriormente.
Bsicamente, existen tres estilos fundamentales para describir esta funcionalidad dentro del
cuerpo de la arquitectura:
Descripcin de comportamiento (behavioral). Alto nivel de abstraccin.
Descripcin de flujo de datos (dataflow). Mediano/Bajo nivel de abstraccin.
Descripcin estructural (structural). Nulo nivel de abstraccin.
El tipo de descripcin de la arquitectura depende del tipo de elementos y estructuras que
se utilicen dentro de ella. Por ejemplo la descripcin de mayor nivel de abstraccin (behavioral) solo utiliza procesos. En este texto se utilizarn, dentro de la arquitectura, los diferentes
elementos de sintaxis que se proponen en los siguientes apartados sin prestar atencin al tipo
de descripcin que resulte para la arquitectura.
En general, descripciones diferentes pueden dan lugar a implementaciones electrnicas
distintas aunque funcionalmente equivalentes. Un herramienta de sntesis ser buena si es
capaz de llegar al resultado ptimo partiendo de descripciones diferentes.
La sentencia if
La asignacin condicional secuencial debe utilizarse dentro de un proceso. Puede presentarse de diferentes formas:
IF
IF-ELSE
IF-ELSIF-ELSIF-...-ELSE
64
A continuacin se muestra un ejemplo y el resultado de su sntesis en puertas. Se aprecia que el circuito, resultado de la sntesis, cumple con el orden secuencial de la sentencia if.
y
a
f
PROCESS (a,b,c,x,y)
BEGIN
IF x=1 THEN
f <= a;
ELSIF y=1 THEN
f <= b;
ELSE
f <= c;
END IF;
END PROCESS
La interpretacin secuencial del cdigo anterior supone que la salida tomar el valor de
la entrada a siempre que x valga 1. La salida tomar el valor de la entrada b no slo cuando
y valga 1, sino cuando adems se verifique que x valga cero. La secuencialidad del cdigo
supone que no se comprueba la condicin del ELSIF a menos que no se cumpla la condicin del
IF. Finalmente, la salida ser igual a c cuando no se cumpla ninguna de las dos condiciones
previas. La sntesis refleja la interpretacin indicada.
El ltimo ELSE es vital para garantizar que el circuito sea puramente combinacional.
Si no estuviera y se diera ese caso ([x,y]=00), el sistema intentara que la salida f mantuviera
su valor anterior, es decir, introducira un biestable para almacenar el valor de f por lo que el
circuito dejara de ser combinacional.
La sentencia case
La estructura condicional CASE-WHEN especifica una serie de asignaciones condicionales en funcin de una seal de seleccin. Su sintaxis, de forma genrica, es:
CASE valor_seleccion IS
WHEN valor_1 =>
sentencias_secuenciales;
WHEN valor_2 =>
sentencias_secuenciales;
WHEN valor_3 =>
sentencias_secuenciales;
...
WHEN valor_n =>
sentencias_secuenciales;
WHEN OTHERS =>
sentencias_secuenciales;
END CASE;
65
La sentencia process
Los procesos son bloques que se van evaluar en paralelo con otras sentencias concurrentes: otros procesos o asignaciones. Sin embargo, el contenido de un proceso se evala secuencialmente. Este hecho obliga a que las sentencias que constituyen el cuerpo de un proceso
sean sentencias secuenciales. La sntesis de la descripcin VHDL generar un circuito digital que se comporte segn ese cdigo que se ejecuta de forma secuencial (ver ejemplo de la
sentencia if). Dentro de una arquitectura pueden existir varios procesos, que se ejecutan de
manera concurrente entre s.
La sintaxis genrica de un proceso se muestra a continuacin. La etiqueta y la declaracin de variables son opcionales.
[etiqueta:] PROCESS [(lista sensible)]
declaraciones de variables (no se utilizarn variables en este texto)
BEGIN
sentecias secuenciales
END PROCESS [etiqueta];
66
En realidad este tipo de sentencia es equivalente a un proceso cuya lista sensible est
compuesta por las variables que aparecen en el trmino de la derecha de la asignacin. A
continuacin se muestra el proceso equivalente de la sentencia y <= a (a la izquierda), y el
proceso equivalente a la sentencia y <= (a AND (NOT b)) OR (a AND c) (a la derecha).
PROCESS (a)
BEGIN
y <= a
END PROCESS;
PROCESS (a,b,c)
BEGIN
y <= (a AND (NOT b)) OR (a AND c)
END PROCESS;
Sentencias concurrentes
Asignacin a seal
Asignacin condicional
Ejemplos
x <= (a AND (NOT sel1)) OR (b AND sel1);
g <= NOT (y AND sel2);
y <= d WHEN (sel=1) ELSE c;
h <= 0 WHEN (x=1 AND sel2=0) ELSE 1;
y <= a WHEN (sel="00") ELSE
b WHEN (sel="01") ELSE
d WHEN (sel="01") ELSE
d;
67
a[3:0]
b[3:0]
y[3:0]
c[3:0]
d[3:0]
sel(0)
sel(1)
3.3.2. Descodificador
A continuacin se va a realizar la descripcin VHDL de un descodificador de direcciones
para el mapa de memoria de la siguiente figura.
LIBRARY ieee;
ieee.std_logic_1164.ALL;
USE
FFFF
EEPROM
C000
SRAM
8000
Perifrico 2
Perifrico 1
4010
4008
4000
PROM/RAM
0000
ENTITY decod IS
PORT (
: IN std_logic_vector(15 DOWNTO 0);
bus_dir
arranque
: IN std_logic;
ram, prom, per1, per2, sram, eeprom : OUT std_logic
);
END decod;
ARCHITECTURE decod_arq OF decod IS
BEGIN
PROCESS (bus_dir, arranque, habilita)
BEGIN
sram <= 0;
ram <= 0;
prom <= 0;
per1 <= 0;
eeprom <= 0;
per2 <= 0;
IF ( bus_dir >=x"0000"AND bus_dir <=x"4000") THEN
IF (arranque=1) THEN
ram<=1;
ELSE
prom<=1;
END IF;
ELSIF ( bus_dir >=x"4000"AND bus_dir <x"4008") THEN
per1<=1;
ELSIF ( bus_dir >=x"4008"AND bus_dir <x"4010") THEN
per2<=1;
ELSIF ( bus_dir >=x"8000"AND bus_dir <x" C000") THEN
sram<=1;
ELSIF ( bus_dir >=x" C000") THEN
eeprom<=1;
END IF;
END PROCESS;
END decod_arq;
68
bus_dir[15:0]
arranque
a15
a14
a15
a14
sram
prom
a15
a14
a15
a14
eepro
m
ram
a15
a14
a13
a12
a11
a10
a9
a8
a7
per1
a6
a5
a4
a3
a15
a14
a13
a12
a11
a10
a9
a8
a7
per2
a6
a5
a4
a3
69
3.3.3. Sumador
Se va a disear un sumador de 4 bits -sin signo- con acarreo de entrada y de salida. En el diseo se va a emplear el operador + por lo que habr que incluir la librera
ieee.std_logic_unsigned.ALL que lo contiene.
Si no hubiera acarreos ni problemas de desbordamiento, el diseo sera tan simple como
escribir la sentencia suma <= a + b. Como resulta que hay que contemplarlos, la dificultad
mayor consistir en calcular el acarreo.
LIBRARY ieee;
ieee.std_logic_1164.ALL;
USE
ENTITY suma IS
PORT (
a,b : IN
: IN
ci
co
: OUT
suma : OUT
);
END suma;
ci
a
b
suma
1
1101
1001
co=1, 0111
clk
LIBRARY ieee;
ieee.std_logic_1164.ALL;
USE
LIBRARY ieee;
ieee.std_logic_1164.ALL;
USE
ENTITY dff IS
PORT (
d, clk : IN
q
: OUT
);
END dff;
ENTITY dff IS
PORT (
std_logic;
d, clk : IN
q
: BUFFER std_logic
);
END dff;
std_logic;
std_logic
70
Los dos diseos generan un biestable tipo D pero es interesante observar que en la primera opcin no se utiliza ELSE en la estructura condicional. Esto es posible porque estamos
definiendo un elemento de memoria que debe conservar su valor en el caso de que no se verifique la condicin del IF (falta el ELSE).
En la segunda opcin se ha utilizado el ELSE para fijar de forma explcita qu debe
hacer el biestable cuando no ocurre un flanco positivo de reloj (la salida se queda como est
q<=q). En este caso la salida q no debe declararse como OUT sino como BUFFER, ya que la
seal q aparece al lado derecho de una asignacin.
La expresin clkEVENT y el hecho de incluir la seal clk en la lista sensible son redundantes. Es decir, ambas sirven para detectar un evento sobre la seal clk. La explicacin
de esta redundancia en el cdigo es que algunas herramientas de sntesis ignoran la lista
sensible, por lo que es necesaria esta expresin clkEVENT.
D
clk
LE
LIBRARY ieee;
ieee.std_logic_1164.ALL;
USE
ENTITY dff IS
PORT (
d, clk : IN
q
: OUT
);
END dff;
std_logic;
std_logic
LIBRARY ieee;
ieee.std_logic_1164.ALL;
USE
ENTITY dff IS
PORT (
d, clk : IN
q
: OUT
);
END dff;
clk
Q
reset
71
std_logic;
std_logic
d
D
reset
Q
clk
ENTITY dff IS
PORT (
d, clk : IN
q
: OUT
);
END dff;
std_logic;
std_logic
72
t
clk
ENTITY tff IS
PORT (
std_logic;
t, clk : IN
q
: BUFFER std_logic
);
END tff;
ARCHITECTURE tff_arq OF tff IS
BEGIN
PROCESS (clk)
BEGIN
IF (clk EVENT AND clk=1) THEN
IF (t=1) THEN
q<=NOT (q);
END IF;
END IF;
END PROCESS;
END tff_arq;
3.4.3.
registro[7:0]
data[7:0]
Registro
de 8 bits
carga
clk
reset
LIBRARY ieee;
ieee.std_logic_1164.ALL;
USE
ENTITY registro8 IS
PORT (
carga, clk, reset : IN
: IN
data
: OUT
registro
);
END registro8;
std_logic;
std_logic_vector(7 DOWNTO 0);
std_logic_vector(7 DOWNTO 0)
En la sentencia de asignacin del reset se presenta -como comentario- otra forma de poner todos los bits del registro a un mismo valor. La palabra reservada OTHERS implica que
todos los bits del registro se pondrn al valor especificado independientemente del tamao del
registro. En realidad esta opcin es ms verstil y permite asignar a ciertos bits un valor y al
resto otro. El siguiente ejemplo fija los bits ms y menos significativos a 1, y el resto a 0:
73
Registro de 8 bits con reset asncrono, seal de carga y salida en alta impedancia
Sobre el registro definido anteriormente, introduciremos una nueva funcionalidad: salidas en alta impedancia. Para que la herramienta de sntesis traduzca a puertas el cdigo
VHDL deber contar con elementos de librera con salidas en alta impedancia, lo que es habitual en los dispositivos programables de baja capacidad. La nica precaucin a tener en
cuenta es que ciertas pales tiene un pin comn de habilitacin de salida en alta impedancia
que es activo a nivel bajo. Por ejemplo sera imposible sintentizar en una PAL16R4 o PAL16R8
salidas en alta impedancia gobernadas por una seal activa a nivel alto.
Para seleccionar entre el estado normal o de alta impedancia de una salida, el registro
debe poseer una entrada adicional, que es la entrada oen (output-enable activa a nivel bajo).
En el siguiente ejemplo, cuando dicha seal est a 0 habilita la salida normal del registro,
pero cuando est a 1 deja la salida en alta impedancia.
LIBRARY ieee;
ieee.std_logic_1164.ALL;
USE
oen
data[7:0]
carga
clk
Registro
de 8 bits
reset
registro_aux[7:0]
registro[7:0]
ENTITY registro8 IS
PORT (
carga, clk, reset, oen : IN
: IN
data
: OUT
registro
);
END registro8;
std_logic;
std_logic_vector(7 DOWNTO 0);
std_logic_vector(7 DOWNTO 0)
74
Registro de 8 bits con reset asncrono, seal de carga, salida en alta impedancia y carga desde la propia salida
Si se desea que la carga paralelo se efecte desde la propia seal de salida registro en
lugar de hacerlo desde la entrada data, habra que declarar la primera de ellas como INOUT
y omitir la segunda.
oen
Registro
de 8 bits
carga
clk
LIBRARY ieee;
ieee.std_logic_1164.ALL;
USE
registro[7:0]
registro_aux[7:0]
reset
La seal registro[7:0] es bidireccional. A la hora de darle estmulos (valores) para la simulacin se
presentan dos casos:
Acta de salida, oen=0: En el fichero de estmulos hay que asignarle el valor de alta impedancia Z
para que el simulador entienda que funciona en esta
direccin. El valor que se mostrar en pantalla para la
seal registro no ser Z (el estmulo dado) sino el contenido de los 8 biestables que constituyen el registro.
Acta de entrada, oen=1: En el fichero de estmulos
hay que asignarle cualquier valor distinto de alta impedancia Z. En este diseo se presentan dos opciones:
(a) No importa, carga=0: El valor de la seal registro, actuando como entrada, no importa ya que no se
va a cargar en los biestables. Se le asigna el valor -;
y (b) Valor determinado, carga=1: El valor asignado a
la seal registro se cargar en los biestables cuando se
produzca un flanco activo (de subida) del reloj.
3.4.4.
ENTITY registro8 IS
PORT (
std_logic;
carga, clk, reset, oen : IN
: INOUT std_logic_vector(7 DOWNTO 0)
registro
);
END registro8;
ARCHITECTURE registro8_arq OF registro8 IS
SIGNAL registro_aux: std_logic_vector(7 DOWNTO 0);
BEGIN
registro<= registro_aux WHEN (oen=0) ELSE (OTHERS=>Z);
PROCESS (clk,reset)
BEGIN
IF (reset=1) THEN
registro_aux<=(OTHERS=>0);
ELSIF (clk EVENT AND clk=1) THEN
IF (carga=1) THEN
registro_aux<=registro;
END IF;
END IF;
END PROCESS;
END registro8_arq;
dato
ENTITY desplaza8 IS
PORT (
std_logic;
dato, clk, reset : IN
: BUFFER std_logic_vector(7 DOWNTO 0)
salida
);
END desplaza8;
7
6
5
4
3
clk
reset
2
1
0
salida[7:0]
ARCHITECTURE desplaza8_arq OF desplaza8 IS
BEGIN
PROCESS (clk,reset)
BEGIN
IF (reset=1) THEN
salida<="00000000";
ELSIF (clk EVENT AND clk=1) THEN
salida(6 DOWNTO 0) <= salida(7 DOWNTO 1);
salida(7) <= dato;
END IF;
END PROCESS;
END desplaza8_arq;
75
data[7:0]
habilita
carga
clk
reset
cuenta[7:0]
Contador
de 8 bits
ENTITY contador8 IS
PORT (
std_logic;
carga, clk, reset, habilita : IN
: IN
std_logic_vector(7 DOWNTO 0);
data
: BUFFER std_logic_vector(7 DOWNTO 0)
cuenta
);
END contador8;
ARCHITECTURE contador8_arq OF contador8 IS
BEGIN
PROCESS (clk,reset)
BEGIN
IF (reset=1) THEN
cuenta<= (OTHERS=>0);
ELSIF (clk EVENT AND clk=1) THEN
IF (carga=1) THEN
cuenta<=data;
ELSIF (habilita=1) THEN
cuenta<=cuenta+1;
END IF;
END IF;
END PROCESS;
END contador8_arq;
76
Entradas
Biestables
Lgica
combinacional
estado_siguiente
clk'EVENT
and clk='1'
Lgica
combinacional
Salidas
estado_actual
3.5.1.
Ejemplo
Como ejemplo, realizaremos una mquina de Moore consistente en el control de la barrera de un paso a nivel -una sola salida-. Se supondr que el tren va en un nico sentido y que
nunca da marcha atrs. Las entradas son el sensor que est antes de la barrera (sensor(0))
y el sensor ubicado despus de la barrera (sensor(1)). La salida del sistema estar a 0 en el
estado de reposo (barrera abierta) y a 1 en el resto de estados (barrera cerrada). El diagrama
de bolas de la mquina de Moore, correspondiente a este sistema, presenta una bifurcacin
debido a que puede darse el caso de que pase un tren largo que pise ambos sensores simultneamente y el caso de que pase un tren corto cuya longitud sea menor a la distancia entre
ambos sensores. En este caso habr un estado en el que las entradas valen 00 (como en reposo)
pero el tren est entre ambos sensores sin pisarlos.
reposo
Entradas
barrera=0
Salida
Estado
sensores = 01
sensores = 01
pisa_1
barrera=1
sensores = 00
sensores = 11
enmedio
pisa_1_2
barrera=1
barrera=1
sensores = 10
sensores = 00
sensores = 11
sensores = 10
Pisa_2
barrera=1
77
LIBRARY ieee;
ieee.std_logic_1164.ALL;
USE
ENTITY tren IS
PORT (
clk, reset : IN std_logic;
sensores : IN std_logic_vector(2 DOWNTO 1);
barrera : OUT std_logic;
);
END tren;
ARCHITECTURE tren_arq OF tren IS
TYPE estado IS (reposo, pisa_1, pisa_1_2, enmedio, pisa_2);
SIGNAL estado_actual, estado_siguiente: estado;
BEGIN
secu: PROCESS (clk,reset)
BEGIN
IF (reset=1) THEN
estado_actual<=reposo;
ELSIF (clk EVENT AND clk=1) THEN
estado_actual <= estado_siguiente;
END IF;
END PROCESS secu;
comb: PROCESS (estado_actual, sensores)
BEGIN
CASE estado_actual IS
WHEN reposo =>
barrera <= 0;
Barrera abierta (salida)
IF (sensores="01") THEN
estado_siguiente<=pisa_1;
ELSE
estado_siguiente <= reposo;
END IF;
WHEN pisa_1 =>
barrera <= 1;
Barrera cerrada (salida)
IF (sensores="00") THEN
estado_siguiente<=enmedio;
ELSIF (sensores="10") THEN
estado_siguiente <= pisa_1_2;
ELSE
estado_siguiente <= pisa_1;
END IF;
sensores = 10
78
El estado se encuentra codificado en los biestables, siendo necesaria una lgica combinacional para determinar el estado siguiente y para decodificar el estado y obtener las salidas.
La figura 3.5 muestra el resultado genrico de la implementacin de una mquina de Moore.
Lgica combinacional:
process comb
Lgica secuencial:
process secu
D
Lgica combinacional:
process comb
Entradas
salida1
estado_actual
estado_siguiente
salida2
estado_actual
clk
reset
3.6.
Fichero de estmulos
79
sta- conectadas a las entradas del componente, se obtiene la respuesta de ste de forma
visible en las seales de la arquitectura conectadas a la salida del componente. Normalmente suelen llamarse igual las seales de la arquitectura y las del componente para
facilitar la legibilidad del diseo. Adems suele tener dos procesos: (a) uno para definir
el reloj -en el caso de que el circuito sea sncrono-, y (b) otro para indicar la evolucin
de resto de entradas. Los procesos presentes en la arquitectura utilizan la instruccin
WAIT y, por razones que se estudiarn en cursos superiores, no pueden tener lista sensible.
Para concretar estas ideas se presenta el fichero del diseo y de la simulacin de un
circuito muy simple: una puerta AND de 2 entradas. En la izquierda se muestra el contenido
del fichero and2.vhd que describe la lgica del circuito y en la derecha tenemos el contenido
del fichero de estmulos que lo hemos llamado and2_tb.vhd. El circuito es puramente combinacional por lo que no se requiere un proceso que genere seal de reloj.
Fichero: and2_tb.vhd
Fichero: and2.vhd
LIBRARY ieee;
ieee.std_logic_1164.ALL;
USE
LIBRARY ieee;
ieee.std_logic_1164.ALL;
USE
ENTITY and2 IS
PORT (
a, b : IN
s
: OUT
);
END and2;
ENTITY test IS
END test;
std_logic
50ns
100ns
150ns
200ns
250ns
300ns
350ns
400ns
450ns
500ns