Sunteți pe pagina 1din 60

DESCRIEREA AUTOMATELOR FINITE

1)

AUTOMATE de tip MOORE

Ieirile depind numai de starea actual a automatului


(nu depind direct de intrri).

X
starea
actual
Q

starea
actual

starea
urmtoare

intrarea
Logica
strii
urmtoare
( CLC )

Q+

Registrul
de
stare
(memorie)

Q+ = f(X,Q)

Logica ieirea
de
Y
ieire
( CLC )
Y = g(Q)

clk

- intrarea X
- ieirea Y
Specificarea automatului
:
- strile
(variabilele de stare) Q
- funcia strii urmtoare Q+ = f(X,Q)
- funcia ieirii (tip Moore) Y = g(Q)

Reprezentarea automatelor prin diagrama (graful) strilo


denumirea
strii
(eticheta)
codul
(variabila)
strii
condiii de
tranziie
starea
ieirea Y <=
Q = 0110

condiii de
meninere
a strii
starea

=> ieirea Y
Q = 0100
condiii de
tranziie

starea
ieirea Y <=
Q = 1010

Exemplu : distribuitor de Coca-cola i Pepsi-cola

port I/O

initializare
fisa
coca
pepsi
clk

iesire_coca
prezeta_coca
prezeta_pepsi

iesire_pepsi
iesire_fisa

Diagrama strilor : initializare =

fisa =
0

asteptare

fisa = 1
iesire_coca = 0
iesire_pepsi = 0
iesire_fisa = 0

pepsi = 1

control
coca

livrare
coca
iesire_coca = 1
iesire_pepsi = 0
iesire_fisa = 0

coca = 0
pepsi = 0

decizie

coca = 1

prezenta_coca
=1

iesire_coca = 0
iesire_pepsi = 0
iesire_fisa = 0

iesire_coca = 0
iesire_pepsi = 0
iesire_fisa = 0

control
pepsi

prezenta_coca
=0

prezenta_pepsi
=1
prezenta_pepsi
=0

restituire
fisa
iesire_coca = 0
iesire_pepsi = 0
iesire_fisa = 1

livrare
pepsi
iesire_coca = 0
iesire_pepsi = 1
iesire_fisa = 0

Structura

sursei VHDL :

Declararea portului :

entity AUTOMAT is
port ( fisa , coca , pepsi , clk, initializare,
prezenta_coca , prezenta_pepsi : in std_logic ;
iesire_coca , iesire_pepsi , iesire_fisa : out std_logic ) ;
end AUTOMAT ;

Descrierea arhitecturii :

architecture arch_AUTOMAT of AUTOMAT is


--n zona de declaraii :
--Strile se precizeaz prin nume (etichete) declarate n cadrul
unui tip enumerat :

type STARE is ( asteptare , decizie , control_coca ,


control_pepsi , livrare_coca ,
livrare_pepsi , restituire_fisa ) ;

-- Se declar o variabile de tipul STARE, care va desemna starea curent

signal stare_actuala : STARE ;

begin
--Se transpune n cod VHDL diagrama strilor, folsind instruciuni
secveniale, n cadrul unui proces senzitiv la clk i la iniializare:

process (clk, initializare)


begin
--iniializare asincron
--sincronizare pe frontul crescator al clk
case - when

--

if - then - else

pentru definirea strilor


--

pentru definirea condiiilor de tranziie

end process ;
--Se definesc ieirile asociate strilor,
folosind
instruciuni concurente when-else sau
with-select;
end arch_AUTOMAT

Sursa VHDL a automatului

Declararea portului :

library ieee ;
use ieee.std_logic_1164.all ;
entity AUTOMAT is
port( fisa , coca , pepsi , clk, initializare
control_coca, control_pepsi : in std_logic ;
iesire_coca , iesire_pepsi , iesire_fisa : out std_logic ) ;
end AUTOMAT ;

Declararea strilor :

architecture arch_AUTOMAT of AUTOMAT is


type STARE is (asteptare , decizie ,
control_coca , control_pepsi ,
livrare_coca , livrare_pepsi ,
restituire_fisa ) ;
signal stare_actuala : STARE ;
begin

--multimea starilor

--starea curent

Descrierea grafului strilor :

process (clk, initializare )


begin
if initializare = 1 then stare_actuala <= asteptare ;
elsif rising_edge(clk) then

--initializare asincrona
sincronizare pe clk

case stare_actuala is
descrierea grafului starilor
when asteptare => if fisa = '1' then
stare_actuala <= decizie ;
else stare_actuala <= asteptare ; instructiune redundanta
end if ;
when decizie => if coca = '1' then
stare_actuala <= control_coca ;
elsif pepsi = '1' then
stare_actuala <= control_pepsi ;
else stare_actuala <= decizie ;
end if ;
when control_coca => if prezenta_coca = '1' then
stare_actuala <= livrare_coca;
else stare_actuala <= restituire_fisa ;
end if ;

when control_pepsi => if prezenta_pepsi = '1' then


stare_actuala <= livrare_pepsi;
else stare_actuala <= restituire_fisa ;
end if ;
when livrare_coca => stare_actuala <= asteptare ;
--tranzitii neconditionate
when livrare_pepsi => stare_actuala <= asteptare ;
when restituire_fisa => stare_actuala <= asteptare ;
end case ;
end if ;
end process;

Generarea ieirii automatului


(n afara procesului)

iesire_coca <= 1 when stare_actuala = livrare_coca else


0 ;
iesire_pepsi <= 1 when stare_actuala = livrare_pepsi else
0 ;
iesire_fisa

<= 1 when stare_actuala = restituire fisa else


0 ;

end architecture arch_AUTOMAT ;

Obs. : pentru generarea ieirii se poate folosi si instruciunea with-select :

with stare_actuala select


iesire_coca <= 1 when livrare_coca ,
0 when others ;
with stare_actuala select
iesire_pepsi <= 1 when livrare_pepsi ,
0 when others ;
with stare_actuala select
iesire_fisa <= 1 when restituire_fisa ,
0 when others ;

Exemplu :

controller memorie

adresa

ready
Controller
r_w
clk

re
we

RAM

date

intrri

clk
t

ready
t

ieiri

r_w

re
t

we
t
ateptare decizie

citire

ateptare

decizie

scriere

ateptare

ready = 0

asteptare
S1

re = 0
we = 0

r_
w

rea
dy
=

scriere
S4

ready = 0

re = 0
we = 1

r_
w

=1

decizie
S2

re = 0
we = 0

y
read

ready = 1

citire

re = 1
we = 0

S3

ready = 0

library ieee ;
use ieee.std_logic_1164.all ;
entity CONTROLER is
port ( ready , r_w , clk : in std_logic ;
re , we : out std_logic ) ;
end CONTROLER ;
architecture arch_CONTROLER of CONTROLER is
type STARE is ( S1, S2, S3, S4 ) ;
signal S : STARE ;
begin

mulimea strilor
starea curent

begin
process (clk)
begin
if clkevent and clk=1 then
case S

sincronizarea tranzitiilor pe clk

is

when S1 => if ready = '1' then


end if ;
when S2 => if r_w = '1' then
else
end if ;
when S3 => if ready = '1' then
end if ;
when S4 => if ready = '1' then
end if ;
end case ;
end if ;
end process ;

diagrama strilor

S <= S2 ;
S <= S3 ;
S <= S4 ;
S <= S1 ;
S <= S1 ;

re <= 1 when S = S3 else


0 ;
we <= 1 when S = S4 else
0 ;
end arch_CONTROLER ;

generarea iesirii
--cu instruciuni concurente

Descrierea cu dou procese


Arhitectura automatului se descrie prin dou procese distincte :
Un proces care descrie diagrama strilor
Un proces care descrie sincronizarea tranzitiilor cu semnalul clk

Primul proces :

precizeaz CUM au loc tranziiile

Al doilea proces : precizeaz CND au loc tranziiile

Se declar dou stri curente :

starea_actual
i

starea_urmtoare

library ieee ;
use ieee.std_logic_1164.all ;
entity CONTROLER is port
( ready , r_w , clk : std_logic ;
re , we : out std_logic ) ;
end CONTROLER ;
architecture arch_CONTROLER of CONTROLER is
type STARE is ( S1, S2, S3, S4 ) ;
signal stare_actuala, stare_urmatoare : STARE ;
begin

mulimea strilor
stri curente

TRANZITII: process (stare_actuala, ready, r_w)

proces care descrie

begin

-- diagrama strilor

case stare_actuala is
when S1 => if ready = '1' then stare_urmatoare <= S2 ; end if ;
when S2 => if r_w = '1'

then
else
when S3 => if ready = '1' then
when S4 => if ready = '1' then

stare_urmatoare <= S3 ;
stare_urmatoare <= S4 ; end if ;
stare_urmatoare <= S1 ; end if ;
stare_urmatoare <= S1 ; end if ;

end case ;
end process TRANZITII ;
SINCRONIZARE: process (clk)
proces care descrie sincronizarea pe clk
begin
if clkevent and clk=1 then
stare_actuala <= stare_urmatoare ;
end if ;
end process SINCRONIZARE ;
re <= 1 when stare_actuala = S3 else
0 ;
we <= 1 when stare_actuala = S4 else

--generarea iesirii

MODURI DE GENERARE A IEIRII

din starea actual


Ieirea generat combinaional, din starea urmtoar
Ieirea codificat n cuvntul de stare
Ieirea automatelor de tipul "One-Hot-One"
Ieirea definit prin tabelul tranziiilor.

1) Ieirea generat combinaional,


2)
3)
4)
5)

1) IEIREA GENERAT COMBINAIONAL,


DIN STAREA ACTUAL

starea
urmtoare

intrare

Logica
strii
urmtoare

X
Q

( CLC1 )

starea
actual

Q (Q,X)

Q+

starea
actual

Registru
de
stare
( memorie )

ieire

Logica
de
ieire

( CLC2 )

Y(Q)

clk

Se recomand descrierea ieirii prin instruciunile concurente :


with-select-when sau when-else

Exemplu : automat Moore cu 4 stri, 2 intrri i 3 ieiri.

x [1:0]

Logica
+
q
strii
urmtoare
CLC1

Registru
de
stare
(memorie)

Logica
de
ieire
CLC2

clk

y[2:0]

Diagrama strilor :

x "10"

S0

y = "000"
x
=
"1
0"

y = "111"
S3

S1

1"
"1

x=

"1
0

"

x = "11"

S2

y = "010"
x "11"

x "11"
x "10"
y = "101"

library ieee ;
use ieee.std_logic_1164.all ;
entity AUTOMAT is
port ( x : in std_logic_vector(1 downto 0) ;
clk : in std_logic ;
y : out std_logic_vector(2 downto 0) ) ;
end AUTOMAT ;
architecture arch_AUTOMAT of AUTOMAT is
type STARE is ( S0 , S1 , S2 , S3 ) ;

-- mulimea

strilor

signal S : STARE ;
begin

--starea curent

proc_AUTOMAT : process (clk) ;


begin

-- proces ce descrie
-- diagrama strilor

if (clk'event and clk = '1') then


case S is
when S0 =>
if x = "10" then S<=S1 ;
else S<=S0 ; end if ;
when S1 =>
if x = "10" then S<=S2 ;
elsif x = "11" then S<=S3 ;
else S<=S1 ; end if ;
when S2 =>
if x = "11" then S<=S3 ;
else S<= S2 ; end if ;
when S3 => S<=S0 ;
end case ;
end if ;
end process proc_AUTOMAT ;

-- trece necondiionat n starea S0

y <= "000" when S = S0 else


"101 when S = S1 else
"010" when S = S2 else
"111" ;
end arch_AUTOMAT ;

-- ieirea generata din starea actuala

2) IEIREA GENERAT COMBINAIONAL, DIN STAREA


URMTOARE
Avantaj : ieirea Y este disponibil anticipat (este decodificat din
cuvntul de stare Q+ imediat ce s-a generat starea urm
Dezavantaj : evenimentele la ieirea Y
nu sunt sincronizate pe clk ( => hazard)
Dou variante de implementare :
a) Logic de ieire separat
Q+

X
intrare

Logica
strii
urmtoare

Logica
de
ieire
+
Y(Q
)

Registru
de
starea
stare
urmtoare
Q+

clk

Y
ieire

Q
starea
actual

- automatul se descrie cu dou procese ;


- logica de ieire se descrie prin instruciuni concurente, pla
n afara proceselor ; instruciunile descriu dependena iei
de starea urmtoare : Y(Q+).

Exemplu :

automat cu 3 stri, 2 intrri i 3 ieiri, cu iniializare asincron

INIT

INIT

y = "000"

(asincron)

S0
x=

x = "11"

S2
clk

y = "010"

"
"01

"0 0
"

x=

y [2:0]

x [1:0]

S1
x = "10"

y = "101"

descriere "cu 2 procese :


library ieee ;
use ieee.std_logic_1164.all ;
entity AUTOMAT is
port ( INIT, clk : in std_logic ;
x : in std_logic_vector(1 downto 0) ;
y : out std_logic_vector(2 downto 0) ) ;
end AUTOMAT ;
architecture arch_AUTOMAT of AUTOMAT is
type STARE is ( S0, S1, S2 ) ;
-mulimea strilor

signal starea_actuala, starea_urmatoare : STARE


begin

--stri curente

proc_AUTOMAT : process( starea_actuala , x)


begin
strilor

case starea_actuala is
when S0 => if x = "01" then
starea_urmatoare <= S1 ;
end if ;
when S1 => if x = "11" then
starea_urmatoare <=S2 ;
end if ;
when S2 => if x = "00" then
starea_urmatoare <= S0 ;
elsif x = "10" then
starea_urmatoare <= S1 ;
end if ;
end case ;
end process proc_AUTOMAT ;

--descrie diagrama

with starea_urmatoare select

--asociaza ieirea cu starea urmtoare

y <= "000" when

S0 ,

"101" when

S1 ,

"010" when

others ;

proc_INIT_SINCRO : process(INIT, clk)


begin

descrie iniializarea i sincronizarea

if INIT = '1' then


starea_actuala <= S0 ;

--iniializeaz

automatul

elsif rising_edge(clk) then


clk

starea_actuala <= starea urmatoare ;


end if ;
end process proc_RESET_SINCRO ;
end arch_AUTOMAT ;

--sincronizeaz tranziiile cu

b)

Ieirea generat prin logica strii urmtoare


Y
X

intrare

Q
starea
actual

Logica
strii
urmtoare
i a ieirii
Q+(Q,X)
Y(Q+)

ieire

Q+
starea
urmtoare

Registru de
stare

Q
starea
actual

clk

Ieirea Y este generat simultan cu sinteza strii urmtoare.

Automatul din exemplul precedent (descriere "cu 2 procese ") :

library ieee ;
use ieee.std_logic_1164.all ;
entity AUTOMAT is
port ( INIT, clk : in std_logic ;
x : in std_logic_vector (1 downto 0) ;
y : out std_logic_vector (2 downto 0) ) ;
end AUTOMAT ;
architecture arch_AUTOMAT of AUTOMAT is
type STARE is (S0, S1, S2) ;
signal starea_actuala, starea_urmatoare : STARE
begin

--mulimea strilor
--stri curente

TRANZITII: process ( starea_actuala, x)


begin

descrie tranziiile
i asociaz ieirea y cu starea urmtoare

case starea_actual is
when S0 =>

if x = "01" then starea_urmatoare <= S1 ;


end if ;

y <="101" ;

when S1 => if x = "11" then starea_urmatoare <= S2 ;


end if ;

y <="010" ;

when S2 => if x = "10" then


starea_urmatoare <= S1 ; y <="101" ;
elsif x = "00" then starea_urmatoare <= S0 ; y <="000" ;
end if ;
end case ;
end process TRANZITII ;

SINCRONIZARE : process(INIT, clk)


begin
if INIT = '1' then S <= S0 ; y <= "000" ;
elsif rising_edge(clk) then
starea_actuala <= starea_urmatoare ;
end if ;
end process SINCRONIZARE ;

end architecture arch_AUTOMAT ;

iniializare i sincronizare

--iniializeaz registrul de stare


--sincronizeaz tranziiile cu clk

3)

IEIREA CODIFICAT N CUVNTUL DE STARE

starea
urmtoare

intrare

Logica
strii
urmtoare

X
Q

( CLC )

Q+

starea
actual

Registru
de
stare
i
ieire
clk
( memori
e)

ieire

Q
Y

Logica strii urmtoare genereaz un cuvnt de stare


care include ieirea
YQ
Sursa VHDL gestioneaz i cuvntul de stare Q.
Ieirea Y este in modul buffer.

RESET
asincron

S0

y [1:0]

q = "000"

reset

"
"10

x=

x=

"01
"

clk

y = "00"

x = "00"

S4

S1
y = "10"

y = "01"

q = "010"

"0
1"

q = "101"

=
x

11"
x="

S3
y = "00"

x = "1
1"

x [1:0]

S2
y = "11"

q = "100"

x = "00"

q = "011"

Sursa VHDL a automatului ( descriere de tip "proces unic" ) :

library ieee ;
use ieee.std_logic_1164.all ;
entity AUTOMAT is port
(RESET, clk : in std_logic ;
x : in std_logic_vector(1 downto 0) ;
y : buffer std_logic_vector(1 downto 0) ) ;
end AUTOMAT ;
architecture arch_AUTOMAT of AUTOMAT is
signal S : std_logic_vector(2 downto 0) ;

-starea curent

--se definesc cele 5 stri ale automatului prin constantele S0S4,


--avnd valori egale cu ale cuvntului de stare q
constant S0 : std_logic_vector ( 2 downto 0)
constant S1 : std_logic_vector ( 2 downto 0)
constant S2 : std_logic_vector ( 2 downto 0)
constant S3 : std_logic_vector ( 2 downto 0)
constant S4 : std_logic_vector ( 2 downto 0)
begin

:=
:=
:=
:=
:=

"000" ;
"010" ;
"011" ;
"100" ;
"101" ;

proc_AUTOMAT : process (RESET, clk)


begin
if RESET = '1' then S <= S0 ;
elsif (clk'event and clk='1') then
case S is
when S0 => if x="10" then S<=S1 ; end if ;
when S1 => if x="00" then S<=S4 ;
elsif x="11" then S<=S2 ; end if ;
when S2 => if x="00" then S<=S3 ; end if ;
when S3 => if x="01" then S=S1 ;
elsif x="11" then S<=S4 ; end if ;
when S4 => if x="01 then S<=S0 ; end if ;
end case ;
end if ;
end process proc_AUTOMAT ;

y <= S(1 downto 0) ;

end arch_AUTOMAT ;

--extrage ultimii 2 bii


-- din vectorul de stare
--i-i atribuie ieirii y

4)

GENERAREA IEIRII N CAZUL AUTOMATELOR DE TIP "One-Hot


( "un singur bit pe 1" )

- Strile se codific printr-o singur valoare 1 n cuvntul de stare Q.


- Numrul de bistabili din registrul de stare este egal cu numrul "n" al strilo
- Ieirea este generat de o logic combinaional (CLC2), pornind de la cuvn

(Logica de ieire este asemntoare cu a unui un codificator zecimal/binar, avnd o singur intrare

Registrul de
stare
qn-1

X
intrare

Q
starea
actual

Logica
Q+
strii
urmtoare
starea
( CLC1 )

Logica
de
ieire
( CLC2 )

..
.
q2
q1

urmtoare

q0

Q+(Q,X)

Y(Q)
clk
Q
starea
actual

Y
ieire

Codificarea de tip "One-Hot-One" a strilor automatului


Starea

S0
S1
S2
.
.
.
Sn-2
Sn-1

qn-1 qn-2

Q
q 3 q2

0
0
0

0
0
0

0
1

1
0

q1

q0

0
0
0

0 0
0 1
1 0

1
0
0

0
0

0
0

0
0

0
0

Obs. : acest tip de codare a strilor este avantajos n cazul implementrii


automatelor pe circuite programabile ce conin un numr mare
de bistabili, dar au resurse limitate de logic combinaional
(cazul circuitelor FPGA).

Exemplu :

automat cu 5 stri, 2 intrri i 2 ieiri, cu iniializare asincron :

INIT

INIT

asincron

S0

y [1:0]

y = "00"

q = "00001"

"10

x=

x=

"01
"

x [1:0]

"

clk

x = "00"

S3

S1

q = "10000"

q = "00010"

"0
x

11"
x="

y = "00"

x = "1
1"

1"

y = "01"

y = "10"

S3

S2

q = "01000"

q = "00100"

x = "00"

y = "11"

Descrierea VHDL :
-directiva de sintez care foreaz o implementare de tip "one-hot-one" :

attribute

state_encoding of STARE : type is one_hot_one ;

- diagrama strilor se descrie ca n exemplele precedente ;


-ieirea y se genereaz combinaional, n funcie de codul strii.

(descriere tip "proces unic") :

library ieee ;
use ieee.std_logic_1164.all ;
entity AUTOMAT is port
(clk , INIT : in std_logic ;
x : in std_logic_vector(1 downto 0) ;
y : out std_logic_vector(1 downto 0) ) ;
end AUTOMAT ;
architecture arch_AUTOMAT of AUTOMAT is
type STARE is (S0, S1, S2, S3, S4) ;
attribute state_encoding of STARE : type is one_hot_one ;
signal S : STARE ;
begin

proc_AUTOMAT : process (INIT, clk)

--descrie diagrama strilor

begin
if INIT = '1' then S <= S0 ;
elsif (clk'event and clk='1') then
case S is when S0 => if x="10" then S<=S1 ; end if ;
when S1 => if x="00" then S<=S4 ;
elsif x="11" then S<=S2 ; end if ;
when S2 => if x="00" then S<=S3 ; end if ;
when S3 => if x="01" then S=S1 ;
elsif x="11" then S<=S4 ; end if ;
when S4 => if x="01 then S<=S0 ; end if ;
end case ;
end if ;
end process proc_AUTOMAT ;
y <= "00" when (S = S0 or S = S3) else
"10" when (S = S1 ) else
"11" when (S = S2) else
"01" ;
end arch_automat ;

--genereaz ieirea y

5) DEFINIREA IEIRII PRIN TABELUL TRANZIIILOR


INIT
(asincron)

y = "00"
"10

x=

S0
q= "000"

x=

"01
"

Ex. :

"

Tabelul tranziiilor :

S2
S3
q= "100"
q= "011"
x = "00"

Starea actual
nume cod (q)
S0
000
S1
010
S2
S3

011
100

S4

101

y = "10"

x = "1
1"

"0

1"

S1
q= "010"

11"
x="

y = "00"

x = "00"

y = "01"

S4
q= "101"

Intrarea
x
10
11
00
00
01
11
01

y = "11"

Starea urmtoare
nume cod (q+)
S1
010
S2
011
S4
101
S3
100
S1
010
S4
101
S0
000

- Automatul este specificat prin tabelul tranziiilor.


- Tabelul tranziiilor este reprezentat n cod VHDL ca tablou (matrice).
- Codul strii urmtoare q+ i ieirirea y se extrag din acest tablou prin inst

library ieee ;
use ieee.std_logic_1164.all ;

use work.table_std.all ;

--bibliotec specific lucrului cu

tablouri
entity AUTOMAT is
port (clk , INIT : in std_logic ;
x : in std_logic_vector(1 downto 0) ;
y : out std_logic_vector(1 downto 0) ) ;
end AUTOMAT ;

architecture arch_AUTOMAT of AUTOMAT is


signal iesire_tabel : std_logic_vector( 0 to 4 ) ;
--variabil auxiliar ce preia valori din tabel
--dimensiunea : nr.bii stare (3) + nr.bii ieire(2)
signal S : std_logic_vector(2 downto 0) ;

--starea curent codat cu 3 bii

constant S0 : std_logic_vector (2 downto 0) := "000" ;


constant S1 : std_logic_vector (2 downto 0) := "010" ;
constant S2 : std_logic_vector (2 downto 0) := "011" ;
constant S3 : std_logic_vector (2 downto 0) := "100" ;
constant S4 : std_logic_vector (2 downto 0) := "101" ;

--denumirile i
--codurile strilor

--tabelul tranziiilor se definete ca tablou (matrice) avnd :


--nr. linii egal cu numrul tranziiilor (7 tranziii)
--nr. coloane egal cu nr. cumulat al :
--nr. bii cod stare actual q
3 bii
--nr. bii intrare x
2 bii
--nr. bii cod stare urmtoare q+ 3 bii
--nr. bii ieire y
2 bii
-------------------------------------------------TOTAL : 10 bii
constant TABEL ttf_table ( 0 to 6 , 0 to 9 ) :=

--declar tabloul "TABEL"


-- cu 7 linii i 10 coloane

--starea actual

intrarea

starea urmtoare

ieirea

----------------------------------------------------------------

S0

&

"10"

&

S1
S1
S2
S3
S3
S4

&
&
&
&
&
&

"11" &
"00" &
"00" &
"01" &
"11" &
"01" &

S1

&

S2
S4
S3
S1
S4
S0

&
&
&
&
&
&

"10" ,

--tabelul

tranziiilor

"11"
"01"
"00"
"10"
"01
"00"

,
,
,
,
,

);
--& : operator concatenare

begin

process (INIT, clk)


begin
if INIT = '1' then
iesire_tabel <= "00000";
elsif (clk'event and clk='1') then

--iniializare
--cod stare = "000" , ieire = "00"
--sincronizare pe front

cresctor
iesire _tabel <= ttf ( TABEL , S & x ) ;
--extrage o linie de tablou i o atribuie variabilei
"iesire_tabel"
end if ;
-- generarea strii urmtoare i a ieirii :
end process ;
S <= iesire_tabel (0 to 2) ;
--extrage codul strii curente din variabila "ieire_tabel"
y <= iesire_tabel ( 3 to 4 ) ;

end arch_AUTOMAT ;

--extrage valoarea ieirii din variabila "ieire_tabel"

Funcia ttf (truth table function) : extrage informaii din tablouri


- se apeleaz cu 2 parametri :
- numele tabloului ("TABEL")
- semnalele ce conin starea actual (S) i intrarea (x)
- ntoarce ceilai bii din tabel (codul strii urmtoare q+ i ieirea y)

Funcia tff este disponibil n biblioteca

work.table_std .

2) AUTOMATE de tip MEALY


- Ieirile depind direct de starea actual a automatului i de intr
- Funcia de ieire este de forma : Y = f(Q,X)

starea
urmtoare

intrare

X
starea
actual

Logica
strii
Q+
urmtoare
( CLC )

Registrul
de
stare

starea
actual

( memorie )

Q+ = f(Q,X)
ieire

clk
Q
X

Logica
de
ieire
)
Y( =CLC
f(Q,X)

Descrierea automatului :
- Evoluia strilor se descrie n cadrul unui proces
(ca n cazul automatelor Moore).

-Ieirea se descrie n afara procesului, n funcie de stare i intrare


Obs. :

Sunt posibile toate modurile de generare


a ieirii prezentate n cazul automatelor de tip Mo

Exemplu :

S1

x=
"01

"

S4
"
x = "11

y = "11" dac x =
11
y = 10 dac x =
01
y = 00 dac x
11
i x
01

"1

0"

INIT
( asincron)

y = 11 dac x =
00
y = 00 dac x
00
x=
S0
"1
0"
y = "11"

S3

S2
x = "00"

y = "01" dac x = 00
y = "11" dac x = 11
y = 00 dac x 00
i x 11

y = "01"

library ieee ;
use ieee.std_logic_1164.all ;
entity MEALY is port
(x
: in std_logic_vector (1 downto 0) ;
clk, INIT : in std_logic ;
y
: out std_logic_vector (1 downto 0) ) ;
end MEALY ;
architecture arch_MEALY of MEALY is
type STARE is ( S0 , S1 , S2 , S3 , S4 ) ;
signal S : STARE ;
begin

process ( clk, INIT )


begin
if INIT = '1' then S <= S0 ;
elsif (clk'event and clk = '1') then
case S is
when S0 => if x = "10" then S <= S1 ; end if ;
when S1 => S <= S2 ;
when S2 => if x = "00" then S <= S3 ; end if ;
when S3 => if x = "11" then S <= S4 ;
elsif x = "01" then S <= S0 ;
end if ;
when S4 => if x = "10" then S <= S0 ; end if ;
end case ;
end if ;
end process ;
--iesirea in functie de stare si intrare
y <= "00" when ( (S = S0 and x /= 00") or
(S = S3 and x /= 00 and x /= 11 ) or
(S = S4 and x /= "11" and x /= "01" ) ) else
"01" when ( S = S2 or (S = S3 and x = "00" ) else
"10" when ( S = S4 and x = "01") else
"11" ;
end arch_MEALY ;