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