1. Popis SoC (System on Chip) pro picoBlaze Systém na čipu (1) (SoC) integruje procesor jeho paměti (RAM a ROM) a další periferie. Systém na čipu mohou npříklad být i komerčně dostupné jednočipové mirkopočítače. Hlavní nevýhody těchto komerčních řešení bývají buď přebytek periferii nebo naopak by se nám pro cílovu aplikaci dobře hodila jiná nestandartní periferie. Další nevýhodu komenrčních řešení většinou bývá předymenzovaný výkon procesoru, který vedek k vyšší spotřebě zařízení než by nutně musela být (platí pokud neporovnáváme SoC v hradlovém poli). Z těchto důvodů je dobré znát jak takvý systém funguje a jak ho sestavit.
1.1. Jak to funguje Základní stavební bloky SoC jsou v podstatě tři: 1. 2. 3.
Mirkoprocesor Propojovací sběrnice (2), případně NoC (Network on Chip) (3) Periferie (paměti RAM, ROM, GPIO, I2C kontrolerj aj.)
Základní strukura SoC závisí hlavně na použitém mikroprocesoru a to jeho vlastní sběrnicové architektuře. V případě, že procesor je Vonneumanova typu (4) bez zvlášní sběrnice pro komunikaci s periferiemi tak paměti a periferie sdílejí spoloečný adresový prostor. V případě, že procesor má zvláštní sběrnici pro připojení periferii jsou paměti připojene na pměťovu sběrnici a periferie na sběrnici pro periferie. Je také možné, aby periferie, které požadují rychlou obsluhu, tzv. paměťově mapované periferie (5), sdílely adresový prostor s paměťovu sběrnicí. V případě, že procesor má harwardsou architekturu (5) a nemá speciální sběrnici pro přípojení periferii je situace obdobná jako v předchozím případě s tím rozdílem, že paměť programu je připojena na vlastní sběrnici a paměť dat sdílí adresový prostor s periferiemi. V případě, že procesor má zvlaštní sběrnici pro periferie je zase situace obdobná jako u Vonneumanova typu. Na Obrázek 4 je vidět základní struktura SoC, kde CPU, představuje PicoBlaze procesor (3) s integrovanými pamětmi a vyvednou sběrnicí pro periferie. Tato sběrnice je přivedena do bloku „WB CNTR.―, který tvoří mezistupeň mzi sběrnici procesoru a Wishbone sběrnicei (7) a bloku „WB STR―, který řídí výběr jednotlivých periferii, se kterými se bude komunikovat na základě adresy (Chip Select). Na Wishbone sběrnici jsou již připojene periferie jako GPIO, I2C, PIC atd. Každá periferie může mit svůj zdroj přerušení, který musí být přiveden, v případě že je použit, do PIC (Programmable Interrupt Controler).
1.2. Popis Wishbone sběrnice Wishbone sběrnice je univerzální sběrnice navřžne právě pro CoS. Její specivikace volně dostupná a je použitelná pro velkou škálu systému od jednoduchých mikropočítaču až po komlexní MCSoC (Multi Core System on Chip). Základní vlastnoti sběrnice jsou: -
-
Jednoduché a kompaktní IP (Intelectual Propery) jádro Podpora nejrůznějších druhu datový přenosů o READ/WRIE cykly o RMW o Blokové přenosy Šířka sběrnice až 64b Typ sběrnice MASTER/SLAVE a podpora MultiMaster Arbitrace definovatelná uživatelem Umožnuje přenos každý hodinový ciklus 1
-
Možnost prodloužení sběrnicového ciklu
Na Obrázek 4 je vidět základní schéma sběrnice. Prvním blokem je SYSCON, tento blok obstarává reset sběrnice a distribuci hodinového sygnálu mezi ostatní moduly. Dále může přidělovat sběrnici jenotlivým mastrum pokud je to potřeba (na obrázku není naznačeno). Další modul je MASTER (procesor, DMA aj.), který posílá požadavky na sběrnici a modul SLAVE (periferie, paměti), který příjíma požadavky na sběrnici a odpovída na ně.
SYSCON
CLK_I
BUS
BUS
RST_I
SLAVE
MASTER
CLK_O
RST_O
CLK_I
RST_I
Obrázek 1 - Základní shéma Wishbone sběrnice.
1.1.1.
Wishbone signály Tabulka 1 - Společné signály MASTR a SLAVE
Signál
Popis
CLK_I
Hodinový signál sběrnice, který řídí aktivity na sběrnici. Výstuní signály na sběrnici se čtou s náběrnou hranou.
DAT_I()
Vstupní data až 64b
DAT_O()
Výstupní data až 64b
RST_I
Restart sběrnice a připojených bloků
TGD_I()
Vstupní datový tag (volitelný)
TGD_O()
Výstupní datový tag (volitelný)
Tabulka 2 - Signály MSTER Signál
Popis
STB_O
Indikuje platný datový přenos. Možno použí i jako čip slelekt pro jednotlivé moduly
CYC_O
Pokud je nastavený indikuje začátek sběrnicového cyklu a je ktivní po celou jeho dobu.
LOCK_O
Uzamčení sběrnice (Nepovinný)
WE_O
Pokud je nastavený indikuje zápis jinak čtení. 2
ADR_O()
Vystupní adresa
TGA_O()
Adresový tag (Nepovinný)
SEL_O()
Byte strobe signál. Vybírá které bajty na sběrnici budou platné (Nepovinný)
TGC_O()
Tag cyklu (Nepovinný)
ACK_I
Pokud je nstavený indikuje normální ukonční sběrnicového ciklu.
RTY_I
Požadavek na prodlužení sběrnicového cyklu (Nepovinný)
ERR_I
Indikuje nenormální/cybové ukonční ciklu. Odezva záleží na uživateli (nespecifikována)
STALL_I
Indikuje, že slave není shopný prijmout přenost typu trasacton queue. (Jen v pilelined modu jinak nepoviný)
Tabulka 3 - Signály SLAVE
Signál
Popis
STB_I
Indikuje platný datový přenos. Možno použí i jako čip slelekt pro jednotlivé moduly
CYC_I
Pokud je nastavený indikuje začátek sběrnicového cyklu a je ktivní po celou jeho dobu.
LOCK_I
Uzamčení sběrnice (Nepovinný)
WE_I
Pokud je nastavený indikuje zápis jinak čtení.
ADR_I()
Vystupní adresa
TGA_I()
Adresový tag (Nepovinný)
SEL_I()
Byte strobe signál. Vybírá které bajty na sběrnici budou platné (Nepovinný)
TGC_I()
Tag cyklu (Nepovinný)
ACK_O
Pokud je nstavený indikuje normální ukonční sběrnicového ciklu.
RTY_O
Požadavek na prodlužení sběrnicového cyklu (Nepovinný)
ERR_O
Indikuje nenormální/cybové ukonční ciklu. Odezva záleží na uživateli (nespecifikována)
STALL_I
Indikuje, že slave není shopný prijmout přenost typu trasacton queue. (Jen v pilelined modu jinak nepoviný)
3
Adresové tagy slouží pro případné další řízení zběrnicového ciku. Mohou například určovat že se jedná o ciklus typu RWM (Read Modifi Write), nebo wrapped ciklus a podobně. Datové tágy nesou informace ohledně právě přednášenách datech například časové razítko a podobně. 1.1.2.
Časování a průběh ciklu zápis a čtení
Ciklus samostatného čtení probíhá následovně: 1.
2.
3.
Hrana CLK_I - Mster nastaví platnou adresu ADDR_O() a připadně TGA_O() - Master nuluje signál WE_O a tím indikuje čtení - Master nastaví SEL_O() je-li použito - Master naství signál CYC_O a TGC_O() je-li použito (začátek ciklu) - Master natavi signál STB_O indikující začátek přenosu Hran CLK_I - Slave dekoduje vstupu a odpoví nastavením ACK_I - Slave naství platná data na DAT_I() a TGD_I() (směr k mastru) je-li použito - Slave naství ACK_I jako odpověď na STB_O indikující platná data - Master monitoruje ACK_I aby mohl zachytit data i. Slave může taky vložit čekací cikly Hrana CLK_I - Master načte data DAT_I() a případně TGD_I() je-li použito - Master vynuluje signály STB_O a CYC_O indikujicí konec ciklu - Slave nuluje ACK_I v odpověďi na vynulování STB_O
Obrázek 2 - Klasický read ciklus.
Cilus zápisu pak probíha takto:
4
1.
2.
3.
Hrana CLK_I - Master nastvi platnou adresu ADR_O() a případně TGA_O() - Master naství platná data DAT_O() a případně TGD_O() - Master nastaví WE_O aby indikoval zápis - Master nastaví SEL_O() je-li použito - Master nastaví CYC_O a TGC_C() je-l použito - Master nastavi STB_O aby indikoval začátek přenostu Hrana CLK_I - Slave dekoduje vstupu a nastvi ACK_I - Slave připravi zachycení dat DAT_O() a případně TGD_O() - Slave naství ACK_I jako odpověd na STB_O - Master monitoruje ACK_I a jako odpověď ukončí sběrnicový ciklus Hran CLK_I - Slave načte data DAT_O() případně TGD_O() - Master vynuluje signály STB_O a CYC_O aby ukončil ciklus - Slave vynuluje ACK_I jako odpověd na STB_O
Obrázek 3 - Klasický write ciklus.
1.3. Popis navrženého SoC Základní topologie navržého CoC je vidět na Obrázek 4. Hlavní prvky celého systemu jsou tvořeny třemi bloky a to CPU, Wishbone Controler + Wishbone strobe a periferiemi či samotmou sběrnicí. Hlavní procesor je tvořen softwarovým procesorem PicoBlaze (7). Jedná se o 8b RISC procesor a může být nahrazen jakymkoliv jiným procesorem, který je kompalibiliní s wishbone směrnici (pro externí zařízení) nebo má sběrnici kompatibiliní s Wishbone kontrolerem.
5
WB STR.
WB BUS
WB BUS
WB BUS
WB BUS
SPI
STB/CS
WB BUS
STB/CS WB BUS
INT
PIC
I2C STB/CS
STB/CS
GPIO
STB/CS
INT
WB CNTR.
CPU BUS
CPU
CPU BUS
CPU ADR
Wishbone kontoler tvoři most mezi sběrnici procesoru PicoBlaze a Wishbone sběrnicí. Wishbone strobe vybírá dle adresy přípojenu periferii, se kterou se bude komunikovat. Registry se, kterými se bude komunikovat jsou definovány adresovou sběrnicí.
UART
Obrázek 4 – Příkad SoC
1.1.3.
GPIO modul
Tento modul funguje stejně jako u větišiny mikrokontroleru. Má dvá registry, jeden datový pro čtení a zápis, který souží pro čtení nebo zapisování dat z vnějších vývodů dle stavů řídícího registru. Druhý registr řídí jestli daný vývod bude vstupní nebo výstupní 1 – vstupní (Input) 0 – výstupní (Output). GPIO IO registr je na adrese 0x00 a GPIO DIR registr je na adrese 0x01. Tabulka 4 – Registry GPIO modulu.
Registr DREG DIR 1.1.4.
Adresa 0x00 0x01
Přístup RW RW
Popis Vstupně výstupní registr Nastavení vývodů jako vstupn nebo výstup.
I2C modul
Jde o kompatibilní master modul pro komunikaci po I2C sběrnici. Tentomodul má 5 registrů mapované na adresy 0x20 do 0x24. Jejich význam a podrobný popis modulu viz (9).
6
Tabulka 5 – Registry I2C modulu.
Registr PRERlo PRERhi CTR TXR RXR CR SR
1.1.5.
Adresa 0x20 0x21 0x22 0x23 0x23 0x24 0x24
Přístup RW RW RW W R W R
Popis Hodninová předdělička nižší bajt Hodninová předdělička vyšší bajt Řídící registr Vysílací registr Přijímací registr Příkazový registr Stavový registr
PIC modul
Jedná se o jednoduchý programovatelný řadič přerušení s nastvitelným počtem zdrojů přerušení (v našem případě však 8). Umožňující nastavit reakci na hranu či plolaritu signálu vyvolavajícího přerušení. Tento modul má 4 řídící registry mapované na adresy 0x60 až 0x63. Tabulka 6 – Registry PIC modulu.
Registr EDGEN POL MASK IPR 1.1.6.
Adresa 0x60 0x61 0x62 0x63
Přístup RW RW RW RW
Popis Povolení detekce hrany Výběr polarity přerušovacího signálu Maskování zdrojů přerušní Stav zdroje přerušení
SPI modul
Jde o jednoduchý SPI modul, který má 4 registry mapované na adresy 0x40 až 0x43. Popis registristru a modulu viz. (10). Tabulka 7 – Registry SPI modulu.
Registr SPCR SPSR SPDR SPER
1.1.7.
Adresa 0x40 0x41 0x42 0x43
Přístup RW RW RW RW
Popis Řídící registr Stavový registr Datový registr Rozšírující registr
UART modul
Je modul pro asinchronní komunikaci, který má dva registry mapované na adresy 0x80 a 0x81. První slouží pro čtení a zápis přijímaných/odesílaných dat a stavový registr. Přenosová rychlost je pevně nastavitelná pomocí parametru modulu v generics. Podrobný popis modulů a registrů viz (11). Tabulka 8 – Registry UART modulu.
Registr RXR TXR SR
Adresa 0x00 0x00 0X01
Přístup R W R
Popis Přijímací registr Vysílací registr Stavový registr
7
1.1.8.
Další moduly
Je samozdřejmě možné do systému přídávat další moduly dle potřeby nebo znásobit například GPIO modul dle potřeby. Je vždy však nutné správně nastavit adresy přidavaných modulů aby nedocházelo ke konfliktům na sběrnici. Navržený SoC podporuje adresovaní 8 modulů s 32B adresovým prostorem. Toto rozdělení lze směnit v Wishbone strobe modulu.
1.4. Nástroje pro tvorbu programu Pro picoBlaze existuje jak asembler (12) tak i C překladač (13), který však není zatím plně funkční ale pro jednoduché aplikace je dostačující.
2. Popis navrženéhé implemntace procesoru picoBlaze Navržená implementace procesoru picoBlaze se skládá z několika základních částí jako většina procesoru a vykonávání instrukce je řízená dvou stavovým stavovým automatem podobně jako je popsáno v originální dokumentaci k procesoru (7).
Obrázek 5 - architektura picoBlaze (3).
Na Obrázek 5 je vidět blokové schéma procesoru pocioBlaze jeho jednotlivé části budou popsány v následujících kapitolách.
1.5. Programová pamět Pamět progamu slouží pro uložení instrukcí vykonavaných procesorem. V našem návrhu je tvořena VHDL modulem z názvem „ROM_CODE―, který je univerzalně vytvořen pro všechny typy picoBlaze procesoru a je automatický generován z picoBlaze IDE. Obshauje taky proces umužnující nahrání nového programu do této paměti pomoci JTAG programátoru.
1.6. Programový čítač Programový čítač slouží pro gnerování adres pro načítání požadovnaých instrukci z paměti programu. V podstatě se jedná o sinchronní čítač s přednastavením. Tento čítač pracuje ve statavu 0. Hodnota pro přednatavení se může vybírat ze dvou hodnot a to v případě skoku a volání podprogramu se jedná o pevnou adresu separovanou z instrukce a nebo se může jednat v případě návratu z podprogramu nebo přerušení o adresu
8
uloženou v zásobníku. Z tohoto důvodu je před vstupem pro přednastavení multiplexor, který v závilsloti na instrukci vybírá odpovidající zdroj přednatavení.
1.7. Zásobník Zásobník soluží pro úkládání návratových adres při volání podprogramu a při přerušení. V našem případě je záspbník tytvořeni pomoci FIFa s možností uložení až 64 navratových adres. Na Obrázek 66 je vidět jak takové FIFO pracuje. Má ukaztatel pro zápis a ukazatel pro čtení hodnot z FIFa, které se při zápisu inkrementují a při čtení dekrementují. Tento zásobník je obsažen ve VHDL modulu „stack_fifo―. Tento modul má dva porty jeden pro čtení a jeden pro zápis, čtení probíhá ve stavu 1 procesoru a zápis ve stavu 0.
0 1
In
Out
2 ... 62 63 Obrázek 6 - struktura FIFa.
1.8. Instrukční dekodér V našem popisu jsou bloky pro dekodování instrukce, řízení přerušení a řízení toku programu schovany v VHDL modulu „idec―. Blok „idec― obsahuje dva procesy první proces dekoduje instrukce z paměti programu a sleduje stav přerušení. V případě, že signlál „INTERRUPT― je aktivní tak se provede specialní (programátoru nepřístupná instrukce „interrupt―, která se chová stejně jako instrukce „call― s tím, že adresa volání podprogramu je pevně daná. Dalším úkolem, který tento proces vykonává je separovaní ne instrukčních polí v instrukci jako jasou konstanty a adresy pracovních registrů. Natavuje se zde také signal určující zda se bude pracovat s konstantními daty nebo jen s adresami registru. V druhém procesu modulu „idec― se podle dekodováné instrukce nastavují řídící signály např. jestli se jedná o aritmetickou, logickou či jonu operaci probíhá zde i rozhodnitu (pohým řízením zda se do programového čitače zapiše nová adresa a nebo se pude pokračovat) zda se bude skákat u podmíněných skoků a podobně. Tento blok je aktivní ve stavu 0 (z kažkou lichou náběžnou hranou hodninového signálu).
1.9. Scratch pad pamět Jedná se o paměť ram v našem popisu je tvořena VHDL modulem „dc_mem―. Jde o sinchronní pamět RAM s velikosti 64B.
1.10.
Registry
Jde o dovu portovnou pamět RAM kde jeden port je jak pro čtení tak zápis a jeden je jen pro čtení. V této paměti jsou pracovní regystry procesoru. Tento blok je možno najít ve VHDL modulu „reg_file―.
1.11.
ALU
Je základní vypočetní jednotkou každého procesoru. Skládá se, v našem případě ze dovu základních částí a to aritmetická část pro operace sčítání a dočítáaní, logická část pro logické operace (and, or, xor a přesuv) a části zajištující posuvy a rotace.
9
3. Citovaná literatura 1. System-on-a-chip. Wiki. [Online] [Citace: 20. 12 2010.] http://en.wikipedia.org/wiki/System-on-achip. 2. Bus (computing). Wiki. http://en.wikipedia.org/wiki/Bus_(computing).
[Online]
3. network On Chip. Wiki. http://en.wikipedia.org/wiki/Network_On_Chip.
[Citace:
[Online]
4. Von Neumannova architektura. Wiki. http://cs.wikipedia.org/wiki/Von_Neumannova_architektura.
20.
[Citace:
[Online]
20.
[Citace:
14.
12
2010.]
12
2010.]
12
2010.]
5. Memory-mapped I/O. Wiki. [Online] [Citace: 20. 12 2010.] http://en.wikipedia.org/wiki/Memorymapped_I/O. 6. Harvardská architektura. Wiki. http://cs.wikipedia.org/wiki/Harvardská_architektura.
[Online]
[Citace:
14.
7. Xilinx. [Online] 26. January 2010. [Citace: http://www.xilinx.com/support/documentation/ip_documentation/ug129.pdf. 8. OpenCores. Wishbone B4. http://cdn.opencores.org/downloads/wbspec_b4.pdf.
[Online]
2010.
12.
[Citace:
12
2010.]
8
2010.]
12.
8
2010.]
9. Herveille, Richard. Opencores.org. I2C controller core. [Online] 3. July 2003. [Citace: 30. 8 2010.] http://opencores.org/project,i2c. 10. —. OpenCores.org. SPI http://opencores.org/project,simple_spi.
core.
[Online]
7.
January
2003.
[Citace:
30.
8
2010.]
11. Carton, Philippe. OpenCores.org. Serial Uart. [Online] 10. September 2002. [Citace: 30. 8 2010.] http://opencores.org/project,miniuart2. 12. pBlazIDE. Mediatronix. [Online] http://www.mediatronix.com/pBlazeIDE.htm.
5.
1
2006.
[Citace:
30.
8
2010.]
13. PicoBlaze C Compiler. Faculty of Information Technology. [Online] 2009. [Citace: 30. 8 2010.] http://www.fit.vutbr.cz/research/prod/index.php.en?id=126¬itle=1. 14. Damjan Lampret, Goran Djakovic. Opencores.org. General-Purpose I/O (GPIO) Core. [Online] 17. December 2003. [Citace: 30. 8 2010.] http://opencores.org/project,gpio.
10