opis WinCUPL w języku polskim, instrukcja (dr inż. Jarosław Sugier)
Transkrypt
opis WinCUPL w języku polskim, instrukcja (dr inż. Jarosław Sugier)
Środowisko WinCUPL – instrukcja laboratoryjna dr inż. Jarosław Sugier J. Sugier WinCUPL – instrukcja laboratoryjna 1 1 Informacje ogólne Pakiet oprogramowania WinCUPL firmy Atmel służy do specyfikacji, symulacji oraz implementacji układów cyfrowych w programowalnych układach logicznych (PLD) tej firmy. Oprócz własnych układów CPLD (Complex PLD) firmy Atmel wspierane są także standardowe układy PLD rodzin 16V8, 20V8 oraz 22V10. Wersja przeznaczona dla środowiska MS Windows jest dostępna bezpłatnie na stronie www.atmel.com. Plik instalatora ma ok. 22 MB, a po zainstalowaniu w grupie „Atmel WinCupl” dostępne są dwie ikony, służące do uruchamiania: zintegrowanego edytora projektu (WinCupl, ) oraz symulatora (WinSim, ). ) Domyślnie proponowana ścieżka instalacji środowiska to „C:\Wincupl”; przy zmianie należy pamiętać o tym, że nie mogą znaleźć się w niej odstępy. Nie jest celem niniejszego opracowania przedstawienie wyczerpującego opisu języka CUPL; w tym celu patrz przede wszystkim pozycje [1] oraz [2]. Przedstawione tu informacje mają pozwolić na szybkie rozpoczęcie pracy w środowisku WinCUPL, tzn. syntezę oraz symulację funkcjonalną układów kombinacyjnych oraz sekwencyjnych. 2 Język CUPL Język CUPL służy do tekstowego opisu układu cyfrowego. Umożliwia jego specyfikację poprzez podanie równań logicznych lub poprzez opis proceduralny przy użyciu instrukcji własnych. Dodatkowe możliwości organizacji tekstu źródłowego udostępnia preprocesor podobny w składni oraz działaniu do preprocesora języka C. Tekst opisu przechowywany jest w niesformatowanych plikach tekstowych o domyślnym rozszerzeniu .PLD (do symulacji dodatkowo niezbędny jest plik .SI). Całość opisu w pliku .PLD można podzielić na następujące sekcje (por. przykładowe projekty w dodatku B na str. 16): 1) nagłówek z informacjami ogólnymi o projekcie, 2) deklaracje wyprowadzeń przenoszących sygnały wejściowe, 3) deklaracje wyprowadzeń przenoszących sygnały wyjściowe, 4) inne deklaracje i definicje (zmiennych wewnętrznych, stałych preprocesora itp.), 5) równania logiczne lub inny opis logiki układu. 2.1 Elementy języka Komentarze Tekst umieszczony miedzy symbolami ‘/* … */’ (podobnie jak w języku C) jest traktowany jako komentarz i jest ignorowany przez kompilator. Nazwy zmiennych Nazwy zmiennych identyfikują sygnały na wyprowadzeniach (PIN) oraz w tzw. węzłach wewnętrznych (NODE) układu PLD. Mogą także definiować tzw. zmienne wewnętrzne, które pomagają w bardziej czytelnym zapisie równań logicznych, lecz nie reprezentują żadnych specyficznych zasobów w strukturze układu. Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 2 Nazwy mają postać ciągu złożonego z cyfr, liter i znaku pokreślenia. Muszą zawierać co najmniej jedną literę, ale nie jest wymagane, aby się od litery zaczynały. Nazwy nie mogą być takie same jak słowa kluczowe: APPEND ASSEMBLY ASSY COMPANY CONDITION DATE DEFAULT DESIGNER DEVICE ELSE FIELD FLD FORMAT FUNCTION FUSE GROUP IF JUMP LOC LOCATION MACRO MIN NAME NODE OUT PARTNO PIN PINNNODE PRESENT REV REVISION SEQUENCE SEQUENCED SEQUENCEJK SEQUENCERS SEQUENCET TABLE Wielkość liter w nazwach zmiennych JEST rozróżniana, w słowach kluczowych oznaczających instrukcje języka CUPL – nie. Nazwy indeksowane Nazwy indeksowane można używać do opisu grupy sygnałów, np. magistrali. Maja postać identyfikatora, do którego dołączony jest indeks w postaci liczby dziesiętnej z przedziału 0…31, np.: A0, A1, A2, A3, A4, A5, A6, A7 ) Ze względu na wewnętrzną reprezentację wektorów bitowych wskazane jest rozpoczynanie numeru indeksu od 0. Liczby Wszystkie operacje numeryczne wykonywane są na liczbach 32-bitowych bez znaku, stąd ich zakres wynosi od 0 do 232–1. Zapis liczby możliwy jest w bazie dwójkowej, ósemkowej, dziesiętnej oraz szesnastkowej poprzez użycie odpowiedniego przedrostka: ‘b’ / ‘o’ / ‘d’ / ‘h’. Np. Zapis 'b'0 'B'1101 'O'663 'D'92 'h'BA Baza Binary Binary Octal Decimal Hexadecimal Wartość dziesiętna 0 13 435 92 186 Bazą domyślną jest zapis szesnastkowy za wyjątkiem numerów wyprowadzeń (PIN) oraz numerów indeksowych, które zawsze podawane są dziesiętnie. W niektórych konstrukcjach językowych w zapisach dwójkowych, ósemkowych oraz szesnastkowych można używać symbolu ‘X’ dla oznaczenia wartości nieokreślonej. Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 3 Listy Lista jest wygodną notacją używaną np. przy deklaracji wielu wyprowadzeń lub węzłów. Ma postać oddzielanego przecinkami ciągu nazw, ujętych w parę nawiasów kwadratowych: [zm, zm, … zm] np. [ Clk, A, B, Cin ] Jeśli lista składa się z nazw indeksowych o kolejnych numerach indeksów, można użyć zapisu skrótowego: [zmK .. zmL] gdzie K / L są odpowiednio pierwszym i ostatnim numerem w zakresie indeksu (nie jest wymagane, aby K < L). Można wówczas pominąć nazwę zmiennej przed indeksem końcowym L: [A0, A1, A2, A3, A4, A5, A6, A7] ⇔ [A0..A7] ⇔ [A0..7] Deklaracje wyprowadzeń (PIN) W deklaracji PIN następuje przypisanie nazwy do sygnału na wyprowadzeniu o podanym numerze oraz określenie jego polaryzacji. Składnia: PIN pin_n = [ ! ] zm ; gdzie: PIN jest wymaganym słowem kluczowym, pin_n jest zapisanym dziesiętnie numerem wyprowadzenia obudowy, a zm jest nazwą przypisanego sygnału. Występujący opcjonalnie znak negacji ‘!’ określa polaryzację ujemną (stan aktywny = 0 logiczne). Podobnie jak w języku C, znakiem końcowym musi być średnik. Elementy pin_n oraz zm można zapisać w postaci list o tej samej długości. Przykłady: PIN 1 = Clk; PIN [ 2, 5, 6 ] = [ A, B, C ]; PIN [ 10..7 ] = [ A3..0 ]; Deklaracje węzłów (NODE) Niektóre układy PLD zawierają zasoby wewnętrzne, które generują funkcje logiczne, ale nie są przypisane do wyprowadzeń zewnętrznych. Dostęp do nich jest możliwy poprzez zdefiniowanie tzw. węzłów wewnętrznych w poleceniu NODE: NODE [!] zm ; Liczba węzłów wewnętrznych oraz ich funkcje to dane specyficzne dla konkretnego układu i aby je poznać należy odwołać się do jego opisu. W prostych układach PLD używanych na laboratorium (G16V8, G22V10) węzły wewnętrzne nie występują. Pola bitowe Deklaracja pola bitowego przypisuje nazwę do listy sygnałów jednobitowych. Ma postać: FIELD zm = [zm, zm, … zm] ; Po taki przypisaniu nazwa może występować w wyrażeniach tak, jakby w jej miejscu wystąpił odpowiedni zapis listy, a operacje wykonywane na niej są wykonywane na każdym bicie z przypisanej grupy. Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 4 Preprocesor Podobnie jak w języku C, preprocesor przetwarza tekst źródłowy przed przekazaniem go do kompilatora CUPL. Rozpoznaje on następujące dyrektywy ([1]): $DEFINE $ELSE $ENDIF $MACRO $IFDEF $UNDEF $IFNDEF $REPEAT $INCLUDE $REPEND $MEND Np. dla nadawania stałym czytelnych nazw symbolicznych należy używać dyrektywy $DEFINE: $DEFINE $DEFINE $DEFINE $DEFINE StateA StateB StateC StateD ‘b’00 ‘b’01 ‘b’11 ‘b’10 W dyrektywach preprocesora wielkie i małe litery nie są rozróżniane, ale zwykle pisze się je wielkimi literami – podobnie jak słowa kluczowe języka. 2.2 Składnia języka Operatory logiczne Do zapisu wyrażeń logicznych w języku CUPL dostępne są cztery podstawowe operatory, każdy o innym priorytecie. W kolejności od priorytetu najwyższego są to: ! & # $ np. !A A&B A#B A$B NOT AND OR XOR W wyrażeniach złożonych wymaganą kolejność operacji określa się nawiasami (…). Dwuargumentowe operatory logiczne mogą występować obok notacji listowej wg następujących reguł: (A) [zm, zm … zm] @ arg2 ⇔ [zm @ arg2, zm @ arg2 … zm @ arg2] (B) [z1, z1 … z1] @ [z2, z2 … z2] ⇔ [z1 @ z2, z1 @ z2 … z1 @ z2] (C) [zm, zm … zm] : @ ⇔ zm @ zm @ … zm Symbol @ oznacza tu operator &, # lub $. Przykłady: [D0, D1, D2, D3] & read [A0..3] $ [B0..3] [A3,A2,A1,A0]:$ ⇔ ⇔ ⇔ [D0 & read, D1 & read, D2 & read, D3 & read] [A0 $ B0, A1 $ B1, A2 $ B2, A3 $ B3] A3 $ A2 $ A1 $ A0 Operatory i funkcje arytmetyczne Wyrażenia arytmetyczne mogą wystąpić jedynie w poleceniach preprocesora $REPEAT (powielanie fragmentu tekstu) oraz $MACRO (tworzenie makr). Szczegóły podane są w [1]. Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 5 Przyrostki nazw (rozszerzenia) Przyrostki dodawane są do nazw, aby wskazać specyficzna funkcję, związaną z realizacją danego sygnału. Kompilator sprawdza, czy podany przyrostek jest odpowiedni jako funkcja sygnału w konkretnym układzie i na konkretnym wyprowadzeniu oraz czy nie pozostaje on w konflikcie z innymi użytymi przyrostkami. W przypadku błędów generowany jest odpowiedni komunikat. Pełna lista przyrostków podana jest w dodatku C. Przykład użycia przyrostków: S.D S.AR S.OE = A $ B; = R; = E & !R; /* funkcja zatrzaskiwana w rejestrze */ /* asynchroniczne kasowanie sygnałem R */ /* kontrola bufora WY sygnałami E oraz R */ Użycie przyrostków musi być w zgodzie z możliwościami struktury wybranego układu. Np. w układach 22V10 sygnał .AR jest wspólny dla wszystkich przerzutników (zatem nie można definiować go dwukrotnie w różny sposób) oraz musi mieć postać pojedynczego prostego termu. Niespełnienie tych wymogów powoduje wygenerowanie błędu. ) W układach 16V8 oraz 22V10 sygnały zegarowe przerzutników nie są programowalne i zastosowanie dla nich przyrostka .CK spowoduje błąd. Wyrażenia logiczne Wyrażenia logiczne są konstruowane przy użyciu wymienionych czterech operatorów, nazw zmiennych oraz par nawiasów ‘(…)’. Jeśli w wyrażeniu złożonym na jednym jego poziomie występują te same operatory, kolejność ich wykonania jest od strony lewej do prawej (tzn. operatory są lewostronnie łączne). 2.3 Opis zależności kombinacyjnych Układ kombinacyjny można opisać podając jego równanie boolowskie, tabelę prawdy lub opisując jego pracę na wyższym poziomie instrukcją CONDITION. Równania logiczne Ogólna postać równania logicznego jest następująca: [!]zm[.ext] = wyr ; gdzie zm jest zmienną, której równanie jest przypisywane, .ext oznacza opcjonalne rozszerzenie precyzujące aspekt działania zmiennej, a wyr jest wyrażeniem logicznym. Nazwę zmiennej można poprzedzić ‘!’, co określa jej ujemną polaryzację (w tym kontekście daje to efekt identyczny, jak zanegowanie wyrażenia stojącego po prawej stronie znaku ‘=’). Przykład użycia przyrostków (powyżej) zawiera także przykłady równań logicznych. Jeśli zm nie jest nazwą zadeklarowaną uprzednio w instrukcji PIN lub NODE, kompilator automatycznie przyjmuje, że równanie definiuje nową zmienną wewnętrzną, do której można się odwoływać w innych wyrażeniach logicznych. Zmienne wewnętrzne zazwyczaj wprowadza się po to, aby uprościć i uczynić bardziej czytelnym zapis innych wyrażeń. W miejscu zm może w równaniu wystąpić notacja listowa; w takim wypadku równanie logiczne stosuje się do każdego elementu listy indywidualnie, np.: Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna [Q2..0].OE = !PinOE; ⇔ 6 Q2.OE = !PinOE; Q1.OE = !PinOE; Q0.OE = !PinOE; Instrukcja APPEND, która może poprzedzać równanie logiczne, umożliwia konstruowanie opisu zmiennej etapami – poprzez dodawanie kolejnych członów, które są ze sobą logicznie sumowane. Np.: APPEND Y = A0 & A1 ; APPEND Y = B0 & B1 ; APPEND Y = C0 & C1 ; ⇔ Y = (A0 & A1) # (B0 & B1) # (C0 & C1) ; W takiej sytuacji pierwsze równanie dla zmiennej Y nie musi być poprzedzone słowem APPEND, ale kolejne - tak. Mechanizm polecenia APPEND jest niekiedy konieczny w opisach proceduralnych układu cyfrowego. Tabele prawdy Proste funkcje kombinacyjne można opisać podając ich tabelę prawdy. Składnia odpowiedniego polecenia jest następująca: TABLE lista_zmWE => lista_zmWY { WE_0 => WY_0 ; … WE_N => WY_N ; } gdzie: lista_zmWE oraz lista_zmWY to listy zmiennych wejściowych i wyjściowych funkcji, a WE_i oraz WY_i to stałe opisujące kolejne wiersze tabeli prawdy, czyli argumenty oraz przyporządkowane im wartości. Przykład: TABLE [ A, B ] { ‘b’00 => ‘b’01 => ‘b’10 => ‘b’11 => } => Y /* Y = A XNOR B */ ‘b’1; ‘b’0; ‘b’0; ‘b’1; Instrukcja CONDITION Instrukcja CONDITION służy do opisu funkcji kombinacyjnych na wyższym poziomie niż równania logiczne. Ma postać: CONDITION { IF wyr0 OUT zm0 ; … IF wyrN OUT zmN ; [ DEFAULT OUT zmM ; ] } gdzie: wyrX jest wyrażeniem logicznym złożonym ze zmiennych wejściowych funkcji, a zmX jest nazwą zadeklarowaną w instrukcji PIN lub grupą takich nazw zapisanych w notacji listowej. Zapis taki oznacza, że zmienna zmX ma być ustawiona w stan Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 7 aktywny (jeden lub zero w zależności od polaryzacji logicznej podanej w deklaracji PIN), gdy spełniony jest warunek wyrX; jeśli żaden z warunków nie jest spełniony, układ ustawia wyjścia wg opcjonalnej instrukcji DEFAULT. Należy zaznaczyć, że powyższy opis podaje tylko te sytuacje, w których zmienne są ustawiane; jeśli dla jakiegoś pobudzenia WE zmienna jest kasowana, nie zapisuje się tego w instrukcji CONDITION (tzn. zabroniony jest zapis OUT !zmX). Przykład opisu dekodera 2:4 z sygnałem Enable: PIN [1,2] = [A,B] ; PIN 3 = !enable ; PIN [12..15] = [Y0..3] ; /* Data Inputs */ /* Enable Input */ /* Decoded Outputs */ CONDITION { IF enable & !B & !A IF enable & !B & A IF enable & B & !A IF enable & B & A } OUT OUT OUT OUT Y0 ; Y1 ; Y2 ; Y3 ; 2.4 Opis układów sekwencyjnych Maszyny stanów opisywane są w języku CUPL za pomocą instrukcji SEQUENCE. Jej ogólna postać jest następująca: SEQUENCE lista_zm_stanu { PRESENT stan0 instrukcje; … PRESENT stanN instrukcje; } gdzie: lista_zm_stanu jest listą zmiennych kodujących stan automatu, stanX identyfikuje konkretny stan (tzn. jest stałą podającą wartość zmiennych stanu), a instrukcje opisują zachowanie automatu w tym stanie. Specyfikacja przełączania automatu Przełączanie się automatu między stanami opisują instrukcje NEXT, które występują w wersji bezwarunkowej lub warunkowej. Jeśli dla stanu bieżącego stanem następnym jest zawsze jeden i ten sam stan (czyli w grafie automatu ze stanu wychodzi tylko jedna krawędź), opisuje to instrukcja NEXT bezwarunkowa: PRESENT stanK NEXT stanL ; Np. pracę prostego licznika modulo 3 (tu układ bez wejść) można wyrazić następująco: SEQUENCE [Q1, Q0] { PRESENT 'b'00 NEXT 'b'01 ; PRESENT 'b'01 NEXT 'b'10 ; Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 8 PRESENT 'b'10 NEXT 'b'00 ; } Dla zwiększenia czytelności należy za pomocą dyrektywy $DEFINE definiować nazwy symboliczne dla stałych, które reprezentują poszczególne stany; najczęściej definiuje się także pole bitowe FIELD dla listy zmiennych stanu. Powyższy przykład należy więc przepisać następująco: FIELD zmStan = [Q1, Q0]; $DEFINE Stan0 'b'00 $DEFINE Stan1 'b'01 $DEFINE Stan2 'b'10 SEQUENCE zmStan { PRESENT Stan0 NEXT Stan1 ; PRESENT Stan1 NEXT Stan2 ; PRESENT Stan2 NEXT Stan0 ; } Warunkowa instrukcja NEXT opisuje przełączanie się automatu uzależnione od pobudzeń wejściowych: PRESENT stanK IF warunek NEXT stanL ; gdzie warunek jest wyrażeniem logicznym, w którym zazwyczaj występują pobudzenia WE automatu. W sytuacji, gdy ze stanu stanK wychodzi w grafie wiele krawędzi, dla każdej z nich należy zapisać odpowiednią warunkową instrukcję NEXT. Np. dla licznika rewersyjnego, którego kierunek zliczania określa sygnał jednobitowy CountUp: (…) PRESENT Stan1 IF CountUp NEXT Stan2 ; IF !CountUp NEXT Stan0 ; (…) Listę warunkowych instrukcji NEXT może opcjonalnie kończyć instrukcja DEFAULT stanX ; , która podaje do jakiego stanu automat ma się przełączyć, jeśli żaden z wcześniejszych warunków nie jest spełniony. Np. dla licznika rewersyjnego z dwoma sygnałami sterującymi CountUp oraz CountDown: (…) PRESENT Stan1 IF CountUp NEXT Stan2 ; IF CountDown NEXT Stan0 ; DEFAULT Stan1 ; (…) /* step up */ /* step down */ /* freeze */ ) Instrukcję DEFAULT należy stosować rozważnie, ponieważ powoduje ona dodanie warunku będącego negacją sumy wszystkich warunków wcześniejszych. W przypadku dużych automatów może prowadzić do zależności złożonych, które będą się źle odwzorowywały w zasobach układu Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 9 PLD. Metodą lepszą jest wypisanie explicite dodatkowych warunków w postaci jawnych instrukcji IF … NEXT …; . Specyfikacja funkcji wyjść automatu Sygnały wyjściowe generowane przez automat opisuje instrukcja OUT. Sygnały te po obliczeniu w odpowiednim wyrażeniu logicznym mogą być wyprowadzane kombinacyjnie lub zatrzaskiwane w przerzutnikach – mówi się wówczas odpowiednio o instrukcji OUT asynchronicznej bądź synchronicznej. Ponadto sygnały te mogą zależeć tylko od zmiennych stanu (model Moore’a) lub od zmiennych stanu oraz sygnałów wejściowych (model Mealy’ego) – w nomenklaturze CUPL będą to sygnały wyjściowe odpowiednio bezwarunkowe oraz warunkowe. (A) Asynchroniczne WY bezwarunkowe (model Moore’a) Polecenie OUT należy umieścić w instrukcjach związanych z odpowiednim stanem, bez żadnych dodatkowych informacji. Zapis: PRESENT stanK OUT zm ... OUT zm ; oznacza, że w stanie stanK będą ustawiane zmienne wymienione po słowach OUT. Uwaga: jeśli jakaś zmienna WY ma być w danym stanie kasowana, nie występuje na liście; w tym kontekście (podobnie jak dla instrukcji CONDITION) nie jest dopuszczalne używanie notacji OUT !zm ; Np. dla PRESENT ‘b’01 OUT Y OUT Z ; /* FIELD zmStan = [Q1, Q0]; */ zostanie automatycznie dodany opis sygnałów Y, Z: APPEND Y = !Q1 & Q0; APPEND Z = !Q1 & Q0; (B) Asynchroniczne WY warunkowe (model Mealy’ego) Polecenia OUT należy poprzedzić klauzulami warunkowymi IF, testującymi stan pobudzeń WE. Powstają w ten sposób dwa rodzaje warunków IF dla każdego stanu: pierwsze opisują przełączanie się stanu (z instrukcjami NEXT), drugie opisują generowanie sygnałów WY (z instrukcjami OUT). Zapis: PRESENT stanK IF wyr OUT zm ... OUT zm ; … IF wyr OUT zm ... OUT zm ; [ DEFAULT OUT zm ... OUT zm ; ] podaje, jakie zmienne WY będą ustawiane w stanie stanK przy spełnieniu odpowiednich warunków logicznych wyr. Opcjonalna instrukcja DEFAULT opisuje stan wyjść gdy żaden z warunków nie będzie spełniony. Podobnie jak w (A), jeśli jakaś zmienna WY ma być dla danego warunku zerowana, nie występuje na liście. Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 10 Np. dla: PRESENT 'b'01 IF INA OUT Y; IF !INA OUT Z; zostanie wygenerowany opis sygnałów Y, Z: APPEND Y = !Q1 & Q0 & INA; APPEND Z = !Q1 & Q0 & !INA; (C) Synchroniczne WY bezwarunkowe (model Moore’a + WY z przerzutnikami) W tym przypadku opis WY dokonuje się w instrukcji NEXT: PRESENT stanK NEXT stanL OUT [!]zm ... OUT [!]zm ; Odmiennie niż w (A) i (B), nazwy sygnałów WY można poprzedzić operatorem negacji, co powoduje ustawianie ich na wartość 0 zamiast 1. Np. dla PRESENT 'b'01 NEXT 'b'10 OUT Y OUT !Z ; zostanie wygenerowany opis sygnału Y (w przypadku korzystania z przerzutnika typu D opis zmiennej Z nie zostanie wygenerowany): APPEND Y.D = !Q1 & Q0; /* brak nowego opisu dla sygnału Z */ (D) Synchroniczne WY warunkowe (model Mealy’ego + WY z przerzutnikami) W tym przypadku polecenia OUT należy umieszczać w warunkowych instrukcjach NEXT, opisujących przełączanie się automatu: PRESENT stanK IF wyr NEXT stanL OUT [!]zm ... OUT [!]zm ; … IF wyr NEXT stanL OUT [!]zm ... OUT [!]zm ; [ DEFAULT NEXT stanL OUT [!]zm ... OUT [!]zm ; ] Podobnie jak w (C), poprzedzenie nazwy sygnału WY operatorem negacji oznacza jego ujemną polaryzację logiczną. Np. dla: PRESENT 'b'01 IF INA NEXT 'b'10 OUT Y; IF !INA NEXT 'b'11 OUT Z; zostanie dodany opis sygnałów Y, Z: APPEND Y.D = !Q1 & Q0 & INA; APPEND Z.D = !Q1 & Q0 & !INA; Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 11 3 Praca w środowisku WinCUPL Aplikacja Wincupl.exe jest głównym interfejsem pracy ze środowiskiem. Umożliwia edycje tekstu plików źródłowych oraz wywołuje inne narzędzia pakietu, takie jak kompilator CUPL oraz symulator WinSim. Plikami źródłowymi (których tekst przygotowuje użytkownik) są: plik .PLD dla kompilatora oraz plik .SI dla symulatora. 3.1 Aplikacja WinCupl Za pomocą aplikacji WinCupl można tworzyć nowe projekty, wprowadzać tekst źródłowy, poddawać go kompilacji oraz wywoływać symulator. Opis kroków, które składają się na te operacje, podany jest w podpunkcie 3.3. Szczegóły dotyczące dostępnych poleceń menu dostępne są w systemie pomocy, ale standardowy interfejs okienkowy tej aplikacji jest na tyle prosty, że poruszanie się w nim nie powinno sprawiać problemu. Tekst źródłowy w pliku .PLD należy przygotować zgodnie z opisem języka CUPL, podanym w rozdziale 2. 3.2 Aplikacja WinSim Aplikacja WinSim umożliwia symulację funkcjonalną projektu opisanego w języku CUPL. Do jej pracy konieczne jest utworzenie pliku .SI, w którym zapisuje się pobudzenia testowe symulacji. Treść pliku .SI składa się z dwóch części (por. przykładowe pliki w dodatku B na str. 16): – blok nagłówka - ma postać identyczną jak nagłówek pliku .PLD projektu; – blok instrukcji - opisuje symulację układu. Instrukcja ORDER Instrukcja ORDER podaje, jakie sygnały projektu mają uczestniczyć w symulacji: ORDER: zm, zm, … zm ; Dla grupy sygnałów indeksowych można użyć skrótowej notacji listowej, w tym przypadku bez pary nawiasów ‘[…]’, np.: ORDER: Clk, Reset, Q0..7; ) Grupy sygnałów zapisane w notacji listowej są wyświetlane w oknie WinSim jako jeden sygnał (magistrala); aby zobaczyć poszczególne składowe należy zaznaczyć nazwę sygnału, kliknąć na nią prawym klawiszem myszy oraz wybrać opcję „Bus Members”. Instrukcja VECTORS Instrukcja VECTORS: rozpoczyna część pliku .SI, w której podany jest ciąg wektorów z pobudzeniami testowymi. W wektorach należy podać odpowiedni symbol dla każdego sygnału z listy ORDER, zarówno wejściowego, jak i wyjściowego. Symbole dla sygnałów WE określają ich pobudzenia podczas symulacji, natomiast symbole dla sygnałów WY podają oczekiwane odpowiedzi. Symbole dla sygnałów wejściowych (zadawane pobudzenia): 0 – zadaj stan niski (Lo) 1 – zadaj stan wysoki (Hi) C – zadaj impuls dodatni (sekwencję stanów Lo - Hi – Lo) Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 12 Rysunek 1: Symulacja układu sekwencyjnego wykonana poleceniami C (kroki 1 ÷ 10) oraz identyczny ciąg wejściowy zadany przy pobudzaniu sygnału zegarowego poleceniami 0 / 1 (kroki 11 ÷ 30). Trzy odpowiedzi układu Y = 1 nie są takie same, co widać dopiero w symulacji CLK = 0 / 1. K – zadaj impuls ujemny (sekwencję stanów Hi - Lo – Hi) X – brak pobudzenia danego WE Symbole dla sygnałów wyjściowych (testy odpowiedzi): L – testuj stan niski (L) H – testuj stan wysoki (H) Z – testuj stan wysokiej impedancji X – nie testuj stanu * – wyznacz w symulacji stan sygnału i wstaw go do wektora Przykład: ORDER: WeA, WeB, WyC, WyS; VECTORS: 00** 01** 11** 10** ) Symbole C oraz K są wygodne w tworzeniu pobudzeń sygnałów zegarowych, ale należy pamiętać, że generują one ciąg 3 stanów w symulacji, a na wykresie wyświetlany jest tylko jeden krok przedstawiający odpowiedzi. W niektórych przypadkach, kiedy potrzebna jest dokładna analiza przełączania się układu, może być konieczne zastąpienie ich ciągiem pobudzeń pojedynczych. Przykład takiej sytuacji ilustruje rysunek 1. Dyrektywy symulatora Dyrektywy można umieszczać w liniach za instrukcją VECTOR i służą do kontroli procesu symulacji. Wszystkie rozpoczynają się znakiem ‘$’ i kończą średnikiem. Pełna lista 6 dyrektyw podana jest w [1]. Szczególnie użyteczna może być dyrektywa $REPEAT n ; gdzie n jest liczbą z przedziału 1..9999, która powoduje n – krotne powtórzenie (jednego) zapisanego za nią wektora. Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 13 3.3 Przewodnik krok po kroku Poniższe 10 kroków opisuje pełną ścieżkę pracy w środowisku WinCUPL: od utworzenia nowego projektu po uzyskanie wyników symulacji. Wymagane polecenia opisano w najprostszej wersji, natomiast w zintegrowanym środowisku istnieją inne, niekiedy bardziej wygodne możliwości ich wykonania (np. symulator można uruchomić klikając dwukrotnie na nazwę pliku .SI w oknie projektu WinCupl itp.). 1) Uruchom program WinCupl i wybierz polecenie File → New → Project. 2) W pierwszym oknie dialogowym wpisz informacje, jakie znajdą się w nagłówku pliku .PLD; z informacji istotnych: – jako „Name” podaj nazwę projektu, która będzie jednocześnie nazwą pliku (zaleca się, by nazwa nie miała więcej niż 8 znaków i spełniała wymagania nazw DOS); – jako „Device” wpisz symbol układu (dla układów GAL: G16V8 lub G22V10). ) Układy PLD dostępne w bibliotece CUPL można przeglądać poleceniem Options → Devices. 3) W kolejnych oknach dialogowych podaj parametry projektu: ilość wyprowadzeń WE, ilość wyprowadzeń WY oraz ilość węzłów wewnętrznych (w układach GAL węzły wewnętrzne nie występują). 4) Zostanie utworzony plik .PLD z pustym szablonem; wpisz do niego deklaracje wyprowadzeń WE oraz WY (instrukcje PIN) oraz równania logiczne lub inny opis funkcjonalny układu. ) Podawane numery wyprowadzeń w deklaracji PIN muszą zgadzać się z rodzajem wyprowadzenia (WE, WY lub WE/WY) dla użytego układu; funkcje poszczególnych wyprowadzeń należy odczytywać z jego schematu logicznego. 5) Gdy opis układu będzie kompletny, wykonaj kompilację pliku PLD (polecenie Run → Device Dependent Compile, skrót F9 lub klawisz ); gdy kompilacja przebiegnie bez błędów, możesz przejść dalej. 6) Uruchom symulator: polecenie Utilities → WinSim lub klawisz . ) Nie należy uruchamiać symulatora bez uprzedniej kompilacji projektu; praca symulatora zależy od dodatkowych plików generowanych podczas kompilacji i ich brak będzie powodował błędy. Uwaga ta dotyczy także wprowadzania poprawek do projektu: należy pamiętać, aby po modyfikacji pliku .PLD lub .SI zawsze wykonać kompilację przed wywołaniem WinSim. 7) W symulatorze WinSim rozpocznij od utworzenia pliku .SI poleceniem File → New (Ctrl+N). W oknie dialogowym, zamiast wprowadzać ponownie takie same informacje jak dla pliku .PLD (dane w nagłówkach obu plików muszą być identyczne), naciśnij klawisz „Desing File…” i wskaż odpowiedni plik .PLD. Po zatwierdzeniu danych w symulatorze pojawi się okno symulacji. 8) Dodaj śledzone sygnały poleceniem Signal → Add Signal (klawisz ); w pliku .Si zostanie dopisana instrukcja ORDER. Następnie zapisz plik poleceniem File → Save (zostanie utworzony nowy plik). 9) Dodaj wektory testowe, tzn. instrukcję VECTORS. Można to wykonać poprzez interfejs graficzny (polecenie Signal → Add Vector lub klawisz i następnie Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 14 klikanie myszką w odpowiedni punkt wykresu), ale bardziej niezawodną i zalecaną metodą jest wpisanie ich jako tekst do pliku .SI po otwarciu go poleceniem View → Source. Pamiętaj o zapisaniu zmian w pliku .SI. 10) Gdy plik .SI jest gotowy, uruchom symulator poleceniem Simulator → Run Simulator (klawisz ). Jeśli w plikach źródłowych nie było błędów, w oknie symulatora zostaną wyświetlone wykresy z przebiegami czasowymi w układzie. Literatura [1] CUPL Programmer's Reference Guide, Atmel Corporation (wersja elektroniczna w systemie pomocy aplikacji wincupl.exe). [2] T. Łuba, M.A. Markowski, B. Zbierzchowski, Komputerowe projektowanie układów cyfrowych w strukturach PLD, WKŁ. [3] Atmel – WinCUPL User’s manual, Atmel Corporation, dokument dostępny jako plik pdf na www.atmel.com. [4] Pliki pomocy aplikacji WinCupl oraz WinSim. Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 15 Dodatek A: Środowisko CUPL Input file types: .PLD Logic source file .SI Simulation source file Output file types: .SO Simulator Output with errors .HL HL Download file .HEX Hex Download file .JED JEDEC file without test vectors JEDEC file with test vectors Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 16 Dodatek B: Przykłady plików projektowych 1) HalfAdd.PLD: Name PartNo Date Revision Designer Company Assembly Location Device HalfAdd; 00 ; 2006-02-16 ; 01 ; Engineer ; PWr ; None ; None; G16V8 ; /* *************** INPUT PINS *********************/ PIN 2 = A; PIN 3 = B; /* *************** OUTPUT PINS *********************/ PIN 15 = S; /* sum */ PIN 16 = C; /* carry */ S = A $ B; C = A & B; /* S = A XOR B */ /* C = A AND B */ HalfAdd.SI: Name PartNo Date Revision Designer Company Assembly Location Device 00_HAdd; 00; 2006-02-16; 01; Engineer; PWr; None; None; G16V8; ORDER: A, B, C, S; VECTORS: 00** 01** 11** 10** Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 17 2) Johnson.PLD: Name PartNo Date Revision Designer Company Assembly Location Device Johnson ; 00 ; 2006-02-27 ; 01 ; Engineer ; PWr ; None ; ; G22V10 ; /* *************** INPUT PINS *********************/ PIN 1 = Clk; /* clock */ PIN 2 = Reset; /* control */ /* *************** OUTPUT PINS *********************/ PIN [23..16] = [Q7..0]; /* outputs */ Q0.D Q1.D Q2.D Q3.D Q4.D Q5.D Q6.D Q7.D = = = = = = = = !Q7; Q0; Q1; Q2; Q3; Q4; Q5; Q6; [Q0..7].AR = Reset; Johnson.SI: Name PartNo Date Revision Designer Company Assembly Location Device Johnson; 00; 2006-02-27; 01; Engineer; PWr; None; ; G22V10; ORDER: Reset, Clk, Q0..7; VECTORS: 1C******** $REPEAT 11; 0C******** 1C******** 1C******** $REPEAT 3; 0C******** Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 18 3) 011_ML.PLD: Name PartNo Date Revision Designer Company Assembly Location Device 011_ML ; /* Detektor sekwencji 011 w wersji Mealy */ 00 ; 2006-03-01 ; 01 ; Engineer ; PWr ; None ; ; G16V8 ; /* *************** INPUT PINS *********************/ PIN 1 = Clk; PIN 2 = X; /* WE */ /* *************** OUTPUT PINS *********************/ PIN [12, 13] = ![Q1, Q0]; /* Stan */ PIN 14 = Y; /* WY */ FIELD Stan = [Q1, Q0]; $DEFINE StanA 'b'00 $DEFINE StanB 'b'01 $DEFINE StanC 'b'11 SEQUENCE Stan { PRESENT StanA IF !X NEXT StanB; IF X NEXT StanA; PRESENT StanB IF !X NEXT StanB; IF X NEXT StanC; PRESENT StanC IF !X NEXT StanB; IF X NEXT StanA; IF X OUT Y; } 011_ML.SI: Name PartNo Date Revision Designer Company Assembly Location Device 011_ML; 00; 2006-03-01; 01; Engineer; PWr; None; ; G16V8; Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 19 ORDER: Clk, X, Q1, Q0, Y; VECTORS: C1*** C0*** C1*** C1*** C1*** C0*** C0*** C1*** C1*** C1*** 4) 011_MR.PLD: Name PartNo Date Revision Designer Company Assembly Location Device 011_MR ; /* Detektor sekwencji 011 w wersji Moore */ 00 ; 2006-03-01 ; 01 ; Engineer ; PWr ; None ; ; G16V8 ; /* *************** INPUT PINS *********************/ PIN 1 = Clk; PIN 2 = X; /* WE */ /* *************** OUTPUT PINS *********************/ PIN [12, 13] = ![Q1, Q0]; /* Stan */ PIN 14 = Y; /* WY */ FIELD Stan = [Q1, Q0]; $DEFINE $DEFINE $DEFINE $DEFINE StanA StanB StanC StanD 'b'00 'b'01 'b'11 'b'10 SEQUENCE Stan { PRESENT StanA IF !X NEXT StanB; IF X NEXT StanA; PRESENT StanB IF !X NEXT StanB; IF X NEXT StanC; Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 20 PRESENT StanC IF !X NEXT StanB; IF X NEXT StanD; PRESENT StanD IF !X NEXT StanB; IF X NEXT StanA; OUT Y; } 011_MR.SI: Name PartNo Date Revision Designer Company Assembly Location Device 011_MR; 00; 2006-03-01; 01; Engineer; PWr; None; ; G16V8; ORDER: Clk, X, Q1, Q0, Y; VECTORS: C1*** C0*** C1*** C1*** C1*** C0*** C0*** C1*** C1*** C1*** Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 21 Dodatek C: Rozszerzenia nazw w języku CUPL Uwaga: kolumna „Poz.” podaje, czy dany przyrostek występuje w równaniu przy nazwie znajdującej się po lewej (L) bądź po prawej (R) stronie znaku ‘=’. Nazwa .AP .AR .APMUX .ARMUX .BYP .CA .CE .CK .CKMUX .D .DFB .DQ .IMUX .INT .IO .IOAR .IOAP .IOCK .IOD .IOL .IOSP .IOSR .J .K .L .LE .LEMUX .LFB .LQ .OBS .OE .OEMUX .PR .R .S .SP .SR .T .TEC .TFB .T1 .T2 Poz. Opis L L L L L L L L L L R R L R R L L L R R L L L L L L L R R L L L L L L L L L L R L L Asynchronous preset of flip-flop Asynchronous reset of flip-flop Asynchronous preset multiplexer selection Asynchronous reset multiplexer selection Programmable register bypass Complement array CE input of enabled D-CE type flip-flop Programmable clock of flip-flop Clock multiplexer selection D nput of D-type flip-flop D registered feedback path selection Q output of D-type flip-flop Input multiplexer selection of two pins Internal feedback path for registered macrocell Pin feedback path selection Asynchronous reset for pin feedback register Asynchronous preset for pin feedback register Clock for pin feedback register Pin feedback path through D register Pin feedback path through latch Synchronous preset for pin feedback register Synchronous reset for pin feedback register J input of JK-type output flip-flop K input of JK-type output flip-flop D input of transparent latch Programmable latch enable Latch enable multiplexer selection Latched feedback path selection Q output of transparent input latch Programmable observability of buried nodes Programmable output enable Tri-state multiplexer selection Programmable preload R input of SR-type output flip-flop S input of SR-type output flip-flop Synchronous preset of flip-flop Synchronous reset of flip-flop T input of toggle output flip-flop Technology-dependent fuse selection T registered feedback path selection T1 input of 2-T flip-flop T2 input of 2-T flip-flop Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 22 Dodatek D: Schematy logiczne wybranych układów PALCE22V10 and PALCE22V10Z Families CLK/I 0 1 (2) 0 3 4 7 8 11 12 15 16 19 20 23 24 27 28 31 32 35 36 39 40 43 0 1 24 (28) VCC AR 1 D AR 9 Q Q 1 0 1 0 0 0 1 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 1 23 I/O 9 (27) SP 0 1 10 D AR Q 20 Q 22 I/O 8 (26) SP I1 0 1 2 (3) 21 D AR I2 21 I/O 7 (25) SP 33 3 (4) Q Q 0 1 34 D AR Q Q 20 I/O 6 (24) SP 48 I3 4 (5) 0 1 49 D AR 1 0 1 1 Q 0 0 0 1 Q 19 I/O 5 (23) SP 65 I4 5 (6) 0 1 66 D AR SP 1 0 1 1 Q 82 I5 6 (7) 0 0 0 1 Q 18 I/O 4 (21) 0 1 83 D AR 1 0 1 1 Q 0 0 0 1 Q 17 I/O 3 (20) SP 97 I6 7 (9) 0 1 98 1 0 1 1 D AR Q SP 110 I7 8 (10) 1 0 1 1 Q 0 0 0 1 Q 121 9 (11) 16 I/O 2 (19) 0 1 111 D AR I8 0 0 0 1 Q 15 I/O 1 (18) SP 0 1 122 1 0 1 1 D AR Q 130 0 0 0 1 Q 14 I/O 0 (17) SP I9 I 10 G ND 10 (12) 11 (13) 12 (14) SP 131 0 1 13 0 3 4 7 8 11 12 15 1 6 19 20 23 24 27 28 31 32 35 36 39 40 43 I11 (16) 16564E-006 Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 23 PALCE22V10 Schemat blokowy układu Schemat logiczny makrokomórki Rozkład wyprowadzeń układu PALCE22V10 Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 24 PALCE16V8 VCC 1 20 0 3 4 7 8 11 12 15 16 19 20 23 24 27 28 31 MC7 CL1=2048 CL0=2120 PTD=2128 -2135 19 MC6 CL1=2049 CL0=2121 PTD=2136 -2143 18 MC5 CL1=2050 CL0=2122 PTD=2144 -2151 17 16 992 MC4 CL1=2051 CL0=2123 PTD=2152 -2159 1024 1056 1088 1120 1152 1184 1216 1248 MC3 CL1=2052 CL0=2124 PTD=2160 -2167 15 1280 1312 1344 1376 1408 14721440 14 1504 MC2 CL1=2053 CL0=2125 PTD=2168 -2175 1536 1568 1600 1632 1664 1696 1728 1760 MC1 CL1=2054 CL0=2126 PTD=2176 -2183 13 1792 1824 1856 1888 1920 19841952 MC0 CL1=2055 CL0=2127 PTD=2184 -2191 12 00 64 128 192 32 96 160 224 2 256 320 384 448 288 352 416 480 3 512 576 640 704 544 608 672 736 4 768 832 896 960 800 864 928 5 6 7 8 2016 9 10 0 3 4 7 8 1 1 12 15 16 19 20 23 24 27 28 31 11 Ver. 1.0 J. Sugier WinCUPL – instrukcja laboratoryjna 25 PALCE16V8 Schemat blokowy układu Schemat logiczny makrokomórki Tryby konfiguracji Ver. 1.0