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
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.
W
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.
listing 2
listing 3
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
• 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;
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