Digitális technikai alapáramkörök labormérése
1
Copyright-oldal Óbudai Egyetem - Neumann János informatikai Kar
C ONTENTS 1
Bevezetés
3
2
A mérés során használt eszközök 2.1 Spartan 3 FPGA család . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Kapcsolómátrix . . . . . . . . . . . . . . . . . . . . . . . . . .
4 4 5
2.2 3
4
2.1.2 2.1.3 2.1.4 2.1.5 Digilent
Órajel . . . . . . . . . . . . . . . . Konfigurálható logikai blokk . . . Lookup table (LUT) . . . . . . . . Er˝oforrások . . . . . . . . . . . . . BasysTM 2 Spartan-3E FPGA Board
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Xilinx ISE fejleszto˝ rendszer 3.1 Els˝o mintafeladat elkészítése – kapcsolási rajz alapú tervezés . . . 3.1.1 Beállítások . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.2 Kapcsolási rajz készítése . . . . . . . . . . . . . . . . . . . 3.1.3 Alkatrészek . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.4 Jel és busz vezetékek . . . . . . . . . . . . . . . . . . . . . 3.1.5 A kapcsolás ellen˝orzése szimulációval . . . . . . . . . . . 3.2 Makró hozzáadása meglév˝o projekthez . . . . . . . . . . . . . . . . 3.2.1 Példa kapcsolási rajz alapú makró készítésére . . . . . . 3.2.2 Kapcsolási rajz alapú saját makró módosítása . . . . . . 3.2.3 Kapcsolási rajz alapú saját makró hozzáadása projekthez 3.2.4 VHDL alapú saját makró hozzáadása projekthez . . . . . 3.3 Kapcsolási rajz elkészítése a makró használatával . . . . . . . . . . 3.4 A kapcsolás hardveres ellen˝orzése . . . . . . . . . . . . . . . . . . . 3.4.1 A konfigurációs fájl letöltése az FPGA-ba . . . . . . . . . 3.5 Az órajel bemenet prellmentesítése . . . . . . . . . . . . . . . . . . . Egyszeru˝ kombinációs hálózatok 4.1 Multiplexer, demultiplexer . . . . . . . . . . . . . . . 4.1.1 Multiplexer . . . . . . . . . . . . . . . . . . 4.1.2 Latch . . . . . . . . . . . . . . . . . . . . . . 4.1.3 Korrekt flip-flop órajel engedélyezés . . . 4.1.4 Demultiplexer . . . . . . . . . . . . . . . . 4.1.5 Laborfeladat . . . . . . . . . . . . . . . . . 4.2 Kódolók . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 Komparátorok (Magnitude Comparators) 4.2.2 Enkóderek . . . . . . . . . . . . . . . . . . 2
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . .
5 5 6 7 8
. . . . . . . . . . . . . . .
10 12 13 15 17 17 19 24 24 26 27 28 28 30 32 33
. . . . . . . . .
34 35 35 38 39 40 41 42 42 43
3
4.3
4.4
4.5
5
4.2.3 Prioritáskódoló (priority encoder) . . . 4.2.4 Dekóder . . . . . . . . . . . . . . . . . . 4.2.5 Laborfeladat . . . . . . . . . . . . . . . Összeadó áramkör . . . . . . . . . . . . . . . . . . 4.3.1 Teljes összeadó (full adder) . . . . . . 4.3.2 BCD összeadó . . . . . . . . . . . . . . 4.3.3 Laborfeladat . . . . . . . . . . . . . . . Aritmetikai és Logikai Egység (ALU) . . . . . . 4.4.1 ALU blokkvázlata . . . . . . . . . . . . 4.4.2 ALU muveletvégz˝ ˝ o egységei . . . . . . 4.4.3 Laborfeladat . . . . . . . . . . . . . . . Shift regiszter . . . . . . . . . . . . . . . . . . . . . 4.5.1 Léptet˝o regiszterek . . . . . . . . . . . 4.5.2 Egyéb alkalmazások shift-regiszterrel
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
Négybites CPU tervezés 5.1 Bevezetés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.1 Számítógépes architektúrák . . . . . . . . . . . . . . 5.1.2 Utasításkészlet . . . . . . . . . . . . . . . . . . . . . . 5.1.3 A labormérés alatt megépítend˝o CPU architektúrája 5.1.4 A CPU utasításainak felépítése . . . . . . . . . . . . 5.1.5 Laborfeladat . . . . . . . . . . . . . . . . . . . . . . . 5.2 Órajel forrás, programszámláló, utasításregiszter, kijelzés . . . 5.3 ALU és regiszterek . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 Kimeneti regiszterek, memória, ugró utasítás . . . . . . . . . . 5.5 Programkód írás . . . . . . . . . . . . . . . . . . . . . . . . . . .
References
1
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . .
44 45 46 47 48 51 52 53 53 53 55 56 56 57
. . . . . . . . . .
61 61 61 61 62 63 67 68 70 72 75 77
B EVEZETÉS
A könyv bevezetést kíván nyújtani a digitális áramkörök tervezésébe, célja a tervezési lehet˝oségek minél szélesebb körben való ismertetése. Manapság több módja is van az áramkörtervezésnek. A következ˝okben az FPGA alapú digitális áramkörtervezéshez szükséges ismeretekkel és eszközökkel ismerkedhetünk meg. Ismertetésre kerül a XILINX cég SPARTAN 3 FPGA családja és a hozzá kiadott fejleszt˝oi környezet. Valamint egy Basys 2 nevu˝ FPGA fejleszt˝oi kártya, aminek segítségével a megszerzett tudás kipróbálására is lehet˝oség nyílik. A tananyag végén egy összetettebb projekt keretén belül, négybites CPU tervezésére és szimulációjára kerül sor.
4
2
A MÉRÉS SORÁN HASZNÁLT ESZKÖZÖK
A következ˝o részben az FPGA alapú tervezés alapjainak elsajátításához szükséges eszközök és szoftverek kerülnek ismertetésre. Természetesen a felsoroltak csak egy lehet˝oség, sok gyártó sokféle FPGA családot forgalmaz a különböz˝o feladatok megoldására, valamint a tervez˝oszoftverekb˝ol is igen sokféle létezik. 2.1
Spartan 3 FPGA család
A Xilinx cég a 90 nm-es technológiával készült Spartan-3 FPGA családot olcsó, közepes bonyolultságú digitális áramkörök megvalósítására tervezte. A felhasználó a családon belül rengeteg különböz˝o méretu, ˝ tulajdonságú és tokozású eszköz közül választhat igényeinek és az adott alkalmazásnak megfelel˝oen. A Spartan-3 család öt alapvet˝o programozható funkcionális elemb˝ol épül fel (1. ábra): •
•
• •
•
Konfigurálható logikai blokkok (CLB-k): Logikai függvények és tároló funkció megvalósítására alkalmas elem. Input/Output blokkok (IOB-k): A be- és kimenetek (a külvilág) valamint a bels˝o logika elemek közötti adatáramlást valósítják meg. Lehet˝ové teszik a kétirányú és háromállapotú (tri-state) interfészek valamint különböz˝o szabványú és feszültségszintu˝ digitális jelek illesztését. Blokk RAM: Adattárolásra alkalmas memória elem. Szorzó blokk (Multiplier): Két 18-bites bináris szám gyors összeszorzására alkalmas egység. Digitális órajel menedzser blokk (DCM): Az órajelek kezelésére szolgáló programozható egység. Szolgáltatásai: késleltetés, frekvencia szorzás-osztás, fázistolás.
Fig. 1. A Spartan-3 család belso˝ felépítése [2]
5
2.1.1
Kapcsolómátrix
Az FPGA-n belül egy sur ˝ u˝ vezetékhálózat biztosítja az egyes elemek közötti kapcsolatot. A funkcionális blokkok programozható összeköttetéseken (kapcsoló mátrix) keresztül kapcsolódnak a vezetékhálózathoz. Az FPGA programja (konfigurációja) tulajdonképpen a funkcionális blokkok vezérl˝ojeleit valamint a kapcsolómátrixok állapotát határozza meg, vagyis, hogy a bels˝o vezetékhálózaton keresztül mely egységek kerüljenek egymással összeköttetésbe. A programot az FPGA-n belül statikus konfigurációs memória tárolja, amelyet a tápegység bekapcsolása után a kívánt logikai funkciónak megfelel˝o adattal fel kell tölteni. A feltöltés történhet küls˝o PROM-ból, küls˝o mikroprocesszoron keresztül, vagy JTAG interfészen keresztül. A konfigurációs adat el˝oállítását, a konfigurációs memóriák feltöltését, valamint a JTAG interfészen történ˝o programozást a gyártó saját Xilinx ISE programcsomagja támogatja. 2.1.2
Órajel
Az órajelek FPGA-n belüli elosztásáért speciális bels˝o vezetékhálózat felel˝os, amely a flip-flopok és egyéb órajeles muködés ˝ u˝ egységek órajel bemeneteihez kapcsolódik. Az órajel hálózathoz speciális bemeneti blokk (GCLK) és meghajtó-multiplexer (BUFGMUX) tartozik. A hálózatra kerül˝o órajelet a multiplexer választja ki a GCLK bemenetr˝ol vagy a DCM valamelyik kimenetér˝ol (2. ábra).
Fig. 2. Az órajel hálózat részei [1] Az FPGA-n belül megengedett, hogy egy flip-flop egy általános felhasználású bemenetr˝ol vagy bels˝o vezetékr˝ol kapja az órajelét, a nagy-sebességu˝ szinkron muködés ˝ biztosítása érdekében azonban ez nem javasolt. 2.1.3
Konfigurálható logikai blokk
A konfigurálható logikai blokkok (CLB-k) az els˝odleges épít˝o felépített kombinációs vagy szinkron sorrendi hálózatoknak. összeköttetésben lév˝o szeletekb˝ol (SLICE) épülnek fel (3. ábra). A szeletek, típustól függ˝oen logikai és memória funkciót logikai funkciót (SLICEL) láthatnak el (4. ábra). Mindkét szelet összetev˝oket: • Két 4-bemenetu ˝ LUT • Két tároló elem
elemei az FPGA-ban A CLB-k egymással (SLICEM) vagy csak tartalmazza az alábbi
6
Fig. 3. A szeletek elhelyezkedése a CLB-ben [2] • •
Két multiplexer Carry és aritmetikai logika
A SLICEM szeletek további összetev˝oi: • Két 16x1 bit RAM blokk • két 16-bites shift-regiszter
˝ [2] Fig. 4. A szeletek összetevoi
2.1.4
Lookup table (LUT)
A számítógép (s˝ot számológép) el˝otti id˝okben a bonyolultabb függvényeket egy könyv alakban kinyomtatott táblázat segítségével számították ki, ahol a függvény értékei bizonyos felbontásban és pontossággal voltak megadva, és a táblázatban megadott értékek között lineáris interpolációval számoltak (logaritmustáblák, trigonometrikus függvények, stb.). A megfelel˝o értékek kikeresése sokkal gyorsabb volt, mint a függvény valamilyen képlettel történ˝o közelít˝o kiszámítása. Természetesen, valakiknek el˝oz˝oleg ki kellett számolni a táblázat értékeit, sokszor sok-sok éves munkával. A számítástechnikában a használata azon alapul, hogy egy el˝ore feltöltött tárolóból
7
rendszerint sokkal gyorsabban lehet az adatokat kiolvasni, mint azokat valamilyen algoritmussal kiszámolni. A fixpontos és lebeg˝opontos aritmetikákban is használnak LUT-ot a kezdeti pontosságú érték el˝oállítására, a végs˝o pontosságot már számítással érik el. Az FPGA CLB blokkjában a LUT az adott logikai függvény értékeit tartalmazza, amit a fordítóprogram a logikai rajz alapján állít el˝o és tárol el benne. 4 bemeneti változó esetén az összes lehetséges logikai függvény száma 64K. A következ˝o példa az alábbi háromváltozós logikai függvény Look-Up-Table lel történ˝o megvalósítását láthatjuk. ¯ C¯ + AB ¯ C¯ + AB C¯ Y (A, B, C) = AB 0 1 2 A függvény igazságtáblázata: 3 4 5 6 7
A B 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1
C Y 0 0 1 0 0 1 1 0 0 1 1 0 0 1 1 0
Fig. 5. LUT
˝ 2.1.5 Eroforrások Az FPGA er˝oforrásai (CLB, IOB, DCM, RAM és a szorzó) közötti kapcsolatot a kapcsoló mátrixok biztosítják (6. ábra). A kapcsoló mátrixok a bels˝o vezetékhálózatra
8
kapcsolódnak, ami horizontálisan és vertikálisan az egész FPGA-t lefedi, így – bizonyos megkötésekkel – bármely elem bármelyik másikkal összeköttetésbe hozható (6. ábra, 7. ábra).
Fig. 6. Kapcsoló mátrix összeköttetések [2]
Fig. 7. A részegységek FPGA-n belüli tömbszerkezete [2] A Spartan-3 családról további információ a gyártó honlapján http://www.xilinx.com/support/documentation/spartan-3.htm 2.2
érhet˝o
el:
Digilent BasysTM 2 Spartan-3E FPGA Board
A mérés során a SPARTAN-3E típust tartalmazó demonstrációs panelt (Digilent BasysTM 2 Spartan-3E FPGA Board) fogjuk használni (8. ábra). A fejleszt˝okártya paraméterei a következ˝oek: • Xilinx Spartan-3E FPGA, 100000 kapu • 18-bites szorzók, 72Kbits dual-port block RAM • USB 2 port az FPGA konfigurálásához (ingyenes Adept 2.0 szoftverrel) • XCF02 Platform Flash ROM az FPGA konfiguráció tárolásához • Programozható frekvenciájú oszcillátor (25, 50, and 100 MHz), egy további foglalat kvarc- oszcillátorhoz
9
• •
•
Stabilizált tápegységek (1.2V, 2.5V, and 3.3V) 8 LED, 4 db. hétszegmenses kijelz˝o, 4 nyomógomb, 8 kapcsoló, PS/2 port, VGA port Felhasználói I/O csatlakozók
Fig. 8. Digilent BasysTM 2 Spartan-3E FPGA panel [3] A panelt a hozzá tartozó USB kábel segítségével csatlakoztatjuk a PC-hez. Bár lehet˝oség van küls˝o tápforrás bekötésére, a tápellátás és a programozás is az USB kábelen keresztül történik. A panel be- és kikapcsolása az SW8 jelu˝ kapcsolóval végezhet˝o. A programozásához szükséges (.bit kiterjesztésu) ˝ konfigurációs állományt – amelyet a kés˝obbiekben ismertetett Xilinx ISE fejleszt˝o rendszerrel állítunk el˝o – a panel gyártója által ingyenesen hozzáférhet˝o Adept segédprogram segítségével tölthetjük le közvetlenül az FPGA-ba, vagy a hozzá kapcsolódó küls˝o konfigurációs PROM-ba (Platform Flash). A program kezel˝oi felületét az alábbi ábrán látható (9. ábra). A közvetlenül az FPGA-ba töltött konfiguráció a tápfeszültség kikapcsolása után törl˝odik, a következ˝o bekapcsolást követ˝oen az FPGA a Platform Flash-ben tárolt állomány szerint konfigurálódik fel automatikusan. A négy nyomógomb bemenet alapállapotban logikai „0” (L) szinten van. Logikai „1” szint (H) a gomb megnyomásával adható a bemenetekre. A nyolc kapcsoló konstans „L” vagy „H” szintet ad a hozzájuk tartozó bemenetekre. A nyolc LED a hozzájuk tartozó kimenetek logikai „1” szintje esetén világítanak (10. ábra). A négy hétszegmenses kijelz˝o szegmensei és a tizedes pont multiplexált módban vezérelhet˝ok. A CA, CB, CC, CD, CE, CF, CG és DP jelekkel a szegmenseket és a tizedes pontot kapcsolhatjuk ki/be. Az AN0, AN1, AN2 és AN3 jelekkel választhatjuk ki, hogy a négy kijelz˝o közül melyikre vonatkoznak a szegmenseket vezérl˝o jelek. A vezérl˝o és kiválasztó jelek megfelel˝oen gyors egymás utáni kapcsolgatásával négydigites számokat jelezhetünk ki.
10
Fig. 9. Az Adept program konfigurációs felülete
˝ [3] Fig. 10. Kapcsolók, nyomógombok és hétszegmenses kijelzok
3
X ILINX ISE FEJLESZTO˝ RENDSZER
A Xilinx ISE WebPack (Integrated Software Environment – integrált szoftverkörnyezet) a Xilinx cég FPGA-ihoz és CPLD-ihez kifejlesztett ingyenes szoftvere, amely az internetr˝ol,
11
a cég weboldaláról szabadon letölthet˝o. A fejleszt˝orendszer tartalmazza mindazon elemeket, amelyek kapcsolási rajz alapú és hardverleíró nyelv alapú fejlesztéshez szükségesek. A mérési segédlet bevezetést kíván nyújtani az áramkörök tervezésébe, célja a tervezési lehet˝oségek minél szélesebb körben való ismertetése. Elmélyülésre – a korlátozott laborid˝o miatt – saját munkával, illetve a konzultációk alatt van lehet˝oség. A mérések sikeres elvégzését nagymértékben segíti a mérést el˝okészít˝o el˝oadás anyagának elsajátítása. Az ISE tervez˝o rendszer alrendszereinek, részeinek muködését ˝ a Project Navigator szoftver, az ISE keretprogramja fogja össze (11. ábra).
Fig. 11. A tervezés menete [1] A tervez˝o az elképzeléseit, terveit: •
•
beviheti kapcsolási rajz (Schematic) formájában, a kapcsolási rajz készít˝o és beviteli program segítségével. beviheti hardver leíró nyelven. Ezt a HDL editor rész támogatja. A támogatott nyelvek: Verilog és VHDL. A rendszer sok mintaleírást is tartalmaz, úgynevezett sablonok (template) formájában.
A bevitel utáni az ellen˝orzéssel megbizonyosodunk arról, hogy a terv szerinti áramkör muködése ˝ megfelel-e a feladat specifikációjának. Az ellen˝orzés általában szimulációval történik. A WebPACK rendszer szimulátora a Xilinx ISE Simulator. A szimulációs
12
vizsgálathoz a modellt muködtetni, ˝ "gerjeszteni" kell, azaz a modell bemeneteire megfelel˝oen változó jeleket kell adni. Ez az úgynevezett tesztvektorok sorozatának ráadásával történik. A tesztvektorokat a tervez˝o HDL leírással adhatja meg (testbench). A régebbi ISE verziókban rendelkezésre álló grafikus felület az újabb verziókban már nem érhet˝o el. Ha a tervet rendben találtuk, akkor következhet a szintézis, amit jelen esetben a Xilinx Synthesis Technology (XST) alrendszer végez, amely ugyancsak az ISE része. A szintézer a HDL leírásból el˝oállít egy minimalizált és optimalizált huzalozási listát, amely az adott FPGA primitíveket (LUT, FF. . . ) és a köztük lev˝o kapcsolatokat tartalmazza. Ezt követik a Translate, a Map és a Place&Route fázisok (összefoglalva: implementáció). A Translate a huzalozási listákból és a felhasználói megkötésekb˝ol (constraint-ek) generál egy fájlt, a Map leképezi ezt az adott FPGA primitív-készletére, végül a Place&Route elhelyezi a primitíveket az eszközben és kialakítja a köztük lev˝o fizikai huzalozást. A programozói fájl el˝oállítását követ˝o programozást normál esetben ("égetés") az IMPACT alrendszer vezérli. A mérések során használt demonstrációs panelhez a panel gyártója saját programozói felületet biztosít. 3.1
Elso˝ mintafeladat elkészítése – kapcsolási rajz alapú tervezés
A Xilinx ISE WebPack segítségével hozzunk létre egy egyszeru˝ példaprogramot a gyakorlópanelen található LED-ek, kapcsolók és nyomógombok tesztelésére! A program ikonjára kattintva, vagy a Start menüb˝ol indítsuk el a Xilinx ISE Design Suite ISE Design Tools 32-bit Project Navigator-t. A mintapélda projekt létrehozásához a File menüben válasszuk a New Project parancsot, és töltsük ki a párbeszédablakot az alábbi módon (12. ábra). Az ISE fejleszt˝o környezetben kerülni kell a fájlnevekben és a könyvtárszerkezetben a különleges karaktereket (ékezet, szóköz, vessz˝o, pont, stb). A fájlok, könyvtárak lenevezésekor csak az angol ABC betüit használjuk! •
• •
A Project Name legyen "proba". A rendszer automatikusan létrehoz egy ilyen nevu˝ mappát a Project Location mez˝oben megadott elérési útnak megfelel˝oen. Az ISE a projekthez tartozó állományokat ebbe a mappába fogja menteni. Top-Level Module Type mez˝oben a legördül˝o ablakból válasszuk a Schematic-ot. A Next gombra kattintás után megjelenik a New Project Wizard, a Project Settings táblába írhatunk be paramétereket, válasszuk a próbapanelhez tartozó alábbi értékeket: – Family: Spartan3E – Device: XC3S100E – Package: CP132 – Speed : -4 – Synthesis Tool: XST (VHDL/Verilog) – Simulator: ISim (VHDL/Verilog)
A többi paramétert most nem kell változtatnunk. A Next gombra kattintva megjelennek a készül˝o projekt adatai. A Finish gombra kattintva elkészül a még üres
13
Fig. 12. Új projekt létrehozása próba projekt. Új modul létrehozásához a Project menüben kattintsunk a New Source parancsra, és válasszuk a Schematic típusú forrást. A létrehozandó modul neve legyen "teszt", amit a File name ablakba kell beírni, és jelöljük ki az Add to Project opciót. A Next majd Finish gombra kattintás után egy üres kapcsolási rajz szerkeszt˝o jelenik meg, amiben elkészíthetjük a próbaalkalmazást. A View menüpont Panel alpontjában kijelölhetjük, hogy a szerkeszt˝o ablakban mely segédablakok jelenjenek meg. Egyel˝ore hagyjuk meg az alapértelmezés szerinti beállításokat. A jobb oldalon a rajzlap, a bal oldalon a Select Options jelenik meg. Itt a rajzolással kapcsolatos néhány paramétert állíthatunk be. Általában a képerny˝o az alábbi részekre van osztva (13. ábra, 14. ábra). Alul a Consol látható, ahol a parancsok szöveges formában jelennek meg. 3.1.1 Beállítások A projekt elkészítése után célszeru˝ néhány beállítást elvégezni. A "Designe" fül, "Generate Programing File" elemére jobb gombbal kattintsunk és válasszuk ki a "Process Properties" opciót. El˝oször állítsuk be, hogy az FPGA nem használt portjai alapértelmezetten bemenetek legyenek (15. ábra), így például az olyan nem használt I/O portok, ahol a hétszegmenses kijelz˝o helyezkedik el, biztosan nem fog vezérlést kapni. A következ˝o lépésben állítsuk be az "FPGA Start-Up Clock" opciót "JTAG Clock-ra"
14
Fig. 13. Új projekt létrehozása
Fig. 14. A Project Navigator részei 16. ábra. Ennek letöltéskor van szerepe.
15
Fig. 15. Bit file - nem használt bemenetek
Fig. 16. Bit file - órajel forrás 3.1.2
Kapcsolási rajz készítése
A tesztalkalmazásban egy T-tárolókból felépített 4-bites bináris számláló kapcsolást valósítunk meg. A számláló kimeneti bitjei a panelen található LED-eket hajtják meg, így ellen˝orizhet˝o a kapcsolás muködése. ˝ A számlálót a Basys 2 FPGA fejleszt˝o kártyán található SW0 kapcsolóval engedélyezzük, a BTN0 nyomógombbal pedig nullázhatjuk. A segédablakok közül válasszuk a Symbols fület, ennek segítségével helyezhetjük el a kapcsolási rajzban használt alkatrészeket (17. ábra), felül a kategória, alatta a hozzátartozó egyik elem kiválasztásával: •
FTCE: Engedélyezhet˝o T-flip-flop (4 db, a négybites számlálóhoz)
•
AND3, AND2: három, ill. két bemenetu˝ ’ÉS’ kapuk (a bemeneti kombinációs hálózathoz) PULLUP: Pozitív tápfeszültség (logikai magas jelszint (H)) PULLDOWN: Földpont (logikai alacsony jelszint (L)) CONSTANT: Jelnek vagy busznak konstans értékadás. IBUF: Egybites bemeneti buffer, csak bemeneti port után helyezhet˝o el (több bites változatai: IBUF4, IBUF8, IBUF16) OBUF: Egybites kimeneti buffer, csak kimeneti port elé helyezhet˝o el (több bites változatai: OBUF4, OBUF8, OBUF16)
• • • •
•
Az alkatrészek megkeresése történhet kategóriák (Categories) alapján, de használhatjuk a névkeres˝ot is (Symbol Name Filter). Az alkatrészek forgatását az Orientation mez˝oben
16
állíthatjuk be.
Fig. 17. A Symbols segédablak és a használt alkatrészek Az alkatrészek huzalozásakor a következ˝o parancsokat, ill. parancsikonokat fogjuk használni: ): Kiválasztás/mozgatás.
•
Select (
•
Add Wire (
•
Add Net Name (
•
Rename Selected Bus (
•
Add Bus Tap (
•
Add I/O Marker (
•
Add Symbol (
): Vezeték hozzáadása. ): Vezetékezés elnevezése. ): A kijelölt busz átnevezése.
): Buszos vonalra csatlakozás hozzáadása. ): Be-, kimeneti pontok hozzáadása.
): Szimbólum (alkatrész, könyvtári, vagy saját) hozzáadása.
Mindegyik muvelethez ˝ a bal alsó ablakban (Process/Options) találunk beállítási lehet˝oségeket, illetve muveleteket. ˝ A kényelmesebb szerkesztés érdekében megnövelhetjük a lap méretét is. Ezt a rajz területen jobb kattintásra felugró Object
17
Properties parancs kiválasztásával tehetjük meg. A megjelen˝o ablakban a Sheets sort kiválasztva módosíthatjuk a lap méretét (Size). 3.1.3 Alkatrészek Alkatrészeket (logikai kapuk, kombinációs -és sorrendi alapáramkörök, ...) a "Symbols" segédablak segítségével kereshetünk és rakhatjuk le a rajzterületre. A Symbols segédablak megnyitása el˝ott egy kapcsolási rajz fájlt kell készíteni és megnyitni. Utána ) a segédablakok között már megtalálható a Symbols fül, vagy az "Add Symbol" ( ikonra kattintva jeleníthet˝o meg. A Categories ablakban az áramkör kategóriát lehet kiválasztani, majd alatta a Symbols ablakban a konkrét elemek jelennek meg. Alkatrész nevére bal gombbal kell kattintani, majd az egeret a rajlapra mozgatva megjelenik a kiválasztott elem. Egy ismételt bal kattintás hatására a rajlapra felkerül a kiválasztott áramköri elem. A Symbols name filter segítségével az alkatrészek között lehet szurni. ˝ Például az összes 4 bemenetu˝ ÉS kapu kilistázásához írjuk be a következ˝ot: "and4". A rajzterületen elhelyezett alkatrészek orientációját kétféleképpen is meg lehet változtatni. A Symbols ablakon, az alkatrész kijelölése után, az "Orientation" legördül˝o menüben adható meg a kívánt orientáció. Kés˝obb, a rajzterületen elhelyezett alkatrész forgatásához el˝oször ki kell jelölni az elemet, majd a CTRL+L és CTRL+R billentyukombinációk ˝ használatával lehet elforgatni a kijelölt elemet. 3.1.4 Jel és busz vezetékek Az egyes alkatrészek közötti kapcsolatokat jelvezetékek és/vagy buszvezetékek segítségével lehet kialakítani. Az "Add Wire" ( ) ikonra kattintás után a bal egérgomb lenyomásával lehet elkezdeni a vezeték rajzolását. A vezeték rajzolásnál ügyeljünk arra, hogy az egeret pontosan az alkatrész lábának végére mozgassuk és onnan kezdjük meg a rajzolást. A bal egérgomb lenyomásakor töréspontot vihetünk a rajzolt vezetékbe. A rajzolás akkor ér véget, ha egy másik alkatrész lábára csatlakozunk, vagy megnyomjuk az ESC gombot. Az így megrajzolt vezetéket az ISE automatikusan elnevezi, valamint alapértelmezetten jelvezetékként kezeli. Az "Add Net Name" ( ) gombra kattintva lehet˝oség van a vezeték nevének megváltoztatására. A bal alsó ablakban az Options fülnél a Name sorba írhatjuk a vezeték nevét. A 18. ábra legfels˝o kapcsolási rajz részén láthatunk példát jelvezetékekre (a0, a1, ....). A vezetékek neveire a kapcsolási rajz átláthatósága érdekében hivatkozhatunk is, ha két vagy több vezetéket ugyanúgy (y) nevezünk el, az olyan, mintha fizikailag összehuzaloztuk volna o˝ ket. Ha kijelölünk egy jel-, vagy buszvezetéket, bal oldalon megjelenik az "Options" fül. Ezt kiválasztva lehet˝oség van a "When you click on a branch" opcióval megadni, hogy ha egy vezetékre kattintunk, az egész jelvezetéket (Select the entire branch), vagy csak egy darabját (Select the line segment) jelölje ki a program.
18
Az ábra 2. és 3. kapcsolásán a buszvezetékekre láthatunk példát. Az "Add net name" ikonra kattintva adhatjuk meg, hogy egy vezeték buszvezeték legyen. Buszvezetékeket a kapcsolási rajzokban az összetartozó vezetékek ábrázolása érdekében használunk. Az elnevezés formája a következ˝o (18. ábra): a(3:0). El˝oször megadjuk a busz nevét, majd zárójelben a legnagyobb és kett˝osponttal elválasztva a legkisebb helyi értékét. A busz vezetékre "Bus Tap" rajzlét helyezve buszleágazást tudunk készíteni. A busz leágazás után szükséges a jelvezeték elnevezése, pl a(3). A "Bus Tap" rajzjelek a muködés ˝ szempontjából nem fontosak, azok elhagyhatóak.
Fig. 18. Busz vezeték Az el˝oz˝o példa esetében (17. ábra) a tárolók q(0), q(1), q(2) és q(3) kimenetei a speciális q(7:0) un. busz vezetékre csatlakoznak. A buszok, illetve leágazásaik elnevezése utal arra, hogy adott buszon belül melyik vonalra (bitre) csatlakozunk. A kapcsolásán a q(7:0) jel egy 8 bites busz, melyre az adott helyértéku˝ bitvezeték (q(0). . . q(7)) buszcsatlakozáson (Bus Tap) keresztül kapcsolódik. A kapcsolás be- és kimeneti jelei I/O buffer-eken keresztül kapcsolódnak a külvilágot reprezentáló I/O Marker-ekhez. A CLK, ENABLE és CLEAR bemenetekre IBUF, a LED(7:0) kimenetekre pedig OBUF (itt egy 8 bites OBUF8) elemeket helyezünk el, ez a szabályos megoldás. Az automatikus buffer-elhelyezés miatt a kapcsolás ezek nélkül is implementálható, de a be- és kimenetek nincsenek optimálisan bufferelve. Az IBUF és OBUF elemekkel számos beállítás mellett pl. a logikai családhoz,
19
illetve a logikai szintekhez való illesztés valósítható meg. A rajz ellen˝orzése az alsó Processes területen kibontva a Design Utilities-t, a Check Design Rules-ra kattintva fut le, ami ha jó, egy zöld pipa jelenik meg mellette. Ugyanezt tehetjük meg a Tools > Check Schematic paranccsal. 3.1.5
˝ A kapcsolás ellenorzése szimulációval
Teszteljük le a kapcsolás muködését ˝ szimulációval! Ehhez létre kell hoznunk egy ellen˝orzési környezetet (testbench, tesztelési környezet) melyben az egységet muködtet˝ ˝ o gerjeszt˝o jeleket és jelformákat definiáljuk. Régebbi ISE verziókban lehet˝oség volt a gerjeszt˝o-jelek grafikus felületen történ˝o megadására, az újabb verziókból azonban kikerült ez a funkció, így az egyetlen lehet˝oség a HDL nyelvu˝ leírás. A gyakorlatokon nem cél a HDL nyelvek ismertetése, ezért a tesztkörnyezetet leíró forrást nem kell elkészíteni, a kész forrásokat csak a projekthez kell adni. Szimulációs fájl készítése Az elkészült projekthez szimulációs fájlt a "Design/Simulation" ablakban, az "Add New Source" opcióval lehet hozzáadni (19. ábra). Fontos hogy minden port nevet adjunk meg a kapcsolási rajzon a szimulációs fájl elkészítése elott ˝ és mindent mentsünk el, mert a program az aktuális port neveket használja fel a sablon elkészítésére.
Fig. 19. Szimulációs fájl hozzáadása a projekthez Ezután a "VHDL Test Bench" opciót válasszuk és adjuk meg a tesztfájl nevét (teszt_tb). A "Next" gomb lenyomása után a program megkérdezi melyik forrásfájlhoz készül a tesztfájl. Itt válasszuk a f˝o kapcsolási rajzot (példánkban: teszt.sch), majd válasszuk a "Next" gombot, végül kattintsunk a "Finish" gombra. Az ISE által generált sablon fájl tartalmazza a ki- és bemeneti portokat és a VHDL fájl keretét. Ha mindent jól csináltunk a következ˝o VHDL fájlt kapjuk eredményül:
20
1 3 5 7 9
−− Vhdl t e s t bench c r e a t e d from s c h e m a t i c C: \ temp\proba\ t e s z t . sch − Wed May 23 0 9 : 0 1 : 0 4 2012 −− LIBRARY i e e e ; USE i e e e . s t d _ l o g i c _ 1 1 6 4 . ALL ; USE i e e e . numeric_std . ALL ; LIBRARY UNISIM ; USE UNISIM . Vcomponents . ALL ; ENTITY t e s z t _ t e s z t _ s c h _ t b I S END t e s z t _ t e s z t _ s c h _ t b ; ARCHITECTURE b e h a v i o r a l OF t e s z t _ t e s z t _ s c h _ t b I S
11 13 15 17 19 21
COMPONENT t e s z t PORT( ENABLE : CLK : CLEAR : LED : END COMPONENT;
IN IN IN OUT
SIGNAL SIGNAL SIGNAL SIGNAL
STD_LOGIC ; STD_LOGIC ; STD_LOGIC ; STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ;
ENABLE : CLK : CLEAR : LED :
STD_LOGIC ; STD_LOGIC ; STD_LOGIC ; STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ) ;
23
BEGIN 25 27 29 31 33 35 37
UUT: t e s z t PORT MAP( ENABLE => ENABLE, CLK => CLK, CLEAR => CLEAR, LED => LED ); −− ∗∗∗ T e s t Bench − User Defined S e c t i o n ∗∗∗ t b : PROCESS BEGIN WAIT ; −− w i l l wait f o r e v e r END PROCESS ; −− ∗∗∗ End T e s t Bench − User Defined S e c t i o n ∗∗∗
39
END;
../sections/src/codeTestBrench1.vhd A vizsgálójelek el˝oállításához az alapértelmezett tesztfájlt módosítani kell. Az els˝o kiegészítéssel adjuk hozzá a szimulációhoz a számlálót muködtet˝ ˝ o 1MHz-es órajelet (CLK). A kódba a constantclk_period : time := 1us; sor beszúrásával definiálásra kerül az órajel periódusideje és a clk_process : processbegin. . . .end process-el az órajel el˝oállításra kerül. Amennyiben nem CLK az órajel port neve, módosítani kell az általunk használt névre. A fenti kiegészítéseket elvégezve, a szimuláció során a CLK bemeneti porton egy 1 us periódusideju˝ órajel jelenik meg.
21
60
−− Vhdl t e s t bench c r e a t e d from s c h e m a t i c C: \ temp\proba\ t e s z t . sch − Wed May 23 0 9 : 0 1 : 0 4 LIBRARY i e e e ; USE i e e e . s t d _ l o g i c _ 1 1 6 4 . ALL ; USE i e e e . numeric_std . ALL ; LIBRARY UNISIM ; USE UNISIM . Vcomponents . ALL ; ENTITY t e s z t _ t e s z t _ s c h _ t b I S END t e s z t _ t e s z t _ s c h _ t b ; ARCHITECTURE b e h a v i o r a l OF t e s z t _ t e s z t _ s c h _ t b I S COMPONENT t e s z t PORT( ENABLE : IN STD_LOGIC ; CLK : IN STD_LOGIC ; CLEAR : IN STD_LOGIC ; LED : OUT STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ) ; END COMPONENT; SIGNAL ENABLE : STD_LOGIC ; SIGNAL CLK : STD_LOGIC ; SIGNAL CLEAR : STD_LOGIC ; SIGNAL LED : STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ; −− o r a j e l : −−############################################################## c o n s t a n t c l k _ p e r i o d : time : = 1 us ; BEGIN UUT: t e s z t PORT MAP( ENABLE => ENABLE, CLK => CLK, CLEAR => CLEAR, LED => LED ); −− o r a j e l : −−############################################################## clk_process : process begin CLK <= ’ 0 ’ ; wait f o r c l k _ p e r i o d / 2 ; CLK <= ’ 1 ’ ; wait f o r c l k _ p e r i o d / 2 ; end p r o c e s s ; −−############################################################## −− szim . : t b : PROCESS BEGIN −−ENABLE j e l n e k l o g i k a i ’ 0 ’ es −−CLEAR j e l n e k l o g i k a i ’ 1 ’ e r t e k adasa 2 . 3 us i d o r e ENABLE <= ’ 0 ’ ; CLEAR <= ’ 1 ’ ; wait f o r 2 . 3 us ; −−ENABLE= ’ 1 ’ es CLEAR= ’ 0 ’ 1 0 . 5 us i d o r e ENABLE <= ’ 1 ’ ; CLEAR <= ’ 0 ’ ; wait f o r 1 0 . 5 us ; CLEAR <= ’ 1 ’ ; wait f o r 3 us ; CLEAR <= ’ 0 ’ ; wait f o r 1 0 . 6 us ; ENABLE <= ’ 0 ’ ; wait f o r 4 . 3 us ; ENABLE <= ’ 1 ’ ; WAIT ; −− s t o p END PROCESS ;
62
END;
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58
../sections/src/codeTestBrench2.vhd A jeleknek értéket a "<=" értékadó utasítással lehet adni (példa: ENABLE<=’1’). Buszvezetékeknél értékadás binárisan történik (példa egy négybites busz értékadására: INB<="1011"). A jelek beállítása után a wait for paranccsal adhatjuk meg mennyi ideig maradjanak meg a beállított értékek. Lehet˝oség van kész VHDL testbench-et hozzáadni a projekthez. A "valami_tb.vhd" fájlt ami tartalmazza a szimulációs környezetet, célszeru˝ a projekt könyvtárába másolni, majd a Project menü Add Source parancsával adhatjuk
22
hozzá a projekthez. A megjelen˝o Adding Source Files ablakban az Association alatt a Simulation kell, hogy legyen. A szimuláció elindítása a korábban ismertetett módon történik. A szimuláció elindításához a Design segédablakban jelöljük be a Simulation rádiógombot, majd jelöljük ki a megjeleno˝ "teszt_tb.vhd" fájlt. Kibontva a Isim Simulatort az alsó segédablakban, megjelenik a Simulate Behavioral Model parancs, amivel elindíthatjuk az ISE szimulátorát. A szimuláció lépéseit alul, a Console területen láthatjuk. A szimuláció során a CLK órajel, az ENABLE és a CLEAR vezérl˝o jelek a VHDL forrásban megadottak szerint változnak. A szimuláció eredménye egy új ablakban fog megjelenni (20. ábra, a képen látható eredmény a Zoom to Full View ikonra kattintás után látható). A Zoom In, Zoom Out, Zoom to Full View ikonokkal (20. ábra, piros téglalappal jelölt rész) tudjuk a megjelenített id˝otartományt módosítani. A Restart ikon újraindítja a szimulátort, törli a megjelenített id˝odiagramot, Run for the time specified on toolbar ikon lenyomásakor a szimuláció a beállított id˝oegységnyit lép el˝ore.
Fig. 20. A szimuláció eredménye a Xilinx ISE Simulator hullámforma ablakában. Az egyes jelnevekre a jobb gombbal kattintva lehet˝oség van a kijelzés formátumát megváltoztatni. A led[7:0] kimenet esetén ezt (jobb gomb, Radix / Hexadecimal) hexadecimálisra állítva máris könnyebben ellen˝orizhet˝o a helyes muködés. ˝ A szimuláció során lehet˝oség van rá, hogy különböz˝o jeleket (logikailag független jelek vagy egy buszban szerepl˝o néhány jel) hozzáadjunk egy virtuális buszhoz. A
23
Fig. 21. Kijelzés formátuma 22. ábra szemlélteti, hogy a 7 bites LED busz els˝o négy helyi értékéb˝ol hogyan készíthetünk virtuális buszt. A jeleket a CTRL gomb nyomva tartásával lehet kijelölni (ábrán kékkel jelölve), majd a kijelölt jelekre jobb gombbal kattintva válaszuk a "New Virtual Bus" opciót. Az új busznak nevet is adhatunk. A példa során 3 darab virtuális buszt hoztunk létre, amiknél a radixot különbözu˝ módon állítottuk be: vbus_udec (el˝ojeltelen számábrázolás), vbus_sdec (el˝ojeles számábrázolás), vbus_hex (hexadecimális számábrázolással).
Fig. 22. Virtuális busz Sokszor nagyon hasznos a modulok bels˝o jeleit vizsgálni, ennek elvégzéséhez nem szükséges ezeket a jeleket kivezetni a modulból, a szimulátorban egyszeruen ˝ hozzáadhatjuk o˝ ket a Wave ablakhoz. A szimuláció a View>Panels> Instance and Process Name bal oldali ablakában megjelenik a szimulációs hierarchia, amelyben megtalálható (UUT – unit under test – néven) a tesztelés alatt álló kapcsolási rajz modul. A View>Panels>Objects ablakban látjuk a modul összes jelét, melyek közül a vizsgálni kívánt jel egyszeru˝ drag-and-drop módszerrel adható hozzá a Wave ablakhoz (23. ábra). Ezután már csak a szimuláció újraindítására van szükség ahhoz, hogy a jelek értékeit figyelemmel tudjuk követni (Kék, enter-szeru˝ gomb a fels˝o menüben, majd a homokórás play-szeru˝ gomb, amelyet nyomkodva, a mellette beállított értéknek megfelel˝o id˝ot haladunk a szimulációban). Lehet˝oség van a szimulációs beállítások mentésére, ezt a File>Save paranccsal tehetjük meg. Az elmentett "*.wcfg" fájlt a szimulátorban megnyitva, visszaállítható a korábbi konfiguráció. A szimulátor bezárásakor, ha nincs elmentve a szimulátor konfigurációja,
24
Fig. 23. További jelek hozzáadása a program megkérdezi, hogy szeretnénk e menteni a beállításokat. 3.2
Makró hozzáadása meglévo˝ projekthez
Minden az ISE kapcsolási rajz szerkeszt˝ojében használt makróhoz két fájl tartozik. Az egyik egy szimbólumfájl (*.sym), ami leírja a makró kapcsolási rajzon való megjelenését. A másik a muködést ˝ leíró fájl, ami lehet kapcsolási rajz (*.sch), vagy HDL (*.vhd) alapú. Ha makrót akarunk a rajzból készíteni kés˝obbi felhasználásra, akkor a portok be- és kimenetekre történ˝o hozzáadása után, a Design ablak alsó Processes részén kibontva a Design Utilities menü-pontot rá kell kattintanunk a Create Schematic Symbol-ra. Az eddigi rajz neve alatt egy új elem jelenik meg, amit egy másik rajzra le is tehetünk. Ha rögtön makrót akarunk készíteni, akkor más az eljárás. A Project Navigator-ban, kiválasztva a Project > New Source menüpontot, megjelenik a New Source Wizard ablak. A forrás típusaként kiválasztjuk a rajzot (Schematic), megadjuk a fájl nevét és helyét majd a Next és Finish megnyomása után hozzáadódik a projekthez és megnyílik az adott nevu˝ üres rajz. Ezután i/o portokat kell a rajzhoz hozzáadnunk a Tools > Create I/O Markers segítségével. A megjelen˝o dialógus dobozba be kell írni sorban, vessz˝ovel elválasztva, az összes bemeneti, kimeneti és esetleg kétirányú port nevét. Az üres rajzon megjelennek a portok, ezután hozzárajzoljuk a makró többi részét. Ha kész, el kell mentenünk. 3.2.1
Példa kapcsolási rajz alapú makró készítésére
A következ˝o példa során a korábbi négybites számlálót felhasználva készítjük el a makrónkat, így kés˝obb lehet˝oség nyílik rá, hogy a számlálót önálló szimbólumként
25
kezeljük. A 24. ábra szerint módosítsuk az el˝oz˝o feladatban szerepl˝o számlálót. A korábbi kapcsolási rajzhoz képest csak a kimeneti busz szélessége változott, valamint a ki és bemeneti portokon csak IO markerek találhatóak. Az IO markereket a "ADD" I/O Marker" nevu˝ gombbal lehet hozzáadni. IBUF-ra és OBUF-ra csak olyan portok esetén van szükség ami a külvilággal tart kapcsolatot. Az I/O markerekhez kapcsolódó vezeték neve lesz az IO marker neve és ez lesz a makró ki- és bemeneti portjának a nev is. A kapcsolási rajzot kijelölve, megjelenik a "Create Schematic Symbol" opció (24. ábra). Ezt a processt futtatva elkészül a makró (létrejön egy sym kiterjesztésu˝ fájl a kapcsolási rajz mellett).
Fig. 24. Kapcsolási rajz módosítása A fejleszt˝o környezet parancssorában a makró sikeres elkészítését a következ˝o üzenet jelzi: "Process completed successfully". A szimbólumok között ezután már megtalálható a makró szimbólum (25. ábra).
Fig. 25. Elkészült makró kiválasztásaa A makró tartalmát a "View" menü "Push into Symbol" gombjával lehet megtekinteni.
26
El˝otte szükséges kijelölni a makrót, a kapcsolási rajzon! A korábbi teszt.sch fájl most szimbólum fájlként létezik, így szükséges egy új kapcsolási rajz fájl hozzáadása a projekthez, aminek adjuk a teszt_macro.sch nevet (26. ábra). Az új kapcsolási rajz file jelenleg nem "Top Modul", ezért módosítsuk a teszt_macro.sch fájl beállításait top modul szinture ˝ (26. ábra).
Fig. 26. Top modul 3.2.2
Kapcsolási rajz alapú saját makró módosítása
Ha a változtatás nem érinti a makró ki- és bemeneti portjait, akkor a "Push into Symbol" paranccsal megnyitva lehet˝oség van a makró módosítására. A változásokat minden esetben el kell menteni. Amennyiben a változás a makró megjelenésére is kihat, például új portot kell hozzáadni, törölni, vagy port nevet kell változtatni, akkor a következ˝oképpen kell eljárni. Els˝o lépésként meg kell nyitni a makrót tartalmazó sch fájlt. Ezt a "Push into Symbol" paranccsal, vagy a "Design" ablakban a kapcsolási rajzra kétszer kattintva lehet megtenni. Végezzük el a változtatásokat a makró fájlon. A példában a régi rajzot egészítsük ki egy új kimenettel, ami a számláló 15-ös értékét jelzi (27. ábra). A módosítások mentése után a teszt.sch kapcsolási rajz fájlt kijelölve, a "Create Schemetic Symbol" parancs-ra jobb gombbal kattintva a "Process Properties..." opciót kiválasztva engedélyezni kell a létez˝o szimbólumfájl felülírását, úgy hogy az "Owerwrite Existing Symbol" jelöl˝o négyzetet bepipáljuk. A "Run" parancs futtatásával módosul a makró megjelenését leíró szimbólum fájl. Ha valamelyik kapcsolási rajzban használunk egy ilyen makrót, amit módosítottunk, majd a makró megjelenésére kiható változtattatást hajtunk végre, a kapcsolási rajz szerkeszt˝oben
27
Fig. 27. Kimenet "Obsolate Symbols" ablak jelenik meg. Az "Update" paranccsal frissíthetjük a kijelölt objektumra vonatkozó módosításokat (28. ábra).
Fig. 28. Kapcsolási rajz alapú makró módosítása Ha a makró újrafordítása után nem kínálja fel a program a makró szimbólum frissítését, és a kapcsolási rajzon nem is változik meg a makró megjelenése, akkor újra kell indítani az ISE fejleszt˝okörnyezetet (el˝otte mindent mentsünk el!). Az újraindulás után már a módosított szimbólumnak kell megjelennie (29. ábra).
Fig. 29. Módosított szimbólumfájl A szimbólumfájl küls˝o megjelenésén is lehet˝oség van módosítani. A kapcsolási rajzon elhelyezett teszt nevu˝ makró fájlra jobb gombbal kattintva válasszuk a Symbol->Edit Symbol opciót (30. ábra). 3.2.3
Kapcsolási rajz alapú saját makró hozzáadása projekthez
Másoljuk át a makró fájlokat a projektkönyvtárba. A makró megjelenését és muködését ˝ egy azonos nevu˝ *.sym és egy *.sch kiterjesztésu˝ fájl írja le. A *.sch fájlt az „Add Source”
28
Fig. 30. Makró szerkesztés paranccsal a projekthez kell adni. Mivel korábban átmásoltuk a projektkönyvtárunkban kell lennie. Fontos, hogy a fájlok másolása után hajtsuk végre ezt a lépés. Végül a szimbólumok között megjelenik az új makró. Lehet˝oség van a projekthez hozzáadott makró tartalmának megtekintésére. A makró szimbólum kijelölése után a „View” menü „Push into Symbol” gombjára kattintva megjelenik a muködést ˝ leíró fájl. 3.2.4
VHDL alapú saját makró hozzáadása projekthez
Másoljuk át a makró fájlokat a projektkönyvtárba. A makró megjelenését és muködését ˝ egy azonos nevu˝ *.sym és egy *.vhd kiterjesztésu˝ fájl írja le. A *.vhd fájlt az „Add Source” paranccsal a projekthez kell adni. Mivel korábban átmásoltuk a projektkönyvtárunkban kell lennie. Fontos, hogy a fájlok másolása után hajtsuk végre ezt a lépés, mert az ISE ellenkez˝o esetben a *.vhd fájlt felülírhatja egy template fájllal. Végül a szimbólumok között megjelenik az új makró. Lehet˝oség van a projekthez hozzáadott makró tartalmának megtekintésére. A makró szimbólum kijelölése után a „View” menü „Push into Symbol” gombjára kattintva megjelenik a muködést ˝ leíró fájl. 3.3
Kapcsolási rajz elkészítése a makró használatával
Készítsünk egy új kapcsolási rajzot "teszt_macro.sch" néven. A 31. ábra szerint készítsük el a kapcsolási rajzot. Felhasználva a négybites számláló makrót, készíthetünk 8 bites számlálót. Figyeljünk rá, hogy a "teszt_macro.sch" rajz legyen a topmodul (??. ábra). Az áramkör szimulációját hasonló képen végezzük el, mint a 4 bites számláló esetében. A tesztfájl elkészítése után a következ˝o VHDL kódot használjuk fel.
29
Fig. 31. Hierarchikus terv készítése saját modul (teszt) létrehozásával
Fig. 32. 8 bites számláló fájlok
2 4 6 8 10 12 14
LIBRARY i e e e ; USE i e e e . s t d _ l o g i c _ 1 1 6 4 . ALL ; USE i e e e . numeric_std . ALL ; LIBRARY UNISIM ; USE UNISIM . Vcomponents . ALL ; ENTITY t e s z t _ m a c r o _ t e s z t _ m a c r o _ s c h _ t b I S END t e s z t _ m a c r o _ t e s z t _ m a c r o _ s c h _ t b ; ARCHITECTURE b e h a v i o r a l OF t e s z t _ m a c r o _ t e s z t _ m a c r o _ s c h _ t b I S COMPONENT t e s z t _ m a c r o PORT( ENABLE : IN STD_LOGIC ; CLK : IN STD_LOGIC ; CLEAR : IN STD_LOGIC ; LED : OUT STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ) ; END COMPONENT;
16
20
SIGNAL SIGNAL SIGNAL SIGNAL
22
c o n s t a n t c l k _ p e r i o d : time : = 1 us ;
18
24 26 28 30 32
ENABLE CLK : CLEAR : LED :
: STD_LOGIC ; STD_LOGIC ; STD_LOGIC ; STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ;
BEGIN UUT: t e s z t _ m a c r o PORT MAP( ENABLE => ENABLE, CLK => CLK, CLEAR => CLEAR, LED => LED ); clk_process : process begin
30
34 36
CLK <= ’ 0 ’ ; wait f o r c l k _ p e r i o d / 2 ; CLK <= ’ 1 ’ ; wait f o r c l k _ p e r i o d / 2 ; end p r o c e s s ;
38 40 42 44 46 48 50 52 54 56 58
−− ∗∗∗ T e s t Bench − User Defined S e c t i o n ∗∗∗ t b : PROCESS BEGIN ENABLE <= ’ 0 ’ ; CLEAR <= ’ 1 ’ ; wait f o r 4 us ; ENABLE <= ’ 1 ’ ; CLEAR <= ’ 0 ’ ; wait f o r 22 us ; CLEAR <= ’ 1 ’ ; wait f o r 3 us ; CLEAR <= ’ 0 ’ ; wait f o r 1 0 . 6 us ; ENABLE <= ’ 0 ’ ; wait f o r 4 . 3 us ; ENABLE <= ’ 1 ’ ; WAIT ; −− s t o p END PROCESS ; −− ∗∗∗ End T e s t Bench − User Defined S e c t i o n ∗∗∗ END;
../sections/src/codeTestBrench3.vhd A szimuláció lefuttatása után a 33. ábra szerinti eredményt kell kapnunk.
Fig. 33. 8 bites számláló szimulációs eredmény
3.4
˝ A kapcsolás hardveres ellenorzése
Jelöljük be az Implementation rádiógombot a Design panelen. A Project menü Add Source parancsával adjuk hozzá a projekthez a laborok során használt Basys2 fejleszt˝opanel alapértelmezett lábkiosztását és a felhasználói megkötéseket (constraintek) tartalmazó "Basys2_100_250General.ucf" fájlt. A Megnyitás és OK gombok megnyomása után a projektben megjelenik a kiválasztott fájl, amit kett˝os kattintással szerkesztésre meg is nyithatunk (34. ábra). A fájl egyéb – itt nem részletezett – felhasználói megkötések mellett a kapcsolási rajzban használt vezetékek neveit (NET) és a hozzájuk tartozó FPGA IC kivezetések (lábak) összerendeléseit definiálja. A "Basys2_100_250General.ucf" fájl az FPGA összes panelen bekötött kivezetéséhez alapértelmezett bels˝o vezetékneveket rendel. Az alapértelmezett elnevezések segítenek a panelen való tájékozódásnál, azonban nincsenek összhangban a kapcsolási rajzban általunk használt I/O Marker nevekkel, emellett legtöbbjüket nem is használjuk (35. ábra). A helyes muködéshez, ˝ módosítsuk az alapértelmezett ucf fájlt az alábbiak szerint.
31
Fig. 34. A "Basys2_100_250General.ucf" fájl
Fig. 35. UCF
32
NET " c l k " CLOCK_DEDICATED_ROUTE = FALSE ; 2 4 6 8 10
# Pin assignment f o r LEDs NET " Led<7> " LOC = "G1" ; NET " Led<6> " LOC = " P4 " ; NET " Led<5> " LOC = "N4" ; NET " Led<4> " LOC = "N5" ; NET " Led<3> " LOC = " P6 " ; NET " Led<2> " LOC = " P7 " ; NET " Led<1> " LOC = "M11" ; NET " Led<0> " LOC = "M5" ;
#Bank #Bank #Bank #Bank #Bank #Bank #Bank #Bank
= = = = = = = =
3, 2, 2, 2, 2, 3, 2, 2,
Signal Signal Signal Signal Signal Signal Signal Signal
name name name name name name name name
= = = = = = = =
LD7 LD6 LD5 LD4 LD3 LD2 LD1 LD0
12 14 16
# Pin assignment f o r SWs NET " e n a b l e " LOC = " P11 " ; #Bank = 2 , S i g n a l name = SW0 NET " c l k " NET " c l e a r "
LOC = " C11 " ; #Bank = 2 , S i g n a l name = BTN1 LOC = " G12 " ; #Bank = 0 , S i g n a l name = BTN0
../sections/src/codeUcfClk4bit.vhd Ezzel a kapcsolási rajzunk Led(7:0) kimeneteit a panelen található LED-ekhez, az ENABLE bemenetet az SW0 kapcsolóhoz a CLK és CLEAR bemeneteket pedig a BTN1 és BTN0 nyomógombokhoz rendeltük (a buszvezetékek elnevezésében szerepl˝o zárójelek az .ucf-fájlban <> karakterekkel helyettesítend˝ok). Az összes többi nem használt vezetékek definíciót tartalmazó sorokat a # karakterrel alakítsuk megjegyzéssé (comment), vagy töröljük. Mentsük el a változtatásokat. A kapcsolás implementálásához és az FPGA konfigurációs állományának el˝oállításához a Design segédablakban jelöljük ki a "teszt.sch" kapcsolási rajzot. Ennek hatására a Processes ablakban az Implement Design kibontásakor megjelenik a Generate Programming File parancs, amelynek feladata, hogy létrehozza az FPGA-ba letölthet˝o "teszt.bit" állományt. Ez általában elég sokáig tart, a muvelet ˝ lépéseit a Console területen követhetjük. El˝oször a parancs futtatásának eredménye hibaüzenet, amit az Errors ablakban tekinthetünk meg. Mivel a kapcsolásban a tárolók órajele nem dedikált órajel vezetéken keresztül kerül az FPGA-ba, a program figyelmeztet. Mivel esetünkben ez a nem optimális vezetékezés elfogadható, az ucf-fájlban el kell helyeznünk a NET "CLK" CLOCK_DEDICATED_ROUTE = FALSE; kiegészítést. Az újabb Generate Programming File parancs futtatásakor a fenti hibajelzés már csak a Warnings ablakban jelenik meg. Az elkészült konfigurációs állományt ("teszt.bit") a korábban ismertetett Adept program segítségével letölthetjük az FPGA-ba. 3.4.1
A konfigurációs fájl letöltése az FPGA-ba
El˝oször telepíteni kell az Adept kezel˝o programot (jelenleg digilent.adept.system_v2.8.1.exe), ezt még azel˝ott kell megtenni, miel˝ott a tesztkártyát az PC-hez csatlakoztatnánk. Csatlakoztatáskor a Windows észreveszi az új hardvert, engedélyezni kell a driver telepítését. Az Adept indulásakor észreveszi, hogy melyik eszköz van csatlakoztatva. A Config fül kiválasztásával Browse-ra kattintva kikeressük az adott bit kiterjesztésu˝ fájlunkat és bevisszük az FPGA melletti edit box-ba. A Program gombra kattintva megtörténik a letöltés, és a kártyán azt látjuk, ami sikerült.
33
3.5
Az órajel bemenet prellmentesítése
A prellezés (a mechanikusan muköd˝ ˝ o villamos érintkez˝ok egymáson való pattogása) miatt az órajelet szolgáltató BTN1 nyomógomb nem mindig ad rögtön stabil jelet. Rövid ideig egyszeri lenyomás hatására is két állapot között "pereg", ezzel többszöri 0 -> 1 átmenetet adhat a tárolók órajel bemenetére. Ennek a jelenségnek a kiküszöbölésére módosítsuk a kapcsolást a 36. ábra szerint, az ucf-fájlt pedig az alábbiak szerint. 1
NET " c l k " CLOCK_DEDICATED_ROUTE = FALSE ;
3
NET " up " NET "down" #NET " c l k " NET " c l e a r "
5
LOC = "A7" ; LOC = "M4" ; LOC = " C11 " ; OC = " G12 " ;
#Bank #Bank #Bank #Bank
= = = =
1, 0, 2, 0,
Signal Signal Signal Signal
name name name name
= = = =
BTN3 BTN2 BTN1 BTN0
../sections/src/codeUcfClkPrell.vhd Az aszinkron törlés és beállítás (CLR, PRE) bemenetekkel rendelkez˝o FDCP flip-flop az UP bemenetre csatlakozó BTN3 nyomógomb megnyomásával (preset) logikai 1 szintre vált, a DOWN bemenetre csatlakozó BTN2 nyomógomb megnyomásával (clear) pedig logikai 0 szintre vált. Egy teljes órajel periódust (felfutó él - lefutó él) a BTN3 és BTN2 nyomógombok egymás utáni lenyomásával hozhatunk létre.
Fig. 36. 4-bites bináris, szinkron számlaló T-tárolóval, S-R flip-floppal prellmentesített órajellel
34
4
E GYSZER U˝ KOMBINÁCIÓS HÁLÓZATOK
35
4.1 4.1.1
Multiplexer, demultiplexer Multiplexer
A multiplexer egy olyan áramkör, amely több bemenet közül egyet enged tovább a kimenetén, méghozzá azt a bemenetet, amelynek a címe rákerül a címz˝o bemenetre. Ez a leggyakrabban használt kombinációs hálózat. 2 bemenetu˝ multiplexer Legegyszerubb ˝ esetben a cím egybites "select" jel (S), ami két bemenet közül (I0, I1) választ ki egyet (37. ábra, 38. ábra). A két bemenetu˝ multiplexer igazságtáblája a következ˝o: TABLE 1 Egybemenetu˝ multiplexer igazságtáblázata S 0 1
Y I0 I1
Fig. 37. Két bemenetu˝ multiplexer kapcsolási rajza
Fig. 38. Két bemenetu˝ multiplexer logikai rajza A multiplexert legtöbbször bonyolult adatutak kialakítására használják pl. a processzorok ALU-jában. Vannak egyéb alkalmazási, ezek közül el˝oször kett˝ot mutatunk meg. 4 bemenetu˝ multiplexer A multiplexer címbitjeinek eggyel való megnövelése a bemenetek számának a kétszeresét teszi lehet˝ové. Így két címbit esetén kapjuk a 4bemenetu˝ multiplexert (39. ábra, 40. ábra). A négy bemenetu˝ multiplexer igazságtáblája a következ˝o: A nagyobb számú bemenetekkel rendelkez˝o multiplexer tervezése kétféleképpen lehetséges: a megfelel˝o számú kapuból megtervezve, vagy kisebb multiplexerek
36
TABLE 2 Kétbemenetu˝ multiplexer igazságtáblázata S1 0 0 1 1
S0 0 1 0 1
Y I0 I1 I2 I3
Fig. 39. Négy bemenetu˝ multiplexer logikai rajza
Fig. 40. Négy bemenetu˝ multiplexer kapcsolási rajza felhasználásával. Például egy 16 bemenetu˝ multiplexert így is megtervezhetünk. Ez ugyan redundáns a felhasznált kapuk számát illet˝oen, de lehet, hogy az alkatrészkészlet ezt a megoldást teszi alkalmasabbá (41. ábra). A multiplexer lehet˝oséget nyújt look-up table megvalósítására (42. ábra). Az általunk használt FPGA CLB-jében 4-bemenetu˝ LUT található tetsz˝oleges 4-változós logikai függvény el˝oállítására. Ha ezt egy tárolóval oldanák meg, minden egyes CLB-ben egy 64K bites tárolóra lenne szükség az összes logikai függvény el˝oállítására. Ehelyett
37
Fig. 41. 16 bemenetu˝ multiplexer tervezése kisebb multiplexerek felhasználásával pl. egy 16 bites regiszter és egy 16 bemenetu˝ multiplexer elegend˝o. A multiplexer címbitjeire csatlakozik az adott logikai függvény 4 változója. A rajz alapján a szoftver kiszámolja, hogy melyik logikai függvény kell a megvalósításhoz, és a 4 bemenet összes kombinációjának megfelel˝o 16 kimeneti bitet betölti egy 16 bites regiszterbe, amelynek kimenetei csatlakoznak a multiplexer megfelel˝o címzésu˝ bemenetéhez. Látható, hogy egy ilyen megoldás er˝oforrás igénye lényegesen kisebb.
38
Fig. 42. Look-up table megvalósítása multiplexer segítségével 4.1.2 Latch A latch egy olyan tároló elem, amely nem órajelre (élre) muködik, ˝ hanem egy engedélyez˝o jel megléte esetén az áramkör transzparens, azaz átengedi a bemenetén lév˝o jelet, az engedélyez˝o jel megszunésére ˝ az utolsó értéket tárolja. Az alábbi rajzon az engedélyez˝o jel aktív értéke az els˝o esetben magas, a másik esetben alacsony (43. ábra).
Fig. 43. Latch
39
4.1.3
Korrekt flip-flop órajel engedélyezés
Az órajelre muköd˝ ˝ o szinkron hálózatok esetén fontos, hogy az összes tároló egyszerre billenjen, ellenkez˝o esetben rövid id˝ore hazárd állapotok léphetnek fel. Ezenkívül a dinamikus bemeneten a jelnek stabilnak kell lennie bizonyos id˝ovel az órajel felfutása el˝ott és után. Ez az áramkörre jellemz˝o katalógus érték (setup time, hold time). Ha ezek a feltételek nem teljesülnek a flip-flop muködése ˝ bizonytalanná válik, ha például az órajelet kapuzzuk, így plusz késleltetést viszünk bele. Ezért a korrekt megoldást egy multiplexeren áthaladó enable jel biztosítja (44. ábra). az els˝o esetben egy D flip-flop, a másodikban egy T flip-flop esetében. Az els˝o esetben, ha az órajel nincs engedélyezve, az órajelre saját magát írja be újra meg újra, ugyanaz a hatás, mintha nem lenne órajel. A második esetben a bemenetre 0 kerül, így a T flip-flop nem billen.
Fig. 44. Korrekt flip-flop órajel engedélyezés
40
4.1.4
Demultiplexer
A demultiplexer muködése ˝ a multiplexerének a fordítottja. Egy bemenete van, és a címz˝o bemenetek határozzák meg, hogy melyik kimeneten megy ki a jel (45. ábra, 46. ábra). A többi kimenet állapota inaktív. A felhasználási területe f˝oként a számítástechnika.
Fig. 45. Négy kimenetu˝ demultiplexer
Fig. 46. Négy kimenetu˝ demultiplexer kapcsolási rajza
41
4.1.5 Laborfeladat Tervezzen meg egy 8-bemenetu˝ multiplexert. Az adatbemeneteket a Digilent Basys2 kártyán lév˝o SW0-SW7 kapcsolókon lehessen beállítani, a címz˝o bemeneteket a multiplexer bemenetére csatlakozó 3-bites számláló kimenete adja. A számláló órajelét a CLK jel (BT N 0nyomgomb) adja. A helyi értékek megfelelnek a kapcsolók és a számláló kimeneteinek indexének. Végezze el az áramkör szimulációját, és ha jó, fordítsa le, a kapott bit kiterjesztésu˝ fájlt töltse le a Basys2 kártyába, és a kapcsolók és az órajel nyomógomb segítségével próbálja ki az áramkör muködését. ˝ A multiplexer és a számláló ki-bemeneteit a megadott módon társítsa portokhoz (3. táblázat). TABLE 3 Portkiosztás Port név CLK SW(7:0) LED0, LED1, LED2 LED3
Busz 8 bit -
Leírás A számláló órajel bemenete A multiplexer párhuzamos adatbemenete Számláló kimenete és a multiplexer címbemenete Multiplexer kimenete
Fig. 47. Blokkséma Alkalmazandó muszerek ˝ és eszközök • PC számítógép • Digilent Basys2 Spartan-3E FPGA mér˝ opanel • Digilent Adept konfiguráló szoftver
42
4.2 Kódolók 4.2.1 Komparátorok (Magnitude Comparators) A digitális komparátorok 2 azonos bitszélességu˝ bináris értéket hasonlítanak össze, egyszerubb ˝ esetben csak az egyenl˝oséget jelezve, de az un. magnitude komparátorok ezen kívül a kisebb-nagyobb relációt is jelzik (48. ábra).
Fig. 48. 2-szer 4-bites komparátor blokkrajza A két bemenet A(3:0) és B(3:0), az EQ kimenet igaz volta az egyenl˝oséget (equal), a BGA a B(3:0) a nagyobb voltát, (B greater), az AGB az A(3:0) nagyobb relációt jelenti. A relációt a legnagyobb helyi érték dönti el, ha egyenl˝ok, akkor a következ˝o helyi érték, stb. (4. táblázat) TABLE 4 Magnitude Comparator igazságtáblázata A3 1 0 = = = = = = =
B3 0 1 = = = = = = =
A2 x x 1 0 = = = = =
B2 x x 0 1 = = = = =
A1 x x x x 1 0 = = =
B1 x x x x 0 1 = = =
A0 x x x x x x 1 0 =
B0 x x x x x x 0 1 =
AGB 1 0 1 0 1 0 1 0 0
BGA 0 1 0 1 0 1 0 1 0
EQ 0 0 0 0 0 0 0 0 1
Miután az A nagyobb, a B nagyobb és A=B relációk egymást kizárják, ezért az el˝oz˝o igazságtábla redundáns, egyszerusíthet˝ ˝ o (5. táblázat). Így, ha AGB=0 és EQ=0, akkor BGA=1 (49. ábra).
43
TABLE 5 Magnitude Comparator egyszerusített ˝ igazságtáblázata A3 1 = = = =
B3 0 = = = =
A2 x 1 = = =
B2 x 0 = = =
A1 x x 1 = =
B1 x x 0 = =
A0 x x x 1 =
B0 x x x 0 =
AGB 1 1 1 1 0
EQ 0 0 0 0 1
Fig. 49. Magnitude Comparator egy áramköri megvalósítása 4.2.2 Enkóderek Az encoder (átkódoló, kódoló stb.) egy olyan áramkör, amely az információt valamely formából valamilyen másikba alakítja át. (Természetesen, van sokkal precízebb definíció is). Mi két átkódolóval foglalkozunk, az egyszeru˝ átkódolóval és a priority átkódolóval. Az egyszeru˝ átkódoló a sorszámozott egyedi bemeneteket (one hot) átkódolja a sorszám (v. index) bináris kódjává (6. táblázat, 50. ábra). A bemenetek közül egy és csakis egy lehet aktív. Az áramkör nem tudja megkülönböztetni azt, hogy az I0 bemenet van, vagy egy bemenet sincs. TABLE 6 8-ról 3-ra enkóder igazságtáblázata
In0 In1 In2 In3 In4 In5 In6 In7
Y2 0 0 0 0 1 1 1 1
Y1 0 0 1 1 0 0 1 1
Y0 0 1 0 1 0 1 0 1
44
Fig. 50. 8_to_3 enkóder egy áramköri megvalósítása: 4.2.3
Prioritáskódoló (priority encoder)
A prioritáskódoló esetében egyszerre több bemenet is lehet, a kimeneten a legnagyobb prioritású jel indexe jelenik meg binárisan. Ezen kívül van egy kimenet, amely jelzi, hogy legalább egy bemenet aktív. A következ˝okben láthatunk példát egy 4 bites (7. táblázat) és egy 8 bites (8. táblázat) prioritás kódolóra (51. ábra, 52. ábra, 53. ábra). TABLE 7 4 bites prioritáskódoló igazságtáblázata, (1), (2), (3) In0 0 1 x x x
In1 0 0 1 x x
In2 0 0 0 1 x
In3 0 0 0 0 1
Out1 x 0 0 1 1
Out0 x 0 1 0 1
IT 0 1 1 1 1
Out0 = In1 ∗ In2 + In3
(1)
Out1 = In2 + In3
(2)
IT = In0 + In1 + In2 + In3
(3)
Out2 = In4 + In5 + In6 + In7
(4)
Out1 = In2 ∗ (In4 ∗ In5) + In3 ∗ (In4 ∗ In5) + In6 + In7
(5)
Out0 = In1 ∗ (In2 ∗ In4 ∗ In6) + In3 ∗ (In4 ∗ In6) + In5 ∗ (In6) + In7
(6)
IT = In0 + In1 + In2 + In3 + In4 + In5 + In6 + In7
(7)
45
TABLE 8 8 bites prioritáskódoló igazságtáblázata, (4), (5), (6), (7) In0 x x x x x x x 1 0
In1 x x x x x x 1 0 0
In2 x x x x x 1 0 0 0
In3 x x x x 1 0 0 0 0
In4 x x x 1 0 0 0 0 0
In5 x x 1 0 0 0 0 0 0
In6 x 1 0 0 0 0 0 0 0
In7 1 0 0 0 0 0 0 0 0
Out2 1 1 1 1 0 0 0 0 x
Out1 1 1 0 0 1 1 0 0 x
Out0 1 0 1 0 1 0 1 0 x
IT 1 1 1 1 1 1 1 1 0
Fig. 51. 8 bites prioritáskódoló rajzjele
Fig. 52. 8 bites prioritáskódoló blokkrajza 4.2.4 Dekóder A dekóder a kódoló inverze, visszaalakítja az információt a kezdetire. Az egyszeru˝ dekóder esetében a binárisan kódolt bemenetet egy és csakis egy (one hot) kimeneti jelre. 4-r˝ol 1-re dekóder engedélyez˝o jellel
46
˝ Fig. 53. A 8 bites prioritáskódoló megvalósítása 2x4 bitesbol TABLE 9 ˝ 1-re dekóder igazságtáblázata 4-rol EN 0 0 0 0 1 1 1 1
S1 0 0 1 1 0 0 1 1
S0 0 1 0 1 0 1 0 1
OUT3 0 0 0 0 0 0 0 1
OUT2 0 0 0 0 0 0 1 0
OUT1 0 0 0 0 0 1 0 0
OUT0 0 0 0 0 1 0 0 0
˝ 1-re dekóder blokkrajza Fig. 54. 4-rol 4.2.5 Laborfeladat Tervezzen 2x2 bites komparátorból 2x4 bitest! A 2x2 bites komparátor bemenetei: A0, A1, B0, B1, EQin, AGin kimenetei: EQout, AGout. Az igazságtábla alapján tervezze meg az áramkört, legfels˝obb szintu˝ rajzot top.sch-nak nevezze el! A szimulációhoz használja a kiadott tesztfájlt (testbench, tb_.vhd). A BASYS2 kártya portjaiból a következ˝oket használja: (56. ábra) Alkalmazandó muszerek ˝ és eszközök • PC számítógép • Digilent Basys2 Spartan-3E FPGA mér˝ opanel • Digilent Adept konfiguráló szoftver
47
˝ 1-re dekóder engedélyezo˝ jellel egy áramköri megvalósítása Fig. 55. 4-rol TABLE 10 Portkiosztás SW7 B3
SW6 B2
SW5 B1
SW4 B0
SW3 A3
SW2 A2
SW1 A1
SW0 A0
BTN1 AGin
BTN0 EQin
LED1 AGout
LED0 EQout
Fig. 56. 4x4-es komparátor áramkör, 2x2-es modulok felhasználásával 4.3 Összeadó áramkör A legegyszerubb ˝ összeadó két bitet ad össze, és az egy bites eredményt és az átvitelt adja ki a kimenetén, ez a félösszeadó (half adder) (11. táblázat, 57. ábra). TABLE 11 A két bites félösszeadó igazságtáblázata, (8), (9) In0 0 0 1 1
In1 0 1 0 1
Sum 0 1 1 0
Cout 0 0 0 1
Sum = In0 ∗ In1 + In0 ∗ In1 = In0 Cout = In0 ∗ In1
M
In1
(8) (9)
48
Fig. 57. Félösszeadó áramkör kapcsolási rajza 4.3.1
Teljes összeadó (full adder)
A teljes összeadó egy logikai áramkör, ami összeadás muveletet ˝ valósít meg három bináris számjegy között (12. táblázat, 58. ábra, 59. ábra, 60. ábra). A teljes összeadó egy összeg és egy átvitel értéket szolgáltat, melyek mind bináris számjegyek. Kombinálható más teljes összeadókkal vagy egymaga is dolgozhat. TABLE 12 A két bites teljes összeadó igazságtáblázata, (10), (11) In0 0 0 0 0 1 1 1 1
In1 0 0 1 1 0 0 1 1
Cin 0 1 0 1 0 1 0 1
Sum 0 1 1 0 1 0 0 1
Cout 0 0 0 1 0 1 1 1
Sum = In0∗In1∗Cin+In0∗In1∗Cin+In0∗In1∗Cin+In0∗In1∗Cin = In0
M
In1
M
Cin (10)
Cout = In0 ∗ Cin + In1 ∗ Cin + In0 ∗ In1
(11)
49
Fig. 58. Teljes összeadó egy megvalósítása
Fig. 59. Teljes összeadó egy megvalósítása
50
Fig. 60. Teljes összeadó megvalósítása félösszeadó áramkörök segítségével Több bit bites összeadó áramkörben (61. ábra) minden helyi értékre kell egy teljes összeadó, az el˝oz˝o helyi érték átvitel kimenete van csatlakoztatva az adott átvitel bemenetére (COUTn-1 -> CINn). Ha kivonást is akarunk végeztetni az összeadónkkal, akkor a második operandus kettes komplemensét (bitenként negált +1) kell az els˝ohöz hozzáadnunk. A negálást exkluzív vagy kapuval, az egyes hozzáadását az els˝o helyi értéken a CIN-re adott egyessel oldhatjuk meg. A sorba kapcsolt összeadókkal történ˝o megoldást ripple carry módnak hívjuk. Ennek a megoldásnak az a hátránya, hogy meg kell várnunk, amíg az egyes átvitelek végighaladnak az összes összeadón. Ezért alkalmaznak gyorsítókat (look ahead carry).
51
Fig. 61. 4 bites összeadó áramkör 4.3.2 BCD összeadó A decimális összeadónál is használhatunk hexa összeadót (62. ábra). A bemenet itt is 2db 4 bites operandusból és a bemen˝o átvitelb˝ol áll, de az operandusok maximális értéke 9 lehet, és ez a tervez˝o felel˝ossége. Átvitel akkor keletkezik, amikor az összeg 10 vagy annál nagyobb, maximálisan 19 lehet. Ha az összeg eléri vagy meghaladja a tízes értékek, ki kell adnunk az átvitel jelet a következ˝o helyi érték felé (a 3 kapuval megoldva), és a bináris értékb˝ol le kell vonnunk tízet. Miután modulo 16-ban dolgozunk, ez ekvivalens a 6 hozzáadásával, és ez az egyszerubb. ˝ Ha az összeadás értéke 9 vagy kisebb, a második összeadóval még hozzáadunk 0-t (látszólag feleslegesen). A COUT=0, amely a H5 második operandusának B1 és B2 bemenetére kerül, a B0, B3 és a Cin fixen nullára van kötve. Ha azonban a H6-on keletkezett összeg 10 vagy annál nagyobb, a COUT=1, ez kerül a H6 B1 és B2 bemenetére, így H6 második operandusa 6 lesz.
52
Fig. 62. BCD összeadó 4.3.3 Laborfeladat Tervezzen egy 4 bites összeadót-kivonót! Az els˝o operandus a 4 bal oldali SW kapcsoló, a második a 4 jobb oldali legyen. A helyi értékek a digiteken belül bal felé n˝onek. A kivonás a jobb legszéls˝o nyomógomb (BTN0) lenyomásakor történjen. Az áramkört vizsgálja meg szimulációval, majd töltse le a BASYS2 kártyára, és úgy ellen˝orizze a muködését. ˝ Alkalmazandó muszerek ˝ és eszközök • PC számítógép • Digilent Basys2 Spartan-3E FPGA mér˝ opanel • Digilent Adept konfiguráló szoftver
53
4.4
Aritmetikai és Logikai Egység (ALU)
A számítástechnikában az aritmetikai-logikai egység (rövidítése ALU az angol Arithmetic Logic Unit alapján) aritmetikai és logikai muveleteket ˝ elvégz˝o digitális áramkör. Alapvet˝o eleme a számítógép központi vezérl˝oegységének. Neumann János alkotta meg az ALU fogalmát 1945-ben, amikor cikkében beszámolt új számítógépér˝ol, az EDVAC-ról. Egy tipikus Neumann-féle CPU bels˝o szerkezetének részében az ALU saját maga végzi az összeadást, a kivonást és más egyszeru˝ muveleteket ˝ az inputjain, így adva át az eredményt az output regiszternek. Az els˝o integrált aritmetikai logikai egység a 74-es TTL sorozat 74181 típusú áramköre volt, ami megalapozta a mai modern CPU-k kialakulását. Egy ALU általában a következ˝o alapmuveletek ˝ végrehajtására képes: • • • •
összeadás és kivonás (fixpontos, lebeg˝opontos számokkal) szorzás, osztás (fixpontos, lebeg˝opontos számokkal) léptetések bitszintu˝ logikai muveletek ˝
A muveletek ˝ eredményével kapcsolatos egyéb információkat (pl.: túlcsordulás, az eredmény nulla, carry átvitel) is szolgáltat. 4.4.1 ALU blokkvázlata Az egyszeruség ˝ kedvéért a laborgyakorlaton csak a legalapvet˝obb muveleteket ˝ valósítjuk meg az ALU-ban (63. ábra) A modul bemenete két 4 bites szám (A, B). Az S bemenet az ALU vezérlését végzi. Ezzel lehet kiválasztani, hogy éppen milyen muveletet ˝ szeretnénk végezni a két bemeneti értéken. Az ALU_out kimeneten az eredmény jelenik meg. A Flags kimeneten a muveletvégzés ˝ eredményét jelz˝o (Carry, Overflow, Zero) információk jelennek meg. 4.4.2 •
•
• •
ALU muveletvégz ˝ o˝ egységei
ADD: Két négybites szám összeadására képes teljes összeadó. Ha kivonást is akarunk végeztetni az összeadóval, akkor a második operandus (B) kettes komplemenést (bitenként negált +1) kell az els˝ohöz (A) hozzáadnunk. A negálást exkluzív vagy kapuval, az egyes hozzáadását az els˝o helyi értéken a CIN-re adott egyessel oldhatjuk meg. AND, OR, XOR: A két négybites bemenet bitenkénti és, vagy, kizáró-vagy kapcsolatát adja eredményül. ROL, ROR: Az A bemenet egy bittel történ˝o balra, illetve jobbra forgatása. MUX: A multiplexer a vezérl˝o jeleknek megfelel˝o muveletvégz˝ ˝ o egység kimeneti jelét választja ki. Az ALU-ban minden muveletvégz˝ ˝ o egység kimenetén megjelenik az adott muveleti ˝ eredmény, ezért szükséges a multiplexer ami csak a megfelel˝o muveleti ˝ eredményt adja a kimenetre. Ez lesz az ALU kimeneti értéke.
A blokksémán látható hogy a multiplexer több négybites adatvonal kiválasztását végzi (13. táblázat), majd az eredmény egy szintén négybites adatvonalra kerül. Megvalósítása: •
Négy darab multiplexer, a négybites busz helyi értékeinek kiválasztására.
54
Fig. 63. A laborgyakorlat során megépítésre kerülo˝ ALU blokkvázlata •
Másik lehet˝oség az ALU_out_mux1 makró használata. Ez egy 8-ról 1-re multiplexer, 4 bites adatcsatornákkal. TABLE 13 ˝ Az ALU kimeneti jelei a vezérlojeleinek függvényében S2 0 0 0 0 1 1 1 1
S1 0 0 1 1 0 0 1 1
S0 0 1 0 1 0 1 0 1
Kimenet Y =A+B Y =A−B Y (i) = A(i)&B(i) Y (2 : 0) = A(3 : 1), Y (3) = A(0) Y (i) = A(i)|B(i) Y (3 : 1) = A(2 : 0), Y (0) = A(3) Y (i) = A(i)B (i) -
Leírás Az ’A’ és ’B’ bemenet összege. Az ’A’ és ’B’ bemenet különbsége Az ’A’ és ’B’ bemenet bitenkénti ÉS kapcsolata Az ’A’ bemenet rotálása jobbra. Az ’A’ és ’B’ bemenet bitenkénti VAGY kapcsolata Az ’A’ bemenet rotálása balra. Az ’A’ és ’B’ bemenet bitenkénti XOR kapcsolata -
A laborgyakorlaton megépített ALU három Flag bitet tartalmaz. •
Overflow: El˝ojeles túlcsordulás. El˝ojeles számok esetében az összeadás, vagy a kivonás eredménye nem ábrázolható az adott számtartományon.
•
Carry: Átvitel el˝ojel nélküli muveleteknél. ˝ Az összeadás eredménye nem ábrázolható az adott számtartományban.
1. A makró fájlok a mellékletben megtalálhatóak.
55
•
Zero: Az ALU muvelet ˝ eredmény nulla lett.
4.4.3 Laborfeladat Készítse el egy négybites aritmetikai és logikai egységet (64. ábra), a következ˝o muveletek ˝ végrehajtására: összeadás, kivonás, ÉS, VAGY, kizáró-VAGY, forgatás jobbra, forgatás balra. Az ALU építésénél felhasználható, a szimbólumok között megtalálható ADD4 összeadó áramkör, és a mellékletben megtalálható ALU_out_mux multiplexer. A kész ALU áramkörb˝ol készítsen makrót.
Fig. 64. ALU A makró ki-bemeneteit a megadott módon társítsa portokhoz (14. táblázat). TABLE 14 Portkiosztás Makró S0, S1, S2 A(3:0) B(3:0) ALU_OUT(3:0) OVF CARRY ZERO
Port (UCF fájl) BTN0, BTN1, BTN2 SW(3:0) SW(7:4) LED(3:0) LED(5) LED(6) LED(7)
A szimulációhoz használja a kiadott tesztfájlt. Kiegészít˝o feladat: A bemeneti A, és B számot, a vezérl˝obiteket és az eredményt jelenítse meg hétszegmenses kijelz˝okön. A feladathoz szükséges makrók: Clk_divide, Bin_to_7_segment_x4. Alkalmazandó muszerek ˝ és eszközök • PC számítógép • Digilent Basys2 Spartan-3E FPGA mér˝ opanel • Digilent Adept konfiguráló szoftver
56
4.5
Shift regiszter
A shift regiszter sorba kötött, leginkább D flip-flopokból álló áramkör. Ha a flip-flopok bemenetére a t˝olük balra lév˝o flip-flop kimenetét kötik, akkor jobbra léptet˝o, ha a t˝olük jobbra lév˝o flip-flop kimenetét kötik, balra léptet˝o shift regiszterr˝ol beszélhetünk. A mikroprocesszorok regisztereinek léptetéskor (shift utasítás) az utolsó bit helyére legtöbbször 0 kerül, rotálásakor a léptet˝o regiszter soros kimenete és bemenete össze van kötve, vagy a Carry jelz˝o bitet léptetjük be az utolsó bit helyére. A shift regisztert használhatjuk számlálónak, vagy állapotgépben a különböz˝o állapotok bináris tárolására. Minden szám egy egyest tartalmaz, a többi zérus (one hot). Minden állapotnak vagy számlálóértéknek egy flip-flop egyes állapota felel meg, azaz, ahány flip-flop van, annyit tud számlálni, vagy annyi állapot feleltethet˝o meg neki. Ez több flip-flopot igényel (n), mint a binárisan kódolt számláló esetén (2 log n), de lényegében nincs szükség kapuáramkörökre. A gyur ˝ us ˝ számláló esetén (65. ábra) a jobb széls˝o kimenet vissza van csatolva a bal széls˝o bemenetre, így az egyes a számlálás folyamán balról jobbra lép. Az els˝o flip-flop és a kapu a bekapcsolás utáni els˝o egyes bevitelére szolgál, kés˝obb már nem játszik szerepet. (Máshogy is megoldható.)
Fig. 65. Gyurüs ˝ számláló
4.5.1
Lépteto˝ regiszterek
Soros-párhuzamos átalakító A legegyszerubb ˝ shift regiszter, a soros adat a baloldali SHIN bemeneten lép be, és amikor megjelenik a SHOUT kimeneten (8. ütem), a flipflopok kimenetér˝ol párhuzamosan leolvasható a byte (66. ábra). Felhasználására példa a merevlemez illeszt˝o, ahol a lemezr˝ol olvasott soros adatokat a párhuzamos buszon keresztül kell eljuttatni a szintén párhuzamos szervezésu˝ memóriába.
Fig. 66. Shift regiszter
57
Párhuzamos-soros átalakító A párhuzamosan beírt adatokat sorosan kell az SHOUT kimenetre juttatni. Itt az els˝o flip-flop kivételével az adatok két helyr˝ol kerülnek a flipflopok bemenetére, minden órajelre az el˝oz˝o kimenetér˝ol, és 8 ütemenként a párhuzamos bemenetr˝ol. Ezt végzik a bemeneti multiplexerek. Ha a MODE bemenet 1 soros léptetés, ha 0 párhuzamos beírás történik. Felhasználására itt is példa lehet a merevlemez illeszt˝o, ahol a párhuzamos szervezésu˝ memóriából olvasott soros adatokat sorosan kell eljuttatni a lemez felületére (67. ábra).
Fig. 67. Shift regiszter párhuzamos adatbemenettel Jobbra-balra léptet˝o regiszter Az adat sorosan kerül be a SRIN vagy az SLIN bemeneteken, és a DIRECTION bit határozza meg, hogy balra DIRECTION=0 vagy jobbra DIRECTION=1 léptet. A soros kimenet a S7 jobbra léptetésnél, és S0 a balra léptetésnél (68. ábra).
Fig. 68. Jobbra-balra lépteto˝ regiszter Barrel shifter A barrel shifter (69. ábra) egy kombinációs hálózat (nem regiszter), legegyszerubben ˝ 2 bemenetu˝ multiplexerekkel építhet˝o fel. Az egy oszlopban lév˝o multiplexerek száma megegyezik az adatszélességgel, (az ábrán 1 byte), az oszlopok száma egyenl˝o a címz˝o bitek számával. A címz˝o bitek a lehetséges maximális eltolás binárisan kódolva (az ábrán 3, azaz a maximális eltolások száma 7). Az els˝o oszlopban lév˝o multiplexerek, ha a címz˝o bemenetükön egy van, eggyel léptetik el az adatot, a másodikban lév˝ok kett˝ovel, a harmadikban lév˝ok néggyel. A léptetések összegz˝odnek. A léptetés (valójában rotálás) az egyik irányban történik, de ha a barrel shifter N léptetésre alkalmas, akkor az n léptetés az egyik irányban megfelel (N-n) léptetésnek a másikban. 4.5.2
Egyéb alkalmazások shift-regiszterrel
Lifo Az el˝ore-hátraléptet˝o regiszter felhasználható hardver LIFO, vagy más néven stack, magyar szóhasználattal verem létrehozására (70. ábra). A példán egy 8 byte mélységu˝ verem látható ahol a LIFOMEM jelenti a 8 byteos tárolót, az SH_FORE a verem állapotának jelzésére szolgáló áramkör. A memória 8 párhuzamosan, bitenként muköd˝ ˝ o 8 bites el˝ore-hátraszámláló léptet˝o regisztert tartalmaz. A LIFOINn jelenti a verem bemenetét, a LIFOOUTn a kimenetét, a LIFOPUSH
58
Fig. 69.
Fig. 70. LIFO mutatja meg, hogy mélyítünk vagy kiemelünk. A verem korrekt muködéséhez ˝ jelezni kell az állapotát, ha üres, csak írni szabad bele (ellenkez˝o esetben az olvasott adat nem
59
jó), ha tele van, azaz a beírt adat elérte a verem alját, csak olvasni szabad bel˝ole (ellenkez˝o esetben az utolsó adatot felülírjuk, így elvész). Az állapot jelzésére egy 9-dik 8 bites el˝orehátraszámláló léptet˝o regisztert alkalmazunk, amelynek a jobbra léptet˝o bemenetére egy állandó egyest, a balra léptet˝o bemenetére egy állandó nullát kötünk. Amikor beírunk a LIFO-ba (mélyítés) megy befelé az egyes, és ha megjelenik a jobb kimeneten, akkor a verem tele van. Amikor kiolvasunk a LIFO-ból (kiemelés) a nulla vándorol a bal kimenet felé, és ha a bal kimeneten megjelenik, akkor a verem üres. A hardver vermet a mikroprocesszorok IT kezelésében (amennyiben az többszintes) alkalmazzuk. A Johnson számláló Ha egy léptet˝o regiszter kimenetét egy inverteren keresztül visszacsatoljuk a bemenetére megkapjuk a Johnson számlálót. Egy tízes Johnson számláló öt flip-flopból áll (15. táblázat, 71. ábra). TABLE 15 Johnson számláló igazságtáblázata A 0 1 1 1 1 1 0 0 0 0
B 0 0 1 1 1 1 1 0 0 0
C 0 0 0 1 1 1 1 1 0 0
D 0 0 0 0 1 1 1 1 1 0
E 0 0 0 0 0 1 1 1 1 1
Count 0 1 2 3 4 5 6 7 8 9
Az öt flip-flop kimenetét jelöljük A-tól E-ig. Látható, hogy minden ötbites értékben van két egymás mellett lév˝o olyan bit, amely egyedi, így ezek a párosok felhasználhatók a számok kódolására 0-tól kilencig. (Ezek: nAnB, AnB, BnC, CnD, DnE, EA, nAB, nBC, nCD és nDE. Az n jelenti a negált értéket). A kimenetek egy-egy esetleg invertált két bemenetu˝ kapuval el˝oállítható. A flip-flopok száma kevesebb, mint a one hot esetében (10), de több, mint a binárisan kódolt számok használatánál (4), de viszonylag kevés kaput használ. Azonkívül, ha sorban számol, a következ˝o szám mindig csak egy bitben különbözik az el˝oz˝ot˝ol, mint a Grey kód esetén.
Fig. 71. Johnson számláló Soros összeadó
60
A soros összeadóban van két jobbra léptet˝o regiszter a két operandusnak, egy harmadik az eredménynek, egy flip-flop a carry out tárolására, és egy egybites teljes összeadó. a legkisebb helyi értéku˝ bitek rákerülnek az összeadó adatbemeneteire, az összeg rákerül a harmadik regiszter shift in bemenetére, az esetleg keletkezett átvitel a flip-flop bemenetére, a flip-flop kimenete tartalmazza az el˝oz˝o összeadás átvitelét. Órajelre mindhárom léptet˝o regiszter eggyel jobbra lép, az összeadó adatbemeneteire a következ˝o helyi érték kerül, a flip-flopba beíródik az új átvitel, az összeget tartalmazó léptet˝o regiszterbe belép az adott helyi értékhez tartozó egybites összeg. A 8.-ik órajelre el˝oáll az eredmény, a flip-flop kimenete pedig tartalmazza az esetleges átvitelt (72. ábra).
Fig. 72. aborfeladat Tervezzen egy 8 bites, jobbra-balra léptet˝o regisztert párhuzamos beírási lehet˝oséggel. A léptet˝o regiszter kimenetei csatlakozzanak a tesztkártyán lév˝o LEDekhez, az órajelet (clk) a BTN0 nyomógombról, a párhuzamos beírás engedélyezése(Pen) a BTN1 nyomógomb megnyomásával legyen elérhet˝o. Oldja meg, hogy a léptet˝o regiszterbe beírt byte órajelre addig lépdeljen jobbra ill. balra, amíg egy egyes nem éri el valamelyik (0. vagy 7.) széls˝o bitet, amikor is a léptetés iránya megfordul. Ha beíráskor a két szélen mindkét bit egyes, a következ˝o órajelre az egyik kerüljön át a másik mellé, és innen folytassa a fentebb leírt muködést ˝ (futófény). Alkalmazandó muszerek ˝ és eszközök • PC számítógép • Digilent Basys2 Spartan-3E FPGA mér˝ opanel • Digilent Adept konfiguráló szoftver
61
5
N ÉGYBITES CPU TERVEZÉS
5.1 Bevezetés A CPU (angol: Central Processing Unit – központi feldolgozóegység) más néven processzor, a számítógép „agya”, azon egysége, amely az utasítások értelmezését és végrehajtását vezérli, félvezet˝os kivitelezésu, ˝ összetett elektronikus áramkör. Egy szilícium kristályra integrált, sok tízmillió tranzisztort tartalmazó digitális egység. A bemeneti eszközök segítségével kódolt információkat feldolgozza, majd az eredményt a kimeneti eszközök felé továbbítja. A processzor alatt általában mikroprocesszort értünk, régebben a processzor sok különálló áramkör volt, ám a mikroprocesszorral sikerült a legfontosabb komponenseket egyetlen szilíciumlapkára integrálni.
Fig. 73. Intel 80486-os processzor Az els˝o mikroprocesszor az 1971-ben megjelent 4 bites szóhosszúságú Intel 4004 volt. Kés˝obb több sikeres 8 bites sorozat jelent meg több gyártó részér˝ol (Intel 8008, 8080, 8085, Zilog Z80, Motorola 6800, MOS Technology 6502). A 80-as évekt˝ol kezdve megn˝ott a processzorok szóhossza (Intel 8086 (az IBM PC és PC/XT processzora): 16 bit (20-bites címtartomány), Intel 80286 (a PC/AT processzora): 16 bit (24 bites címtartomány) – 1982, Intel 80386: 32 bit – 1985) az órajel folyamatos növekedése mellett. 5.1.1
Számítógépes architektúrák
A mikroszámítógépek fejl˝odése során két architektúra terjedt el (74. ábra). Az egyik a Neumann architektúra, itt ugyanabban a memóriában van a programkód, mint az adatok. Ilyen architektúrájúak például az INTEL x86-os processzorok. A Harvard architektúra esetében külön memória áll rendelkezésre az adatok és az utasításkód tárolására (mikrokontrollerek, PIC család). 5.1.2 Utasításkészlet A processzor által ismert muveletek ˝ és utasítások összességét értjük a processzor utasításkészlete alatt. Legel˝oször a RISC (Reduced Instructions Set Computer) utasításkészletet használták, ez leegyszerusített, ˝ rövid utasításokat tartalmazott. Els˝odlegesnek tekintette a sebességet, és az egyszeruséget. ˝ Kés˝obb a CISC-et (Complex
62
Fig. 74. Neumann és Harvard számítógép architektúra Instructions Set Computer) alkalmazták, ez már több, hosszabb utasítást tartalmazott, ám a túl sok, bonyolult utasítás nem bizonyult célravezet˝onek, ezért visszatértek a RISChez. Ma már persze rengeteg utasításkészlet van, melyben keverednek a RISC, és a CISC irányelvei. 5.1.3
A labormérés alatt megépítendo˝ CPU architektúrája
A labormérés korlátozott id˝otartama miatt az alábbi blokkvázlaton látható (egyszeru˝ felépítésu) ˝ Harvard architektúrájú CPU kerül megtervezésre és elkészítésre (75. ábra). A gyakorlatban használatos processzorok ennél jóval bonyolultabb bels˝o felépítéssel rendelkeznek, de az általános muködés ˝ megértéséhez ez az egyszeru˝ változat is elegend˝o. A következ˝oekben a laborgyakorlatok során összeállított négybites processzor bels˝o felépítése kerül ismertetésre. •
•
•
PC (Program Counter): A programszámláló mindig a következ˝o végrehajtandó utasítás címét tartalmazza. A labormérésen épített processzorban a programszámláló maximális értéke 255 lehet, mivel a programmemória 256 elemu. ˝ Programmemória (INST_MEM): A programmemória tartalmazza a végrehajtandó programot. A program utasítások sorozatából épül fel. Az utasítások vezérlik a mikroprocesszor muködését. ˝ Egy utasítás kód hossza 21 bit, így a programmemória is 21 bit szélességu. ˝ Utasítás: Az utasítások az alegységeket vezérl˝o bináris kódokat és operandusokat tartalmaznak. Az éppen végrehajtásra kerül˝o utasítást a PC választja ki. Az utasítást két részre lehet bontani: – Vezérl˝ojelek: az utasítás azon része, mi a mikroprocesszor vezérléséért felel. Pl.: beolvasás a bemenetr˝ol, összeadás, kivonás elvégzése regisztereken. . . – Operandus: a vezérl˝ojeleken kívül az utasítás operandust is tartalmazhat. Ez az utasítás típusától függ˝oen lehet adat, vagy cím is.
63
Fig. 75. A laborgyakorlatok alatt épített négybites CPU blokkvázlata •
•
•
•
•
Regiszterek: Vannak speciális célú regiszterek a CPU-ban. Ilyen az A és a B regiszter. Ezekbe lehet az operandusokat betölteni, majd az ALU ezeken végzi el a kiválasztott muveletet. ˝ Az ALU muvelet ˝ eredménye szintén ezekbe a regiszterekbe tölt˝odik. Aritmetikai és Logikai Egység (ALU): Aritmetikai és logikai muveletek ˝ végrehajtására alkalmas. Memória (RAM): Címezhet˝o memória. Adatok tárolására alkalmas. A regiszterek értékét, az utasításban megadott címu˝ memóriarekeszbe lehet tölteni, vagy kiolvasni. A memória 32 darab 4 bites adatot tud tárolni. Bemenet (input): A processzor két bemeneti porttal rendelkezik. Rajtuk keresztül 4 bites adatokat lehet a processzor bels˝o regisztereibe juttatni. Kimenet (output): A processzor két kimeneti porttal rendelkezik. Rajtuk keresztül 4 bites adatokat lehet a kimenetre írni (pl. LED-ekre vagy hétszegmenses megjelenít˝okre).
5.1.4
A CPU utasításainak felépítése
A processzoron belül különböz˝o muveletvégz˝ ˝ o egységek, memóriák, kimeneti, bemeneti egységek találhatóak. Ezek vezérléséhez vezérl˝ojelek szükségesek. A vezérl˝ojelek az utasításban általában kódolva jelennek meg, így rövidebb utasítás szóhossz érhet˝o el. Ebben az esetben a vezérl˝ojelek el˝oállításához az utasítást dekódolni kell. A labormérésen épített CPU egyszerusítése ˝ miatt kihagyjuk az utasításdekódolót, így az utasításokban a vezérl˝ojelek már dekódolt formában helyezkednek el. A következ˝o táblázatok a CPU egyes egységeinek vetélését adják meg.
64
Az ’A’ és ’B’ regiszter bemenetének kiválasztása (Register input select) A labormérésen tervezett CPU-ban minden adat az ’A’ és ’B’ regiszteren keresztül mozgatható, ezért a regiszterek bemenete több modulból is érkezhet. A regiszterek bemenetét egy 8 bemenetu˝ multiplexerrel választhatjuk ki a három vezérl˝obemenet segítségével. A multiplexer adatbemenetei 4 bitesek. A következ˝o táblázat megadja, az egyes vezérl˝o bemenet kombinációk esetén melyik forrás kerül a regiszterekre. A multiplexerrel kiválasztott adatot a megfelel˝o regiszterbe a ’Ben’, ABEN típusú vezérl˝obittel lehet beírni. A ’Ben’ nulla értéke esetén a kiválasztott adat az ’A’ regiszterbe, míg logikai egy értéke esetén a ’B’ regiszterbe tölt˝odik. TABLE 16 Az ’A’ és ’B’ regiszter bemenetének kiválasztása Aen2 0 0 0 0
Aen1 0 0 1 1
Aen0 0 1 0 1
Funkció Aout Bout RAMout INST
1 1 1 1
0 0 1 1
0 1 0 1
IN0 IN1 ALUout -
Leírás A regiszterek bemenete az ’A’ regiszter kimenete A regiszterek bemenete a ’B’ regiszter kimenete A regiszterek bemenete a memória kimenete A regiszterek bemenete az utasítás argumentuma (utasítás els˝o 4 bite) A regiszterek bemenete az input 0 A regiszterek bemenete az input 1 A regiszterek bemenete az ALU kimenete -
ALU vezérlése (ALU control) A processzor Aritmetikai és Logikai Egysége a bemeneti ’A’ illetve ’B’ regisztereken képes muveleteket ˝ végezni. Az eredmény minden esetben az ’A’ regiszterbe kerül. A muvelet ˝ kiválasztása 3 biten történik, ezt ismerteti a következ˝o táblázat. TABLE 17 ALU vezérlo˝ jelei S2 0 0 0
S1 0 0 1
S0 0 1 0
Funkció A+B A-B A and B
0 1
1 0
1 0
ROR A or B
1 1
0 1
1 0
ROL A xor B
1
1
1
-
Leírás Az ’A’ és a ’B’ regiszter összeadása, eredmény az ’A’-ba Az ’A’ regiszterb˝ol ’B’ kivonása, eredmény az ’A’-ba Az ’A’ és a ’B’ regiszter bitenkénti ÉS kapcsolata, eredmény az ’A’-ba Az ’A’ regiszter rotálása jobbra, eredmény az ’A’-ba Az ’A’ és a ’B’ regiszter bitenkénti VAGY kapcsolata, eredmény ’A’-ba Az ’A’ regiszter rotálása balra, eredmény az ’A’-ba Az ’A’ és a ’B’ regiszter bitenkénti XOR kapcsolata, eredmény az ’A’-ba -
Ugró utasítások, a programszámláló megváltoztatása (Branch control) Normál esetben az utasítás számláló minden utasítás után eggyel növekszik. Ugró utasítás esetén a program végrehajtását az utasításkódban megadott címt˝ol kell folytatni (utasítás els˝o 8 bitje). Ehhez az utasításszámlálót a következ˝o ciklus el˝ott módosítani kell. Az ugróutasítás lehet feltétel nélküli, vagy feltételes. Feltétel nélküli ugrás esetén
65
mindenképpen megváltozik az utasításszámláló értéke. A feltételes ugrásnál az ugrás bekövetkezése feltételhez kötött. A feltételeket az ALU ’Z’ (zero), ’C’ (carry), ’O’ (overflow) jelz˝obitjei szolgáltatják. Az ugró utasítás el˝otti ALU muvelet ˝ módosítja a jelz˝obitek értékét, és ennek függvényében az ugróutasítás vagy bekövetkezik (ekkor módosul a PC az utasításban megadott címre), vagy nem következik be (ekkor a PC értéke eggyel növekszik). TABLE 18 Ugró utasítások Br2 0 0
Br1 0 0
Br0 0 1
Funkció no BR BRZ
0
1
0
BRNZ
0
1
1
BRC
1
0
0
BRNC
1
0
1
BRO
1
1
0
BRNO
1
1
1
BR
Leírás Nincs ugrás Az ALU Z flag-je ’1’, megadott címre Az ALU Z flag-je ’0’, megadott címre Az ALU C flag-je ’1’, megadott címre Az ALU C flag-je ’0’, megadott címre Az ALU O flag-je ’1’, megadott címre Az ALU O flag-je ’0’, megadott címre Feltétel nélküli ugrás, megadott címre
ugrás az utasítás utolsó 8 bitjén ugrás az utasítás utolsó 8 bitjén ugrás az utasítás utolsó 8 bitjén ugrás az utasítás utolsó 8 bitjén ugrás az utasítás utolsó 8 bitjén ugrás az utasítás utolsó 8 bitjén ugrás az utasítás utolsó 8 bitjén
Egyéb vezérl˝o jelek A processzoron belül található memória adatbemenete az ’A’ regiszter kimenetére kapcsolódik. A regiszter értékének memóriába töltése a ’mwe’, MWE típusú vezérl˝obittel történik. A beírás során az adatmemória címét az utasítás els˝o 5 bitje határozza meg. Az ’A’ regiszter értékének kimenetre történ˝o másolása ’Oen’ és ’Onb’, OEN típusú vezérl˝obitekkel lehetséges. TABLE 19 Kimeneti regiszterek vezérlo˝ jelei Oen 0 0 1 1
Onb 0 1 0 1
Funkció out0=A out1=A
Leírás Nem történik kiírás Nem történik kiírás Az ’A’ regiszter értéke a 0. kimeneti latch-be kerül Az ’A’ regiszter értéke a 1. kimeneti latch-be kerül
66
Az utasítások felépítése Egy utasítást két részre lehet bontani. A vezérl˝ojelek az utasítás azon részei, melyek a mikroprocesszor vezérléséért felelnek (pl. az ALU egyes egységeinek vezérl˝ojelei), ezeket összefoglalóan "Control signals"-nak nevezzük (76. ábra). Az utasítás másik része az operandus, amit a vezérl˝ojelekt˝ol függ˝oen lehet adat vagy címként is értelmezni, vagy az utasítás szempontjából nem tartalmaz információt (Address or Operand). Az operandust a következ˝oképpen lehet értelmezni: • •
•
INSTR address: 8 bites címet tartalmaz, az ugró utasítások esetén. RAM address: 5 bites cím, a memória muveletek ˝ esetén. RAM-ba írás, vagy RAMból olvasás. A maradék 3 bit nem használt (don’t care). DATA: 4 bites adat, a konstans szám regiszterbe töltése esetén. A maradék 4 bit nem használt (don’t care).
Fig. 76. Az utasítások felépítése Mnemonik A következ˝o táblázat azokat az utasításokat tartalmazza, melyeket a CPU képes értelmezni, és végrehajtani. Vegyük példának egy konstans A regiszterbe való betöltését (77. ábra).
Fig. 77. Az utasítások felépítése A táblázat els˝o sora a bitszámozást tartalmazza, a második sorában az utasítás általános alakja szerepel. Itt a lényeges vezérl˝obitek értéket kaptak (0,1), az utasítás számára lényegtelen biteket x-el jelöltük. Az utolsó sorban az utasítás számára érdektelen biteket nullával helyettesítettük. A 0.-3.-ik helyi értéken egy k szám kerül megadásra, ez lesz a betöltend˝o konstans. Ha vesszük az utasítást hexadecimális formában 0x0C000+k és hozzáadjuk a konstans négybites számot akkor megkapjuk az utasítás kódját. Az ilyen kódok szemléletesebb jelölésére rövid utasításneveket szoktak megadni, melyeket mnemonikoknak nevezünk. Ez a rövid azonosító az operandussal együtt meghatározza az utasításkódot. A példa esetében: "LDI k". A CPU teljes utasításkészlete
67
Fig. 78. Utasításkészlet 5.1.5 Laborfeladat A CPU megtervezése és megépítése 5 laborgyakorlat alatt történik. Az egyes laborgyakorlatokon elkészítend˝o részfeladatok: •
CPU laborfeladat és a használt alkatrészek megismerése. Hétszegmenses kijelz˝o modulok használatának megismerése (négy és a nyolc hétszegmenses kijelz˝o).
•
Órajel forrás hozzáadása (manuális, 10Hz-es). Programszámláló és programmemória. A programszámláló és az utasítás megjelenítése. Szimuláció és letöltés. Buszrendszerek. Az ’A’ és a ’B’ regiszter bemenetének kiválasztása és ALU hozzáadása a rendszerhez. Az ’A’ és ’B’ regiszter értékének megjelenítése. ALU flag kimeneteinek regiszterbe töltése. Szimuláció és letöltés. Kimeneti regiszterek és memória hozzáadása a rendszerhez. Ugró utasítás megvalósítása. Az így elkészül végleges processzoron az 1. mintaprogram kipróbálása. Letöltés. Az elkészült CPU-ra programkód készítése, és annak vizsgálata.
•
•
•
A laborgyakorlatokon elkészítend˝o részfeladatok a következ˝o 4 alfejezetben kerülnek ismertetésre. Alkalmazandó muszerek ˝ és eszközök • PC számítógép • Digilent Basys2 Spartan-3E FPGA mér˝ opanel • Basys2 extBoard #1 kiegészít˝ o panel • Digilent Adept konfiguráló szoftver • Assembler program: assemblerDTcpu4.exe
68
5.2
Órajel forrás, programszámláló, utasításregiszter, kijelzés
A CPU muködéséhez ˝ órajel szükséges. Az órajelet a panelen található 50 Mhz-es oszcillátorból nyerhetjük, vagy nyomógombok segítségével állíthatjuk el˝o. Hogy a processzor muködését ˝ nyomon követhessük megfelel˝oen kis frekvenciájú órajelre van szükség. Az 50 Mhz-es jelb˝ol a Clk_divide makróval 10 Hz-es órajelet állíthatunk el˝o. Másik lehet˝oség, hogy az órajel fel- és lefutó életi nyomógombok segítségével állíthatjuk el˝o (lásd: „FPGA fejlesztés ISE-ben” 16. oldal). Az egyik gomb az UP a másik gomb a DOWN port nevet viseli az ucf fájlban. Egy kiválasztó gomb (OCLK_EN) lenyomásával dönthetjük el, hogy a 10 Hz-es (OCLK_EN=1), vagy az UP/DOWN gombokkal el˝oállított jel (OCLK_EN=0) legyen a CPU órajele (clock jel). Mivel a processzor egységei az órajel különböz˝o éleire aktívak, szükség van az órajel negáltjára (clock_n). A clock_n órajel adja egy 8 bites számláló (CB8CLE) órajelét. Ez a számláló a programszámláló, melynek load bemenetét az ugróutasítások vezérlik. A párhuzamos adatbemenete az utasítás argumentum része lesz, vagyis az ugrási cím. (Az ugró utasításokról kés˝obbi fejezetben ismerkedhetünk meg részletesebben.) Jelen feladatban az ugró utasításokkal nem foglalkozunk, ezért ezt a bemenetet logikai nulla értékre kell kötni. A számláló kimenete a Pcnt busz, ami az utasításmemória (INST_MEM) címbemenetét adja. Az utasításmemória kimenetén (INSTR busz) jelennek meg az utasítások, a clock órajel hatására. Az órajel felfutó élének hatására a programmemóriából a megfelel˝o utasítás kiolvasásra kerül, majd az órajel lefutó élének hatására végrehajtódik az utasítás, és a programszámláló értéke megváltozik a következ˝o végrehajtandó utasítás címére. A kijelz˝okre kösse rá az utasításmemória és a programszámláló kimenetét (részletek a táblázatban). TABLE 20 ˝ portkiosztása Kijelzok Bemenet in_A1 in_A0 in_B1 in_B0 in_C1 in_C0 in_D1 in_D0
Jel Pcnt(7:4) Pcnt(3:0) 000 + INSTR(20) INSTR(19:16) INSTR(15:12) INSTR(11:8) INSTR(7:4) INSTR(3:0)
Leírás Programszámláló megjelenítése az A kijelz˝on
Utasítás megjelenítése a B, C és D kijelz˝o modulokon
Szimulációval ellen˝orizze a muködést. ˝ A szimuláció során figyelje meg a programszámláló értékét, és a hozzátartozó utasításokat. Alapértelmezésben az alábbi kódrészlet található a programmemóriában (79. ábra). Az els˝o oszlop az utasítás helyét jelöli a programmemóriában, ez nullától kezdve folyamatosan növekszik. A harmadik oszlopban az utasítás mnemonikja látható (nop, ldi...) majd a következ˝o oszlopban az argumentum. Az utolsó oszlop az utasítás hexadecimális kódját mutatja. Helyes muködés ˝ esetén a PC kiválasztja az aktuális
69
utasítást, a kijelz˝on ennek megfelel˝o utasításkód jelenik meg. A kijelz˝okön az (79. ábra els˝o és utolsó oszlopának sorait kell látnunk.
Fig. 79. A mintaprogram mnemonikjai és utasításkódjai A szimuláció után próbálja meg letölteni a kapcsoláshoz tartozó konfigurációs fájlt az FPGA-ba és ellen˝orizze a muködést. ˝ A 80. ábra szemlélteti a CPU teszteléséhez szükséges kapcsolók, kijelz˝ok funkcióját.
Fig. 80. Ki-bemeneti egységek A következ˝o táblázat tartalmazza a laborgyakorlaton felhasznált ki-és bemeneti portokat (I/O port) (21. táblázat).
70
TABLE 21 Portkiosztás
5.3
Port név SEG4(7:0) AN4(3:0) SEG8(7:0) AN8(7:0) MCLK UP DOWN
Busz 8 bit 4 bit 8 bit 8 bit -
OCLK_EN
-
RST
-
Leírás 4db hétszegmenses kijelz˝o szegmensei. 4db hétszegmenses kijelz˝o kiválasztó jelei. A kiegészít˝o panel szegmensei. A kiegészít˝o panel kiválasztó jelei. A Clock_divide bemenete. 50 Mhz-es órajel btn3. Lenyomásakor a rendszer órajel magas értéku˝ lesz btn2. Lenyomásakor a rendszer órajel alacsony értéku˝ lesz btn1. Lenyomásakor a rendszer órajel 10Hz, ellenkez˝o esetben az UP/DOWN btn0. Rendszer alapállapotba helyezése. Minden számlálót töröl.
ALU és regiszterek
Az el˝oz˝o órán elkészített áramkört egészítse ki regiszterekkel. A regiszterekhez FD4CE tárolót használjon. A kapcsolásban szerepl˝o jeleket az ábra szerint nevezze el (81. ábra). Az A és B regiszterek vezérlése a rendszer órajel lefutó élére történik. A regiszterek kimeneteit kösse rá az ALU bemeneteire. Az utasítás busz (INSTR) megfelel˝o jeleit kösse rá az ALU vezérl˝ojeleire.
Fig. 81. A CPU muveletvégz ˝ o˝ egysége és regiszterei Az A és B regiszter bemenete több forrásból származhat (bemenet, regiszterek, ALU, RAM, utasítás...), melyek közül a multiplexer választja ki az utasításnak megfelel˝ot (felhasználható makró: mux8_4bit). Az utasítás busz (INSTR) regiszterekre vonatkozó jeleit kösse a multiplexer kiválasztó bemenetére. A regiszterek lehetséges bemeneti forrásait kösse rá a multiplexer adatbemeneteire, ebb˝ol hagyja ki a RAMout kiválasztást, mivel ez a jel egy kés˝obbi gyakorlat során kerül a rendszerbe. Most konstans nulla értékkel helyettesítse ezt a bemenetet. A kiválasztott adat A vagy B regiszterbe való töltését az ABEN vezérl˝obit irányítja. A Bin_to_7_segment_x4 makró bekötéseit az alábbi táblázat tartalmazza (22. ábra). Szimulációval ellen˝orizze a muködést. ˝ Figyelje meg a programszámláló értékét, az utasításkódokat, valamint az A és B regiszterek értékeit. Az utasításmemóriában 82. ábra
71
TABLE 22 Kimenet portkiosztása Bemenet in_A in_B in_C in_D
Jel Aout(3:0) Bout(3:0) 0 0
szerinti program található.
Fig. 82. A mintaprogram mnemonikjai és utasításkódjai A szimuláció után próbálja meg letölteni a kapcsoláshoz tartozó konfigurációs fájlt az FPGA-ba és ellen˝orizze a muködést. ˝ Az FLAG bitek ellen˝orzésére és az órajel megjelenítésére használja az FPGA fejleszt˝opanelen található LED-eket.
Fig. 83. Ki-bemeneti egységek A következ˝o táblázat tartalmazza a laborgyakorlaton felhasznált ki-és bemeneti portokat (I/O port) (23. táblázat).
72
TABLE 23 Portkiosztás
5.4
Port név SEG4(7:0) AN4(3:0) SEG8(7:0) AN8(7:0) MCLK UP DOWN
Busz 8 bit 4 bit 8 bit 8 bit -
OCLK_EN
-
RST
-
SW(7:0)
8 bit
LED(3:0)
4 bit
Leírás 4db hétszegmenses kijelz˝o szegmensei. 4db hétszegmenses kijelz˝o kiválasztó jelei. A kiegészít˝o panel szegmensei. A kiegészít˝o panel kiválasztó jelei. A Clock_divide bemenete. 50 Mhz-es órajel btn3. Lenyomásakor a rendszer órajel magas értéku˝ lesz btn2. Lenyomásakor a rendszer órajel alacsony értéku˝ lesz btn1. Lenyomásakor a rendszer órajel 10Hz, ellenkez˝o esetben az UP/DOWN btn0. Rendszer alapállapotba helyezése. Minden számlálót töröl. 8db kapcsolóbemenet. SW(3:0) az input0 és SW(7:4) az input1 adatbemenete a CPU-nak. LED kimenet. FLAG-ek bitek és órajel kijelzése. LED(0): OVF; LED(1): CARRY; LED(2): ZERO; LED(3): clock
Kimeneti regiszterek, memória, ugró utasítás
A processzor két kimeneti regiszterrel rendelkezik (out0, out1). Ezek a négybites regiszterek az A regiszterb˝ol kaphatnak értéket. A kimeneti értékek tárolásához FD4CE tárolót használjon. A megfelel˝o kimeneti regiszter kiválasztása és az értékadás engedélyezése az OEN vezérl˝obitekkel történik. A két kimeneti regiszter értékének kijelz˝okön való megjelenítése megjelenítése a Bin_to_7_segment_x4 makróval történik a következ˝o táblázatnak megfelel˝oen. TABLE 24 ˝ portkiosztása Kijelzok Bemenet in_A in_B in_C in_D
Jel Aout(3:0) Bout(3:0) Out0 Out1
Fig. 84. A processzor blokkvázlatának részlete
73
A processzor az adatok tárolására adatmemóriát (RAM32X4S2 ) használ (Harvard architektúra). Az A regiszter értékét, az utasításban megadott címu˝ memóriarekeszbe lehet tölteni, vagy a megcímzett memóriarekesz értékét ki lehet olvasni. A memória 32 darab 4 bites adatot tud tárolni. A címzését az utasítás operandusának megfelel˝o része adja. Írás az MWE vezérl˝ojel logikai egyes értéke esetén történik. Oldja meg, hogy az mwe=1 jel esetén az A regiszter értéke tölt˝odjön be a memória utasításban megadott címu˝ rekeszébe. Memóriából regiszterbe töltés (rekesz kiolvasása) az mwe=0 jel és az A és B regiszter bemenetét adó multiplexer megfelel˝o vezérlésével érhet˝o el. Az ALU kimeneti jelz˝obitjei (flag-ek) az A és B regiszter változása esetén módosulhatnak. Egy FD4CE tárolóval oldja meg, hogy a jelz˝obitek mindig az utolsó ALU muvelet ˝ eredményét mutassák (ALU muveletnek ˝ tekintjük, ha az A és B regiszterek bemenetére az ALU kimeneti értéke kerül). Normál esetben az utasítás számláló minden utasítás után eggyel növekszik. Ugró utasítás esetén a program végrehajtását az utasításkódban megadott címt˝ol kell folytatni (INSTR(7:0)). Ehhez az utasításszámlálót a következ˝o ciklus el˝ott módosítani kell. Az ugróutasítás lehet feltétel nélküli, vagy feltételes. Feltétel nélküli ugrás esetén mindenképpen megváltozik az utasításszámláló értéke. A feltételes ugrásnál az ugrás bekövetkezése feltételhez kötött. A feltételeket az ALU ’Z’ (zero), ’C’ (carry), ’O’ (overflow) jelz˝obitjei szolgáltatják. Az ugró utasítás el˝otti ALU muvelet ˝ módosítja a jelz˝obitek értékét, és ennek függvényében az ugróutasítás vagy bekövetkezik (ekkor módosul a PC az utasításban megadott címre), vagy nem következik be (ekkor a PC értéke eggyel növekszik). TABLE 25 Ugró utasítások Utasításkód Br2, Br1, Br0 000 001 010 ... 111
Feltétel
ha ha ha ha
Z=1 Z=0 Z=1 Z=0 ...
Ugró utasítás bekövetkezése Nincs ugrás Ugrás feltétel teljesült Nincs ugrás Nincs ugrás Ugrás feltétel teljesült ... Ugrás feltétel teljesült
A szimuláció után próbálja meg letölteni a kapcsoláshoz tartozó konfigurációs fájlt az FPGA-ba és ellen˝orizze a muködést. ˝ A LED-eken az utolsó ALU muvelet ˝ eredményét jelz˝o FLAG bit értékeket és az órajelet jelenítse meg.
2. RAM32X4S: A memória rendelkezik külön adatbemeneti és külön adatkimeneti porttal. Órajel hatására olvasás mindig, de írás csak egy külön engedélyez˝o jel (WE) hatására történhet. WE – memóriába írás engedélyezése, D – adatbemenet, A – cím, O – adatkimenet, WCLK – adat kiolvasása a memóriából, és adat beírás, ha WE=1.
74
Fig. 85. A mintaprogram mnemonikjai és utasításkódjai
Fig. 86. Ki-bemeneti egységek TABLE 26 Portkiosztás Port név SEG4(7:0) AN4(3:0) SEG8(7:0) AN8(7:0) MCLK UP DOWN
Busz 8 bit 4 bit 8 bit 8 bit -
OCLK_EN
-
RST
-
SW(7:0)
8 bit
LED(3:0)
4 bit
Leírás 4db hétszegmenses kijelz˝o szegmensei. 4db hétszegmenses kijelz˝o kiválasztó jelei. A kiegészít˝o panel szegmensei. A kiegészít˝o panel kiválasztó jelei. A Clock_divide bemenete. 50 Mhz-es órajel btn3. Lenyomásakor a rendszer órajel magas értéku˝ lesz btn2. Lenyomásakor a rendszer órajel alacsony értéku˝ lesz btn1. Lenyomásakor a rendszer órajel 10Hz, ellenkez˝o esetben az UP/DOWN btn0. Rendszer alapállapotba helyezése. Minden számlálót töröl. 8db kapcsolóbemenet. SW(3:0) az input0 és SW(7:4) az input1 adatbemenete a CPU-nak. LED kimenet. FLAG-ek bitek és órajel kijelzése. LED(0): OVF; LED(1): CARRY; LED(2): ZERO; LED(3): clock
75
5.5
Programkód írás
A laborgyakorlaton az el˝oz˝o órák során elkészült négybites CPU-ra saját programot kell készíteni. A processzor INST_MEM nevu˝ utasításmemóriájának kezdeti tartalmát egy VHDL fájl (INST_MEM.vhd) írja le. A fájlban lehet˝oség van kézzel átírni az egyes rekeszek értékét egy megadott utasítás hexadecimális kódjára. Ezáltal szerkeszthet˝oek a processzor utasításmemóriájában lév˝o utasítások. A programkód készítésének egyszerubb ˝ módja, ha az utasításokat azok memonikjaival adjuk meg, majd az így leírt programot egy fordító gépi kódra fordítja le. A laborgyakorlat során a dt4bit_CPU_assembler nevu˝ program (87. ábra) segítségével készíthetjük el a forráskódot, fordíthatjuk le gépi kódra és cserélhetjük ki az utasításmemória alapértelmezett tartalmát. Miután az utasításmemória (INST_MEM.vhd) tartalma megváltozott, az ISE WEBPACK szoftver segítségével újra le kell fordítani a projektet, és lehet˝oség van a szimulációra, vagy az FPGA-ra való letöltésre. Az így letöltött CPU konfigurációs fájl, már az új programkódot tartalmazza. A Szerkeszt˝o felület-en van lehet˝oség a program forráskódjának szerkesztésére, ide kell leírni az utasításokat. A fordító számára elérhet˝o utasítások az Elérhet˝o utasítások listája nevu˝ részben található. A szerkeszt˝o felületen csak a következ˝o karakterek használhatóak: • az angol ABC kisbetui ˝ (a..z), • számjegyek (0. . . 9), • kett˝ ospont, címke megadására (:), • tabulátor az utasítások tagolására (TAB), • enter a sorok elválasztására (ENTER). Egy sor tagolása a következ˝o kell, hogy legyen: A címkét és az argumentumot nem kötelez˝o megadni. Ha az utasítás nem tartalmaz argumentumot, akkor az utasítás után új sort kell kezdeni. Ha a sor címkét nem tartalmaz, akkor a sort tabulátorral kell kezdeni, egyébként a címkének kett˝osponttal megadva kell a sor elején szerepelnie. A címke hossza maximum 3 karakter lehet a kett˝ospontot nem számolva. Az egyes részeket (címke, utasítás, argumentum) tabulátorral kell elválasztani egymástól. A Forrásfájl muveletek-nél ˝ lehet˝oség van a forráskód elmentésére, vagy egy már meglév˝o program betöltésére. A Fordítási opciók terület két gombot tartalmaz, az egyik a Szintaktikai ellen˝orzés, ilyenkor a szerkeszt˝ofelületen elkészült programnak a szintaktikai ellen˝orzése történik meg. Az esetleges hibaüzenetek a Fordítási üzenetek panelen jelennek meg. Amennyiben szintaktikai hibát vétettünk, a hibaüzenetre kattintva a fordító megjelöli a hibás sort (89. ábra). A Fordítási eredmények panelen az utasítások programmemóriában elfoglalt helye, az utasítás és az utasítás hexadecimális kódja látható. A Fordítás gombot választva el˝oször egy szintaktikai elemzés fut le, és ha nem volt szintaktikai hiba a programkódban, a fordító az utasításmemória (INST_MEM.vhd) tartalmát kicseréli az aktuális programkódra. Ebben az esetben a "Szintaktikai ellen˝orzés és Fordítás kész!" üzenetet kapjuk.
76
Fig. 87. Fordító program felépítése Els˝o feladatként indítsa el a projektkönyvtárban található assemblerDTcpu4.exe fájlt. Nyissa meg a prog/example_for.txt fájlt (54. ábra). A példaprogram egy for ciklust valósít meg. Az els˝o utasítások az input0 bemenet értékét olvassák be, majd az out0 kijelz˝ot nulla értékre állítják be. Végül az out0 értéke addig fog növekedni, amíg eléri az input0-ról beolvasott értéket. Fordítsa le a programot, majd az ISE WEBPACK szoftver segítségével készítse el az FPGA-ra letölthet˝o konfigurációs fájlt, és töltse le az FPGA fejleszt˝opanelre. Figyelje meg a program muködését. ˝ A programrészlet c szintaktikai megfelel˝oje: 2 4 6
unsigned i n t v ; v = in ( 0 ) ; f o r ( unsigned i n t i = 0 ; i <= v ; i ++) { out ( 0 ) = i ; } while ( t r u e ) { }
../sections/src/codeFor.vhd
77
Fig. 88. Mintaprogram for ciklusra
R EFERENCES [1] Xilinx Inc. [2] Xilinx
(weblink: http://www.xilinx.com)
Spartan-3E
FPGA
Family
Data
Sheet
Xilinx
Inc.,
DS312
October
29,
2012
http://www.xilinx.com/support/documentation/data_sheets/ds312.pdf) [3] Digilent Diigiillentt Basys2 Board Refference Manuall
Digilent, Inc., Doc: 502-155, November 11, 2010
(weblink:
78
Fig. 89. Mintaprogram for ciklusra, hibaüzenettel