• No results found

Linuxový ovlada£ PCIe karty s FPGA obvodem Virtex 5

N/A
N/A
Protected

Academic year: 2022

Share "Linuxový ovlada£ PCIe karty s FPGA obvodem Virtex 5"

Copied!
44
0
0

Loading.... (view fulltext now)

Full text

(1)

Linuxový ovlada£ PCIe karty s FPGA obvodem Virtex 5

23. kv¥tna 2011

verze 1.1c qw¥°´ýúíópᲤfghjklºx£vb¬m QW…”ÝÚÍÓPÁ’„FGHJKŚXƒVBŒM 1 - titulní stránka z doc (1 list) (http://www.fm.tul.cz/material_DS)

(2)

2 - oboustranný zadaní z sekretariátu (1 list) doma

(3)

3 - prohlá²eni z docu (1 list) (http://www.fm.tul.cz/material_DS)

(4)

Rád bych pod¥koval Ing. Martinu Rozkovci za ve²kerou pomoc, p°ipomínky rady a korekturu p°i vypracovávání této diplomové práce. Stejn¥ jako mým rodi£·m za podporu ve studiu.

(5)

Abstrakt

Diplomová práce vznikla za ú£elem ov¥°ení funkce PCIe ve ²kolní kart¥

ML506 s FPGA Virtex 5 a navrhnutí komunika£ního rozhraní pro osobní po-

£íta£ vybavený opera£ním systémem GNU/Linux. Zárove¬ má slouºit jako seznámení se s programovacími prost°edky v jád°e Linux a jako základní popis sb¥rnice PCIe. Na po£íta£i v úloze hostitele karty byl vytvo°en linu- xový ovlada£ komunika£ního rozhraní. ƒinnost PCIe za°ízení na FPGA kart¥

byla ovládána pomocí programu b¥ºícího na embedded procesoru Microb- laze. Schopnost komunikace mezi FPGA kartou a hostujícím po£íta£em se demonstrovala pomocí jednoduché aplikace MP3 enkodéru. Enkodér byl vy- brán podle nejvhodn¥j²ích vlastností a portován do platformy Microblaze.

Záv¥r práce shrne moºnosti, kudy by mohly pokra£ovat p°ípadné dal²í pro- jekty.

Klí£ová slova

• GNU/Linux

• ovlada£e

• Microblaze

• FPGA

• PCIe

(6)

Abstract

Thesis was created for testing purpose of PCIe function in school card ML506 with FPGA Virtex 5 and for developing communication interface on personal computer equipped with operating system GNU/Linux. At the same time its purpose is learning programming resources in Linux kernel and basic description of PCIe bus. Linux driver was created on computer in task as host. Operation of PCIe device on FPGA card was controlled by running program on embedded processor Microblaze. The ability to commu- nicate between FPGA card and host computer was demonstrated by simple application of MP3 encoder. Encoder was chosen in compliance with required features and was ported into Microblaze platform. Resume of thesis will draw up possibilities, by which way next projects can go.

Keywords

• GNU/Linux

• drivers

• Microblaze

• FPGA

• PCIe

(7)

Obsah

1 Úvod 9

1.1 Pouºité prost°edky k vypracování . . . 9

2 Specikace PCIe 11 2.1 Hardwarové vlastnosti PCIe . . . 11

2.2 Programování PCI . . . 14

2.3 PCIe na desce s FPGA . . . 15

3 Ovlada£e v jádru Linux 17 3.1 Linuxový ovlada£ . . . 17

3.2 Základní funkce modulu . . . 18

3.3 Inicializace za°ízení . . . 19

3.4 IO operace znakového za°ízení . . . 20

3.5 P°eru²ení . . . 21

3.6 Semafory, tasklety a zbylé prost°edky v ovlada£i . . . 21

4 Problematika univerzálního komunika£ního rozhraní 23 4.1 Buery pro p°enos dat v ovlada£i . . . 24

4.2 Mailboxy . . . 24

4.3 DMA . . . 25

4.4 Shrnutí . . . 26

5 Demonstra£ní úloha 27 5.1 Hardware . . . 27

5.2 Softwarové prost°edí . . . 30

5.3 Popis MP3 formátu . . . 32

5.4 Výb¥r MP3 enkodéru . . . 33

5.5 Portace MP3 knihovny . . . 34

5.6 GNU/Linux . . . 36

6 Záv¥r 38

Reference 44

(8)

Seznam obrázk·

1 Fyzická podoba r·zných velikostí PCIe slot·. Pouºita graka z [5] . . . 12

2 Obecné blokové schéma, které m·ºe implementovat ovlada£ . . . 26

3 Blokové schéma IP jader na FPGA (pouze d·leºité prvky) . . . 29

4 Automat zpracování dat a handshake signál· . . . 31

5 Formát rámce, pouºit obrázek z Wikipedie, uvoln¥ný pod licencí Creative Commons Attribution 2.5 Generic [10] . . . 32

6 Ilustrace návrhu jednoduchého alokátoru pam¥ti . . . 36

Seznam tabulek

1 Uspo°ádání signál· v PCIe konektoru . . . 13

2 Orienta£ní rychlosti dosahované kartou . . . 39

(9)

1 Úvod

Cílem práce je zprovozn¥ní komunikace s vývojovou deskou/kartou ML506 (nebo kompa- tibilní z °ady ML50x a XUPV5) p°es sériovou sb¥rnici PCIe, konkrétn¥ do osobního po£í- ta£e s opera£ním systémem GNU/Linux. P°ipojením karty do osobního po£íta£e je moºno n¥jakou £innost sloºitou na paralelní výpo£ty efektivn¥ p°evést z hlavního procesoru na PCIe za°ízení. Je to stejné °e²ení, jaké pouºívá gracký akcelerátor pro vykreslování 3D scény.

Vývojová karta obsahuje obvod typu FPGA (Field-programmable Gate Array). Obvod dokáºe simulovat chod logického sekven£ního nebo kombina£ního návrhu, pomocí makro- blok·, jenº lze programov¥ tém¥° libovoln¥ propojovat. To £iní z FPGA optimální °e²ení pro pouºití p°i testování hardwarových návrh· p°ed nálním sestavením návrhu na zápis do obvodu ASIC nebo za£átkem litograckého návrhu. Kongurace propojení blok· na FPGA se ukládá do volatilní pam¥ti p°ímo na £ipu, po vypnutí napájení se kongurace ztratí. V sou£asných verzích se v FPGA vyskytují i pevné bloky (hard core), které jdou do kongurovatelného hardware (soft core) p°ipojovat. Reáln¥ je tvo°í fyzická rozhraní s vn¥j²í £ástí, násobi£ky (ozna£ované jako DSP bloky), procesorové bloky, blokové pam¥ti ( BRAM) a jiné. Takové bloky pak budou mít mnohem vy²²í výpo£etní výkon neº bloky sestavené z kongurovatelných bun¥k. Sou£asn¥ bude zachována dostate£ná kongurova- telnost.

Práce si také klade za úkol oz°ejmit funkci PCIe sb¥rnice a re²er²i programovacích prost°edk· jádra GNU/Linux vzhledem k vývojové kart¥. Dal²ím hlavním cílem je návrh komunika£ního rozhraní mezi PC a kartou pro p°ípadné dal²í projekty. D·leºitý je i fakt, ºe zatím neexistuje ºádné pojednání o tématu v £eském jazyce (a dostupným na TUL).

Od výrobce (Xilinx) existují základní datasheety a návrhy komunikace. Jsou ale ur£ené pro pr·myslový vývoj PCIe sb¥rnice a jako návod na detekci chyb v návrhu. V návodu m¥°ení £innosti sb¥rnice se pouºívá nan£n¥ nákladný analyzér sb¥rnice PCIe od rmy LeCroy.

1.1 Pouºité prost°edky k vypracování

Vypracování práce probíhalo na po£íta£i Gigabyte Technology EP41-UD3L, který je vy- baven PCIe sb¥rnicí. Na po£íta£i byla nainstalována linuxová distribuce Slackware 13.1 ve verzi pro procesor se 64 bity. Ovlada£ byl zkompilován na jád°e 2.6.33.4 vývojového stromu vanilla.

Embedded systém byl vytvo°en v návrhovém prost°edí Xilinx 12.2. Návrh se syn- tetizoval pro FPGA Virtex-5 (xc5vsx50t) kartu ML506 kompatibilní. Softwarová £ást

(10)

embedded systému je ve form¥ standalone programu pro 32 bitový procesor Microblaze realizovaném na obvodu FPGA.

Návrh projekt· pro kartu se provádí ve t°ech základních programech:

Xilinx EDK Embedded Development Kit. V EDK se navrhují sb¥rnice, periferie a jejich umíst¥ní v pam¥ti. Nastavuje se zde i spojování vnit°ních signál· a jejich p°ípadné mapování na výstupní piny FPGA. Provádí se zde kone£ná syntéza obvodu a umís- t¥ní na FPGA.

Xilinx ISE Integrated Software Environment (pojmenování je z°ejm¥ z historických d·- vod·). Pouºívá se na vývoj nových periferií, pomocí n¥kterých z jazyk· pro popis hardware.

Xilinx SDK Software Development Kit. Prost°edí návrhového systému pro tvorbu pro- gram· b¥ºícího na FPGA a ovládajícího periferie. Prost°edí vyuºívá návrh logické struktury hardware z EDK a oºivuje ho programem. Vytvo°ení program se m·ºe v SDK také ladit.

Karta obsahuje mnoho periferií, nebo´ je ur£ena pro univerzální vývoj hardware. Zají- mavé jsou nap°íklad Compact Flash karta, VGA video výstup, USB (Universal serial bus) port, zvukový port, znakový LCD 16x2, ethernet a v neposlední °ad¥ i moºnost p°ipojení na PCIe sb¥rnici. Desku s FPGA m·ºeme zasunout p°ímo do po£íta£e jako oby£ejnou PCIe kartu a pomocí návrhu hardware vytvo°it úpln¥ novou periferii, nap°íklad USB

°adi£, ethernet nebo pomocnou kartu zpracovávající data.

Více informací o návrhu v prost°edí Xilinx najde zájemce v bakalá°ském projektu [9].

(11)

2 Specikace PCIe

PCIe (Peripheral Component Interconnect Express) je v sou£asné dob¥ nejroz²í°en¥j²í sb¥rnice na osobních po£íta£ích pro p°ipojování roz²i°ujících karet. Byla vyvinuta v roce 2004 ze star²í sb¥rnice PCI, p°i£emº jeden z d·vod· byl problém zvy²ování rychlosti p°enos·. Díky své roz²í°enosti a vlastnostem je pouºívaná i v embedded platformách.

2.1 Hardwarové vlastnosti PCIe

P°i vysoké rychlosti na relativn¥ velkou vzdálenost od procesoru dochází u paralelní sb¥rnice, jako je PCI k ru²ení datových linek a r·znému zpoºd¥ní bit·. PCIe je na rozdíl od p°edch·dkyn¥ zaloºeno na sériové sb¥rnici p°es diferenciální vedení. Problém zpoºd¥ní na paralelních linkách je tedy eliminován a p°ípadné ru²ení se na diferenciálním vedení potla£í. Výhodou je pak také mnohem jednodu²²í fyzické provedení (konektor, slot).

Pouºití sériové sb¥rnice má ale i své nevýhody. Je nutné pro stejnou p°enosovou rychlost posílat data mnohem rychleji neº u paralelního p°enosu, coº má v kovovém vodi£i své fyzikální omezení. Pro náro£né aplikace se jednotlivé linky sdruºí do logických celk·. Více linek pouºívají hlavn¥ gracké karty a aplikace, kde se p°ená²í mnoho dat.

Základní rychlost jedné linky PCIe je 2.5 Gbps a to samostatn¥ pro vstupní i výstupní sm¥r. V dal²ích verzích PCIe se tato rychlost zvy²uje a pro jednu z maximálních moºných kongurací je to pro verzi 3.0 a 32 linek 256 Gbps. Samotná datová rychlost je ale niº²í, nebo´ se pro r·zné verze pouºívá jiné kódování. Kup°íkladu verze 2 pouºívá 8/10 (neboli 8 bit· zakóduje do 10 bit·). Po£et linek v PCIe je tedy od jedné linky aº po £íslo 32. V praxi se pouºívají hlavn¥ hodnoty 1, 4, 8 a 16 (jak je vid¥t na obrázku 1 na následující stran¥). V literatu°e se po£et nej£ast¥ji ozna£uje jako x1 (x16 apod.). Variabilita po£tu linek se nutn¥ projeví na vlastnostech slotu. Linka je sloºena ze dvou jednosm¥rných spoj·.

Konektor PCIe rozhraní m·ºe být kompatibilní pro v²echny kombinace karet (do x16 slotu se dají vloºit v²echny karty od x1 aº po x16 a v p°ípad¥ otev°eného slotu (nemá koncovou hranu) nic nebrání vloºení del²í karty do krat²ího slotu. Poslední vlastnost není p°íli² £astá. Karta pouºitá v této práci má pouze jednu datovou linku. Ve skute£nosti ale po£et linek mezi hardware nehraje roli, nebo´ se ob¥ strany linky automaticky domluví na spojení. Mohou být uskute£n¥ny v²echny kombinace spojení. Kdyº se x4 karta vloºená do x16 slotu nedomluví na x4 módu, tak pouºije klidn¥ i x1 mód.

Konektor se d¥lí na dv¥ základní £ásti. V první spole£ná je napájení, detekce vloºené karty a signalizace ohledn¥ napájení. Vyskytují se zde kongura£ní sb¥rnice ( SMBUS - klon IIC) a JTAG rozhraní. Ve druhé £ásti sb¥rnice jsou pak pro v²echny typy konektor·:

(12)

Obrázek 1: Fyzická podoba r·zných velikostí PCIe slot·. Pouºita graka z [5]

jedny diferenciální hodinové signály a dva páry datových vodi£· (vstup a výstup). Pro slot umoº¬ující více neº x1 spojení struktura slotu plynule pokra£uje, ve stejném po-

°adí se opakují oba sm¥ry diferenciálních spoj·, prokládaných stínícími zemnícími vodi£i (ilustrováno v tabulce 1 na následující stran¥).

(13)

Pin Strana B Strana A

1 +12V PRSNT1#

2 +12V +12V

3 Rezervováno +12V

4 GND GND

5 SMCLK TCK

6 SMDAT TDI

7 GND TDO

8 +3.3V TMS

9 TRST# +3.3V

10 +3.3Vaux +3.3V

11 WAKE# PWRGD

Klí£

12 Rezervováno GND

13 GND REFCLK+

14 HSOp lane 0 REFCLK- 15 HSOn lane 0 GND

16 GND HSIp lane 0

17 PRSNT2# HSIn lane 0

18 GND GND

Pin Strana B Strana A Pokra£ování pro >x1 19 HSOp lane 1 Rezervováno

20 HSOn lane 1 GND

21 GND HSIp lane 1

22 GND HSIn lane 1

23 HSOp lane 2 GND

24 HSOn lane 2 GND

25 GND HSIp lane 2

26 GND HSIn lane 2

27 HSOp lane 3 GND

28 HSOn lane 3 GND

29 GND HSIp lane 3

30 Rezervováno HSIn lane 3

31 PRSNT2# GND

32 GND Rezervováno

Tabulka 1: Uspo°ádání signál· v PCIe konektoru

V p°ípad¥ zapojení více neº jedné linky se p°ená²ené slovo rozprost°e po v²ech linkách (výhoda je o£ividná: nízká latence a v p°ípad¥ poruchy jedné linky dojde k po²kození jen

£ásti slova, které pro²lo linkou s poruchou).

Na rozdíl od p°edchozích sb¥rnic osobních po£íta£· nejsou konektory PCIe spojené do sb¥rnice. Kaºdá linka je spoj mezi dv¥ma body. V²echny pak vedou do £ipsetu (root komplex). V tomto p°ípad¥ tedy PCIe p°ipomíná spí²e topologii hv¥zda neº topologii sb¥rnice. V root komplexu navíc jde propojit libovolné dv¥ za°ízení, které toho jsou schopné.

Data se p°es sériovou sb¥rnici posílají v paketech s r·zn¥ denovanou délkou, pro verzi 1.0 je to 0 aº 1024 slov o délce 32 bit·. V paketech je dále hlavi£ka, která udává r·zné informace. Obsahuje i p·vodní p°íkazové kódy PCI (dopln¥né o nové vlastnosti PCIe).

Základní prvky sb¥rnice PCIe jsou:

Endpoint Koncové za°ízení, neboli PCIe periferie. Endpoint nem·ºe kongurovat ostatní endpointy.

Root complex Hlavní za°ízení na sb¥rnici. Konguruje v²echny endpointy. V po£íta£i to je obvykle pouze £ipset, ale m·ºe to být i bridge do dal²í PCIe podsb¥rnice.

(14)

Switch Switch se pouºívá na rozbo£ení jedné linky na n¥kolik dal²ích linek. Bývá spolu s root komplexem v £ipsetu po£íta£e.

Detailní specikace o fyzické £ásti PCIe jsou pak v datasheetu, nap°íklad [6].

2.2 Programování PCI

Jak uº bylo v textu vý²e zmín¥no, tak PCIe je potomek sb¥rnice PCI. P°i návrhu se kladl d·raz na kompatibilitu na softwarové úrovni. Míra kompatibilita je velmi vysoká, ovlada£ pro PCI za°ízení ke své £innosti nepot°ebuje prakticky v¥d¥t, ºe hardware tvo°í PCIe. V p°ípad¥, ºe jsou pot°ebné roz²í°ené vlastnosti, tak se úprava zna£n¥ zjednodu²í.

V¥t²inu odli²ností obslouºí stejn¥ hlavn¥ ovlada£ £ipsetu po£íta£e. Jako PCI je periferie PCIe identikována pomocí t°í hodnot:

Bus Logické £íslo sb¥rnice. Na PCIe prakticky jen pro zp¥tnou kompatibilitu (kaºdé za°ízení má vlastní linku).

Device P°i°azené £íslo za°ízení, denuje jednotlivé periferie.

Function Kaºdé za°ízení m·ºe mít n¥kolik r·zných podskupin. Nap°íklad, pokud bychom vzali multifunk£ní kartu, tak IDE °adi£ bude mít vlastní function hodnotu a USB

°adi£ také vlastní. Jednotlivá za°ízení m·ºou mít r·zný po£et podskupin (aº 8).

Nicmén¥ musí implementovat adresu 0.

Kaºdé PCI za°ízení má denované kongura£ní pole, v n¥mº je identikace a poºadavky za°ízení. Firma (nebo kdokoliv si poºádá o registraci) má své jedine£né 16 bit· dlouhé

£íslo, jenº celosv¥tov¥ identikuje výrobce (vendor). Kaºdý výrobce má k dispozici dal²í

£íslo velké 16 bit·, které udává za°ízení (device). Ob¥ £ísla se pouºívají b¥hem p°i°azení ovlada£e k za°ízení. Dal²í hodnota PCI specikuje takzvanou t°ídu za°ízení. Umoº¬uje lep²í identikaci, podle hodnoty jednotlivých byt· rozli²ujeme mezi grackou kartou, pa- m¥´ovým za°ízením, sí´ovou kartou, °adi£em diskových jednotek apod. Dal²í dva byty základní t°ídu rozvád¥jí podrobn¥ji. Pokud n¥jaká PCI karta implementuje standardní programovací rozhraní, tak pouze sta£í po ov¥°ení vendor a device ID zjistit, ºe karta je nap°íklad USB °adi£. Následn¥ sta£í pouºít generický ovlada£. Je nutno podotknout, ºe výrobci dodrºují univerzální rozhraní jen tam, kde je to opravdu nutné. Dal²í d·le- ºitou poloºkou je t°eba poloºka udávající poºadavek na alokaci p°eru²ení, poloºka BIST (Built-in self-test, vestav¥ný test v £ipu karty) nebo adresa bootovací ROM (Read Only Memory) pam¥ti (pouºívá se hlavn¥ na grackých kartách jako video BIOS).

Nejd·leºit¥j²í poloºkou jsou takzvané BAR, registry bázových adres. Kongura£ní pro- stor má pro n¥ vyhrazené místo ²esti poloºek. Tyto registry udávají jaké prost°edky má

(15)

karta k dispozici. V BAR m·ºe být adresa I/O prostor (registry na ovládání £ipu), pam¥´

(video, datová, ...) anebo vyrovnávací buer za°ízení (o rozdílu bude pojednávat £ást o návrhu ovlada£e). V t¥chto registrech je tedy uloºená adresa, která se pouºije v adresním prostoru procesoru. Bázové adresy se p°id¥lují b¥hem bootování po£íta£e (hardware se m·ºe defaultn¥ nastavit sám, pak hodnotu dále nastavuje BIOS a po n¥m je²t¥ obvykle opera£ní systém). BAR podporují i 64 bit adresu, hodnota se ale musí rozd¥lit vºdy do dvou registr·, takºe zbudou pouze 3 oblasti. Po inicializování v²ech pot°ebných hodnot je jiº na dané oblasti v pam¥ti (nebo I/O porty) moºné zapisovat data.

Dal²í d·leºitou sekcí v PCIe jsou p°eru²ení. Jako d¥dictví p°edchozích sb¥rnic existují dokonce t°i mechanismy.

• Legacy

• MSI (Message Signaled Interrupt)

• MSI-X

První je ryze PCI orientovaný. Nazývá se legacy nebo INTx. Star²í PCI sb¥rnice m¥la £ty°i signaliza£ní vodi£e, pomocí nichº mohla posílat £ipsetu poºadavek na p°eru²ení. Tento mechanismus je v PCIe také, nicmén¥ je ozna£en jako zastaralý, resp. není preferován1. Z d·vod· neexistence pomocných vodi£· se legacy intern¥ emuluje pomocí MSI nebo MSI-X prost°edk· £ipsetu .

Druhý mechanismus byl je²t¥ na PCI vytvo°en pro získání více p°eru²ovacích signál·

pro kaºdou periferii. Poºadavky na p°eru²ení se v PCI posílají jako zpráva po datových sb¥rnicích. Je ale nutné, aby £ipset na tyto poºadavky správn¥ reagoval a p°eru²ení poslal do CPU. To je moºno aº u PCI £ipsetu implementujícího verzi standardu 2.2. MSI pouºívá aº 32 r·zných p°eru²ovacích volání na za°ízení.

T°etí mechanismus je pak roz²í°ení MSI a tedy MSI-X. Bylo je²t¥ denováno pro PCI ve standardu 3.0. Poskytuje r·zná vylep²ení, nejd·leºit¥j²í roz²i°uje po£et p°eru²ení na 2048.

2.3 PCIe na desce s FPGA

PCIe na ²kolní desce má k dispozici pouze x1 linku. Hardwarová implementace je p°ímo v FPGA £ipu a je rozd¥lena na dv¥ £ásti. Fyzické rozhraní je p°ímo vytvo°eno na tranzis- torové úrovni (p°enosová rychlost PCIe syntézu z rekongurovatelných blok· prakticky vylu£uje). Virtex 5 obsahuje PCIe verzi standardu 1.1. Zbylou £ást °e²í výrobce Xilinx

1viz. PCIe datasheet s opravou specikace verze 1.0a [3]

(16)

formou soft-core, pomocí jazyku pro popis hardwaru VHDL i Verilog. Tato £ást pak rea- lizuje buery, programovací rozhraní a podobn¥. IP Core (Intellectual Property Core - IP jádro), který máme k dispozici v prost°edí Xilinx, byl navrºen jako bridge mezi sb¥rnicí PCIe a sb¥rnicí realizovanou projektem v FPGA - takzvanou PLB (Processor Local Bus).

Bridge umí p°ekládat poºadavky z PCIe sb¥rnice na vyhrazenou oblast v PLB adresním prostoru.

Schopnosti IP Core od Xilinxu jsou pom¥rn¥ omezené. V¥t²ina kongurovatelných pa- rametr· se p°ímo syntetizuje, takºe je pozd¥ji nelze m¥nit. Bridge podporuje pouze t°i 32 nebo 64 bitové BAR, p°i£emº by podle standardu mohl podporovat aº ²est 32 bito- vých BAR (a integrovaná £ást to umí také). Zna£n¥ omezené moºnosti má i inicializace p°ístupu do prostoru pam¥ti PCIe z bridge. Dále IP jádro umoº¬uje vytvo°ení root kom- plexu, který pak m·ºe kongurovat dal²í za°ízení na sb¥rnici, je schopen °ídit externí karty. Z p°eru²ení se dá prakticky pouºít jen Legacy mód, který PCIe systém emuluje.

IP jádro nemá ºádné podp·rné prost°edí pro denici jednotlivých MSI p°eru²ení. Legacy p°eru²ení se ovládá jedním vstupním signálem. Poté se po²le p°es PCIe paket oznamu- jící legacy p°eru²ení do hostitelského po£íta£e. Následn¥ se jednodu²e pouºijí funkce na zpracování p°eru²ení.

Druhá £ást m·stku dále realizuje master a slave rozhraní na PLB sb¥rnici. V p°ípad¥

externího poºadavku tedy m·ºe bridge inicializovat p°enosy na PLB. Slave rozhraní se pouºívá pro zápis do ovládacích registr· a pro inicializaci p°enosu programem v FPGA.

(17)

3 Ovlada£e v jádru Linux

Po£átek opera£ního systému GNU/Linux byl projevem nesouhlasu s nedostupností zdro- jových kód·. Projekt GNU vytvo°il v roce 1983 Richard Stallman p°epsáním program·

a prost°edí tehdy existujícího Unixu pln¥ od za£átku. Zkratka GNU rekurzivn¥ znamená GNU's not unix. Rozhraní systému má s unixem vysokou kompatibilitu. Kdokoliv bude chtít, m·ºe získat zdrojové kódy za nulový poplatek za licen£ní práva. Jediná omezující podmínka vyºaduje dodrºení licence GPL (General public licence). Licence vyºaduje tato práva, na kaºdý dal²í program, co by mohl z obdrºených zdrojových kód· vzniknout. Po- platek za distribuci je ale dovolen. Dlouho dobu ale tento projekt nem¥l dokon£ené jádro systému a to aº do roku 1991, kdy nský student Linus Torvalds napsal jádro op¥t z d·vodu nedostupnosti zdrojových kód· jiného jádra na bázi unixu2. Od této doby se dá datovat vznik opera£ního systému GNU/Linux, n¥kdy hovorov¥ ozna£ovaný jako linux.

Ozna£ení není úpln¥ korektní, Linux je pouze jméno jádra, existují i dal²í umoº¬ující provoz aplikací GNU (nap°íklad p·vodní Mach/Hurd). Od doby vzniku se GNU/Linux roz²í°il do mnoha oblastí. Nejvíce do embedded systém·, z d·vodu, ºe se dá díky voln¥

dostupným zdrojovým kód·m lehko modikovat a portovat na jiné platformy.

Linuxový systém se skládá ze samotného jádra, ovlada£· a program· uºivatelského prost°edí. Linux je monolitické jádro, coº znamená, ºe ovlada£e sdílí stejnou pam¥´.

Systém je náchylný na chyby v ovlada£ích, které mohou po²kodit cizí £ást pam¥ti. Práce se zabývá návrhem hlavn¥ v jaderné oblasti (kernel space).

3.1 Linuxový ovlada£

Nejjednodu²²í dokumentací ovlada£· v Linuxu je pravd¥podobn¥ Linux sám. Samotné zdrojové kódy obsahují základní dokumentaci toho, co která sekce jádra d¥lá. M·ºeme z nich získat i základní kostru pro univerzální ovlada£. Projevila je zde výhoda otev°ených zdrojových kód· pod svobodnou licencí, nebo´ se dá vzít kód (nebo jeho strukturu) podobného ovlada£e a p°epsat ho pro ú£el PCIe. Na druhou stranu by vyhledávání v plain textu zdrojových kód· mohlo být pom¥rn¥ £asov¥ náro£né a tak je dobré pouºít fulltextový vyhledáva£ z n¥které cross reference databáze [2] nebo z knihy Linux Device Drivers [8]. Vývoj API (Application programming interface) se ºene dop°edu a tak m·ºe nastat situace, ºe krom¥ zdrojových kód· informace nebude nikde jinde zapsána.

Ovlada£ se dá povaºovat za knihovnu, jeº se v p°ípad¥ pot°eby na£te do systému.

Podle nastavení p°i kompilaci m·ºeme vybrat modul p°ímo jako sou£ást binárky jádra (analogie k staticky linkované knihovn¥) nebo jako samostatný soubor, na£ítající se jen

2Jednalo se o výukový opera£ní systém Minix

(18)

v p°ípad¥ pot°eby. Druhý zp·sob je pro velké systémy b¥hem vývoje výhodn¥j²í, protoºe hned po zkompilování se dá nový modul otestovat a po nefatálním testu z opera£ní pam¥ti op¥t odstranit. V p°ípad¥ p°ilinkování do obrazu jádra by bylo nutné po£íta£ rebootovat.

Efektivn¥j²í postup vypadá na pouºití ovlada£e jako samostatného souboru na disku.

Ovlada£e v Linuxu se dají z hlediska správy projektu psát jako:

• samostatný projekt

• integrované do adresá°ové struktury jádra (p°idání kódu do repozitá°e)

Integrování do repozitá°e jádra má výhodu v pom¥rn¥ ucelené konguraci, ale pracovat se musí s v¥t²ím objemem dat. V p°ípad¥ updatování na novou verzi se musí dodrºet kompatibilita s p°ípadnými zm¥nami a zárove¬ rekompilovat celé nové jádro (na£ítací program testuje shodu verze jádra i modulu).

Samostatný projekt má výhodu v p°enositelnosti. V p°ípad¥ pot°eby pouºití n¥jaké nestandardní vlastnosti, která není z jádra exportovaná (u jiného projektu se jednalo nap°íklad o hlavi£kový soubor denující módy £íta£e), nelze tento typ projektu pouºít bez zvý²ení sloºitosti vývoje, nebo dokonce v·bec. Bylo by totiº nutné udrºovat upravené jádro a konat synchronizaci se zm¥nami v dal²ích verzích plus udrºovat projekt modulu.

Samostatný projekt vyºaduje také zdrojové kódy jádra, jmenovit¥ malou £ást jádra, jedná se jmenovit¥ hlavi£kové soubory na API. Na rozdíl od integrování do repozitá°e v p°ípad¥

pouºití nové verze, nám sta£í znovu rekompilovat samostatný projekt.

3.2 Základní funkce modulu

Kaºdý modul Linuxu musí mít denovanou základní strukturu. K dispozici jsou dv¥

makra module_init a module_exit, jejichº parametry jsou ukazatele na funkci. Zmi¬o- vané funkce se jiº podle názvu starají o na£tení a uvoln¥ní ovlada£e (jako programu) ze systému jádra (a pam¥ti). Existují i dal²í makra, nesouvisející se za°ízením (nap°íklad MODULE_LICENSE nebo MODULE_AUTHOR). Denice licence je pom¥rn¥ d·leºitá, nebo´ jako sou£ást jádra by m¥ly mít v²echny ovlada£e otev°enou licenci, nejlépe rovnou GPL. V opa£ném p°ípad¥ se driver povaºuje za proprietární a v n¥kterých verzích jádra se mu m·ºou odpírat i n¥které funkce.

Inicializa£ní funkce obvykle nastavuje základní struktury ovlada£e a v p°ípad¥ netrivi- álního programu má zavolat registra£ní funkci pro daný subsystém. Teprve aº tato funkce (pro kaºdý subsystém jádra se volá jiná) provede detekci, jestli v·bec za°ízení existuje.

Pro za°ízení PCI systému se pouºívá funkce pci_register_driver. Její parametr je uka- zatel na strukturu, která obsahuje funkci pro inicializaci za°ízení (.probe), uvoln¥ní (p°i

(19)

vyjmutí modulu) a tabulku identikátor·. Samotná struktura pak dále m·ºe obsahovat i dal²í nepovinné funkce. V²echny informace daného typu zpracovává a spou²tí jádro, p°i událostech jako hot-plug, uspání, probuzení a dal²í. Nejzajímav¥j²í tabulkou je tabulka identikátor·, protoºe se s ní p°i°azuje ovlada£ ke kart¥. V p°ípad¥ úsp¥²ného nálezu za°ízení se spustí nastavená funkce probe.

Tabulka m·ºe mít denované vendor ID, device ID a ostatní. Povoleny jsou i zástupné hodnoty (nap°íklad PCI_ANY_ID). Tabulka neobsahuje jen jeden °ádek, ve skute£nosti to je pole °ádk·. To z d·vod·, kdy existuje víc dodavatel· stejného za°ízení. Touto maskou se následn¥ otestuje shoda na za°ízení p°ítomné v systému a pro kaºdý vyhovující záznam se spustí vý²e zmi¬ovaná funkce pro inicializaci za°ízení. Z toho vyplývá, ºe jsme nuceni vybrat nekolizní ID. Firma Xilinx má vlastní vendor ID s p°edp°ipravenou hodnotou 10ee:0505. Ani tento popis nezaru£uje jednozna£nost ur£ení karty pomocí této tabulky. Dal²í identikace by musela pouºít n¥jaké sériové £íslo v registrech na samotné kart¥. Zde je zajímavé poznamenat, ºe pokud by n¥jaký projekt pro FPGA maskoval p°esnou £innost jiné karty (nap°íklad USB °adi£e, sí´ové karty, ...), sta£ilo by jen nastavit ID do rozsahu výrobce a ovlada£ pro daný typ karty by ji hned inicializoval.

3.3 Inicializace za°ízení

Po spu²t¥ní na²í funkce .probe (volá se p°i shod¥ nastavených ID) musíme vzbudit PCIe za°ízení a vyhradit prostor pam¥ti a IO, kterými disponuje karta. Docílíme toho pomocí funkcí pci_enable_device (vzbudí za°ízení a inicializuje konguraci - p°i°adí p°eru²ení, I/O, ...), pci_request_region (alokuje poºadovaný BAR PCIe za°ízení) a pci_ioremap_bar (p°emapuje na virtuální adresu). V¥t²ina ovlada£· pouºívá n¥jakou formu IRQ (Interrupt Request), jeº se alokuje také v této na²í funkci. Stejn¥ tak v p°ípad¥ pot°eby inicializo- vat dal²í funkce a struktury. Obvykle se jedná o registrace t°ídy a následné vytvá°ení blokových nebo znakových za°ízení pro /dev. Na konci funkce .probe se slu²í hardware resetovat, aby byl ve známé výchozí pozici.

V p°ípad¥, ºe chceme se za°ízením komunikovat, musíme pouºít blokové nebo znakové za°ízení. Rozdíl mezi nimi je patrný jiº z názvu. Blokové za°ízení pouºívá pro p°enos bloky dat, které bueruje a o²et°uje p°ímo jádro, kdeºto znakové za°ízení pracuje hlavn¥

s proudem dat (nap°íklad klávesnice). Blokové za°ízení je vhodné pouºít nap°íklad u disku. Nicmén¥ i u znakového za°ízení jsme schopni pracovat s bloky dat. K tomu se pouºívá funkce mmap, p°emapovávající pam¥´ov¥ adresovatelnou oblast do uºivatelské oblasti. Uºivatel následn¥ m·ºe pracovat p°ímo s jednotlivými buery, jejich pln¥ní a

°azení spadá uº do jeho kompetence. V¥t²ina za°ízení v systému je znaková.

Znakové za°ízení se inicializuje pomocí funkcí register_chrdev_region, cdev_init a

(20)

cdev_add, jeº dohromady udávají jméno p°ípojného bodu /dev, po£et t¥chto bod· a pouºitelné operace.

3.4 IO operace znakového za°ízení

Implementovatelných operací je mnoho, zmíním tedy jen d·leºité z nich. Krom¥ funkcí je²t¥ stojí za zmín¥ní poloºka .owner, která udává vlastníka modulu (pouºívá se pro ur£ení hierarchie modul· v jád°e). N¥které operace jsou povinné a jiné k £innosti nejsou vyºadovány.

open a release Nejd·leºit¥j²í, které je nutno implementovat, aby v·bec ²lo za°ízení pou- ºívat. Funkce jsou volané p°i otev°ení a zav°ení. V nich se £asto nastavuje semafor, zaru£ující jedine£nost uºivatele.

read a write Kód v nich obsaºený m·ºe kopírovat nejr·zn¥j²í data mezi jaderným a uºi- vatelským prostorem. Musíme na to ale pouºít speciální kopírovací funkce, oby£ejná funkce memcopy by m¥la problém s ochranou pam¥ti.

mmap Jiº zmi¬ovaná funkce, pomocí níº se dá pouºít p°ímo pam¥´ za°ízení (pouºívá se t°eba na jednotlivé snímky z USB webkamery).

poll Vrací informaci zda se na libovolná data musí £i nemusí £ekat (pokud nemusí, £tení nebo zápis prob¥hne okamºit¥).

ioctl Tato funkce3 se pouºívá pro zasílání p°íkaz· ovlada£i. Potvrzuje to i ona zkratka (IO Control). Není nutno jí implementovat, ale obvykle je nejd·leºit¥j²í pro £innost programu. P°íkazy jsou libovolné a závisí jen na návrhá°i, které navrhne. Musí být jen stejn¥ denované pro uºivatelské a jaderné prost°edí. Kód p°íkazu má formu tzv. magického £ísla, coº je £íslo sloºené (pomocí bitových posun· a maskování) z

£ísla p°íkazu, typu operace (£tení, zápis, obojí) a maximáln¥ jedine£né konstanty pro ovlada£ a typu parametru. Konstanty pro celý systém samoz°ejm¥ jedine£né být nemusí, ale je to lep²í, sniºuje se riziko kolize. Jedná se tedy o formu hashe.

Druhá p°edaná hodnota je parametr, jenº m·ºe udávat ukazatel nebo £íslo. P°es parametr se jádru p°edává informace, kam má nakopírovat strukturu, nebo jakou hodnotu zapsat do ur£itého registru.

3a jeho subvarianty uvedené v [4]

(21)

3.5 P°eru²ení

Pro p°eru²ení existuje v Linuxu velké mnoºství funkcí, prakticky kaºdá architektura implementuje jiný typ. M·ºe jich být opravdu hodn¥, Linux se provozuje na mnoha ar- chitekturách. D·kazem r·znorodosti je i samotná architektura PCI, kde jsou t°i (Legacy, MSI, MSI-X). Kaºdé p°eru²ení disponuje vlastním zp·sobem inicializace. Roz²í°ené vari- anty nejd°íve povolíme v systému, aº pak jsou k pouºití. Povolení subsystému p°eru²ení je moºné provést v inicializa£ní funkci .probe pomocí volání pci_enable_msi. Parametrem je struktura detekované karty. Za°ízení dostane p°id¥lené IRQ £íslo a my m·ºeme na toto

£íslo nastavit handler (obsluºnou rutinu) p°eru²ení obecnou funkcí request_irq. Obsluºná rutina bude potom detekovat (v p°ípad¥ sdíleného p°eru²ení) pomocí stavových registr·, zda p°eru²ení vyvolala opravdu na²e karta. Pomocí návratové funkce musíme nastavit výsledek p°ijmuto nebo nep°ijmuto.

3.6 Semafory, tasklety a zbylé prost°edky v ovlada£i

B¥h obsluhy p°eru²ení nesmí být moc dlouhý, nesmí dojít k zdrºení mezi za£átkem a koncem funkce. Velké zdrºení by dokonce zp·sobilo zamrznutí jádra. Také je problém, ºe b¥hem zpracování p°eru²ení se ºádné dal²í p°eru²ení od za°ízení nem·ºe generovat. Pro- blém se °e²í spu²t¥ním mén¥ prioritní úlohy, co se m·ºe z hlediska multitaskingu p°eru²it nebo zdrºet. Úloze se °íká tasklet, jedná se o jednoduché paralelní vlákno. V jádru ho de- klarujeme pomocí makra DECLARE_TASKLET a pak pomocí funkce tasklet_schedule spustíme.

Protoºe má linux podporu více úloh, program je schopen p°istupovat k jednomu pro- st°edku z více míst. Pokud n¥co takového prost°edek neumoº¬uje, je dobré n¥jak synchro- nizovat £innost t¥chto paralelních £inností. K tomu se pouºívají semafory. Linux obsahuje mnoho subsystém· pojmenovatelné slovem semafor. Navíc nové mohou p°ibývat a staré být odstra¬ovány.

Jedním z prost°edk· jsou mutexy (deklarace makrem DECLARE_MUTEX ), realizo- vanými pomocí dvou základních volání down a up. Volání zaru£ují atomi£nost4 a jejich

£innost spo£ívá v blokování kódu. Pokud je mutex ve stavu down a program zavolá down, tak se na tomto míst¥ b¥h zablokuje (existuje i verze testu, která neblokuje chod pro- gramu). ƒeká se dokud n¥jaké jiné vlákno nenastaví up, potom se kód op¥t rozb¥hne.

Pokud je mutex ve stavu up a p°ijde down, b¥h programu pokra£uje dál, jen se nastaví stav do down. P°íkladem pouºití je program p°ístupu k souboru v adresá°i /dev.

Dal²í velmi uºite£ná funkce se nazývá completion (dokon£ení), která umoº¬uje £ekání

4To znamená, ºe i kdyº jsou tvo°eny více instrukcemi, tak se volání musí chovat jako jedna instrukce

(22)

jednoho nebo více vláken v programu na dokon£ení ur£ité operace (nap°íklad napln¥ní bu-

eru). Deklaruje se pomocí makra DECLARE_COMPLETION, které vytvo°í strukturu.

Adresu na ní pouºívají jako parametr v²echny dal²í funkce. Je moºné pouºít dynamicky vytvo°enou volanou funkci (existují analogicky i pro ostatní semafory). Taková funkce se vyplatí jen u rozsáhlých ovlada£· s dynamicky se tvo°ícími objekty (p°ípojné body, hot-plug apod.). Funkcí wait_for_completion se zahájí £ekání na dokon£ení úlohy. V p°í- pad¥ dokon£ené úlohy vlákno zavolá funkcí complete (resp. complete_all) povolení b¥hu jednoho (resp. v²ech) vláken., £ekajících na úlohu. Po povolení v²ech vláken se ale struk- tura nedá znovu pouºít, musí se nejd°ív reinicializovat makrem INIT_COMPLETION.

Vysta£í-li si úloha s jedním buzeným vláknem, reinicializace není pot°eba.

Poslední funkce, o které by bylo dobré se zmínit, je spinlock. Deklaruje se makrem DEFINE_SPINLOCK. Jedná se o alternativu k mutex·m, pro místa, ve kterých se nesmí kód uspat a ve kterých je nejd·leºit¥j²í rychle zpracovat kód. Velmi £asto se pouºívá jako semafor práv¥ v obsluze p°eru²ení. Základní funkcí je spin_lock. Dal²ími roz²í°eními jsou spin_lock_irq a spin_lock_bh. První zakáºe hardwarové p°eru²ení a druhé zakáºe softwarové p°eru²ení. Získaný zámek se op¥t vrátí pomocí spin_unlock a jeho variant (spin_unlock_irq a spin_unlock_bh).

(23)

4 Problematika univerzálního komunika£ního rozhraní

V této kapitole se budeme zabývat tvorbou univerzálního rozhraní pouºívaného p°ípad- ným ovlada£em pro PCIe kartu s embedded softwarem.

Nejprve si vypí²eme v²echny prost°edky pouºívané periferiemi.

Registrový prostor Základní prostor pouºívaný od po£átku existence periferií. Z hard- warového hlediska se jedná o skupinku registr· s pevnou ²í°kou (nej£ast¥j²í je ²í°ka sb¥rnice architektury - 32 bit·), p°ístupnou pro ovlada£ na pevn¥ dané adrese.

Výjimkou jsou PnP (Plug and play) technologie. Coº je i PCI sb¥rnice. Adresu prostoru je u PCI moºno m¥nit v bázových registrech. Z pohledu ovlada£e je ad- resa nem¥nná, dostane ukazatel na data od subsystému PCI. Registry mohou být pouze pro £tení nebo pouze pro zápis, coº komplikuje jejich hardwarový návrh. V p°ípad¥ softwaru se v linuxovém jád°e pouºívá £asto oby£ejná konstanta denovaná v makroprocesoru, udávající oset byt· od základní adresy registrového prostoru.

Jméno konstanty guruje jako parametr pro registrovou £tecí funkci. V p°ípad¥

x86 architektury jsou dva mechanismy adresování registr·. První je pomocí IN a OUT instrukcí, u nichº byl adresní prostor odd¥lený od prostoru pam¥ti. Tento mechanismus je archaický. Dnes se pouºívá výlu£n¥ na x86 architektu°e z d·vodu kompatibility. V IP core implementující PCIe bridge není ani podporovaný. Druhý mechanismus je standardn¥ pam¥´ov¥ mapovanými porty (MMIO). U MMIO sdílí oblast registr· stejný adresní prostor s opera£ní pam¥tí.

Pam¥´ový prostor Tento prostor je vyuºitelný pro blokové pam¥´ové zápisy, jako vy- rovnávací buery dat, pracovní pam¥´ apod. Po inicializaci bude prostor pam¥ti za°ízení dostupný v oblasti opera£ní pam¥ti po£íta£e. Hlavní rozdíl mezi registry a pam¥tí spo£ívá v homogenit¥ prostoru. Registry na n¥kterých adresách nemusí být denovány, to znamená, nemusí být p°ístupné pro adresaci jednotlivých byt·.

Dokonce je £asto denovaný jeden bit, který je bu¤ pro £tení nebo pro zápis. Oproti tomu pam¥´ je spojitá se schopností adresace jednotlivých bajt· a sekven£ním £te- ním.

P°eru²ení Je t°eba rozli²ovat mezi p°eru²ením z a p°eru²ením do periferie. P°eru²ení do periferie (nap°íklad oznámení nových dat, dostupných pro zpracování) lze realizovat pomocí registrového zápisu (nastavení bitu START). Zajímav¥j²í je p°eru²ení z periferie do hostitelského po£íta£e. Na PCIe sb¥rnici jsou k tomu jiº zmi¬ované t°i metody (INTx, MSI, MSI-X).

(24)

4.1 Buery pro p°enos dat v ovlada£i

Jelikoº jsou rychlosti mezi periferií a procesorem obvykle r·zné, je nutno pouºít buery na vyrovnání rychlostí. Jejich forma je FIFO (First In First Out). Data tedy protékají skrz buery. Buery mohou mít následující formu:

Na periferii Pouºívá se p°ímo cílová adresa v BAR. Jedná se o nejrychlej²í °e²ení. Nemá tém¥° ºádnou prodlevu, v²echny data jsou rovnou kopírovány na místo. Mohou ale nastat problémy se zabezpe£ením kódu p°i p°emapování do userspace.

Mezibuer v ovlada£i Data se z userspace kopírují nejprve do bueru v ovlada£i. V ovlada£i se mohou zdrºet, nap°íklad pokud je periferie zaneprázdn¥ná a aº poté se kopírují do cílového místa. P°ekopírováním ale dochází k ur£itému zdrºení. Výhoda je, ºe periferie a uºivatelský program jsou pln¥ odd¥leny.

Cyklický buer Jedná se o posloupnost více buer·, co jsou logicky pospojované do kruhu. Návrh se pouºívá nap°íklad v aplikacích, kde periferie periodicky posílá data a ovlada£ nemusí být £as od £asu k dispozici5. Buery se napl¬ují postupn¥ za sebou a uºivatel si je £te s ur£itým zpoºd¥ním a ozna£uje za p°e£tené (nebo analogicky pro zápis uºivatelem). Musí je ov²em £íst s ur£itým maximálním zpoºd¥ním jinak hrozí, ºe nový cyklus p°epí²e starý a dojde ke ztrát¥ dat.

4.2 Mailboxy

N¥kdy musíme posílat víc povel· neº je schopno zvládnout n¥kolik bit· p°es registry.

e²ením jsou mailboxy. Jedná se obecn¥ o zprávy p°ená²ené mezi procesy nebo vlákny programu. Do jisté míry to mohou být i nap°íklad pakety ethernetu. Velmi £astým vy- uºitím je komunikace mezi dv¥ma r·znými procesory. Registrové p°íkazy nesou malou informaci, spu²t¥ní programu vytvá°í obtíºe kv·li r·zné architektu°e. Ale v p°ípad¥ mail- boxu se denuje základní komunika£ní rozhraní nezávislé na architektu°e. Sta£í vyhradit krátký buer pro komunikaci. Na obou stranách je pak denován formát dat, který mail- boxem m·ºe procházet. P°íkazy jsou prakticky libovolné (nakresli £áru na sou°adnicích, p°esko£ na video v £ase xx:yy, apod.). V p°ípad¥ pouºití vym¥nitelného rmware m·- ºeme dosáhnout nových funkcí bez nutnosti modikovat hardware (coº je nejnákladn¥j²í

£innost).

5Tento problém se snaºí °e²it realtime systém, kde je zaru£ena maximální (nejhor²í) doba latence.

Zárove¬ má takový systém obecn¥ men²í latence. Existují i úpravy pro Linux, aby i on mohl realtime podporovat.

(25)

P°i pouºití mailbox· nastává problém jak rozli²it jejich posloupnost. Nebo´ návrh je

£asto asynchronní nebo fullduplexní. Tvo°í se fronta zpráv, kam se postupn¥ p°idávají nové záznamy, jak jsou ty staré zpracovávány.

Za jakýsi p°echodový £lánek mezi mailboxem a registrem m·ºeme povaºovat pouºití dvou registr·, v n¥mº jeden registr p°ijímá slovo ur£ující typ p°íkazu (command) a druhý data. e²ení není vhodné pro p°enos velkého objemu dat (leda ºe by se sekven£n¥ zapi- sovalo/£etlo do/z datového registru). Typ command/data se pouºíval výrazn¥ u starého zp·sobu IO port·, s porty se samostatnou sb¥rnici (x86, IN a OUT). Z historických d·vod· m¥l x86 málo prostoru na komunikaci, pro komunikaci command/data pak sta-

£ily jen dv¥ adresy. Mezi r·znými prostory periferie jsme mohli p°epínat hodnotou v command registru a adresou prostoru v data registru (registry tvo°í jakýsi tunel).

4.3 DMA

DMA neboli Direct Memory Access, takzvaný p°ímý p°ístup do pam¥ti. V d°ív¥j²ích dobách prakticky synonymum pro periferie, jeº samy mohly zapisovat do opera£ní pam¥ti.

Zápis reáln¥ realizoval automat na sb¥rnici, jenº podle programování na£ítal data z jedné oblasti a kopíroval je do druhé. Pokud v tu chvíli nepot°eboval sb¥rnici, mohl se procesor v¥novat jiné £innosti. Bez DMA by musel kopírovat pam¥´ slovo po slovu.

V PCIe sv¥t¥ DMA pozbývá smyslu, nebo´ kaºdé za°ízení má schopnost inicializovat p°enos samo o sob¥, sb¥rnice je sériová a jak bylo popsáno v kapitole o PCIe, kaºdá periferie má vlastní linku(y). Stále ale existují periferie starých typ· návrhu (n¥které architektury ani PCIe nemají) a i u PCIe nemusí být schopnost inicializace zápisu en- dpointem nebyla vyuºita. Potom musí ovlada£ sám °e²it kopírování dat, nebo pouºívat funkce pro staré sb¥rnice.

I v p°ípad¥, ºe je zahájení zápisu pro PCIe implementováno, nám nastává n¥kolik problém·. První: periferie si nem·ºe libovoln¥ zapisovat do opera£ní pam¥ti po£íta£e.

Periferie jí totiº vidí fyzicky, program pracující s daty má ale mezi sebou a fyzickou sb¥rnicí jednotku správy pam¥ti ( MMU - Memory Management Unit). Periferie si musí poºádat o p°eklad na fyzickou adresu a hodnotu p°edat periferii. Druhým problémem je cache. Bude-li periferie zapisovat do RAM, vlivem cache m·ºe dojít k inkonzistenci. Je nutno toto zváºit a v p°ípad¥, ºe se oblast pam¥ti pouºívá rizikovým zp·sobem cache v dané oblasti nepouºívat (p°ístup musí být koherentní).

DMA m·ºe mít i r·zné zajímavé techniky kopírování dat uleh£ující procesoru. Jedna z nich je scatter-gather 6. Metoda pracuje s malými roztrou²enými úseky pam¥ti, které

6Doslovný p°eklad je rozptýlit shromáºdit

(26)

se postupn¥ na£tou a uloºí do jednoho homogenního pole.

4.4 Shrnutí

Ovlada£ by m¥l být schopen ovládat periferii s blokovým schématem jako na obrázku 2. Komunikaci m·ºe tvo°it jeden vstupní buer dat, kam se ukládají data, které má FPGA zpracovat a jeden výstupní, který se plní výsledky. Nemusí se tak °e²it problémy s kolizemi zápisu z obou stran.

Obrázek 2: Obecné blokové schéma, které m·ºe implementovat ovlada£

Konkrétní realizace bude popsána v následující kapitole v rámci popisu demonstra£ní aplikace.

(27)

5 Demonstra£ní úloha

Pro ov¥°ení návrhu interface byla sestavena demonstra£ní úloha. Za testovací projekt byl vybrán MP3 enkodér na platform¥ Microblaze. Celkový návrh má integrovat enkodér do FPGA na embedded procesor, p°i£emº kartu by vyuºíval stolní po£íta£ na vytvo°ení MP3 souboru z PCM záznamu. V této kapitole budou postupn¥ popsány jednotlivé kroky.

5.1 Hardware

Hardwarem je standardní projekt z prost°edí EDK. Obsahuje následující prvky:

Microblaze 32 bitový big-endian procesor pouºívaný pro návrhy automat· na FPGA programovatelných na vysoké úrovni roz²í°ených programovacích jazyk· (C, C++).

Procesor je tzv. soft-core, tím je mín¥no sestavený z logických blok·. Microblaze dodává rma Xilinx jako kongurovatelný IP Core projekt. V Xilinx EDK m·ºeme kongurovat optimalizaci z hlediska zabraných blok· FPGA, nebo rychlosti. Máme moºnost p°ipojit matematický koprocesor v pohyblivé °ádové £árce. Z dispozici je nám i jednotka pro správu virtuální pam¥ti (MMU). Dále existuje moºnost roz²i°o- vání instruk£ní sady. IP core se jmenuje jednodu²e microblaze a je ve verzi 7.30.b.

DDR2 SDRAM Hlavní opera£ní pam¥´ o velikosti 256 MB, realizovaná SODIMM mo- dulem na desce a IP jádrem mpmc (verze 6.01.a), který realizuje £innost °adi£e. V pam¥ti je uloºen ve²kerý software.

PCIe bridge IP Core plbv46_pcie (4.04.a) realizuje bridge (p°emost¥ní) mezi vnit°ní sb¥rnicí a PCIe sb¥rnicí hostujícího po£íta£e. Jeho vlastnosti jiº byly popsány v kapitole 2.3.

GPIO Jednoduchý zp·sob jak programov¥ ovládat piny FPGA realizuje xps_gpio (2.00.a).

V demonstra£ní aplikaci byl pouºit hlavn¥ pro generování signálu p°eru²ení pro hostující po£íta£. Jako vedlej²í funkce byla periferie GPIO (General Purpose In- put/Output) pouºita i na výstup z FPGA na LED na desce a taktéº vstup z tla£ítek. B¥hem vývoje aplikace LED tvo°ily ladící prvek.

Timer Realizovaný IP jádrem xps_timer (1.02.a). V úloze se pouºívá jenom pro ladící d·vody a benchmark.

RS232 Tato periferie byla pouºita pro ovládání a vývoj aplikace. Je realizována IP já- drem xps_uartlite ve verzi 1.01.a. Je to velmi jednoduchá periferie, na rozdíl od UART rozhraní nap°íklad z PC platformy neumoº¬uje nastavování rychlosti toku

(28)

dat. To je nutné p°ednastavit p°ed kompilací. B¥hem vývoje tento port vypisoval hodnoty b¥hem £innosti programu. Jiný zp·sob výstupu textových informací sice existuje, ale byl výrazn¥ obtíºný a nespolehlivý (pomocí JTAG).

BlockRAM Virtex 5 obsahuje i blokové pam¥ti. Zp°ístup¬uje je bram_block (1.00.a) a lmb_bram_if_cntrl (2.10.b). S jejich pomocí jsme schopni nadenovat buery dat. V projektu se i tak pouºívají. Dále se pomocí t¥chto pam¥tí realizují datové a kódové cache Microblaze.

SystemACE IP jádro xps_systemace (1.01.a) je specické za°ízení. Umoº¬uje na£íst kongura£ní bitstream p°es JTAG rozhraní do FPGA po power resetu. Data se na-

£ítají pomocí automatu uloºeného v CPLD (Complex programmable logic device) obvodu z p°ipojené CF karty. Na CF kartu m·ºeme umístit speciální soubor .ace, obsahující bitstream. Zárove¬ £asto obsahuje samotný program embedded systému.

Podrobná specikace SystemACE je k dispozici online v datasheetu[7].

Základní schéma hardware na embedded systému zobrazuje následující obrázek 3.

(29)

Obrázek 3: Blokové schéma IP jader na FPGA (pouze d·leºité prvky)

Z navrºeného rozhraní byly implementovány buery:

• vstupní datový buer (jako BAR pam¥´)

• výstupní datový buer (jako BAR pam¥´)

Bylo uvaºováno umíst¥ní (a také byl proveden test) buer· p°ímo do opera£ní pam¥ti na kart¥. Schéma má výhodu, ºe z pam¥ti hostujícího po£íta£e je moºné ladit celou pam¥´

(DDR2) na FPGA. Bylo zji²t¥no, ºe provedení v opera£ní pam¥ti ²et°í zdroje FPGA a dosahuje vy²²ích rychlostí.

(30)

Cyklický buer implementován nebyl, nebo´ rychlost enkódování je pln¥ determinis- tická a °ídí jí sám hostitel. Bity RESET a START jsou testovány v softwarové smy£ce, vytvo°ení IP jádra realizujícího p°eru²ení by návrh zbyte£n¥ zkomplikovalo a výhody by byly minimální (u²et°ilo by se pouze minimální mnoºství takt· embedded procesoru).

Mailboxy téº nebyly implementovány, jelikoº k tomu není ºádný d·vod. Karta má za úkol reagovat pouze na základní povely (start, reset, ...). Nicmén¥ vzhledem k p°ístup- nosti celé opera£ní pam¥ti by nebyl problém mailboxy v p°ípad¥ jiného programu (ne MP3 enkodéru) doimplementovat. Pak by se mohly posílat i data ur£ené k zpracování stejnou cestou jako povely.

Metoda zápisu kartou nebyla téº implementována, nebo´ by to vyºadovalo dal²í pro- gramování embedded systému s ohledem na cache, MMU a x86-64 architekturu hostitele.

Z registr· byly implementovány:

• start bit

• resetovací bit

• bit ur£ující p°ipravenost k enkódování

• bit ur£ující poslední enkódovaný buer

• bit oznamující obecnou chybu

• prom¥nnou, udávající platnou délku bueru vstupu

• prom¥nnou, udávající platnou délku bueru výstupu

• p°eru²ení sm¥rem do hostujícího po£íta£e

Vyuºití funkcí je následující. Reset provede inicializaci enkodéru na nastavené parametry.

Enkodér následn¥ £eká na zapln¥ní bueru. Po zapln¥ném bueru nastavíme START bit, který dá signál enkodéru, aby zahájil £innost. Po dokon£ení úkolu nad aktuálním buerem se aktivuje p°eru²ení oznamující ovlada£i v jád°e, aby si vyzvedl data. Následn¥ se vrací program na kart¥ zp¥t do £ekání na start. ƒinnost je ilustrována obrázkem 4.

5.2 Softwarové prost°edí

Softwarové prost°edí se navrhovalo v IDE zaloºeném na Eclipse. IDE obsahuje kompilátor odvozený od GNU GCC. Architektura je Microblaze (mohou být i jiné). Softwarové run- time prost°edí se vybírá standardn¥ ze dvou moºností:

• Standalone

(31)

Obrázek 4: Automat zpracování dat a handshake signál·

• Xilkernel

Standalone je základní prost°edí bez opera£ního systému. Uºivatelský projekt guruje jako jediný program v systému. Zárove¬ se dají pouºívat knihovny dodávané od Xilinxu, takºe se program nechová p°íli² rozdíln¥ od b¥ºné konzolové aplikace. Nicmén¥ n¥které odli²nosti se najdou i tady. Standalone nemá ºádnou správu pam¥ti nebo hardware, uºivatel si musíme v²echny periferie nakongurovat sami. Funkce, obsaºené v knihovnách simulují stdio nebo stdlib (standardn¥ roz²í°ené funkce jazyka C, tedy printf, memcopy a dal²í). Ná² program bude moci i alokovat pam¥´ z haldy, ale s omezením, ºe dealokovaná pam¥´ uº nikdy nep·jde znovu alokovat (alokace postupuje pouze kup°edu).

Druhým prost°edím se jménem Xilkernel je velmi jednoduché jádro, umoº¬ující multi- tasking a v¥ci s ním spojené (synchronizace, správa pam¥ti). Rozdíl mezi ním a standalone je minimální. Pro navrhovaný projekt enkodéru neposkytuje ºádné dal²í výhody.

(32)

Návrhový systém povoluje p°idání i dal²ích mód· run-time prost°edí. Nej£ast¥ji se pouºívá vytvo°ení prost°edí pro opera£ní systém GNU/Linux nebo bootloader U-Boot7. V t¥chto módech se jedná pouze o vygenerování seznamu periferií a jejich adres.

5.3 Popis MP3 formátu

MP3 je zkrácené pojmenování MPEG-1 Audio Layer III. Tento návrh pro moderní kom- primování zvuku za£al vznikat uº v roce 1991 a byl uveden ve ve°ejnost v roce 1993.

Máme n¥kolik verzí standardu (Layers), ale práv¥ Layer III se stala nejznám¥j²í, proto je také formát ozna£en za MP3. Existuje i dal²í verze MPEG-2 Audio Layer III, která je zp¥tn¥ kompatibilní. Vlastnosti formátu jsou následující:

Rámce MP3 data jsou ukládány v rámcích (frames) s denovanou strukturou. Po konci prvního rámce za£íná ihned dal²í. Obrázek s významem bit· v rámci je na obrázku 5.

Obrázek 5: Formát rámce, pouºit obrázek z Wikipedie, uvoln¥ný pod licencí Creative Commons Attribution 2.5 Generic [10]

Ztrátová komprese Formát dokáºe velmi ú£inn¥ zkomprimovat PCM tok dat (výsledný soubor má tak°ka jedenáctkrát men²í velikost neº PCM p°i stejné subjektivní kva- lit¥). Komprese se provádí pomocí psychoakustického modelu, MDCT (Modied discrete cosine transformation) a humanova kódování.

Psychoakustický model Pro ztrátu nepot°ebné zvukové informace pouºívá fakt, ºe zpra- cování zvuku lidským sluchem není p°esné. Nap°íklad p°ijde-li slabý signál do ur£ité

7p°ípadný popis je op¥t v bakalá°ské práci[9]

(33)

doby po n¥jakém silném signálu, £lov¥k ho nezaregistruje. Je tedy v zvukovém sou- boru nadbyte£ný a lze ho vypustit.

Konstantní tok dat Ozna£uje se CBR (Constant bitrate). V MP3 formátu se nasta- vuje jako jeden z nejd·leºit¥j²ích parametr· poºadovanou rychlost toku dat (tzv.

bitrate). Bitrate se udává v bitech za sekundu a je to kone£ná rychlost, jakou je pot°eba zpracovávat data pro p°ehrávání v reálném £ase. U konstantního datového toku existuje n¥kolik p°eddenovaných hodnot (pro MPEG-1 Layer III je to 32kbps aº 320kbps).

Variabilní bitrate Ozna£uje se VBR (Variable bitrate). Variabilní tok dat je metoda jak zvý²it kvalitu p°i stejném datovém toku jako u CBR. Z humanova kódu totiº vyplývá, ºe data v rámcích budou mít r·znou délku. Rámce, kde je hodn¥ informací budou logicky pot°ebovat víc bit· neº rámce, které obsahují ticho. Pro objemné rámce se pouºije vy²²í bitrate a pro ty mén¥ objemné je schopen enkodér ztrátovou kompresi zvý²it. Pr·m¥rn¥ pak bude mít zvukový soubor stejný tok dat jako soubor získaný pomocí CBR, ale kvalita zvuku bude celkov¥ lep²í.

V MP3 souboru mohou být krom¥ rámc· MPEG dat i jiná data, obvykle jsou jimi informa£ní data (metadata) o typu nahrávky. Nazývají se ID tagy. Tag· existuje n¥kolik r·zných verzí a v souboru popisují typ ºánru hudby, autora skladby a dokonce i obrázky.

Z pohledu na strukturu souboru jsou ID tagy datový kontejner s umíst¥nými samotnými MP3 rámci.

Pro zadaný úkol nebudou tagy pouºity, nebo´ by to zkomplikovalo návrh, akcelera£ní karta je k práci nepot°ebuje. ID tagy m·ºe dodat libovolný edita£ní program dále v uºivatelském prostoru.

5.4 Výb¥r MP3 enkodéru

Jelikoº je na sv¥t¥ n¥kolik r·zných implementací MP3 enkodéru. Kritéria na výb¥r byly zvoleny následující:

1. Vhodná licence pouºití 2. Otev°ené zdrojové kódy

3. Dobrá portabilita zdrojových kód· na platformu Microblaze Po re²er²i bylo zji²t¥no, ºe v¥t²ina MP3 enkodér·, výb¥rem:

• MP3Stego

(34)

• 8hz-mp3

• bladeenc

• shine

Je bu¤ zaloºena na p·vodním MPEG ISO referen£ním kódu, jsou dlouhou dobu nevyví- jené, nebo mají problémy s portabilitou (norma ANSI C 89, ur£eno pro MSDOS, apod.).

Enkodéry s uzav°eným kódem byly ze z°ejmého d·vodu zavrhnuté automaticky.

Nakonec byla vybrána knihovna LameMP3[1]. LameMP3 je ²í°ena pod licencí GNU LGPL v2+ (Lesser GPL) jako knihovna. Je stále vyvíjena a je napsána multiplatformn¥.

Pouºívají ji i takové projekty jako mpeg a mplayer. Knihovna byla p·vodn¥ soustava oprav (patch·) oproti ISO referen£nímu programu, nakonec se celý ISO kód p°epsal a byl vylep²en (na platform¥ x86 lze pouºít multimediální instrukce). LameMP3 umí zpracovávat i ID tagy a dokonce i dekódovat MP3.

Formáty dat zpracovávaných knihovnou je n¥kolik:

• short int

• oat

• long

• prokládaný short int

První t°i formáty vyºadují dva buery PCM dat, pro kaºdý kanál zvlá²´. Poslední je sloºen ze st°ídajících se hodnot vzork· pravého a levého kanálu. Pro na²í aplikaci je nejlep²í pouºít poslední, tedy prokládaný formát. Formát byl vybrán z d·vod· p°ímých PCM dat (nejsou long ani oat) a z p°ípadného jednodu²²ího zpracování vzork·. Bohuºel podle zdrojových kód· si knihovna prokládaná data stejn¥ p°ed zpracováním sama rozloºí do vlastních buer·. Výhoda je ale ta, ºe není pot°eba p°es PCIe mapovat tolik buer·, nebo´ pouºitý PCIe bridge je omezen8.

Výstup MP3 dat je logicky jiº v jednom bueru. Ukládá se aº po získání dostate£ného mnoºství PCM dat. Jeho velikost je variabilní v závislosti na úsp¥chu komprese.

5.5 Portace MP3 knihovny

V prost°edí Standalone byl vytvo°en projekt v jazyku C sestávající se z jednoho souboru s hlavní funkcí main. V této funkci byly inicializovány periferie (PCIe, pro testovací ú£ely

8viz. kapitola o PCIe na desce FPGA

(35)

£asova£ a UART). Zdrojové kódy LameMP3 knihovny se slinkovaly staticky s projektem, nebo´ v prost°edí standalone neexistuje loader dynamických knihoven. Fakticky tvo°í zdrojové kódy knihovny pevnou sou£ást projektu.

Portace samotná neprobíhala bez nutnosti upravit £ásti kódu. Knihovna spoléhala na kompilaci v prost°edí OS. K tomu pouºívá projekt autotools, který prohledá opera£ní systém a sestaví soubor cong.h. Soubor byl ru£n¥ vytvo°en. Dále musely být navrhnuty funkce pro alokaci pam¥ti, protoºe knihovna b¥hem své £innosti periodicky alokuje a dealokuje buery dat. Empiricky bylo zji²t¥no, ºe je to jediná £innost s výjimkou inici- alizace na startu. Buery dat jsou navíc p°ibliºn¥ stejn¥ velké. Poºadavek na pam¥´ je pak konstantní.

Alokátor byl navrºen následujícím zp·sobem. K dispozici máme p°eddenovanou oblast pam¥ti (bu¤ jako pole, nebo denice v linkeru - z hlediska standalone je to prakticky jedno), jeº se d¥lí logicky na ur£itý po£et stránek (2D pole) a aloka£ní pole stránek.

V aloka£ním poli je kaºdá poloºka hodnotou. Hodnota udává po£et blok· po aktuální stránku, v£etn¥ aktuální stránky. Pole tedy tvo°í °et¥z zabraných stránek. V p°ípad¥, ºe se vyskytne poºadavek na alokaci, alokátor hledá první volný °et¥zec nul odpovídající délky.

Jelikoº ve standalone není ochrana pam¥ti, spoléhá se na dodrºení poºadované délky alokované oblasti knihovnou. Pokud jiº nebude program alokovanou pam¥´ pot°ebovat, zavolá funkci free a dealokátor v p°íslu²ném °et¥zci stránek vynuluje v²echny poloºky.

Schéma alokátoru je uvedeno na obrázku 6.

Hlavní program (analogií je program volající funkce knihovny) tvo°í jediný soubor.

Obsahuje hlavní vstupní funkci (main), kde jsou v²echny inicializace periferií, komuni- kace s LameMP3, ovládání interface s hostovacím po£íta£em a ladící rozhraní. Jediné dal²í volané funkce jsou ovládání p°eru²ení od sériového portu a p°ípadné o²et°ení chyb hlá²ených PCIe bridgem. Na tomto míst¥ se inicializuje také £asova£, který slouºí k testo- vacím ú£el·m z hlediska rychlosti. Jeho funkce je následující: pro kaºdý výpis do konzole se p°i°adí aktuální £as £íta£e. Funkce pro výpis dat s £asem byla nadenována v souboru machine.h knihovny LameMP3, jeº je spole£ná pro v²echny zdrojové soubory. M·ºeme jí následn¥ vkládat do zdrojových soubor· a m¥°it £as mezi zavoláním a ukon£ením n¥jaké funkce. Finální zhodnocení rychlosti bude zaloºeno na t¥chto hodnotách. Funkce zárove¬

vypisuje jméno souboru a °ádek, odkud byla zavolána.

Dále je v hlavním programu základní smy£ka s jasným úkolem: £ekat na povel z po£íta£e nebo z debug konzole a vyplnit p°íkaz. Výchozí hodnoty byly stanoveny na:

bitrate CBR (konstantní)

(36)

Obrázek 6: Ilustrace návrhu jednoduchého alokátoru pam¥ti

samplerate 32 KHz

bitrate 128 kilobit· za sekundu quality 9 - worst (nejhor²í) mode mono

V p°ípad¥ pot°eby je moºné ony hodnoty zm¥nit. Pro demonstraci komunikace ale není t°eba hodnoty zvy²ovat.

5.6 GNU/Linux

Programování pro GNU/Linux se skládalo z ovlada£e a uºivatelského programu. Vývoj ovlada£e se °ídil kroky popsanými v kapitole 3. V ovlada£i bylo pot°eba nastavit ID pole pro PCIe kartu na hodnotu denovanou v EDK. Také bylo nutno pro p°ístup k víc neº osmibitovým hodnotám provést konverzi na opa£ný typ endianity. Procesor x86 je totiº little-endian a procesor Microblaze big-endian. To zp·sobovalo zpo£átku nepochopitelné chování. U ovlada£e byly implementovány funkce open, release, ioctl a mmap.

Operace £tení a zápisu buer· a £ekání na dokon£ení byly o²et°eny v uºivatelském prostoru pomocí volání ioctl, které b¥h zablokuje, dokud není £innost ukon£ena. Pro- gram v uºivatelském prostoru je velice jednoduchý, má za úkol £íst jednotlivé byte ze

(37)

standardního vstupu. Výsledná MP3 data zapisuje na standardní výstup. Na chybovém výstupu hlásí p°ípadné selhání a ladící informace.

(38)

6 Záv¥r

Diplomová práce byla cílena jako návod, re²er²e a seznámení se s embedded systémy pra- cujících jako periférie zpracovávající data. V²echny stanovené body byly i p°es p°ekáºky, jeº se objevily, prozkoumány. P°ekáºky byly následující:

Nekompatibilita endianity Tento problém byl vy°e²en pomocí vestav¥ných maker v já- dru Linux. Problém se projevoval zp°eházením jednotlivých byt· v datovém slov¥.

U hodnot o velikosti jeden byte se problém nevyskytoval.

Zamrzání po£íta£e P°i nahrávání bitstreamu do FPGA nastávaly problémy, ºe krátce po nahraní do²lo ke kompletnímu zamrznutí hostujícího po£íta£e. Je pravd¥podobné, ºe to zp·sobil reset pin·, který se b¥hem nahrávání bitstreamu pravd¥podobn¥

stane. Piny FPGA se dostanou do nekongurovaného výchozího stavu (pravd¥po- dobn¥ vysoká impedance) a PCIe °adi£ vyhodnotí jako poruchu. Nicmén¥ reset po£íta£e hardware do FPGA nahraný nesmaºe a systém je po vynuceném rebootu v po°ádku. Problém byl vy°e²en dv¥ma zp·soby. B¥hem vývoje embedded systému byla deska mimo po£íta£ a p°íkazy p°es PCIe emuloval pomocí napsané konzole sériový port. Druhý zp·sob bylo vyuºití obvodu watchdog, který pokud systém za- mrzne, vykoná reboot na hostujícím po£íta£i. Tímto opat°ením bylo moºné dokonce vyvíjet projekt p°es internet.

Pomalé enkódování Jedním z d·vod· velmi pomalého enkódování je pouºití softwarové knihovny. Architektura b¥ºí na pouhých 120 MHz. Je tedy nevyhnutelné, ºe enkó- dování bude pomalej²í neº na hostujícím po£íta£i (3.3 GHz dual core x86-64). Karta ur£it¥ u²et°í po£íta£i ur£ité mnoºství £asu, ale hodnota je malá. Jediné moºné °e²ení by bylo nepsat enkodér v platform¥ zaloºené na Microblaze, ale napsat vlastní sta- vový automat p°ímo ve VHDL kódu. Nevýhoda takovéhoto °e²ení by byla zna£ná.

Návrh by nebyl libovoln¥ programovatelný a z°ejm¥ by m¥l omezení co do po£tu podpory parametr·. Hlavní p°ekáºka v pouºití hardwarového MP3 enkodéru v této diplomové práci je ale v tom, ºe vývoj hardwarového MP3 enkodéru by vydal mi- nimáln¥ za jinou diplomovou práci.

Ilustra£ní výsledky m¥°ení rychlosti enkódovací karty jsou zobrazeny v tabulce 2. ƒíta£

má základnu 120 MHz a ²í°ku 32 bit·. Z tabulky je hned patrné, ºe v p°ípad¥ imple- mentace do VHDL by bylo nutno p°epsat v²echny £ásti (psychoakustický ltr, MDCT a tvo°ení bitového streamu) knihovny LameMP3 nebo vlastní. Tabulka obsahuje hodnoty z £íta£e zobrazené v ladící konzoli.

(39)

Událost Po£et tik· Odhadovaný £as [s]

Reset (inicializace parametr·) 1536750488 12.81

Enkódování cca 1800 vzork· 51180107 0.43

MDCT algoritmus 9929084 0.08274

Psychoakustický ltr 15962058 0.133

Vytvo°ení bitstreamu 16481058 0.137

Tabulka 2: Orienta£ní rychlosti dosahované kartou

Dal²í p°ípadné vyuºití práce vidím v tom, ºe vznikl £esky psaný materiál pro rychlé po£áte£ní zorientování se v problematice.

(40)

Slovní rejst°ík

API Application programming interface

Specikace komunikace mezi programovými prvky (program a knihovna). Popisuje typy a strukturu p°edávaných informací (vstupní parametry a návratové hodnoty).

V jazyku C to jsou hlavi£kové soubory a jejich dokumentace.

BAR Base Address Register

U PCI je to registr ur£ující startovní adresu okna p°ístupné vnit°ní pam¥ti PCI periferie.

BIOS Basic Input Output System

První program, který se pustí po startu po£íta£e. Stará se o základní nastavení periferií a na£tení opera£ního systému.

BIST Built-in self-test

Prvek pouºívaný JTAG testováním. V obvodu je automat, který provede testy a dodá informaci o úsp¥chu nebo neúsp¥chu.

bitstream Kongura£ní soubor obvodu FPGA. Je sloºen z posloupnosti bit·, nebo´ hlavní zp·sob kongurace FPGA je p°es sériovou sb¥rnici JTAG.

BRAM Block RAM

Hard-core bloky pam¥ti v FPGA. Slouºí na buery dat, mají kongurovatelnou

²í°ku sb¥rnice a £asto mají více neº jednu datovou a adresní sb¥rnici.

CBR Constant bitrate

Konstatní datový tok, typ uloºení dat v MP3 souboru.

CPLD Complex programmable logic device

Obvod historicky star²í a jiné architektury neº FPGA. Na rozdíl od FPGA je ale schopen uchovat si konguraci i po resetu.

CPU Central processing unit DMA Direct Memory Access

P°ímý p°ístup do pam¥ti. Procesor nastaví automat na sb¥rnici, který pak sám kopíruje data.

DSP Digital Signal Processing

Zkratka ozna£ující elektroniku pouºívanou pro digitální zpracování dat. V obvo- dech FPGA se krom¥ jiného takto ozna£ují hard-core bloky.

(41)

FIFO First In First Out

Typ p°ístupu k dat·m, obvykle v bueru. Znamená: první data, co p°i²ly, také první odejdou.

FPGA Field-programmable Gate Array

Pole programovatelné logiky. Vhodnou kongurací lze tvo°it kombina£ní nebo sekven£ní logiku.

GCC GNU C Compiler

Hlavní kompilátor projektu GNU, je schopen kompilovat i jiné jazyky neº jazyk C a téº podporuje mnoho architektur.

GNU GNU's not unix

Rekurzivní zkratka projektu Richarda Stallmana vyjad°ující distancování se od Unixu.

GPIO General Purpose Input/Output

Pin elektronického obvodu, jehoº logická hodnota nebo sm¥r toku dat, lze progra- mov¥ ovládat. Pin pro obecné pouºití.

GPL General public licence

Svobodná licence uºivateli zaru£ující zdrojové kódy a programátoru nevykradení jeho kódu. Modikace programu není moºné uzav°ít a vydávat za svoje. Modikace je nutné op¥t licencovat pod GPL.

hash Neboli otisk, má za úkol zhustit data do °et¥zce obvykle o pevné délce. Výsledný

°etezec je pak krat²í neº soubor dat, m·ºe tedy docházet ke kolizím (jeden hash pro více stejných dat). Pouºívá se na zb¥ºné porovnání obsahu.

IDE Integrated Drive Electronics

Rozhraní pro p°ipojení diskových mechanik.

IIC Inter-Integrated Circuit

Sb¥rnice vyvinutá rmou Philips pro sériovou komunikaci na nízkých rychlostech (max. x1MHz). V po£íta£ích se pouºívá pro p°enos kongurace (nej£ast¥ji sériové EEPROM pam¥ti malé kapacity).

IP Core Intellectual Property Core

Výrazem se u FPGA míní kompaktní VHDL popis n¥jakého hardware.

(42)

IRQ Interrupt Request

Poºadavek na p°eru²ení, od periferie pro CPU.

JTAG Joint Test Action Group

Pojem denující testování elektronických obvod· (bezchybnost vnit°ní logiky, správné propojení obvod·). Na moderních obvodech je tzv. JTAG port, kterými se testování provádí. Pospojované obvody pak tvo°í tzv. daisy chain. Obvody lze testovat i b¥hem provozu.

LGPL Lesser GPL

Licence ur£ená pro knihovny. Na rozdíl od GPL se pouºití knihovny v jiném projektu nebere jako odvozené dílo a tento projekt pak m·ºe být nonGPL.

MDCT Modied discrete cosine transformation Typ disktrétní cosinové transformace.

MMIO Memory mapped input output

Porty mapované do pam¥´ového adresního prostoru.

MMU Memory Management Unit

Základní prost°edek adresování moderních OS. Jednotka p°ekládá virtuální adresu pouºívanou v programu na fyzickou adresu. Lze tvo°it programov¥ souvislé bloky pam¥ti nad fragmentovanou opera£ní pam¥tí.

MP3 MPEG-1 Audio Layer III

Ztrátový kompresní formát zvuku MPEG Moving Picture Experts Group

Skupina zabývající se od konce 80. let vývojem multimediálních formát· a jejich standardizací.

PCIe Peripheral Component Interconnect Express

Po£íta£ová sb¥rnice se sériovým p°enosem dat, roz²í°ení PCI PCM Pulse code modulation

Reprezentace elektrických dat pomocí vzorkovaných a kvantizovaných hodnot.

Pr·b¥h elektrické veli£iny je udáván vzorkovací rychlostí a po£tem úrovní (²í°ka slova v bitech). Ve zvukové technice základní formát dat.

PLB Processor Local Bus

Obecná sb¥rnice od rmy XILINX pro projekty na FPGA £ipu.

(43)

PnP Plug and Play

Doslova zapoj a hraj. Hardware s tímto návrhem je schopen kongurace (adres, p°eru²ení) pouze programovými prost°edky.

RAM Random Access Memory

Pam¥´, ze které je moºno £íst z libovolného místa v libovolném po°adí. Dnes se pouºívá i pro schopnost £tení i zápisu.

ROM Read Only Memory

Pam¥´ pouze pro £tení. Data jsou obvykle zapsána ve výrob¥.

SMBUS System Management Bus

Sériová sb¥rnice odvozená od IIC pro jednoduché kongurace elektronických pe- riferií. Rychlosti jsou v desítkách kHz.

UART Universal asynchronous receiver/transmitter

Asynchronní sériová sb¥rnice, v pr·myslu se pouºívá na ovládání za°ízení a p°enos men²ího mnoºství dat.

USB Universal serial bus

Rychlá sb¥rnice pro p°ipojení externích prvk· do po£íta£e.

VBR Variable bitrate

Variabilní datový tok, typ uloºení dat v MP3 souboru.

VHDL Very high speed integrated circuits hardware description language

Jeden z jazyk·, kterým lze popsat zapojení elektronického nej£ast¥ji digitálního obvodu.

References

Related documents

Detta PCIe USB 3.1 Gen 2-kort installeras på en tillgänglig PCI-Express-plats i din dator och gör att du kan uppdatera ditt nuvarande system genom att lägga till två USB-C™-

Denna robusta M.2 NVMe PCIe SSD-inneslutning är en mycket bärbar, högpresterande datalagringslösning för dina USB-C- eller Thunderbolt 3-utrustade enheter.. Prestanda som inte går

Kortet är en plattform för att lägga till upp till tre M.2 SSD-enheter till i stort sett vilken dator som helst med en PCIe-port.. Den stöder vanliga M.2 SATA SSD-enheter samt

To, jaké vzd lání v oblasti ICT mají u itelky mate ských škol, jsme zjiš ovali prost ednictvím dotazníkového pr zkumu, jehož výsledky p inášíme

I lokal valuta uppgick ökningen till 28 % varav den organiska tillväxten för jämförbara enheter uppgick till 6 procent, förvärvade enheter svarade för 22 % av

Omsättningen för perioden januari till och med september 2002 uppgick till 19 008 MSEK, vilket motsvarar en ökning om 17%.. Den organiska tillväxten uppgick

Nakreslete.. 15) Připravte osciloskop na nové jednorázové vzorkování a navzorkujte komunikaci na USB poté, co stlačíte klávesu SPACE na klávesnici. Připravte

Genom att använda två värdkontroller-chipset fördelade över två portar istället för fyra dedikerar detta 4-ports PCIe till USB 3.1-kort upp till 10 Gbps för varje uppsättning