Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ......

48
Jacek Majewski Politechnika Wrocławska Instytut Informatyki, Automatyki i Robotyki (I-6) Wrocław, 2006 Programowanie procesora PicoBlaze 3 Opracowanie zawiera rozdział który nie został umieszczony w książce Układy FPGA w przykładach, Jacek Majewski, Piotr Zbysiński,Wydawnictwo BTC,2008 (www.btc.pl ). W uzasadnieniu Wydawnictwo BTC uzasadniało, że ekonomicznie nie jest opłacalne powiększanie objętości wydanej książki. Osobiście uważam, że pominięcie tego rozdziału było błędem. Dlatego udostępniam go Czytelnikom w formie elektronicznej. Przyjęta numeracja (rozdział 8) nawiązuje do wydania książki. Procesor PicoBlaze został opisany izbudoany przez Kena Chapmana (www.xilinx.com : PicoBlaze). 8. Procesor PicoBlaze 3 Analizując przykłady w języku VHDL przedstawione w poprzednich rozdziałach można zauważyć, że w wielu przypadkach nie są one proste i zrozumiałe. Znacznie łatwiej w wielu przypadkach posłużyć się procesorem i napisać dla niego program sterujący. W dalszym ciągu rozdziału przedstawimy jak użyć procesora o nazwie PicoBlaze3 w projekcie. Ten 8-bitowy procesor został tak napisany aby zajmował jak najmniej miejsca we wnętrzu układu FPGA. W układzie FPGA który przedstawiamy w książce XC3S200 jest 1900 bloków logicznych CLB. Procesor PicoBlaze3 zajmie tylko 96 bloków CLB. Dla użytkownika przedstawiany procesor to po prostu jeszcze jeden komponent o nazwie kcpsm3 umieszczony w zbiorze kcpsm3.vhd. Można do niego "zajrzeć do środka". Procesor ten jest napisany w formie bardzo zoptymalizowanej. Technikę bezpośredniego "mapowania" komponentów układu FPGA przedstawiliśmy już wcześniej. Takiej właśnie techniki użyto do napisania procesora PocoBlaze3. Warto dodać, że bardzie rozbudowana wersja tego procesora o nazwie MicroBlaze jest 32- bitowym procesorem. Przykłady opisane w dalszym ciągu rozdziału pokazują jak użyć procesora PicoBlaze3 we własnym projekcie. Przykłady te zmierzają do tego aby w końcu pokazać projekt termometru wyświetlający wyniki na wyświetlaczu LCD i używający czujnika temperatur DS1820 firmy Dallas. Czujnik temperatury DS1820 wymaga skomplikowanego sterowania sygnałami ze znacznymi uzależnieniami czasowymi. Łatwiej nim sterować za pomocą procesora niż budować urządzenie sprzętowe w języku VHDL. W rzeczywistych projektach trudno wyobrazić sobie urządzenie w którym nie byłoby jednego lub kilku procesorów. 1

Transcript of Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ......

Page 1: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

Jacek Majewski

Politechnika Wrocławska

Instytut Informatyki, Automatyki i Robotyki (I-6)

Wrocław, 2006

Programowanie procesora PicoBlaze 3

Opracowanie zawiera rozdział który nie został umieszczony w książce Układy FPGA w przykładach, Jacek Majewski, Piotr Zbysiński,Wydawnictwo BTC,2008 (www.btc.pl). W uzasadnieniu Wydawnictwo BTC uzasadniało, że ekonomicznie nie jest opłacalne powiększanie objętości wydanej książki. Osobiście uważam, że pominięcie tego rozdziału było błędem. Dlatego udostępniam go Czytelnikom w formie elektronicznej. Przyjęta numeracja (rozdział 8) nawiązuje do wydania książki. Procesor PicoBlaze został opisany izbudoany przez Kena Chapmana (www.xilinx.com : PicoBlaze).

8. Procesor PicoBlaze 3

Analizując przykłady w języku VHDL przedstawione w poprzednich rozdziałach można zauważyć, że w wielu przypadkach nie są one proste i zrozumiałe. Znacznie łatwiej w wielu przypadkach posłużyć się procesorem i napisać dla niego program sterujący. W dalszym ciągu rozdziału przedstawimy jak użyć procesora o nazwie PicoBlaze3 w projekcie. Ten 8-bitowy procesor został tak napisany aby zajmował jak najmniej miejsca we wnętrzu układu FPGA. W układzie FPGA który przedstawiamy w książce XC3S200 jest 1900 bloków logicznych CLB. Procesor PicoBlaze3 zajmie tylko 96 bloków CLB.

Dla użytkownika przedstawiany procesor to po prostu jeszcze jeden komponent o nazwie kcpsm3 umieszczony w zbiorze kcpsm3.vhd. Można do niego "zajrzeć do środka". Procesor ten jest napisany w formie bardzo zoptymalizowanej. Technikę bezpośredniego "mapowania" komponentów układu FPGA przedstawiliśmy już wcześniej. Takiej właśnie techniki użyto do napisania procesora PocoBlaze3.

Warto dodać, że bardzie rozbudowana wersja tego procesora o nazwie MicroBlaze jest 32-bitowym procesorem.

Przykłady opisane w dalszym ciągu rozdziału pokazują jak użyć procesora PicoBlaze3 we własnym projekcie. Przykłady te zmierzają do tego aby w końcu pokazać projekt termometru wyświetlający wyniki na wyświetlaczu LCD i używający czujnika temperatur DS1820 firmy Dallas. Czujnik temperatury DS1820 wymaga skomplikowanego sterowania sygnałami ze znacznymi uzależnieniami czasowymi. Łatwiej nim sterować za pomocą procesora niż budować urządzenie sprzętowe w języku VHDL.

W rzeczywistych projektach trudno wyobrazić sobie urządzenie w którym nie byłoby jednego lub kilku procesorów.

1

Page 2: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

Mankamentem procesora PicoBlaze3 jest to, że można go programować tyko w języku asembler. Bardzo prosta budowa i lista rozkazów procesora PicoBlaze3 ma jednak wspaniałe walory dydaktyczne. Wreszcie jest prosty procesor, którego architektura i działanie nie “rzuca na kolana” początkującego w dziedzinie programowania użytkownika.

8.1 Budowa komputera PicoBlaze3Spróbujmy przedstawić w prosty sposób działanie komputera zbudowanego z zastosowaniem procesora PicoBlaze3. Naszym celem jest poznanie jego budowy po to aby można go było programować w języku asembler. Zacznijmy od wyglądu zewnętrznego przedmiotu naszego zainteresowania. Oto i on. Na rys. 8-1 przedstawiono wygląd komputera PicoBlaze3. Komputer ten jest utworzony we wnętrzu układu FPGA. Podstawową częścią komputera jest procesor PiccoBlaze3. Aby procesor mógł działać i wykonywać program potrzebna jest pamięć ROM zawierająca kod programu do wykonania. Ta pamięć ROM to nic innego jak blok we wnętrzu układu Sparan3. Komputer PicoBlaze3 komunikuje się z otoczeniem (outside world) poprzez porty (bramy). Są to porty wejściowe IN i porty wyjściowe OUT. Porty te nie należą do procesora. Procesor posiada jedynie zdolność adresowania portów, a te porty musi zbudować użytkownik. Może ich zbudować tyle ile potrzebuje. I tu jest podstawowa różnica w stosunku do produkowanych mikroprocesorów, które najczęściej mają ustaloną liczbę portów wejścia-wyjścia.

Zwykle same porty procesora to za mało. We wnętrzu układu FPGA można dobudować dowolne układy cyfrowe którymi porty mogą sterować. Na zewnątrz układu FPGA można dołączyć dowolne układy elektroniczne. konieczność dołączenia dodatkowej elektroniki wynika z tego, że układy FPGA mają swoje wymagania . Główne z tych wymagań to zasilanie napięciem 3.3V. Stąd niezbędne dodatkowe układy pośredniczące bądź zabezpieczające.

Program Memory - pamięć programuData Memory - pamięćdanychControl Unit - jednostka sterującaInput Ports - porty wejścioweOutput Ports - porty wyjścioweArithmetic & Logic Unit - jednostka arytmetyczno logicznaExta Hardware inFPGA - dodatkowe układy we wnętrzu FPGAExternal Electronics - zewnętrzne układy elektroniczneOutside World - świat zewnętrzny (otoczenie)

Processor PicoBlaze3

Outside World

ROMProgram Memory

RAMData Memory

CUContol Unit

ALUArithmetic & Logic

Unit

OUTOutput Ports

INInput Ports

FPGA

Ext

a H

ard

ware

inF

PG

A

Ext

ern

al

Ele

ctro

nic

sH

ard

ware

rys.8-1 Budowa komputera PicoBlaze3. Procesor to cześć komputera.. Prawie wszystkie bloki znajdują się we wnętrzu układu FPGA. Na zewnątrz potrzebne są tylko dodatkowe układu elektroniczne, pośredniczące lub zabezpieczające

2

Page 3: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

Jak wynika z rysunku procesor PicoBlaze3 to trzy podstawowe bloki: pamięć danych RAM, jednostka arytmetyczna ALU i jednostka sterująca CU. Jeśli do takiej jednostki dołączymy blok pamięci (program ROM) i blok wejścia - wyjścia (IN/OUT), to otrzymamy komputer.

We wielkim skrócie można powiedzieć, że pamięć programu to miejsce z którego komputer odczytuje polecenia tego co ma wykonać. Z pamięci danych RAM komputer może odczytywać i zapisywać dane do obliczeń. Jednostka wejścia - wyjścia umożliwia komunikację komputera z otoczeniem. To ten blok IN/OUT umożliwia pobieranie informacji o otoczeniu i przekazywaniu do niego wyników. Jednostka arytmetyczna ALU służy do wykonywania obliczeń. Jednostka sterująca CU zarządza działaniem całego komputera. Taka konstrukcja komputera w której występują dwa niezależne układy pamięci: pamięć programu i pamięć danych, nosi nazwę komputera o architekturze harwardzkiej.

Przypatrzmy się bliżej poszczególnym blokom z rys.8-1. Zanim to zrobimy przyjmijmy następującą konwencję. Prostokąt na rysunku oznacza miejsce do którego można zapisać i z którego można odczytać informację. Ta informacja to ciąg o długości n- bitów. Przykładowo w przypadku pamięci RAM jest to 8-bitów. Symbol prostokąta na rysunku to rejestr równoległy.

ROM

PROGRAMMemory

1024 x 18bit

01 1101 0011 1111 0000Address

0

1

2

3

...

00 1110 1110 1110 1100...

1023

rys.8-2 Blok pamięci programu ROM komputera PicoBlaze3: adresowane miejsca pamięci przechowują liczby binarne. Pamięć programu ROM przechowuje liczby binarne, 18-bitowe

RAMDATA

Memory32 x 8bit

1010 1111Address

0

1

2

3

...

0001 1000...

31

rys.8-3 Blok pamięci danych RAM komputera PicoBlaze3: adresowane miejsca pamięci przechowują liczby binarne, 8-bitowe

Blok pamięci programu ROM : Jest to zbiór rejestrów równoległych. Każdy z tych rejestrów ma swój adres w pamięci. Z pod tego adresu, ze znajdującego się tam rejestru, można tylko odczytać informację. Na rys.8-2 przedstawiono sytuację gdy pod adresem 0 umieszczona jest liczba 01 1101 0011 1111 0000. Liczby binarne w dalszym ciągu zapisywać będziemy w postaci

3

Page 4: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

heksadecymalnej. Dla przykładu liczba binarna 01 1101 0011 1111 0000 w postaci heksadecymalnej będzie zapisana jako 2D3F0hex. Z pamięci Programu ROM można tylko odczytywać informacje.

Blok pamięci danych RAM: Jest to także zbiór rejestrów równoległych, tym razem o długości 8-bitów. Każdy z tych rejestrów ma swój adres w pamięci. Spod tego adresu, ze znajdującego się tam rejestru, można odczytać informację lub ją tam zapisać. Na rys.8-3 przedstawiono sytuację gdy pod adresem 0 umieszczona jest liczba 1010 1111. Liczba binarna 1010 1111 w postaci heksadecymalnej będzie zapisana jako AFhex. Do pamięci danych RAM można zapisywać lub odczytywać informację.

INInput Ports256 x 8bit

1011 0110...

Address

0123...

255

rys.8-4 Blok portów wejściowych IN komputera PicoBlaze3: dane z otoczenia odbierane są poprzez port (bramę) o wskazanym adresie

OUTOutput Ports

256 x 8bit

0011 0111...

Address

0123...

255

rys.8-5 Blok portów wyjściowych OUT komputera PicoBlaze3: dane wysyłane do otoczenia przesyłane są do portu (bramy) o wskazanym adresie

Blok portów wejściowych i blok portów wyjściowych: Budowa obu bloków jest niemal identyczna z blokiem pamięci. Zawiera rejestry umożliwiające zapis i osobne rejestry do odczytu. Te rejestry nazywane są portami wejścia - wyjścia. Poprzez te porty (bramy) możliwa jest komunikacja z otoczeniem (patrz rys. 8-5). Porty wejścia-wyjścia mają swoje adresy. Porty wejściowe i wyjściowe muszą być zdefiniowane (i zbudowane) przez użytkownika w układzie FPGA.

4

Page 5: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

ALUArithmetic & Logic Unit

Jednostka arytmetyczno-logiczna

Registers( 8-bit )

arg1

ALU

arg2

res

s0 s4 s8 sC

s1 s5 s9 sD

s2 s6 sA sE

s3 s7 sB sF

8-bit

rys.8-6 Jednostka arytmetyczno–logiczna umożliwia wykonywanie obliczeń. Jednostka wykonuje operacje używając zbioru rejestrów oznaczonych s0...sF

Blok arytmetyczno logiczny: Jego nazwa pochodzi od jednostki arytmetyczno – logicznej ALU, która umożliwia wykonywanie obliczeń. Jednostka ta z dwu argumentów arg1 i arg2 wylicza wynik w postaci rezultatu res. Jak widać z rysunku argumentami są dowolne rejestry sX i sY. Zwyczajowo rejestr sX jest jednocześnie rejestrem rezultatu operacji. Tę opisaną czynność obliczania symbolicznie zapisujemy jako sYsXsX ⊗← . Zapis ten czytamy jako: „pomiędzy zawartością rejestru sX i drugim rejestrem sY wykonaj operację ⊗ a wynik operacji prześlij jako nową zawartość rejestru sX. Znak strzałki w tym zapisie oznacza operację przesłania i jednocześnie wyznacza następstwo czasu. To co jest zapisane po prawej stronie strzałki oznacza chwilę wcześniejszą „przed”. To co znajduje się po lewej stronie strzałki to chwila później czyli „po”. Drugim argumentem operacji może być nie tylko rejestr sY ale i dowolna, 8-bitowa stała. Na rysunku przykładowo przedstawiono sytuację wykonania operacji . Jeśli s3 ← s3 sF wykonywana operacja ⊗ to przykładowo odejmowanie, to rys.8-6 ilustruje sytuację wykonania instrukcji SUB s3,sF .

CUControl Unit

Jednostka sterujaca

00 0000 0001

IR Insyruction Register(Rejestr rozkazów)

PC Program Counter(Licznik rozkazów)

01 1101 0011 1111 000018bit

10bit

rys.8-7 Jednostka sterująca CU komputera PicoBlaze3. Dwa ważne rejestry w tej jednostce to rejestr rozkazów IR i licznik rozkazów PC

Jednostka sterująca: Dwa ważne rejestry w tej jednostce to rejestr rozkazów IR i licznik rozkazów PC. Rejestr licznika rozkazów PC jest automatycznie zwiększany o 1 po wykonaniu każdej instrukcji komputera. Rejestr PC w procesorze PicoBlaze3 ma 10 bitów. Drugi z rejestrów o nazwie rejestr rozkazów IR zawiera polecania które aktualnie wykonuje komputer. Rejestr ten to jednostka o długości 18-tu bitów. Jednostka sterująca wykonuje "w kółko" ciągle te same czynności, które składają się na algorytm działania komputera:

5

Page 6: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

1. RESET: PC ← 0

2. Pobranie instrukcji: IR ← ROM[ PC]

3. Zwiększenie Licznika PC: PC ← PC+1

4. Dekodowanie instrukcji umieszczonej w IR

5. Wykonanie instrukcji

6. Przejście do punktu 2 (go to 2)

Punkt 1 tego algorytmu pokazuje, że wysterowanie linii RESET - jaką posiada każdy komputer - powoduje wpisanie do licznika rozkazów wartości 0. Punkt 2 polega na pobraniu zawartości pamięci programu ROM spod adresu wskazanego przez licznik PC. Zawartość ta umieszczana jest w rejestrze rozkazów IR. W zapisie w punkcie 2 przyjmuje się, że pamięć ROM to jednowymiarowa tablica. W dalszym ciągu będziemy stosować notację [PC]ROM w miejsce ROM[PC]. Oba zapisy oznaczają dokładnie to samo. Ten zabieg jest wstępem do tego aby przyjąć, że liczba zapisana w nawiasach oznacza zawartość pamięci. Dodatkowy dolny indeks ROM lub RAM będzie wyjaśniał której z dwóch pamięci zapis ten dotyczy. W ten sposób np. zapis [0]ROM oznacza zawartość pamięci programu o adresie 0. Na rys.8-2 przykładowa zawartość pamięci ROM to [0]ROM = 01 1101 0011 1111 0000=1D3F0hex. W wyniku wykonania operacji w punkcie 2 rejestr IR=[P]ROM= 1D3F0hex.. W punkcie 3 ulega zwiększeniu zawartość licznika rozkazów w wyniku czego PC=1.

Dekodowanie w punkcie 4 polega na sprawdzeniu co oznacza liczba zawarta w rejestrze IR. Dla rozważanego przykładu IR=1D3F0hex.. Ten kod oznacza operację odejmowania od zawartości rejestru s3 tego co znajduje się w rejestrze sF. Wynik operacji zostanie zapisany w rejestrze s3 Wykonanie instrukcji możemy symbolicznie zapisać jako s3 ← s3 - sF.

W punkcie 6 następuje przejście do punktu 2. W punkcie 2 wykonuje się operację IR ← [ PC]ROM. Stąd IR= [1]ROM = 00 1110 1110 1110 1100= 0EEEChex itd.

Spróbujmy podsumować przedstawioną budowę i działanie komputera. Algorytm wykonywany przez jednostkę sterującą CU działa "w kółko" i polega na pobieraniu instrukcji, albo jak kto woli poleceń, z pamięci ROM. Polecenia te, po zinterpretowaniu przez CU, wykonywane są przez np. jednostkę ALU. Aby zmienić kolejność wykonywanych operacji na liście poleceń (rozkazów) komputera muszą być takie, które zmienią tę kolejność przez wykonanie polecenia “skoku”. Skok taki to nic innego jak załadownie liczby do rejestru licznika PC.

Algorytm działania programu w postaci syntetycznej może być przedstawiony jako dwie czynności:

• Pobranie polecenia z pamięci

• Wykonanie polecenia.

Pobranie polecenia wiążę się ze zwiększaniem licznika PC. Licznik PC w trakcie działania komputera wskazuje na miejsce w pamięci programu aktualnie wykonywanej instrukcji.

Na marginesie należy nadmienić, że nazwa "licznik rozkazów” jest myląca – to nie jest licznik. We współczesnych komputerach jest to także rejestr. Do zwiększania jego zawartości o 1 służy zwykle specjalny układ zwany incrementer, będący autonomiczną jednostką.

6

Page 7: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

Szczegóły budowy komputera PicoBlaze3 przedstawiono na rys.8-8. Listę rozkazów procesora zamieszczono w Dodatku A. Analizując listę rozkazów warto mieć przed oczyma rys-8-8. Rysunek ten zawiera więcej szczegółów od go co przedstawiono poprzednio na rys.8-1. Te dodatkowe szczegóły to stos (stack) procesora pozwalający na wywoływanie podprogramów i właściwe ich zakończenie. W trakcie wykonywania operacji w jednostce ALU ustawiane są dwie flagi CARRY i ZERO. Procesor obsługuję tylko jedno zdarzenie - przerwanie. Wysterowanie linii INTERRUPT powoduje przerwanie. Podczas wywoływania przerwania bity flag ZERO i CARRY są przechowywane by można odzyskać ich stan po zakończeniu podprogramu obsługi przerwania. Przejście do podprogramu obsługi przerwania sygnalizuje linia INTERRUPT_ACK.

10

10

181024 x 18

10

64 x 8

32 x 10

8-bit

10

10-bitROM

RAMData

PC

TOS

IR

INPORTSSPACE256 x 8

OUTPORTSSPACE256 x 8

PORT_ID[7:0]

IR -Insstruction Register

rys.8-8 Blok procesora PicoBlaze3 (kcpsm3): budowa wewnętrzna

Blok procesora i strukturę jego wyprowadzeń przedstawia rys.8-9. Do adresowania portów służy magistrala PORT_ID[7:0], Dane zapisywane do portów wyjściowych przekazywane są przez linie OUT_PORT[7:0]. Dane z otoczenie odczytywane są poprzez linie IN_PORT[7:0]. Podczas zapisu do portu sterowana jest linia WRITE_STROBE. Podobnie podczas odczytu generowany jest impuls READ_STROBE. Przeznaczenie linie RESET i CLK nie wymaga komentarza. Maksymalna częstotliwość CLK dla procesora PicoBlaze3 to 80MHz. Do wykonania jednej instrukcji potrzebne

7

Page 8: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

są dwa cykle zegara. Stąd szybkość wykonywania operacji przez ten procesor to 40MIPS (million operations per second – liczba operacji na sekundę).

rys.8-9 Blok procesora PicoBlaze3 (kcpsm3): wprowadzenia zewnętrzne procesora

Na rys. 8-10 przedstawiono zależności czasowe podczas wykonywania operacji zapisu i odczytu do portów IN/OUT. Podczas odczytu z linii IN_PORT[7:0] procesor zapisuje dane do rejestru sX, przy opadającym zboczu sygnału READ_STROBE. Gdy odbywa się zapis do portu wyjściowego opadające zbocze sygnału WRITE_STROBE może być użyte do zapamiętania w rejestrze FPGA tego co procesor wyprowadził na linie OUT_PORT[7:0]. W obu przypadkach adres portu pojawia się na liniach PORT_ID[7:0].

PicoBlaze3 procesor łapie wartość z liniiIN_PORT[7:0] i zapisuje w rejestrze s0 w

tym miejscu

Można użyć WRITE_STROBE jako Enable abyzłapać wartość z linii OUT_PORT[7:0] i zapisać

w porcie wyjściowym w rejestrze FPGA

zawartość rejestru s0

złapana wartość z liniiOUT_PORT[7:0]

złapana wartość z liniiIN_PORT[7:0]

zawartość rejestru s7

odczyt z portu IN:IN s0,s7

instrukja: IN s0,s7 instrukja: OUT s0,65

zapis do portu OUT:OUT s0,65

rys.8-10 Zależności czasowe podczas zapisu IN i odczytu OUT z portów procesora PicoBlaze3

8.2 Obsługa przerwania wyzwalanego poziomem syganałuPrzedstawmy przykładową aplikację z zastosowaniem procesora PicoBlaze, Takim akademickim przykładem jest pokazanie jak procesor obsługuje przerwania, W przedstawionym poniżej przykładzie gdy nie ma przerwań procesor będzie zwiększał 8-bitowy licznik o nazwie waveforms. Gdy taki licznik jest podłączony do przetwornika CA na jego wyjściu, w wyniku zwiększania licznika waveforms pojawi się przebieg piłokształtny typu "rampa". Wywołanie przerwania spowoduje, że inny licznik, także 8-bitowy, o nazwie counter będzie zwiększał swoją zawartość. Gdy licznik counter podłączony zostanie do 8-miu diod LED to fakt wywołania przerwania można będzie zaobserwować oglądając diody LED. Tak będzie jeśli procesor nie działa zbyt szybko. Aby zaobserwować "mruganie" diod LED konieczne jest zwolnienie szybkości działania procesora przez dodanie podprogramu opóźnienia czasowego.

8

Page 9: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

Sprzęt potrzebny do pokazania efektów opisanego eksperymentu przedstawiono na rys. 8-11. Należy pamiętać, że do projektu dołączony jest sygnał zegarowy 50MHz. Procesor który zamierzamy wykorzystać w tym projekcie wymaga dwóch okresów zegarowych do wykonania jednej instrukcji. Sprawia to że napisany program dla tego procesora będzie wykonywany bardzo szybko, z prędkością 25MIPS, to jest 25mln operacji na sekundę.

8x1k2

V3.3

p89P: 67 p88

p87p86p85p81p80p79

q<0>q<1>q<2>q<3>q<4>q<5>q<6>q<7>

5k 5k 5k 5k 5k 5k 5k

10k 10k10k 10k 10k 10k 10k 10k 10k

GND

da<0>

da<1>

da<2>

da<3>

da<4>

da<5>

da<6>

da<7>

p55

p54

p53

p50

p49

p48

p47

p44

LM358

GND

5V

GND

BUT

3.3V

GND

4k7

100

p37re s e t

b u t

rys.8-11 Do układu Spartan3 dołączone są diody LED oraz przetwornik CA. Przycisk przedstawiony na rysunku ma wywoływać przerwanie w procesorze PicoBlaze umieszczonym we wnętrzu układu FPGA. Przyciśnięcie przycisku ma uruchomić migotanie diod LED. Jeśli przycisk nie jest przyciśnięty na wyjściu przetwornika CA generowany jest przebieg piłokształtny typu "rampa"

Na rys. 8-14 przedstawiono schemat tego co zostanie zbudowane we wnętrzu układu Spartan3. To samo co przedstawia schemat na rys. 8-14 zapisano w postaci modułu VHDL w programie na rys.8-15. Na schemacie (i w programie VHDL) można zauważyć moduł procesora PicoBlaze o nazwie kcpsm3. Do procesora podłączona jest pamięć ROM_prog. Pamięć ta zawiera kod program sterującego. Kod programu dla przykładu opisywanego w tym rozdziale znajduje się na rys. 8-16.

Aby procesor mógł działać konieczne jest podłączenie do procesora PicoBlaze dodatkowych, zewnętrznych portów. Te dwa porty to dwa rejestry równoległe składające się przerzutników typu D. Porty sterują wyprowadzeniami o nazwach counter i waveforms. Porty dołączone do procesora umieszczone są w przestrzeni adresowej portów pod ściśle określonymi adresami. Dla portu counter ten adres to 02, a dla portu waveforms adres 01. Dekodery przedstawione na rys. 8-14 przedstawione są w pełnej, najbardziej skomplikowanej postaci. W języku VHDL przykładowo dla portu counter ten sposób dekodowania opisuje zapis

9

Page 10: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

if port_id=x"01" and write_strobe='1' thenDla opisywanego przykładu ten zapis można znacznie uprościć

if port_id(0)='1'and write_strobe='1' thenTaki uproszczony sposób dekodowania zakłada, że do procesora można podłączyć co najwyżej osiem portów.

rys.8-12 Projekt w języku VHDL przedstawiony na rys.8-13 można przedstawić w postaci schematu. Widoczny na rysunku jest procesor kcpsm3, i jego pamięć ROM_PROG. Do procesora podłączone są dwa porty wyjściowe. Każdy z portów posiada odrębny dekoder adresu. Dekodery adresu można uprościć

Moduł VHDL przedstawiony na rys.8-13 zawiera dokładnie to samo co przedstawiono na rys. 8-12. Język schematów jest bardziej poglądowy i bardzo często używa się go na najwyższym poziomie (top level) projektu. Język schematów ma jednak pewne wady. Najpoważniejszą z nich jest sama firma Xilinx która ciągle coś zmienia i nie ma żadnej gwarancji, że schemat narysowany w środowisku ISE3.1 będzie dalej działał w środowisku ISE9.1. Takiej wady pozbawiony jest język VHDL i jest to jeden z powodów dla którego warto się go nauczyć.

10

Page 11: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

-------------------------------------- PicoBlaze3, dwa porty OUT i przerwanie---- Projekt używa gotowego procesora PicoBlaze3 ze zbioru kcpsm3.vhd. Do -- procesora dołączona jest pamięć ROM z programem ROM_PROG.vhd.-- W projekcie do procesora dołączono ponadto dwa porty wyjściowe OUT.-- Do portu o adresie 01 dołączone są diody LED. Port o adresie 02 steruje -- przetwornikiem DA. Do wejścia interrupt_event dołączony jest przycisk.-- Jego naciśnięcie wywołuje przerwanie.-- Przerwanie w procesorze wyzwalane jest poziomem sygnału. Oznacza to, że tak-- długo jak będzie przyciskany przycisk będzie wykonywany podprogram-- obsługi przerwania, powodujący migotanie diod LED.-- Program główny, gdy nie ma przerwań, produkuje na wyjściu przetwornika CA. -- przebieg piłokształtny typu rampa Częstotliwość oscylatora 50MHz powoduje że-- procesor wykonuje 25mnl instrukcji w ciągu sekundy.------------------------------------------------------------------------------library IEEE;use IEEE.STD_LOGIC_1164.ALL;entity kcpsm3_int_test isport ( counter : out std_logic_vector(7 downto 0); -- LEDs port waveforms : out std_logic_vector(7 downto 0); -- DAC port interrupt_event : in std_logic; -- przycisk --reset : in std_logic; -- odblokować podczas symulacji clk : in std_logic -- 50MHz);end entity;architecture Behavioral of kcpsm3_int_test is ------------------------------- component kcpsm3 --- moduł procesora Pico Blaze3 port ( address : out std_logic_vector(9 downto 0); instruction : in std_logic_vector(17 downto 0); port_id : out std_logic_vector(7 downto 0); write_strobe : out std_logic; out_port : out std_logic_vector(7 downto 0); read_strobe : out std_logic; in_port : in std_logic_vector(7 downto 0); interrupt : in std_logic; interrupt_ack : out std_logic; reset : in std_logic; clk : in std_logic ); end component; component ROM_PROG ------- moduł pamięci programu port ( address : in std_logic_vector (9 downto 0); instruction : out std_logic_vector(17 downto 0); clk : in std_logic ); end component; signal address : std_logic_vector(9 downto 0); signal instruction : std_logic_vector(17 downto 0); signal port_id : std_logic_vector(7 downto 0); signal out_port : std_logic_vector(7 downto 0); signal in_port : std_logic_vector(7 downto 0); signal write_strobe : std_logic; signal read_strobe : std_logic; signal interrupt_ack : std_logic; signal reset : std_logic;

11

123456789

101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263

Page 12: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

signal interrupt : std_logic;begin --------------------------------------------------------------------- in_port <= "00000000"; -- porty wejściowe są nieużywane w tym projekcie reset <= '0'; -- zerowanie gdy reset=1 processor: --<<<<<<<<<<<<<<< moduł procesora PicoBlaze3 kcpsm3 port map ( address => address, instruction => instruction, port_id => port_id, write_strobe => write_strobe, out_port => out_port, read_strobe => read_strobe, in_port => in_port, interrupt => interrupt, interrupt_ack => interrupt_ack, reset => reset, clk => clk ); ROM_program: --<<<<<<<<<<<<<<< moduł pamięci z programem ROM_PROG port map( address => address, instruction => instruction, clk => clk ); out_ports: --<<<<<<<< porty OUT dołączone do procesora process(clk) is begin if clk'event and clk='1' then --if port_id(1)='1'and write_strobe='1' then -- proste dekodowanie if port_id=x"02" and write_strobe='1' then -- adres portu 2 waveforms <= out_port; end if; --if port_id(0)='1'and write_strobe='1' then -- proste dekodowanie if port_id=x"01" and write_strobe='1' then -- adres portu 1 counter <= out_port; end if; end if; end process; interrupt <= not interrupt_event; end architecture;

rys.8-13 Projekt na rysunku używa komponentu procesora PicoBlaze o nazwie kcpsm3. Do procesora podłączona jest pamięć ROM_PROG. Pamięć ta zawiera kod programu przedstawiony na rys.8-16. Procesor steruje dwoma portami wyjściowymi out. Port waveforms steruje przetwornikiem CA. Do portu counter podłączone są diody LED.

Program w języku asembler procesora PicoBlaze przedstawiono na rys.8-14. Program ten musi znaleźć się we wnętrzu modułu ROM_PROG. Przyjrzyjmy się programowi. Wiersze programu zaczynające się od znaku średnika zawierają komentarze. Wiersze #14,15 zawierają pseudorozkazy DSOUT. Takie pseudorozkazy przypisują do wskazanego numeru portu zbiór tekstowy. To co zostanie wysłane do portu zapisane zostanie w zbiorze tekstowym.

12

646566676869707172737475767778798081828384858687888990919293949596979899

100101102103104105106107108109110111112113

Page 13: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

Pseudoinstrukcje DSOUT dotyczą symulatora procesora PicoBlaze i nie mają żadnego znaczenia w realizacji działającej w układzie FPGA.

Pseudoinstrukcja VHDL mówi skąd wziąć wzorzec (template) do wygenerowania modułu ROM_PROG. Moduł ROM_PROG zostanie zapisany do zbioru ROM_PROG.vhd.

Pseudoinstrukcje EQU (equal) przypisują nazwom symbolicznym wartości. Liczby zaczynające się od znaku $ to liczby heksadecymalne. Od etykiety start zaczynają się instrukcje programu PicoBlaze.

Program główny cały czas wykonuje pętlę oznaczoną etykietą drive_wave. W tej pętli sukcesywnie zwiększa się zawartość licznika ramp_couner. Aby sterować częstotliwością sygnału piłokształtnego dodano opóźnienie delay_ramp. Maksymalna częstotliwość to 1MHz i wynika ona z pasma wzmacniacza operacyjnego przetwornika CA.

Przyciśnięcie przycisku wywołuje podprogram obsługi przerwania. Przerwania zaczynają się od ostatniego adresu w pamięci procesora, to jest od adresu $3FF. Program obsługi przerwania int_routine można umieścić w dowolnym miejscu pamięci. Podprogram obsługi przerwania zwiększa zawartość licznika interrupt_counter. Aby stany portu counter_port nie następowały zbyt szybko wywoływany jest podprogram delay_long. Jest to drugi, inny niż delay_ramp, podprogram opóźnienia czasowego. Potrzebne są dwa niezależne podprogramy opóźnienia czasowego z tego względu, ze napisano je w postaci bez ochrony rejestrów, np. na stosie.

;-------------------------------------------- obsługa przerwań (interrupt.psm);; Program w języku asembler procesora PicoBlaze3. Program generuje przebieg; piłokształtny typu narastająca/opadająca rampa. Przebieg może być obserwowany; na oscyloskopie. Do poru DAC dołączony jest przetwornik CA. Przyciśniecie; przycisku wywołuje przerwanie. Podprogram obsługi przerwania powoduje ; zwiększanie stanów licznika binarnego. Stany licznika widoczne są na diodach; LED dołączonych do portu counter. Pętla główna i podprogram obsługi ; przerwania używają dwóch różnych podprogramów opóźnienia czasowego: ; delay_ramp i delay_long.;-----------------------------------------------------------------------------; pseudoinstrukcje programu pBlazIDE (Mediatronix)LEDs DSOUT $01, "output_LEDs.txt" ; zapis do zbioru txtDAC DSOUT $02, "output_DAC.txt" ; zapis do zbioru txt VHDL "ROM_form.vhd", "ROM_PROG.vhd", "ROM_PROG";-----------------------------------------------------------------------------waveform_port EQU $2 ; adres portu przebiegu rampacounter_port EQU $1 ; adres portu diod LEDinterrupt_counter EQU sA ; rejestr licznika przerwańramp_counter EQU sB ; rejestr licznika DACacc EQU sC

;-----------------------------------------------------------------------------start: LOAD interrupt_counter, 0 ; początek programu LOAD ramp_counter,$AA ; wartość początkowa EINT ; odblokowanie przerwańdrive_wave: SUB ramp_counter, 1 ; zmniejszanie licznika ;ADD ramp_counter, 1 ; zwiększanie licznika OUT ramp_counter, waveform_port CALL delay_ramp ; f <= 1MHz JUMP drive_wave

13

123456789

1011121314151617181920212223242526272829303132333435

Page 14: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

;-----------------------------------------------------------------------------delay_ramp: LOAD s0, $FF ; podprogram opóźnienia LOAD s1, $FF short_delay1: SUB s0, 1 SUBC s1,0 ; s1,s0 - liczni 16-bit. ADD s0,0 JUMP NZ, short_delay1 ADD s1,0 JUMP NZ, short_delay1 RET;-----------------------------------------------------------------------------delay: LOAD s2, $FF ; podprogram opóźnienia LOAD s3, $FF short_delay2: SUB s2, 1 SUBC s3,0 ; s3,s2 - liczni 16-bit. ADD s2,0 JUMP NZ, short_delay2 ADD s3,0 JUMP NZ, short_delay2 RETdelay_long: load acc,$30 delay_long_01: CALL delay LOAD s2, $FF ; podprogram opóźnienia LOAD s3, $FF SUB acc,1 JUMP nz,delay_long_01 RET;----------------------------------------------------------------------------- ORG $3F0int_routine: CALL delay_long ; wibracja styków SUB interrupt_counter, 1 ; increment counter OUT interrupt_counter, counter_port RETI enable;----------------------------------------------------------------------------- ORG $3FF ; skok do podprogramu przerwania JUMP int_routine

rys.8-14 Program w języku asembler procesora PicoBlaze. Program w pętli głównej podaje kolejne wartości licznika binarnego do portu o adresie 02. Do tego portu podłączony jest przetwornik CA. Przyciśnięcie przycisku wywołuje przerwania. Podprogram obsługi przerwania zwiększa stany innego licznika binarnego, który steruje diodami LED dołączonymi do portu o adresie 01. Program główny i podprogram przerwań wywołują dwie różne procedury opóźnienia czasowego

Program przedstawiony na rys.8-14 w języku asembler wymaga kompilacji. Na rys.8-15 przedstawiono środowisko IDE firmy Mediatronix. Środowisko to umożliwia kompilację programu w języku asembler procesora PicoBlaze. W efekcie jego działania zostanie wyprodukowany moduł VHDL z programem dla procesora kcpsm3. Możliwe jest sprawdzenie działania programu za pomocą symulatora procesora PicoBlaze. Wyprodukowany moduł pamięci należy oczywiście dołączyć do projektu VHDL. W opisywanym przypadku będzie to moduł ROM_PROM.vhd.

14

36373839404142434445464748495051525354555657585960616263646566676869707172737475

Page 15: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

rys.8-15 Środowisko do kompilacji i symulacji procesora PicoBlaze firmy Mediatronix

Projekt przedstawiony na rys.8-13 może być sprawdzony symulacyjne przy pomocy symulatora ModelSim. W tym celu trzeba dokonać modyfikacji projektu. Najpierw należy usunąć komentarz z wiersza #24 i dodać wejście zerujące reset do projektu. Próba kompilacji projektu z dodanym wierszem reset spowoduje kilka błędów w programie, które Czytelnik z łatwością zidentyfikuje i poprawi bo okażą się one oczywiste. Przykładowo dodanie linii #24 spowoduje błąd w wierszu #63 bo nie może istnieć sygnał reset i wejście do projektu o tej samej nazwie. Dodatkowo należy poprawić program w języku asembler (rys.8-14). Trzeba skrócić maksymalnie czas trwania podprogramów opóźnienia delay_ramp i delay_long lub je w ogóle usunąć. Jeśli tego nie zrobimy bardzo długo czekać będziemy na rezultaty symulacji.

Na rys.8-16 przedstawiono zależności czasowe uzyskane symulacyjnie. Na wykresie widać, że niski stan na linii przerwania powoduje zwiększanie stanów licznika counter. Stan wyjść waveforms zwiększane są gdy linia przerwania znajduje się w stanie wysokim.

15

Page 16: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

rys.8-16 Wyniki symulacji projektu. Port counter zwiększa wartość w wyniku przerwań. Gdy nie ma przerwań zwiększany jest stan portu waveforms

Oscylogram przedstawiony na rys.8-17 powstał na wyjściu przetwornika w warunkach rzeczywistych, po załadowaniu projektu z rys.8-13 do układu Spartan3. Widać na nim przebieg piłokształtny generowany bardzo wolno, z częstotliwością 0.193Hz. Przyciśnięcie przycisku przerwania wyzwalanego poziomem spowoduje mruganie diod LED lecz zatrzyma generowanie przebiegu piłokształtnego (płaski odcinek wykresu). Tak więc dopóki poziom sygnału na linii przerwania jest niski wykonywany jest podprogram obsługi przerwania, co może być obserwowane na diodach LED.

rys.8-17 Na wyjściu przetwornika CA powstaje przebieg piłokształtny. Wywołanie przerwań sterowanych poziomem powoduje zatrzymanie programu głównego. Dopóki przyciśnięty jest przycisk mrugają diody LED i wykonywany jest tylko podprogram obsługi przerwania

8.3 Obsługa przerwania wyzwalanego zboczem sygnałuSpróbujmy zmodyfikować przykład pokazany w poprzednim rozdziale po to aby pokazać jak do procesora PicoBlaze dodać dodatkowy sprzęt. Użycie procesora w projekcie daje swobodę wyboru tego co wykonać w postaci programu, a co zrealizować w postaci dodatkowego, dodanego do projektu, sprzętu (hardware). Spróbujmy powyższe stwierdzenie zilustrować przykładem.

16

Page 17: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

W wielu mikroprocesorach istniej możliwość programowego wyboru jak będą wyzwalane przerwania: zboczem czy poziomem sygnału. Procesor PicoBlaze obsługuje tylko przerwania wyzwalane poziomem. Dodajmy zatem dodatkowy sprzęt aby spowodować, że zbocze sygnału będzie wywoływało przerwanie. Jeśli przyjmiemy, że przerwanie powodowane jest naciśnięciem przycisku, to każde przyciśnięcie powinno powodować jedno przerwanie. W poprzednim rozdziale przerwania były wykonywane tak długo jak długo wciśnięty był przycisk wywołujący przerwanie. Zamiast dodatkowego sprzętu możemy oczywiście zrealizować rozpoznawanie zbocza sygnału w programie procesora PicoBlaze.

Popatrzmy na modyfikację sprzętową przedstawioną na schemacie (rys.8-18).To co przedstawiono w postaci schematu odpowiada dokładnie temu co zamieszczono w programie VHDL na rys.8-19. Do sygnału przerwania dodano przerzutnik FDC_1. Pojawienie się opadającego zbocza sygnału interrupt_event zostanie zapamiętane w przerzutniku jako wartość 1. To z kolei spowoduje wywołanie podprogramu obsługi przerwania (patrz. rys.8-14). W podprogramie przerwania wywoływany jest inny podprogram opóźnienia czasowego delay_long. Istnienie tego podprogramu spowodowane jest chęcią eliminacji drgań styków przycisku wywołującego przerwanie. Instrukcja

OUT interrupt_counter, counter_portw wierszu #72 programu powoduje podanie nowej wartości do portu counter_port i jednocześnie zeruje przerzutnik FDC_1. Po zakończeniu podprogramu potrzebne jest kolejne zbocze sygnału przerwania aby spowodować pokazanie następnego stanu na diodach LED.

Na schemacie na rys.8-18 zastosowano ponadto uproszczony sposób dekodowania adresów portów wyjściowych. Uproszczone dekodowanie polega bezpośrednim na użyciu linii adresowych port_id

if port_id(0)='1'and write_strobe='1' thenTaki uproszczony sposób dekodowania powoduje, że do procesora można podłączyć co najwyżej osiem różnych portów.

17

Page 18: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

rys.8-18 Projekt w języku VHDL z rys.8-19 można przedstawić w postaci schematu. Na rysunku widoczny jest procesor kcpsm3 i jego pamięć ROM_PROG. Do procesora podłączone są dwa porty wyjściowe. Każdy z portów posiada odrębny dekoder adresu. Zastosowano dekodowanie uproszczone. Aby przerwania były wywoływane zboczem sygnału interrupt_event dodano przerzutnik FDC_1. Przerzutnik jest zerowany adresem dostępu do portu counter

-------------------------------------- PicoBlaze3, dwa porty OUT i przerwanie---- Projekt używa gotowego procesora PicoBlaze3 ze zbioru kcpsm3.vhd. Do -- procesora dołączona jest pamięć ROM z programem ROM_PROG.vhd .-- W projekcie do procesora dołączono ponadto dwa porty wyjściowe OUT.-- Do portu o adresie 01 dołączone są diody LED. Port o adresie 02 steruje -- przetwornikiem DA. -- Do wejścia interrupt_event dołączony jest przycisk. Jego naciśnięcie -- wywołuje przerwanie wyzwalane zboczem sygnału. Oznacza to, że każde-- naciśnięcie przycisku spowoduje jednorazowe wykonanie podprogramu-- obsługi przerwania, powodujący zwiekszenie stanu diod LED o 1.-- Zapis do portu o adresie 01 dodatkowo zeruje przrezuttnik przerwania.-- Program główny, gdy nie ma przerwań, produkuje przebieg piłokształtny typu-- rampa opadająca na wyjściu przetwornika CA. Częstotliwość oscylatora-- 50MHz powoduje że procesor wykonuje 25mnl instrukcji w ciągu sekundy.-- Z tego powodu do programu dodano dwa podprogramy opóznienia czasowego. -- Podprogram delay_long o długim opóznienieniu zabezpiecza przed wibracją-- styków przełacznika powodującego przerwania.------------------------------------------------------------------------------ library IEEE;use IEEE.STD_LOGIC_1164.ALL;entity kcpsm3_int_test is

18

123456789

1011121314151617181920212223

Page 19: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

port ( counter : out std_logic_vector(7 downto 0); -- LEDs port waveforms : out std_logic_vector(7 downto 0); -- DAC port interrupt_event : in std_logic; -- przycisk --reset : in std_logic; -- odblokować podczas symulacji clk : in std_logic -- 50MHz);end entity;architecture Behavioral of kcpsm3_int_test is ------------------------------- component kcpsm3 --- moduł procesora Pico Blaze3 port ( address : out std_logic_vector(9 downto 0); instruction : in std_logic_vector(17 downto 0); port_id : out std_logic_vector(7 downto 0); write_strobe : out std_logic; out_port : out std_logic_vector(7 downto 0); read_strobe : out std_logic; in_port : in std_logic_vector(7 downto 0); interrupt : in std_logic; interrupt_ack : out std_logic; reset : in std_logic; clk : in std_logic ); end component; component ROM_PROG ------- moduł pamięci programu port ( address : in std_logic_vector (9 downto 0); instruction : out std_logic_vector(17 downto 0); clk : in std_logic ); end component; signal address : std_logic_vector(9 downto 0); signal instruction : std_logic_vector(17 downto 0); signal port_id : std_logic_vector(7 downto 0); signal out_port : std_logic_vector(7 downto 0); signal in_port : std_logic_vector(7 downto 0); signal write_strobe : std_logic; signal read_strobe : std_logic; signal interrupt_ack : std_logic; signal reset : std_logic; signal interrupt : std_logic;begin --------------------------------------------------------------------- in_port <= "00000000"; -- porty wejściowe są nieużywane w tym projekcie reset <= '0'; -- zerowanie gdy reset=1 processor: --<<<<<<<<<<<<<<< moduł procesora PicoBlaze3 kcpsm3 port map ( address => address, instruction => instruction, port_id => port_id, write_strobe => write_strobe, out_port => out_port, read_strobe => read_strobe, in_port => in_port, interrupt => interrupt, interrupt_ack => interrupt_ack, reset => reset,

19

242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586

Page 20: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

clk => clk ); ROM_program: --<<<<<<<<<<<<<<< moduł pamięci z programem ROM_PROG port map( address => address, instruction => instruction, clk => clk ); out_ports: --<<<<<<<< porty OUT dołączone do procesora process(clk) is begin if clk'event and clk='1' then if port_id(1)='1' and write_strobe='1' then -- proste dekodowanie --if port_id=x"02" and write_strobe='1' then -- adres portu 2 waveforms <= out_port; end if; if port_id(0)='1'and write_strobe='1' then -- proste dekodowanie --if port_id=x"01" and write_strobe='1' then -- adres portu 1 counter <= out_port; end if; end if; end process; interrupt_edge: process(interrupt_event) is --<<< przerzytnik przerwania begin --if port_id=x"01" then if port_id(0)= '1' then -- adres out zeruje przerzutnik interrupt <= '0'; elsif interrupt_event'event and interrupt_event='0' then interrupt <= '1'; -- zbocze ustawia przerzutnik end if; end process ; end architecture;

rys.8-19 Projekt na rysunku używa komponentu procesora PicoBlaze o nazwie kcpsm3. Do procesora podłączona jest pamięć ROM_PROG. Pamięć ta zawiera kod programu przedstawiony na rys.8-14. Procesor steruje dwoma portami wyjściowymi out. Port waveforms steruje przetwornikiem CA. Do portu counter podłączone są diody LED. Projekt zawiera komponent przerzutnika zapamiętującego zbocze sygnału przerwania interrupt_event

Program w języku asembler procesora PicoBlaze przedstawiono w poprzednim rozdziale na rys.8-14. Ten sam program może być użyty w przypadku przerwań wyzwalanych zboczem i przerwań wyzwalanych poziomem sygnału.

Na rys.8-20 przedstawiono .rezultaty symulacji projektu przy pomocy symulatora ModelSim. Aby przeprowadzić symulację trzeba maksymalnie skrócić czas trwania podprogramów opóźnień czasowych lub je w ogóle usunąć.

20

87888990919293949596979899

100101102103104105106107108109110111112113114115116117118119120121122123124125

Page 21: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

rys.8-20 Wyniki symulacji projektu. Port counter zwiększa wartość w wyniku przerwań. Gdy nie ma przerwań zwiększany jest stan portu waveforms

Oscylogram przedstawiony na rys.8-21 powstał na wyjściu przetwornika CA po załadowaniu projektu z rys.8-19 do układu Spartan3. Widać na nim przebieg piłokształtny generowany bardzo wolno, z częstotliwością 68.52Hz. Przyciśnięcie przycisku przerwania wyzwalanego zboczem sygnału spowoduje zwiększenie stanu diod LED o wartość 1 lecz zatrzyma generowanie przebiegu piłokształtnego. Płaski odcinek na oscylogramie to czas wykonania podprogramu obsługi przerwania.

rys.8-21 Na wyjściu przetwornika CA powstaje przebieg piłokształtny. Wywołanie przerwania wyzwalanego zboczem powoduje zatrzymanie programu głównego na czas wykonania podprogramu przerwania. Przyciśnięcie przycisku przerwania powoduje zwiększenie stanu licznika binarnego widocznego na diodach LED o jeden

21

Page 22: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

8.4 Sterowanie wyświetlaczem LCDSpróbujmy pokazać w jaki sposób dołączyć i sterować znakowym wyświetlaczem LCD za pomocą procesora PicoBlaze3. Z wykresów czasowych wyświetlacza LCD wynika, że minimalny czas trwania sygnału E (enable) dla wyświetlacza wynosi 220nsek. Czas wykonania jednej instrukcji przez procesor to 1/25MHz=40nsek. Procesor działa zbyt szybko aby można do jego magistrali bezpośrednio podłączyć wyświetlacz LCD. Jednym z rozwiązań może być zmniejszenie częstotliwości zegara w procesorze. Innym rozwiązaniem jest sterownie liniami wyświetlacza dołączonymi do portów procesora. Tak robi się zawsze w przypadku procesorów nie posiadających zewnętrznej magistrali adresowej. Taki rozwiązanie zastosowaliśmy w tym rozdziale.

Magistrala wyświetlacza LCD jest dwukierunkowa. Odczyt rejestru stanu wyświetlacza pozwala sprawdzić czy wyświetlacz jest zajęty wykonywaniem operacji. W rozwiązaniu opisywanym dalej w miejsce sprawdzania zajętości postanowiliśmy zastosować stały czas opóźnienia. Dzięki temu do wyświetlacza LCD przekazuje się tyko polecenia zapisu -odczyt jest zbędny.

Na rys. 8-22 przedstawiono jak podłączyć wyświetlacz LCD do procesora. Użyto dwóch portów wyjściowych. Port o adresie 03 i 02 steruje magistralą danych wyświetlacza. Bit numer 9 tego portu zapamiętuje najmłodszy bit adresu. W ten sposób adres 03 wybiera dostęp do rejestru danych wyświetlacza, a adres 02 oznacza dostęp do rejestru sterującego w wyświetlaczu.

Aby sterować linią wybierającą enable dobudowano jeszcze jeden port. Port o adresie 04 ma tylko jeden bit. Tym bitem o numerze 7 steruje się linią enable w wyświetlaczu.

rys.8-22 Sposób sterowania wyświetlaczem LCD. Na rysunku widoczny jest procesor kcpsm3 i jego pamięć ROM_PROG. Do procesora podłączone są dwa porty wyjściowe. Każdy z portów posiada odrębny dekoder adresu. Adresy 03 i 02 umożliwiają dostęp do rejestrów danych i do rejestrów sterujących wyświetlacza LCD. Najstarszy bit 7 portu o adresie 04 steruje linią enable wyświetlacza LCD. Schemat przedstawia dokładnie to co zapisano w języku VHDL na rys. 8-23

22

Page 23: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

To co przedstawiono w postaci schematu zawiera także moduł VHDL przedstawiony na rys.8-23. Schemat jest bardziej poglądowy niż kod w języku VHDL.-------------------------------------------------------------------------------- Projekt używa gotowego procesora PicoBlaze3 ze zbioru kcpsm3.vhd. Do -- procesora dołączona jest pamięć ROM z programem ROM_PROG.vhd.-- W projekcie do procesora dołączono ponadto dwa porty wyjściowe OUT.-- Zapis do portu o adresie 02 lub 03 steruje liniami danych wyświetlacza -- D_LCD. Linia wyświetlacza D_notC_LCD wybierająca rejestr danych lub rejestr -- kontrolny jest sterowana adresem poru 02 lub 03, bit 0. Linia E_LCD -- sterująca wyborem (enable)wyświetlacza pochodzi z portu o dresie 04, bit 7.------------------------------------------------------------------------------library IEEE;use IEEE.STD_LOGIC_1164.ALL;entity kcpsm3_LCD_test isport ( D_LCD : out std_logic_vector(7 downto 0); E_LCD : out std_logic; D_notC_LCD : out std_logic; reset : in std_logic; clk : in std_logic );end entity;architecture Behavioral of kcpsm3_LCD_test is --------------------------------component kcpsm3 --<<<<<<<<<< procesor PicoBlaze3port ( address : out std_logic_vector(9 downto 0); instruction : in std_logic_vector(17 downto 0); port_id : out std_logic_vector(7 downto 0); write_strobe : out std_logic; out_port : out std_logic_vector(7 downto 0); read_strobe : out std_logic; in_port : in std_logic_vector(7 downto 0); interrupt : in std_logic; interrupt_ack : out std_logic; reset : in std_logic; clk : in std_logic );end component;component ROM_prog --<<<<<<<<<< pamięć programu ROMport ( address : in std_logic_vector(9 downto 0); instruction : out std_logic_vector(17 downto 0); clk : in std_logic ); end component;signal address : std_logic_vector(9 downto 0);signal instruction : std_logic_vector(17 downto 0);signal port_id : std_logic_vector(7 downto 0);signal out_port : std_logic_vector(7 downto 0);signal in_port : std_logic_vector(7 downto 0);signal write_strobe : std_logic;signal read_strobe : std_logic;begin ------------------------------------------------------------------------ processor: kcpsm3 ----------------------------<<<<<<<<<< procesor PicoBlaze3 port map(

23

123456789

101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960

Page 24: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

address => address, instruction => instruction, port_id => port_id, write_strobe => write_strobe, out_port => out_port, read_strobe => read_strobe, in_port => in_port, interrupt => '0', interrupt_ack => open, reset => not reset, clk => clk ); program: ROM_prog ----------------------------<<<<<<<<<< pamięć programu ROM port map( address => address, instruction => instruction, clk => clk ); OUT_ports: process(clk) is -------------------<<<<<<<<<< porty OUT procesora begin if clk'event and clk='1' then if port_id(2)='1' and write_strobe='1' then -- adres 04 E_LCD <= out_port(7); -- bit 7 steruje LCD_Enable end if; if port_id(1)='1' and write_strobe='1' then -- adres 02 i 03 D_LCD <= out_port; -- linie danych LCD D_notC_LCD <= port_id(0); -- wybór: LCD_data/LCD_control end if; end if; end process ; end architecture;

rys.8-23 Sterowanie znakowym wyświetlaczem LCD. Do procesora PicoBlaze3 dołączono dodatkowe porty wyjściowe OUT. Porty o adresach 02 i 03 sterują magistralą danych wyświetlacza LCD. O tym czy jest do zapis do rejestru danych wyświetlacza czy do rejestru sterowania wyświetlaczem decyduje adres port_id(0). W ten sposób zapis do portu 03 oznacza dostęp do rejestru danych wyświetlacza, a zapis pod adres 02 oznacza dostęp do rejestru sterowania wyświetlacza. Linią enable w wyświetlaczu steruje port o adresie 04, bit 7

Kod programu procesora PicoBlaze3, potrzebny do sterowania wyświetlaczem LCD, przedstawiono na rys. 8-24. Kod ten po skompilowaniu utworzy zbiór ROM_PROG.vhd, który należy dołączyć do projektu. Program przedstawiony na rys. 8-24 po uruchomieniu wyprowadzi na ekran wyświetlacza LCD napis TEST.

Podstawową procedurą programu jest delay_LCD. We wnętrzu tej procedury ukryto sterownie linią enable wyświetlacza. Sześć instrukcji wystarcza aby wygenerować impuls enable o minimalnym czasie 220nsek. Skora każda instrukcja procesora trwa 40nsek to 6 x 40 =240 nsek. co spełnia wymagania wyświetlacza. Dłuższy czas oczekiwania na końcu procedury delay_LCD

24

616263646566676869707172737475767778798081828384858687888990919293949596979899

100101

Page 25: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

niezbędny jest aby być pewnym, że wyświetlacz nie jest zajęty wewnętrznymi operacjami. W programie do generowanie impulsu enable użyto instrukcji NOP.

;------------------------------- sterowanie wyświetlaczem LCD (LCD_test.psm);; Program w języku asembler procesora PicoBlaze3. Program steruje znakowym; wyświetlaczem LCD. W wyniku działania programu na wyświetlaczu pojawi się ; napis TEST. Ze względu na zbyt dużą szybkość wykonywania operacji przez ; procesor PicoBlaze3 wyświetlacz LCD sterowany jest poprzez dobudowane do ; procesora porty wyjściowe OUT. Zamiast sprawdzania zajętości wyświetlacza ; zastosowano opóźnienie czasowe delay_LCD.;-----------------------------------------------------------------------------; pseudoinstrukcje programu pBlazIDE (Mediatronix)LCD_cntr_p DSOUT 2, "output_LCD_control.txt"LCD_data_p DSOUT 3, "output_LCD_data.txt"LCD_enable DSOUT 4, "output_LCD_enable.txt" VHDL "ROM_form.vhd", "ROM_PROG.vhd", "ROM_PROG";-----------------------------------------------------------------------------LCD_enable_port EQU 4LCD_data_port EQU 3 LCD_control_port EQU 2acc EQU sAdata EQU sBcnt EQU sCcnt_delay_low EQU s0cnt_delay_high EQU s1;-----------------------------------------------------------------------------start: CALL delay_LCD LOAD acc, $01 ; LCD RESET OUT acc, LCD_control_port CALL delay_LCD LOAD acc, $0C ; LCD ON OUT acc, LCD_control_port CALL delay_LCD LOAD acc, 'T' OUT acc, LCD_data_port CALL delay_LCD LOAD acc, 'E' OUT acc, LCD_data_port CALL delay_LCD LOAD acc, 'S' OUT acc, LCD_data_port CALL delay_LCD LOAD acc, 'T' OUT acc, LCD_data_port CALL delay_LCD loop: JUMP loop; --------------------------------------------------------- opóźnienie czasowedelay: SUB cnt_delay_low, 1 SUBC cnt_delay_high, 0 ADD cnt_delay_low, 0 JUMP NZ, delay ADD cnt_delay_high, 0 JUMP NZ, delay RET;--------------- opóźnienie czasowe i sterowanie linią Enable wyświetlacza LCDdelay_LCD: LOAD acc,$00 ; Enabl=0

25

123456789

10111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758

Page 26: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

OUT acc, LCD_enable_port LOAD acc,$82 ; Enabl=1 OUT acc, LCD_enable_port LOAD acc,acc ; NOP LOAD acc,acc ; ... LOAD acc,acc LOAD acc,acc LOAD acc,$00 ; Enabl=0 OUT acc, LCD_enable_port LOAD cnt_delay_low,$00 ; poczekaj (wait) LOAD cnt_delay_high,$40 CALL delay RET

rys.8-24 Program testowy wyświetlacza LCD dołączonego do procesora PicoBlaze3. Program wypisuje na ekranie wyświetlacza LCD napis TEST. Port o adresie 03 umożliwia dostęp do rejestru danych wyświetlacza. Port o adresie 02 pozwala na sterowanie wyświetlaczem. Najstarszy bit 7 portu o adresie 04 steruje linią enable wyświetlacza. Zamiast sprawdzania zajętości wyświetlacza zastosowano opóźnienie czasowe. Sterowanie linią enable umieszczono we wnętrzu procedury delay_LCD

8.5 Magistrala 1-WIREIstnieje wiele standardów wymiany informacji pomiędzy mikrokontrolerami i urządzeniami peryferyjnymi. Niektóre z nich są szczególnie kłopotliwe w obsłudze dla układów FPGA. Jednym z takich standardów jest jednoprzewodowa magistrala 1-WIRE zaprojektowana przez firmę Dallas. Istnieje cała gama urządzeń używających tej magistrali. Wybraliśmy ją aby pokazać jak z taką magistralą współpracuje procesor PicoBlaze, zbudowany we wnętrzu układu FPGA. W charakterze przykładowego urządzenia wybraliśmy termometr DS1820 z interfejsem 1-WIRE. Na rys.8-25 przedstawiono sposób podłączenia układu DS1820 do układu FPGA. Opornik podciągający przedstawiony na rysunku można zastąpić rezystorem PULLUP we wnętrzu bloku IOB układu Spartan3. Linia DQ układu DS1820 podłączona jest do wyprowadzenia one_wire na rysunku.

3.3V

10k

p23

o n e _ w i re 123

GND

rys.8-25 Sposób podłączenia układu DS1820 do układu FPGA. Linia DQ to jednobitowa, dwukierunkowa magistralą 1-WIRE

26

59606162636465666768697071

Page 27: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

To co jest łatwe dla procesora, a trudne dla bezpośredniej realizacji w układzie FPGA, to skomplikowane zależności czasowe. Omówienie sposobu działania układu DS1820 zaczniemy od końca, od przedstawienia zależności czasowych gotowego, działającego projektu obsługi termometru 1-WIRE.

Aby układ 1-WIRE mógł działać należy wysłać do niego polecenie reset (rys.8-26). Polecenie to inicjuje układ 1-WIRE. Reset to nic innego jak impuls o wartości 0 o czasie trwania 500usek. Na taki impuls układ 1-WIRE opowiada krótkim impulsem jak na rysunku. Impuls ten potwierdza obecność układu 1-WIRE i gotowość układu do dalszego działania.

500us STARTodpowiedź

1-WIRE

1-WIRE START (init)

rys.8-26 Zerowanie (reset) i inicjowanie układu 1-WIRE. Impuls o czasie ok.500usek. powoduje reset. Układ 1-WIRE odpowiada impulsem wskazując obecność i gotowość układu 1-WIRE

Aby kontynuować współpracę z układem 1-WIRE trzeba wysłać do tego układu (zapisać) komendę-polecenie. Polecenie typu CChex oznacza pominięcie adresu układu 1-WIRE. Każdy układ 1-WIRE może mieć swój indywidualny adres, gdy do magistrali podłączyć więcej niż jeden termometr. Zgodnie z tym co przedstawia rys.8-27 przesyłana komenda zaczyna się od najmłodszego bitu (LSB). Wartość 1 to impuls o czasie 60usek, a stan 1 to impuls o czasie 10usek. Czas trwania jednego bitu jest stały i wynosi 120usek.

Jeśli po poleceniu CChex zostanie wydane jeszcze jedno polecenie BEhex to odczytany bajt będzie zawierał temperaturę. Dlatego w programie testowym wydaję się właśnie te dwa poplecenia.

27

Page 28: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

Bit LSB

1-WIRE write CChex

0 0 1 1 0 0 1 1

rys.8-27 Polecenie zapisu do układu 1-WIRE. Komenda CChex na rysunku oznacza skip address dla układu DS1820

Polecenie odczytu przedstawione jest na rys.8-28. Bity odczytywane są kolejno poczynając od bitu najmłodszego (LSB). Aby odczytać bit należy najpierw wygenerować krótki impuls (o wartości 0) o czasie trwania 10usek. Układ 1-WIRE przedłuży czas trwania tego impulsu lub nie. Wartości 0 odpowiada przedłużenie czasu trwania impulsu. Jeśli ten impuls nie zostanie przedłużony to będzie to oznaczało odczytaną wartość 1. Wartość odczytana z rys.8-28 to liczba AAhex. Inaczej mówiąc układ działa zgodnie z powiedzeniem "uderz w stół, a nożyce się odezwą". Te 10usek to uderzenie w stół. Teraz wystarczy posłuchać jak “nożyce” się odezwą. Gdy się odezwą, to odczytana wartość to 0, brak odpowiedzi oznacza wartość 1.

28

Page 29: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

1-WIRE read AAhex

Bit LSB

0 01 1 0 01 1

rys.8-28 Odczyt z układu 1-WIRE. Na rysunku odczytana wartość to AAhex. Dla układu DS1820 jest to temperatura 85oC

Układy jakie konieczne są we wnętrzu układu FPGA do współpracy z magistralą 1-WIRE przedstawiono na rys.8-29 Bufor trójstanowy IOBUF na schemacie (i w programie VHDL) jest niezbędny z tego względu, że magistrala 1-WIRE jest dwukierunkowa. Dane wychodzące (zapis) do układu 1-WIRE sterowane są bitem 0 portu wyjściowego o adresie 04. Bit 1 tego samego portu steruje wejściem T układu trójstanowego. Dane pochodzące z układu 1-WIRE są odczytywane przez port wejściowy o adresie 04 i dostępne na bicie numer 7 tego portu.

29

Page 30: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

rys.8-29 Sposób podłączenia układu DS1820 (termometr) z magistralą jednoprzewodową 1-WIRE do procesora PicoBlaze3. Aby sterować jednoprzewodową, dwukierunkową, magistralą DQ w układzie 1-WIRE potrzebny jest dwukierunkowy, 3-stanowy bufor IOBUF. Dane wychodzące do układu 1-WIRE pochodzą z portu wyjściowego o adresie 04. Bit 0 tego potu dostarcza danych. Bit 1 steruje wejściem trójstanowym. Port wejściowy input ma także adres 04. Odczytane dane z układu 1-WIRE dostępne są na bicie 7 portu wejściowego 04. Schemat zawiera dokładnie ten sam projekt, który przedstawiono w języku VHDL na rys. 8-30

Kod VHDL przedstawiony na rys.8-30 zawiera dokładnie to samo co przestawiono na schemacie na rys. 8-29.

Trójstanowy bufor IOBUF jest gotowym układem znajdującym się w bloku IOB układu Spartan3. Wystarczy go tylko użyć w projekcie.

---------------------------------------------------------- PicoBlaze3 i 1-WIRE---- Projekt używa procesora PicoBlaze3 ze zbioru kcpsm3.vhd. Do -- procesora dołączona jest pamięć ROM z programem ROM_PROG.vhd .-- W projekcie do procesora dołączono port wyjściowy OUT sterujący 3-stnowym-- buforem wejścia-wyjścia. Adres portu to 04. Bit 0 tego portu steruje-- danymi dostarczanymi do układu 1-wire. Bit 1 kontroluje wejście 3-stanowe-- bufora. Port wejściowy IN, o adresie 04, na bicie numer 7 umożliwia odczyt -- danych wysyłanych przez układ 1-wire.------------------------------------------------------------------------------ library IEEE;use IEEE.STD_LOGIC_1164.ALL;Library UNISIM;use UNISIM.vcomponents.all;entity test_1_wire isport ( cntrl_wire : inout std_logic_vector (1 downto 0); one_wire : inout std_logic; reset : in std_logic; clk : in std_logic);

30

123456789

1011121314151617181920212223

Page 31: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

end entity; architecture Behavioral of test_1_wire is ----------------------------------- component kcpsm3 --- moduł procesora Pico Blaze3 port ( address : out std_logic_vector(9 downto 0); instruction : in std_logic_vector(17 downto 0); port_id : out std_logic_vector(7 downto 0); write_strobe : out std_logic; out_port : out std_logic_vector(7 downto 0); read_strobe : out std_logic; in_port : in std_logic_vector(7 downto 0); interrupt : in std_logic; interrupt_ack : out std_logic; reset : in std_logic; clk : in std_logic ); end component; component ROM_PROG ----------- moduł pamięci programu port ( address : in std_logic_vector (9 downto 0); instruction : out std_logic_vector(17 downto 0); clk : in std_logic ); end component; signal address : std_logic_vector(9 downto 0); signal instruction : std_logic_vector(17 downto 0); signal port_id : std_logic_vector(7 downto 0); signal out_port : std_logic_vector(7 downto 0); signal in_port : std_logic_vector(7 downto 0); signal write_strobe : std_logic; signal read_strobe : std_logic; signal interrupt_ack : std_logic; signal interrupt : std_logic; signal o_sig : std_logic;

begin in_port(6 downto 0) <= (others =>'0'); processor: --<<<<<<<<<<<<<<<<< moduł procesora PicoBlaze3 kcpsm3 port map ( address => address, instruction => instruction, port_id => port_id, write_strobe => write_strobe, out_port => out_port, read_strobe => read_strobe, in_port => in_port, interrupt => interrupt, interrupt_ack => interrupt_ack, reset => not reset, clk => clk ); ROM_program: --<<<<<<<<<<<<<<<<< moduł pamięci z programem ROM_PROG port map( address => address, instruction => instruction, clk => clk ); out_ports: --<<<<<<<<<<<< port OUT do sterowania 1-WIRE process(clk) is begin if clk'event and clk='1' then if port_id(2)='1' and write_strobe='1' then -- adres 04

31

242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495

Page 32: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

cntrl_wire<= out_port(1 downto 0); end if; end if; end process; -- IN port odczytu danych z 1-WIRE. Adres portu 04. Dane dostępne na -- bicie o numerze 7. in_port(7) <= o_sig when ( port_id(2)='1' and read_strobe= '1') else '0'; IOBUF_inst : IOBUF --<<<<<<<<<<<<<<<<<<<<<<<<< 3-stanowy bufor I/O generic map ( DRIVE => 12, IBUF_DELAY_VALUE => "0", IFD_DELAY_VALUE => "AUTO", IOSTANDARD => "DEFAULT", SLEW => "SLOW" ) port map ( O => o_sig, IO => one_wire, I => cntrl_wire(0), T => cntrl_wire(1) -- 3-stanowe wejście enable ); end architecture;

rys.8-30 Sterowanie magistralą 1-WIRE. Procesor kcpsm3 PicoBlaze wraz z kodem programu umieszczonym w pamięci ROM sterują termometrem DS1820. Do procesora dołączono dwa porty. Port wejściowy IN posiada adres 04. Najstarszy bit 7 umożliwia odczyt danych z układu 1-WIRE. Port wyjściowy OUT, także o adresie 04, steruje 3-stanowym buforem umożliwiającym dostęp do magistrali 1-WIRE. Bit 0 portu OUT pozwala na dostarczanie danych do układu 1-WIRE. Bit 1 odpowiada za sterowaniem wejściem bufora 3-stanowego

Kod programu w języku asembler dla procesora PicoBlaze zamieszczono na rys.8-31. Ten program zawiera 3 podprogramy umożliwiające sterownie układami typu 1-WIRE:

init_1wire - zerowanie układu 1-WIREwrite_1wire - zapis: wysłanie polecenia do 1-WIREread_1wire - odczyt danych z 1-WIRE

Skomplikowane zależności czasowe konieczne do sterowania układu 1-WIRE ukryto w kodzie podprogramów. W pętli głównej programu wykonuje się następujące polecenia:

• zerowanie układu 1-WIRE• wysłanie polecenia CChex oznaczającego pomijanie adresu układu• wysłanie polecenia BEhex oznaczającego odczyt rejestrów wewnętrznych, w tym

rejestru pomiaru temperatury• odczyt danych; jako pierwszy odczytywany jest młodszy rejestr mierzonej

temperaturyW wyniku działania programu odczytana wartość to stała liczba AAhex. Liczba ta odpowiada temperaturze 85oC.W trakcie gdy działał program przedstawiony na rys.8-33 podłączono oscyloskop do wyjścia one_wire okładu Sparta3 (DQ w układzie DS1820). Oscylogramy przedstawione na rys.8-26. 8-27 i 8-28 powstały właśnie w taki jak opisano sposób.

;---------------------------------------------- 1-WIRE test (test_1_wire.psm);; Program testowy magistrali 1-WIRE. Program może testować różne układy 1-WIRE.; Zestaw komend w programie odnosi się do przykładowo wybranego termometru; DS1820. Przedstawiono trzy procedury:; init_1wire - zerowanie układu 1-WIRE; write_1wire - zapis: wysłanie polecenia do 1-WIRE; read_1wire - odczyt danych z 1-WIRE;

32

96979899

100101102103104105106107108109110111112113114115116117118119120121

123456789

Page 33: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

; Pętla główna programu umożliwia zobaczenie na oscyloskopie zależności; czasowych podczas inicjowania, zapisu i odczytu informacji z 1-WIRE.;-----------------------------------------------------------------------------; pseudoinstrukcje programu pBlazIDE (Mediatronix)OUTp DSOUT 4, "OUTput_one_wire.txt"INp DSIN 4, "INput_one_wire.txt" VHDL "ROM_fORm.vhd", "ROM_PROG.vhd", "ROM_PROG";-----------------------------------------------------------------------------OUT_port EQU 4 ; post sterujący 1-WIREIN_port EQU 4 ; post odczytu 1-WIRE

acc EQU sAdata EQU sBcnt EQU sCcnt_delay_low EQU s0cnt_delay_high EQU s1;-----------------------------------------------------------------------------start: call init_1wire ; 1-WIRE RESET CALL delay_long ; poczekaj LOAD data,$cc ; 1-WIRE WRITE command $CC call write_1wire CALL delay_long ; poczekaj LOAD data,$be ; 1-WIRE WRITE command $BE call write_1wire CALL delay_long ; poczekaj call read_1wire ; 1-WIRE READ command STORE data, 00 ; pierwszy odczytany bajt CALL delay_long ; poczekaj JUMP start;-----------------------------------------------------------------------------; Podprogram opóźnienia czasowego. Czas opóźnienia: cnt_delay * 6.2usek.; Częstotliwość clk=50MHz.;-----------------------------------------------------------------------------delay: SUB cnt_delay_low, 1 SUBC cnt_delay_high, 0 ADD cnt_delay_low, 0 JUMP NZ, delay ADD cnt_delay_high, 0 JUMP NZ, delay RET;-----------------------------------------------------------------------------; Podprogram opóźnienia czasowego o dłuższym czasie trwania;-----------------------------------------------------------------------------delay_long: LOAD cnt_delay_low,$00 LOAD cnt_delay_high,$10 CALL delay RET;-----------------------------------------------------------------------------; Podprogram RESET 1-WIRE. Procedura generuje impuls 500us.;-----------------------------------------------------------------------------init_1wire: LOAD acc,0 ; clr OUT acc, OUT_port LOAD cnt_delay_low,$28 ; $c28 = 500us LOAD cnt_delay_high,$0C CALL delay LOAD acc,3 OUT acc, OUT_port LOAD cnt_delay_low,$94 ; $194 = 65usek LOAD cnt_delay_high, 1

33

101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

Page 34: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

CALL delay LOAD cnt_delay_low,$D5 ; $5d5 = 240us LOAD cnt_delay_high, $05 CALL delay RET;-----------------------------------------------------------------------------; Procedura zapisu do 1-WIRE. Wartość 1 to 10usek, wartość 0 to 60usek.; Czas przerwy wynosi 60us.;-----------------------------------------------------------------------------write_1wire: LOAD cnt,8write_1wire_01: LOAD acc,0 ; clr OUT acc, OUT_port LOAD cnt_delay_low,$3E ; $3E = 10us LOAD cnt_delay_high, 0 CALL delay TEST data,01 JUMP Z, write_1wire_02 LOAD acc,1 ; set OUT acc, OUT_port JUMP write_1wire_03write_1wire_02: LOAD acc,0 ; clr OUT acc, OUT_portwrite_1wire_03: SR0 data LOAD cnt_delay_low,$37 ; $137 = 50us LOAD cnt_delay_high, 1 CALL delay LOAD acc,1 ; set OUT acc, OUT_port LOAD cnt_delay_low,$37 ; $137 = 50us LOAD cnt_delay_high, 1 CALL delay SUB cnt,1 JUMP NZ, write_1wire_01 RET;-----------------------------------------------------------------------------; Procedura odczytu z 1-WIRE.; Rejestr data zawiera oczytane dane.;-----------------------------------------------------------------------------read_1wire: LOAD cnt,8 LOAD data,0read_1wire_01: LOAD acc,0 ; clr OUT acc, OUT_port ; krótki impuls 10us LOAD cnt_delay_low,$57 ; $57 = 14us LOAD cnt_delay_high, 0 CALL delay LOAD acc,2 ; INPUT: nasłuchiwanie OUT acc, OUT_port ; sprawdzenie odpowiedzi LOAD cnt_delay_low,$1f ; $1f = 5us LOAD cnt_delay_high, 0 CALL delay ; poczekaj 5us. SR0 data IN acc,IN_port AND acc, $80 OR data,acc ; zbieranie wyników

34

828384858687888990919293949596979899

100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153

Page 35: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

LOAD cnt_delay_low,$6E ; $26e = 100us LOAD cnt_delay_high, 2 CALL delay ; przerwa SUB cnt,1 JUMP NZ, read_1wire_01 RET

rys.8-31 Program testujący działanie magistrali 1-WRIRE. W pętli głównej wywołuje się procedurę init_1wire. Dalej wysyłane są polecenia write_1wire z kodami CChex i BEhex. Polecenia te przygotowują układ 1-WIRE do odczytu stałej wartości z rejestru konwersji temperatury. Prawidłowo odczytana wartość z układu DS1820 to AAhex. Warość ta odpowiada liczbie 85oC

W tym miejscu konieczne jest dodatkowe wyjaśnienie. Przedstawiony do tej pory program jest mała atrakcyjny. W wyniku jego wykonania odczytywana jest stała temperatura 85oC. Uzyskany wynik jest mało atrakcyjny. Aby dokonać pomiaru temperatury należy użyć innego zestawu komend sterujących dla układu DS1820. Aby dokonać pomiaru temperatury należy zrealizować następujący scenariusz:

• reset 1-WIRE: inicjowanie układu

• wysłanie kodu CChex: pomiń adres układu 1-WIRE

• wyślij kod 44hex: start pomiaru temperatury

• poczekaj ok. 0.2sek.

• reset 1-WIRE: inicjowanie układu jeszcze raz

• wysłanie kodu CChex: pomiń adres układu 1-WIRE

• wyślij kod BEhex: odczyt rejestrów temperatury

• odczytaj młodszy bajt pomiaru temperatury

• odczytaj kolejny starszy bajt pomiaru temperatury

Taki właśnie scenariusz pomiaru temperatury zostanie użyty w kolejnym rozdziale, w którym przedstawimy pełny projekt urządzenia mierzącego temperaturę i wyświetlającego wyniki na wyświetlaczu LCD.

8.6 Termometr elektronicznyOpisane w poprzednich rozdziałach projekty i programy połączymy w jeden duży, działający projekt elektronicznego termometru. Zadaniem urządzenia jest odczyt temperatury z układu DS1820 poprzez magistralę 1-WIRE. Odczytane dane mają być wyświetlane na wyświetlaczu znakowym LCD.

Na rys.8-32 przedstawiono moduł VHDL sprzętu niezbędnego do realizacji urządzenia. Fragmenty tego modułu zostały opisane w poprzednich rozdziałach.

---------------------------------------------------- PicoBlaze3, LCD i 1-WIRE---- Projekt termometru mierzącego temperaturę przy pomocy układu DS1820 z -- magistralą 1-WIRE. Temperatura wyświetlana jest na wyświetlaczu LCD.-- Dokładność pomiaru temperatury 0.5 deg. Zakres mierzonych temperatur-- -55 do +125 deg Celcjusza.-- Projekt zrealizowano z użyciem procesora PicoBlaze3. Kod programu -- sterującego urządzeniem znajduje się w pliku ROM_PROG.vhd.------------------------------------------------------------------------------library IEEE;

35

154155156157158159160161

123456789

10

Page 36: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

use IEEE.STD_LOGIC_1164.ALL;Library UNISIM;use UNISIM.vcomponents.all;entity temperature is port (

one_wire : inout std_logic; D_LCD : out std_logic_vector(7 downto 0); E_LCD : out std_logic; D_notC_LCD : out std_logic; reset : in std_logic; clk : in std_logic

);end temperature;architecture Behavioral of temperature is ------------------------------------ component kcpsm3 ----------------------------- moduł procesora Pico Blaze3 port ( address : out std_logic_vector(9 downto 0); instruction : in std_logic_vector(17 downto 0); port_id : out std_logic_vector(7 downto 0); write_strobe : out std_logic; out_port : out std_logic_vector(7 downto 0); read_strobe : out std_logic; in_port : in std_logic_vector(7 downto 0); interrupt : in std_logic; interrupt_ack : out std_logic; reset : in std_logic; clk : in std_logic ); end component; component ROM_PROG -------------------------------- moduł pamięci programu port ( address : in std_logic_vector (9 downto 0); instruction : out std_logic_vector(17 downto 0); clk : in std_logic ); end component;------------------------------------------------------------------------------signal address : std_logic_vector(9 downto 0);signal instruction : std_logic_vector(17 downto 0);signal port_id : std_logic_vector(7 downto 0);signal out_port : std_logic_vector(7 downto 0);signal in_port : std_logic_vector(7 downto 0);signal write_strobe : std_logic;signal read_strobe : std_logic;signal o_sig : std_logic;signal cntrl_wire : std_logic_vector(1 downto 0);begin ------------------------------------------------------------------------ -- Port IN odczytu danych z 1-WIRE. Adres portu 04. Dane dostępne na -- bicie o numerze 7. ------------------------<<<<<<<<<< port wejściowy IN in_port(7) <= o_sig when ( port_id(2)='1' and read_strobe= '1') else '0'; in_port(6 downto 0) <= (others =>'0');

processor: kcpsm3 ----------------------------<<<<<<<<<< procesor PicoBlaze3 port map( address => address, instruction => instruction, port_id => port_id, write_strobe => write_strobe, out_port => out_port, read_strobe => read_strobe, in_port => in_port, interrupt => '0',

36

111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182

Page 37: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

interrupt_ack => open, reset => not reset, clk => clk ); program: ROM_prog ----------------------------<<<<<<<<<< pamięć programu ROM port map( address => address, instruction => instruction, clk => clk ); OUT_ports: process(clk) is -------------------<<<<<<<<<< porty OUT procesora begin if clk'event and clk='1' then if port_id(2)='1' and write_strobe='1' then -- adres 04 E_LCD <= out_port(7); -- bit 7 steruje LCD_Enable cntrl_wire<= out_port(1 downto 0); -- bity 0,1 dla 1-WIRE end if; if port_id(1)='1' and write_strobe='1' then -- adres 02 i 03 D_LCD <= out_port; -- linie danych LCD D_notC_LCD <= port_id(0); -- wybór: LCD_data/LCD_control end if; end if; end process ; IOBUF_inst : IOBUF --<<<<<<<<<<<<<<<<<<<<<<<<< 3-stanowy bufor I/O generic map ( DRIVE => 12, IBUF_DELAY_VALUE => "0", IFD_DELAY_VALUE => "AUTO", IOSTANDARD => "DEFAULT", SLEW => "SLOW" ) port map ( O => o_sig, IO => one_wire, I => cntrl_wire(0), T => cntrl_wire(1) -- 3-stanowe wejście enable ); end architecture;

rys.8-32 Moduł VHDL termometru elektronicznego. Procesor PicoBlaze3 wraz z modułem pamięci ROM_PROG.vhd zawierającej kod programu sterują portem wyjściowym o adresie 04. Port ten steruje buforem 3-stanowym do współpracy z magistralą 1-WIRE. Najstarszy bit 7 tego portu steruje ponadto linią enable wyświetlacza LCD. Port wejściowy, także o adresie 04, odbiera dane z magistrali 1-WIRE. Porty o adresach 01 i 02 sterują magistralą danych wyświetlacza LCD

Kod programu w języku asembler dla procesora PicoBlaze3 dokonującego pomiaru temperatury i wyświetlającego wyniki na wyświetlaczu LCD przedstawiono na rys.8-33. To co jest nowego w tym programie w stosunku do tego co przedstawiono w poprzednich rozdziałach to procedura BIN_to_string. Procedura ta zamienia temperaturę z postaci 8-bitowej liczby ze znakiem w kodzie uzupełnienie do 2, na ciąg znaków ASCII. Procedura dokonuje konwersji liczby binarnej na liczbę dziesiętną. Dodatkowo do liczby dziesiętnej dopisuję się część ułamkową. Dokładność pomiary temperatury przez układ DS1820 wynosi 0.5oC. Dokładność ta może być zwiększona przez podanie poleceń sterujących (patrz dokumentacja układu DS1820). Mierzony zakres temperatur to -55 do 125oC. Temperatury powyżej 100oC wymagają zmian w zasilaniu układu DS1820.

37

8384858687888990919293949596979899

100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Page 38: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

;------------------------ wyświetlanie temperatury na LCD (temperature.psm);; Program w języku asembler dla procesora PicoBlaze3. Program komunikuje się ; z układem DS1820 i mierzy temperaturę w zakresie -55 do +125 stopni C z; dokładnością 0.5 stopnia. Program wyświetla wyniki na wyświetlaczy LCD.;-----------------------------------------------------------------------------; pseudoinstrukcje programu pBlazIDE (Mediatronix)LCD_cntr_p DSOUT 2, "output_LCD_control.txt"LCD_data_p DSOUT 3, "output_LCD_data.txt"OUTp DSOUT 4, "output_one_wire.txt"INp DSIN 4, "input_one_wire.txt" VHDL "ROM_form.vhd", "ROM_PROG.vhd", "ROM_PROG";-----------------------------------------------------------------------------OUT_port EQU 4 ; port sterujący 1-WIRE i LCD enableIN_port EQU 4 ; port odczytu 1-WIRELCD_data_port EQU 3 ; port danych LCD LCD_control_port EQU 2 ; port sterujący LCD acc EQU sAdata EQU sBcnt EQU sCcnt_delay_low EQU s0cnt_delay_high EQU s1;-----------------------------------------------------------------------------start: CALL delay_long ; poczekaj ok. 1sek LOAD acc, $01 ; LCD reset OUT acc, LCD_control_port CALL delay_LCD LOAD acc, $0C ; LCD on 01 OUT acc, LCD_control_port CALL delay_LCD LOAD acc, 'T' ; litera T OUT acc, LCD_data_port CALL delay_LCD LOAD acc, 'e' OUT acc, LCD_data_port CALL delay_LCD LOAD acc, 'm' OUT acc, LCD_data_port CALL delay_LCD LOAD acc, 'P' OUT acc, LCD_data_port CALL delay_LCD LOAD acc, ':' OUT acc, LCD_data_port CALL delay_LCD

loop: CALL init_1wire ; reset 1-WIRE LOAD data,$CC ; polecenie: pomiń adres CALL write_1wire LOAD data,$44 ; polecenie: zmierz temperaturę CALL write_1wire LOAD cnt_delay_low,$00 LOAD cnt_delay_high,$20 CALL delay ; czekaj ok. 0.1 sek. CALL init_1wire ; reset 1-WIRE jeszcze raz LOAD data,$CC ; polecenie: pomiń adres CALL write_1wire LOAD data,$BE ; polecenie: odczytaj temperaturę CALL write_1wire

38

123456789

10111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

Page 39: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

CALL read_1wire ; odczyt młodszego bajtu temp. STORE data, 00 ; zachowaj młodszy bajt temp. STORE data, 01 ; zachowaj młodszy bajt temp. CALL read_1wire ; odczyt starszego bajtu temp. SR0 data FETCH data,00 SR0 data ; przesuwanie w prawo STORE data, 00 ; tu jest 8-bitów temperatury CALL BIN_to_string ; zamiana temperatury na ASCII LOAD acc, $87 ; wyświetl na środku LCD OUT acc, LCD_control_port CALL delay_LCD LOAD cnt,9disp_next: ADD cnt,1 ; adres w pamięci to 10 FETCH data, (cnt) OUT data, LCD_data_port CALL delay_LCD ; wyświetlanie temperatury COMP cnt , 15 JUMP NZ, disp_next CALL delay_long ; poczekaj ok. 1sek JUMP loop;-----------------------------------------------------------------------------; Podprogram opóźnienia czasowego. Czas opóźnienia: cnt_delay * 6.2usek.; Częstotliwość clk=50MHz.;-----------------------------------------------------------------------------delay: SUB cnt_delay_low, 1 SUBC cnt_delay_high, 0 ADD cnt_delay_low, 0 JUMP NZ, delay ADD cnt_delay_high, 0 JUMP NZ, delay RET;-----------------------------------------------------------------------------; Opóźnienie czasowe i sterowanie linią enable wyświetlacza LCD;-----------------------------------------------------------------------------delay_LCD: LOAD acc,$00 ; Enabl=0 OUT acc, OUT_port LOAD acc,$82 ; Enabl=1 OUT acc, OUT_port LOAD acc,acc ; NOP LOAD acc,acc ; ... LOAD acc,acc LOAD acc,acc LOAD acc,$00 ; enable = 0 OUT acc, OUT_port LOAD cnt_delay_low,$00 ; poczekaj (wait) LOAD cnt_delay_high,$40 CALL delay RET

;-----------------------------------------------------------------------------; Podprogram opóźnienia czasowego o dłuższym czasie trwania;-----------------------------------------------------------------------------delay_long: LOAD acc,$FF delay_long_01: LOAD cnt_delay_low,$FF ; LOAD cnt_delay_high,$FF CALL delay SUB acc,1 JUMP nz,delay_long_01 RET;-----------------------------------------------------------------------------

39

7172737475767778798081828384858687888990919293949596979899

100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142

Page 40: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

; Podprogram RESET 1-WIRE. Procedura generuje impuls 500us.;-----------------------------------------------------------------------------init_1wire: LOAD acc,0 ; clr OUT acc, OUT_port LOAD cnt_delay_low,$28 ; $c28 = 500us LOAD cnt_delay_high,$0C CALL delay LOAD acc,3 OUT acc, OUT_port LOAD cnt_delay_low,$94 ; $194 = 65usek LOAD cnt_delay_high, 1 CALL delay LOAD cnt_delay_low,$D5 ; $5d5 = 240us LOAD cnt_delay_high, $05 CALL delay RET;-----------------------------------------------------------------------------; Procedura zapisu do 1-WIRE. Wartość 1 to 10usek, wartość 0 to 60usek.; Czas przerwy wynosi 60us.;-----------------------------------------------------------------------------write_1wire: LOAD cnt,8write_1wire_01: LOAD acc,0 ; clr OUT acc, OUT_port LOAD cnt_delay_low,$3E ; $3E = 10us LOAD cnt_delay_high, 0 CALL delay TEST data,01 JUMP Z, write_1wire_02 LOAD acc,1 ; set OUT acc, OUT_port JUMP write_1wire_03write_1wire_02: LOAD acc,0 ; clr OUT acc, OUT_portwrite_1wire_03: SR0 data LOAD cnt_delay_low,$37 ; $137 = 50us LOAD cnt_delay_high, 1 CALL delay LOAD acc,1 ; set OUT acc, OUT_port LOAD cnt_delay_low,$37 ; $137 = 50us LOAD cnt_delay_high, 1 CALL delay SUB cnt,1 JUMP NZ, write_1wire_01 RET;-----------------------------------------------------------------------------; Procedura odczytu z 1-WIRE.; Rejestr data zawiera oczytane dane.;-----------------------------------------------------------------------------read_1wire: LOAD cnt,8 LOAD data,0read_1wire_01: LOAD acc,0 ; clr OUT acc, OUT_port ; krótki impuls 10us LOAD cnt_delay_low,$57 ; $57 = 14us LOAD cnt_delay_high, 0 CALL delay

40

143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214

Page 41: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

LOAD acc,2 ; INPUT: nasłuchiwanie OUT acc, OUT_port ; sprawdzenie odpowiedzi LOAD cnt_delay_low,$1f ; $1f = 5us LOAD cnt_delay_high, 0 CALL delay ; poczekaj 5us. SR0 data IN acc,IN_port AND acc, $80 OR data,acc ; zbieranie wyników LOAD cnt_delay_low,$6E ; $26e = 100us LOAD cnt_delay_high, 2 CALL delay ; przerwa SUB cnt,1 JUMP NZ, read_1wire_01 RET

;-----------------------------------------------------------------------------; Zamiana 8-bitowej liczby w kodzie uzupełnienie do 2 na ciąg znaków ASCII; reprezentujących liczbę w systemie dziesiętnym. Ciąg znaków zostanie ; umieszczony w pamięci podręcznej do adresu 10.;-----------------------------------------------------------------------------BIN_to_string: TEST data, $80 ; sprawdzenie znaku liczby JUMP NZ, BIN_to_string_01 LOAD acc, '+' ; liczba dodatnia STORE acc, 10 ; zapisz znak JUMP BIN_to_string_02BIN_to_string_01: LOAD acc, '-' ; liczba ujemna STORE acc, 10 ; zapisz znak XOR data, $ff ADD data,1 ; uzupełnij liczbę do 2BIN_to_string_02: STORE data, 00 ; składuj moduł liczby COMP data, 100 ; czy są setki liczby JUMP NC, BIN_to_string_03 LOAD acc, ' ' STORE acc, 11 JUMP BIN_to_string_04BIN_to_string_03: LOAD acc, '1' ; moduł większy od 100 SUB data,100 STORE acc, 11 ; zapisz setkiBIN_to_string_04: LOAD cnt,0 ; dzielenie przez 10BIN_to_string_rep: COMP data,10 JUMP c, BIN_to_string_end ADD cnt,1 SUB data,10 JUMP BIN_to_string_repBIN_to_string_end: ADD cnt,$30 ; składowanie dziesiątek STORE cnt, 12 ADD data,$30 STORE data,13 ; składowanie jednostek LOAD data,'.' STORE data,14 ; zapis kropki dziesiętnej FETCH data, 01 TEST data,01 JUMP Z,BIN_to_string_05 ; dokładność do 0.5 stopnia C LOAD data,'5' STORE data,15 RETBIN_to_string_05: LOAD data,'0' ; ogranicznik 0 jak w C STORE data,15 RET

41

215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286

Page 42: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

rys.8-33 Program w języku asembler procesora PicoBlaze3. Program steruje układem termometru elektronicznego typu DS1820. Odczytana temperatura jest wyświetlana na wyświetlaczu LCD. Dokładność pomiaru temperatury wynosi 0.5oC w zakresie -55 do +125oC. Do programu dopisano nową procedurę, nie przedstawianą do tej pory, to jest BIN_to_string. Procedura ta zamienia 8-bitową temperaturę na ciąg znaków ASCII. Ciąg ten zawiera temperaturę zapisaną jako liczba dziesiętna ze znakiem

Rezultaty działania termometru przedstawiono na zdjęciu poniżej.

rys.8-34 Rezultaty działania projektu. Wyświetlacz LCD pokazuję temperaturę z dokładnością do 0.5oC

Podsumowując opisane w tym rozdziale przykładu należy stwierdzić, że w wielu przypadkach zastosowanie procesora we wnętrzu układu FPGA bardzo upraszcza projekt. Trzeba mieć ponadto świadomość, że opisany procesor PicoBlaze3 zajmuję bardzo mało zasobów układu FPGA. Jest to tylko 96 układów CLB. Przykładowo w układzie XC3S200 jest to tylko 5% wszystkich układów CLB. Nie ma żadnych przeszkód aby do realizacji projektu użyć kilku procesorów.

W Internecie można znaleźć bardzo wiele gotowych, "dorosłych" procesorów. Użycie procesora z prawdziwego zdarzenia daje szansę jego programowanie w języku C.

Największe procesory jakie są zalecane przez firmę Xilinx dla układów FPGA to procesory typu MicroBlaze.

W układach Virtex można znaleźć procesory PowerPC jako procesory wbudowane. Na tak dużych procesorach, jeśli do układu FPGA podłączona jest odpowiednio duża pamięć zewnętrzna, można z powodzeniem uruchomić system operacyjny MicroLinux, co rozszerza znacznie możliwości zastosowań układów FPGA. Użycie tych największych procesorów i systemu Linux to już jednak całkiem inna książka i inna historia. Jest to jednak historia dla zamożnych a nie dla tych którzy mając kilkadziesiąt złotych pragną poznać działanie układów FPGA.

42

287

Page 43: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

Dodatek A

Lista instrukcji procesora PicoBlaze3

Poniżej przedstawiono listę rozkazów procesora PicoBlaze3. Inna nazwa tego procesora to kcpsm3. Umożliwia ona lepsze zrozumienie podstaw działania procesora i jest przydatna podczas pisania programów w języku asembler. Przy jej studiowaniu należy jednocześnie oglądać rys 8-8. Rysunek ten ułatwia zrozumienie symbolicznych zapisów działania instrukcji.

Aby prześledzić działanie mikroprocesora należy mieć na uwadze algorytm działania jednostki centralnej CU procesora. Przypominamy ten algorytm w postaci uproszczonej.

Algorytm działania procesora PicoBlaze3:1. Pobranie instrukcji IR← (PC)ROM

2. Zwiększenie PC o 1 PC ←PC+ 13. WYKONANIE INSTRUKCJI4. Przejście do punktu 1 (goto 1)

To co umieszczono w tabelach poniżej to WYKONANIE INSTRUKCJI. Należy pamiętać o tym, że licznik rozkazów zwiększa się o 1 po pobraniu instrukcji. Jest to istotne zwłaszcza przy analizie rozkazów skoków warunkowych i obsłudze podprogramów.

Oto kilka przykładów jak interpretować zapisy WYKONANIE INSTRUKCJI.

Przykład 1

SUBC sX, kk sX sX – kk - CARRY ZERO ↕ CARRY ↕Oznacza odjęcie ad rejestry sX stałej kk razem z pożyczką (CARRY: borrow). PrzykładowoSUBC sF, $15 oznacza operację sF ←sF – 0x15 – CYRejestr sF jest rejestrem procesora o numerze 15.Znak ↕ oznacza , że flaga jest zmieniana (przestawiana) i przyjmuje wartość 0 lub 1 po wykonaniu operacji.Zapis $15 oznacza liczbę heksadecymalną . Zapis w postaci 15 oznacza liczbę dziesiętną.

Przykład 2

FETCH sX, sY sX [ sY ] RAM

Oznacza przesłanie do rejestru sX pośrednio adresowanej wartości z przestrzeni RAM. Do adresowania pośredniego służy rejestr sY .

sX [ sY ] RAM

Przestrzeń RAM zawiera tylko 64 bajty pamięci.Dla przykładu FETCH sA, s0 oznacza pobranie do rejestru sA zawartości pamięci wskazanej przez rejestr s0.

Przykład 3

CALL NC, aaa if CARRY=0: TOS PCPC aaa

Kod ten to rozkaz warunkowego wywołania podprogramu. Warunek ten to NC czyli not CARRY. Podczas interpretacji instrukcji należy pamiętać, że przed wykonaniem rozkazu jest

43

Page 44: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

zwiększany licznik PC o 1(na podstawie algorytmu działania procesora). Stąd pełny opis działania tej instrukcji to:

PC← PC + 1if CARRY=0:

TOS PCPC aaa

Jeśli warunek NC nie będzie prawdziwy to jako następny zostanie wykonany rozkaz po poleceniu CALL. Jeśli warunek będzie prawdziwy, to aktualny stan licznika PC zostanie zapisany na stosie (TOS –top of stack), a do licznika PC zostanie wpisany adres aaa wywołania kodu podprogramu. Adres aaa jest 10-cio bitowy. Taką samą długość ma licznik PC.

Przykład 4

OUT sX, sY [ sY ] OUT PORT sX-----------------------------------------------------PORT_ID sY OUT_PORT sX

Zapis danych do portu wyjściowego OUT. Zawartość rejestru sX jest zapisywana do portu OUT PORT wskazanego przez zawartość rejestru sY.

[ sY ] OUT PORT sX .W szczegółach opisany przed chwilą sposób wykonania rozkazu OUT jest realizowany w następujący sposób:

PORT_ID sY OUT_PORT sX .

Stan rejestru sY pojawia się na magistrali adresującej przestrzeni portów PORT_ID. Zawartość rejestru sX pojawi się na magistrali danych portów wyjściowych OUT_PORT. Podczas zapisu do portów zostanie wysterowany impuls WRITE_STOB.

Asembler (Instruction) WYKONANIE INSTRUKCJI ZERO CARRY

ADD sX, kk sX sX + kk ↕ ↕ ADD sX, sY sX sX + sY ↕ ↕ ADDC sX, kk sX sX + kk + CARRY ↕ ↕ ADDC sX, sY sX X + sY + CARRY ↕ ↕ AND sX, kk sX X AND kk ↕ 0 AND sX, sY sX X AND sY ↕ 0 CALL aaa TOS PC

PC aaa CALL C, aaa if CARRY=1:

TOS PCPC aaa

CALL NC, aaa if CARRY=0:

TOS PCPC aaa

CALL NZ, aaa if ZERO=0:

TOS PCPC aaa

44

Page 45: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

CALL Z, aaa if ZERO=1:TOS PCPC aaa

COMP sX, kk if sX=kk: ZERO 1

if sX<kk: CARRY 1 ↕ ↕ COMP sX, sY if sX=sY: ZERO 1

if sX<sY: CARRY 1 ↕ ↕ DINT INTERRUPT_ENABLE 0

EINT INTERRUPT_ENABLE 1 Interrupt Event Preserved ZERO ZERO

Preserved CARRY CARRY INTERRUPT_ENABLE 0TOS PC;PC 3FF

FETCH sX, sY sX [ sY ] RAM FETCH sX, ss sX [ ss ] RAM IN sX, sY sX [ sY ] IN PORT

-----------------------------------------------------PORT_ID sY sX IN_PORT

IN sX, pp sX [ pp ] IN PORT

-----------------------------------------------------PORT_ID pp sX IN_PORT

JUMP aaa PC aaa JUMP C, aaa If CARRY=1:

PC aaa JUMP NC, aaa If CARRY=0:

PC aaa JUMP NZ, aaa If ZERO=0:

PC aaa JUMP Z, aaa If ZERO=1:

PC aaa LOAD sX, kk sX kk LOAD sX, sY sX sY OR sX, kk sX sX OR kk ↕ 0 OR sX, sY sX sX OR sY ↕ 0

45

Page 46: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

OUT sX, sY [ sY ] OUT PORT sX--------------------------------------------------PORT_ID sY OUT_PORT sX

OUT sX, pp [ pp ] OUT PORT sX--------------------------------------------------PORT_ID pp OUT_PORT sX

RET PC TOS+1 RET C if CARRY=1:

PC TOS+1 RET NC if CARRY=0:

PC TOS+1 RET NZ if ZERO=0:

PC TOS+1 RET Z if ZERO=1,

PC TOS+1 RETI DISABLE PC TOS

ZERO Preserved ZERO CARRY Preserved CARRYINTERRUPT_ENABLE 0

↕ ↕

RETI ENABLE PC TOS ZERO Preserved ZERO CARRY Preserved CARRYINTERRUPT_ENABLE 1

↕ ↕

RL sX CARRY

7 6 5 4 3 2 1 0

register sX ↕ ↕ RR sX

7 6 5 4 3 2 1 0CARRYregister sX ↕ ↕

SL0 sX '0'

CARRY7 6 5 4 3 2 1 0

register sX

↕ ↕ SL1 sX '1'

CARRY7 6 5 4 3 2 1 0

register sX

0 ↕ SLA sX

CARRY

7 6 5 4 3 2 1 0

register sX ↕ ↕ SLX sX CARRY

7 6 5 4 3 2 1 0register sX ↕ ↕

SR0 sX CARRY7 6 5 4 3 2 1 0

register sX'0' ↕ ↕

SR1 sX CARRYregister sX7 6 5 4 3 2 1 0

'1'

0 ↕

46

Page 47: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

SRA sX 7 6 5 4 3 2 1 0

CARRYregister sX ↕ ↕ SRX sX

7 6 5 4 3 2 1 0CARRYregister sX ↕ ↕

STORE sX, sY [ sY ] RAM sX STORE sX, ss [ ss ] RAM sX SUB sX, kk sX sX – kk ↕ ↕ SUB sX, sY sX sX – sY ↕ ↕ SUBC sX, kk sX sX – kk CARRY ↕ ↕ SUBC sX, sY sX sX – sY - CARRY ↕ ↕ TEST sX, kk if (sX AND kk) = 0:

ZERO 1 CARRY odd_parity_of (sX AND kk)

↕ ↕

TEST sX, sY if (sX AND sY) = 0:ZERO 1

CARRY odd_parity_of (sX AND sY) ↕ ↕

XOR sX, kk sX sX XOR kk ↕ 0 XOR sX, sY sX sX XOR sY ↕ 0

Uwagi:sX, sY jeden z 16-tu rejestrów s0,s1,s2...,s9,sA,sB,sC,sD,sE,sFaaa 10 cio bitowy adres z zakresu $000 to $3FF lub etykieta (label) w programiekk 8-bitowa stała w postaci liczby dziesiętnej (0...255) lub heksadecymalnej

($00...$FF) lub etykieta stałejpp 8 bitowy adres portu w postaci liczby dziesiętnej (0...255) lub heksadecymalnej

($00...$FF) lub etykieta stałejss 6-cio bitowy adres pamięci podręcznej RAM (scratchpad RAM address), w

postaci liczby dziesiętnej (0...63) lub heksadecymalnej ($00...$3F) lub etykieta stałej

[n] RAM zawartość pamięci podręcznej RAM o adresie n [n] IN PORT zawartość portu wejściowego IN o adresie n[n] OUT PORT zawartość portu wyjściowego OUT o adresie nTOS wartość zapisywana na stosie (Top Of Stack)↕ flaga jest zmieniana

W języku asembler procesora PicoBalaze3 w środowisku PBlazIDE firmy Mediatronix stosowane są następujące pseudoinstrukcje. Pseudoinstrukcje nie są bezpośrednio tłumaczone na kod rozkazów. Wspomagają jedynie proces przygotowania programu w języku asembler.

Funkcja Pseudoinstrukcja PBlazIDE Umieścić kod programu od wskazanego adresu ORG $3FF

Symboliczna nazwa rejestru myregname EQU s5

47

Page 48: Programowanie procesora PicoBlaze 3 - Zespół Systemów ... · 8.1 Budowa komputera PicoBlaze3 ... które najczęściej mają ustaloną liczbę portów wejścia-wyjścia. Zwykle

Nazwa stałej w programie myconstant EQU $80

Nazwa zbioru wynikowego VHDL"template.vhd", "target.vhd", "entity_name"

Znacznik flagowe

Procesor PicoBlaze3 nie posiada rejestru statusowego. Posiada jedynie dwa bity CARRY i ZERO. W rozkaz TEST pozwala wyliczyć nieparzystość lub parzystość i wynik ten jest umieszczany w miejsce bitu CARRY.

Bity flagowe (znaczniki) zdefiniowane są następująco:

• Bit CARRY (carry) przeniesienia pomiędzy bitami7 i 8 rejestru wyniku sX, co symbolicznie zapisuje się jako: CARRY= sX 8 | 7

• Bit ZERO (zero) pokazuje czy w rejestrze wyniku wszystkie bity mają wartość logiczną 0 ZERO = ~ (sX7 OR sX6 OR sX5 OR sX4 OR sX3 OR sX2 OR sX1 OR sX0 )

Symbol OR oznacza sumę logiczną, a symbol ~ oznacza negację. W rezultacie ZERO=1 gdy w rejestrze sX wszystkie bity mają wartość logiczną 0.

• Bit nieparzystości (parity odd) pokazuje czy w akumulatorze znajduje się nieparzysta liczba jedynek P= (sX7 XOR sX6 XOR sX5 XOR sX4 XOR sX3 XOR sX2 XOR sX1 XOR sX0 )

Symbol XOR oznacza różnicę symetryczną. W rezultacie P=1 gdy w akumulatorze znajduje się nieparzysta liczba jedynek. Wyliczony w ten sposób bit nieparzystości jest wpisywany do flagi CARRY podczas wykonywana rozkazu TEST.

Znaczniki flagowe i przerwania

Podczas wykonywania przerwania znaczniki flagowe CARRY i ZERO są zapamiętywane w dodatkowych bitach nazwanych Preserved ZERO i Preserved CARRY. Wykonanie rozkazu RETI powoduje odzyskanie stanu bitu CARRY i ZERO jaki był w momencie pojawienia się przerwania.

48