background image

Laboratorium przedmiotu Technika Cyfrowa 

 

ćw.3 i 4: Asynchroniczne i synchroniczne automaty sekwencyjne 

 
 
1. Implementacja asynchronicznych i synchronicznych maszyn stanu w języku 
VERILOG: 
 

Maszyny  stanu  w  języku  VERILOG  implementuje  się  najczęściej  za  pomocą 

instrukcji  sterującej  case.  Przykładowa  implementacja  takiej  maszyny  została 
pokazana w listingu 1: 

 

 

listing 1 

 

background image

Analizując  kod  widać,  Ŝe  blok  always  wykonywany  jest  przy  zmianie  kaŜdej  ze 
zmiennych wejściowych (x1, x2), przy zmianie stanu oraz zmianie sygnału reset, czyli 
w  pełni  asynchronicznie.  Nie  ma  tutaj  Ŝadnego  zegara.  Jeśli  sygnał  reset  zostanie 
ustawiony  w  stan  wysoki  zerowany  jest  obiekt  state  informujący  o  stanie,  w  którym 
się  maszyna  znajduje,  tzn.  maszyna  stanu  jest  ustawiana  w  stan  s0  (zakodowany 
jako 2’b00). Jeśli natomiast sygnał reset przyjmuje wartość zero, wykonywany jest 
blok  case  (o  ile  nastąpi  zmiana  x1,  x2  lub  state).  Zakładając,  Ŝe  maszyna  znajduje 
się w  stanie początkowym (s0), o ile  wejścia nie zostaną ustawione na x1=1, x2=0
maszyna  pozostaje  w  stanie  s0.  Jeśli  natomiast  wejścia  zostaną  ustawione  na 
x1=1,x2=0,  to  maszyna  przechodzi  do  stanu  s1.  Podobną  analizę  moŜna 
przeprowadzić  dla  kaŜdego  kolejnego  stanu.  Wgłębiając  się  w  kod  moŜna  równieŜ 
zauwaŜyć,  iŜ  wyjścia  maszyny  ustawiane  są  w  konkretnym  stanie  i  nie  zaleŜą 
bezpośrednio od wejść, lecz tylko od stanu. Jest to automat sekwencyjny Moore’a. 

Automat  Mealy’ego  róŜni  się  nieznacznie  w  kodzie  języka  VERILOG  od 

automatu  Moore’a.  Wystarczy  usunąć  fragmenty  kodu  ustawiające  wyjścia  z  bloku 
instrukcji  case  i  wprowadzić  poza  blokiem  always  przypisania  ciągłe  ustawiające 
wyjścia  w  zaleŜności  od  stanu  i  wejść.  NaleŜy  pamiętać  równieŜ  o  zmianie  typu 
obiektów wyjściowych na wire. Zmodyfikowany kod przedstawiony został na kolejnym 
listingu 2. 

Synchroniczne  automaty  sekwencyjne  implementuje  się  w  sposób  bardzo 

podobny.  W  automacie  Moore’a  wystarczy  właściwie  zmienić  tylko  listę  wraŜliwości 
tak,  aby  ciało  bloku  always  było  wykonywane  przy  narastającym  zboczu  sygnału 
reset  i  narastającym  zboczu  sygnału  zegarowego  (w  zaleŜności  od  wymagań  moŜe 
być  równieŜ  zbocze  opadające  jak  i  obydwa).  Przykładową  implementację  takiej 
maszyny pokazuje kolejny listing 3. 
 

przypadku 

synchronicznego 

automatu 

Mealy’ego 

stany 

ustalane 

są 

synchronicznie,  natomiast  wyjścia  zaleŜą  od  synchronicznego  stanu  i  wejść,  które 
mogą  być  synchroniczne  lub  asynchroniczne.  W  przypadku  wejść  synchronicznych 
(względem tego samego zegara, co zegar automatu) automat Mealy’ego zachowuje 
się  dokładnie  tak  jak  automat  Moore’a,  natomiast  powstaje  problem  przy  wejściach 
asynchronicznych  względem  zegara  maszyny.  Mogą  wystąpić  wtedy  przekłamania 
na  wyjściu.  W  przypadku,  gdy  się  nie  moŜna  na  nie  zgodzić  naleŜy  albo  dokonać 
synchronizacji (wprowadzić synchroniczne przerzutniki typu D na wszystkie wejścia) 
albo  teŜ  zrezygnować  z  automatu  Mealy’ego  i  przejść  na  automat  Moore’a.  
W listingu 4 podano przykład synchronicznego automatu Mealy’ego. 
 

background image

 

listing 2 

 
 

 

background image

 

listing 3 

 

background image

 

listing 4 

 
2. Sposób kodowania stanów: 
 
Jedną  z  najwaŜniejszych  rzeczy  przy  projektowaniu  automatu  synchronicznego  jest 
wybór kodowania stanów. Kilka z nich przedstawione zostało poniŜej: 

•  kodowanie binarne (sekwencyjne), 
•  kodowanie One-Hot (gorąca jedynka), 
•  kodowanie Gray’a, 
•  kodowanie Johnson’a. 

 
Na  optymalny  wybór  kodowania  składa  się  nie  tylko  wielkość  logiki  potrzebnej  na 
implementację  automatu,  lecz  rownieŜ  szybkość  jego  wykonywania  przy 
implementacji  sprzętowej.  Znajdując  optymalne  kodowanie  stanów  stosując  np. 
kodowanie  sekwencyjne  moŜe  się  okazać  przy  drobnej  modyfikacji  automatu,  iŜ 
wybrane  kodowanie  nie  jest  juŜ  optymalne  i  trzeba  szukać  ponownie.  O  wiele 
lepszym  rozwiązaniem  jest  stosowanie  kodowania  typu  One-Hot.  Polega  ono  na 
zakodowaniu  stanów  w  taki  sposób,  Ŝe  dla  kaŜdego  stanu  tylko  jeden  bit  w  słowie 
kodującym jest w stanie wysokim. Ilustruje to następujący przykład: 
 

 

 
Obecne  narzędzia  syntezujące  kod  VERILOG  posiadają  moŜliwość  przekodowania 
maszyny stanów. Tak jest np. w narzędziu XST (Xilinx Synthesis Technology), które 
bądź zoptymalizuje kodowanie uŜytkownika, bądź teŜ dokona zmiany kodowania na 
inne. Wyboru sposobu kodowania moŜna dokonać równieŜ ręcznie. Trzeba do tego 
celu  przed  nazwą  obiektu,  w  którym  będzie  zapisywany  aktualny  stan  wstawić  ciąg 
znakow:  (*  FSM_ENCODING="<typ  kodowania>"  *).  Pole  <typ  kodowania>  moŜe 
przyjąć następujące wartości: 

•  AUTO 
•  ONE-HOT 
•  GRAY 
•  COMPACT 
•  JOHNSON 

background image

•  SEQUENTIAL 
•  USER 

 
3. Bezpieczna implementacja maszyny stanu: 
 
Przy  projektowaniu  maszyn  stanu  zwykle  istnieją  dwa  przeciwstawne  sobie  cele. 
Pierwszym z nich jest uzyskanie maszyny stanu, która po otrzymaniu nieoczekiwanej 
sekwencji  wejściowej  potrafi  przejść  do  pewnego  znanego  bezpiecznego  stanu. 
Implementacja ta jest zwykle dość wolna i wymaga kodowania binarnego, co kłóci się 
czasem z innym celem, a mianowicie z uzyskaniem szybkiej implementacji maszyny 
stanu.  Dlatego  teŜ  rezygnuje  się  w  niektórych  sytuacjach  z  takiej  implementacji  na 
koszt  prędkości.  Stosując  do  syntezy  modułów  VERILOGa  XST  moŜna  wybrać 
sposób  syntezy  wybranej  maszyny.  Podobnie  jak  przy  wyborze  kodowania  stanów 
maszyny 

naleŜy 

przed 

zmienną 

stanu 

podać 

ciąg 

znaków:  

(*  SAFE_IMPLEMENTATION="YES",  SAFE_RECOVERY_STATE="s0"  *),  gdzie  s0 
jest  znanym  stanem  do  ktorego  maszyna  przechodzi  w  przypadku  nieznanej 
sekwencji wejściowej. 
 
4. Przebieg ćwiczenia: 
 
Celem  ćwiczenia  jest  zapoznanie  studenta  ze  sposobem  implementacji 
asynchronicznych i synchronicznych maszyn stanu w języku VERILOG, jak równieŜ 
ze szczegółami związanymi z ich syntezą. 
 
Przygotowanie do laboratorium: 

 

 praktyczna znajomość sposobów projektowania układów kombinacyjnych; 
 umiejętność optymalizacji funkcji logicznych; 
 znajomość podstaw języka VERILOG; 

 
Przebieg ćwiczenia i sposób oceniania: 

 
 sprawdzanie przygotowania do zajęć (max 1 pkt); 
 zrealizowanie zadań postawionych przez prowadzącego (max 4 pkt); 

 
  * podczas ćwiczenia kaŜda sekcja tworzy osobny protokół z przebiegu ćwiczenia 
 
Protokół: 

 

Protokół powinien zawierać:  

 

 nazwiska osób wykonujących ćwiczenie; 
 tytuł i numer ćwiczenia; 
 poprawny numer grupy i sekcji; 
 komentarze  przedstawiające  postęp  w  realizacji  ćwiczenia  oraz  wszelkie 

niezbędne do zrealizowania ćwiczenia notatki; 

 
 
 
 
 

background image

5. Literatura: 
 

http://toolbox.xilinx.com/docsan/xilinx10/books/docs/qst/qst.pdf

  

- ISE 10.1 Quick Start Tutorial 

http://direct.xilinx.com/direct/ise10_tutorials/ise10tut.pdf

  

- ISE In-Depth Tutorial 

http://www.xilinx.com/support/documentation/boards_and_kits/ug334.pdf

  

- Spartan-3A/3AN FPGA Starter Kit Board User Guide 

 

http://www.xilinx.com/support/documentation/boards_and_kits/s3astarter_schematic.
pdf

  

 

- Spartan-3A/3AN Starter Kit Board Schematic 

http://www.xilinx.com/support/documentation/user_guides/ug331.pdf

  

- Spartan-3 Generation FPGA User Guide 

 
 
Opracowanie: Jan Staniek, Edycja: Mariusz Latos, 2011