Język AHDL. Synteza strukturalna. dr inŝ. Paweł Tomaszewicz Instytut Telekomunikacji Politechnika Warszawska H D L

Podobne dokumenty
Sumatory H D L. dr inŝ. Paweł Tomaszewicz Instytut Telekomunikacji Politechnika Warszawska

Sposoby projektowania systemów w cyfrowych

Język HDL - VERILOG. (Syntetyzowalna warstwa języka) Hardware Description Language Krzysztof Jasiński PRUS PRUS

Projektowanie Scalonych Systemów Wbudowanych VERILOG

Układy mnoŝące H D L. dr inŝ. Paweł Tomaszewicz Instytut Telekomunikacji Politechnika Warszawska

AHDL - Język opisu projektu. Podstawowe struktury języka. Komentarz rozpoczyna znak i kończy znak %. SUBDESIGN

Pojedyncze wartości zadeklarowanego typu Ustawiane przed rozpoczęciem symulacji bez moŝliwości

Projektowanie Urządzeń Cyfrowych

Układy reprogramowalne i SoC Implementacja w układach FPGA

Altera Quartus II. Opis niektórych komponentów dostarczanych razem ze środowiskiem. Opracował: mgr inż. Leszek Ciopiński

Podstawowe moduły układów cyfrowych układy sekwencyjne cz.2 Projektowanie automatów. Rafał Walkowiak Wersja /2015

Układy kryptograficzne z uŝyciem rejestrów LFSR

Laboratorium 10 Temat: Zaawansowane jednostki testowe. Operacje na plikach. Funkcje.

Układy logiczne układy cyfrowe

Projektowanie hierarchiczne Mariusz Rawski

Ćwiczenie 27 Temat: Układy komparatorów oraz układy sumujące i odejmujące i układy sumatorów połówkowych i pełnych. Cel ćwiczenia

1. Synteza układów opisanych w języku VHDL Xilinx ISE Design Suite 10.1 VHDL 2. Obsługa przetwornika CA Project Add source...

Przykładowe pytania z części PSPICE. 1. Podaj zasady tworzenia pliku symulacyjnego. 2. Czy składnia PSPICE jest czuła na wielkość liter? 3.

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki. ĆWICZENIE Nr 4 (3h) Przerzutniki, zatrzaski i rejestry w VHDL

Technika cyfrowa Układy arytmetyczne

Literatura. adów w cyfrowych. Projektowanie układ. Technika cyfrowa. Technika cyfrowa. Bramki logiczne i przerzutniki.

Adresowanie obiektów. Adresowanie bitów. Adresowanie bajtów i słów. Adresowanie bajtów i słów. Adresowanie timerów i liczników. Adresowanie timerów

Laboratorium przedmiotu Technika Cyfrowa

Krótkie wprowadzenie do ModelSim i Quartus2

Architektura komputerów Wykład 2

Sławomir Kulesza. Projektowanie automatów synchronicznych

Instrukcje sekwencyjne

Układy cyfrowe w Verilog HDL. Elementy języka z przykładami. wersja: cz.3

Programowalne układy logiczne

Projektowanie scalonych systemów wbudowanych VERILOG. VERLIOG - historia

1. ISE WebPack i VHDL Xilinx ISE Design Suite 10.1 VHDL Tworzenie projektu Project Navigator Xilinx ISE Design Suite 10.1 File

Inwerter logiczny. Ilustracja 1: Układ do symulacji inwertera (Inverter.sch)

UKŁADY MIKROPROGRAMOWALNE

Układy logiczne układy cyfrowe

Implementacja algorytmu szyfrującego

Język programowania PASCAL

Język HDL - VERILOG. (Syntetyzowalna warstwa języka) Hardware Description Language Krzysztof Jasiński PRUS PRUS

Wstęp do Techniki Cyfrowej... Synchroniczne układy sekwencyjne

Lista tematów na kolokwium z wykładu z Techniki Cyfrowej w roku ak. 2013/2014

Układy sekwencyjne. Wstęp doinformatyki. Zegary. Układy sekwencyjne. Automaty sekwencyjne. Element pamięciowy. Układy logiczne komputerów

Projektowanie automatów z użyciem VHDL

Modelowanie złożonych układów cyfrowych (1)

Aby w pełni przetestować układ o trzech wejściach IN_0, IN_1 i IN_2 chcemy wygenerować wszystkie możliwe kombinacje sygnałów wejściowych.

Elementy struktur cyfrowych. Magistrale, układy iterowane w przestrzeni i w czasie, wprowadzanie i wyprowadzanie danych.

Pracownia elektryczna i elektroniczna. Elektronika cyfrowa. Ćwiczenie nr 5.

Elementy struktur cyfrowych. Magistrale, układy iterowane w przestrzeni i w czasie, wprowadzanie i wyprowadzanie danych.

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Programowalne układy logiczne kod kursu: ETD Podstawy języka Verilog W

PODSTAWY TEORII UKŁADÓW CYFROWYCH

Podstawowe elementy układów cyfrowych układy sekwencyjne Rafał Walkowiak Wersja

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Język FBD w systemie Concept

Układy reprogramowalne i SoC Język VHDL (część 4)

Bezpieczeństwo informacji oparte o kryptografię kwantową

Programowalne układy logiczne kod kursu: ETD Układy kombinacyjne, przypisania, blokujące i nieblokujące cz.2 W

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

Specyfika projektowania Mariusz Rawski

Ćwiczenie Digital Works 003 Układy sekwencyjne i kombinacyjne

Wykład nr 3 Techniki Mikroprocesorowe. dr inż. Artur Cichowski

Elementy struktur cyfrowych. Magistrale, układy iterowane w przestrzeni i w czasie, wprowadzanie i wyprowadzanie danych.

Podstawy działania układów cyfrowych...2 Systemy liczbowe...2 Kodowanie informacji...3 Informacja cyfrowa...4 Bramki logiczne...

(przykład uogólniony)

Bramki logiczne Podstawowe składniki wszystkich układów logicznych

Ćwiczenie 28. Przy odejmowaniu z uzupełnieniem do 2 jest wytwarzane przeniesienie w postaci liczby 1 Połówkowy układ

Układy arytmetyczne. Joanna Ledzińska III rok EiT AGH 2011

Układy kombinacyjne. cz.2

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Projektowanie układów na schemacie

Systemy Czasu Rzeczywistego FPGA

Podstawy Informatyki Elementarne podzespoły komputera

Modelowanie liczników w języku Verilog i ich implementacja w strukturze FPGA

Asynchroniczne statyczne układy sekwencyjne

Architektura systemów komputerowych. Poziom układów logicznych. Układy mnoŝące i dzielące

Część 3. Układy sekwencyjne. Układy sekwencyjne i układy iteracyjne - grafy stanów TCiM Wydział EAIiIB Katedra EiASPE 1

1 Wstęp. 2 Proste przykłady. 3 Podstawowe elementy leksykalne i typy danych. 6 Opis strukturalny. 7 Moduł testowy (testbench)

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Układy sekwencyjne. Podstawowe informacje o układach cyfrowych i przerzutnikach (rodzaje, sposoby wyzwalania).

Synteza strukturalna automatu Moore'a i Mealy

Wstęp do programowania

Plan wykładu. Architektura systemów komputerowych. MnoŜenie realizacja sprzętowa (wersja 1) Układy mnoŝące liczby całkowite.

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Zadania do wykładu 1, Zapisz liczby binarne w kodzie dziesiętnym: ( ) 2 =( ) 10, ( ) 2 =( ) 10, (101001, 10110) 2 =( ) 10

Krótkie przypomnienie

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Programowalne układy logiczne

Sterowniki Programowalne (SP)

Delphi Laboratorium 3

Synteza strukturalna automatów Moore'a i Mealy

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

f we DZIELNIKI I PODZIELNIKI CZĘSTOTLIWOŚCI Dzielnik częstotliwości: układ dający impuls na wyjściu co P impulsów na wejściu

Ćw. 7: Układy sekwencyjne

PAMIĘĆ RAM. Rysunek 1. Blokowy schemat pamięci

Projekt prostego procesora

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

CZ1. Optymalizacja funkcji przełączających

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 1. Elektrotechnika, semestr II rok akademicki 2008/2009

Tranzystor JFET i MOSFET zas. działania

UKŁADY SEKWENCYJNE Opracował: Andrzej Nowak

Transkrypt:

Język A Synteza strukturalna 1

Synteza strukturalna icznik Rejestr B l o k i F u n k c j o n a l n e 1. Składamy układ z bloków funkcjonalnych 2. Odwzorowanie technologiczne 2

Komponent Wyboru odpowiedniej jednostki projektowej dokonuje się przez: deklarację komponentu (component declaration), a następnie jego podstawienie (component instantiation). eklaracja komponentu jest podobna do deklaracji jednostki projektowej podaje interfejs komponentu. Umieszcza się ją w przed sekcją SUBESIGN. FUNCTION function_name( input_name, MACINE state_machine_name) WIT ( parameter_name, parameter_name) RETURNS ( output_name, bidir_name, MACINE state_machine_name); 3

Podstawienie komponentu Instrukcja podstawienia (łączenia) komponentu to współbieŝna instrukcja określająca wzajemne połączenia sygnałów i podukładów zwanych komponentami. Zawiera: nazwę komponentu (etykietę) typ komponentu mapę wyprowadzeń (port map), która pokazuje powiązania pomiędzy sygnałami aktualnymi, a wyprowadzeniami komponentu mapę parametrów ogólnych 4

eklaracja komponentu Komponent moŝe być umieszczony w projekcie jako: Instrukcja podstawienia (konkretyzacja) w linii (in-line reference) nie wymaga deklaracji w sekcji VARIABE Postawienie argumentów przez połoŝenie (x, y) = function_name(arg1, arg2) WIT (parameter_name = value1, parameter_name = value2); Podstawienie argumentów przez nazwy portów (x, y) = function_name (.port_name1 = arg1,.port_name1 =arg2) RETURNS (.port_name3,.port_name4); Konkretyzację funkcji (instance declaration) wymaga deklaracji w sekcji VARIABE function_instance_name : function_name WIT (parameter_name1 = parameter_value1, parameter_name2 = parameter_value2); 5

Sumator full adder ci ai bi si ci+1 c i s i = a i = a b c ( a b ) b i c i a b ( a + 1 i i i i i i i i i i = c b ) 6

Sumator kaskadowy Ripple carry adder an-1 bn-1 a1 b1 a0 b0 cn FA cn-1 c2 FA c1 FA c0 sn-1 s1 s0 7

Przykład: zbudować adder4 Sumator 4-bitowy złoŝony z bloków sumatorów 1-bitowych fulladder a b Cout FA Cin s a3 b3 a2 b2 a1 b1 a0 b0 Cout FA c3 FA c2 F A c1 FA Cin s3 s2 s1 s0 8

Sumator fulladd w A -- 1 bit full adder SUBESIGN fa ( a, b, cin : INPUT; s, cout : OUTPUT; ) Cout a FA b Cin BEGIN s = a XOR b XOR cin; cout = a AN b OR a AN cin OR b AN cin; EN; s 9

Plik nagłówkowy Plik nagłówkowy (prototyp funkcji) fa.inc FUNCTION fa (a, b, cin) RETURNS (s, cout); Nazwa funkcji jak nazwa główna pliku ista argumentów wejściowych ista argumentów wyjściowych MoŜna plik nagłówkowy wygenerować automatycznie MP2: File>Create efault Include File Q2: File>Create/Update>Create A Include File for Current File 10

Organizacja plików specyfikacji adder4 Katalog główny MAXPlus2 Pliki systemowe Funkcje biblioteczne.. MaxWork Adder4 fa.tdf fa.inc 11

eklaracja jednostki adder4 a3 b3 a2 b2 a1 b1 a0 b0 Cout FA c3 FA c2 F A c1 FA Cin s3 s2 INCUE "fa.inc"; SUBESIGN adder4 ( a3, a2, a1, a0, cin : INPUT; b3, b2, b1, b0 : INPUT; s3, s2, s1, s0, cout : OUTPUT; ) s1 s0 W deklaracji nie ma sygnałów wewnętrznych 12

Projekt adder4 INCUE "fa.inc"; -- rozszerzenie opcjonalne -- moŝna zapisać INCUE "fa"; SUBESIGN adder4 ( a3, a2, a1, a0, cin : INPUT; b3, b2, b1, b0 : INPUT; s3, s2, s1, s0, cout : OUTPUT; ) VARIABE c3, c2, c1 : NOE; -- deklaracja węzłów logicznych BEGIN (s3, cout) = fa(a3, b3, c3); (s2, c3) = fa(a2, b2, c2); (s1, c2) = fa(a1, b1, c1); (s0, c1) = fa(a0, b0, cin); EN; -- podstawienie funkcji -- konkretyzacja (instancja) -- argumenty przez połoŝenie 13

Projekt adder4 -- zamiast pliku nagłówkowego moŝna podać deklaracje uŝytych funkcji FUNCTION fa (a, b, cin) RETURNS (s, cout); SUBESIGN adder4 ( a3, a2, a1, a0, cin : INPUT; b3, b2, b1, b0 : INPUT; s3, s2, s1, s0, cout : OUTPUT; ) VARIABE c3, c2, c1 : NOE; BEGIN (s3, cout) = fa(a3, b3, c3); (s2, c3) = fa(a2, b2, c2); (s1, c2) = fa(a1, b1, c1); (s0, c1) = fa(a0, b0, cin); EN; 14

Organizacja plików specyfikacji adder4 Katalog główny MAXPlus2 Pliki systemowe Funkcje biblioteczne.. MaxWork Adder4 fa.tdf fa.inc adder4.tdf 15

Symulacja układu adder4 16

Podstawienie komponentu Podstawienie w linii Argumenty przez połoŝenie waŝna jest kolejność listy; jeŝeli argument nieuŝywany to zostawiamy puste miejsce (s3, cout) = fa(a3, b3, c3); (s2, ) = fa(a2,, c2); (c2, s1) = fa(a1, b1, c1); błędna kolejność wyjść (s0, c1) = fa(b0, a0, cin); błędna kolejność argumentów Argumenty przez nazwy portów kolejność listy nieistotna (s3, cout) = fa(.a=a3,.b=b3,.cin=c3); (s2, c3) = fa(.c=c2,.a=a2,.b=b2); (c2, s1) = fa(.a=a1,.b=b1,.c=c1) RETURNS (.c,.s); (c1) = fa(.b=b0) RETURNS (.c); 17

Podstawienie komponentu Konkretyzacja funkcji eklaracja kopii (instancji) w sekcji VARIABE fa3, fa2, fa1, fa0 : fa; Argumenty przez nazwy portów kolejność listy nieistotna fa3.a = a3; -- przypisanie zmiennych do portów fa3.b = b3; fa3.cin = c3; s3 = fa3.s; cout = fa3.cout; fa2.(a,b,cin) = (a2, b2, c2); -- przypisanie grupowe do portów (s2, c3) = fa2.(s, cout); fa1.(b,cin,a) = (b1, c1, a1); -- kolejność zmieniona (s1, c2) = fa1.(s, cout); fa.(a,b,cin) = (a0, b0, cin); -- przypisanie do nazwy funkcji zamiast do nazwy kopii (c1, s0) = fa0.(cout, s); -- kolejność zmieniona 18

Projekt adder4 konkretyzacja w linii INCUE "fa"; -- brak rozszerzenia.inc SUBESIGN adder4 ( a3, a2, a1, a0, cin : INPUT; b3, b2, b1, b0 : INPUT; s3, s2, s1, s0, cout : OUTPUT; ) VARIABE c3, c2, c1 : NOE; BEGIN (s3, cout) = fa(.a=a3,.b=b3,.c=c3); (s2, c3) = fa(.c=c2,.a=a2,.b=b2); -- kolejność argumentów nieistotna (c2, s1) = fa(.a=a1,.b=b1,.c=c1) RETURNS (.c,.s); -- zmieniona (s0, c1) = fa(.a=a0,.b=b0,.c=cin); EN; kolejność wyjść 19

Projekt adder4 konkretyzacja w linii INCUE "fa"; -- brak rozszerzenia.inc SUBESIGN adder4 ( a3, a2, a1, a0, cin : INPUT; b3, b2, b1, b0 : INPUT; s3, s2, s1, s0, cout : OUTPUT; ) VARIABE c3, c2, c1 : NOE; fa3, fa2, fa1, fa0 : fa; BEGIN (s3, cout) = fa(.a=a3,.b=b3,.c=c3); (s2, c3) = fa(.c=c2,.a=a2,.b=b2); -- kolejność argumentów nieistotna (c2, s1) = fa(.a=a1,.b=b1,.c=c1) RETURNS (.c,.s); -- zmieniona (s0, c1) = fa(.a=a0,.b=b0,.c=cin); EN; kolejność wyjść 20

Projekt adder4 - konkretyzacja [ ] VARIABE c3, c2, c1 : NOE; fa3, fa2, fa1, fa0 : fa; -- deklaracja BEGIN fa3.a = a3; -- przypisanie zmiennych do portów fa3.b = b3; fa3.cin = c3; s3 = fa3.s; cout = fa3.cout; fa2.(a, b, cin) = (a2, b2, c2); -- przypisanie grupowe do portów (s2, c3) = fa2.(s, cout); fa1.(b, cin, a) = (b1, c1, a1); -- kolejność zmieniona (s1, c2) = fa1.(s, cout); fa0.(a, b, cin) = (a0, b0, cin); (c1, s0) = fa0.(cout, s); -- kolejność zmieniona EN 21

Projekt adder4 sygnały grupowe INCUE "fa"; SUBESIGN adder4 ( a[3..0], cin, b[3..0] : INPUT; s[3..0], cout : OUTPUT; ) VARIABE c[3..1] : NOE; BEGIN (s[3], cout) = fa(.a=a[3],.b=b[3],.c=c[3]); (s[2], c[3]) = fa(.c=c[2],.a=a[2],.b=b[2]); (c[2], s[1]) = fa(.a=a[1],.b=b[1],.c=c[1]) RETURNS (.c,.s); (s[0], c[1]) = fa(.a=a[0],.b=b[0],.c=cin); EN; 22

Projekt adder4 sygnały grupowe [..] VARIABE c[3..1] : NOE; ifa[3..0] : fa; -- nie moŝna zadeklarować fa[3..0] bo nazwa kopii fa[x] musi być róŝna od nazwy funkcji fa BEGIN ifa[3].(a,b,cin) = (a[3], b[3], c[3]); (s[3], cout) = ifa[3].(s, cout); ifa[2].(a,b,cin) = (a[2], b[2], c[2]); (s[2], c[3]) = ifa[2].(s, cout); ifa[1].(a,b,cin) = (a[1], b[1], c[1]); (s[1], c[2]) = ifa[1].(s, cout); ifa[0].(a,b,cin) = (a[0], b[0], cin); (s[0], c[1]) = ifa[0].(s, cout); EN; 23

Projekt adder4 sygnały grupowe [..] VARIABE c[3..1] : NOE; ifa[3..0] : fa; BEGIN ifa[3].(a,b,cin) = (a[3], b[3], c[3]); (s[3], cout) = ifa[3].(s, cout); -- podstawienie grupowe ifa[2..1].(a,b,cin) = (a[2], b[2], c[2], a[1], b[1], c[1] ); (s[2], c[3], s[1], c[2] ) = ifa[2..1].(s, cout); ifa[0].(a,b,cin) = (a[0], b[0], cin); (s[0], c[1]) = ifa[0].(s, cout); EN; 24

Generowanie kodu Niektóre układy cyfrowe mają wyraźnie regularną, powtarzalną budowę (pamięci, rejestry, układy iteracyjne) Instrukcja generate jest instrukcją współbieŝną słuŝącą do automatycznej generacji struktur regularnych, tworzonych na bazie struktury wzorcowej 25

Schematy generacji Generowanie struktur replikowalnych moŝe być dokonywane na dwa sposoby: wg schematu for wg schematu if Schemat for jest uŝywany w przypadku struktur regularnych, które moŝna zdefiniować za pomocą indeksu generacji w sposób jak w pętli for Schemat if jest uŝywany, gdy istnieje nieregularność w strukturze, rzadko stosowany 26

Instrukcja FOR GENERATE FOR zmienna IN zakres GENERATE instrukcja1; instrukcja2; EN GENERATE; Zmienna nie ma realizacji sprzętowej, słuŝy wyłącznie do indeksowania instrukcji. 27

Projekt adder4 GENERATE [..] VARIABE c[3..1] : NOE; ifa[3..0] : fa; BEGIN ifa[3].(a,b,cin) = (a[3], b[3], c[3]); (s[3], cout) = ifa[3].(s, cout); FOR i IN 2 TO 1 GENERATE ifa[i].(a,b,cin) = (a[i], b[i], c[i]); (s[i], c[i+1]) = ifa[i].(s, cout); EN GENERATE; ifa[0].(a,b,cin) = (a[0], b[0], cin); (s[0], c[1]) = ifa[0].(s, cout); EN; 28

Instrukcja IF GENERATE IF wyrazenie GENERATE instrukcja1; instrukcja2; ESE GENERATE instrukcja3; instrukcja4; EN GENERATE; 29

Przykład: IF GENERATE Parametr spipe decyduje o liczbie stopni potoku w sumatorze równoległym; jeŝeli spipe=0 to realizacja kombinacyjna -- sumator równoległy sekwencyjny -- z potokiem, dołączony zegar do rejestrów IF(spipe) GENERATE out[] = parallel_add (.data[][]=pipe0[][],.clock=clk) WIT (WIT=, SIZE=B, WITR=A, SIFT=0, REPRESENTATION="SIGNE", PIPEINE=spipe); -- sumator równoległy kombinacyjny -- bez potoku, brak dołączonego zegara ESE GENERATE out[] = parallel_add (.data[][]=pipe0[][]) WIT (WIT=, SIZE=B, WITR=A, SIFT=0, REPRESENTATION="SIGNE", PIPEINE=spipe); EN GENERATE; 30

Parametry Parametry pozwalają pisać kod uniwersalny łuŝej pisze się kod parametryzowany Krócej przenosi się do innego projektu efinicja modułu z parametrem, umieszcza się przed sekcją SUBESIGN PARAMETER n=4; SUBESIGN (.) omyślną wartość parametru moŝna zmienić przez: Wywołanie funkcji w linii (x, y) = funkcja(arg1, arg2) WIT (parametr1 = wartość1, parametr2 = string ); Konkretyzację funkcji z parametrami ifa : fa WIT (n = 4); 31

Projekt addern PARAMETER INCUE "fa"; PARAMETER n=4; SUBESIGN addern ( a[n-1..0], cin, b[n-1..0] : INPUT; s[n-1..0], cout : OUTPUT; ) VARIABE c[n-1..1] : NOE; ifa[n-1..0] : fa; BEGIN ifa[n-1].(a,b,cin) = (a[n-1], b[n-1], c[n-1]); (s[n-1], cout) = ifa[n-1].(s, cout); FOR i IN n-2 TO 1 GENERATE ifa[i].(a,b,cin) = (a[i], b[i], c[i]); (s[i], c[i+1]) = ifa[i].(s, cout); EN GENERATE; ifa[0].(a,b,cin) = (a[0], b[0], cin); (s[0], c[1]) = ifa[0].(s, cout); EN; 32

Projekt addern PARAMETER PARAMETER n = 4; -- moŝna tez CONSTANT n = 4; ale nie jest widoczny na zewnątrz funkcji SUBESIGN addern ( a[n-1..0], b[n-1..0], cin : INPUT; c[n-1..0], cout : OUTPUT; ) VARIABE carry_out[n..1] : NOE; BEGIN carry_out[1] = cin; FOR i IN 0 TO n-1 GENERATE c[i] = a[i] $ b[i] $ carry_out[i]; carry_out[i+1] = a[i] & b[i] # carry_out[i] & (a[i] $ b[i]); EN GENERATE; cout = carry_out[n]; EN; 33

Automaty (jeszcze raz) o realizacji automatu wystarczy podanie diagramu stanów i skonstruowanie tablicy przejść-wyjść Kompilator automatycznie dokonuje następujących operacji: wyboru liczby bitów dla kodowania doboru przerzutników lub T kodowania stanów zastosowania syntezy logicznej do obliczenia funkcji wzbudzeń W celu wyspecyfikowania automatu wystarczy: zadeklarować automat w sekcji VARIABE opisać równania kontrolujące pracę automatu (zegar, reset) opisać przejścia między stanami za pomocą instrukcji: IF-ESE, CASE lub TABE 34

Przykład: automat Moore a Automat Moore a w = 0 Rst A/z = 0 w = 1 B/z = 0 w = 0 w = 0 w = 1 w = 1 C/z = 1 x s 0 1 z A A B 0 B A C 0 C A C 1 35

Automat instrukcja CASE SUBESIGN aut ( w, clk, reset : INPUT; z : OUTPUT; ) VARIABE aut : MACINE WIT STATES (A, B, C); BEGIN aut.clk = clk; aut.reset = reset; CASE aut IS WEN A => IF (w) TEN aut = B; ESE aut = A; EN IF; WEN B => IF (w) TEN aut = C; ESE aut = A; EN IF; WEN C => IF (w) TEN aut = C; ESE aut = A; EN IF; EN CASE; z = (aut == C); -- wyjście zaleŝy tylko od stanu C EN; Pierwszy na liście to stan po włączeniu zasilania i po reset eklaracja abstrakcyjnej maszyny stanów Opis przejść automatu Opis wyjść automatu 36

Automat - symulacja Realizacja na trzech przerzutnikach przy automatycznym kodowaniu stanów; A=000, B=101, C=110 37

Automat instrukcja TABE SUBESIGN aut ( w, clk, reset : INPUT; z : OUTPUT; ) VARIABE aut : MACINE WIT STATES (A, B, C); BEGIN aut.clk = clk; aut.reset = reset; TABE aut, w => aut, z; -- opis automatu Meale go A, 0 => A, 0; A, 1 => B, 0; B, 0 => A, 0; B, 1 => C, 0; C, 0 => A, 0; C, 1 => C, 1; EN TABE; -- z = (aut == C); % Opis wyjścia w tabeli % EN; 38

Automat instrukcja IF SUBESIGN aut ( w, clk, reset : INPUT; z : OUTPUT; ) VARIABE aut : MACINE WIT STATES (A, B, C); BEGIN aut.clk = clk; aut.reset = reset; IF (aut==a) TEN IF (w) TEN aut = B; ESE aut = A; EN IF; EN IF; F (aut==b) TEN IF (w) TEN aut = C; ESE aut = A; EN IF; EN IF; IF (aut==c) TEN IF (w) TEN aut = C; ESE aut = A; EN IF; EN IF; z = (aut == C); EN; 39

Automat kodowanie stanów SUBESIGN aut ( w, clk, reset : INPUT; z : OUTPUT; eklaracja przerzutników automatu ) VARIABE aut : MACINE OF BITS (q[1..0]) WIT STATES (A=0, B=1, C=2); BEGIN aut.clk = clk; aut.reset = reset; CASE aut IS WEN A => IF (w) TEN aut = B; ESE aut = A; EN IF; WEN B => IF (w) TEN aut = C; ESE aut = A; EN IF; WEN C => IF (w) TEN aut = C; ESE aut = A; EN IF; WEN OTERS => aut = A; EN CASE; z = (aut == C); EN; Kodowanie stanów Realizacja na 2 przerzutnikach, zamiast 3 przy kodowaniu automatycznym (domyślnie: kodowanie one-hot dla układów FPGA) Wychodzenie ze stanów zabronionych, zakodowano 3 z 4 stanów 40

Automat kodowanie stanów SUBESIGN aut ( w, clk, reset : INPUT; z : OUTPUT; ) VARIABE Pierwszy stan zakodowany 0 aut : MACINE OF BITS (q[1..0]) WIT STATES (A=3, B=1, C=2); BEGIN aut.clk = clk; aut.reset = reset; CASE aut IS WEN A => IF (w) TEN aut = B; ESE aut = A; EN IF; WEN B => IF (w) TEN aut = C; ESE aut = A; EN IF; WEN C => IF (w) TEN aut = C; ESE aut = A; EN IF; WEN OTERS => aut = A; EN CASE; z = (aut == C); EN; 41