0% encontró este documento útil (0 votos)
146 vistas28 páginas

Problem Av HDL

El documento describe ejemplos de circuitos controlados por máquinas de estados para simulación y síntesis. Se presentan dos ejemplos: un botón que controla un motor y unos semáforos que controlan un cruce. En el primer ejemplo, se muestra cómo modelar el botón con una máquina de estados de Moore de 4 estados para evitar transiciones rápidas. En el segundo ejemplo, se propone una máquina de estados síncrona con el reloj para controlar los semáforos y contadores para los tiempos de espera.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
146 vistas28 páginas

Problem Av HDL

El documento describe ejemplos de circuitos controlados por máquinas de estados para simulación y síntesis. Se presentan dos ejemplos: un botón que controla un motor y unos semáforos que controlan un cruce. En el primer ejemplo, se muestra cómo modelar el botón con una máquina de estados de Moore de 4 estados para evitar transiciones rápidas. En el segundo ejemplo, se propone una máquina de estados síncrona con el reloj para controlar los semáforos y contadores para los tiempos de espera.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

11.

2 Ejemplos para simulacion y sntesis 91


11.2 Ejemplos para simulacion y sntesis
El estilo de realizacion de modelos (simulacion) es bastante diferente del estilo empleado
para la sntesis de circuitos. Para empezar, en el modelado no hay restricciones de
ningun tipo y ademas los modelos suelen incluir informacion referente a los retrasos.
Aqu veremos algunos ejemplos en los cuales son modelos puesto que incluyen retrasos,
y otros, que por la forma de estar descritos no son sintetizados correctamente. Veremos
las diferencias, cuando las haya entre lo que se sintetiza y lo que se simulara, y veremos
que muchas veces no coincide.

11.2.1 El boton
Ejemplo 11.1 Un motor electrico viene controlado por un unico boton. Cuando se
pulsa el motor cambia de encendido a apagado. Sintetizar el circuito que controla el
motor mediante una maquina de estados en VHDL.
La solucion a este problema es bastante simple tal y como ya se mostro en el ejemplo
6.3 donde con un simple biestable se solucionaba el problema. Desde un punto de vista
algo mas abstracto se puede pensar en una maquina de estados con dos estados, de
manera que se pasa de uno a otro cada vez que se pulsa el boton. Esto en principio
se puede hacer, pero tiene un problema y es que cuando se pasa de un estado a otro
el boton sigue pulsado, por lo que en realidad se produce una transicion muy rapida
entre estados; solo cuando se suelte el boton se parara, pero es imposible predecir si se
parara en el estado encendido o en el apagado. Para evitar esto lo normal es pensar
en dos estados mas que detengan esta transicion rapida entre estados. La salida solo
dependera del estado del sistema por tanto no es mas que una maquina de Moore:
ENTITY conmutador IS
PORT (boton: IN bit; motor: OUT bit);
END conmutador;

ARCHITECTURE moore OF conmutador IS


TYPE estado IS (apagado1,apagado2,encendido1,encendido2);
SIGNAL presente: estado:=apagado1;
BEGIN
PROCESS(boton,presente)
BEGIN
CASE presente IS
WHEN apagado1 =>
motor<='0';
IF boton='1' THEN presente<=encendido2;
END IF;
WHEN encendido2 =>
motor<='1';
IF boton='0' THEN presente<=encendido1;
END IF;
WHEN encendido1 =>
motor<='1';
IF boton='1' THEN presente<=apagado2;
END IF;
WHEN apagado2 =>
motor<='0';
IF boton='0' THEN presente<=apagado1;
END IF;
END CASE;
END PROCESS;
END moore;

Ingeniera Informatica Universidad de Valencia


92 Utilizacion del lenguaje VHDL
Se puede hacer algo con menos estados tal y como se muestra a continuacion, pero
no es cierto que hayan menos estados, aparentemente hay menos porque el sintetizador
del circuito introducira latches extra. Ademas, la descripcion que sigue, aunque pudiera
parecer que tiene la estructura de una maquina de estados, no lo es exactamente porque
en la lista sensible no se ha introducido la se~nal que contiene el estado, y esto signi-
cara que se realiza logica secuencial que no aparece explcitamente en la descripcion.
En realidad el truco esta en que la maquina anterior se realizara con biestables activos
por nivel, mientras que la viene a continuacion, como no tiene presente en la lista sen-
sible se activara por anco por lo que se utilizara un unico biestable maestro-esclavo,
pero para obtener un biestable maestro-esclavo hacen falta precisamente dos biestables
activos por nivel:
ARCHITECTURE pseudomaquina OF conmutador IS
TYPE estado IS (apagado,encendido);
SIGNAL presente: estado:=apagado;
BEGIN
PROCESS(boton)
BEGIN
CASE presente IS
WHEN apagado =>
motor<='0';
IF boton='1' THEN
presente<=encendido;
motor<='1'; -- Esto es salida futura, por tanto, opuesta.
END IF;
WHEN encendido =>
motor<='1';
IF boton='1' THEN
presente<=apagado;
motor<='0'; -- Lo mismo, salida futura.
END IF;
END CASE;
END PROCESS;
END pseudomaquina;

Este segundo caso no se sintetizara bien puesto que a las herramientas de dise~no hay
que especi carles que cosas son activas por anco de forma explcita, generalmente con el
atributo 'EVENT. Si se metiera esta descripcion en un sintetizador, y luego simularamos
lo sintetizado, descubriramos que efectivamente tiene dos estados pero al pulsar el
boton cambia entre estados de forma rapida tal y como se predijo al principio. En
cambio, si se simula la descripcion tal y como esta, funcionara bien. Aparte de todo
esto, el ejemplo anterior no es precisamente un buen modelo de maquina de estados ya
que la se~nal de sincronizacion, en este caso el boton, se encuentra en cada uno de los
estados, y por otro lado hay algo que no se debera hacer nunca y es cambiar la salida
al tiempo que cambia el estado para que as el estado siguiente tenga la salida que se
le ha especi cado; en general, cada estado debera tener especi cadas sus salidas. Para
que un sintetizador hubiera interpretado la descripcion anterior como lo que realmente
pone, habra que haberlo hecho as:
ARCHITECTURE para_sintesis OF conmutador IS
TYPE estado IS (apagado,encendido);
SIGNAL presente: estado:=apagado;
BEGIN
PROCESS(boton)
BEGIN
IF boton='1' -- o boton='1' AND boton'EVENT
CASE presente IS
WHEN apagado =>

Ingeniera Informatica Universidad de Valencia


11.2 Ejemplos para simulacion y sntesis 93
motor<='0';
presente<=encendido;
END IF;
WHEN encendido =>
motor<='1';
presente<=apagado;
END CASE;
END IF;
END PROCESS;
END para_sintesis;

Si repasamos la descripcion anterior y la intentamos simular a mano con todo lo que


sabemos, veremos que cuando el estado es apagado motor el vale uno, y viceversa, es
decir, lo contrario de lo que parece. Si esto nos causa mucha confusion, podemos dividir
el problema en dos procesos, uno que interpreta el estado y otro el cambio de estado:
maquina: salida:
PROCESS(boton) PROCESS(presente)
BEGIN BEGIN
IF boton='1' THEN CASE presente IS
CASE presente IS WHEN apagado=>
WHEN apagado=> motor<='0';
presente<=encendido; WHEN encendido=>
WHEN encendido=> motor<='1';
presente<=apagado; END CASE;
END CASE; END PROCESS salida;
END IF;
END PROCESS maquina;

Esta descripcion es mas interesante ya que en este caso esta mas claro lo que quere-
mos decir y tanto la simulacion como la sntesis coinciden. Quiza alguien podra pensar
que una posible solucion sera poner presente en la lista sensible, pero esto, aunque la
simulacion estara bien, sintetizara otro circuito diferente. O sea, que es aconsejable
seguir un unico modelo para la maquina de estados, que funcione bien para sntesis, y
no salirse de ah.

11.2.2 Los semaforos


Ejemplo 11.2 Realizar el circuito de control de unos semaforos que controlan un cruce
entre un camino rural y una carretera. En principio, el semaforo del camino rural
siempre esta en rojo y el de la carretera en verde. Una celula en el camino rural
detecta la presencia de un coche, momento en el cual el semaforo de la carretera pasa
de verde a rojo pasando por el ambar, al tiempo que el semaforo del camino se pone en
verde. El semaforo del camino permanece en verde unos 10 segundos, momento en el
cual empieza la secuencia de puesta a rojo, al tiempo que el semaforo de la carretera
empieza la secuencia de cambio hacia el verde. El semaforo del camino no debe ponerse
en verde otra vez hasta transcurridos 30 segundos por lo menos. El circuito tiene una
entrada de reloj de 1 segundo de periodo y las se~nales de entrada y salida su cientes
para el control del semaforo.

Como se da una se~nal de reloj como entrada, es interesante realizar la maquina de


estados de manera que sea sncrona con este reloj, de esta manera se evitan proble-
mas de metaestabilidad con las entradas, ademas de que las herramientas de sntesis
interpretaran mejor que el circuito es una maquina de estados y el resultado sera mas
Ingeniera Informatica Universidad de Valencia
94 Utilizacion del lenguaje VHDL
optimo. Junto con la maquina de estados habra otros procesos que controlen los tiempos
de espera mediante contadores.
La entrada al sistema sera una se~nal de reset asncrona, que es lo habitual, y las
fotocelulas del camino, que indicaran un '1' cuando detecten un coche. Las salidas
seran un total de 6, 3 para cada semaforo, indicando cada una de estas tres el color
rojo, ambar y verde. Con estas consideraciones la entidad y arquitectura quedaran:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY semaforo IS
PORT (sensor,reset,clk: IN std_logic;
semcamin,semcarr: OUT std_logic_vector(0 TO 2));
END semaforo;

ARCHITECTURE descripcion OF semaforo IS


TYPE estado IS (inicial,carramarillo,caminverde,caminamarillo,espera);
CONSTANT verde: std_logic_vector(0 TO 2):="001";
CONSTANT amarillo: std_logic_vector(0 TO 2):="010";
CONSTANT rojo: std_logic_vector(0 TO 2):="100";
SIGNAL presente: estado:=inicial;
SIGNAL rescont: boolean:=false; -- Pone a cero la cuenta
SIGNAL fin_largo,fin_corto: boolean; -- Indica fin de cuenta
SIGNAL cuenta: integer RANGE 0 TO 63;
BEGIN

-- Lo primero es definirse la maquina de estados:


maquina:
PROCESS(clk,reset)
BEGIN
IF reset='1' THEN
presente<=inicial;
ELSIF clk='1' AND clk'EVENT THEN
CASE presente IS
WHEN inicial=>
IF sensor='1' THEN
presente<=carramarillo;
END IF;
WHEN carramarillo=>
presente<=caminverde;
WHEN caminverde=>
IF fin_corto THEN
presente<=caminamarillo;
END IF;
WHEN caminamarillo=>
presente<=espera;
WHEN espera=>
IF fin_largo THEN
presente<=inicial;
END IF;
END CASE;
END IF;
END PROCESS maquina;

salida:
PROCESS(presente)
BEGIN
CASE presente IS
WHEN inicial=>
semcarr<=verde;
semcamin<=rojo;
rescont<=true;
WHEN carramarillo=>
semcarr<=amarillo;
semcamin<=rojo;

Ingeniera Informatica Universidad de Valencia


11.2 Ejemplos para simulacion y sntesis 95
rescont<=true;
WHEN caminverde=>
semcarr<=rojo;
semcamin<=verde;
rescont<=false;
WHEN caminamarillo=>
semcarr<=rojo;
semcamin<=amarillo;
rescont<=true;
WHEN espera=>
semcarr<=verde;
semcamin<=rojo;
rescont<=false;
END CASE;
END PROCESS salida;

-- El siguiente proceso define el contador:


contador:
PROCESS(clk)
BEGIN
IF clk='1' THEN
IF rescont THEN cuenta<=0;
ELSE cuenta<=cuenta+1;
END IF;
END IF;
END PROCESS contador;

-- Queda la deteccion de los tiempos largos y cortos:


fin_largo<=true WHEN cuenta=29 ELSE false;
fin_corto<=true WHEN cuenta=9 ELSE false;

END descripcion;

11.2.3 El ascensor
Ejemplo 11.3 Describir el controlador de un ascensor unico en una vivienda de 4
pisos. Las entradas al circuito seran, por un lado, el piso al que el usuario desea
ir mediante 4 botones, y el piso en el que se encuentra el ascensor en un momento
dado. Por otro, habra una celula que detecte la presencia de algun obstaculo en la
puerta, si hay un obstaculo la puerta no debe cerrarse. La salida sera por un lado el
motor (mediante dos bits), y la puerta (un bit). El funcionamiento es bien simple: el
ascensor debe ir al piso indicado por los botones, cuando llegue abrira las puertas que
permaneceran as hasta que se reciba otra llamada. El ascensor no tiene memoria por
lo que si se pulsan los botones mientras el ascensor se mueve, no hara caso.
ENTITY ascensor IS
PORT(boton: IN bit_vector(0 TO 3);
piso: IN bit_vector(1 DOWNTO 0);
clk,reset,celula: IN bit;
motor: OUT bit_vector(0 TO 1);
puerta: OUT bit);
END ascensor;

ARCHITECTURE mover OF ascensor IS


TYPE estado IS (inicial,cerrar,voy);
SUBTYPE vector IS bit_vector(2 DOWNTO 0);
SIGNAL presente: estado:=inicial;
SIGNAL bot: bit_vector(2 DOWNTO 0);

FUNCTION codifica(pulso: bit_vector(0 TO 3)) RETURN vector IS


BEGIN
CASE pulso IS

Ingeniera Informatica Universidad de Valencia


96 Utilizacion del lenguaje VHDL
WHEN "0001"=>RETURN "000";
WHEN "0010"=>RETURN "001";
WHEN "0100"=>RETURN "010";
WHEN "1000"=>RETURN "011";
WHEN OTHERS=>RETURN "100";
END CASE;
END codifica;

BEGIN

fsm:
PROCESS(reset,clk)
BEGIN
IF reset='1' THEN presente<=inicial;
ELSIF clk='1' AND clk'EVENT THEN
CASE presente IS
WHEN inicial=>
IF bot/="100" THEN presente<=cerrar;
END IF;
WHEN cerrar=>
IF celula='0' THEN presente<=voy; -- Sin obtaculos
END IF;
WHEN voy=>
IF bot(1 DOWNTO 0)=piso THEN presente<=inicial;
END IF;
END CASE;
END IF;
END PROCESS fsm;

salida:
PROCESS(presente,boton)
BEGIN
CASE presente IS
WHEN inicial=>
motor<="00"; -- Parado
puerta<='1'; -- Abierta
bot<=codifica(boton);
WHEN cerrar=>
motor<="00";
puerta<='1';
WHEN voy=>
puerta<='0'; -- Cerrada
IF bot(2 DOWNTO 0)>piso THEN
motor<="10"; -- Subir
ELSE motor<="01"; -- Bajar
END IF;
END CASE;
END PROCESS salida;

END mover;

El funcionamiento no es muy complejo. Si nadie pulsa nada se mantiene en el estado


inicial, si alguien pulsa entonces se cierran las puertas y el motor se pone en marcha en
direccion al piso que se llamo. Cuando llega se abren las puertas y se queda a esperar
una nueva llamada.
La funcion codifica se ha puesto para mostrar la inclusion de una funcion en una
descripcion. Realmente el programa funciona exactamente igual de bien, con peque~nas
modi caciones, si se utiliza bot como una se~nal de 4 bits. Esta se~nal sigue siendo
necesaria puesto que se encarga de capturar la pulsacion del boton.
El ejemplo del ascensor que se acaba de mostrar no es demasiado realista, por un
lado las puertas se cierran de golpe, y por otro, la parada y puesta en marcha del
ascensor es tambien muy brusca. De todas formas pone de mani esto la capacidad de
Ingeniera Informatica Universidad de Valencia
11.2 Ejemplos para simulacion y sntesis 97
funcionamiento del VHDL para la descripcion de hardware. Como ejercicio adicional se
puede hacer el ejemplo anterior pero a~nadiendole caractersticas mas realistas como la
deteccion de obstaculos durante el cierre de puertas, o la posibilidad de gestionar mas
de un boton pulsado.

11.2.4 La memoria ROM


Ejemplo 11.4 Realizar el modelo de simulacion de una memoria ROM simple. La
ROM tiene una entrada de seleccion activa a nivel bajo, de manera que cuando esta ac-
tiva, la salida es el contenido de la posicion indicada por la direccion de entrada, sino
esta activa, la salida es alta impedancia. El tiempo que pasa entre que cambia la selec-
cion y la salida es de 60 ns. El tiempo que pasa entre que la direccion cambia y cambia
la salida es de 100 ns. En el caso de cambio en la direccion, la salida mantiene su valor
anterior durante 10 ns y luego pasa a desconocido.

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY rom IS
PORT( cen: IN std_logic;
direcc: IN std_logic_vector(1 DOWNTO 0);
dato: OUT std_logic_vector(7 DOWNTO 0));
END rom;

ARCHITECTURE modelo OF rom IS


SIGNAL salida: std_logic_vector(7 DOWNTO 0);
SIGNAL cenr: std_logic:
BEGIN

PROCESS(direcc)
BEGIN
salida<="XXXXXXXX" AFTER 10 ns;
CASE direcc IS
WHEN "00"=>salida<=TRANSPORT "00000000" AFTER 100 ns;
WHEN "01"=>salida<=TRANSPORT "00000001" AFTER 100 ns;
WHEN "10"=>salida<=TRANSPORT "01010101" AFTER 100 ns;
WHEN "11"=>salida<=TRANSPORT "10101010" AFTER 100 ns;
WHEN OTHERS=> NULL;
END CASE;
END PROCESS;

dato<=salida WHEN cenr='0' ELSE


(OTHERS 'Z') WHEN cenr='1' ELSE
(OTHERS 'X');
cenr<=cen AFTER 60 ns;

END modelo;

El modelo no requiere demasiadas explicaciones. Quiza sea interesante resaltar


que para el caso del retraso de 100 ns de la salida se ha empleado el retraso de tipo
transportado en vez del inercial, la razon es que este evento se asigna al mismo tiempo
que de 10 ns, de manera que si no fuese transportado quitara el otro evento de la lista
de eventos y no se ejecutara nunca.
Ingeniera Informatica Universidad de Valencia
98 Utilizacion del lenguaje VHDL
11.2.5 El microprocesador
Ejemplo 11.5 Realizar un microprocesador sencillo. El procesador tiene un bus de
datos bidireccional de 8 bits. Un bus de direcciones de salida de 8 bits. Una se~nal de
lectura escritura (a uno indica lectura y a cero escritura). Una se~nal de reloj y una
de reset. Internamente debe haber un acumulador de 8 bits, el registro de instruccion
de 3 bits, y el programa counter de 8 bits. El micro cuenta con 8 instrucciones. Las
instrucciones estan formadas por dos bytes, en el primero se pone el codigo, y en el
segundo el operando, salvo en la ultima que solo tiene un byte. A continuacion se
muestran las instrucciones junto con su codi cacion:
ld a,(xx) Carga el acumulador con lo que haya en la posicion de memoria indicada
por el operando. (000)
ld (xx),a Carga en la posicion xx el contenido del acumulador. (001)
and a,(xx) Realiza la operacion and entre el acumulador y lo que haya en la posicion
xx. El resultado se guarda en el acumulador. (010)
add a,(xx) Lo mismo que la anterior pero la operacion es la suma. (011)
sub a,(xx) Al acumulador se le resta lo que haya en la posicion xx. El resultado se
guarda en el acumulador. (100)
jz xx Salta a la posicion xx si el acumulador es cero. (101)
jmp xx Salta a la posicion xx. (110)
nop No hace nada. (111)
Realizar un procesador es relativamente sencillo en VHDL. Ademas tienen todos una
estructura parecida por lo que resulta facil a~nadir instrucciones y hacer el procesador lo
complicado que se desee. En el caso simple del procesador propuesto, se puede abordar
el problema con una simple maquina de estados, en la cual hay un estado inicial de
reset al que le sigue el de busqueda de instruccion. Dependiendo de la instruccion se
lee el siguiente operando y se actua en consecuencia.
Uno de los paquetes de la librera ieee es el std arith que sobrecarga los operadores
aritmeticos para que se pueda, por ejemplo, sumar un entero a un std logic vector.
Veamos la descripcion:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_arith.all;

ENTITY procesador IS
PORT(clk,rst: IN std_logic;
r_w: OUT std_logic;
dir: OUT std_logic_vector(7 DOWNTO 0);
dat: INOUT std_logic_vector(7 DOWNTO 0));
END procesador;

ARCHITECTURE descripcion OF procesador IS


TYPE estado IS (inicial,busqueda,ejec,ldxxa,ldaxx,anda,adda,suba);
SIGNAL a,pc,ir: std_logic_vector(7 DOWNTO 0);
SIGNAL rdat_in,dat_in,dat_out: std_logic_vector(7 DOWNTO 0);
SIGNAL rwaux,seldir: std_logic;
SIGNAL presente: estado:=inicial;
BEGIN

fsm:
PROCESS(clk)
BEGIN

Ingeniera Informatica Universidad de Valencia


11.2 Ejemplos para simulacion y sntesis 99
IF clk='1' THEN
CASE presente IS
WHEN inicial =>
seldir<='1'; -- dir<=pc
pc<=(OTHERS=>'0');
rwaux<='1';
ir<=(OTHERS=>'0');
a<=(OTHERS=>'0');
presente<=busqueda;
WHEN busqueda=>
ir<=dat_in;
pc<=pc+1;
IF dat_in(2 DOWNTO 0)="111" THEN presente<=busqueda;
ELSE presente<=ejec;
END IF;
WHEN ejec =>
seldir<='0'; -- dir<=dat_in
pc<=pc+1;
presente<=busqueda;
CASE ir(2 DOWNTO 0) IS
WHEN "000" =>
presente<=ldaxx;
WHEN "001" =>
dat_out<=a;
rwaux<='0'; -- Escribir
presente<=ldxxa;
WHEN "010" =>
presente<=anda;
WHEN "011" =>
presente<=adda;
WHEN "100" =>
presente<=suba;
WHEN "101" =>
seldir<='1';
IF a=0 THEN
pc<=dat_in;
END IF;
WHEN "110" =>
seldir<='1';
pc<=dat_in;
WHEN OTHERS => NULL;
END CASE;
WHEN ldaxx =>
a<=dat_in;
seldir<='1';
presente<=busqueda;
WHEN ldxxa =>
rwaux<='1';
seldir<='1';
presente<=busqueda;
WHEN anda =>
a<=a AND dat_in;
seldir<='1';
presente<=busqueda;
WHEN adda =>
a<=a+dat_in;
seldir<='1';
presente<=busqueda;
WHEN suba =>
a<=a-dat_in;
seldir<='1';
presente<=busqueda;
END CASE;
IF rst='1' THEN presente<=inicial;
END IF;
END IF;
END PROCESS fsm;

Ingeniera Informatica Universidad de Valencia


100 Utilizacion del lenguaje VHDL
latch_in: -- Registro en la entrada del bus de datos
PROCESS(clk)
BEGIN
IF clk='1' THEN rdat_in<=dat_in;
END IF;
END PROCESS latch_in;

dir<=pc WHEN seldir='1' ELSE rdat_in; -- Multiplexor de las direcciones


r_w<=rwaux;
dat<=dat_out WHEN rwaux='0' ELSE (OTHERS=>'Z'); -- Buffer de Salida
dat_in<=dat;

END descripcion;

11.2.6 La lavadora
Ejemplo 11.6 Se pretende sintetizar el chip que controla una lavadora domestica cti-
cia. La lavadora, junto con las entradas y salidas del chip que la controla, se muestran
en la gura 11.1. El funcionamiento se explica a continuacion junto con las entradas y
salidas:
Entradas:
color: Al pulsarse esta tecla se cambia un estado interno de la maquina que indica si
el ciclo de lavado es de ropa de color o no. Inicialmente se supone que no es de
color (estado a cero).
centrifuga: Cada vez que se pulsa cambia un estado interno que indica si se debe
centrifugar o no. Inicialmente se supone que no (estado a cero).
start: Cuando se pulsa se inicia el lavado, una vez en marcha este boton no hace nada.
jabon listo: Indica que el jabon ya se ha introducido en el lavado.
vacio: Indica que el tambor esta vaco de agua.
lleno: Indica que el tambor ya esta lleno de agua.
clk: Reloj para sincronizar de frecuencia 100 Hz.
Salidas:
jabon: Al ponerla a uno coge el jabon del cajetn y lo mete en el tambor en el ciclo de
lavado.
llenar: A uno abre las valvulas del agua para llenar el tambor, se debe monitorizar la
se~nal lleno para saber cuando ponerla a cero para que no entre mas agua.
vaciar: A uno abre las valvulas de salida del agua para desaguar el tambor. La se~nal
de entrada vacio indicara el momento en que no hay mas agua en el tambor.
lento: Un uno en esta se~nal hace que el motor gire, en la direccion indicada por la
se~nal direccion, con un ritmo lento. Esta velocidad se usa en todos los ciclos
menos en el centrifugado.
rapido: Lo mismo que lento pero la velocidad es la de centrifugado, o sea, mas rapida.
Si las se~nales anteriores estan las dos a cero entonces el motor esta parado, si
estan a uno las dos entonces se quema la maquina de lavar.
direccion: a uno indica que el tambor se movera a izquierdas y a cero a derechas. El
tambor debe moverse alternativamente a derecha e izquierda en todos los ciclos
menos en el de centrifugado que se mueve siempre en la misma direccion.
Ciclos de lavado:
Ingeniera Informatica Universidad de Valencia
11.2 Ejemplos para simulacion y sntesis 101
Inicial: es el estado inicial de la maquina y esta esperando a que se pulse start.
Lavado: en este ciclo se coge el jabon, se llena de agua el tambor y se pone en marcha
el motor alternativamente a izquierda y derecha. La duracion es de 10 minutos si
la ropa es de color y 20 minutos si la ropa es blanca o resistente. Cuando acaba
se vaca el agua del tambor.
Aclarado: Se llena el tambor de agua otra vez pero sin jabon. El tambor tambien se
mueve. Dura 5 minutos y hay que vaciar el agua al acabar.
Centrifugado: Si la opcion de centrifugado esta seleccionada entonces entrara en este
ciclo, sino volvera al inicial. Este ciclo consiste en mover el tambor a velocidad
rapida en un unico sentido de giro durante 10 minutos. Al acabar se vuelve al
estado inicial.

color jabon
centrifuga
start llenar
vaciar
jabon_listo
vacio lento
lleno rapido
direccion
clk

Figura 11.1: Figura del ejercicio de la lavadora

Si se pretende sintetizar el circuito es siempre preferible sincronizar la maquina de


estados con la se~nal de reloj. Se van a presentar dos posibles descripciones para la
maquina de estados, y se podran de mani esto las diferencias que se pueden dar a la
hora de sintetizar segun el tipo de maquina de estados que se realice. Hay que destacar
que tanto la simulacion de una como de otra coinciden.
En la primera descripcion ponemos las salidas en el mismo proceso donde colocamos
la transicion de estados. Lo que producira esto es que la salida cambiara un ciclo de
reloj despues de que cambie el estado, pero esto da igual ya que la frecuencia de reloj
es muy alta.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY lavadora IS
PORT (color,centrifuga,start,jabon_listo,vacio,lleno,clk: IN std_logic;
jabon,llenar,vaciar,rapido,lento,direccion: OUT std_logic);
END lavadora;

ARCHITECTURE sincrona OF lavadora IS


CONSTANT diezsec: integer:=1000; -- Estos tiempos han sido
CONSTANT cincomin: integer:=30000; -- calculados suponiendo una frecuencia
CONSTANT diezmin: integer:=60000; -- de reloj de 100 Hz.
CONSTANT veintemin: integer:=120000;
TYPE estados IS (inicial,lavado,vacia1,aclarado,vacia2,centrifugado);
SIGNAL presente: estados:=inicial;
SIGNAL coloraux,centriaux,diraux: std_logic:='0';

Ingeniera Informatica Universidad de Valencia


102 Utilizacion del lenguaje VHDL
SIGNAL tiempo: integer RANGE 0 TO 16#1FFFF# :=0;
SIGNAL subtiempo: integer RANGE 0 TO 1023 :=0;
BEGIN
maquina:
PROCESS(clk)
BEGIN
IF clk='1' THEN
CASE presente IS
WHEN inicial=>
IF start='1' THEN presente<=lavado; END IF;
jabon<='0'; llenar<='0'; vaciar<='1';
lento<='0'; rapido<='0'; diraux<='0';
tiempo<=0;
subtiempo<=0;
WHEN lavado=>
vaciar<='0';
IF jabon_listo='0' THEN jabon<='1';
ELSE jabon<='0';
END IF;
IF lleno='0' THEN
llenar<='1';
ELSE
llenar<='0';
lento<='1';
IF subtiempo=diezsec THEN
diraux<=NOT diraux;
subtiempo<=0;
ELSE
subtiempo<=subtiempo+1;
END IF;
tiempo<=tiempo+1;
IF coloraux='1' AND tiempo=diezmin THEN presente<=vacia1;
ELSIF tiempo=veintemin THEN presente<=vacia1;
END IF;
END IF;
WHEN vacia1=>
vaciar<='1';
lento<='0';
IF vacio='1' THEN presente<=aclarado;
END IF;
subtiempo<=0;
tiempo<=0;
WHEN aclarado=>
vaciar<='0';
IF lleno='0' THEN
llenar<='1';
ELSE
llenar<='0';
lento<='1';
IF subtiempo=diezsec THEN
diraux<=NOT diraux;
subtiempo<=0;
ELSE
subtiempo<=subtiempo+1;
END IF;
tiempo<=tiempo+1;
IF tiempo=cincomin THEN presente<=vacia2;
END IF;
END IF;
WHEN vacia2=>
vaciar<='1';
lento<='0';
IF vacio='1' THEN
IF centriaux='1' THEN presente<=centrifugado;
ELSE presente<=inicial;
END IF;
END IF;
tiempo<=0;

Ingeniera Informatica Universidad de Valencia


11.2 Ejemplos para simulacion y sntesis 103
WHEN centrifugado=>
rapido<='1';
tiempo<=tiempo+1;
IF tiempo=diezmin THEN presente<=inicial; END IF;
END CASE;
END IF;
END PROCESS maquina;

PROCESS(centrifuga)
BEGIN
IF centrifuga='1' THEN centriaux<=NOT centriaux; END IF;
END PROCESS;

PROCESS(color)
BEGIN
IF color='1' THEN coloraux<=NOT coloraux; END IF;
END PROCESS;

direccion<=diraux;

END sincrona;

Normalmente es buena practica poner el contador de tiempo fuera de la descripcion


de la maquina de estados, especialmente por claridad, pero en este caso hemos visto
que tambien es posible incluirla dentro. La sntesis de este circuito requiere unos 105
registros para su realizacion. El hecho de que se hayan puesto las salidas en la propia
descripcion de la maquina signi ca que vienen sincronizadas por la se~nal de reloj, y esto
signi ca que habra un registro asociado con cada una de las se~nales que haya en este
proceso.
A continuacion veremos la otra posibilidad que consiste en poner las se~nales de
salida en un proceso aparte que sera completamente combinacional, que por lo tanto
no necesitara registros adicionales, y que ademas hara que las salidas cambien a la vez
que el estado.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY lavadora2 IS
PORT (color,centrifuga,start,jabon_listo,vacio,lleno,clk: IN std_logic;
jabon,llenar,vaciar,rapido,lento,direccion: OUT std_logic);
END lavadora2;

ARCHITECTURE sincrona2 OF lavadora2 IS


CONSTANT diezsec: integer:=1000; -- Estos tiempos han sido
CONSTANT cincomin: integer:=30000; -- calculados suponiendo una frecuencia
CONSTANT diezmin: integer:=60000; -- de reloj de 100 Hz.
CONSTANT veintemin: integer:=120000;
TYPE estados IS (inicial,lavado,vacia1,aclarado,vacia2,centrifugado);
SIGNAL presente: estados:=inicial;
SIGNAL coloraux,centriaux,dirauxd,diraux: std_logic:='0';
SIGNAL tiempo: integer RANGE 0 TO 16#1FFFF# :=0;
SIGNAL subtiempo: integer RANGE 0 TO 1023 :=0;
SIGNAL subtiempores, tiempores: boolean :=TRUE;
BEGIN
maquina:
PROCESS(clk)
BEGIN
IF clk='1' THEN
CASE presente IS
WHEN inicial=>
IF start='1' THEN presente<=lavado; END IF;
WHEN lavado=>

Ingeniera Informatica Universidad de Valencia


104 Utilizacion del lenguaje VHDL
IF coloraux='1' AND tiempo=diezmin THEN presente<=vacia1;
ELSIF tiempo=veintemin THEN presente<=vacia1;
END IF;
WHEN vacia1=>
IF vacio='1' THEN presente<=aclarado;
END IF;
WHEN aclarado=>
IF tiempo=cincomin THEN presente<=vacia2;
END IF;
WHEN vacia2=>
IF vacio='1' THEN
IF centriaux='1' THEN presente<=centrifugado;
ELSE presente<=inicial;
END IF;
END IF;
WHEN centrifugado=>
IF tiempo=diezmin THEN presente<=inicial; END IF;
END CASE;
END IF;
END PROCESS maquina;

salida:
PROCESS(presente)
BEGIN
CASE presente IS
WHEN inicial=>
jabon<='0'; llenar<='0'; vaciar<='1';
lento<='0'; rapido<='0'; dirauxd<='0';
tiempores<=TRUE; subtiempores<=TRUE;
WHEN lavado=>
vaciar<='0';
rapido<='0';
IF jabon_listo='0' THEN jabon<='1';
ELSE jabon<='0';
END IF;
IF lleno='0' THEN
llenar<='1';
lento<='0';
tiempores<=TRUE;
ELSE
llenar<='0';
lento<='1';
jabon<='0';
tiempores<=FALSE;
END IF;
IF subtiempo=diezsec THEN
dirauxd<=NOT diraux;
subtiempores<=TRUE;
ELSE
subtiempores<=FALSE;
END IF;
WHEN vacia1=>
jabon<='0';
vaciar<='1';
lento<='0';
rapido<='0';
subtiempores<=TRUE;
tiempores<=TRUE;
llenar<='0';
dirauxd<='0';
WHEN aclarado=>
jabon<='0';
vaciar<='0';
rapido<='0';
IF lleno='0' THEN
llenar<='1';
lento<='0';
tiempores<=TRUE;

Ingeniera Informatica Universidad de Valencia


11.2 Ejemplos para simulacion y sntesis 105
ELSE
llenar<='0';
lento<='1';
tiempores<=FALSE;
END IF;
IF subtiempo=diezsec THEN
dirauxd<=NOT diraux;
subtiempores<=TRUE;
ELSE
subtiempores<=FALSE;
END IF;
WHEN vacia2=>
jabon<='0';
dirauxd<='0';
vaciar<='1';
lento<='0';
rapido<='0';
llenar<='0';
subtiempores<=TRUE;
tiempores<=TRUE;
WHEN centrifugado=>
jabon<='0';
dirauxd<='0';
llenar<='0';
vaciar<='1';
rapido<='1';
lento<='0';
subtiempores<=TRUE;
tiempores<=FALSE;
END CASE;
END PROCESS salida;

contador:
PROCESS(clk)
BEGIN
IF clk='1' THEN
IF subtiempores THEN
subtiempo<=0;
ELSE
subtiempo<=subtiempo+1;
END IF;
IF tiempores THEN
tiempo<=0;
ELSE
tiempo<=tiempo+1;
END IF;
END IF;
END PROCESS contador;

PROCESS(centrifuga)
BEGIN
IF centrifuga='1' THEN centriaux<=NOT centriaux; END IF;
END PROCESS;

PROCESS(color)
BEGIN
IF color='1' THEN coloraux<=NOT coloraux; END IF;
END PROCESS;

PROCESS(clk)
BEGIN
IF clk='1' THEN diraux<=dirauxd;
END IF;
END PROCESS;

direccion<=diraux;

END sincrona2;

Ingeniera Informatica Universidad de Valencia


106 Utilizacion del lenguaje VHDL
Hay que apreciar que no solo se han sacado las se~nales de salida sino que ademas
han sido necesarios mas cambios. Por una lado se ha creado un nuevo proceso para el
contador de tiempo, con lo que han sido necesarias a~nadir unas se~nales para comunicar
la maquina de estados con este proceso. Luego se han puesto todas las se~nales de salida
en cada una de las posibilidades del CASE, de esta manera ese proceso es totalmente
combinacional y ahorramos registros. Con todo esto, esa descripcion, que era equiva-
lente a la anterior, ocupa unos 70 registros, que es un numero sensiblemente inferior al
anterior.
Esto ejemplo nos ha demostrado que dos descripciones que resuelven aparentemente
el mismo problema, se pueden sintetizar de dos formas muy diferentes.

11.2.7 El concurso
Ejemplo 11.7 Se pretende realizar el modelo de un chip que controla el funcionamiento
de un programa concurso de television entre tres concursantes. La prueba que tienen que
pasar los tres concursantes es la de contestar a unas preguntas eligiendo una de las tres
respuestas que se le dan, para ello dispone de tres pulsadores cada uno. Hay un operador
humano detras del escenario que controla la maquina. Tiene tres interruptores donde
programa la respuesta correcta (correcto), un pulsador que le sirve para iniciar el juego
(start), otro pulsador que le sirve para indicar otra pregunta (nueva) y un boton de
reset para inicializarlo todo. Una vez presionado start los concursantes deben pulsar
el boton correspondiente a la pregunta que crean correcta. En el momento alguien pulse
se pasa a evaluar su respuesta (como los circuitos van a tener un retraso muy peque~no,
se supone que es imposible que dos jugadores pulsen a la vez). Si el jugador acerto la
respuesta se le sumaran 10 puntos en su marcador, pero si fallo entonces se le restaran
5 puntos. Si ningun jugador contesta en 5 segundos entonces se le restaran 5 puntos al
que tenga mayor puntuacion en ese momento (si hay varios se les resta a todos ellos).
El circuito sabra si la respuesta ha sido correcta comparandola con la que el operador
haya programado en los interruptores correcto antes de iniciar cada pregunta y que
cambiara entre pregunta y pregunta antes de pulsar nueva. Cuando algun jugador llegue
a 100 puntos o mas entonces habra ganado y el juego se parara activandose la salida
correspondiente al jugador que ha ganado. Los marcadores del resto de jugadores se
ponen a cero salvo el del que gano que conserva su valor. As se queda todo en este
estado hasta que el operador le de al reset.
La frecuencia de reloj es ja y vale 1024 Hz. En caso de pregunta acertada, fallada,
o que pasaron los 5 segundos, el operador siempre debera pulsar nueva para hacer otra
pregunta. Los interruptores se ponen y se quedan a uno o a cero hasta que se los cambie
otra vez. Los botones estan a uno mientras se pulsen, el resto del tiempo estan a cero.

En este caso se da una descripcion mas para modelado y simulacion que para sntesis,
ya que si se intenta sintetizar no sale lo que en principio debera ser. La razon es que
cuando se describe una maquina de estados sin sincrona con un reloj, el sintetizador
no lo optimiza por no reconocerlo como maquina de estados, y por otro lado esta el
problema de la interpretacion que hace el sintetizador de la lista sensible; si nos jamos
en el proceso salida, la lista sensible no es mas que la se~nal presente, lo cual signi ca
que todas las se~nales de este proceso vienen sincronizadas por el cambio de estado, esto
quiere decir que instrucciones como la de sumas 10 puntos, etc, solo tienen lugar una
vez durante el cambio de estado. Si esta descripcion se sintetiza se observa que esto
Ingeniera Informatica Universidad de Valencia
11.2 Ejemplos para simulacion y sntesis 107
no ocurre as, sino que lo que realmente sucede es que la instruccion que suma 10, por
ejemplo, se repite inde nidamente con el retraso propio de las puertas mientras el pulso
esta en alto. Esto es as porque el sintetizador supone que todas las se~nales del proceso
estan en la lista sensible y lo sintetiza como logica combinatorial y no funciona bien.
ENTITY ajugar IS
PORT (
-- Reloj de frecuencia fija 1024 Hz;
clk: IN BIT;
-- Diferentes pulsadores o botones del operador:
reset,start,nueva: IN BIT;
-- Contiene la respuesta correcta:
correcto: IN BIT_VECTOR(1 TO 3);
-- Pulsadores de los jugadores A,B,C respectivamente:
pulsaA, pulsaB, pulsaC: IN BIT_VECTOR(1 TO 3);
-- Marcadores de cada jugador A, B y C:
marcaA, marcaB, marcaC: OUT INTEGER RANGE 0 TO 255;
-- Lineas para indicar quien de todos gano:
ganaA, ganaB, ganaC: OUT BIT);
END ajugar;

ARCHITECTURE una_solucion OF ajugar IS


TYPE estado IS (inicial,responde,evalua,tiempo,final);
SIGNAL cuenta: INTEGER RANGE 0 TO 8191;
SIGNAL marcauxA,marcauxB,marcauxC: INTEGER RANGE 0 TO 255;
SIGNAL timeout: BOOLEAN; -- Para indicar paso de 5 segundos.
SIGNAL pulsaron: BOOLEAN; -- Para saber si alguien pulso.
SIGNAL fin: BOOLEAN; -- Para saber cuando se llega al final.
SIGNAL rescont: BOOLEAN; -- Pone a cero la cuenta.
SIGNAL presente: estado;

BEGIN
marcaA<=marcauxA; -- Senyales auxiliares para poder
marcaB<=marcauxB; -- leer la salida
marcaC<=marcauxC;

contador:
PROCESS(clk)
BEGIN
IF clk='1' THEN
IF rescont THEN cuenta<=0; -- Para inicializar la cuenta
ELSE cuenta<=cuenta+1;
END IF;
END IF;
END PROCESS contador;

timeout<=true WHEN cuenta=5120 ELSE false; -- pasaron 5 segundos


pulsaron<=true WHEN (pulsaA/="000" OR pulsaB/="000" OR pulsaC/="000")
ELSE false;
fin<=true WHEN (marcauxA>=100 OR marcauxB>=100 OR marcauxC>=100)
ELSE false;

maquina:
PROCESS(reset,start,nueva,pulsaron,timeout,fin) -- senyales que cambian
BEGIN -- el estado presente.
IF reset='1' THEN presente<=inicial;
ELSE
CASE presente IS
WHEN inicial=>
IF start='1' THEN presente<=responde; END IF;
WHEN responde=>
IF pulsaron THEN presente<=evalua;
ELSIF timeout THEN presente<=tiempo;
END IF;
WHEN evalua=>
IF fin THEN presente<=final;
ELSIF nueva='1' THEN presente<=responde;

Ingeniera Informatica Universidad de Valencia


108 Utilizacion del lenguaje VHDL
END IF;
WHEN tiempo=>
IF nueva='1' THEN presente<=responde; END IF;
WHEN final=>
NULL;
END CASE;
END IF;
END PROCESS maquina;

salida:
PROCESS(presente)
BEGIN
CASE presente IS
WHEN inicial=>
marcauxA<=0;
marcauxB<=0;
marcauxC<=0;
ganaA<='0';
ganaB<='0';
ganaC<='0';
rescont<=true;
WHEN responde=>
rescont<=false;
WHEN evalua=>
rescont<=true;
IF pulsaA/="000" THEN
IF pulsaA=correcto THEN marcauxA<=marcauxA+10;
ELSIF marcauxA>=5 THEN marcauxA<=marcauxA-5;
END IF;
END IF;
IF pulsaB/="000" THEN
IF pulsaB=correcto THEN marcauxB<=marcauxB+10;
ELSIF marcauxB>=5 THEN marcauxB<=marcauxB-5;
END IF;
END IF;
IF pulsaC/="000" THEN
IF pulsaC=correcto THEN marcauxC<=marcauxC+10;
ELSIF marcauxC>=5 THEN marcauxC<=marcauxC-5;
END IF;
END IF;
WHEN tiempo=>
rescont<=true;
IF marcauxA>=5 AND marcauxA>=marcauxB AND marcauxA>=marcauxC THEN
marcauxA<=marcauxA-5;
END IF;
IF marcauxB>=5 AND marcauxB>=marcauxA AND marcauxB>=marcauxC THEN
marcauxB<=marcauxB-5;
END IF;
IF marcauxC>=5 AND marcauxC>=marcauxB AND marcauxC>=marcauxA THEN
marcauxC<=marcauxC-5;
END IF;
WHEN final=>
IF marcauxA>=100 THEN
marcauxB<=0;
marcauxC<=0;
ganaA<='1';
END IF;
IF marcauxB>=100 THEN
marcauxA<=0;
marcauxC<=0;
ganaB<='1';
END IF;
IF marcauxC>=100 THEN
marcauxB<=0;
marcauxA<=0;
ganaC<='1';
END IF;
END CASE;

Ingeniera Informatica Universidad de Valencia


11.2 Ejemplos para simulacion y sntesis 109
END PROCESS salida;

END una_solucion;

Aparte de que la maquina de estados no es sncrona con un reloj, hay otra diferencia
con otras descripciones que hemos visto, y es que el contador del tiempo esta situado
en un proceso aparte, que no es raro, y se han utilizado unas se~nales para indicar los
nales de cuenta.

11.2.8 El pin-ball
Ejemplo 11.8 Realizar la descripcion en VHDL del controlador de una maquina de
pin-ball. La maquina tiene un marcador que se incrementa segun donde toque la bola,
tiene dos pivotes de manera que segun de la bola en uno u otro se suman 5 o 10 puntos
respectivamente. Cada 100 puntos se obtiene una bola nueva. Tambien tiene dos tacos
que son los de darle a la bola y otro que sirve para lanzar la bola al principio. Ademas
esta la ranura por donde se mete la moneda.
Para controlar la maquina se necesitan las siguientes entradas:
p uno, p dos: se ponen a '1' cuando la bola choca contra el pivote uno o dos. Van a
servir para saber que valor hay que sumar al marcador; si le da al pivote p uno
se suman 5 y al otro 10.
falta: esta se~nal se pone a '1' cuando se empuja bruscamente la maquina para hacer
trampa. Cuando esta se~nal se pone a uno, los tacos deben paralizarse y quedarse
as hasta que la bola se pierda por el agujero.
nueva: sirve para indicar que se ha introducido una moneda y que empieza la partida
(por simplicidad no se considera el caso en el que se introducen varias monedas
para tener mas partidas.)
pierde: sirve para indicar que se ha perdido la bola por el agujero y que por tanto hay
que restar una bola a las que quedan. Cuando no quedan mas bolas se detiene el
juego.
clk: se~nal de reloj para sincronizar el circuito. Su frecuencia se supone mucho mas alta
que el tiempo que estan activas las se~nales de p uno, p dos, nueva y pierde.
A partir de dichas entradas el circuito debe producir las siguientes salidas:
marcador: Es un bus de 12 lneas que se conecta al marcador electronico de la maquina
y que contiene la cuenta de puntos.
bloqueo: mientras esta a '1' los tacos no funcionan. Debe estar a '1' mientras no se
juega o desde que se movio la maquina bruscamente (falta) hasta que sale una
nueva bola.
n: Cuando se acaban las bolas esta se~nal se pone a '1' para encender un gran panel
luminoso que pone 'Fin de juego. Inserte moneda'.
Tener en cuenta que el marcador no debe ponerse a cero al acabar el juego, sino que
debe hacerlo en el momento de empezar a jugar despues de insertar la moneda.
Como es habitual, el problema se puede solucionar mediante una maquina de estados
que hacemos sncrona para que resulte sencilla la sntesis del circuito.
Se ha utilizado una maquina de estados con un unico proceso, esto en principio no
nos supone ningun problema ya que importa poco que las se~nales de salida esten un
Ingeniera Informatica Universidad de Valencia
110 Utilizacion del lenguaje VHDL
ciclo de reloj retrasadas respecto del cambio de estado, debido a que la se~nal de reloj
se supone de una frecuencia elevada.
Como aspecto novedoso en este ejemplo se puede ver el tratamiento que se ha
seguido con los pulsos producidos por los pivotes y el pulso producido cuando se pierde
la bola (pierde). Ya se comento al inicio del captulo que un error comun se daba en
el tratamiento de pulsos mas largos que la se~nal reloj, que provocaba que una misma
operacion se repitiera una y otra vez mientras dura el pulso. En este caso se ha evitado
creando un pulso auxiliar que tiene la duracion de un pulso de reloj y que por tanto
solo se procesa una vez. Estos pulsos se han creado al nal en los procesos d pierde,
d p uno y d p dos. Por lo dem as el programa sigue las reglas basicas para sntesis vistas
en el resto de ejemplos.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY pinball IS
PORT (p_uno,p_dos,falta,nueva,pierde,clk : IN std_logic;
marcador: OUT integer RANGE 0 TO 4095; -- 12 bits
bloqueo,fin: OUT std_logic);
END pinball;

ARCHITECTURE sincrono OF pinball IS


TYPE estado IS (insertar,inicia,juega,suma_cinco,suma_diez,trampa,resta);
SIGNAL marcaux: integer RANGE 0 TO 4095 :=0; -- Auxiliar para leer la salida
SIGNAL cien: integer RANGE 0 TO 127 :=0; -- Servira para las bolas extras
SIGNAL bolas: integer RANGE 0 TO 31 :=0; -- Almacena el numero de bolas
SIGNAL d_p_uno,d_p_dos,d_pierde: std_logic; -- Auxiliares para esas entradas
SIGNAL presente: estado:=insertar;
BEGIN
maquina:
PROCESS(clk)
BEGIN
IF clk='1' THEN
CASE presente IS
WHEN insertar=>
IF nueva='1' THEN presente<=inicia;
END IF;
fin<='1';
bloqueo<='1';
WHEN inicia=>
presente<=juega;
fin<='0';
marcaux<=0;
cien<=0;
bloqueo<='0';
bolas<=5;
WHEN juega=>
IF d_pierde='1' THEN presente<=resta; END IF;
IF falta='1' THEN presente<=trampa; END IF;
IF bolas=0 THEN presente<=insertar; END IF;
IF d_p_uno='1' THEN presente<=suma_cinco; END IF;
IF d_p_dos='1' THEN presente<=suma_diez; END IF;
IF cien>=100 THEN
cien<=0;
bolas<=bolas+1;
END IF;
IF bolas=0 THEN presente<=insertar; END IF;
bloqueo<='0';
WHEN suma_cinco=>
presente<=juega;
marcaux<=marcaux+5;
cien<=cien+5;
WHEN suma_diez=>
presente<=juega;

Ingeniera Informatica Universidad de Valencia


11.3 Ejercicios propuestos 111
marcaux<=marcaux+10;
cien<=cien+10;
WHEN resta=>
bolas<=bolas-1;
presente<=juega;
WHEN trampa=>
IF d_pierde='1' THEN presente<=resta; END IF;
bloqueo<='1';
END CASE;
END IF;
END PROCESS maquina;

-- Como estos pulsos de entrada son mucho mas largos que el periodo del reloj
-- se crean estas senyales que son lo mismo pero duran un 'unico pulso.
d_pierde:
PROCESS(pierde,presente)
BEGIN
IF presente=resta OR presente=inicia THEN d_pierde<='0';
ELSIF pierde='1' AND pierde'EVENT THEN d_pierde<='1';
END IF;
END PROCESS;

d_p_uno:
PROCESS(p_uno,presente)
BEGIN
IF presente=suma_cinco OR presente=inicia THEN d_p_uno<='0';
ELSIF p_uno='1' AND p_uno'EVENT THEN d_p_uno<='1';
END IF;
END PROCESS;

d_p_dos:
PROCESS(p_dos,presente)
BEGIN
IF presente=suma_diez OR presente=inicia THEN d_p_dos<='0';
ELSIF p_dos='1' AND p_dos'EVENT THEN d_p_dos<='1';
END IF;
END PROCESS;

-- Finalmente se pone el marcador igual a su auxiliar.


marcador<=marcaux;

END sincrono;

11.3 Ejercicios propuestos


Ejemplo 11.9 Realizar la descripcion del circuito de control de un microondas. Las
entradas al sistema son:
Minuto Es un boton que incrementa el contador del tiempo de coccion en 60 segundos.
Marcha Cuando se pulsa se inicia la marcha del horno, y no se parara hasta que se
abra la puerta o la cuenta llegue al nal o se pulse la tecla de stop reset.
Stop Reset Es un boton que si se pulsa con el horno en marcha lo detiene, pero la
cuenta conserva su valor. Si se pulsa con el horno parado la cuenta se pone a
cero.
Puerta Es una entrada que cuando esta a uno indica que la puerta esta abierta, y a
cero indica que esta cerrada.
clk Es el reloj de entrada con un periodo de 125 ms.
Las salidas del circuito a realizar seran:
Segundos(9..0) Estas 10 lneas le indican a una pantalla el numero de segundos de
Ingeniera Informatica Universidad de Valencia
PROBLEMAS RESUELTOS DE CIRCUITOS DIGITALES II BASADO EN VHDL
3) Implementa en VHDL una máquina de estados finitos (FSM) que controle un bloque de
memoria. La FSM recibe dos entradas, ready que indica cuando la memoria esta
preparada, read/write (r_w) que indica si se desea realizar una lectura o escritura y una
señal de reset. La FSM genera dos variables, oe y we que se aplican al “output enable”
y al “write enable” del bloque de memoria. El diagrama de transición de estados y la
tabla de variables de salida en función del estado se indican a continuación.

Tabla de Salida
Estado oe we
idle 0 0
start 0 0
writing 0 1
reading 1 0

Diagrama de estados:

idle

Ready=1
Reset=1 Reset=1
Ready=1 Ready=1

writing reading

Reset=1

start
r_w=1
r_w=0

Solución:
library ieee;
use ieee.std_logic_1164.all;

entity exemple_FSM is
port( r_w, ready: in std_logic;
reset, clk: in std_logic;
oe, we: out std_logic);
end exemple_FSM;

architecture implementacio_FSM of exemple_FSM is


type estats is (idle, start, writing, reading);
signal estat_actual: estats;
begin
procediment: process (r_w, ready, reset, clk) begin
if reset= ‘1’ then
estat_actual <= idle;
elsif (clk’event and clk = ‘1’) then
case estat_actual is
when idle => oe <= ’0’; we <= ‘0’;
if ready = ‘1’ then
estat_actual <= start;
else
estat_actual <= idle;
end if;
when start => oe<= ‘0’; we <= ‘0’;
if r_w = ‘1’ then
estat_actual <= reading;
else
estat_actual <= writing;
end if;
when reading => oe <= ‘1’; we <= ‘0’;
if ready = ‘1’ then
estat_actual <= idle;
else
estat_actual <= reading;
end if;
when writing => oe <=’0’; we <= ‘1’;
if ready = ‘1’ then
estat_actual <= idle;
else
estat_actual <= writing;
end if;
end case;
end if;
end process procediment;
end implementacio_FSM;
4) Se desea implementar un bloque de control del movimiento de un ROBOT. Este bloque
tendrá seis señales de entrada D, I, A, R, P, B (indicando respectivamente si se quiere
girar a la Derecha o la Izquierda, Avanzar, Retroceder, Pararse o indicar que las baterias
están bajas). En total tendremos seis estados posibles. Implementa un diagrama de
estados que realice este comportamiento además de su implementación en VHDL.

B=1
B=0
Bateria
P=1 Baja
Avance

B=0 B=0
A=1
P=1
I=1
Izqu. Parado Dcha. B=0
D=1

P=1
R=1

P=1
Retroceso

B=0
ENTITY controlRobot IS
PORT(
clk,D,I,A,R,P,B: IN bit;
Salida: OUT INTEGER RANGE 0 TO 5);
END controlRobot;
ARCHITECTURE flujo OF controlRobot IS
TYPE estado IS (parado, retroceder, avanzar, izquierda, derecha, BateriaBaja);
SIGNAL presente: estado:=parado;
BEGIN
proceso:PROCESS (clk)
BEGIN
IF (clk'EVENT AND clk='1') THEN
CASE presente IS
WHEN parado =>
IF B='1' THEN
presente<=BateriaBaja;
ELSIF P='1' THEN
presente<=parado;
ELSIF A='1' THEN
presente<=avanzar;
ELSIF R='1' THEN
presente<=retroceder;
ELSIF D='1' THEN
presente<=derecha;
ELSIF I='1' THEN
presente<=izquierda;
ELSE
presente<=parado;
END IF;
WHEN retroceder =>
IF B='1' THEN
presente<=BateriaBaja;
ELSIF P='1' THEN
presente<=parado;
ELSIF R='1' THEN
presente<=retroceder;
ELSIF A='1' THEN
presente<=avanzar;
ELSIF D='1' THEN
presente<=derecha;
ELSIF I='1' THEN
presente<=izquierda;
ELSE
presente<=retroceder;
END IF;
WHEN avanzar =>
IF B='1' THEN
presente<=BateriaBaja;
ELSIF P='1' THEN
presente<=parado;
ELSIF A='1' THEN
presente<=avanzar;
ELSIF R='1' THEN
presente<=retroceder;
ELSIF D='1' THEN
presente<=derecha;
ELSIF I='1' THEN
presente<=izquierda;
ELSE
presente<=avanzar;
END IF;
WHEN derecha =>
IF B='1' THEN
presente<=BateriaBaja;
ELSIF P='1' THEN
presente<=parado;
ELSIF D='1' THEN
presente<=derecha;
ELSIF A='1' THEN
presente<=avanzar;
ELSIF R='1' THEN
presente<=retroceder;
ELSIF I='1' THEN
presente<=izquierda;
ELSE
presente<=derecha;
END IF;
WHEN izquierda =>
IF B='1' THEN
presente<=BateriaBaja;
ELSIF P='1' THEN
presente<=parado;
ELSIF I='1' THEN
presente<=izquierda;
ELSIF A='1' THEN
presente<=avanzar;
ELSIF R='1' THEN
presente<=retroceder;
ELSIF D='1' THEN
presente<=derecha;
ELSE
presente<=izquierda;
END IF;
WHEN BateriaBaja =>
IF B='0' THEN
presente<=parado;
ELSE
presente<=BateriaBaja;
END IF;
END CASE;
END IF;
END PROCESS proceso;
Salida <= 0 WHEN presente=parado ELSE
1 WHEN presente=BateriaBaja ELSE
2 WHEN presente=avanzar ELSE
3 WHEN presente=retroceder ELSE
4 WHEN presente=izquierda ELSE
5;
END flujo;

También podría gustarte