Subido por Arturo Santiago

FSM vhdl jmjjjjjjjjj

Anuncio
Capı́tulo 1
Introducción
La implementación de procesos relacionados con la automatización está basada generalmente en el
funcionamiento en sistemas secuenciales sı́ncronos. Un sistema secuencial está formado de dos partes.
La primera es una parte combinacional mientras que la segunda son elementos de memoria. Estos elementos de memoria son básicamente registros de almacenamiento. Estos registros almacenan el estado
presente del sistema, por lo que las salidas de dichos registros generan el valor del estado presente mientras que las entradas a los mismos registros generan el estado siguiente. El estado presente del sistema
puede ser actualizado tan pronto como el estado siguiente del sistema cambie. Si este último cambio
se da cuando una señal de reloj cambia, se dice que el sistema es sı́ncrono pero si el cambio se da sin
referencia a una señal de reloj, entonces se dice que el sistema es ası́ncrono.
Un sistema secuencial sı́ncrono tiene como elemento fundamental el flip-flop, el cual es un elemento
de memoria utilizado para almacenar el estado en que se encuentre el sistema, además de almacenar
y definir la secuencia del sistema. La sincronı́a condiciona a que todos los flip-flops se conecten a la
misma señal de reloj, de forma tal que sólo se produzca un cambio de estado en el sistema cuando
ocurra un flanco o borde de disparo en la señal de reloj. Existe una división en el diseño de los sistemas
secuenciales sı́ncronos que se refiere al momento en que se produzca la salida del sistema. A estos
sistemas se les conoce como máquina Mealy o máquina Moore. En una máquina Mealy la señal de salida
depende tanto del estado en que se encuentra el sistema como de los valores de las entradas que se
aplican en determinado momento. Mientras que en una máquina Moore la salida depende solamente
del estado presente. Ambas máquinas son conocidas como máquina de estado finito, del inglés Finite
State Machine (FSM), debido a que tienen un estado interno que cambia. Las FSM son esenciales en el
diseño de sistemas secuenciales.
1
2
CAPÍTULO 1. INTRODUCCIÓN
Capı́tulo 2
Máquina de Estado Finito (FSM)
Una FSM puede ser descrita usando constructores VHDL concurrentes, pero existe una manera alterna de hacerlo y esto es utilizando VHDL secuencial, i.e., un proceso. Un proceso es evaluado cuando
al menos una señal de su lista de sensibilidad cambia. Si el proceso modela un bloque combinacional
entonces todas las entradas combinacionales deberán estar presentes en la lista de sensibilidad para que
el proceso sea ejecutado o ”despertado”. Una FSM cambia de estado en el borde o flanco de reloj. Por lo
tanto, la lista de sensibilidad de un proceso modelando una FSM, debe incluir el reloj, o éste debe ser
incluido en una sentencia wait. Recuerde que si una señal es incluida en la lista de sensibilidad de un
proceso entonces no puede aparecer en el mismo proceso la sentencia wait. La decisión para cambiar de
estado tiene que ser hecha en el borde de reloj correspondiente. El estado del sistema puede ser mantenido en una señal. El estado puede ser representado por un tipo (type) enumerado. Generalmente los
valores posibles de este tipo enumerado son los nombres de los estados. Esto conduce a que un estilo
común de modelar una FSM en VHDL use dos procesos. El primer proceso modela los registros de estados,
mientras que el segundo proceso (process) modela el estado siguiente y la salida lógica.
2.1.
Ejemplo 1
0/0
0/0
1/0
EDO 0
1/1 0/0
0/0
EDO 3
1/0
EDO 1
1/0
EDO 2
Figura 2.1: Máquina de estados finitos.
Ejemplo.
Escribir un programa en VHDL para el diagrama de estados de la figura 2.1.
Solución.
Del diagrama de estados de la figura 2.1 se concluye que se trata de una FSM que cuenta la secuencia
3
4
CAPÍTULO 2. MÁQUINA DE ESTADO FINITO (FSM)
de cuatro bits de valor ’1’, i.e., la secuencia debe ser ”1111”, y en el caso en que no se cumpla con esta
secuencia, se debe reiniciar la secuencia, regresando al estado cero (EDO 0). Cuando se cumple con la
secuencia correcta, entonces la salida es ’1’, de otra forma la salida es ’0’. Para saber cuál será el estado
siguiente se necesita conocer tanto el estado actual ası́ como el valor de la entrada, entonces se trata de
una FSM tipo Mealy.
Esta FSM puede ser modelada con VHDL de manera secuencial, i.e., utilizando procesos. Para una
mayor claridad en el código, la FSM se divide esencialmente en dos procesos. El primero evalúa tanto
los valores del estado actual como de la entrada; el segundo actualiza el valor del estado basándose en
el borde de la señal de reloj (clk).
El Proceso 1, cuyo código se muestra en la figura 2.3, modela el registro de estados. Por lo tanto, dicho
proceso considera tanto a las señales edo actual como entrada. Por ello dichas señales son incluidas en
la lista de sensibilidad de este proceso. Además, como la FSM dispone de cuatro estados, entonces se
puede utilizar la sentencia case, la cual permite seleccionar si el estado actual coincide con alguno de
estos cuatro estados. Por lo tanto, el selector de la sentencia case es la señal edo actual. En cada when
dependiendo del estado con el que coincida, se asigna el valor que le corresponde a la señal salida.
Seguido de ello se evalúa la señal entrada y dependiendo tanto del estado ya evaluado como del valor de
esta última señal de entrada, se asigna el estado siguiente. De esta forma, cada estado y su entrada de la
FSM es evaluado. La figura 2.2 ilustra de manera resumida el Proceso 1. En dicha figura EDO x puede
tomar un valor de cualquiera de los cuatro estados: EDO 0, EDO 1, EDO 2, EDO 3 y salida puede tomar
el valor de k, donde k puede tomar el valor de ’0’ o de ’1’.
edo siguiente <= EDO x
salida <= k
Figura 2.2: Actualización de los valoresestado siguiente y salida.
Ası́, una opción para describir el Proceso 1 en VHDL es listado de la figura 2.3.
2.1. EJEMPLO 1
5
1.
proceso1: process (entrada, edo actual)
2.
begin
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
case edo actual is
when EDO 0 => salida <= ‘0’;
if entrada = ‘1’ then
edo siguiente <= EDO 1;
else
edo siguiente <= EDO O;
end if;
when EDO 1 => salida <=’0’;
if entrada = ‘l’ then
edo siguiente <= EDO 2;
else
edo siguiente <= EDO 0;
end if;
when EDO 2 => salida <= ‘0’;
if entrada = ‘l’ then
edo siguiente <= EDO 3;
else
edo siguiente <= EDO O;
end if;
when EDO 3 =>
if entrada = ‘l’ then
24.
edo siguiente <= EDO O;
25.
salida <= ‘1’;
26.
else
27.
edo siguiente <= EDO 0;
28.
salida <= ‘0’;
29.
30.
31.
end if;
end case;
end process proceso1;
Figura 2.3: Proceso 1 para el contador de cuatro bits.
El Proceso 2, describe la actualización del valor del estado actual. Esto para que una vez actualizado
el valor del estado actual, éste pueda ser utilizado en el Proceso 1 la próxima vez que este último sea
ejecutado. Para actualizar el valor del estado actual, se debe realizar lo siguiente:
1) Determinar el borde o flanco de reloj de la señal correspondiente que debe ser utilizado para
realizar el cambio de estado, i.e., la transferencia del valor del estado siguiente al estado actual. El
borde de la señal de reloj puede ser de subida o de bajada. En este caso se utiliza el flanco de subida
para el cambio de estado. Por lo que la sentencia queda: if(clk ‘event and clk = ‘1’).
2) Actualizar el valor del estado actual, lo cual se hace transfiriendo el valor del estado actual al estado
6
CAPÍTULO 2. MÁQUINA DE ESTADO FINITO (FSM)
siguiente. La sentencia queda como: edo siguiente <= edo actual;
Una opción para describir el Proceso 2 en VHDL es el mostrado en la figura 2.4.
proceso2: process(clk)
begin
if (clk ’event and clk = ’1’) then
edo actual <= edo siguiente;
end if;
end process proceso2;
Figura 2.4: Actualización del valor del estado actual.
La figura 2.5 muestra un ejemplo del código en VHDL completo.
2.1. EJEMPLO 1
7
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
library ieee;
use ieee.std logic 1164.all;
use ieee.std logic arith.all;
use ieee.std logic unsigned.all;
entity Cuenta 1s is
port(
clk: in std logic;
entrada: in std logic;
salida: out std logic;
estado: out std logic vector (1 downto 0));
end;
architecture Arq Cuenta 1s of Cuenta 1s is
type estados is (EDO 0, EDO 1, EDO 2, EDO 3);
signal EDO TEMPO : std logic vector(1 downto 0):=”00”;
signal edo actual, edo siguiente : estados;
begin
proceso1: process (entrada, edo actual)
begin
case edo actual is
when EDO 0 => salida <= ‘0’;
if entrada = ‘1’ then
edo siguiente <= EDO 1;
else
edo siguiente <= EDO O;
end if;
when EDO 1 => salida <=’0’;
if entrada = ‘1’ then
edo siguiente <= EDO 2;
else
edo siguiente <= EDO 0;
end if;
when EDO 2 => salida <= ‘0’;
if entrada = ‘1’ then
edo siguiente <= EDO 3;
else
edo siguiente <= EDO O;
end if;
when EDO 3 =>
if entrada = ‘1’ then
edo siguiente <= EDO O;
salida <= ‘1’;
else
edo siguiente <= EDO 0;
salida <= ‘0’;
end if;
end case;
end process proceso1;
proceso2:process(clk)
begin
if(clk ’event and clk = ’1’) then
edo actual <= edo siguiente;
end if;
end process proceso2;
end Arq Cuenta 1s;
Figura 2.5: Programa completo para el contador de cuatro bits.
§§§
8
2.2.
CAPÍTULO 2. MÁQUINA DE ESTADO FINITO (FSM)
Ejemplo 2
0/0
0/0
EDO 0
1/0
1/1
EDO 1
1/0
0/0
EDO 2
Figura 2.6: FSM que detecta secuencia de tres unos consecutivos(1s).
Ejemplo.
Escribir un circuito en VHDL para el diagrama de estados de la figura 2.2.
Solución.
Del diagrama de estados de la figura 2.2 se observa que cuando se detecta la secuencia de tres 1s de
manera consecutiva, i.e., un valor de 1 en cada entrada correspondiente a cada estado, entonces la
salida toma el valor de 1; pero en cuanto detecta un valor de entrada de 0 en un estado en particular, se
queda en ese estado en el que se encuentra la FSM y la salida toma el valor de 0. La figura 2.7 presenta
el código en VHDL para esta FSM. En este ejemplo, con la finalidad de aclarar los estados se simplifca
la etiqueta de cada estado. Ası́ para EDO 0 se le asigno E0, a EDO 1 se le asigno E1, y para EDO 2 se le
asigno E2.
2.2. EJEMPLO 2
9
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
library ieee;
use ieee.std logic 1164.all;
use ieee.std logic arith.all;
use ieee.std logic unsigned.all;
entity FSM 1 is
port(
CLK: in std logic ;
Salida: out std logic ;
Estado: out std logic vector(1 downto 0);
Entrada: in std logic );
end;
architecture FSM of FSM 1 is
type estados is (E0,E1,E2);
signal edo presente,
edo futuro:estados;
signal EDO TEMPO :
std logic vector(1 downto 0):=”00”;
begin
p 1:process(edo presente,Entrada)
begin
case edo presente is
when E0 => Salida <= ’0’;
EDO TEMPO <= ”00”;
if (Entrada = ’0’) then
edo futuro <= E0;
else
edo futuro <= E1;
end if;
when E1 => Salida <= ’0’;
EDO TEMPO <= ”01”;
if (Entrada = ’0’) then
edo futuro <= E1;
else
edo futuro <= E2;
end if;
when E2 =>
EDO TEMPO <= ”10”;
if (Entrada = ’0’) then
edo futuro <= E2;
Salida <= ’0’;
else
edo futuro <= E0;
Salida <= ’1’;
end if;
end case;
end process p 1;
Estado <= EDO TEMPO;
48.
49.
50.
51.
52.
53.
54.
p 2: process(CLK)
begin
if(CLK ’event and CLK = ’1’) then
edo presente <= edo futuro;
end if;
end process p 2;
end FSM;
Figura 2.7: Programa completo para el contador de tres bits.
10
CAPÍTULO 2. MÁQUINA DE ESTADO FINITO (FSM)
Como se observa del código 2.7, esta FSM se describe utilizando dos procesos p 1 y p 2.
§§§
2.3.
Ejemplo 3
Ejemplo.
Escribir un programa en VHDL que maneje un elevador. Éste puede estar en uno de dos pisos: planta
baja o primer piso. Hay un botón que controla el elevador y tiene dos valores: Subiendo o Bajando.
También hay dos luces en el elevador que indican el piso actual: Rojo para Planta baja, y Verde para
Primer piso. En cada piso, el controlador checa el piso actual y la entrada actual, cambia el piso y las
luces en la manera obvia.
Subiendo
Bajando
Subiendo
Planta Baja
Primer Piso
Bajando
Figura 2.8: Diagrama de estados para el elevador.
Solución.
La figura 2.8 ilustra el diagrama de estados para este elevador. En dicha figura se identifican dos estados
ası́ como sus respectivos valores de entrada y de salida. Y en la figura 2.9 se presenta el código en VHDL
para el manejo del elevador.
2.3. EJEMPLO 3
11
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
library ieee;
use ieee.std logic 1164.all;
use ieee.std logic arith.all;
use ieee.std logic unsigned.all;
– boton piso = ’0’ ==> Planta Baja
– boton piso = ’1’ ==> Primer Piso
– luz piso = ’0’ ==> Rojo
– luz piso = ’1’ ==> Verde
entity Elevador is
port(
Clk:in std logic;
Boton Piso: in std logic;
Luz Piso: out std logic;
Piso Real: out std logic);
end;
architecture Arq Elevador of Elevador is
type pisos is (Planta Baja, Primer Piso);
signal Piso Actual, Piso Siguiente:pisos;
signal Color Luz:std logic;
signal Piso Tempo:std logic;
begin
Proceso 1:process(Boton Piso, Piso Actual)
begin
case Piso Actual is
when Planta Baja => Color Luz <= ’0’;
Piso Tempo <= ’0’;
if(Boton Piso = ’0’) then
Piso Siguiente <= Planta Baja;
else
Piso Siguiente <= Primer Piso;
end if;
when Primer Piso => Color Luz <= ’1’;
Piso Tempo <= ’1’;
if(Boton Piso = ’0’) then
Piso Siguiente <= Planta Baja;
else
Piso Siguiente <= Primer Piso;
end if;
end case;
end process Proceso 1;
Piso Real <= Piso Tempo;
Luz Piso <= Color Luz;
Proceso 2:process(Clk)
begin
if(Clk’event and Clk = ’1’) then
Piso Actual <= Piso Siguiente;
end if;
end process Proceso 2;
end Arq Elevador;
Figura 2.9: Programa en VHDL para el elevador.
Del código en VHDL de la figura 2.9 se identifican claramente los dos procesos sugeridos para la implementación de una FSM. Lo cual le da no sólo robustez al programa completo sino también claridad.
§§§
12
2.4.
CAPÍTULO 2. MÁQUINA DE ESTADO FINITO (FSM)
Ejemplo 4
Ejemplo.
Escribir un programa en VHDL para el circuito one hot representado en el diagrama de estados por la
figura 2.10.
E=0
0001
E=0
0010
E=1
E=1
E=1
E=0
E=0
1000
0100
E=1
Figura 2.10: Diagrama de estados para el One hot
Solución.
Del diagrama de estados de la figura 2.10, se observa que además de estar formado por cuatro estados,
no dispone de una salida sino solamente del estado actual y el valor de entrada. De cualquier manera
este one hot puede ser descrito en lenguaje VHDL utilizando dos procesos. La figura 2.11 presenta el
programa para este diagrama de estados.
2.4. EJEMPLO 4
13
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
library ieee;
use ieee.std logic 1164.all;
use ieee.std logic arith.all;
use ieee.std logic unsigned.all;
entity Ctor OneHot is
port(
clk : in std logic;
Entrada: in std logic;
Estado: out std logic vector (3 downto 0));
end;
architecture Arq Ctor OneHot of Ctor OneHot is
type Estados is (EDO 1, EDO 2, EDO 4, EDO 8);
signal Estado Actual, Estado Siguiente: Estados;
signal EDO TEMPO: std logic vector (3 downto 0);
begin
P1:process(Entrada, Estado Actual)
begin
case Estado Actual is
when EDO 1 =>
EDO TEMPO <= ”0001”;
if(Entrada = ’1’) then
Estado Siguiente <= EDO 2;
else
Estado Siguiente <= EDO 1;
end if;
when EDO 2 =>
EDO TEMPO <= ”0010”;
if(Entrada = ’1’) then
Estado Siguiente <= EDO 4;
else
Estado Siguiente <= EDO 2;
end if;
when EDO 4 =>
EDO TEMPO <= ”0100”;
if(Entrada = ’1’) then
Estado Siguiente <= EDO 8;
else
Estado Siguiente <= EDO 4;
end if;
when EDO 8 =>
EDO TEMPO <= ”1000”;
if(Entrada = ’1’) then
Estado Siguiente <= EDO 1;
else
Estado Siguiente <= EDO 8;
end if;
end case;
end process P1;
Estado <= EDO TEMPO; – Actualiza la salida
P2: process (clk)
begin
if(clk ’event and clk = ’1’) then
Estado Actual <= Estado Siguiente;
end if;
end process P2;
end Arq Ctor OneHot;
14
CAPÍTULO 2. MÁQUINA DE ESTADO FINITO (FSM)
Figura 2.11: Programa en VHDL para el one hot.
§§§
Capı́tulo 3
Resumen
Como en todo diseño de un sistema digital resulta necesario identificar si tal sistema es sı́ncrono o
ası́ncrono. Además es de utilidad identificar si el valor de la salida del sistema depende exclusivamente
del estado actual o también del valor de entrada, permitiendo tratar al sistema como una máquina
Mealy o Moore. La implementación de tales máquinas en VHDL es directa como se ha presentado en
este capı́tulo.
Υ Υ Υ
15
Descargar