Warszawa 17.11.05
UKŁADY MIKROPROGRAMOWANE
Spis treści
1. WPROWADZENIE DO MIKROPROGRAMOWANIA ..................................................... 2
2. PRZYKŁADOWY UKŁAD MIKROPROGRAMOWANY................................................. 3
2.1. U
KŁAD STERUJĄCY
............................................................................................................... 3
2.2. U
KŁAD WYKONAWCZY
.......................................................................................................... 5
2.3. F
ORMAT MIKROROZKAZU
...................................................................................................... 8
3. ASEMBLER MIKROINSTRUKCJI ELMA ......................................................................... 9
3.1. W
PROWADZENIE
................................................................................................................... 9
3.2. P
LIK DEFINICYJNY
.
DEF
....................................................................................................... 10
3.3. P
LIK MIKROPROGRAMU
.
ASM
.............................................................................................. 10
3.4. P
RZYKŁAD PLIKU DEFINICYJNEGO
....................................................................................... 11
3.5. P
RZYKŁADY
........................................................................................................................ 12
5. ZESTAW LABORATORYJNY ............................................................................................ 15
5.1 M
ODUŁ
FGPA...................................................................................................................... 15
5.2 M
ODUŁ WYŚWIETLACZA
LCD ............................................................................................. 16
Układy mikroprogramowane
2/17
1. Wprowadzenie do mikroprogramowania
Mikroprogramowane układy cyfrowe składają się z dwóch części:
- części wykonującej operacje na danych wejściowych (układ wykonawczy),
- części sterującej wykonywaniem tych operacji (układ sterujący).
Schemat takiego układu przedstawia rysunek 1. Układ sterujący kontroluje pracę układu
wykonawczego poprzez linie sterowania S
i
. Liniami tymi przesyłane są sygnały wybierające
rodzaj operacji, która ma być wykonana przez układ wykonawczy oraz sygnały wskazujące skąd
mają być pobrane argumenty dla tej operacji. Układ wykonawczy informuje o swoim stanie za
pomocą sygnałów przesyłanych liniami warunków W
i
. Pojawiają się tam np. sygnały mówiące
o wyniku ostatniej operacji. Sygnały te wpływają na dalsze działanie jednostki sterującej.
Laboratoryjny układ wykonawczy posiada dwa ośmiobitowe wejścia danych WE1 i WE0
i ośmiobitowe wyjście danych WY.
Uk
ład
steruj
ący
Uk
ład
Wykonawczy
WE1
WE0
S
i
W
i
WY
Rysunek 1. Schemat blokowy układu mikroprogramowanego
Układ sterujący można zaprojektować na dwa różne sposoby: jako automat synchroniczny lub
jako układ z pamięcią. Pierwszy sposób polega na zaprojektowaniu takiego automatu
synchronicznego, którego działanie (przejścia ze stanu do stanu) jest określone przez algorytm
wykonywany przez układ wykonawczy. Na podstawie algorytmu buduje się tabelę przejść
i wyjść automatu. Jednym z rozwiązań może być automat zwany rozdzielaczem sterującym,
w którym stany kodowane są w kodzie „1 z n” (przerzutników jest tyle ile stanów).
Drugi sposób polega na utworzeniu odpowiedniego programu działającego zgodnie z wy-
maganym algorytmem i zapisaniu go w pamięci. Układ taki nazywany jest mikro-
programowanym układem sterującym. Kolejne rozkazy programu nazywane są mikrorozkazami
lub mikroinstrukcjami. Mikroinstrukcje składają się z mikrooperacji czyli zestawu bitów
przeznaczonych do sterowania poszczególnymi blokami układu. Układ mikroprogramowany
wyróżnia się prostotą i przejrzystością budowy. Zastosowanie mikroprogramowania pozwala na
łatwą modyfikację działania jednostki sterującej poprzez wymianę mikroprogramu bez
konieczności modyfikowania struktury sprzętowej układu.
Układy mikroprogramowalne
3/17
2. Przykładowy układ mikroprogramowany
2.1. Układ sterujący
Przykładowy układ sterujący przestawiono na rysunku 2. W skład układu sterującego
wchodzi:
- pamięć stała ROM ,
- układ adresowania (licznik mikrorozkazów LA i multiplekser warunku skoku JC),
- licznik pętli LP.
S ..S
10
3
S ..S
2
0
S
12
S
11
S ..S
39
16
P
8
1
0
C
8
P
8
C
8
0
1
2
3
4
5
6
7
JC
ROM
256x40
LA
LD
Reset
LP
E
Preset
Z
A -A
7
0
Rysunek 2. Schemat blokowy układu sterującego
•
Pamięć ROM
W pamięci ROM (w układzie laboratoryjnym o pojemności 256 słów 40 bitowych)
przechowywane są mikrorozkazy. Każdy mikrorozkaz składa się z 40 bitów (słowo w tej
pamięci) i jest dzielony na dwie części. Jedna z nich (bity od S
16
do S
39
) jest przeznaczona do
sterowania pracą układu wykonawczego, a druga z nich (bity od S
0
do S
12
) odpowiada za
sterowanie pracą układu sterującego (bity od S
13
do S
15
są nieużywane). Wybór komórki
pamięci następuje poprzez podanie (z układu adresowania) adresu na wejścia A
7
– A
0
pamięci ROM.
Układy mikroprogramowane
4/17
•
Układ adresowania
Wartość sygnału na wyjściu multipleksera JC określa sposób wyznaczenia adresu kolejnego
mikrorozkazu pobieranego z pamięci. Jeśli wartość na wyjściu multipleksera JC jest zero (na
wejściu LD licznika adresowego LA), to pobrany zostanie mikrorozkaz umieszczony pod
kolejnym (następnym w stosunku do aktualnego) adresem w pamięci ROM. Licznik LA jest
wtedy inkrementowany. Jeśli na wyjściu JC jest jedynka, to pobrany zostanie mikrorozkaz
umieszczony pod adresem zapisanym na bitach S
10
do S
3
mikrorozkazu. W tym przypadku
mówimy, że w programie wykonuje się skok.
Jeśli bity S
2
do S
0
mają wartość 000, to na wyjściu multipleksera jest zero (wejście oznaczone
0 multipleksera) i jako następny wykonywany jest mikrorozkaz umieszczony pod kolejnym
adresem w pamięci ROM. Jeśli bity S
2
do S
0
przyjmują wartość 001, to na wyjściu JC jest
jedynka (wejście multipleksera oznaczone 1) i wykonuje się skok bezwarunkowy. Jeśli bity S
2
do S
0,
mają wartość inną niż 000 lub 001, to wartość na wyjściu multipleksera JC zależy od
podanych warunków, czyli stanów na wejściach 2, 3, 4, 5 i 7 multipleksera. Jeśli wartość
warunku będzie równa 1, to wykonany zostanie skok warunkowy. Warunków może być pięć:
w układzie wykonawczym powstają cztery warunki (P
8
, C
8
,
8
P
,
8
C
), a jeden jest brany
z wyjścia
Z
licznika pętli LP (jedno z wejść multipleksera JC jest nieużywane).
W tabeli 1 zestawiono wszystkie warunki.
Tabela 1. Sterowania multipleksera warunków JC
Sterowanie
Wyjście układu JC
S
2
do S
0
Warunek
Opis
(wejście LD licznika adresów)
000
0
Inkrementacja licznika adresów
001
1
Ładowanie licznika wartością S
10
do S
3
010
P
8
Wartość wysuwanego bitu
011
C
8
Przeniesienie sumatora
100
P8
Negacja wartości wysuwanego bitu
101
C8
Przeniesienie sumatora
110
-
Nie używany
111
Z
Wyzerowanie licznika
Licznik LA wykonuje 2 mikrooperacje:
1. ładowanie – wpis równoległy wartości zapisanej w mikroprogramie na bitach S
10
do S
3
(wykonanie skoku LD=1),
2. inkrementacja – zwiększanie zawartości o jeden (wybór kolejnego mikrorozkazu, LD=0),
Licznik może zostać także wyzerowany przez operatora, który uruchomi przełącznik Reset .
Tabela 2. Sterowania licznika adresów LA
LD
Reset
Opis
1
1
Ładowanie wartościami zapisanymi na bitach S
9
do S
3
0
1
Inkrementacja
X
0
Reset asynchroniczny
•
Licznik pętli LP
Licznik LP służy do implementacji w programie pętli o 8 iteracjach. Jest to 3 bitowy licznik
poprzednikowy z synchronicznym wpisywaniem stanu 111 (wejście Preset) oraz wejściem E
zezwolenia na liczenie. Wyjście
Z ma wartość 0, wtedy i tylko wtedy, gdy licznik ma wartość 0.
Gdy aktywne jest wejście E licznika (bit S
12
słowa mikrorozkazu), to w każdym cyklu zegara
zmniejsza on swoją zawartość o jeden.
Układy mikroprogramowalne
5/17
Tabela 3. Sterowania licznik pętli LP
Sterowanie
S
12
do S
11
Operacja
Opis
x1
LP:=111
Ładowanie
10
LP:=LP-1
Dekrementacja
2.2. Układ wykonawczy
Schemat układu wykonawczego przedstawiony został na rysunku 3. Jest to prosty procesor
składający się z:
- jednostki arytmetyczno-logicznej ALU,
- rejestru znaczników RZN,
- rejestru akumulatora A,
- multipleksera argumentów MA,
- banku 8 rejestrów pomocniczych BR,
- rejestru wyjściowego RWY.
BR
R ..R
2
0
Zapis
S
35
S
34
S ..S
19
16
S ..S
25
24
s
36
S
23
S ..S
22
20
WE1
(WE ..WE )
15
8
WE0
(WE ..WE )
7
0
S ..S
33
26
C
8
P
8
3
2
1
0
RZN
Cs
Sel
P
0
C
8
P
8
C
0
ALU
Operacja
P
8
P
0
C
8
C
0
B ..B
7
0
A ..A
7
0
A
RWY
LD
MA
WYNIK
Rysunek 3 Układ wykonawczy
Układy mikroprogramowane
6/17
•
Blok Arytmetyczno-logiczny ALU
Jednostka ALU może wykonywać operacje arytmetyczne: przesuwanie, dodawanie,
odejmowanie oraz operacje logiczne AND, OR i NOT (przy czym operacje przesuwania
i operacja NOT są jednoargumentowe) Jednym z argumentów ALU jest zawartość rejestru
akumulatora A. Drugi argument ALU jest podawany poprzez multiplekser MA. W zależności od
wartości bitów sterujących multiplekserem S
25
i S
24
może to być:
1. zawartość jednego z ośmiu rejestrów banku rejestrów BR,
2. wartość podana na wejście zewnętrzne WE1 (WE
15
do WE
8
),
3. wartość na drugim wejściu zewnętrznym WE0 (WE
7
do WE
0
),
4. wartość zapisana w mikroprogramie na bitach S
33
do S
26
.
Wynik z układu ALU jest zawsze zapisywany do rejestru akumulatora A. Poprzez ustawienie
bitu S
36
na wartość 1 można przepisać zawartość akumulatora do rejestru wyjściowego RWY.
Operacje wykonywane przez blok ALU uwzględniają bity wejściowe C
0
i P
0
z rejestru
znaczników RZN. Bit C
0
jest używany przy operacji dodawania (przeniesienie wejściowe)
i odejmowania (pożyczka). Bit P
0
jest używany przy operacjach przesuwania w lewo (bit
wchodzący na najmniej znaczącą pozycję) i w prawo (bit wchodzący na najbardziej znaczącą
pozycję). W tabeli 4 zestawiono mikrooperacje wykonywane przez układ ALU.
Tabela 4. Działanie jednostki arytmetyczno logicznej (ALU)
Sterowanie
Wyjścia
s
19
do s
16
ALU
P
8
C
8
Opis
0000
A
6
..A
0
, P
0
A
7
C
0
Przesunięcie w lewo (z bitem P
0
)
0001
P
0
,A
7
.. A
1
A
0
C
0
Przesunięcie w prawo (z bitem P
0
)
0011
A+B+C
0
P
0
Przeniesienie Dodawanie w NKB
0010
A-B-C
0
P
0
Pożyczka
Odejmowanie w NKB
0100
A
P
0
C
0
Przepisanie wyjścia A (NOP)
0101
B
P
0
C
0
Przepisanie wejścia B (np.ład. stałej)
1000
A OR B
P
0
C
0
Operacja OR
1010
A AND B
P
0
C
0
Operacja AND
1100
A XOR B
P
0
C
0
Operacja XOR
•
Rejestr znaczników RZN
Rejestr znaczników RZN jest rejestrem dwubitowym. Zależnie od rodzaju wykonywanej
operacji może zostać zapisany jeden z bitów lub ich wartość może pozostać nie zmieniona.
Podczas wykonywania przez blok ALU operacji dodawania lub odejmowania pierwszy bit
zapisywany jest wartością C
8
. Podczas wykonywania przez blok ALU operacji przesuwania
drugi bit zapisywany jest wartością P
8
.
Wyjścia rejestru znaczników (C
0
i P
0
) mogą przyjmować wartości w zależności od jego
wysterowania. Jeśli na wejściu SEL jest sygnał jeden, to na wyjściach rejestru pojawiają się
wartości pamiętane w rejestrze. Jeśli SEL=0, to na obu wyjściach rejestru C
0
i P
0
pojawia się
wartość bitu S
34
. Powyższe ilustruje tabela 5.
Tabela 5. Sterowania rejestrem znaczników RZN (bity S
19
do S
16
i S
35
)
Sterowanie
Wyjścia
S
35
C
0
P
0
Opis
0
S
34
S
34
Zapisanie obydwu bitów rejestru wartością S
34
1
C
8
P
8
Zapisanie rejestru znaczników wartością C
8
jeśli
wykonywana jest operacja dodawania lub odejmowania
albo P
8
przy operacji przesuwania
Układy mikroprogramowalne
7/17
•
Bank rejestrów BR
Rejestry banku ponumerowane są od 0 do 7. Bank rejestrów ma trzy wejścia R
2
..R
0
wyznaczające numer rejestru, który ma być aktywny (por. tabela 6). Zawartość wybranego
rejestru pojawia się na wyjściach banku rejestrów BR. Zapisanie rejestru następuje gdy bit S
23
słowa mikrorozkazu jest równy jeden.
Tabela 6. Mikrooperacje wykonywane przez bank rejestrów
Sterowanie
S
23
S
22
do S
20
Opis
0
numer rejestru Na wyjście banku podawana jest zawartość rejestru o
numerze określonym na wejście R
2
..R
0
1
numer rejestru Zapis zawartości akumulatora A do rejestru o numerze
zapisanym w R
2
..R
0
•
Rejestr akumulatora A
Akumulator A jest to ośmiobitowy rejestr, którego wartość jest uaktualniana w każdym
(takcie) mikrorozkazie. W celu pozostawienia wartości akumulatora bez zmiany, ALU musi
wykonać operację pustą NOP (przepisanie wyjścia A).
•
Multiplekser danych wejściowych MA
Multiplekser danych wejściowych MA umożliwia wybór danej, która będzie podana jako
drugi argument (wejście B) bloku ALU (jako pierwszy argument zawsze podawana jest
zawartość akumulatora A). Multiplekser MA pozwala wybrać jedno z czterech źródeł danych jak
pokazano w tabeli 6.
Tabela 8. Mikrooperacje wykonywane przez multiplekser danych wejściowych MUX
Sterowanie
Wyjście
S
25
S
24
MA
Opis
00
BR
Dana pobierana z Banku Rejestrów BR
01
WE1
Dana pobierana z WE1
10
WE0
Dana pobierana z WE0
11
S
33
..S
26
Dana pobierana z pamięci ROM (bity S
33
..S
26
)
•
Rejestr wyjściowy RWY
Rejestr wyjściowy RWY umożliwia wyprowadzenie wyniku działania układu. Jest to 8
bitowy rejestr z wejściem zezwolenia na zapis (LD). Po ustawieniu zezwolenia na zapis w stan
aktywny nastąpi przepisanie wartości z akumulatora do rejestru wyjściowego RWY.
Tabela 9. Mikrooperacje wykonywane przez RWY
Sterowanie
Wyjście
S
36
RWY
Opis
0
RWY
Bez zmian
1
A
Zapis zawartości akumulatora A
Układy mikroprogramowane
8/17
2.3. Format mikrorozkazu
Mikrorozkazy to słowa 40 bitowe. Format mikrorozkazu przedstawia tabela 10.
Tabela 10. Przypisanie bitów mikrorozkazu poszczególnym mikrooperacjom
Bity
Znaczenie
S
2
..S
0
Wybór warunku skoku(wejście sterujące JC)
S
10
..S
3
Adres docelowy skoku(wejście danych JC)
S
11
Załadowanie licznika pętli LP wartością 7 (wejście Preset)
S
12
Zmniejszenie o 1 wartości licznika pętli LP
S
15
..S
13
Nieużywane
S
19
..S
16
Kod operacji wykonywanej przez ALU
S
22
..S
20
Adres rejestru w banku rejestrów BR
S
23
Zapis rejestru w banku rejestrów BR wartością akumulatora A
S
25
..S
24
Wybór drugiego argumentu (B) dla ALU
S
33
..S
26
Stała natychmiastowa podawana na wejście 3 multipleksera MA
S
34
Wejście rejestru znaczników
S
35
Sterowanie rejestrem znaczników
S
36
Zapisanie wartości akumulatora A do rejestru wyjściowego RWY
S
39
..S
37
Nieużywane
Tabela 11. Słowo mikrorozkazu
Nieużywane
Łado-
wanie
RWY
Wejścia
RZN
Argument natychmiastowy
Argument
B
Zapis A
do BR
Wybór
rejestru BR
S
39
S
38
S
37
S
36
S
35
S
34
S
33
S
32
S
31
S
30
S
29
S
28
S
27
S
26
S
25
S
24
S
23
S
22
S
21
S
20
Operacja ALU
Nieużywane
Dekre-
mentacja LP
Ładowanie
LP
Adres skoku
Wybór
warunku
S
19
S
18
S
17
S
16
S
15
S
14
S
13
S
12
S
11
S
10
S
9
S
8
S
7
S
6
S
5
S
4
S
3
S
2
S
1
S
0
Układy mikroprogramowalne
9/17
3. Asembler mikroinstrukcji ELMA
3.1. Wprowadzenie
ELMA to program, który umożliwia przekształcenie pliku z mnemonicznym zapisem
mikroprogramu w plik z binarnym obrazem pamięci ROM mikroprogramu.
Plik mikroprogramu składa się z wielu mikroinstrukcji. Każdą mikroinstrukcję zapisuje się w
osobnym wierszu. Jedna mikroinstrukcja odpowiada jednemu słowu sterującemu w pamięci
mikroprogramu. Mikroinstrukcja składa się z jednej lub kilku mikrooperacji.
Przykładowo można zdefiniować mikrooperację ADD która ustawia bity odpowiedzialne za
operację wykonywaną przez ALU tak, że wykonane zostanie dodawanie. Podobnie można
zdefiniować mikrooperację SUB tak, żeby wykonane zostało odejmowanie. Można zdefiniować
mikrooperację JMP, która ustawi część słowa mikroinstrukcji związaną z częścią sterującą
układu tak, że wykonany zostanie skok czy też mikrooperacje NXT powodującą przejście do
następnej instrukcji.
Definicje tych mikrooperacji dla prezentowanego układu mikroprogramowanego:
ADD
(19, 16, !0011)
#mikrorozkaz dodawania
SUB
(19, 16, !0010)
#mikrorozkaz odejmowania
NXT
(2,0,!000)
#incrementacja licznika LA
JMP
(2,0,!001) {10,3} #mikrorozkaz skoku (parametr {10,3} okre
śla adres
#skoku)
Powyższy zapis oznacza, że mikrooperacja ADD ustawia bity od 19 do 16 na wartość 0011,
mikrooperacja SUB ustawia te same bity na wartość 0010. Mikrooperacja NXT ustawia bity od
2 do 0 na wartość 000. Mikrooperacja JMP ustawia bity od 2 do 0 na wartość 001, bity od
10 do 3 zostaną ustawione wartością przekazaną jako argumentu tej mikrooperacji (por. tekst
dalej). Powyższe operacje powinny znaleźć się w pliku definicji mikrooperacji (.def).
Mikrooperacje ADD oraz SUB ustawiają te same bity słowa mikroprogramu lecz na różne ich
wartości. Nie można ich więc połączyć w jednej mikroinstrukcji. Natomiast operacja JMP
ustawia inne bity, może więc zostać połączona z operacją ADD lub SUB. Łączenia
mikrooperacji w mikrorozkazy dokonuje się w pliku z mikroprogramem. W każdym wierszu
tego pliku zapisana jest jedna mikroinstrukcja. Mikrooperacje, które mają być złączone
w ramach jednej mikroinstrukcji wpisuje się w jednym wierszu oddzielając je od siebie
średnikiem. Przykładowy mikroprogram może wyglądać następująco (poniższy mikroprogram
służy wyłącznie ilustracji działania mikroasemblera):
ADD(); NXT();
SUB(); JMP(4);
ADD(); JMP(2);
W powyższym mikroprogramie zdefiniowane są trzy mikrorozkazy. Pierwszy powoduje
połączenie mikrooperacji ADD z mikrooperacją NXT. Pierwszym słowem w pamięci
mikroprogramu będzie więc słowo, w którym bity 19 do 16 będą ustawione na wartość 0011,
a bity od 2 do 0 na wartość 000. W drugim mikrorozkazie bity od 19 do 16 będą ustawione na
wartość 0010, bity od 2 do 0 będą miały wartość 001, a bity od 10 do 3 zostaną ustawione jako
wartość 0000100 odpowiadająca dziesiętnej liczbie 4. Pozostałe bity przyjmą wartość
nieokreśloną. Podobnie zdefiniowany będzie trzeci mikrorozkaz.
Każda mikrooperacja może mieć dowolną liczbę argumentów. Wartości tych argumentów
podawane są przy użyciu mikrooperacji w pliku mikroprogramu z rozszerzeniem .asm.
Układy mikroprogramowane
10/17
Rozszerzenie wprowadzonej wcześniej operacji ADD na operacje 3 argumentową może mieć
postać:
ADD (19,16,!0011) {22,20} {33,26} {25,24}
Użycie tej mikrooperacji powoduje ustawienie bitów od 19 do 16 na wartość 0011 oraz
zapisanie na pozycje 22-20, 33-26 oraz 25-24 odpowiednio pierwszego, drugiego i trzeciego
argumentu. Argumentami wywołania mikrooperacji mogą być liczby zapisane w systemie
dziesiętnym. Przykładowe wywołanie takiej mikrooperacji może mieć postać:
ADD(2,5,0);
W wyniku translacji mikrooperacji powstanie słowo z wpisaną w bity 19-16 wartością 0011,
w bity 22-20 wartością 010, w bity 33-26 wartością 00000101 oraz wartością 00 zapisaną w
bitach 25-24. W wyniku translacji całego pliku mikroprogramu powstanie obraz pamięci ROM
zapisany w pliku wynikowym z rozszerzeniem .mif.
Załóżmy, że operacje.def jest plikiem, w którym zdefiniowane są mikrooperacje,
a program.asm jest plikiem z mikroprogramem.
Translacji dokonuje się mikroasemblerem ELMA uruchamianym poleceniem
java Elma operacje.def program.asm
Obraz pamięci mikroprogramu zapisany zostanie w pliku program.mif.
W każdym rodzaju pliku tekst począwszy od znaku # do końca linii traktowany jest jak
komentarz i niema wpływu na działanie programu ELMA.
3.2. Plik definicyjny .def
Pierwszą linią w pliku .def musi być linia
wordLength=liczba
gdzie liczba określa długość słowa mikrorozkazu. Następnie następuje dowolnie wiele
definicji mikrooperacji. Każda definicja mikrooperacji składa się z identyfikatora mikrooperacji,
jednego lub wielu napisów postaci (x,y,!z) oznaczającego że w bity od x do y należy wpisać
wartość z oraz zero lub więcej wpisów postaci {x,y} określających miejsca, w które należy
wpisać kolejne argumenty.
Dodatkowo można definiować stałe, które mogą być użyte w pliku .asm jako argumenty
wywołania mikrooperacji. Stałe definiujemy w następujący sposób:
:nazwa=warto
ść
warto
ść jest liczbą w systemie dziesiętnym.
3.3. Plik mikroprogramu .asm
W pliku .asm, podobnie jak w pliku .def, można zdefiniować stałe w postaci
nazwa=warto
ść. Mikrorozkaz definiuje się umieszczając w jednym wierszu mikrooperacje,
które mają być złączone, podając w nawiasach argumenty i oddzielając mikrooperacje
średnikiem. Można również definiować etykiety. Poprzez rozpoczęcie wiersza napisem
nazwa:
definiujemy etykietę o nazwie nazwa. Użycie etykiety jako argumentu mikrooperacji
powoduje zastąpienie jej wartością adresu mikrorozkazu znajdującego się bezpośrednio za
definicją etykiety.
Układy mikroprogramowalne
11/17
3.4. Przykład pliku definicyjnego
Poniżej przedstawiono pliki z definicjami mikrooperacji dla omawianego układu
mikroprogramowanego.
WordLength = 40
#d
ługość słowa mikrorozkazu
#sta
łe dla multipleksera JC wyboru warunków skoku
:W_1=1
#skok bezwarunkowy, wej
ście 1 multipleksera JC
:W_S8=2
#skok gdy S8=1, wej
ście 2 multipleksera JC
:W_C8=3
#skok gdy C8=1, wej
ście 3 multipleksera JC
:W_NS8=4
#skok gdy S8=0, wej
ście 4 multipleksera JC
:W_NC8=5
#skok gdy C8=0, wej
ście 5 multipleksera JC
:W_NZ=7
#skok gdy Z=0, wej
ście 7 multipleksera JC
JMPC (0,0,!x) {2,0} {10,3} #mikrorozkaz skoku warunkowego o dwóch
#argumentach (warunek, adres)
JMP
(2,0,!001) {10,3}
#mikrorozkaz skoku bezwarunkowego (adres)
NXT
(2,0,!000)
#mikrorozkaz inkrementacji LA
LDCNT (11,11,!1)
#za
ładowanie licznika LP wartością 111
NXT
(12,12,!1)
#dekrementacja licznika LP
#sta
łe (numery rejestrów z banku rejestrów BR)
:r0=0
:r1=1
:r2=2
:r3=3
#sta
łe do wyboru argumentu B dla ALU
:reg=0
#argument pobierany z banku rejestrów BR
:WE1=1
#argument pobierany z WE1
:WE0=2
#argument pobierany z WE0
:imm=3
#argument pobierany z pami
ęci mikroprogramu ROM
#mikrorozkazy ALU
ADD
(19,16,!0011) {22,20} {33,26} {25,24}
#dodawanie(nr rejestru, sta
ła
#z mikroprogramu, wybór
#argumentu B)
ADDR (19,16,!0011)
(25,24, !00) {22,20}
#dodawanie rejestru (nr
#rejestru)
ADDI (19,16,!0011)
(25,24, !11) {33,26}
#dodanie sta
łej z
#mikroprogramu
ADDW1 (19,16,!0011)
(25,24, !01)
#dodanie argumentu z WE1
ADDW0 (19,16,!0011)
(25,24, !10)
#dodanie argumentu z WE0
SUB
(19,16,!0010)
{22,20} {32,25} {25,24} #odejmowanie(nr rejestru,
#sta
ła z mikroprogramu, wybór
#argumentu B)
SUBR (19,16,!0010) (25,24, !00) {22,20}
#odejmowanie rejestru
SUBI (19,16,!0010) (25,24, !11) {33,26}
#odejmowanie sta
łej
SHL
(19,16,!0000)
#przesuwanie w lewo
SHR
(19,16,!0001)
#przesuwanie w prawo
Układy mikroprogramowane
12/17
NOP
(19,16,!0100)
#operacja pusta
LDA
(19,16,!0101) {22,20} {33,26} {25,24}
#za
ładowanie akumulatora
#(nr rejestru, sta
ła z
#mikroprogramu, wybór
#argumentu B)
A2R
(23,23,!1) {22,20}
#
ładowanie rejestru
#zawarto
ścią akumulatora
#sterowanie rejestrem znaczników RZN
SIN
(0,0,!x) {34,34}
#ustawianie bitem s34 wyj
ść C0 i P0 rejestru
#znaczników podczas operacji przesuwania
CIN
(0,0,!x) {34,34}
#ustawianie bitem s34 wyj
ść C0 i P0 rejestru
#znaczników podczas operacji dodawania lub
#odejmowania
SREG (0,0,!x) {35,35}
#zapis RZN podczas operacji przesuwania
CREG (0,0,!x) {35,35}`
#zapis RZN podczas operacji dodawania
BOR
(19,16,!100x) {22,20} {33,26} {25,24}
#mikrorozkaz OR z wyborem
#argumentu B
BAND (19,16,!101x) {22,20} {33,26} {25,24}
#mikrorozkaz AND z wyborem
#argumentu B
BXOR (19,16,!110x) {22,20} {33,26} {25,24}
#mikrorozkaz XOR z wyborem
#argumentu B
DISP (36,36,!1)
#mikrorozkaz zapisu RWY
3.5. Przykłady
Program 1
•
Poniżej przedstawiono mikroprogram, który zwiększa wartość akumulatora o wartość
odczytaną z WE1 i po każdym dodaniu zapisuje nową wartość w rejestrze wyniku.
Dodawanie powtarzane jest w nieskończoność.
Start:
ADD(0,0,1); DISP(); JMP(Start);
Program 2
•
Poniżej przedstawiono mikroprogram, który odczytuje dwie ośmiobitowe liczby z
wejścia WE1 i WE0, umieszcza je w rejestrach 1 i 2, oblicza ich sumę i umieszcza wynik
w rejestrze 3 oraz zapisuje go w rejestrze wyjściowym.
#wczytywanie argumentów do rejestrów r1 i r2
LDA(0,0,WE1);
A2R(r1); NOP();
LDA(0,0,WE0);
A2R(r2); NOP();
ADDR(r1);
Układy mikroprogramowalne
13/17
end:
DISP(); NOP(); JMP(end)
Program 2a
•
Powyższy program można uprościć. W tym celu zauważmy, że można jednocześnie
ładować do akumulatora nową wartość i zapisywać wartość bieżącą do rejestru. Wobec
tego instrukcje:
A2R(r1); NOP();
LDA(0,0,WE0);
można zastąpić jedną instrukcją:
A2R(r1); LDA(0,0,WE0);
Program 3
•
Mikroprogram mnożenia liczb w NKB
Poniżej przedstawiono listing programu mnożenia dwóch liczb w kodzie NKB.
rd1=1
rd2=2
rcrc=3
LDA(00, 00, WE1);
#wczytywanie argumentów do rejestrów r0 i r1
A2R(r0);NOP();
LDA(00, 00, WE0);
A2R(r1);NOP();
LDCNT();NOP();
#zerowanie licznika p
ętli
LDA(00,0,imm);
#zerowanie rejestru r2
A2R(r2);NOP();
SHR(); SIN(0); SREG(0);
#zerowanie rejestru znaczników
ADDI(0);
#rozpoczyna si
ę właściwy mikroprogram mnożenia
mulLoop:
LDA(r1,00,reg);
#za
ładowanie r1 do akumulatora
SHR(); SIN(0); SREG(0);
#przesuniecie w prawo z uzupe
łnieniem lewego bitu
#warto
ścią 0
JMPC(W_S8, doAdd);NOP();
#je
śli wysunięty bit (najmłodszy bit r1) był
#ustawiony to skaczemy do doAdd (umieszczony
#tam mikroprogram dodaje do r0 zawarto
ść r2 i
#wraca do etykiety shift).
shift:
LDA(r2,00,reg);
#za
ładuj r2 do akumulatora
JMPC(W_C8,c1);NOP();
#je
śli przy ostatnim dodawaniu było
#przeniesienie to skok do c1,
c0:
SHR(); SIN(0); SREG(0);
#przesuni
ęcie akumulatora (w którym jest r2) w
#prawo, uzupe
łnienie zerem z lewej strony
Układy mikroprogramowane
14/17
JMP(next);NOP();
#skok do etykiety next
c1:
SHR(); SIN(1); SREG(0);
#przesuni
ęcie akumulatora (w którym jest r2) w
#prawo, uzupe
łnienie jedynka z lewej strony
next:
A2R(r2);NOP();
#zapisanie akumulatora (przesuni
ętego w c1 lub
#c2) do rejestru r2
LDA(r1,00,reg);
#za
ładowanie r2 do akumulatora
SHR(); SIN(00); SREG(1);
#przesuni
ęcie r1 w prawo, uzupełnione z lewej
#strony tym co zosta
ło wysunięte z prawej strony
#w poprzednim przesuwaniu
A2R(r1);NOP();
#zapisanie przesuni
ętego r1 w r1
ADDI(0);CIN(0); CREG(0);
#wyczyszczenie znaczników
NXT(); JMPC(W_NZ, mulLoop);NOP(); #je
śli jeszcze nieskończone mnożenie to
#skok do mulLoop
JMP(endLoop);NOP();
#w przeciwnym przypadku do endLoop.
#podprogram dodawania wykorzystywany na pocz
ątku mullop i tam opisany
doAdd:
LDA(r0,00,reg);
ADDR(r2); CIN(0); CREG(0);
A2R(r2);NOP();
JMP(shift);NOP();
# koniec mno
żenia
endLoop:
#wy
świetlenie r1 na zewnętrznym wyświetlaczu w nieskończonej pętli
LDA(r1,00,reg);
DISP();NOP();
LDA(r2,00,reg);
JMP(endLoop);NOP();
Układy mikroprogramowalne
15/17
5. Zestaw laboratoryjny
Zestaw laboratoryjny przedstawiony na Rysunku 4, składa się z dwóch podstawowych
modułów SML3: modułu FPGA i moduł wyświetlacza LCD (opisanych poniżej), pozostałe
moduły (używane przez mikroprogram mnożenia) służą do ustawiania argumentów
i wyświetlania wyniku.
Rysunek 4. Zestaw laboratoryjny z pakietem FPGA
5.1 Moduł FGPA
Moduł z układem FPGA zawiera:
§ układ FPGA EP1k30,
§ programator ByteBlasterMV ze złączem portu równoległego,
§ oscylator,
§ gniazdo BNC,
§ 9 gniazd w standardzie systemu SML3 (SV1- SV9),
§ 16 diod LED,
§ 4 przyciski (BT1-BT4),
§ 3 przełączniki (SW1-SW3).
Rysunek 5. Pakiet z układem FPGA
Układy mikroprogramowane
16/17
Gniazda SV1 do SV7 są gniazdami uniwersalnymi. Podczas ćwiczenia z mikro-
programowania ich wykorzystanie jest następujące:
§ SV1 – złącze dla wejścia WE1,
§ SV2 – złącze dla wejścia WE0,
§ SV3 – złącze wyjściowe WY,
§ SV4 – sterowanie wyświetlaczem LCD (wyjście),
§ SV5 – SV8 nieużywane,
§ SV9 – zasilacz.
Zwory dostępne na pakiecie powinny mieć następujące ustawienie:
•
OSC zwarte z CLK1 (ustawione w pozycji górnej),
•
BNC zwarte z CLK2 (ustawione w pozycji dolnej),
•
Vosc zwarte z +5V (ustawione w pozycji prawej),
•
zwora 2.5V – zwarta (jeśli nie jest zwarta należy obowiązkowo zgłosić to prowadzącemu
ćwiczenie).
Przełączniki na pakiecie są następujące:
•
SW1 – praca krokowa (1-góra) / ciągła (0-dół),
•
BT1 – reset.
•
BT2 – jeden krok podczas pracy krokowej,
Przełączniki SW2, SW3 oraz BT3 i BT4 są nieużywane.
Diody sygnalizacyjne
Dla ułatwienia uruchamiania i śledzenia pracy układu mikroprogramowanego na płytce
umieszczono 16 diod LED. Pozwala to obserwować na nich stan niektórych linii układu
(pozostałe informacje wyświetlane są na module wyświetlacza LCD) przy czym diody LED*B
(dolny rząd) prezentują stan obecny układu, LED*A (górny rząd) stan z poprzedniego cyklu.
Sygnał wyświetlane na diodach LED:
•
LED8 – wartość P
0
,
•
LED7 – wartość P
8
•
LED6 – wartość C
0
,
•
LED5 – wartość C
8
,
•
LED4 – wartość wybranego warunku skoku (wejście LD licznika adresowego LA),
•
LED3 – linia S
23
– zapisanie wartości akumulatora do rejestru,
•
LED2, LED1 – wartość 1.
5.2 Moduł wyświetlacza LCD
Dwuwierszowy wyświetlacz LCD 2x16 wraz z ze sterownikiem ułatwia śledzenie pracy
układu mikroprogramowanego. Dzięki niemu można zaprezentować stan układu w chwili
bieżącej (wiersz dolny), jak również stan poprzedni (wiersz górny). W połączeniu z możliwością
pracy krokowej umożliwia to dokładną obserwację działania układu. Jest to szczególnie cenne,
gdy układ nie działa w zamierzony sposób. W oparciu o znajomość stanu poprzedniego można
wtedy stosunkowo prosto wyjaśnić przyczynę takiego zachowaniu układu.
Wyświetlacz LCD prezentuje stan układu z bieżącego i poprzedniego cyklu zegarowego
(Rysunek 7). W jednym wierszu wyświetlacza LCD prezentowane są następujące wielkości
(począwszy od lewej strony):
- wartość wyjścia licznika adresowania LA (2 znaki)
- bity S
9
..S
3
(wartość adresu skoku) (2 znaki)
- wartość akumulatora (2 znaki)
Układy mikroprogramowalne
17/17
- wartość wejścia B ALU (2 znaki)
- bity S
19
do S
13
(operacja wykonywana przez ALU) (1 cyfra)
- wartość bitów S
2
do S
0
(wybór warunku skoku) (1cyfra)
- wartość bitów S
22
do S
20
(wybór rejestru) (1 cyfra).
Wartość
akumulatora
Wejście B
ALU
Operacja wykonywana
przez ALU
Warunek skoku
Adres rejestru
Wartość licznika
adresu
Adres
skoku
Rysunek 7. Opis pozycji wyświetlacza
Wszystkie wartości prezentowane są w systemie szesnastkowym.