projektovanje interfejsa za povezivanje čipa pia-8255...

63
UNIVERZITET U NIŠU ELEKTRONSKI FAKULTET KATEDRA ZA ELEKTRONIKU Projektovanje interfejsa za povezivanje čipa PIA-8255 na APB magistralu STUDENTI: DUŠAN MILETIĆ 11041 RADE RADOJKOVI Ć 9757 VLADICA GAVRILOV 9319 NENAD SAVIĆ 11375 Niš, Februar 2006.

Upload: ledieu

Post on 22-Apr-2018

224 views

Category:

Documents


2 download

TRANSCRIPT

UNIVERZITET U NIŠU ELEKTRONSKI FAKULTET KATEDRA ZA ELEKTRONIKU

Projektovanje interfejsa za povezivanje čipa PIA-8255 na APB magistralu

STUDENTI: DUŠAN MILETIĆ 11041 RADE RADOJKOVIĆ 9757 VLADICA GAVRILOV 9319 NENAD SAVIĆ 11375

Niš, Februar 2006.

2

SADRŽAJ: 1. UVOD...................................................................................................................................4.

2. AMBA MAGISTRALA........................................................................................................7. 2.1 OPIS AMBA MAGISTRALE……………………………………………………7.

2.2 STRUKTURA TIPIČNOG MIKRORAČUNARA ZASNOVANOG NA AMBA MAGISTRALI…………………………………………………………...7.

3. AMBA APB MAGISTRALA……….………………………………………………..........8. 3.1 Opis APB magistrale………………………………………………..…………....8. 3.1.1 Dijagram stanja………………………………………….,……………..8. 3.1.2 Operacija upisa…………………………………………..……………...9. 3.1.3 Operacija čitanja......................................................................................9. 3.2 APB most.............................................................................................................10. 3.2.1 APB master………………………………………….………………...10. 3.2.2 APB slave……………………………………………...........................11.

4. 8255 ....................................................................................................................................13. 4.1. OPIS KOLA 8255……………………………………………………………..13. 4.2. OPIS RADA KOLA 8255...................................................................................15.

5. ČIP PIA-APB-8255.............................................................................................................17. 5.1 OPIS ČIPA PIA-APB-8255.................................................................................17. 5.2 PREDLOG REALIZACIJE ČIPA PIA-APB-8255.............................................22. 5.2.1 APB-bridge.............................................................................................22. 5.2.1.1 CONTROL_LOGIC...................................................................23. 5.2.1.2 ADDR_COMPARE...................................................................24. 5.2.1.3 TriSTATE_BUFFER.................................................................25. 5.2.1.4 DoubleEdgeSR...........................................................................25. 5.2.1.4.1 OR_2 (ILI kolo)..........................................................27. 5.2.1.4.2 DFF_R (D Flip Flop)..................................................27. 5.2.1.4.3 DFF_F (D Flip Flop)...................................................28. 5.2.1.4.4 XOR_2........................................................................28. 5.2.1.5 Proširenje...................................................................................28. 5.2.1.6 INV_1 (Invertor)........................................................................29. 5.2.1.7 AND_2 ( I_kolo).........................................................................29. 5.2.2 Interfejs APB-bridge...............................................................................29. 5.2.3 čip 8255...................................................................................................31. 5.2.3.1 Dout_mux....................................................................................31. 5.2.3.2 Cntl_log.......................................................................................32. 5.2.3.3 Portaout......................................................................................35. 5.2.3.4 Portain........................................................................................35. 5.2.3.5 Portbout......................................................................................36. 5.2.3.6 Portbin........................................................................................36. 5.2.3.7 Portcout......................................................................................37. 5.2.3.8 Listing koda čipa 8255............................................................... 43. 5.2.4 Listing koda čipa PIA-APB-8255...........................................................46.

3

6. TESTIRANJE RADA čipa PIA-APB-8255.................................................................48.

7. IMPLEMENTACIJA čipa PIA-APB-8255..................................................................50.

8. ZADATAK..................................................................................................................54. 8.1 Zadatak 1........................................................................................................54. 8.2 Zadatak 2........................................................................................................57. 8.3 Zadatak 3........................................................................................................59. 8.4 Zadatak 4........................................................................................................60.

9. LITERATURA............................................................................................................63.

4

1.UVOD Medjusobno povezivanje čipova na štampanoj ploči predstavlja veoma važan aspekt za uspešnu realizaciju visoko performansnih digitalnih sistema time što direktno omogućava da veliki broj komponenata sistema efikasno razmenjuju podatke. Ova mogućnost obezbedjuje da integrisane komponente sistema budu veoma dobro ukompovane u jedan distribuirani sistem. Da bi se uspešno realizovao ovaj cilj danas je razvijen veći broj komunikacionih sprežnih tehnologija, kakve su npr.: Hyper Transport, RapidIO, PCI Express pomoću kojih se ostvaruje efikasna komunikacija na nivou čip-ka-čip.

Sa druge strane napredak na polju VLSI tehnologije uslovio je da se sve veći broj gradivnih blokova sistema integriše u jedinstveni sistem. Ovakva rešenja se nazivaju System–on-Chip (SoC) dizajn. Osnovni problem koji se pri ovome javlja predstavlja efikasno medjusobno povezivanje gradivnih blokova unutar čipa. U cilju uspešnog rešavanja ovog problema koriste se standardizovane interne SoC magistrale. Tipični reprezenti ovakvih magistrala su: AMBA, AVALON, Core Connect, Wishbone, Sillicon Backplane µ Network, CoreFrame, Marble, PI bus, OCP, VCI (Virtual Component Interface).

System–on-Chip (SoC) dizajn se standardno realizuje od većeg broja IP-ova (Intelectual Property) kao gotove komponente koje treba medjusobno povezati u jedinstveni sistem. Pri ovome jedan od glavnih projektantskih izazova predstavlja projektovanje interfejs logike koja predstavlja ljusku za IP i koja omogućava da se IP poveže na odgovarajuću sistemsku magistralu. U ovom semestralnom radu biće:

• razmatrana mogućnost povezivanja programibilnog paralelnog perifernog interfejsa, PIA-APB-8255 (Parallel Interface Adapter Intel 8255 for AMBA APB Bus), realizovanog kao jezgro (IP) na APB magistralu koja je sastavni deo AMBA magistrale,

• kreiran VHDL kod koji se odnosi na opis na behavioral nivou kola PIA-APB-8255, • data implementacija kola PIA-APB-8255 koja se odnosi na Actel FPGA tehnologiju.

Ilustracije radi, jedan tipičan SoC dizajn baziran na AMBA magistrali kod koga je na APB

povezano PIA kolo, prikazan je na Slici 1.1:

5

Slika 1.1: SoC dizajn baziran na AMBA magistrali

Kao što se vidi na slici 1.1 SoC dizajn zasnovan na AMBA magistrali je hijerarhijski

organizovan oko dve magistrale, AHB (ili ASB) magistrale koja se koristi za brzi prenos podataka izmedju procesora i memorije i APB magistrale koja se koristi za spregu perifernih programibilnih čipova kakvi su: 8253 (Timer), 8251 (UART) i 8255 (PIA). Sprega između ASB i APB se ostvaruje preko mosta (bridge).

Analizirajući šemu na slici 1.1 uočavamo da se svaki IP blok spreže na odgovarajuću magistralu preko specifičnog projektovanog interfejsa. U konkretnom slučaju razmatrani su periferni programibilni čipovi iz familije INTEL, koji su pre sega projektovani za realizaciju sistema zasnovanim na INTEL-ovim procesorima, kakvi su: 8088, 8086, 80286, 80386 itd. Sobzirom da SoC dizajn može da bude zasnovan na bilo kom procesoru, ili multiprocesorskom sistemu neophodno je projektovati logiku interfejs tipa koja obezbedjuje povezivanje raznorodnih (heterogenih) IP-ova na jedinstveni sistem.

U konkretnom slučaju rešavan je problem projektovanja interfejsa pomoću koga se ostvaruje sprega između jezgra PIA 8255 i APB magistrale kod AMBA. U tom cilju neophodno je bilo prvo kreirati VHDL kod za odgovarajući interfejs, zatim definisati testne sekvence za proveru ispravnosti rada kola, i na kraju implementirati kolo u FPGA tehnologiji.

Shodno predhodnom, celokupna materija koja je izložena u ovom radu je podeljena je na 8 poglavlja. Poglavlje 1 je uvodno, koje u kratkim crtama ukazuje na problem koji je rešavan, i način kako je rešavan. U poglavlju 2 dat je kratak opis AMBA magistrale. U poglavlju 3 prikazani su detalji koji se odnose na operacije prenosa podataka po APB magistrali. Interna struktura čipa PIA 8255, definicija ulazno - izlaznih signala, i režimi rada opisani su u poglavlju 4. VHDL opis na behavioral nivou čipa PIA-APB-8255 prikazan je u

ASB ili AHB

Interfejs

Interfejs

Timer 8253

Interfejs

UART 8251

Interfejs

PIA 8255

BRIDGE

Memorija 8051

AHB

APB

6

poglavlju 5. Poglavlje 6 tiče se testiranja čipa PIA-APB-8255 sa ciljem da se proveri ispravnost dizajna. U poglavlju 7 prikazan je postupak implementacije čipa PIA-APB-8255 na Xilinx -ovo FPGA kolo 2S50PQ208-6 iz familije Xilinx SPARTAN2. U poglavlju 8 opisana je laboratorijska vežba pomoću koje studenti koristeći alate za projektovanje navedene u ovom radu mogu da provere ispravnost implementiranog čipa.

7

2. AMBA MAGISTRALA

2.1. OPIS AMBA MAGISTRALE

AMBA (Advanced Microcontroller Bus Architecture) je hijerarhijski organizovana sistemska magistrala namenjena za SoC dizajne koju čine sledeće tri magistrale: ♠ Advanced High-performance Bus (AHB); ♠ Advanced System Bus (ASB); ♠ Advanced Peripheral Bus (APB).

AHB je veoma brza magistrala namenjena za spregu procesor–memorija. Procesor može biti master ili slave tipa.

ASB je takođe brza magistrala namenjena za spregu procesor-memorija. ASB je alternativna magistrala, pogodna za korišćenje kod sistema visokih performansi kada oni ne koriste AHB.

APB je magistrala koja se koristi za efikasnu spregu sa perifernim programibilnim čipovima. Sprega između ASB i APB se ostvaruje preko mosta (bridge).

2.2. STRUKTURA TIPIČNOG MIKRORAČUNARA ZASNOVANOG NA AMBA MAGISTRALI

Na slici 2.1 prikazana je struktura jednog tipičnog mikroračunarskog sistema zasnovanog na AMBA magistrali. S obzirom da je sistem tipa SoC dizajn uobičajeno je da se ovako rešenje naziva mikrokontroler. Kao što se vidi sa slike 2.1 mikrokontroler je hijerarhijski organizovan oko dve magistrale. Na višem nivou je AHB ili ASB, a na nižem APB. Zbog zahteva za većom brzinom u prenosu podataka na AHB (ASB) se povezuju CPU, memorijski podsistem, interfejs za memorijsko proširenje, i DMA kontroler. Na APB magistrali povezani su programibilni periferni interfejs čipovi tipa: tajmer, UART, PIA, tastaturni čip i dr.

Slika 2.1: AMBA-bas mikrokontroler

AHB prema APB most ili

ASB prema APB most

APB AHB ili ASB

Visoko – performansni

ARM procesor

Visoko - propusni on-chip

RAM

Glavna DMA magistrala

Visoko – propusni spoljni

memorijski interfejs

M O S T

UART Brojač

Tastatura PIA

8

3. AMBA APB MAGISTRALA

APB (Advanced Peripheral Bus) je deo AMBA hijerarhije magistrala. Ova magistrala se koristi za efikasnu spregu sa perifernim programibilnim interfejs čipovima. Važno je to, da se kod APB sve promene signala dešavaju na rastuću ivicu taktnog signala.

3.1. OPIS APB MAGISTRALE

Opis delovanja APB magistrale objašnjen je u zaglavljima:

♠ dijagram stanja ♠ operacija upisa

♠ operacija čitanja APB komunicira sa ASB ili AHB magistralom i sa programibilnim periferijama,

pomoću ulazno – izlaznih signala i to: PCLK, PRESET, PWRITE, PSEL, PENABLE, kao i ulazima PWDATA i PADDR, i izlazom PRDATA. 3.1.1. Dijagram stanja

Na slici 3.1 prikazan je dijagram stanja. Pomoću njega se predstavlja funkcionisanje

ove magistrale.

Slika 3.1: Dijagram stanja

Kao što se sa slike 3.1 vidi, funkcionisanje ove magistrale može se opisati sa tri stanja:

IDLE, SETUP i ENABLE.

9

IDLE - Pasivno stanje. Signali PSELx i PENABLE su u stanju logičke nule. SETUP - Kada su signali PSELx u stanju logičke jedinice a PENABLE u stanju logičke nule magistrala prelazi u stanje SETUP. Ona ostaje u ovom stanju jedan taktni interval, nakon čega se sa usponskom ivicom taktnog signala prelazi u stanje ENABLE. ENABLE - Prelazi se u ovo stanje kada su signali PSELx i PENABLE u stanju logičke jedinice. Ovo stanje traje jedan taktni interval. Iz ovog stanja se vraćamo u stanje IDLE na kraju operacije, a ako postoji zahtev za prenos ona prelazi u stanje SETUP. 3.1.2. Operacija upisa

Vremenski dijagram koji prikazuje redosled dogadjaja prikazan je na slici 3.2:

Slika 3.2: Operacija upisa

Prvi taktni interval odgovara stanju IDLE, a nakon toga u drugom taktnom intervalu

prelazi se u stanje SETUP. Treći taktni interval odgovara stanju ENABLE. Adrese, linije za podatke i PWRITE postavljaju se u toku drugog, a važeći su u toku

trećeg taktnog signala. Operacija upisa završava se četvrtim taktnim signalom.

3.1.3. Operacija čitanja

Vremenski dijagram koji prikazuje redosled operacije čitanja prikazan je na slici 3.3:

Slika 3.3: Operacija čitanja

10

Prvi taktni interval odgovara stanju IDLE. U drugom taktnom intervalu prelazi se u stanje SETUP. Dok treći taktni interval odgovara stanju ENABLE.

Adrese se postavljaju u toku drugog, i važeće su u toku trećeg taktnog signala. PWRITE koji je aktivan u toku prvog taktnog intervala, u drugom taktnom intervalu se postavlja na neaktivnu vrednost. Linije za podatke se postavljaju tokom ENABLE stanja. Operacija čitanja završava se četvrtim taktnim signalom.

3.2. APB most

APB most predstavlja interfejs izmedju AHB (ili ASB) magistrale i APB magistrale. On je slave za AHB (ili ASB), a master za APB.

3.2.1. APB master

Blok dijagram

Na slici 3.4 prikazan je blok dijagram APB master-a.

Slika 3.4: APB signal interfejs APB mosta

Sa strane AHB (ili ASB) magistrale postoje signali PRESETn i PCLK, kao i PRDATA. A sa strane APB magistrale PADDR, PWDATA, signali PSEL, PENABLE i PWRITE.

Funkcija APB mastera APB master obavlja sledeće funkcije:

♠ generiše adresu i zadržava je validnom tokom operacije upisa ili čitanja; ♠ dekodira adresu i generiše periferijski selekt PSELx. Samo jedan periferijski selekt

signal PSELi, i=1,2…n, može biti aktivan tokom operacije upisa ili čitanja; ♠ prebacuje podatke sa AHB (ASB) magistrale na APB u toku operacije upisa; ♠ prebacuje podatke sa APB na sistemsku magistralu u toku operacije čitanja; ♠ generiše impuls za pamćenje adrese (strob signal), PENABLE, u toku operacije čitanja ili upisa.

11

3.2.2. APB slave

APB slave ima jednostavan, ali ipak fleksibilan interfejs. Tačna implementacija interfejsa zavisi od konkretne aplikacije.

Blok dijagram Na slici 3.5 prikazan je pogled na most sa sistemske magistrale, APB slave.

Slika 3.5: Dijagram APB – slave

Funkcija APB slave-a APB slave interfejs je veoma fleksibilan. Za operaciju upisa podaci se postavljaju u

narednim vremenskim trenucima:

♠ na obe rastuće ivice PCLK kada je PSELx na logičkoj jedinici; ♠ na rastućoj ivici PENABLE kada je PSELx na logičkoj jedinici.

Selekcioni signal PSELx, adresa PADDR i signal upisa PWRITE mogu biti kombinovani da bi se odredilo kom registru treba obnoviti sadržaj pomoću operacije upisa.

Za operaciju čitanja podaci mogu biti prebačeni na magistralu podataka kada je PWRITE na logičkoj nuli, a PSELx i PENABLE na logičkoj jedinici. U tom slučaju se PADDR koristi za odredjivanje registra iz koga treba da se izvrši operacija čitanja.

Talasni oblici signala su dati na slici 3.6.

12

Slika 3.6: Talasni oblici APB slave

13

4. 8255

Intelov čip 8255, pararelni programibilni interfejs PPI (Programmable Peripheral Interface) je CMOS komponenta koja se koristi kod aplikacija koje se odnose na paralelni prenos podataka. Sa strane poseduje 24 ulazno/izlazna pina koji mogu biti programibilni u dve grupe po 12. Izradjen je u CMOS tehnologiji sa jednostrukim +5V napajanjem. Režimi rada se softverski postavljaju.

4.1. OPIS KOLA 8255

Na slici 4.1 je data blok šema 8255 kola:

Slika4.1: Blok šema

BAFER PODATAKA

Trostatički bi-direkcioni 8 – bitni bafer koristi se kao interfejs za povezivanje 8255 na sistemsku magistralu. Podaci se primaju i šalju preko bafera dok se izvršavaju ulazno - izlazne CPU operacije. Kontrolni kod i statusna informacija se takodje šalju kroz bafer.

14

R/W I KONTROLNA LOGIKA Funkcija ovog bloka je da upravlja sa svim unutrašnjim i spoljašnjim prenosima.

Prihvata upravljačke signale sa sistemske magistrale, upravlja radom ulazno/izlaznog bafera i generiše signale za rad celokupnog kola. Izbor PIA se vrši signalom CS (Chip Select).

CS (Chip Select)

Chip Select je ulazni signal kojim se dozvoljava rad kola. Kada kolo nije selektovano, ne obavlja se nikakva operacija. Aktivan je kada je postavljen u stanju logičke nule.

RD (Read) Kada je ovaj signal na logičkoj nuli u toku je operacija čitanja.

WR (Write)

Kada je ovaj signal na logičkoj nuli u toku je operacija upisa.

A1 i A0 To su adresni signali, kojima se u vezi sa ulaznim signalima RD i WR , vrši selekcija

jednog od tri porta (port A, port B ili port C) ili se pak kontrolni kod upisuje u registar za upis načina (MOD-a) rada.

Tako u zavisnosti od stanja signala RD , WR , CS , A1 i A0 čip 8255 obavlja sledeće funkcije koje su date u tabeli. Vidi tabelu 4.1.

A1 A0 CS RD WR Ulazne operacije (READ) 0 0 0 0 1 PORT A → DATA BUS 0 1 0 0 1 PORT B → DATA BUS 1 0 0 0 1 PORT C → DATA BUS

Izlazne operacije (WRITE)

0 0 0 1 0 DATA BUS → PORT A 0 1 0 1 0 DATA BUS → PORT B 1 0 0 1 0 DATA BUS → PORT C 1 1 0 1 0 DATA BUS → CONTROL

Nemoguce funkcije

x x 1 x x neaktivno stanje 1 1 0 0 1 neaktivno stanje x x 0 1 1 neaktivno stanje

Tabela 4.1: Tabela stanja za ulaze R/W i kontrolne logike

15

RESET

Kada je aktivan (stanje logičke jedinice) kolo se postavlja u početno stanje. UPRAVLJANJE PORTOVIMA IZ GRUPE A i GRUPE B R/W kontrolna logika priprema modove rada i upravljačke signale za tri 8-bitna ulazno-

izlazna porta. Upravljanje ulazno - izlaznih portova je podeljeno u dve grupe. U grupu A i grupu B. Svaka od ovih grupa prihvata “komande od R/W kontrolne logike, prima informacije sa unutrašnje magistrale kola i postavlja pravu komandu za vezane portove.

Kontrolnu grupu A čine: Port A i gornja polovina porta C (C7 - C4). Kontrolnu grupu B čine: Port B i donja polovina porta C (C3 – C0). Bitovi porta C ponekad se koriste kao upravljački bitovi. Kada 8255 prihvati bit koji je

usmeren ka njegovom komandnom registru on ispituje bit D7. Ako je D7=1 podatak se tretira kao Set/Reset instrukcija i koristi se za postavljanje ili brisanje porta C specificiran instrukcijom. Bitovi D3 – D1 definišu broj bita čije se stanje menja, a stanje bita D0 ukazuje da li se on postavlja ili briše.

Port A, B i C

8255 sadrži tri 8 – bitna porta ( A,B i C ).

Port A. Jedan 8 – bitni data izlazni leč/bafer i jedan 8 - bitni data ulazni leč. Port B. Jedan 8 – bitni data izlazni leč/bafer i jedan 8 – bitni data ulazni bafer. Port C. Jedan 8 – bitni data izlazni leč/bafer i jedan 8 – bitni data ulazni bafer (bez leča za

ulaz). Ovaj port može biti rasporedjen u dva 4 - bitna porta ispod načina kontrole. Svaki 4 - bitni port sadrži jedan 4 - bitni leč i to može koristiti za kontrolu izlaznih signala i kontrolu stanja ulaznih signala u vezi sa portovima A i B.

4.2. OPIS RADA KOLA 8255

Kompletno funkcionisanje kola je definisano od strane sistemskog softvera. Kod 8255 dostupna su tri načina rada ( MOD-a ) i to:

♠ Mode 0 – Osnovni U/I, ♠ Mode 1 – Strobovani U/I, ♠ Mode 2 – Bi-direkciona magistrala.

Pinovi grupe B se mogu programirati za rad u mode 0 ili mode 1, a pinovi grupe A za

rad u mode 0, mode 1 ili mode 2. Mode 0 – naziva se osnovni ulazno/izlazni način rada koji uzrokuje da 8255 radi kao

baferovani ulazni ili lečovani izlazni uredjaj. Mode 1 – strobovani ulazno/izlazni način rada postavlja portove A i B i odgovarajuće

upravljačke linije višeg i nižeg dela porta C. Ovaj mod se koristi za podršku rada handshake procedura i prekida, iniciranih od strane ulazno/izlaznih uredjaja u slučajevima kada se prenos

16

podataka ostvaruje bez direktne intervencije CPU-a. Razlikuju se dva tipa rada kod mode 1, a to su mode 1 strobovani ulaz, i mode 1 strobovani izlaz.

Mode 2 – način rada ovog moda važi samo za grupu A. Kod bidirekcionog rada

podaci se predaju i primaju preko istih veza. Ovakav način rada koristan je kod sprezanja dva računara.

17

PORT A

PORT B

PORT C

PADDR

PWDATA

PRDATA

PIA-APB-8255

PIA 8255

PWRITE

PSELx PRESET

PCLKPORT A

PORT B

PORT C

Interfejs

APB-bridge

PWDATA

PADDR

PRDATA

DIN[7:0]

RESETCS

RD

WR

PENABLE

DOUT[7:0]

5. čip PIA–APB-8255 5.1. OPIS ČIPA PIA-APB-8255 Ovo kolo predstavlja interfejs izmedju APB magistrale i spoljnjeg sveta. Zbog specifičnog rada APB magistrale ono u sebi sadrži interfejs logiku koja je za ovaj slučaj specifično projektovana, a za spregu sa spoljnim svetom koristi se PIA-8255 koji je kompatibilan po svojoj funkciji sa Intelovim čipom 8255. To znači da je sprega sa spoljnim svetom ostvarena shodno principima rada modu 0, modu 1, i modu 2 PIA-8255. Takvo kolo dato je na slici 5.1: PCLK PENABLE PRESET PSELx PWRITE

Slika5.1: Čip PIA-APB-8255

Slika 5.2: Unutrašnja struktura čipa PIA-APB-8255 Na slici 5.2 je data unutrašnja struktura čipa PIA-APB-8255.

18

Interfejs logika, čipa PIA-APB-8255, nazvana APB-bridge je specifično projektovana i izvedeno kolo je tipa sekvencijalna mreža. Na svom ulazu prihvata signale PCLK, PENABLE, PRESET, PSELx, PWRITE, PADDR i PWDATA sa APB magistrale, kao i izlaz DOUT sa PIA-8255. Na izlazu ova interfejs logika generiše signale RESET, WR , CS i RD ka PIA-8255, a PRDATA i DIN ka APB magistrali. Na slici 5.3 je data struktura interfejsa APB-bridge:

Slika 5.3: Interfejs APB-bridge

Da bi ostvarili kompatibilnost u radu sa PIA-8255 neophodno je bilo obaviti sledeće aktivnosti: 1) Preslikati PIA-8255 na jedinstvenu ulazno – izlaznu adresu koja u konkretnom slučaju iznosi “00009000”H. 2) Da bi obavili zadatak definisan stavkom 1, neophodno je bilo ugraditi blok komparator, U3, čiji je izlaz “enable” definisan na sledeći način: if ADDR="10010000" then enable =”1” else enable =”0”. Na ulaz ADDR se dovode signali PADDR [15:]). 3) Sobzirom da je magistrala sinhrona (odlikuje se time da se svi dogadjaji odvijaju u ritmu taktnog signala) neophodno je bilo zbog kompatibilnosti u radu dovesti na ulaz bloka U4, globalni taktni signal APB magistrale, PCLK. Ovim signalom obezbedjeni su uslovi za sinhrono generisanje signala READ ( RD ), WRITE (WR ) i ChipSelect ( CS ) PIA-8255. 4) Blok kontrolna logika, U4, prihvata signale PENABLE, PRESET, PSELx, PWRITE i PCLK sa APB magistrale. Na ulazu ADDR_en prihvata izlazni signal enable iz bloka U3. Na izlazima generiše signale sel_in i sel_out. Način generisanja signala na izlazu ovog bloka shodno vrednosti ulaza definisan je tabelom 5.1.

19

PCLK PRESET PSELx PENABLE PWRITE ADDR_en Stanje sel_in sel_out

0 X X X X RESET 0 0

1 0 0 0 1 IDLE 0 0

1 1 0 1 1 SETUP 0 0

1 1 1 1 1 ENABLE 1 0

1 1 1 0 1 ENABLE 0 1

1 X X X 0 DISABLE 0 0

Tabela 5.1: Tabela stanja kontrolne logike

5) Blok U1 je baferski stepen. Njegov princip rada se može opisati sledećim iskazom: if enable = '1' then a =>y else y =“Z“. Gde je Z stanje visoke impedanse. Na ulazu a prihvata signal PWDATA[7:0] sa APB magistrale, a izlaz y se prosledjuje na signal DIN. 6) Blok U2 je baferski stepen čiji se rad opisuje na sledeć način: if enable = '1' then a =>y else y =“Z“. Gde je Z stanje visoke impedanse. Ulaz a prihvata DOUT, a izlaz y se prosledjuje na ulaz bloka U5. 7) PRDATA [7:0] se formiraju ulazom DOUT, koji se preko bloka U2 vodi na ulaz bloka U5, bloka koji vrši generisanje još 24 bita veće težine. Ovaj blok vrši beznakovno proširenje 8-bitne ulazne na 32-bitnu izlaznu vrednost na sledeći način: iz <= "000000000000000000000000"&ul. Ulaz ul prihvata izlaz y sa bloka U2, a izlaz iz se prosledjuje na PRDATA. 8) Kada je APB magistrala u stanju enable, blok U4 generiše izlazne signale sel_in i sel_out koji služe i da se da dozvola da se upiše ili pročita informacija. Oni su aktivni u toku jedne periode taktnog impulsa. Što znači da bi na izlazu interfejsa imali validnu informaciju samo za taj period. Medjutim informacija u PIA-8255 može da se upiše ili pročita tek na sledeću rastuću ivicu taktnog impulsa, pri čemu signali RD , WR i CS moraju biti stabilni pre te rastuće ivice taktnog impulsa, konkretno oni su uzeli neku vrednost pre te rastuće ivice a ne u samom trenutku. Jer ako bi se desilo da se u istom trenutku menja i stanje signala i rastuća ivica taktnog signala može se desiti da dodje do greške upisa zbog nemogućnosti da se u tačno istom trenutku promene. Vremenski dijagram PIA-8255 se može videti sa slike 5.4.

20

Slika 5.4: Vremenski dijagram čipa 8255

9) Da bi ispunili potrebu definisanu stavkom 8, neophodno je bilo ugraditi blokove U6 i U9 (DoubleEdgeSR) koji sa ulazima EdgeRESET, EdgeSET i RESET generišu izlaz SRout. Ovi blokovi se direktno setuju opadajućom ivicom EdgeRESET, a direktno se resetuju rastućom ivicom EdgeSET. Blokovi U6 i U9 su strukturno opisani. EdgeRESET je taktni ulaz i na njega se dovodi globalni taktni signal APB magistrale, PCLK. Na slici 5.5 je dat vremenski dijagram ulazno-izlaznih signala ovih blokova.

reset edge set edge

Slika5.5: Vremenski dijagram Sa slike 5.5 vidimo da se izlazni signal Srout postavlja u stanje logičke nule rastućom ivicom signala EdgeSET, a u stanje logičke jedinice se postavlja opadajućom ivicom signala EdgeRESET. Vidi se da je izlazni signal Srout nakon rastuće ivice signala RESET postavljen u stanju logičke jedinice. Pojavom rastuće ivice signala EdgeSET, Srout prelazi na logičku nulu i ostaje sve do pojave opadajuće ivice EdgeRESET. Neophodno je koristiti dva ovakva bloka. Jedan će biti za upis a drugi za čitanje informacija. Jedan od njih, U6, će na ulazu EdgeSET prihvatiti izlaz sel_in a blok U9 će na ulazu EdgeSET prihvatiti izlaz sel_out bloka U4. Izlaz SRout bloka U6 služi da se da dozvola za upisivanje informacija jer se vodi na ulaz bloka za invertovanje U11, čiji se izlaz y vezuje na ulaz enable bloka U1, a i vezuje se na izlaz WR . Izlaz SRout drugog bloka služi da se da dozvola za iščitavanje informacija jer se vodi na ulaz bloka za invertovanje U12, čiji se izlaz y vezuje na ulaz enable bloka U2, a i vezuje se na izlaz RD . 10) Blok U10 je AND kolo koje generiše aktivan (logička jedinica) izlaz output kada su oba ulaza I0 i I1 aktivna (logička jedinica). Na jedan ulaz se dovodi izlaz bloka U6 a na drugi ulaz izlaz bloka U9. Izlaz output se prosledjuje na CS .

21

11) Potreba za korišćenjem blokova DoubleEdgeSR je ta da se njime kontrolišu signali sel_in i sel_out, jer kad dodje sledeća rastuća ivica taktnog signala signali sel_in i sel_out bi se postavili na nulu, i ulaz DIN PIA-8255 bi bio u stanju visoke impedanse Z. Zato sa blokom U6 produžujemo signal sel_in (isto važi i za signal sel_out sa blokom U9), do sledeće rastuće ivice taktnog signala. Što znači, na sledećoj rastućoj ivici taktnog signala već postoje sigurna stanja RD , WR i CS , i neće se desiti upisivanje niti čitanje pogrešne informacije. Jer prosto kad se javi signal sel_in ili sel_out ne može u istom trenutku i da se signal prosledi na bafere preko invrtora U11 i U12 i da se upiše na tu istu rastuću ivicu u PIA-8255. Sa slike 5.6 se vidi da se od signala sel_in pravi signal enable koji je duži od njega za jednu perioda kloka, a od njega se prave signali RD , WR i CS tako da na rastućoj ivici (zelena linija na slici) dobijamo stabilno CS =0, WR =0 i RD =1 i izvršiće se upis podatka DIN=89 koji je takodje stabilan pre nailaska ove rastuće ivice.

Slika 5.6: Vremenski dijagram 12) Da bi obezbedili ulazni signal RESET PIA-8255 koji je aktivan na logičkoj jedinici i kome se dovodi izlazni signal RESET sa interfejsa APB-bridge, neophodno je bilo ugraditi blok za invertovanje, U8. Na ulaz x ovog bloka se dovodi signal PRESET sa APB magistrale koji na izlazu generiše signal y koji se prosledjuje na izlaz RESET. 13) PADDR [2:0] se direktno vezuju za PIA-8255 na njegov ulaz A.

22

DOUT(7:0) DIN(7:0)

PADDR(31:0) PRDATA(31:0)

PCLK RESET

PENABLE nCS

PRESET nRD

PSELx nWR

PWDATA(31:0)

PWRITE

U1

APB_bridge

A(1:0) DOUT(7:0)

CLK PAEN

DIN(7:0) PAOUT(7:0)

PAIN(7:0) PBEN

PBIN(7:0) PBOUT(7:0)

PCIN(7:0) PCEN(7:0)

RESET PCOUT(7:0)

nCS

nRD

nWR

U2

a8255

PADDR(31:0)

PWDATA(31:0)

PRDATA(31:0)

PCLKPENABLEPRESET

PSELx

PWRITE

PADDR(1:0)

PAIN(7:0)PBIN(7:0)PCIN(7:0)

PCOUT(7:0)

PBOUT(7:0)

PAOUT(7:0)

5.2. PREDLOG REALIZACIJE ČIPA PIA-APB-8255 Predlog dizajna čipa PIA-APB-8255 je opisan u programskom jeziku VHDL koji je danas jedan od standardnih softverskih alata za projektovanje hardvera. Za sam razvoj i testiranje koda korišćen je programski paket ACTIV-HDL . U strukturi na najvišem nivou razlikujemo 2 entiteta, kao na slici 5.7:

♠ entitet “APB_bridge“ ♠ entitet “ čip 8255 “

Slika 5.7: Blok šema čipa PIA-APB-8255 5.2.1 APB_bridge Predstavlja interfejs logiku čipa PIA-APB-8255, koja je za ovaj slučaj specifično projektovana i izvedeno kolo je tipa sekvencijalna mreža. Na ulazu prihvata signale PCLK, PENABLE, PRESET, PSELx, PWRITE sa magistrale kao i PADDR, PWDATA i DOUT. Na izlazu ova interfejs logika generiše signale RESET, nWR, nCS i nRD, kao i PRDATA i DIN. Na slici 5.8 data je blok šema interfejsa, APB-bridge, čipa PIA-APB-8255. Ova interfejs logika se sastoji od sledećih entiteta:

♠ entitet “Control_ Logic“ ♠ entitet “ DoubleEdgeSR “, (blokovi U6 i U9 na slici) ♠ entitet “ TriSTATE_BUFFER “, (blokovi U1 i U2) ♠ entitet “ ADDR_COMPARE “ ♠ entitet “ Proširenje “ ♠ entitet “INV_1”, (blokovi U8, U11 i U12), kao i ♠ entitet “AND_2”

23

ADDR_en sel_in

PCLK sel_out

PENABLE

PRESET

PSELx

PWRITE

control_logic

PSELx

PENABLE

PWRITE

PRESET

PCLK

PADDR(31:0)

PWDATA(31:0)

PRDATA(31:0)

a(7:0) y(7:0)

enable

U1

TriSTATE_BUFFER

a(7:0)y(7:0)

enable

U2

TriSTATE_BUFFER

PWDATA(7:0)

ADDR(7:0) enable

U3

ADDR_compare

ADDR_en sel_in

PCLK sel_out

PENABLE

PRESET

PSELx

PWRITE

U4

control_logic

PADDR(15:8)

EdgeRESET SRout

EdgeSET

RESET

U6

DoubleEdgeSRGND

x y

U8

INV_1

PRESET

EdgeRESET SRout

EdgeSET

RESET

U9

DoubleEdgeSR

I0 OUTPUT

I1

U10

AND_2

xy

U11

INV_1

xy

U12

INV_1

RESET

nCS

nRD

nWR

DIN(7:0)

DOUT(7:0)

ul(7:0)iz(31:0)

U5

Prosirenje

Slika 5.8: Blok šema APB-bridge

5.2.1.1. CONTROL_LOGIC To je blok koji predstavlja kontrolnu logiku interfejsa APB-bridge koji upravlja radom celokupnog dizajna i koji odredjuje stanja same APB magistrale. Signal sa ulaza ADDR_en, kada je u stanju logičke jedinice dozvoljava rad bloka, tj. prenos signala na izlaz. Signalima PSELx i PENABLE se upravlja stanjima APB magistrale (IDLE,SETUP, ENABLE). Signalom PWRITE se dozvoljava upis (aktivan u stanju logičke jedinice). Ovaj blok na svojim izlazima generiše signale sel_in i sel_out koji služe da se da dozvola za upisivanje informacija ili iščitavanje informacija, sa ili u magistralu. Listing koda: library IEEE; use IEEE.STD_LOGIC_1164.all; entity control_logic is port (PCLK: in std_logic; PRESET: in std_logic; PSELx : in std_logic; PENABLE: in std_logic; PWRITE : in std_logic; ADDR_en: in std_logic; sel_in : out std_logic; sel_out: out std_logic); end control_logic; architecture control_logic of control_logic is type state_type is (reset, idle, setup, enable); signal state,next_state: state_type; Slika 5.9: Blok Control_logic begin proc1:process (PCLK,PRESET) is begin

24

ADDR(7:0) enable

ADDR_compare

if PRESET='0' then state<=reset; elsif rising_edge(PCLK) then state<=next_state; end if; end process proc1; proc2:process (PSELx,PENABLE, PWRITE, state) begin sel_in<='0'; sel_out<='0'; case state is when reset => next_state <= idle; when idle => if PSELx = '1' then next_state <= setup; else next_state <= idle; end if; when setup => if PENABLE='1' then next_state <= enable; end if; when enable => if PENABLE='1' then if ADDR_en='1' then if PWRITE='1' then sel_in <='1'; else sel_out <='1'; end if; end if; end if; if PSELx='1' then next_state <= setup; else next_state <= idle; end if; when others => next_state <= reset; end case; end process proc2; end control_logic; 5.2.1.2. ADDR_COMPARE Blok koji prihvata osmobitnu informaciju sa svog ulaza, vrši uporedjivanje sa heksadecimalnim “90“ i na izlazu generiše signal enable u stanju logičke jedinice ili logičke nule, u zavisnosti od ostvarene jednakosti. Što znači ako je ostvarena jednakost signal enable je u stanju logičke jedinice. U suprotnom je u stanju logičke nule. Listing koda: library IEEE; use IEEE.STD_LOGIC_1164.all; entity ADDR_compare is port (ADDR: in std_logic_vector(7 downto 0); enable: out std_logic); end ADDR_compare; Slika 5.10: Blok ADDR_compare architecture ADDR_compare of ADDR_compare is begin process(ADDR) begin if ADDR="10010000" then enable <='1'; else enable<='0';

25

a(7:0) y(7:0)

enable

TriSTATE_BUFFER

end if; end process; end ADDR_compare;

5.2.1.3. TriSTATE_BUFFER (TROSTATIČKI BAFER) Blok koji prihvata osmobitnu informaciju sa svog ulaza, kada je aktivan signal za dozvolu rada enable. Ako je signal za dozvolu rada aktivan (logička jedinica) tada se stanje ovog bafera prosledjuje na njegov izlaz. U suprotnom, izlaz bafera je u stanju visoke impedanse. Listing koda: library IEEE; use IEEE.STD_LOGIC_1164.all; entity TriSTATE_BUFFER is port( a : in STD_LOGIC_VECTOR(7 downto 0); y : out STD_LOGIC_VECTOR(7 downto 0); enable : in STD_LOGIC); end TriSTATE_BUFFER; architecture TriSTATE_BUFFER of TriSTATE_BUFFER is begin Slika5.11: BlokTriSTATE_BUFFER process(a,enable) begin if enable = '1' then y <= a; else y <= (others=>'Z'); end if; end process; end TriSTATE_BUFFER;

5.2.1.4. DoubleEdgeSR

Ovo kolo će se direktno setovati opadajućom ivicom EdgeRESET, a direktno će se resetovati rastućom ivicom EdgeSET. Kolo je strukturno realizovano i njegova struktura je prikazana na slici 5.12. Dok je na slici 5.5 dat vremenski dijagram ulazno-izlaznih signala ovog kola.

EdgeRESET

VCC

SRoutRESET

EdgeSETCLK Q

CLR

DATA

U1

DFF_R

CLK Q

CLR

DATA

U2

DFF_F

I0 O

I1

U3

XOR_2

I0OUTPUT

I1

U5

AND_2

I0 OUTPUT

I1

U6

AND_2

I0 O

I1

U4

OR_2x y

U7

INV_1

I0 OUTPUT

I1

U8

AND_2

x y

U9

INV_1

Slika5.12: DoubleEdgeSR

26

EdgeRESET SRout

EdgeSET

RESET

DoubleEdgeSR

Sa slike 5.12 vidimo da se izlazni signal Srout postavlja u stanje logičke nule rastućom ivicom signala EdgeSET, a u stanje logičke jedinice se postavlja opadajućom ivicom signala EdgeRESET. S vremenskog dijagrama se vidi da je izlazni signal Srout nakon rastuće ivice signala RESET postavljen u stanju logičke jedinice. Pojavom rastuće ivice signala EdgeSET, Srout prelazi na logičku nulu i ostaje sve do pojave opadajuće ivice EdgeRESET. Listing koda: library IEEE; use IEEE.std_logic_1164.all; entity DoubleEdgeSR is port( EdgeRESET : in STD_LOGIC; EdgeSET : in STD_LOGIC; RESET : in STD_LOGIC; SRout : out STD_LOGIC ); end DoubleEdgeSR; Slika5.13: DoubleEdgeSR architecture DoubleEdgeSR of DoubleEdgeSR is component AND_2 port ( I0 : in STD_LOGIC; I1 : in STD_LOGIC; OUTPUT : out STD_LOGIC); end component; component DFF_F port (CLK : in STD_LOGIC; CLR : in STD_LOGIC; DATA : in STD_LOGIC; Q : out STD_LOGIC ); end component; component DFF_R port (CLK : in STD_LOGIC; CLR : in STD_LOGIC; DATA : in STD_LOGIC; Q : out STD_LOGIC ); end component; component INV_1 port ( x : in STD_LOGIC; y : out STD_LOGIC); end component; component OR_2 port ( I0 : in STD_LOGIC; I1 : in STD_LOGIC; O : out STD_LOGIC); end component; component XOR_2 port ( I0 : in STD_LOGIC; I1 : in STD_LOGIC; O : out STD_LOGIC); end component; constant VCC_CONSTANT : STD_LOGIC := '1'; signal NET1012 : STD_LOGIC; signal NET1443 : STD_LOGIC; signal NET1456 : STD_LOGIC; signal NET1534 : STD_LOGIC; signal NET18 : STD_LOGIC; signal NET62 : STD_LOGIC; signal NET69 : STD_LOGIC; signal NET92 : STD_LOGIC; signal VCC : STD_LOGIC; begin U1 : DFF_R port map(CLK => EdgeSET, CLR => NET1012,

27

I0 O

I1

OR_2

CLK Q

CLR

DATA

DFF_R

DATA => VCC, Q => NET18); U2 : DFF_F port map(CLK => NET92, CLR => NET1012, DATA => VCC, Q => NET62 ); U3 : XOR_2 port map(I0 => NET18, I1 => NET62, O => NET1534 ); U4 : OR_2 port map( I0 => RESET, I1 => NET69, O => NET1012 ); U5 : AND_2 port map(I0 => NET62, I1 => NET18, OUTPUT => NET69); U6 : AND_2 port map( I0 => NET1456, I1 => NET18, OUTPUT => NET92); U7 : INV_1 port map(x => EdgeSET, y => NET1443 ); U8 : AND_2 port map( I0 => NET1443, I1 => EdgeRESET, OUTPUT => NET1456 ); U9 : INV_1 port map( x => NET1534, y => SRout ); VCC <= VCC_CONSTANT; end DoubleEdgeSR;

5.2.1.4.1. OR_2 (ILI kolo) Listing koda: library IEEE; use IEEE.std_logic_1164.all; entity OR_2 is port ( I0 : in std_logic; I1 : in std_logic; O : out std_logic); end entity; Slika5.14: OR_2 kolo architecture gate_arch of OR_2 is begin O <= I0 or I1; end gate_arch;

5.2.1.4.2. DFF_R (D Flip Flop) Listing koda: library IEEE; use IEEE.std_logic_1164.all; entity DFF_R is port ( CLR : in std_logic; CLK : in std_logic; DATA : in std_logic; Slika5.15: OR_2 kolo

28

I0 O

I1

XOR_2

CLK Q

CLR

DATA

DFF_F

Q : out std_logic); end entity; architecture DFF_R_arch of DFF_R is signal TEMP_Q: std_logic:='0'; begin process (CLK, CLR) begin if CLR = '1' then TEMP_Q <= '0'; elsif rising_edge(CLK) then TEMP_Q <= DATA; end if; end process; Q <= TEMP_Q; end DFF_R_arch;

5.2.1.4.3. DFF_F (D Flip Flop) Listing koda: library IEEE; use IEEE.std_logic_1164.all; entity DFF_F is port ( CLR : in std_logic; CLK : in std_logic; DATA : in std_logic; Slika5.16: DFF kolo Q : out std_logic); end entity; architecture DFF_F_arch of DFF_F is signal TEMP_Q: std_logic:='0'; begin process (CLK, CLR) begin if CLR = '1' then TEMP_Q <= '0'; elsif falling_edge(CLK) then TEMP_Q <= DATA; end if; end process; Q <= TEMP_Q; end DFF_F_arch;

5.2.1.4.4. XOR_2 Listing koda: library IEEE; use IEEE.std_logic_1164.all; entity XOR_2 is port ( I0 : in std_logic; Slika5.17: XOR_2 kolo I1 : in std_logic; O : out std_logic); end entity; architecture gate_arch of XOR_2 is begin O <= I0 xor I1; end gate_arch;

5.2.1.5. Proširenje

29

I0 OUTPUT

I1

AND_2

ul(7:0)iz(31:0)

Prosirenje

DOUT(7:0) DIN(7:0)

PADDR(31:0) PRDATA(31:0)

PCLK RESET

PENABLE nCS

PRESET nRD

PSELx nWR

PWDATA(31:0)

PWRITE

APB_bridge

x y

INV_1

Blok koji koji stavlja 24 bita veće težine na logičku nulu. On prihvata osmobitni podatak sa svog ulaza i to 8 bita manje težine, dodeljuje nule na mestu 24 bita veće težine i na izlazu generiše 32 bitni podatak. Listing koda: library IEEE; use IEEE.STD_LOGIC_1164.all; entity Prosirenje is port (ul:in std_logic_vector(7 downto 0); iz:out std_logic_vector(31 downto 0)); end Prosirenje; Slika5.18: Blok Proširenje architecture Prosirenje of Prosirenje is begin iz<="000000000000000000000000"&ul; end Prosirenje;

5.2.1.6. INV_1 (Invertor) Listing koda: library IEEE; use IEEE.STD_LOGIC_1164.all; entity INV_1 is port( x : in STD_LOGIC; y : out STD_LOGIC); end INV_1; architecture INV_1 of INV_1 is begin Slika5.19: Invertor y<=not x; end INV_1;

5.2.1.7. AND_2 ( I_kolo) Listing koda: library IEEE; use IEEE.STD_LOGIC_1164.all; entity AND_2 is port( I0: in std_logic; I1: in std_logic; OUTPUT: out std_logic); Slika5.20: I_kolo end AND_2; architecture AND_2 of AND_2 is begin OUTPUT <= I0 and I1; end AND_2;

5.2.2. Interfejs APB-bridge Listing koda: library IEEE; use IEEE.std_logic_1164.all; entity PIA_APB_8255 is port(PCLK : in STD_LOGIC; PENABLE : in STD_LOGIC; PRESET : in STD_LOGIC; PSELx : in STD_LOGIC; PWRITE : in STD_LOGIC; PADDR : in STD_LOGIC_VECTOR(31 downto 0); PAIN : in STD_LOGIC_VECTOR(7 downto 0); Slika5.21: Interfejs APB-bridge

30

PBIN : in STD_LOGIC_VECTOR(7 downto 0); PCIN : in STD_LOGIC_VECTOR(7 downto 0); PWDATA : in STD_LOGIC_VECTOR(31 downto 0); PAOUT : out STD_LOGIC_VECTOR(7 downto 0); PBOUT : out STD_LOGIC_VECTOR(7 downto 0); PCOUT : out STD_LOGIC_VECTOR(7 downto 0); PRDATA : out STD_LOGIC_VECTOR(31 downto 0)); end PIA_APB_8255; architecture PIA_APB_8255 of PIA_APB_8255 is component a8255 port (A : in STD_LOGIC_VECTOR(1 downto 0); CLK : in STD_LOGIC; DIN : in STD_LOGIC_VECTOR(7 downto 0); PAIN : in STD_LOGIC_VECTOR(7 downto 0); PBIN : in STD_LOGIC_VECTOR(7 downto 0); PCIN : in STD_LOGIC_VECTOR(7 downto 0); RESET : in STD_LOGIC; nCS : in STD_LOGIC; nRD : in STD_LOGIC; nWR : in STD_LOGIC; DOUT : out STD_LOGIC_VECTOR(7 downto 0); PAEN : out STD_LOGIC; PAOUT : out STD_LOGIC_VECTOR(7 downto 0); PBEN : out STD_LOGIC; PBOUT : out STD_LOGIC_VECTOR(7 downto 0); PCEN : out STD_LOGIC_VECTOR(7 downto 0); PCOUT : out STD_LOGIC_VECTOR(7 downto 0)); end component; component APB_bridge port (DOUT : in STD_LOGIC_VECTOR(7 downto 0); PADDR : in STD_LOGIC_VECTOR(31 downto 0); PCLK : in STD_LOGIC; PENABLE : in STD_LOGIC; PRESET : in STD_LOGIC; PSELx : in STD_LOGIC; PWDATA : in STD_LOGIC_VECTOR(31 downto 0); PWRITE : in STD_LOGIC; DIN : out STD_LOGIC_VECTOR(7 downto 0); PRDATA : out STD_LOGIC_VECTOR(31 downto 0); RESET : out STD_LOGIC; nCS : out STD_LOGIC; nRD : inout STD_LOGIC; nWR : inout STD_LOGIC); end component; signal NET2616 : STD_LOGIC; signal NET2622 : STD_LOGIC; signal NET2628 : STD_LOGIC; signal NET2634 : STD_LOGIC; signal BUS2610 : STD_LOGIC_VECTOR (7 downto 0); signal BUS2640 : STD_LOGIC_VECTOR (7 downto 0); begin U1 : APB_bridge port map(DIN => BUS2610, DOUT => BUS2640, PADDR => PADDR, PCLK => PCLK, PENABLE => PENABLE, PRDATA => PRDATA, PRESET => PRESET, PSELx => PSELx, PWDATA => PWDATA, PWRITE => PWRITE, RESET => NET2616, nCS => NET2622,

31

DoutSelect(2:0)

ControlReg(7:0)

PortAInReg(7:0)

PAIN(7:0)

PortBInReg(7:0)

PBIN(7:0)

PortCStatus(7:0)

DOUT(7:0)

Dout_mux

nRD => NET2628, nWR => NET2634); U2 : a8255 port map(A(0) => PADDR(0), A(1) => PADDR(1), CLK => PCLK, DIN => BUS2610, DOUT => BUS2640, PAIN => PAIN, PAOUT => PAOUT, PBIN => PBIN, PBOUT => PBOUT, PCIN => PCIN, PCOUT => PCOUT, RESET => NET2616, nCS => NET2622, nRD => NET2628, nWR => NET2634); end PIA_APB_8255;

5.2.3. čip 8255 Korišćen je gotov kod za ovaj čip firme Altera i uzet je sa njihovog internet sajta. Čip se sastoji se od sedam entiteta:

♠ entitet “ Dout_mux“ ♠ entitet “ Cntl_log“ ♠ entitet “ Portaout“ ♠ entitet “ Portain“ ♠ entitet “ Portbout“ ♠ entitet “ Portbin“ ♠ entitet “ Portcout“

5.2.3.1. Dout_mux Listing koda: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY dout_mux IS PORT(DOUTSelect : IN std_logic_vector (2 DOWNTO 0); ControlReg : IN std_logic_vector (7 DOWNTO 0); PortAInReg : IN std_logic_vector (7 DOWNTO 0); PAIN : IN std_logic_vector (7 DOWNTO 0); PortBInReg : IN std_logic_vector (7 DOWNTO 0); PBIN : IN std_logic_vector (7 DOWNTO 0); PortCStatus : IN std_logic_vector (7 DOWNTO 0); DOUT : OUT std_logic_vector(7 DOWNTO 0)); END dout_mux; ARCHITECTURE rtl OF dout_mux IS Slika5.22:Dout_mux BEGIN mux_proc:PROCESS(DOUTSelect,PAIN,PortAInReg,PBIN,PortBInReg,PortCStatus,ControlReg, DOUTSelect) BEGIN CASE DOUTSelect IS WHEN "000" => DOUT <= PAIN;

32

RESET

CLK

nCS

nRD

nWR

A(1:0)

DIN(7:0)

PCIN(7:0)

PAEN

PBEN

PCEN(7:0)

DOUTSelect(2:0)

ControlReg(7:0)

PortAReadPortBReadPortAWritePortBWrite

PortAOutLdPortBOutLd

PortCOverride

PortCOutLd(7:0)

Cntl_log

WHEN "001" => DOUT <= PortAInReg; WHEN "010" => DOUT <= PBIN; WHEN "011" => DOUT <= PortBInReg; WHEN "100" => DOUT <= PortCStatus; WHEN "110" => DOUT <= ControlReg; WHEN OTHERS => DOUT <= "11111111"; END CASE; END PROCESS mux_proc; END rtl; 5.2.3.2. Cntl_log Listing koda: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY cntl_log IS PORT(RESET : IN std_logic; CLK : IN std_logic; nCS : IN std_logic; nRD : IN std_logic; nWR : IN std_logic; A : IN std_logic_vector (1 DOWNTO 0); DIN : IN std_logic_vector (7 DOWNTO 0); PCIN : IN std_logic_vector (7 DOWNTO 0); PAEN : OUT std_logic; PBEN : OUT std_logic; PCEN : OUT std_logic_vector (7 DOWNTO 0); DOUTSelect : OUT std_logic_vector (2 DOWNTO 0); ControlReg : OUT std_logic_vector (7 DOWNTO 0); PortARead : OUT std_logic; PortBRead : OUT std_logic; PortAWrite : OUT std_logic; PortBWrite : OUT std_logic; Slika5.23: Cntl_log PortAOutLd : OUT std_logic; PortBOutLd : OUT std_logic; PortCOverride : OUT std_logic; PortCOutLd : OUT std_logic_vector (7 DOWNTO 0) ); END cntl_log; ARCHITECTURE rtl OF cntl_log IS SIGNAL ControlRegD : std_logic_vector(6 DOWNTO 0); SIGNAL ControlRegQ : std_logic_vector(6 DOWNTO 0); SIGNAL ModeA : std_logic_vector (1 DOWNTO 0); SIGNAL ModeB : std_logic; SIGNAL PortA_IO : std_logic; SIGNAL PortB_IO : std_logic; SIGNAL PortCUp_IO : std_logic; SIGNAL PortCLow_IO : std_logic; SIGNAL ControlRegWrite : std_logic; BEGIN ControlReg <= '1' & ControlRegQ; ModeA <= ControlRegQ (6 DOWNTO 5); ModeB <= ControlRegQ (2); PortA_IO <= ControlRegQ (4); PortB_IO <= ControlRegQ (1);

33

PortCUp_IO <= ControlRegQ (3); PortCLow_IO <= ControlRegQ (0); PortAOutLd <= '0' WHEN nCS = '0' AND A = "00" AND nWR = '0' ELSE '1'; PortBOutLd <= '0' WHEN nCS = '0' AND A = "01" AND nWR = '0' ELSE '1'; PortARead <= nCS OR nRD OR A(1) OR A(0); PortBRead <= nCS OR nRD OR A(1) OR (NOT A(0)); PortAWrite <= nCS OR nWR OR A(1) OR A(0); PortBWrite <= nCS OR nWR OR A(1) OR (NOT A(0)); ControlRegWrite <= nCS OR nWR OR (NOT A(1)) OR (NOT A(0)) OR (NOT DIN(7)); ControlLogicProc: PROCESS ( nCS , nWR , A, DIN, ModeA, ModeB, PortA_IO, PortB_IO, PortCLow_IO, PortCUp_IO, PCIN, ControlRegWrite, ControlRegQ ) BEGIN IF (ModeB = '0') THEN PBEN <= NOT PortB_IO; IF (ModeA(1) = '1') THEN PCEN (3 DOWNTO 0) <= '1' & std_logic'(NOT PortCLow_IO) & std_logic'(NOT PortCLow_IO) & std_logic'(NOT PortCLow_IO); ELSE PCEN (3 DOWNTO 0) <= std_logic'(NOT PortCLow_IO) & std_logic'(NOT PortCLow_IO) & std_logic'(NOT PortCLow_IO) & std_logic'(NOT PortCLow_IO); END IF; ELSE PBEN <= NOT PortB_IO; PCEN (3 DOWNTO 0) <= "1011"; END IF; IF (ModeA = "00") THEN PAEN <= NOT PortA_IO; PCEN (7 DOWNTO 4) <= std_logic'(NOT PortCUp_IO) & std_logic'(NOT PortCUp_IO) & std_logic'(NOT PortCUp_IO) & std_logic'(NOT PortCUp_IO); ELSIF (ModeA = "01") THEN PAEN <= NOT PortA_IO; IF (PortA_IO = '0') THEN --Port A Output PCEN(7 DOWNTO 4) <= "10" & std_logic'(NOT PortCUp_IO) & std_logic'(NOT PortCUp_IO); ELSE --Port A Input PCEN(7 DOWNTO 4) <= std_logic'(NOT PortCUp_IO) & std_logic'(NOT PortCUp_IO) & "10"; END IF; ELSE PAEN <= NOT PCIN(6); -- ACK signal drives enable in Mode 2 PCEN(7 DOWNTO 4) <= "1010"; END IF; CASE A IS WHEN "00" => -- Port A Data IF (ModeA = "00") THEN -- If Port A is in Mode 0 DOUTSelect <= "000"; -- then select unlatched PAIN data ELSE DOUTSelect <= "001"; -- else select latched PAIN data END IF; WHEN "01" => -- Port B Data IF (ModeB = '0') THEN -- If Port B is in Mode 0 DOUTSelect <= "010"; -- then select unlatched PBIN data ELSE DOUTSelect <= "011"; -- else select latched PBIN data

34

END IF; WHEN "10" => -- Port C Data DOUTSelect <="100"; -- Select PCIN data WHEN "11" => DOUTSelect <="110"; -- Select Control Register Data WHEN OTHERS => NULL; -- Default END CASE; IF (nCS='0' AND A ="11" AND DIN(7) ='0') THEN PortCOverride <='1'; ELSE PortCOverride <='0'; END IF; IF (nCS = '0' AND A = "10" AND nWR = '0') THEN IF (ModeA = "00" AND ModeB = '0') THEN PortCOutLd <="00000000"; ELSIF (ModeA ="00") THEN PortCOutLd <="00001111"; ELSIF (ModeB ='0') THEN PortCOutLd <="11110000"; ELSE PortCOutLd <="11111111"; END IF; ELSIF (nCS ='0' AND A ="11" AND nWR ='0' AND DIN(7)='0') THEN CASE DIN (3 DOWNTO 1) IS WHEN "000" => PortCOutLd <= "11111110"; WHEN "001" => PortCOutLd <= "11111101"; WHEN "010" => PortCOutLd <= "11111011"; WHEN "011" => PortCOutLd <= "11110111"; WHEN "100" => PortCOutLd <= "11101111"; WHEN "101" => PortCOutLd <= "11011111"; WHEN "110" => PortCOutLd <= "10111111"; WHEN "111" => PortCOutLd <= "01111111"; WHEN OTHERS => PortCOutLd <= "11111111"; END CASE; ELSE PortCOutLd <= "11111111"; END IF; IF (ControlRegWrite = '0') THEN ControlRegD <= DIN (6 DOWNTO 0); ELSE ControlRegD <= ControlRegQ; END IF; END PROCESS; ControlRegProc: PROCESS ( RESET, CLK ) BEGIN IF (RESET = '1') THEN ControlRegQ <= "0011011"; ELSIF (CLK'EVENT and CLK = '1') THEN ControlRegQ <= ControlRegD; END IF; END PROCESS; END rtl;

35

RESET

CLK

DIN(7:0)

PortAOutLdPAOUT(7:0)

Portaout

PAIN(7:0)

RESET

CLK

PortAInLd

PortAInReg(7:0)

Portain

5.2.3.3. Portaout Listing koda: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY portaout IS PORT( RESET : IN std_logic; CLK : IN std_logic; DIN : IN std_logic_vector (7 DOWNTO 0); PortAOutLd : IN std_logic; PAOUT : OUT std_logic_vector (7 DOWNTO 0) ); END portaout; ARCHITECTURE rtl OF portaout IS Slika5.24: PortAout SIGNAL PortAOutRegD : std_logic_vector(7 DOWNTO 0); SIGNAL PortAOutRegQ : std_logic_vector(7 DOWNTO 0); BEGIN PAOUT <= PortAOutRegQ; PortAOutRegProc: PROCESS ( PortAOutLd, PortAOutRegQ, DIN ) BEGIN IF ( PortAOutLd = '0') THEN PortAOutRegD <= DIN; ELSE PortAOutRegD <= PortAOutRegQ; END IF; END PROCESS; PortAOutRegSynchProc: PROCESS ( RESET, CLK ) BEGIN IF (RESET = '1') THEN PortAOutRegQ <= "00000000"; ELSIF ( CLK'EVENT and CLK = '1') THEN PortAOutRegQ <= PortAOutRegD; END IF; END PROCESS; END rtl;

5.2.3.4. Portain Listing koda: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY portain IS PORT(PAIN : IN std_logic_vector (7 DOWNTO 0); RESET : IN std_logic; CLK : IN std_logic; Slika5.25: PortAin PortAInLd : IN std_logic; PortAInReg : OUT std_logic_vector (7 DOWNTO 0)); END portain; ARCHITECTURE rtl OF portain IS SIGNAL PortAInRegQ : std_logic_vector(7 DOWNTO 0); SIGNAL PortAInRegD : std_logic_vector(7 DOWNTO 0); BEGIN PortAInReg <= PortAInRegQ; PortAInRegProc: PROCESS ( PortAInLd, PAIN, PortAInRegQ ) BEGIN

36

RESET

CLK

DIN(7:0)

PortBOutLdPBOUT(7:0)

Portbout

PBIN(7:0)

RESET

CLK

PortBInLdPortBInReg(7:0)

Portbin

IF ( PortAInLd = '0') THEN PortAInRegD <= PAIN (7 DOWNTO 0); ELSE PortAInRegD <= PortAInRegQ; END IF; END PROCESS; PortAInRegSynchProc: PROCESS ( RESET, CLK ) BEGIN IF (RESET = '1') THEN PortAInRegQ <= "00000000"; ELSIF ( CLK'EVENT and CLK = '1') THEN PortAInRegQ <= PortAInRegD; END IF; END PROCESS; END rtl;

5.2.3.5. Portbout Listing koda: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY portbout IS PORT(RESET : IN std_logic; CLK : IN std_logic; DIN : IN std_logic_vector (7 DOWNTO 0); PortBOutLd : IN std_logic; PBOUT : OUT std_logic_vector (7 DOWNTO 0)); END portbout; ARCHITECTURE rtl OF portbout IS SIGNAL PortBOutRegD : std_logic_vector(7 DOWNTO 0); SIGNAL PortBOutRegQ : std_logic_vector(7 DOWNTO 0); BEGIN Slika5.26: PortBout PBOUT <= PortBOutRegQ; PortBOutRegProc: PROCESS ( PortBOutLd, PortBOutRegQ, DIN ) BEGIN IF ( PortBOutLd = '0') THEN PortBOutRegD <= DIN; ELSE PortBOutRegD <= PortBOutRegQ; END IF; END PROCESS; PortBOutRegSynchProc: PROCESS ( RESET, CLK ) BEGIN IF (RESET = '1') THEN PortBOutRegQ <= "00000000"; ELSIF ( CLK'EVENT and CLK = '1') THEN PortBOutRegQ <= PortBOutRegD; END IF; END PROCESS; END rtl;

5.2.3.6. Portbin Listing koda: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY portbin IS PORT(PBIN : IN std_logic_vector (7 DOWNTO 0); Slika5.27: PortBin

37

RESET

CLK

DIN(7:0)

PCIN(7:0)

ControlReg(7:0)

PortARead

PortBRead

PortAWrite

PortBWrite

PortCOverride

PortCOutLd(7:0)

PortCStatus(7:0)

PCOUT(7:0)

Portcout

RESET : IN std_logic; CLK : IN std_logic; PortBInLd : IN std_logic; PortBInReg : OUT std_logic_vector (7 DOWNTO 0)); END portbin; ARCHITECTURE rtl OF portbin IS SIGNAL PortBInRegQ : std_logic_vector(7 DOWNTO 0); SIGNAL PortBInRegD : std_logic_vector(7 DOWNTO 0); BEGIN PortBInReg <= PortBInRegQ; PortBInRegProc: PROCESS ( PortBInLd, PBIN, PortBInRegQ ) BEGIN IF ( PortBInLd = '0') THEN PortBInRegD <= PBIN (7 DOWNTO 0); ELSE PortBInRegD <= PortBInRegQ; END IF; END PROCESS; PortBInRegSynchProc: PROCESS ( RESET, CLK ) BEGIN IF (RESET = '1') THEN PortBInRegQ <= "00000000"; ELSIF ( CLK'EVENT and CLK = '1') THEN PortBInRegQ <= PortBInRegD; END IF; END PROCESS; END rtl;

5.2.3.7. Portcout Listing koda: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY portcout IS PORT(RESET : IN std_logic; CLK : IN std_logic; DIN : IN std_logic_vector (7 DOWNTO 0); PCIN : IN std_logic_vector (7 DOWNTO 0); ControlReg : IN std_logic_vector (7 DOWNTO 0); PortARead : IN std_logic; PortBRead : IN std_logic; PortAWrite : IN std_logic; PortBWrite : IN std_logic; PortCOverride : IN std_logic; PortCOutLd : IN std_logic_vector (7 DOWNTO 0); PortCStatus : OUT std_logic_vector (7 DOWNTO 0); PCOUT : OUT std_logic_vector (7 DOWNTO 0)); END portcout; ARCHITECTURE rtl OF portcout IS SIGNAL PortCOutRegD : std_logic_vector(7 DOWNTO 0); SIGNAL PortCOutRegQ : std_logic_vector(7 DOWNTO 0); SIGNAL ModeA : std_logic_vector (1 DOWNTO 0); SIGNAL ModeB : std_logic; Slika5.28: PortCout SIGNAL PortA_IO : std_logic; SIGNAL PortB_IO : std_logic; SIGNAL RisePortAWriteQ : std_logic; SIGNAL RisePortBWriteQ : std_logic; SIGNAL RisePortAReadQ : std_logic; SIGNAL RisePortBReadQ : std_logic; SIGNAL RisePCIN6Q : std_logic;

38

SIGNAL RisePCIN4Q : std_logic; SIGNAL RisePCIN2Q : std_logic; SIGNAL RisePortAWrite : std_logic; SIGNAL RisePortBWrite : std_logic; SIGNAL RisePortARead : std_logic; SIGNAL RisePortBRead : std_logic; SIGNAL RisePCIN6 : std_logic; SIGNAL RisePCIN4 : std_logic; SIGNAL RisePCIN2 : std_logic; BEGIN PCOUT <= PortCOutRegQ; ModeA <= ControlReg (6 DOWNTO 5); ModeB <= ControlReg (2); PortA_IO <= ControlReg (4); PortB_IO <= ControlReg (1); PortCStatusProc: PROCESS ( ModeA, ModeB, PortA_IO, PCIN, PortCOutRegQ ) BEGIN PortCStatus(7) <= PCIN(7); IF (ModeA = "01" AND PortA_IO = '0') THEN -- Mode 1 PortCStatus(6) <= PortCoutRegQ(6); ELSIF (ModeA(1) = '1') THEN -- Mode 2 PortCStatus(6) <= PortCoutRegQ(6); ELSE PortCStatus(6) <= PCIN(6); END IF; PortCStatus(5) <= PCIN(5); IF (ModeA = "01" AND PortA_IO = '1') THEN -- Mode 1 PortCStatus(4) <= PortCoutRegQ(4); ELSIF (ModeA(1) = '1') THEN -- Mode 2 PortCStatus(4) <= PortCoutRegQ(4); ELSE PortCStatus(4) <= PCIN(4); END IF; PortCStatus(3) <= PCIN(3); IF (ModeB = '1') THEN -- Mode 1 PortCStatus(2) <= PortCoutRegQ(2); ELSE PortCStatus(2) <= PCIN(2); END IF; PortCStatus(1) <= PCIN(1); PortCStatus(0) <= PCIN(0); END PROCESS; PortCDataProc: PROCESS ( ModeA, PortA_IO, PortB_IO, ModeB, PortCOverride, PortAWrite, PortBWrite, PortARead, PortBRead, RisePortAWrite, RisePortBWrite, RisePortARead, RisePortBRead, PortCOutLd, PortCOutRegQ, DIN, PCIN, RisePCIN2, RisePCIN4, RisePCIN6 ) BEGIN IF (ModeB = '0') THEN -- Mode 0 IF (PortCOutLd (0) = '0') THEN -- Load from bus and bit set/reset PortCOutRegD (0) <= DIN(0); ELSE PortCOutRegD (0) <= PortCOutRegQ (0); END IF; ELSIF (ModeB = '1') THEN -- Mode 1 IF ( PortCOutLd (0) = '0' AND PortCOverride = '1') THEN -- Load for the set/reset command PortCOutRegD (0) <= DIN(0); -- Mode 1 Output ELSIF (PortB_IO = '0') THEN IF (PortBWrite = '0') THEN -- Reset INTRB on write strobe PortCOutRegD (0) <= '0'; ELSIF (PortBWrite = '1' AND RisePCIN2 = '1' -- Set INTRB on rising edge of ACKB AND PortCOutRegQ (1) = '1') THEN PortCOutRegD (0) <= PortCOutRegQ (2);

39

ELSE PortCOutRegD (0) <= PortCOutRegQ (0); END IF; ELSE -- Mode 1 Input IF (PortBRead = '0' AND PortCOutRegQ(1) = '1') THEN -- Reset INTRB on read strobe PortCOutRegD (0) <= '0'; ELSIF (RisePCIN2 = '1' AND PortCOutRegQ (1) = '1') THEN -- Set INTRB on rising edge of STBB PortCOutRegD (0) <= PortCOutRegQ (2); ELSE PortCOutRegD (0) <= PortCOutRegQ (0); END IF; END IF; ELSE PortCOutRegD (0) <= PortCOutRegQ (0); END IF IF (ModeB = '0') THEN -- Mode 0 IF (PortCOutLd (1) = '0') THEN IF ( PortCOverride = '1') THEN PortCOutRegD (1) <= DIN(0); -- Load from bit set/reset ELSE PortCOutRegD (1) <= DIN(1); -- Load from bus END IF; ELSE PortCOutRegD (1) <= PortCOutRegQ (1); END IF; ELSIF (ModeB = '1') THEN -- Mode 1 IF ( PortCOutLd (1) = '0' AND PortCOverride = '1') THEN -- Load from bit set/reset PortCOutRegD (1) <= DIN(0); ELSIF (PortB_IO = '0') THEN -- Mode 1 Output IF (RisePortBWrite = '1') THEN -- Reset OBFB on rising edge of write strobe PortCOutRegD (1) <= '0'; ELSIF (PCIN(2) = '0') THEN-- Set OBFB when ACKB goes low PortCOutRegD (1) <= '1'; ELSE PortCOutRegD (1) <= PortCOutRegQ (1); END IF; ELSE -- Mode 1 Input IF (RisePortBRead = '1' AND PortCOutRegQ(0) = '0') THEN -- Reset IBFB on rising edge of read strobe PortCOutRegD (1) <= '0'; ELSIF (PCIN(2) = '0') THEN -- Set IBFB when STBB goes low PortCOutRegD (1) <= '1'; ELSE PortCOutRegD (1) <= PortCOutRegQ (1); END IF; END IF; ELSE PortCOutRegD (1) <= PortCOutRegQ (1); END IF; IF (PortCOutLd (2) = '0') THEN -- All Modes IF ( PortCOverride = '1') THEN PortCOutRegD (2) <= DIN(0); -- Load INTEB from bit set/reset ELSE PortCOutRegD (2) <= DIN(2); -- Load INTEB from bus END IF; ELSE PortCOutRegD (2) <= PortCOutRegQ (2); END IF; IF (ModeA = "00") THEN -- Mode 0 IF (PortCOutLd (3) = '0') THEN IF ( PortCOverride = '1') THEN

40

PortCOutRegD (3) <= DIN(0); -- Load from bit set/reset ELSE PortCOutRegD (3) <= DIN(3); -- Load from bus END IF; ELSE PortCOutRegD (3) <= PortCOutRegQ (3); END IF; ELSIF (ModeA = "01") THEN -- Mode 1 IF ( PortCOutLd (3) = '0' AND PortCOverride = '1') THEN PortCOutRegD (3) <= DIN(0); -- Load from bit set/reset ELSIF (PortA_IO = '0') THEN -- Mode 1 Output IF (PortAWrite = '0') THEN PortCOutRegD (3) <= '0'; -- Reset INTRA on write strobe ELSIF (PortAWrite = '1' AND RisePCIN6 = '1' -- Set INTRA on rising edge of ACKA AND PortCOutRegQ (7) = '1') THEN PortCOutRegD (3) <= PortCOutRegQ (6); ELSE PortCOutRegD (3) <= PortCOutRegQ (3); END IF; ELSE -- Mode 1 Input IF (PortARead = '0' AND PortCOutRegQ(5) = '1') THEN PortCOutRegD (3) <= '0'; -- Reset INTRA on read strobe ELSIF (RisePCIN4 = '1' AND PortCOutRegQ (5) = '1') THEN PortCOutRegD (3) <= PortCOutRegQ (4);-- Set INTRA on rising edge of STBA ELSE PortCOutRegD (3) <= PortCOutRegQ (3); END IF; END IF; ELSIF (ModeA(1) = '1') THEN -- Mode 2 IF ( PortCOutLd (3) = '0' AND PortCOverride = '1') THEN PortCOutRegD (3) <= DIN(0); -- Load from bit set/reset ELSE IF (PortAWrite = '0' OR PortARead = '0') THEN -- Reset INTRA on either read or write strobes PortCOutRegD (3) <= '0'; ELSIF (PortAWrite = '1' AND RisePCIN6 = '1' AND PortCOutRegQ (7) = '1') THEN -- Set INTRA on rising edge of ACKA PortCOutRegD (3) <= PortCOutRegQ (6); ELSIF (PortARead = '1' AND RisePCIN4 = '1' -- OR AND PortCOutRegQ (5) = '1') THEN -- Set INTRA on rising edge of STBA PortCOutRegD (3) <= PortCOutRegQ (4); ELSE PortCOutRegD (3) <= PortCOutRegQ (3); END IF; END IF; ELSE PortCOutRegD (3) <= PortCOutRegQ (3); END IF; IF (ModeA = "00" OR (ModeA = "01" AND PortA_IO = '0')) THEN -- Mode 0 and Mode 1 Output IF (PortCOutLd (4) = '0') THEN IF ( PortCOverride = '1') THEN PortCOutRegD (4) <= DIN(0); -- Load INTEA from bit set/reset ELSE PortCOutRegD (4) <= DIN(4); -- Load INTEA from bus END IF; ELSE PortCOutRegD (4) <= PortCOutRegQ (4); END IF; -- Mode 1 Input and Mode 2 ELSE IF ( PortCOutLd (4) = '0' AND PortCOverride = '1') THEN PortCOutRegD (4) <= DIN(0); -- Load INTEA(2) from bit set/reset ELSE

41

PortCOutRegD (4) <= PortCOutRegQ (4); END IF; END IF; IF (ModeA = "00"OR (ModeA = "01" AND PortA_IO = '0')) THEN -- Mode 0 and Mode 1 Output IF (PortCOutLd (5) = '0') THEN IF ( PortCOverride = '1') THEN PortCOutRegD (5) <= DIN(0); -- Load from bit set/reset ELSE PortCOutRegD (5) <= DIN(5); -- Load from bus END IF; ELSE PortCOutRegD (5) <= PortCOutRegQ (5); END IF; ELSIF (ModeA = "01") THEN -- Mode 1 IF ( PortCOutLd (5) = '0' AND PortCOverride = '1') THEN PortCOutRegD (5) <= DIN(0); -- Load from bit set/reset ELSIF (PortA_IO = '1') THEN -- Mode 1 Input IF (RisePortARead = '1' AND PortCOutRegQ(3) = '0') THEN PortCOutRegD (5) <= '0'; -- Reset IBFA on rising edge of read strobe ELSIF (PCIN(4) = '0') THEN PortCOutRegD (5) <= '1'; -- Set IBFA when STBA goes low ELSE PortCOutRegD (5) <= PortCOutRegQ (5); END IF; ELSE PortCOutRegD (5) <= PortCOutRegQ (5); END IF; ELSIF (ModeA(1) = '1') THEN -- Mode 2 IF ( PortCOutLd (5) = '0' AND PortCOverride = '1') THEN PortCOutRegD (5) <= DIN(0); -- Load from bit set/reset ELSE IF (RisePortARead = '1' AND PortCOutRegQ(3) = '0') THEN PortCOutRegD (5) <= '0'; -- Reset IBFA on rising edge of read strobe ELSIF (PCIN(4) = '0') THEN PortCOutRegD (5) <= '1'; -- Set IBFA when STBA goes low ELSE PortCOutRegD (5) <= PortCOutRegQ (5); END IF; END IF; ELSE PortCOutRegD (5) <= PortCOutRegQ (5); END IF; IF (ModeA = "00" OR (ModeA = "01" AND PortA_IO = '1')) THEN -- Mode 0 and Mode 1 Input IF (PortCOutLd (6) = '0') THEN IF ( PortCOverride = '1') THEN PortCOutRegD (6) <= DIN(0); -- Load INTEA from bit set/reset ELSE PortCOutRegD (6) <= DIN(6); -- Load INTEA from bus END IF; ELSE PortCOutRegD (6) <= PortCOutRegQ (6); END IF; ELSE IF ( PortCOutLd (6) = '0' AND PortCOverride = '1') THEN PortCOutRegD (6) <= DIN(0); -- Load INTEA(1) from bit set/reset ELSE PortCOutRegD (6) <= PortCOutRegQ (6); END IF; END IF; IF (ModeA = "00" OR (ModeA = "01" AND PortA_IO = '1')) THEN -- Mode 0 and Mode 1 Input IF (PortCOutLd (7) = '0') THEN IF ( PortCOverride = '1') THEN PortCOutRegD (7) <= DIN(0); -- Load from bit set/reset

42

ELSE PortCOutRegD (7) <= DIN(7); -- Load from bus END IF; ELSE PortCOutRegD (7) <= PortCOutRegQ (7); END IF; ELSIF (ModeA = "01") THEN -- Mode 1 IF ( PortCOutLd (7) = '0' AND PortCOverride = '1') THEN PortCOutRegD (7) <= DIN(0); ELSIF (PortA_IO = '0') THEN -- Mode 1 Output IF (RisePortAWrite = '1') THEN PortCOutRegD (7) <= '0'; -- Reset OBFA on rising edge of Write strobe ELSIF (PCIN(6) = '0') THEN PortCOutRegD (7) <= '1'; -- Set OBFA when ACKA goes low ELSE PortCOutRegD (7) <= PortCOutRegQ (7); END IF; ELSE PortCOutRegD (7) <= PortCOutRegQ (7); END IF; ELSIF (ModeA(1) = '1') THEN -- Mode 2 IF ( PortCOutLd (7) = '0' AND PortCOverride = '1') THEN PortCOutRegD (7) <= DIN(0); -- Load from bit set/reset ELSE IF (RisePortAWrite = '1') THEN -- Reset OBFA on rising edge of write strobe PortCOutRegD (7) <= '0'; ELSIF (PCIN(6) = '0') THEN -- Set OBFA when ACKA goes low PortCOutRegD (7) <= '1'; ELSE PortCOutRegD (7) <= PortCOutRegQ (7); END IF; END IF; ELSE PortCOutRegD (7) <= PortCOutRegQ (7); END IF; END PROCESS; -- Process for Port C output register PortCOutRegSyncProc: PROCESS ( RESET, CLK ) BEGIN IF ( RESET = '1') THEN PortCoutRegQ <= "00000000"; ELSIF ( CLK'EVENT and CLK = '1') THEN PortCoutRegQ <= PortCOutRegD; END IF; END PROCESS; -- Process for edge detect registers EdgeDetectSyncProc: PROCESS ( RESET, CLK ) BEGIN IF ( RESET = '1') THEN RisePortAWriteQ <= '0'; RisePortBWriteQ <= '0'; RisePortAReadQ <= '0'; RisePortBReadQ <= '0'; RisePCIN6Q <= '0'; RisePCIN4Q <= '0'; RisePCIN2Q <= '0'; ELSIF ( CLK'EVENT and CLK = '1') THEN RisePortAWriteQ <= PortAWrite; RisePortBWriteQ <= PortBWrite; RisePortAReadQ <= PortARead; RisePortBReadQ <= PortBRead; RisePCIN6Q <= PCIN(6); RisePCIN4Q <= PCIN(4); RisePCIN2Q <= PCIN(2);

43

A(1:0) DOUT(7:0)

CLK PAEN

DIN(7:0) PAOUT(7:0)

PAIN(7:0) PBEN

PBIN(7:0) PBOUT(7:0)

PCIN(7:0) PCEN(7:0)

RESET PCOUT(7:0)

nCS

nRD

nWR

a8255

END IF; END PROCESS; RisePortAWrite <= PortAWrite AND NOT RisePortAWriteQ; RisePortBWrite <= PortBWrite AND NOT RisePortBWriteQ; RisePortARead <= PortARead AND NOT RisePortAReadQ; RisePortBRead <= PortBRead AND NOT RisePortBReadQ; RisePCIN6 <= PCIN(6) AND NOT RisePCIN6Q; RisePCIN4 <= PCIN(4) AND NOT RisePCIN4Q; RisePCIN2 <= PCIN(2) AND NOT RisePCIN2Q; END rtl; 5.2.3.8. Listing koda čipa 8255 LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY a8255 IS PORT(RESET : IN std_logic; CLK : IN std_logic; nCS : IN std_logic; nRD : IN std_logic; nWR : IN std_logic; A : IN std_logic_vector (1 DOWNTO 0); DIN : IN std_logic_vector (7 DOWNTO 0); PAIN : IN std_logic_vector (7 DOWNTO 0); PBIN : IN std_logic_vector (7 DOWNTO 0); PCIN : IN std_logic_vector (7 DOWNTO 0); DOUT : OUT std_logic_vector (7 DOWNTO 0); PAOUT : OUT std_logic_vector (7 DOWNTO 0); PAEN : OUT std_logic; PBOUT : OUT std_logic_vector (7 DOWNTO 0); PBEN : OUT std_logic; PCOUT : OUT std_logic_vector (7 DOWNTO 0); Slika5.29: Čip 8255 PCEN : OUT std_logic_vector (7 DOWNTO 0) ); END a8255; ARCHITECTURE structure OF a8255 IS SIGNAL DOUTSelect : std_logic_vector(2 DOWNTO 0); SIGNAL ControlReg : std_logic_vector(7 DOWNTO 0); SIGNAL PortAOutLd : std_logic; SIGNAL PortBOutLd : std_logic; SIGNAL PortCOverride : std_logic; SIGNAL PortCOutLd : std_logic_vector (7 DOWNTO 0); SIGNAL PortAInReg : std_logic_vector (7 DOWNTO 0); SIGNAL PortBInReg : std_logic_vector (7 DOWNTO 0); SIGNAL PortARead : std_logic; SIGNAL PortBRead : std_logic; SIGNAL PortAWrite : std_logic; SIGNAL PortBWrite : std_logic; SIGNAL PortCStatus : std_logic_vector (7 DOWNTO 0); SIGNAL CompositePortCStatus : std_logic_vector (7 DOWNTO 0); COMPONENT dout_mux PORT(DOUTSelect : IN std_logic_vector (2 DOWNTO 0); ControlReg : IN std_logic_vector (7 DOWNTO 0); PortAInReg : IN std_logic_vector (7 DOWNTO 0); PAIN : IN std_logic_vector (7 DOWNTO 0); PortBInReg : IN std_logic_vector (7 DOWNTO 0); PBIN : IN std_logic_vector (7 DOWNTO 0); PortCStatus : IN std_logic_vector (7 DOWNTO 0); DOUT : OUT std_logic_vector(7 DOWNTO 0)); END COMPONENT; COMPONENT cntl_log PORT(RESET : IN std_logic; CLK : IN std_logic;

44

nCS : IN std_logic; nRD : IN std_logic; nWR : IN std_logic; A : IN std_logic_vector (1 DOWNTO 0); DIN : IN std_logic_vector(7 DOWNTO 0); PCIN : IN std_logic_vector(7 DOWNTO 0); PAEN : OUT std_logic; PBEN : OUT std_logic; PCEN : OUT std_logic_vector (7 DOWNTO 0); DOUTSelect : OUT std_logic_vector (2 DOWNTO 0); ControlReg : OUT std_logic_vector (7 DOWNTO 0); PortARead : OUT std_logic; PortBRead : OUT std_logic; PortAWrite : OUT std_logic; PortBWrite : OUT std_logic; PortAOutLd : OUT std_logic; PortBOutLd : OUT std_logic; PortCOverride : OUT std_logic; PortCOutLd : OUT std_logic_vector (7 DOWNTO 0)); END COMPONENT; COMPONENT portaout PORT(DIN : IN std_logic_vector (7 DOWNTO 0); RESET : IN std_logic; CLK : IN std_logic; PortAOutLd : IN std_logic; PAOUT : OUT std_logic_vector (7 DOWNTO 0)); END COMPONENT; COMPONENT portain PORT(PAIN : IN std_logic_vector (7 DOWNTO 0); RESET : IN std_logic; CLK : IN std_logic; PortAInLd : IN std_logic; PortAInReg : OUT std_logic_vector (7 DOWNTO 0)); END COMPONENT; COMPONENT portbout PORT(DIN : IN std_logic_vector (7 DOWNTO 0); RESET : IN std_logic; CLK : IN std_logic; PortBOutLd : IN std_logic; PBOUT : OUT std_logic_vector (7 DOWNTO 0)); END COMPONENT; COMPONENT portbin PORT(PBIN : IN std_logic_vector (7 DOWNTO 0); RESET : IN std_logic; CLK : IN std_logic; PortBInLd : IN std_logic; PortBInReg : OUT std_logic_vector (7 DOWNTO 0)); END COMPONENT; COMPONENT portcout PORT(RESET : IN std_logic; CLK : IN std_logic; DIN : IN std_logic_vector (7 DOWNTO 0); PCIN : IN std_logic_vector (7 DOWNTO 0); ControlReg : IN std_logic_vector (7 DOWNTO 0); PortARead : IN std_logic; PortBRead : IN std_logic; PortAWrite : IN std_logic; PortBWrite : IN std_logic; PortCOverride : IN std_logic; PortCOutLd : IN std_logic_vector (7 DOWNTO 0); PortCStatus : OUT std_logic_vector (7 DOWNTO 0); PCOUT : OUT std_logic_vector (7 DOWNTO 0)); END COMPONENT; BEGIN CompositePortCStatus <= PCIN(7) &

45

PortCStatus(6) & PCIN(5) & PortCStatus(4) & PCIN(3) & PortCStatus(2) & PCIN(1) & PCIN(0); I_dout_mux : dout_mux PORT MAP(DOUTSelect => DOUTSelect, ControlReg => ControlReg, PortAInReg => PortAInReg, PAIN => PAIN, PortBInReg => PortBInReg, PBIN => PBIN, PortCStatus => CompositePortCStatus, DOUT => DOUT ); I_cntl_log : cntl_log PORT MAP(RESET => RESET , CLK => CLK, nCS => nCS , nRD => nRD, nWR => nWR, A => A, DIN => DIN, PCIN => PCIN , PAEN => PAEN, PBEN => PBEN, PCEN => PCEN, DOUTSelect => DOUTSelect, ControlReg => ControlReg, PortARead => PortARead, PortBRead => PortBRead, PortAWrite => PortAWrite, PortBWrite => PortBWrite, PortAOutLd => PortAOutLd , PortBOutLd => PortBOutLd, PortCOverride => PortCOverride, PortCOutLd => PortCOutLd); I_portaout : portaout PORT MAP(DIN => DIN, RESET => RESET, CLK => CLK, PortAOutLd => PortAOutLd, PAOUT => PAOUT); I_portain : portain PORT MAP(PAIN => PAIN, RESET => RESET, CLK => CLK, PortAInLd => PCIN (4) , PortAInReg => PortAInReg); I_portbout : portbout PORT MAP(DIN => DIN, RESET => RESET, CLK => CLK, PortBOutLd => PortBOutLd, PBOUT => PBOUT ); I_portbin : portbin PORT MAP(PBIN => PBIN, RESET => RESET, CLK => CLK, PortBInLd => PCIN (2) , PortBInReg => PortBInReg); I_portcout : portcout PORT MAP(RESET => RESET,

46

PADDR(31:0)

PCLK

PENABLE

PRESET

PSEx

PWRITE

PWDATA(31:0)

PRDATA(31:0)

PAIN(7:0)PBIN(7:0)PCIN(7:0)

PAOUT(7:0)PBOUT(7:0)PCOUT(7:0)

PIA_APB_8255

CLK => CLK, DIN => DIN, PCIN => PCIN, ControlReg => ControlReg, PortARead => PortARead , PortBRead => PortBRead, PortAWrite => PortAWrite , PortBWrite => PortBWrite, PortCOutLd => PortCOutLd , PortCOverride => PortCOverride, PortCStatus => PortCStatus, PCOUT => PCOUT ); END structure;

5.2.4 Listing koda čipa PIA-APB-8255 library IEEE; use IEEE.std_logic_1164.all; entity PIA_APB_8255 is port(PCLK : in STD_LOGIC; PENABLE : in STD_LOGIC; PRESET : in STD_LOGIC; PSELx : in STD_LOGIC; PWRITE : in STD_LOGIC; PADDR : in STD_LOGIC_VECTOR(31 downto 0); PAIN : in STD_LOGIC_VECTOR(7 downto 0); PBIN : in STD_LOGIC_VECTOR(7 downto 0); PCIN : in STD_LOGIC_VECTOR(7 downto 0); PWDATA : in STD_LOGIC_VECTOR(31 downto 0); PAOUT : out STD_LOGIC_VECTOR(7 downto 0); PBOUT : out STD_LOGIC_VECTOR(7 downto 0); PCOUT : out STD_LOGIC_VECTOR(7 downto 0); PRDATA : out STD_LOGIC_VECTOR(31 downto 0)); end PIA_APB_8255; architecture PIA_APB_8255 of PIA_APB_8255 is component a8255 port (A : in STD_LOGIC_VECTOR(1 downto 0); CLK : in STD_LOGIC; DIN : in STD_LOGIC_VECTOR(7 downto 0); PAIN : in STD_LOGIC_VECTOR(7 downto 0); PBIN : in STD_LOGIC_VECTOR(7 downto 0); Slika5.30: PIA-APB-8255 PCIN : in STD_LOGIC_VECTOR(7 downto 0); RESET : in STD_LOGIC; nCS : in STD_LOGIC; nRD : in STD_LOGIC; nWR : in STD_LOGIC; DOUT : out STD_LOGIC_VECTOR(7 downto 0); PAEN : out STD_LOGIC; PAOUT : out STD_LOGIC_VECTOR(7 downto 0); PBEN : out STD_LOGIC; PBOUT : out STD_LOGIC_VECTOR(7 downto 0); PCEN : out STD_LOGIC_VECTOR(7 downto 0); PCOUT : out STD_LOGIC_VECTOR(7 downto 0)); end component; component APB_bridge port (DOUT : in STD_LOGIC_VECTOR(7 downto 0); PADDR : in STD_LOGIC_VECTOR(31 downto 0); PCLK : in STD_LOGIC; PENABLE : in STD_LOGIC; PRESET : in STD_LOGIC; PSELx : in STD_LOGIC; PWDATA : in STD_LOGIC_VECTOR(31 downto 0);

47

PWRITE : in STD_LOGIC; DIN : out STD_LOGIC_VECTOR(7 downto 0); PRDATA : out STD_LOGIC_VECTOR(31 downto 0); RESET : out STD_LOGIC; nCS : out STD_LOGIC; nRD : inout STD_LOGIC; nWR : inout STD_LOGIC); end component; signal NET2616 : STD_LOGIC; signal NET2622 : STD_LOGIC; signal NET2628 : STD_LOGIC; signal NET2634 : STD_LOGIC; signal BUS2610 : STD_LOGIC_VECTOR (7 downto 0); signal BUS2640 : STD_LOGIC_VECTOR (7 downto 0); begin U1 : APB_bridge port map(DIN => BUS2610, DOUT => BUS2640, PADDR => PADDR, PCLK => PCLK, PENABLE => PENABLE, PRDATA => PRDATA, PRESET => PRESET, PSELx => PSELx, PWDATA => PWDATA, PWRITE => PWRITE, RESET => NET2616, nCS => NET2622, nRD => NET2628, nWR => NET2634); U2 : a8255 port map(A(0) => PADDR(0), A(1) => PADDR(1), CLK => PCLK, DIN => BUS2610, DOUT => BUS2640, PAIN => PAIN, PAOUT => PAOUT, PBIN => PBIN, PBOUT => PBOUT, PCIN => PCIN, PCOUT => PCOUT, RESET => NET2616, nCS => NET2622, nRD => NET2628, nWR => NET2634); end PIA_APB_8255;

48

6. TESTIRANJE RADA čipa PIA-APB-8255

U cilju provere ispravnosti rada dizajna, napisan je TestBench program i izvršena je simulacija rada kola. Sledi listing Test-bench programa: library ieee; use ieee.std_logic_1164.all; entity pia_apb_8255_tb is end pia_apb_8255_tb; architecture TB_ARCHITECTURE of pia_apb_8255_tb is component pia_apb_8255 port( PCLK : in std_logic; PENABLE : in std_logic; PRESET : in std_logic; PSELx : in std_logic; PWRITE : in std_logic; PADDR : in std_logic_vector(31 downto 0); PAIN : in std_logic_vector(7 downto 0); PBIN : in std_logic_vector(7 downto 0); PCIN : in std_logic_vector(7 downto 0); PWDATA : in std_logic_vector(31 downto 0); PAOUT : out std_logic_vector(7 downto 0); PBOUT : out std_logic_vector(7 downto 0); PCOUT : out std_logic_vector(7 downto 0); PRDATA : out std_logic_vector(31 downto 0) ); end component; entity signal PCLK : std_logic; signal PENABLE : std_logic; signal PRESET : std_logic; signal PSELx : std_logic; signal PWRITE : std_logic; signal PADDR : std_logic_vector(31 downto 0); signal PAIN : std_logic_vector(7 downto 0); signal PBIN : std_logic_vector(7 downto 0); signal PCIN : std_logic_vector(7 downto 0); signal PWDATA : std_logic_vector(31 downto 0); signal PAOUT : std_logic_vector(7 downto 0); signal PBOUT : std_logic_vector(7 downto 0); signal PCOUT : std_logic_vector(7 downto 0); signal PRDATA : std_logic_vector(31 downto 0); begin UUT : pia_apb_8255 port map (PCLK => PCLK, PENABLE => PENABLE, PRESET => PRESET, PSELx => PSELx, PWRITE => PWRITE, PADDR => PADDR, PAIN => PAIN, PBIN => PBIN, PCIN => PCIN, PWDATA => PWDATA, PAOUT => PAOUT, PBOUT => PBOUT, PCOUT => PCOUT, PRDATA => PRDATA);

49

-- Add your stimulus here ... PCLK <= not PCLK after 20ns; PRESET<='1','0' after 5ns,'1' after 10ns; PSELx <='0','1' after 80ns,'0' after 160ns,'1' after 240ns,'0' after 320ns,'1' after 440ns,'0' after 520ns; PENABLE <='0','1' after 120ns,'0' after 160ns,'1' after 280ns,'0' after 320ns,'1' after 480ns,'0' after 520ns; PWRITE <='0', '1' after 80ns,'0' after 160ns,'1' after 240ns,'0' after 320ns,'0' after 440ns,'0' after 520ns; PADDR<="00000000000000001001000000000000","00000000000000001001000000000011" after 50ns,"00000000000000001001000000000000" after 200ns,"00000000000000001001000000000010" after 440ns; PWDATA<="00000000000000000000000010001001","00000000000000000000000000001010" after 190ns; PAIN<="00000001"; PBIN<="00011010"; PCIN<="00000000","00000111" after 450ns; end TB_ARCHITECTURE; configuration TESTBENCH_FOR_pia_apb_8255 of pia_apb_8255_tb is for TB_ARCHITECTURE for UUT : pia_apb_8255 use entity work.pia_apb_8255(pia_apb_8255); end for; end for; end TESTBENCH_FOR_pia_apb_8255; Prethodni listing test – bencha najbolje pokriva sve situacije koje se mogu javiti tokom rada. Sve to možemo videti na vremenskom dijagramu koji simulira rad opisanog čipa PIA-APB-8255. Sa ovog dijagrama, dat na slici 6.1, može se uočiti funkcionisanje sistema.

Slika6.1: Vremenski dijagram rada čipa PIA-APB-8255

50

7. IMPLEMENTACIJA čipa PIA-APB-8255 Sintezu i implementaciju smo izvršili u programskom paketu XILINX ISE 6.3, firme XILINX. Ovaj programski paket namenjen je za razvoj aplikacija baziranih na njihovim CPLD i FPGA kolima. Prilikom implementacije čipa PIA-APB-8255 iskorišćeno je FPGA kolo iz XILINX-ove familije SPARTAN2, device 2S50PQ208-6. To je kuciste PQ208, što znači daposeduje 208 pinova. Morali smo da iskoristimo ovo kućiste jer čip koji implementiramo zahteva 174 pina. Upotrebljeno je iako nije bilo potrebe za tolikim brojem pinova, jer je to najmanje pakovanje koje poseduje ova familija. Na slici 7.1 prikazana je šema sinteze čipa PIA-APB-8255 na najvišem nivou, koju je izgenerisao program Xilinx ECS. Na šemi se mogu uočiti osnovni blokovi od kojih se čip sastoji.

Slika 7.1: Šema sinteze čipa PIA-APB-8255 Programom se može analizirati svaki blok ponaosob do nivoa samih gejtova. Na slici 7.2 je data šema sinteze bloka čipa PIA-APB-8255, APB-bridge:

Slika 7.2: Šema sinteze APB-bridge Na slici 7.3 šema sinteze čipa 8255:

51

Slika 7.3: Šema sinteze čipa 8255 Nakon toga prešlo se na samu implementaciju kola na konkretnom FPGA kolu. Naredni listing nam pokazuje dobijene rezultate: Using target part "2s50pq208-6". Removing unused or disabled logic... Running cover... Running directed packing...

52

Running delay-based LUT packing... Running related packing... Design Summary -------------- Number of errors: 0 Number of warnings: 5 Logic Utilization: Number of Slice Flip Flops: 27 out of 1,536 1% Number of 4 input LUTs: 148 out of 1,536 9% Logic Distribution: Number of occupied Slices: 85 out of 768 11% Number of Slices containing only related logic: 85 out of 85 100% Number of Slices containing unrelated logic: 0 out of 85 0% *See NOTES below for an explanation of the effects of unrelated logic Total Number of 4 input LUTs: 148 out of 1,536 9% Number of bonded IOBs: 102 out of 140 72% IOB Flip Flops: 35 Number of GCLKs: 1 out of 4 25% Number of GCLKIOBs: 1 out of 4 25% Total equivalent gate count for design: 1,483 Na osnovu dobijenih podataka, što se vidi iz prethodnog listinga, bitno je da se na kraju vidi da je implemetnirano kolo zauzelo 1483 ekvivalentnih gejtova. Treba istaći da je maksimalna radna frekvencija kola 213.4 MHz. Na slikama 7.4 i 7.5 data je unutrašnja struktura koja je dobijena nakon implementacije kola gde se vide zauzeti blokovi unutar kola. Slika 7.4 nam prikazuje sam razmeštaj ćelija gde možemo videti i koji pinovi u kolu su iskorišćeni. Na slici se vidi da izvodi kola nisu grupisani, to je da bi se postiglo približno isto kašnjenje veza do svih pinova.

Slika 7.4: Šema zauzetosti ćelija kola

53

Izgled povezanosti samih veza prikazan je na slici 7.5:

Slika 7.5: Šema veza ćelija u kolu Na slici 7.6 prikazan raspored pinova na FPGA kolu:

Slika 7.6: Raspored pinova

54

8. ZADATAK Proveriti ispravnost rada čipa PIA-APB-8255 na sledeći način: 8.1 Zadatak 1

1. Pokrenuti program Active-HDL čija se ikonica nalazi na Desktop-u; 2. Otvoriti dizajn PIA_APB_8255; 3. Otvoriti listing TestBench-a, pia_apb_8255_TB.vhd, koji se nalazi u folder-u

TestBench (segment 1. na slici 8.1); 4. Promeniti vrednosti ulaza PADDR koji je dat u dizajnu, umesto postojeće vrednosti

(segment 2. na slici 8.1); 5. Izvršiti kompajliranje pritiskom na uokvirenu ikonicu (segment 3. na slici 8.1); 6. Podesiti Top level entitet na pia_apb_8255_tb.vhd (segment 4. na slici 8.1);

Slika8.1:Otvaranje dizajna i upisivanje vrednosti 7. Otvoriti New Waveform (segment 5. na slici 8.1); 8. Dodati signale (segment 6. na slici 8.2); 9. Podesiti vreme simulacije na 500 ns ili više ako je potrebno (segment 7. na slici 8.2); 10. Pokrenuti simulaciju pritiskom na uokvirenu ikonicu (segment 8. na slici 8.2); 11. Po završetku simulacije može biti potrebno da se vremenski dijagram uveća ili umanji

radi bolje preglednosti. Komande za uveličavanje i umanjivanje su uokvirene (segment 9. na slici 8.2);

55

12. Uporediti dobijeni vremenski dijagram sa ispravnim radom dizajna (vremenski dijagram na slici 8.3);

Slika8.2: Pokretanje simulacije

Slika8.3: Vremenski dijagram rada kola 13. Odštampati dobijeni vremenski dijagram.

56

Grupa 1: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 2: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 3: Objasniti razliku: ______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 4: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 5: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

57

Grupa 6: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ 8.2. Zadatak 2 1. Pokrenuti program Active-HDL čija se ikonica nalazi na Desktop-u; 2. Otvoriti dizajn PIA_APB_8255; 3. Otvoriti listing TestBench-a, pia_apb_8255_TB.vhd, koji se nalazi u folder-u TestBench (segment 1. na slici 8.1); 4. Staviti vrednosti ulaza PADDR na prvobitan ispravni rad; 5. Promeniti vrednosti i trajanja signala PSELx.Povećati ili smanjiti vremenska trajanja; 6. Izvršiti kompajliranje pritiskom na uokvirenu ikonicu (segment 3. na slici 8.1); 7. Podesiti Top level entitet na pia_apb_8255_tb.vhd (segment 4. na slici 8.1); 8. Otvoriti New Waveform (segment 5. na slici 8.1); 9. Dodati signale (segment 6. na slici 8.2); 10. Podesiti vreme simulacije na 500 ns ili više ako je potrebno (segment7.na slici 8.2); 11. Pokrenuti simulaciju pritiskom na uokvirenu ikonicu (segment 8. na slici 8.2); 12. Po završetku simulacije može biti potrebno da se vremenski dijagram uveća ili umanji radi bolje preglednosti. Komande za uveličavanje i umanjivanje su uokvirene (segment 9. na slici 8.2); 13. Uporediti dobijeni vremenski dijagram sa ispravnim radom kola (vremenski dijagram na slici 8.3);

14. Odštampati dobijeni vremenski dijagram.

Grupa 1: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

58

Grupa 2: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 3: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 4: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 5: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 6: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

59

8.3. Zadatak 3 1. Pokrenuti program Active-HDL čija se ikonica nalazi na Desktop-u; 2. Otvoriti dizajn PIA_APB_8255; 3. Otvoriti listing TestBench-a, pia_apb_8255_TB.vhd, koji se nalazi u folder-u TestBench (segment 1. na slici 8.1); 4. Staviti vrednosti signala PSELx na prvobitan ispravni rad; 5. Promeniti vrednosti i trajanja signala PENABLE.Povećati ili smanjiti vremenska trajanja; 6. Izvršiti kompajliranje pritiskom na uokvirenu ikonicu (segment 3. na slici 8.1); 7. Podesiti Top level entitet na pia_apb_8255_tb.vhd (segment 4. na slici 8.1); 8. Otvoriti New Waveform (segment 5. na slici 8.1); 9. Dodati signale (segment 6. na slici 8.2); 10. Podesiti vreme simulacije na 500 ns ili više ako je potrebno (segment 7. na slici 8.2); 11. Pokrenuti simulaciju pritiskom na uokvirenu ikonicu (segment 8. na slici 8.2); 12. Po završetku simulacije može biti potrebno da se vremenski dijagram uveća ili umanji radi bolje preglednosti. Komande za uveličavanje i umanjivanje su uokvirene (segment 9. na slici 8.2);

13. Uporediti dobijeni vremenski dijagram sa ispravnim radom kola (vremenski dijagram na slici 8.3);

14. Odštampati dobijeni vremenski dijagram. Grupa 1: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 2: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

60

Grupa 3: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 4: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 5: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 6: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ 8.4. Zadatak 4 1. Pokrenuti program Active-HDL čija se ikonica nalazi na Desktop-u; 2. Otvoriti dizajn PIA_APB_8255; 3. Otvoriti listing TestBench-a, pia_apb_8255_TB.vhd, koji se nalazi u folder-u TestBench (segment 1. na slici 8.1); 4. Staviti vrednosti signala PENABLE na prvobitan ispravni rad;

61

5. Promeniti vrednosti i trajanja signala PWRITE.Povećati ili smanjiti vremenska trajanja; 6. Izvršiti kompajliranje pritiskom na uokvirenu ikonicu (segment 3. na slici 8.1); 7. Podesiti Top level entitet na pia_apb_8255_tb.vhd (segment 4. na slici 8.1); 8. Otvoriti New Waveform (segment 5. na slici 8.1); 9. Dodati signale (segment 6. na slici 8.2); 10. Podesiti vreme simulacije na 500 ns ili više ako je potrebno (segment 7.na slici 8.2); 11. Pokrenuti simulaciju pritiskom na uokvirenu ikonicu (segment 8. na slici 8.2); 12. Po završetku simulacije može biti potrebno da se vremenski dijagram uveća ili umanji radi bolje preglednosti. Komande za uveličavanje i umanjivanje su uokvirene (segment 9. na slici 8.2);

13.Uporediti dobijeni vremenski dijagram sa ispravnim radom kola (vremenski dijagram na slici 8.3);

14. Odštampati dobijeni vremenski dijagram. Grupa 1: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 2: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 3: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

62

Grupa 4: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 5: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Grupa 6: Objasniti razliku: ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

63

9. LITERATURA

1. Mile K. Stojčev, Branislav D. Petrović ARHITEKTURE I PROGRAMIRANJE µRAČUNARSKIH SISTEMA ZASNOVANIH NA FAMILIJI PROCESORA 80x86

I izdanje,Elektronski fakultet, Niš, 1999. 2. AMBA Specification (Rev 2.0), Copyright ARM Limited, 1999. 3. INTEL 8255 CMOS Programmable Peripheral Interface, June 1998.

4. INTEL 8255 Programmable Peripheral Interface datasheet, Septembre 1993.

5. a8255 Programmable Peripheral Interface Adapter,ver 1,ALTERA September 1996. 6.PCI 8255 Dataheet, http://www.pci8255.net, 2005. 7. Altera Microperipheral Reference Design Version 0802, Copyright © 2002 Altera Corporation, a8255.vhd, http://www.altera.com