DIPLOMOV´A PR´ACE Digitáln´ı kompenzacn´ı jednotka pro
Transkript
České vysoké učenı́ technické v Praze Fakulta elektrotechnická DIPLOMOVÁ PRÁCE Digitálnı́ kompenzačnı́ jednotka pro impedančnı́ metrologii Praha, 2010 Autor: Jiřı́ Jánský Čestné prohlášenı́ Prohlašuji, že jsem předloženou práci vypracoval samostatně a že jsem uvedl veškeré použité informačnı́ zdroje v souladu s Metodickým pokynem o dodržovánı́ etických principů při přı́pravě vysokoškolských závěrečných pracı́. V Praze dne podpis i Poděkovánı́ Děkuji předevšı́m vedoucı́mu diplomové práce Ing. Radku Sedláčkovi, Ph.D. za jeho pomoc a podporu. Jeho trpělivosti a množstvı́ nápadů se výrazně podepsali na výsledku této práce. Také bych rád poděkoval všem pedagogům, se kterými jsem se v průběhu svého studia setkal. Cenı́m si předevšı́m toho, že čas strávený se mnou nepovažovali za zbytečný a svojim úsilı́m a inteligencı́ mi umožnili poznat vı́ce z oboru, který jsem se rozhodl studovat. Nakonec bych rád poděkoval svým rodičům, kteřı́ mi umožnili studovat a bez jejichž pomoci by to rozhodně nebylo jednoduché. ii Abstrakt Digitálnı́ kompenzačnı́ jedotka je přı́pravek vyvinutý v rámci diplomové práce pro zajištěnı́ přesného měřenı́ impedance na principu srovnávacı́ metody. Jeho funkce spočı́vá v eliminaci zbytkového napětı́ na LP svorkách etalonu elektrické impedance. K tomu se vyžı́vá metod synchronnı́ detekce pro měřenı́ střı́davého zbytkového napětı́ a jeho korekci zpětnovazebnı́m obvodem. Pro filtraci signálu a řı́zenı́ celého procesu je použité hradlové pole osazené na malém vývojovém kitu. K němu jsou ve formě samostatně realizované desky připojeny dalšı́ potřebné periferie. Na vstupu desky je kaskáda zesilovačů s přepı́natelným zesı́lenı́m určená pro dostatečné zesı́lenı́ vstupnı́ho signálu před zpracovánı́ pomocı́ analogovědigitálnı́ho převodnı́ku. Za nimi následujı́ dvoukanálové analogově-digitálnı́ a digitálněanalogové převodnı́ky pracujı́cı́ na frekvenci 60 MHz. Výstup z digitálně-analogového převodnı́ku je oddělen pomocı́ transformátoru a vyveden. Přı́padné výkonové zesı́lenı́ je tedy nutno řešit dalšı́m zesilovači. Výsledkem je tedy přı́pravek, pomocı́ kterého je možné snı́žit zbytkové napětı́ v měřı́cı́m obvodu z desı́tek milivoltů na desı́tky až jednotky mikrovoltů. iii Abstract Digital Compensation Unit was developed in master’s thesis for accurate measurement impedance based on application three voltmeter method. Function is based on measurement of residual voltage, filtering it using synchronous’s detection methods and compensate it using feedback. Field-programmable gate array is used for compensation control and signal filtering. The gate array is interconnected with analog-digital and digital-analog convertors with sample rate of 60 MHz. A cascade of amplifiers with variable gain is employed for matching amplitudy of input signal to range of used AD converters. The output from digital-analog covnertor is galvanic separated using transformer. Another external power amplifier must be used for amplifying of output signals of both unit channels. The designed compensation unit serves for elimination of residual voltages on the LP ports of both compared impedances by means of three voltmeter method. When compensation unit is applied for the impedance comparison, the levels of residual voltages are significantly reduced (approximattaly 1000 × times). iv v vi Obsah Seznam obrázků ix Seznam tabulek xi 1 Úvod 1 1.1 Definice čtyřpárové impedance . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2 Metoda třı́ voltmetrů . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3 Upravená metoda třı́ voltmetrů . . . . . . . . . . . . . . . . . . . . . . . 4 1.4 Požadavky a možnosti technického řešenı́ . . . . . . . . . . . . . . . . . . 5 2 Popis hardwarového řešenı́ 2.1 2.2 7 Cyclone III starter board . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.1.1 Hradlové pole Cyclone III . . . . . . . . . . . . . . . . . . . . . . 9 2.1.2 HSMC konektor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Rozšiřujı́cı́ deska s A/D a D/A převodnı́ky . . . . . . . . . . . . . . . . . 11 2.2.1 Popis použitého analogově digitálnı́ho převodnı́ku . . . . . . . . . 12 2.2.2 Popis použitého digitálně analogového převodnı́ku . . . . . . . . . 14 2.2.3 Vstupnı́ předzesilovač . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.2.4 Dalšı́ zpracovánı́ snı́maného signálu . . . . . . . . . . . . . . . . . 16 2.2.5 Pomocné obvody . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.2.6 Zdroj napětı́ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.2.7 USB - UART převodnı́k . . . . . . . . . . . . . . . . . . . . . . . 21 3 Softwarová část řešenı́ 23 3.1 Popis vývojového prostředı́ Quartus II . . . . . . . . . . . . . . . . . . . 23 3.2 Jednotlivé bloky realizované v FPGA . . . . . . . . . . . . . . . . . . . . 25 3.2.1 Fázový závěs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.2.1.1 25 Detektor náběžné hrany . . . . . . . . . . . . . . . . . . vii 3.2.1.2 Komparátor frekvence . . . . . . . . . . . . . . . . . . . 26 3.2.1.3 Komparátor fáze . . . . . . . . . . . . . . . . . . . . . . 27 3.2.1.4 Volně běžı́cı́ čı́tač . . . . . . . . . . . . . . . . . . . . . . 28 3.2.2 Generátor harmonických průběhů . . . . . . . . . . . . . . . . . . 29 3.2.3 Násobička . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.2.4 Čı́slicová dolnı́ propust . . . . . . . . . . . . . . . . . . . . . . . . 32 3.2.5 Regulátor korekčnı́ho signálu . . . . . . . . . . . . . . . . . . . . 35 3.2.6 Regulátor fázového posunu . . . . . . . . . . . . . . . . . . . . . . 36 3.2.7 Řı́zenı́ zesı́lenı́ vstupnı́ch předzesilovačů . . . . . . . . . . . . . . . 37 3.2.8 Zpracovánı́ sériové komunikace 39 . . . . . . . . . . . . . . . . . . . 4 Způsob použitı́ realizovaného hardwaru 43 4.1 Popis realizované jednotky . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4.2 Celkové uspořádánı́ měřicı́ho systému . . . . . . . . . . . . . . . . . . . . 45 4.3 Popis ovládánı́ jednotky . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 5 Závěr 49 Literatura 54 A Seznam použitých symbolů a zkratek B Obsah přiloženého CD I III C VHDL kód popsaných bloků V viii Seznam obrázků 1.1 Čtyřpárová impedance . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2 Metoda třı́ voltmetrů a vztah jednotlivých napětı́ . . . . . . . . . . . . . 3 1.3 Upravená metoda třı́ voltmetrů . . . . . . . . . . . . . . . . . . . . . . . 4 2.1 Blokové schéma přı́pravku . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2 Podrobné blokové schéma jednoho kanálu . . . . . . . . . . . . . . . . . . 9 2.3 Cyclone III starter board . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.4 Detail konektoru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.5 13 2.6 Vnitřnı́ části A/D převodnı́ku AD9248 (převzato z [7]) . . . . . . . . . . Nastavenı́ napět’ové reference převodnı́ku (převzato z [7]) . . . . . . . . . 2.7 Vnitřnı́ části D/A převodnı́ku AD9767 (převzato z [8]) . . . . . . . . . . 15 2.8 Vnitřnı́ části D/A převodnı́ku AD9767 (převzato z [8]) . . . . . . . . . . 16 2.9 Blokové schéma vstupnı́ch předzesilovačů . . . . . . . . . . . . . . . . . . 17 2.10 Dalšı́ zpracovánı́ signálu . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.11 Obvod 1408 (převzato z [10]) . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.12 Obvod ADG1414 (převzato z [11]) . . . . . . . . . . . . . . . . . . . . . . 19 2.13 Blokové schéma napájecı́ části . . . . . . . . . . . . . . . . . . . . . . . . 20 3.1 Okno programu Quartus II . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.2 Okno programu ModelSim . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.3 Bloky realizujı́cı́ fázový závěs . . . . . . . . . . . . . . . . . . . . . . . . 26 3.4 Detektor náběžné hrany . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.5 Blok komparátoru frekvence . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.6 Blok komparátoru fáze . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.7 Blok čı́tače . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.8 Blok generátoru harmonických průběhů . . . . . . . . . . . . . . . . . . . 30 3.9 Násobička . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.10 Různé formy plovoucı́ho průměru (převzato z [15]) . . . . . . . . . . . . . 33 ix 14 3.11 Jednoduché použitı́ filtru při decimaci (převzato z [15]) . . . . . . . . . . 33 3.12 CIC filtr vyššı́ho řádu (převzato z [15]) . . . . . . . . . . . . . . . . . . . 34 3.13 Optimalizovaná verze CIC filtru (převzato z [15]) . . . . . . . . . . . . . 34 3.14 Blok CIC decimátoru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.15 Blok regulace amplitudy korekčnı́ho signálu . . . . . . . . . . . . . . . . 37 3.16 Blok řı́dı́cı́ posun fáze výstupnı́ho signálu . . . . . . . . . . . . . . . . . . 38 3.17 Blok řı́dı́cı́ zesı́lenı́ předzesilovače . . . . . . . . . . . . . . . . . . . . . . 41 3.18 Blok převodu sériového formátu dat na paralelnı́ . . . . . . . . . . . . . . 41 3.19 Blok převodu paralelnı́ho formátu dat na sériové . . . . . . . . . . . . . . 41 3.20 Blok převodu sériového formátu dat na paralelnı́ a obráceně . . . . . . . 42 4.1 Hradlové pole propojené s přı́davnou deskou při testovánı́ . . . . . . . . . 43 4.2 Konektory na přı́davné desce desce . . . . . . . . . . . . . . . . . . . . . 44 4.3 Připojenı́ kompenzačnı́ jednotky k měřenému obvodu . . . . . . . . . . . 45 x Seznam tabulek 2.1 Vybrané parametry OZ AD8066 (převzaté z [9]) . . . . . . . . . . . . . . 18 2.2 Vybrané parametry multiplexeru AD1408 . . . . . . . . . . . . . . . . . . 19 2.3 Vybrané parametry polovodičového spı́nače AD1414 . . . . . . . . . . . . 19 3.1 Signály VHDL bloku pos edge detect . . . . . . . . . . . . . . . . . . . . 27 3.2 Signály VHDL bloku freq comparator . . . . . . . . . . . . . . . . . . . . 27 3.3 Signály VHDL bloku phase comparator . . . . . . . . . . . . . . . . . . . 28 3.4 Signály VHDL bloku counter . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.5 Signály VHDL bloku sinus rom . . . . . . . . . . . . . . . . . . . . . . . 30 3.6 Parametry generátoru harmonických signálů . . . . . . . . . . . . . . . . 31 3.7 Signály VHDL bloku mult . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.8 Signály VHDL bloku cic decimator . . . . . . . . . . . . . . . . . . . . . 35 3.9 Signály VHDL bloku integrator counter . . . . . . . . . . . . . . . . . . . 36 3.10 Signály VHDL bloku phase shifter . . . . . . . . . . . . . . . . . . . . . . 38 3.11 Signály VHDL bloku gain control . . . . . . . . . . . . . . . . . . . . . . 39 3.12 Signály VHDL bloku uart rx . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.13 Signály VHDL bloku uart tx . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.14 Signály VHDL bloku command decoder . . . . . . . . . . . . . . . . . . . 42 4.1 Seznam přı́kazů . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 5.1 Využitı́ hradlového pole . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 xi xii Kapitola 1 Úvod Měřenı́ elektrické impedance je velmi často využı́vaná úloha v elektrotechnické praxi. Proto bylo popsáno velké množstvı́ přı́strojů použı́vaných jako primárnı́ etalony elektrické impedance. Jednı́m z nich je etalon kapacity využı́vajı́cı́ Thomson-Lampardova teorému. U toho lze dokázat, že výsledná kapacita je lineárně závislá na posuvu středové elektrody podle vztahu 1.1. Dı́ky tomu, že ε0 má hodnotu přijatou definicı́ a ostatnı́ konstanty ve vztahu jsou také známi přesně, jediným zdrojem nejistot je posun středové elektrody. Při použitı́ interferometrických metod měřenı́ délky může být i tato nejistota velmi nı́zká. C = l ε0 ln 2 π (1.1) Dalšı́m primárnı́m etalonem je etalon odporu využı́vajı́cı́ kvantového Hallova jevu. Ten lze pozorovat na tenkovrstvých polovodičových strukturách umı́stěných v silném magnetickém poli při velmi nı́zkých teplotách. Struktury, které tento jev vykazujı́, lze využı́t jako čtyřsvorkové etalony odporu, jejichž hodnota nezávisı́ na rozměrech struktury ani na použitém materiálu, ale pouze na fyzikálnı́ch konstantách. Výsledná hodnota odporu struktury odpovı́dá jedné z hodnot uvedených ve vztahu 1.2. R= 1 h 1 · = Rk · 2 e i i i = 1, 2, 3, . . . (1.2) Výběr hodnot lze provést nastavenı́m vhodné indukce magnetického pole nebo přivedeného napětı́. Konstanta Rk = h e2 se podle objevitele kvantového Hallova jevu označuje von Kli- tzingovou konstantou. Podle doporučenı́ Mezinárodnı́ho výboru pro mı́ry a váhy by se pro von Klitzingovu konstantu mělo použı́vat sjednané hodnoty Rk = 25 812,807 Ω. Podrobnějšı́ popis těchto etalonů včetně způsobu jejich navázanı́ je popsán v literatuře[1]. 1 KAPITOLA 1. ÚVOD 2 Máme tedy k dispozici primárnı́ etalony impedance a dále je nutné použı́t vhodné metody pro jejich navázánı́ na pracovnı́ (sekundárnı́) etalony. Poté se tyto pracovnı́ etalony mohou použı́t pro běžná měřenı́ a kalibraci zařı́zenı́ v průmyslu. Přı́pravek vyrobený v rámci této diplomové práce je určen pro použitı́ právě při tomto druhu měřenı́. Než však bude popsána použitá měřicı́ metoda a funkce navržené jednotky, dovolı́m si uvést několik souvisejı́cı́ch témat. 1.1 Definice čtyřpárové impedance Pro dosaženı́ vysoké přesnosti při měřenı́ impedancı́ se použı́vá čtyřvodičové připojenı́. Při tomto zapojenı́ jsou dva vodiče vyhrazeny pro přı́vod proudu a dalšı́ dva pro měřenı́ napětı́ na samotném etalonu. Výhoda tohoto zapojenı́ spočı́vá v odstraněnı́ vlivu přı́vodnı́ch vodičů. Pokud celý etalon impedance umı́stı́me do vodivého stı́něnı́, jak je uvedeno v [2], a rovněž tı́mto stı́něnı́m opatřı́me jednotlivé vývody, dostáváme čtyřpárovou impedanci, jak je znázorněná na obr. 1.1. Obrázek 1.1: Čtyřpárová impedance Na takto připraveném etalonu je impedance definovaná jako poměr UHP a ILP za předpokladu, že napět’ovými svorkami neteče žádný proud a napětı́ na svorce ULP je vzhledem k plášti nulové (zkratky názvů svorek vycházejı́ z anglického Low Potential, High Current atd.). Impedanci při těchto podmı́nkách lze vyjádřit matematickým zápisem rovnice (1.3). Z= UHP ILC pokud ULP = 0V IHP = 0A ILP = 0A (1.3) 1.2. METODA TŘÍ VOLTMETRŮ 1.2 3 Metoda třı́ voltmetrů Metoda třı́ voltmetrů je zobrazena na obr. 1.2. Jedná se o sériové zapojenı́ dvou impedancı́, jimiž protéká střı́davý proud. K měřenı́ napětı́ můžeme použı́t bud’ jeden voltmetr, kterým postupně změřı́me napětı́ zdroje U, napětı́ na referenčnı́m etalonu US a napětı́ na neznámé impedanci UX , nebo tři stejné voltmetry. Přitom je nutné zachovat stejné podmı́nky měřenı́ (předevšı́m rozsah voltmetru). Použitı́ jednoho voltmetru má tu výhodu, že přesnost metody závisı́ na linearitě převodnı́ charakteristiky použitého voltmetru, nikoliv na jeho absolutnı́ přesnosti. Napětı́ zdroje U je vektorovým součtem jednotlivých napětı́. Z konstrukce trojúhelnı́ku lze určit informaci o vzájemném úhlu naměřených napětı́. Protože obvodem protéká všude stejný proud, impedance jednotlivých prvků svı́rajı́ stejný úhel jako napětı́ na nich naměřená. Také platı́, že poměr impedancı́ jednotlivých prvků je stejný s poměrem naměřených napětı́. To popisuje rovnice 1.4. Obrázek 1.2: Metoda třı́ voltmetrů a vztah jednotlivých napětı́ US UX U = = ZS ZX ZS + ZX (1.4) KAPITOLA 1. ÚVOD 4 1.3 Upravená metoda třı́ voltmetrů Pro použitı́ této metody pro měřenı́ čtyřpárových impedancı́ je však nutná výrazná úprava zapojenı́, viz obr. 1.3. Obrázek 1.3: Upravená metoda třı́ voltmetrů Zdroj napětı́ U1 respektive U2 představuje generátor harmonického průběhu a změnou jeho výstupnı́ho napětı́ se snažı́me nastavit minimálnı́ výchylku na indikátoru vyváženı́ D. Z důvodu omezeného rozlišenı́ nastavenı́ výstupnı́ch napětı́ generátorů a jejich fázového posunu nelze docı́lit nulového napětı́ na indikátoru vyváženı́. Pro přesnějšı́ vyváženı́ se použı́vá právě kompenzačnı́ jednotka vytvořena v této diplomové práci, která je schopná zbytkové napětı́ snı́žit až na jednotky μV. Kompenzačnı́ jednotka využı́vá injekčnı́ transformátory T1 a T2 , kterými do obvodu injekuje kompenzačnı́ napětı́ s cı́lem minimalizovat napětı́ na svorkách LP. Pokud bychom uvažovali použitı́ ideálnı́ch propojovacı́ch vodičů, stačil by pouze injekčnı́ transformátor T1 , kterým by se donastavilo vyváženı́ nulového indikátoru D. Protože však ve skutečnosti majı́ propojovacı́ vodiče konečně velkou impedanci, vzniká při průchodu proudu obvodem mezi svorkou LP impedance Z1 a mezi svorkou LP impedance Z2 nenulové napětı́. Proto napětı́ na svorce LP impedance Z1 je kompenzované pomocı́ injekčnı́ho transformátoru T1 a napětı́ na svorce LP impedance Z2 je kompenzováno pomocı́ injekčnı́ho transformátoru T2 . Ačkoliv princip metody třı́ voltmetrů nenı́ nikterak složitý, pro přesném měřenı́ je nutné zaručit podmı́nky definice čtyřpárové impedance a to s sebou přinášı́ určité problémy. Poprvé byla tato metoda třı́ voltmetrů pro přesné měřenı́ čtyřpárových použita v Italském IEN [3]. Zde byla filtrace signálu implementována pomocı́ analogových obvodů určených 1.4. POŽADAVKY A MOŽNOSTI TECHNICKÉHO ŘEŠENÍ 5 pro násobenı́ a sčı́tánı́ [4]. Také byla popsána digitálnı́ kompenzačnı́ jednotka [5] která obdobnou činnost realizovala pomocı́ čı́slicového zpracovánı́ signálů v DSP procesoru. Cı́lem této práce je návrh a realizace obdobné digitálnı́ kompenzačnı́ jednotky, která však bude schopna pracovat s mnohem vyššı́ frekvencı́ měřicı́ho signálu (až 1 MHz mı́sto 10 kHz). 1.4 Požadavky a možnosti technického řešenı́ Napětı́, které je nutné kompenzovat, je velmi malé. Řádově jednotky až desı́tky μV. Takže naměřená hodnota může být dosti ovlivněna různým šumem nebo rušenı́m. Proto je vhodné využı́t nějakou metodu filtrace. Napřı́klad synchronnı́ detekce. Tı́m se docı́lı́ výrazného potlačenı́ rušenı́, které má rozdı́lnou hodnotu frekvence (připadaně i fáze - v závislosti na implementaci) od referenčnı́ho signálu. Často se pro synchronnı́ detekci využı́vá harmonický (sinusový) nebo obdélnı́kový průběh referenčnı́ho signálu. Druhý zmı́něný má tu výhodu, že lze snadno realizovat pomocı́ změny polarity signálu. Nevýhoda pak spočı́vá v tom, že vyššı́ harmonické složky obdélnı́kového signálu propustı́ přı́slušné harmonické složky i na výstup. Násobenı́ harmonickým signálem se zase obtı́žněji realizuje (předevšı́m v analogové formě). Proto je pro něj vhodné čı́slicové zpracovánı́. To má i obvykle nižšı́ prostorové a finančnı́ nároky, a také je modulárnějšı́. Našı́m úkolem tedy je zdigitalizovat měřený signál, čı́slicově ho zpracovat a opět ho převést na signál analogový, který bude zaveden jako korekčnı́ hodnota do měřicı́ho obvodu. K tomuto převodu a zpracovánı́ snı́maného signálu máme v současné době k dispozici několik řešenı́. Jednı́m z nich je použitı́ profesionálně vyráběných měřicı́ch desek osazených rychlými převodnı́ky. Ty se vyrábějı́ bud’ v provedenı́ určeném pro osazenı́ do osobnı́ho počı́tače (PC) nebo měřicı́ho rámu (PXI). Zde je pak nutné zajistit dostatečně rychlé zpracovánı́ převedených dat. Dalšı́m možným řešenı́m je výroba vlastnı́ desky osazené běžně vyráběnými A/D a D/A převodnı́ky a zpracovánı́ dat na signálovém procesoru nebo hradlovém poli (FPGA). Toto řešenı́ je vı́ce přizpůsobené dané aplikaci a rovněž má výrazně nižšı́ pořizovacı́ cenu. Na druhou stranu je třeba investovat čas a úsilı́ do jeho vývoje. Po zváženı́ několika aspektů bylo nakonec vybráno řešenı́ připojenı́ obecně dostupných převodnı́ků k hradlovému poli a zpracovánı́ signálů na něm. V porovnánı́ s pořı́zenı́m zásuvných karet má toto řešenı́ výhodu nižšı́ch finančnı́ch nákladů a možnost přizpůsobenı́ KAPITOLA 1. ÚVOD 6 aplikace na mı́ru. Dalšı́ výhodou je čı́slicové zpracovánı́ signálu v hardwaru, který je k tomu lépe určen, než klasický mikroprocesor PC. Zpracovánı́ naměřených dat v signálovém procesoru bylo již popsáné v [5]. Kompenzačnı́ jednotka popisovaná v této práci je určena pro zpracovánı́ signálů v pásmu stovek kHz až jednotky MHz. Pro splněnı́ tohoto zadánı́ bylo nakonec zvoleno řešenı́ založené na použitı́ dostatečně rychlých AD a DA převodnı́ků společně s hradlovým polem, určeným pro zpracovánı́ digitalizovaných vstupnı́ch signálů. Kapitola 2 Popis hardwarového řešenı́ Jak již bylo zmı́něno v prvnı́ kapitole, přistoupilo se k řešenı́ využı́vajı́cı́ programovatelné hradlové pole s dvojicı́ A/D a D/A převodnı́ků (dva kompenzačnı́ kanály) doplněné o přı́slušné analogové obvody pro připojenı́ okolnı́ch signálů. Principiálnı́ blokové schéma tohoto řešenı́ je možno vidět na obr. 2.1. Zde blok FPGA představuje samotné hradlové pole, které je doplněné periferiemi pro jeho bezproblémovou komunikaci s okolı́m. Kromě A/D a D/A převodnı́ků to jsou i zesilovače k nim připojené. Protože na vstupu očekáváme napětı́ v hodnotách desı́tek mV až jednotek μV, je nutné, aby vstupnı́ zesilovače byly s regulovatelným zesı́lenı́m. O přepı́nánı́ zesı́lenı́ se stará hradlové pole. Referenčnı́ho výstupu hodin z generátoru je přiveden na vstup Fimp . Pro řı́zenı́ celého algoritmu kompenzace pomocı́ počı́tače je k hradlovému poli připojen převodnı́k USB ↔ UART. Podrobněji rozkreslené blokové schéma jednoho kanálu je na obr. 2.2. Zde vstupnı́ zesilovač, A/D převodnı́k, D/A převodnı́k a výstupnı́ zesilovač představujı́ části implementované na přı́davné desce. Dalšı́ bloky jsou pak realizovány v rámci firmware pro FPGA. Jednotka řı́zenı́ zesı́lenı́ (ŘZ) má za úkol vhodně nastavit zesı́lenı́ předzesilovače aby došlo k plnému využitı́ rozsahu A/D převodnı́ku. Po té je již zdigitalizovaných signál vynásoben dvěma referenčnı́mi signály (SIN, COS) s frekvencı́, která je odvozena z frekvence napájecı́ho napětı́ měřicı́ho obvodu. K těmto účelů sloužı́ plně digitálnı́ obvod fázového závěsu (DPLL), realizovaného v rámci FPGA. Tı́mto násobenı́m signálů je implementován rozklad na dvě kolmé složky jako v přı́padě lock-in zesilovače. Ty jsou jako regulačnı́ odchylka zavedeny do diskrétnı́ verze PI regulátoru, který se je pomocı́ svého výstupu snažı́ minimalizovat. Výstup regulátoru je poté rekonstruován pomocı́ harmonických signálů z fázového závěsu a přes D/A převodnı́k a výstupnı́ zesilovač zaveden do měřicı́ho obvodu. 7 8 KAPITOLA 2. POPIS HARDWAROVÉHO ŘEŠENÍ Obrázek 2.1: Blokové schéma přı́pravku Při realizaci této samostatné desky byl objeven problém, kdy došlo k tomu, že fáze výstupnı́ho (korekčnı́ho) signálu byla posunutá oproti fázi signálu na vstup přı́pravku. Tento fázový posun vznikl z největšı́ části dı́ky RC filtrům ve vstupnı́ch obvodech a konečné době zpracovánı́ dat v digitálnı́ch obvodech (jenom převod signálu v A/D převodnı́ku trvá 7 taktů). Tento fázový posun se také měnı́ s frekvencı́ vstupnı́ho signálu, proto jej nenı́ možné kompenzovat doplněnı́m konstantnı́ho zpožděnı́ na výstupu hradlového pole tak, aby součet všech zpožděnı́ byl 360◦ (fungovalo by to pouze na frekvenci, na které by se to napočı́talo). Proto byl sestaven blok řı́zenı́ fáze (ŘF), který má za úkol posunout fázi signálu o správnou hodnotu. Zajı́mavé také je, jakým způsobem docházı́ k posunu fáze. Naivnı́ postup by byl použı́t pamět’, ve které by se vzorky zadržely po určený počet taktů. Protože však rozkládáme harmonický signál do dvou na sebe kolmých složek, můžeme použı́t elegantnějšı́ řešenı́. A to takové, že průběhy harmonického signálu pro rekonstrukci fázově posuneme oproti průběhu, které sloužı́ k rozkladu signálu. Posunutı́ signálů pro rekonstrukci o úhel ϕ má za následek, že výstupnı́ harmonický signál bude také posunut právě o úhel ϕ. Toho si lze povšimnout i na obr. 2.2, kde je vidět, že harmonické signály pro rekonstrukci jsou fázově posunuty o úhel ϕ. 2.1. CYCLONE III STARTER BOARD 9 Obrázek 2.2: Podrobné blokové schéma jednoho kanálu 2.1 Cyclone III starter board Jako hradlové pole se využı́vá integrovaný obvod Cyclone III od firmy Altera osazený na takzvaném starterboardu obr. 2.3. Tato deska je podstatně cenově výhodnějšı́ než plný vývojový kit a za cenu $ 200 nabı́zı́, kromě samotného hardwarového pole a USB-JTAG programátoru, statickou, dynamickou a flash pamět’. Avšak pro komunikaci s uživatelem jsou k dispozici pouze 4 tlačı́tka a 4 LED diody. 2.1.1 Hradlové pole Cyclone III Cyclone III představuje v pořadı́ již třetı́ verzi takzvaného low-cost hradlového pole od firmy Altera. Kromě relativně nı́zké pořizovacı́ ceny je také kladen důraz na nı́zkou spotřebu. Výrobce deklaruje, že statická spotřeba celého pole nepřesáhne 0, 25 W. Podtyp obvodu, kterým je osazen starterboard, je Cyclone III EP3C25. Se svými 25 000 logickými elementy, 500 kb vestavěné paměti a 66 násobičkami 18x18, patřı́ přibližně do středu této řady. Nejenom dı́ky vysokému počtu násobiček, ale i dı́ky dalšı́ softwarové podpoře v podobě IP bloků je toto hradlové pole vhodné k DSP aplikacı́m. KAPITOLA 2. POPIS HARDWAROVÉHO ŘEŠENÍ 10 Obrázek 2.3: Cyclone III starter board 2.1.2 HSMC konektor Pro komunikaci s okolı́m této desky je určen HSMC konektor (High-Speed Mezzanine Card Interface)[6]. Jedná se o jakýsi pokus firmy Altera o standardizované rozhranı́ pro připojenı́ jednotlivých modulů k vývojovým kitům. Snažı́ se s nı́m vytvořit univerzálnı́ stavebnicové řešenı́ s nižšı́ základnı́ pořizovacı́ cenou (koupı́ se pouze to co je potřeba a ne plně osazená vývojová deska). Kromě rozměru konektoru je definováno i přiřazenı́ pinů do jednotlivých funkčnı́ch skupin. Některé piny jsou určeny pro napájenı́ přı́davné desky (napětı́ +12 V a +3,3 V) a jiné jsou připojeny na speciálnı́ piny na hradlovém poli pro rychlý vstup a výstup hodin. Největšı́ množstvı́ kontaktů však lze využı́t jako obecné vstupy a výstupy. Na obr. 2.3 lze tento konektor najı́t při pravé zadnı́ hraně desky. Detail konektoru je zobrazen na obr. 2.4. Zde jsou ve středu vidět kovové pásky určené pro připojenı́ země. Dı́ky tomu je možné všech 160 pinů připjit aniž by vyzařovali výrazné elektromagnetického rušenı́. 2.2. ROZŠIŘUJÍCÍ DESKA S A/D A D/A PŘEVODNÍKY 11 Obrázek 2.4: Detail konektoru 2.2 Rozšiřujı́cı́ deska s A/D a D/A převodnı́ky Máme tedy k dispozici hradlové pole vhodné pro zpracovánı́ zdigitalizovaného signálu, ale nejdřı́ve je nutné tento signál nějakým způsobem zı́skat. K tomu sloužı́ deska vytvořená v rámci této práce připojená pomocı́ výše zmı́něného HSMC konektoru k desce hradlového pole. Tato deska obsahuje kromě nutného předzesilovače s nastavitelným zesı́lenı́m a A/D převodnı́ku, také D/A převodnı́k s přizpůsobeným výstupem a napájecı́ obvody s možnostı́ napájet rozšiřujı́cı́ desku z externı́ baterie nebo přes HSMC konektor. Napájenı́ z baterie je vhodné pro zesilovánı́ velmi nı́zkých signálů, kdy se odstranı́ zemnı́ smyčky, rušenı́ ze sı́tě a podobně. Protože tato deska bude tvořit jedinou periferii připojenou k starterboardu a ten nedisponuje žádným jiným výstupnı́m portem pro komunikaci s počı́tačem nebo operátorem, byl na tuto desku přidán rovněž převodnı́k USB - UART. KAPITOLA 2. POPIS HARDWAROVÉHO ŘEŠENÍ 12 2.2.1 Popis použitého analogově digitálnı́ho převodnı́ku Jak již bylo zmı́něno, jednou ze stěžejnı́ch vlastnostı́ této jednotky by měla být schopnost pracovat při poměrně vysoké frekvenci měřicı́ho proudu (až jednotky MHz). Proto je nutné zvolit poměrně rychlé převodnı́ky. Naštěstı́ se v poslednı́ době v telekomunikacı́ch začaly použı́vat převodnı́ky s vzorkovacı́ frekvencı́ řádově desı́tky MHz, jež jsou hojně dostupné na trhu. Zároveň s tı́m se i začaly použı́vat ortogonálnı́ modulace a to se projevilo výrobou dvoukanálového převodnı́ku v jednom pouzdře. Toho lze s výhodou využı́t pro našı́ aplikaci, protože kompenzačnı́ jednotka by měla mı́t dva kanály. Jeden pro referenčnı́ impedanci a druhý pro měřenou impedanci. Jako A/D převodnı́k je použit typ AD9248-65 od firmy Analog Devices. Jedná se o dvoukanálový (jednotlivé kanály jsou na sobě nezávislé) 14 bitový převodnı́k se vzorkovacı́ frekvencı́ až 65 MSPS. Rychlého zpracovánı́ dat je docı́leno za využitı́ pipelineningu. Proto trvá 7 hodinových cyklů než dojde k převodu odměřené hodnoty. K převodu docházı́ postupně v několika převodnı́cı́ch. Neplatı́, že rozsah dalšı́ho převodnı́ku by odpovı́dal velikost kvantizačnı́ho kroku předchozı́ho, ale rozsahy jednotlivých převodnı́ků se překrývajı́. Dı́ky tomu je výrobce schopen zaručit převod bez výpadku kódových slov[7]. Jednotlivé vnitřnı́ bloky A/D převodnı́ku jsou zobrazeny na obr. 2.5. Kromě sample ” and hold“ obvodů, samotných převodnı́ků a výstupnı́ch registrů je v pouzdře umı́stěn také obvod napět’ové reference, řı́dı́cı́ obvod a v přı́padě nejrychlejšı́ho typu AD9248-65 i stabilizátor střı́dy hodin. Diferenčnı́ vstup je vhodné použı́t pro docı́lenı́ vyššı́ho odstupu signálu od šumu. 14 bitový paralelnı́ výstup je doplněn o signál OTR (out of range) signalizujı́cı́ překročenı́ vstupnı́ho rozsahu převodnı́ku. Signálem OEB (output enabled) je možné daný budič vyřadit z činnosti. Funkci stabilizátoru střı́dy hodin pro jednotlivé signály CLK_A a CLK_B je možné aktivovat pomocı́ vstupu DCS (duty cycle stabilizer). Signálem SHARED\_REF řı́dı́cı́ho obvodu je možné přepnout převodnı́k do stavu, kdy se pro oba kanály bude použı́vat stejná napět’ová reference. Jednotlivými vstupy PWDN je pak možné daný kanál odpojit a snı́žit spotřebu energie. Signál DFS (data format select) sloužı́ k volbě formátu výstupnı́ch dat. Je možné volit mezi dvojkovým doplňkem čı́sla a posunutı́m nuly, kdy samé nuly odpovı́dajı́ nejnižšı́ hodnotě napětı́ a samé jedničky nejvyššı́ hodnotě napětı́. Vstupem MUX_SELECT je možné zajistit, že výstup z převodnı́ku v kanále A půjde na výstupnı́ registr kanálu B a obráceně. Dı́ky tomu je možné z jedné výstupnı́ sběrnice vyčı́tat hodnoty obou kanálů a tı́m výrazně snı́žit počet datových vodičů. Na obr. 2.6 je detail zapojenı́ napět’ové reference převodnı́ku. Vývody VREF a SENSE 2.2. ROZŠIŘUJÍCÍ DESKA S A/D A D/A PŘEVODNÍKY 13 Obrázek 2.5: Vnitřnı́ části A/D převodnı́ku AD9248 (převzato z [7]) jsou určeny k nastavenı́ referenčnı́ hodnoty napětı́. Odporovým děličem lze snı́žit výstupnı́ napětı́ VREF a zavést ho zpátky na vstup SENSE. Tı́m si sestavı́me jednoduchý zpětnovazebnı́ obvod. Poměrem těchto odporů v děliči určujeme konstantu, kterou se vynásobı́ napětı́ vnitřnı́ reference 0,5 V. Pokud připojı́me vývod SENSE na zem, vnitřnı́ logika obvodu to detekuje a připojı́ k napět’ové referenci integrovaný dělič napětı́ pro zı́skánı́ referenčnı́ honoty 1 V (to odpovı́dá rozsahu převodnı́ku 2 Vpp ). Při připojenı́ vstupu SENSE na napájecı́ napětı́ je možné přivést na vývod VREF napětı́ z externı́ reference. Pokud propojı́me svorku SENSE se svorkou VREF zı́skáme zpětnovazebnı́ obvod s jednotkovým přenosem. Při tomto zapojenı́ je také nejmenšı́ drift napět’ové reference a zároveň je to nejnižšı́ napětı́, které lze bez použitı́ externı́ reference vytvořit (tedy referenčnı́ napětı́ 0,5 V s rozsahem převodnı́ku 1 Vpp ). Proto byla tato konfigurace použita v kompenzačnı́ jednotce. Vývody REFT a REFTB jsou určeny pro připojenı́ externı́ sı́tě kondenzátorů. KAPITOLA 2. POPIS HARDWAROVÉHO ŘEŠENÍ 14 Obrázek 2.6: Nastavenı́ napět’ové reference převodnı́ku (převzato z [7]) 2.2.2 Popis použitého digitálně analogového převodnı́ku Jako D/A převodnı́k je použit typ AD9767 také od firmy Analog Devices. Tento převodnı́k je rovněž 14 bitový s možnostı́ pracovat na frekvenci až 125 MSPS (to však nemá význam, protože je taktovaný stejným hodinovým signálem jako A/D převodnı́k). Proudový výstup převodnı́ku lze bud’ přı́mo použı́t, nebo osadit desku vysokofrekvenčnı́m trasformátorem, který by měl zlepšit parametry výstupnı́ho signálu (a odstaranit stejnosměrnou složku). Vnitřnı́ části D/A převodnı́ku spolu s výstupnı́mi a vstupnı́mi signály jsou zobrazeny na obr. 2.7. Jsou zde obvody pro přı́jem digitálnı́ch dat, samotné převodnı́ky s proudovým výstupem, obvod napět’ové reference a obvod řı́dı́cı́ snı́ženı́ spotřeby. Vstup MODE sloužı́ k volbě multiplexovaného (prokládaného) nebo nemultiplexovaného vstupu dat, podobě jako v předchozı́m přı́padě u A/D převodnı́ku. Při připojeném napájecı́m napětı́ na vstup MODE pracuje čı́slicový vstup jako dvouportový, na každém portu se posı́lajı́ data pro jeden kanál zvlášt’ a signály WRT1/IQWRT a WRT2/IQSEL se zapisujı́. Při připojenı́ vývodu MODE na zem se vnitřnı́ obvody přepnou do prokládaného režimu. Na vstupu PORT1 se očekávajı́ data, která se pomocı́ signálu WRT1/IQWRT zapı́šı́. Přitom vstupem WRT2/IQSEL lze určit, jestli se jedná o prvnı́ nebo druhý kanál. Při tomto režimu jsou oba převodnı́ky taktovány pomocı́ vstupu CLK1, jehož frekvence je vnitřnı́mi obvody 2.2. ROZŠIŘUJÍCÍ DESKA S A/D A D/A PŘEVODNÍKY 15 Obrázek 2.7: Vnitřnı́ části D/A převodnı́ku AD9767 (převzato z [8]) snı́žena na polovičnı́ hodnotu. Vstupem CLK2/IQRESET lze přitom dočasně docı́lit ignorovánı́ hodinového vstupu jak ukazuje obr. 2.8. To je vhodné k synchronizaci výstupu D/A převodnı́ku s lichou nebo sudou hranou hodin. Dalšı́ vývody se týkajı́ bloku napět’ové reference. Pokud použı́váme vnitřnı́ napět’ovou referenci, na vývod REFIO připojı́me externı́ kondenzátor. Pokud bychom nechtěli použı́t vnitřnı́ napět’ovou referenci, je možné na tento vývod přı́mo přivést referenčnı́ napětı́. Rozsah proudového výstupu převodnı́ku se určı́ pomocı́ rezistorů propojených se zemı́ a vývodem FSADJ1 přı́padně vývodem FSADJ2 pro druhý kanál. Vstupem GAINCTRL lze převodnı́k přepnout do režimu sdı́lené reference, kdy se pro nastavenı́ rozsahu obou kanálů použı́vá pouze pin FSADJ1 a pin FSADJ2 musı́ zůstat nezapojený. Přivedenı́m napájecı́ho napětı́ na vstup SLEEP lze odpojit výstupnı́ proudové budiče a přepnout převodnı́k do stavu snı́žené spotřeby. 2.2.3 Vstupnı́ předzesilovač Při snı́mánı́ hodnotnot napětı́ na vstupu přı́pravku mluvı́me o velmi malých napětı́ch v řádech jednotek až desı́tek μV. Aby je mohl převodnı́k se vstupnı́m rozsahem 1 Vpp nějakým vhodným způsobem převést, je nutné je dostatečně zesı́lit. K tomu byla navržena KAPITOLA 2. POPIS HARDWAROVÉHO ŘEŠENÍ 16 Obrázek 2.8: Vnitřnı́ části D/A převodnı́ku AD9767 (převzato z [8]) kaskáda operačnı́ch zesilovačů obr. 2.9. Vstupnı́ signál lze při jedné poloze relé přivést do jednotkového zesilovače, sloužı́cı́ho pro impedančnı́ oddělenı́ od měřeného obvodu, odkud vede dále do multiplexeru a A/D převodnı́ku. Při druhé poloze kontaktů relé je signál přiveden na dvojici operačnı́ch zesilovačů (dále jen OZ) AD8066 s FET tranzistory na vstupu (vysoký vstupnı́ odpor, vybrané parmetry viz tabulka 2.1) a dále na diferenčnı́ zesilovač. Ten tvořı́ s předchozı́mi OZ jakýsi přı́strojový zesilovač. Odtud je možné signál přı́mo přes multiplexer připojit ke vstupu A/D převodnı́ku nebo nechat pokračovat dále v kaskádě zesilovačů, dokud nedosáhne potřebné úrovně napětı́. U jednotlivých OZ nenı́ žádným zapojenı́m v operačnı́ sı́ti kompenzována vstupnı́ napět’ová nesymetrie. Proto je nutné vždy po částečném zesı́lenı́ zařadit hornı́ propust (HP), která zajistı́ odfiltrovánı́ stejnosměrné složky, jenž by mohla nabýt přı́liš vysoké hodnoty. Pokud je signál zaveden do multiplexeru dřı́ve než projde poslednı́m zesilovačem, jsou nepoužité OZ vyřazeny z funkce přivedenı́m záporného napájecı́ho napětı́ na přı́slušný pin. Volbu správného zesı́lenı́ má na starosti logika hradlového pole. 2.2.4 Dalšı́ zpracovánı́ snı́maného signálu Poté, co je signál dostatečně zesı́len, je upraven filtrem DP (viz obr. 2.10). Jedná se o Besselův typ 2. řádu realizovaný pomocı́ Sallen-Key zapojenı́. Odtud by již signál mohl být přiveden na diferenčnı́ vstup převodnı́ku s tı́m, že se jeden vstup připojı́ přı́mo na zem. Lepšı́ch výsledků převodu se však dosáhne předřazenı́m diferenčnı́ho zesilovače 2.2. ROZŠIŘUJÍCÍ DESKA S A/D A D/A PŘEVODNÍKY Obrázek 2.9: Blokové schéma vstupnı́ch předzesilovačů 17 KAPITOLA 2. POPIS HARDWAROVÉHO ŘEŠENÍ 18 Tabulka 2.1: Vybrané parametry OZ AD8066 (převzaté z [9]) Parametr Podmı́nky Hodnota Vstupnı́ impedance proti zemi 1000 GΩ2, 1 pF Vstupnı́ impedance diferenčně 1000 GΩ4, 5 pF Vstupnı́ proud 6 pA max Šı́řka pásma -3 dB Doba přeběhu SFDR G = 1 Vo = 0, 2 Vpp 120 MHz G = +2 Vo = 2 Vpp 42 MHz G = +2 Vo = 4 V skok 180 V/μs fc = 5 MHz G = +2 Vo = 2 Vpp -67 dBc fungujı́cı́ho jako symetrizačnı́ člen SYM a symetrickým buzenı́m převodnı́ku. Poté je signál již převeden A/D převodnı́kem ADC do čı́slicové formy a přes budiče sběrnice BUF putuje do hradlového pole. Obrázek 2.10: Dalšı́ zpracovánı́ signálu 2.2.5 Pomocné obvody K vypı́nánı́ nepoužitých stupňů kaskádnı́ho zesilovače, byl použit polovodičový spı́nač ADG1414 (obr. 2.12). Ten je spolu s obvodem multiplexoru ADG1408 (obr. 2.11) ovládán logikou hradlového pole. Pro rekonstrukci signálu upraveného hradlovým polem je použitá část desky s D/A převodnı́kem. Čı́slicový signál přicházejı́cı́ z hradlového pole je nejprve zaveden na budiče, odkud je teprve připojen na čı́slicové vstupy D/A převodnı́ku. Tyto budiče nemajı́ za úkol 2.2. ROZŠIŘUJÍCÍ DESKA S A/D A D/A PŘEVODNÍKY Obrázek 2.11: Obvod 1408 (převzato z [10]) 19 Obrázek 2.12: Obvod ADG1414 (převzato z [11]) Tabulka 2.2: Vybrané parametry multiplexeru AD1408 Parametr Odpor v sepnutém stavu Šı́řka pásma s poklesem -3dB Hodnota 7 Ω typ 60 MHz typ pouze dostatečně výkonově zesı́lit signál, ale také přizpůsobit 2,5 V logiku hradlového pole 3,3 V logice digitálnı́ch výstupu D/A převodnı́ku. 2.2.6 Zdroj napětı́ Pro napájenı́ použitých obvodů je nutné několik velikostı́ napětı́. O jejich stabilizaci se stará napájecı́ část desky, viz obr. 2.13. Jako zdroj napětı́ je možné použı́t bud’ libovolný externı́ zdroj přivedený na svorky, nebo využı́t možnosti FPGA kitu a čerpat až 1 A z 12 V větve přes HSMC konektor. Svorky pro přı́vod externı́ho napětı́ jsou určeny předevšı́m pro připojenı́ akumulátorů, které poskytujı́ napětı́ bez jakéhokoliv rušenı́ ze sı́tě. Toto Tabulka 2.3: Vybrané parametry polovodičového spı́nače AD1414 Parametr Odpor v sepnutém stavu Proud spı́načem Maximálnı́ zatı́ženı́ pouzdra Hodnota 20 Ω typ 122 mA max 300 mA 20 KAPITOLA 2. POPIS HARDWAROVÉHO ŘEŠENÍ napětı́ je vhodné pro napájenı́ předzesilovače a zesilovánı́ velmi nı́zkých hodnot vstupnı́ho signálu. Napájenı́ přes HSMC konektor je zase výhodné v přı́padě, kdy nemáme tak vysoké požadavky na vstupnı́ předzesilovač, protože je již vestavěné v desce hradlového pole a nenı́ nutné cokoliv kamkoliv připojovat. Pro samotnou stabilizaci napětı́ byly použity lineárnı́ stabilizátory. To je sice řešenı́ náročné na odvod ztrátového tepla, na druhou stranu se tı́m vyhneme jakémukoliv rušenı́ od impulznı́ch měničů, které by se mohlo projevit zvláště při zesilovánı́ nı́zkého vstupnı́ho napětı́. Nynı́ se vrat’me k popisu funkce jednotlivých bloků, jak jsou zobrazeny na obr. 2.13. Pomocı́ dvojice jumperů lze zvolit, zda se má použı́t napájenı́ z externı́ch svorek BAT nebo využı́t napájenı́ v HSMC konektoru. V druhém přı́padě je nutné ještě pomocı́ invertoru tvořeného obvodem MC34063AP1 zı́skat záporné napětı́. Zařazenı́m inventoru zároveň zařazuji i impulznı́ měnič, kterým jsem se chtěl dı́ky použitı́ spojitých stabilizátorů vyhnout. To však nenı́ problém, protože napájenı́ z HSMC konektoru se předpokládá v přı́padech, kdy nejsou kladeny takové nároky na filtraci napájecı́ho napětı́. Jednotlivé stabilizátory napětı́ pro čı́slidové obvody +3,3V a +2,5V jsou připojeny přı́mo. Stabilizátory por analogové obvody +3,3V, +5V a -5V jsou připojeny přes analogový FILTR. Obrázek 2.13: Blokové schéma napájecı́ části 2.2. ROZŠIŘUJÍCÍ DESKA S A/D A D/A PŘEVODNÍKY 2.2.7 21 USB - UART převodnı́k Vzhledem k tomu, že FPGA kit je vybavený pouze čtyřmi diodami a čtyřmi tlačı́tky, je nanejvýš vhodné rozšı́řit komunikačnı́ schopnosti přı́pravku se svým okolı́m. Vhodným kandidátem pro toto rozšı́řenı́ je obyčejná sériová linka pro komunikaci s počı́tačem. Ta však, tak jak je implementovaná ve standartu RS-232, nenı́ přiliš vhodná, protože současné notebooky tento port nemajı́ vyvedený vůbec a osobnı́ počı́tače maximálně jeden. A protože bychom se stejně nevyhnuli použitı́ nějakého převodnı́ku úrovnı́, tak bylo zvoleno rovnou použitı́ USB UART převodnı́ku FT232R. Ten nám na jedné straně poskytuje rozhranı́ USB device pro komunikaci s osobnı́m počı́tačem, na straně druhé pak UART s volitelným napětı́m a polaritou výstupnı́ch signálů a hardwarovým řı́zenı́m toku. Dı́ky tomu, že obvod obsahuje i RC oscilátor, nenı́ nutné téměř nic dalšı́ho připojovat. Minimálnı́ okolnı́ součástky se skládajı́ z USB konektoru a blokujı́cı́ho kondenzátoru. Na straně počı́tače, dojde k rozpoznánı́ převodnı́ku a vytvořenı́ virtuálnı́ho sériového portu. Signály pro přı́jem a vysı́lánı́ sériových dat RXD a TXD lze připojit přı́mo k hradlovému poli a zpracovat programovatelnou logikou. 22 KAPITOLA 2. POPIS HARDWAROVÉHO ŘEŠENÍ Kapitola 3 Softwarová část řešenı́ 3.1 Popis vývojového prostředı́ Quartus II Vývoj kódu pro hradlové pole lze realizovat v programu Quartus II. Jeho verze Quartus II Web Edition je volně stažitelná z webu firmy Altera [12]. Program pro hradlové pole lze vytvořit v jazyce Verilog, VHDL nebo pospojovánı́m bloků pomocı́ grafického editoru, viz obr. 3.1. Přitom každý modul je možné vytvořit jiným způsobem a výsledek přeložit do jednoho celku. Ze schémat nakreslených v grafickém editoru je program schopný vygenerovat soubor v jazyce Verilog nebo VHDL. Dı́ky tomu můžeme i takto vytvořený návrh obvodu simulovat napřı́klad v programu Modelsim, který nenı́ schopen se schématy pracovat. Kromě překladu a editace kódu umožňuje vývojové prostředı́ tvorbu jednotlivých bloků přı́mo pomocı́ untility Megafunction Wizard. Ta umožňuje přı́mé použitı́ jednotlivých logických prvku, které jsou hardwarově realizovány v hradlovem poli, jak napřı́klad obvodu fázového závěsu (PLL). Kromě toho, je možné tı́mto nástrojem nakonfigurovat a vložit dodávaná IP jádra. Dı́ky tomu je možné snadným způsobem zı́skat napřı́klad FIR filtr nebo čı́slicovou obdobu napětı́m řı́zeného oscilátoru. Nutno však podotknou, že tato IP jádra jsou z valné většiny placená a pro jejich použitı́ je tedy nutné mı́t požadovanou licenci. K testovánı́ návrhu v samotném vývojovém prostředı́ Quartus lze využı́t pouze jednoduchý dialog, kde se nadefinujı́ vstupnı́ signály a po propočı́tanı́ simulace se zobrazı́ průběh výstupů. K opravdovému testovánı́ pomocı́ testbenchů ve jazyce VHDL nebo Verilog toto vývojové prostředı́ nelze použı́t. Proto je firmou Altera dodávána ke staženı́ speciálnı́ verze programu ModelSim[13]. Tato volně stažitelná verze bývá pro vetšinu 23 24 KAPITOLA 3. SOFTWAROVÁ ČÁST ŘEŠENÍ Obrázek 3.1: Okno programu Quartus II Obrázek 3.2: Okno programu ModelSim 3.2. JEDNOTLIVÉ BLOKY REALIZOVANÉ V FPGA 25 aplikacı́ dostatečná. Ale oproti komerčnı́ verzi má také řadu omezenı́. Napřı́klad nelze simulovat návrh, jehož zdrojové kódy byly napsány z části v jazyce Verilog a z části v jazyce VHDL. Verze programu ModelSim dodávaná firmou Altera (jak volně stažitelná, tak dalšı́ komerčnı́ podverze), oproti normálnı́ verzi programu, obsahuje simulačnı́ knihovny všech hardwarově realizovaných prvků hradlového pole a dı́ky tomu je možné simulovat jejich chovánı́ při interakci s ostatnı́mi bloky. Kód pro hradlové pole kompenzačnı́ jendotky byl vyvı́jen za pomoci těchto dvou nástrojů a jazyka VHDL. Program Quartus II byl využit kvůli schopnosti sesyntetizovat výsledný návrh pro použitı́ v hradlovém poli Cyclone III. Program ModelSim pak představuje rozšı́řené a mocné prostředı́ pro testovánı́, laděnı́ a simulaci jednotlivých modulů. Proto k jednotlivým částem návrhu byly napsány testbenche a návrh tı́m zkontrolován, přı́padně opraven. 3.2 3.2.1 Jednotlivé bloky realizované v FPGA Fázový závěs Pro odvozenı́ frekvence referenčnı́ch signálů je použita informace z bloku fázového závěsu. Plně čı́slicový fázový závěs je složen z jednotlivých bloků zobrazených na obr. 3.3, které jsou popsány v jazyce VHDL jako synchronnı́ obvod. Inspiracı́ pro jeho tvorbu byla prezentace [14]. Základem je blok volně běžı́cı́ho čı́tače counter, který s periodou hodin clock přičı́tá vnitřnı́ konstantu k výstupu VCO. Tuto konstantu a tı́m i rychlost čı́tánı́ generujı́ dalšı́ bloky popsané dále v textu. 3.2.1.1 Detektor náběžné hrany Detektor náběžné hrany pos_edge_detect je jednoduchý blok, který na výstupu generuje impuls, pokud byla zaznamenána náběžná hrana na jeho vstupu. K tomu sloužı́ vnitřnı́ jednobitová pamět’, do které se s každou náběžnou hranou ukládá aktuálnı́ hodnota vstupu. Pokud se detekuje, že stará hodnota vstupu z paměti je ’0’ a nová ’1’, po dobu jednoho taktu hodin se na výstupu objevı́ logická hodnota ’1’. KAPITOLA 3. SOFTWAROVÁ ČÁST ŘEŠENÍ 26 Obrázek 3.3: Bloky realizujı́cı́ fázový závěs 3.2.1.2 Komparátor frekvence Tato jednotka by se také dala nazývat dělička frekvence, protože generovaný signál vco_msb nejprve dělı́ a poté ho porovnává s frekvencı́ vstupnı́ho signálu, na který má být systém zavěšen. Blok funguje tı́m způsobem, že při signálu freq_imp nastavı́ hodnotu vnitřnı́ho čı́tače na předem určenou hodnotu, která odpovı́dá poměru obou frekvencı́. Poté se s každou náběžnou hranou signálu vco dekrementuje. Při dalšı́m přı́chodu signálu freq_imp se podle aktuálnı́ho stavu čı́tače rozhodne, jestli je frekvenci třeba zvětšit nebo zmenšit. Pokud bude hodnota čı́tače nulová, znamená to, že přišlo právě tolik náběžných hran, kolik bylo požadováno, a frekvenci nenı́ třeba korigovat. Pokud stav čı́tače nebude nulový, ale prvnı́ bit nulový bude, znamená to, že přišlo menšı́ množstvı́ impulzů, než kolik bylo očekáváno, a je potřeba frekvenci generátoru zvýšit. Pokud stav čı́tače nebude nulový a prvnı́ bit bude jedničkový, znamená to, že došlo k jeho přetečenı́, protože přišlo většı́ množstvı́ náběžných hran než bylo očekáváno a frekvenci generátoru je potřeba 3.2. JEDNOTLIVÉ BLOKY REALIZOVANÉ V FPGA Název Port Datový typ Popis clock in std logic hodiny input in std logic vstup reset in std logic reset output out std logic výstup Tabulka 3.1: Signály VHDL bloku pos edge detect 27 Obrázek 3.4: Detektor náběžné hrany snižı́t. Zvýšenı́ popřı́padě snı́ženı́ frekvence se signalizuje na přı́slušném výstupu impulzem trvajı́cı́ jednu periodu hodin. Tabulka 3.2: Signály VHDL bloku freq comparator Název Port Datový typ Popis clock in std logic hodiny reset in std logic reset vco msb in std logic nejvyššı́ bit akumulátoru oscilátoru freq imp in std logic hrana referenčnı́ho signálu lo out std logic indikace nı́zké frekvence hi out std logic indikace vysoké frekvence Obrázek 3.5: Blok komparátoru frekvence 3.2.1.3 Komparátor fáze Blok komparátoru fáze funguje tı́m způsobem, že při přı́chodu signálu freq_imp porovná aktuálnı́ stav vnitřnı́ho čı́tače (signály VCO). Pokud odpovı́dá samým ’0’ nebo samým ’1’ čı́tač právě přetekl, nebo se chystá přetéct a vše je v naprostém pořádku. V přı́padě, že KAPITOLA 3. SOFTWAROVÁ ČÁST ŘEŠENÍ 28 je prvnı́ bit jedničkový a některý dalšı́ z nich nulový, čı́tal čı́tač přiliš pomalu a je nutné mu frekvenci jemně přidat a tı́m posunout i fázi. Naopak pokud je prvnı́ bit nulový a některý dalšı́ jedničkový, znamená to, že čı́tač již překročil svoje maximum, přetekl a je nutno mu frekvenci a tı́m i fázi jemně ubrat. Tabulka 3.3: Signály VHDL bloku phase comparator Název Port Datový typ Popis clock in std logic hodiny vco in std logic vector(15..0) akumulátor oscilátoru reset in std logic reset freq imp in std logic hrana referenčnı́ho signálu lead out std logic lag out std logic indikace předbı́hánı́ fáze indikace opožd’ovánı́ fáze Obrázek 3.6: Blok komparátoru fáze 3.2.1.4 Volně běžı́cı́ čı́tač Jak již bylo popsáno na začátku této podkapitoly, toto je blok generujı́cı́ výstupnı́ signál. Funguje tı́m způsobem, že při signálu fref_imp vynuluje čı́tač VCO a s každou náběžnou hranou hodin clock k němu přičte konstantu, kterou lze měnit pomocı́ vstupu lo nebo hi z komparátoru frekvence přı́padně lead a lag z komparátoru fáze. Při změně vnitřnı́ přičı́tacı́ konstanty na novou frekvenci, je nejprve nutné správně nastavit poměr frekvencı́. Proto pokud frekvence nesedı́, upravuje se konstanta pouze pomocı́ vstupu hi a lo a na vstupu lead a lag nenı́ brán zřetel. Až teprve pokud je správně nastavená konstanta tak, aby frekvence generovaného signálu odpovı́dala požadované hodnotě a blok komparátoru frekvence přestane posı́lat korekčnı́ signály, začne jednotka čı́tače brát zřetel na 3.2. JEDNOTLIVÉ BLOKY REALIZOVANÉ V FPGA 29 vstupy lead a lag řı́zené komparátorem fáze a snažı́ se pomocı́ nich jemně doladit i fázi frekvenčnı́ho signálu. Tabulka 3.4: Signály VHDL bloku counter Název Port Datový typ Popis lead in std logic indikace předbı́hánı́ fáze hi in std logic indikace vysoké frekvence lo in std logic lag in std logic indikace nı́zké frekvence indikace opožd’ovánı́ fáze reset in std logic reset clock in std logic hodiny freq imp in std logic hrana referenčnı́ho signálu vco out std logic vector(31..0) akumulátor oscilátoru locked out std logic signalizovánı́ zamknutı́ - neodokončeno Obrázek 3.7: Blok čı́tače 3.2.2 Generátor harmonických průběhů Generovánı́ harmonického signálu je řešeno pomocı́ look-up tabulky implementované jako ROM pamět’, kde je uložena jedna perioda sinusového signálu. Postupnou změnou adresy od minimálnı́ hodnoty do maximálnı́ hodnoty tak zı́skáme jednotlivé body průběhu. Použitý VHDL blok generuje i kosinusový signál. Toho je docı́leno přičtenı́m čtvrtiny rozsahu adresnı́ sběrnice (= čtvrtiny periody) k zadané adrese. Dále je možné odebı́rat KAPITOLA 3. SOFTWAROVÁ ČÁST ŘEŠENÍ 30 dalšı́ dva signály sinus_p a cosinus_p, které jsou od původnı́ch dvou posunuty o fázi definovanou pomocı́ vstupu phase. Pro tyto signály se hodnota adresy do paměti ROM zı́ská součtem vstupu adresa a phase Takto vzniklého fázového posunu lze využı́t v rekonstrukci sinusového průběhu tak, že nejprve pomocı́ sinus a cosinus navzorkovaný signál rozložı́me na složky X a Y, a poté rekonstruujeme pomocı́ sinus_p a cosinus_p. Výsledný signál bude sinusového průběhu, avšak oproti původnı́mu posunut o úhel definovaný pomocı́ phase. To je vhodné pro kompenzaci fázového posunu vzniklého zpožděnı́m při vzorkovánı́ a zpracovánı́ signál v hradlovém poli. Tabulka 3.5: Signály VHDL bloku sinus rom Název Port Datový typ Popis address in std logic vector(11..0) adresa LUT tabulky phase1 in std logic vector(11..0) 1. fázový posun phase2 in std logic vector(11..0) 2. fázový posun clk in std logic sinus out std logic vector(15..0) sinus cosinus out std logic vector(15..0) cosinus sinus p1 out std logic vector(15..0) sinus s 1. fázovým posunem hodiny cosinus p1 out std logic vector(15..0) cosinus s 1. fázovým posunem sinus p2 std logic vector(15..0) sinus s 2. fázovým posunem out cosinus p2 ut std logic vector(15..0) cosinus s 2. fázovým posunem Obrázek 3.8: Blok generátoru harmonických průběhů 3.2. JEDNOTLIVÉ BLOKY REALIZOVANÉ V FPGA 31 Tabulka 3.6: Parametry generátoru harmonických signálů 3.2.3 Parametr Hodnota Počet vzorků sinusového průběhu 4096 Šı́řka vzorku 14 b Taktovacı́ frekvence 60 MHz Rozsah akumulátoru 32 b Frekvenčnı́ rozlišenı́ 14 mHz Násobička Hradlové pole Cyclone III v sobě obsahuje až 288 vyhrazený bloků určený pro rychlé násobenı́ signálů (počet těchto bloků se lišı́ s verzı́ čipu). Každý blok je možné použı́t jako jednu násobičku 18 b × 18 b nebo jako dvě násobičky 9 b × 9 b. Ty bloky byly také použity pro násobenı́ navzorkovaného signálu, kdykoliv to bylo potřeba, při jeho zpracovávánı́. Oproti násobičce vytvořené pomocı́ obecných logických elementů jsou rychlejšı́ a zabı́rajı́ méně mı́sta na hradlovém poli. Tabulka 3.7: Signály VHDL bloku mult Název Port Datový typ Popis dataa in std logic vector(13..0) 1. operand datab in std logic vector(13..0) 2. operand result out std logic vector(13..0) výsledek součinu Obrázek 3.9: Násobička Podoba násobičky, tak jak jı́ zobrazuje program Quartus II ve svém grafickém návrhovém rozhranı́ je na obr. 3.9 KAPITOLA 3. SOFTWAROVÁ ČÁST ŘEŠENÍ 32 3.2.4 Čı́slicová dolnı́ propust Násobenı́m dvou harmonických signálů vzniknou opět dva harmonické signály, jeden o frekvenci odpovı́dajı́cı́ součtu frekvencı́ původnı́ch signálů a druhý o frekvenci odpovı́dajı́cı́ rozdı́lu frekvence původnı́ch signálů. V našem přı́padě násobenı́ dvou signálu o téměř stejné frekvenci vznikne téměř stejnosměrná hodnota a harmonický signál o dvojnásobné frekvenci. Právě tento harmonický signál však potřebujeme odstranit. Pokud bychom vzorkovali frekvencı́ 50 MHz a dolnı́ propustı́ chtěli zadržet signály většı́ než 1 kHz, a pokud bychom tuto dolnı́ propust chtěli realizovat pomocı́ FIR filtru, museli bychom navrhnout filtr řádu 50000. A tento filtr by svůj výstup přepočı́taval v každé periodě vzorkovánı́. Vytvořenı́ takovéhoto filtru by byl poměrně dost náročný úkol. Protože však nepožadujeme takto rychlou změnu výstupu filtru, můžeme signál decimovat a dále zpracovat na výrazně nižšı́ frekvenci. Aby nedocházelo k antialiasingu je nutné před samotným decimovánı́m (tj. výběrem každého n-tého vzorku) zařadit dolnı́ propust. Pokud bychom se to rozhodli implementovat samostatnou dolnı́ propustı́, radikálně bychom si od předchozı́ho přı́padu nepomohli. Naštěstı́ existuje struktura CIC filtru, která v sobě kombinuje decimátor a klouzavý průměr. Použitı́ CIC filtru je v našem přı́padě velmi výhodné. Funkce CIC filtru je srozumitelně vysvětlená v článku Understanding cascaded integratorcomb filters [15]. Na obr. 3.10 jsou různé realizace plovoucı́ho filtru. Prvnı́ je obvyklá struktura, kdy si pamatuji hodnotu vstupnı́ch dat. Jednotlivé hodnoty sečtu a vydělı́m jejich počtem. V přı́padě rekurzivnı́ varianty využiji blok integrátoru, ve kterém si pamatuji předchozı́ výstupnı́ hodnotu a k té pravidelně přičı́tám hodnotu vstupnı́. Nesčı́tám všechny prvky uložené v paměti, ale pamět’ využı́vám k tomu, abych mohl čı́slo přičtené do integrátoru po n krocı́cho opět z integrátoru odečı́st. Výhodou této struktury je nižšı́ počet sčı́tánı́ (při délce filtru > 2), jejı́ nevýhodou je přı́tomnost rekurzivnı́ho bloku integrátoru. Třetı́ varianta je struktura použı́vaná v CIC filtrech. Na rozdı́l od předchozı́ch postrádá dělı́cı́ prvek. V přı́padě že se jedná o lineárnı́, časově invariantnı́ systémy (a to se v našem přı́padě při vyloučenı́ věcı́ jako saturace apod. jedná) je možné aplikovat pravidla superpozice a jednotlivé bloky v struktuře přeuspořádat. Pokud chceme decimovat nějaký signál, realizujeme to tak, že vybereme každý n-tý vzorek. Tı́m dostaneme signál s n-krát nižšı́ vzorkovacı́ frekvencı́. Pokud však ve spektru signálu bude harmonický průběh s takovou frekvencı́, že po decimaci pro něj nebude splněn vzorkovacı́ teorém, dojde k jeho aliasingu na nižšı́ frekvenci. Abychom tomu 3.2. JEDNOTLIVÉ BLOKY REALIZOVANÉ V FPGA 33 Obrázek 3.10: Různé formy plovoucı́ho průměru (převzato z [15]) Obrázek 3.11: Jednoduché použitı́ filtru při decimaci (převzato z [15]) zabránili, vložı́me před samotný decimátor dolnı́ propust, která signály, pro které by mohlo platit nesplněnı́ vzorkovacı́ho teorému, silně potlačı́. Jednoduchý přı́pad, kdy je k tomu použit blok CIC filtru z minulého obrázku je na obr. 3.11. Je zde pouze přehozeno pořadı́ bloků (superpozice nám to umožňuje a v dalšı́ch krocı́ch to bude výhodné pro zjednodušenı́ struktury). Amplituda přenosu klouzavého průměru odpovı́dá funkci sin(x)/x. Pro nı́ jsou charakteristické laloky, kde prvnı́ vedlejšı́ lalok má oproti hlavnı́mu útlum 13 dB. To může být pro mnoho aplikacı́ nedostatečné. Proto se skládá vyššı́ množstvı́ filtrů za sebe a vytvářı́ se tı́m filtr vyššı́ho řádu. Jedna taková realizace je na obr. 3.12 v části A. V části B je zobrazena amplitudová frekvenčnı́ charakteristika pro decimaci 8 x. V předchozı́ch realizacı́ch byl blok decimace umı́stěn vždy až na konci. Na obrázku obr. 3.13 je však umı́stěn ihned za integrátorem, ještě před derivátorem. V předchozı́m přı́padě si derivátor pamatoval D poslednı́ch vstupů a každý z nich využil pro výpočet 34 KAPITOLA 3. SOFTWAROVÁ ČÁST ŘEŠENÍ Obrázek 3.12: CIC filtr vyššı́ho řádu (převzato z [15]) výsledku. Z tohoto výsledku však decimátor na svůj výstup přenesl pouze každý R-tý vstup. V tomto přı́padě však jde na derivátor R-krát méně vstupů a proto stačı́ počı́tat derivaci(diferenci) pouze přes N = D/R vstupů. Obvykle se počı́tá klouzavý průměr přes tolik vzorků, kolikrát se decimuje (N = 1). Bylo popsáno[16], že rozsah integrátoru je nutné zvětšit minimálně o log2 (N · R) bitů, oproti jeho vstupu (N je řád derivátoru umı́stěného za decimátor a R je stupeň decimace). Pro filtr 6. řádu je tedy nutné, aby poslednı́ integrátor měl rozsah o 6 log2 (N R) bitů většı́ než je vstup do CIC filtru. Při tomto zvětšeném rozsahu sice může dojı́t k přetečenı́ Obrázek 3.13: Optimalizovaná verze CIC filtru (převzato z [15]) 3.2. JEDNOTLIVÉ BLOKY REALIZOVANÉ V FPGA 35 jednoho konkrétnı́ho integrátoru, ale pokud použı́váme znaménková čı́sla v dvojkovém doplňku, neovlivnı́ to výstup spočtený pomocı́ derivátorů. Tı́mto způsobem jsme schopni významně snı́žit frekvenci signálu a realizace přı́padné dalšı́ dolnı́ propusti, za použitı́ sekvenčnı́ struktury, bude již podstatně méně náročná na prvky hradlového pole. Pro uchovánı́ mezihodnot výpočtu lze s výhodou použit blokové paměti umı́stěné na hradlovém poli a výpočet filtru provádět sekvenčně v několika málo připojených jednotkách. Pro použitı́ v této práci byla dostačujı́cı́ realizace jednostupňové decimačnı́ jednotky na výše popsaných principech bez využitı́ blokové paměti. Vzhled bloku v grafickém návrhovém prostředı́ je zobrazen na obr. 3.14. U tohoto bloku byly v deklaraci použity obecné proměnné typu integer STAGES a DECIMATION, pomocı́ kterých lze definovat řád filtru a stupeň decimace. Dı́ky tomu bylo možné s nastavenı́m filtru experimentovat a zvolit vhodný kompromis mezi stupněm filtru, řádem decimace a výsledným využitı́m hradlového pole. Pro stupeň decimace výrazně vyššı́ než 100 000 by bylo nutné rozdělit výpočet do vı́ce bloků, kde by prvnı́ blok decimovala pouze o několik řádů a dalšı́, jeden nebo vı́ce bloků, by již své výpočty prováděly serializovaně. To však pro tuto práci nebylo potřeba. Tabulka 3.8: Signály VHDL bloku cic decimator 3.2.5 Název Port Datový typ stages parameter generic integer Popis řád filtru decimation parameter generic integer stupeň decimace clk in std logic hodiny reset in std logic reset input in std logic vector(13..0) vstup output out std logic vector(13..0) výstup Regulátor korekčnı́ho signálu Připojenı́m vstupů a výstupů kompenzačnı́ jednotky do měřicı́ho obvodu vytvořı́me zpětnovazebnı́ obvod, který se snažı́ minimalizovat vstupnı́ napětı́ kompenzačnı́ jednotky. Pokud bychom do cesty signálu v kompenzačnı́ jednotce dále nevkládaly žádný prvek regulátoru, obvod by se dı́ky zapojeným zesilovacı́m prvkům choval stejně jako by obsahoval regulátor typu P. Pro dosaženı́ nulové regulačnı́ odchylky, je však vhodné, aby KAPITOLA 3. SOFTWAROVÁ ČÁST ŘEŠENÍ 36 Obrázek 3.14: Blok CIC decimátoru regulátor obsahoval i integračnı́ složku I. Proto byl za dolnı́ propust zařazen blok zobrazený na obr. 3.15. Ten funguje jako 32-bitový čı́tač u kterého nastává saturace v přı́padě, kdy by mělo dojı́t k přetečnı́. Tabulka 3.9: Signály VHDL bloku integrator counter Název Port Datový typ Popis clk in std logic hodiny reset in std logic reset disable in std logic přemostěnı́ výstupu chanel1 i in std logic vector(13..0) vstup 1. kanálu channel2 i in std logic vector(13..0) vstup 2. kanálu channel1 i out std logic vector(13..0) výstup 1. kanálu chanell2 i std logic vector(13..0) výstup 2. kanálu out Takto vytvořený regulátor sice nenı́ z hlediska teorie řı́zenı́ přı́liš sofistikovaný, pro toto použitı́ je však dostatečný. Dominantnı́ podı́l integračnı́ složky a ani jejı́ delšı́ časová konstanta nenı́ na škodu. Spı́še naopak, protože zabraňuje rychlému přeladěnı́ obvodu v přı́padě nějakého rušivého impulzu na vstupu. 3.2.6 Regulátor fázového posunu Již bylo zmı́něno, že zpracovávánı́m vstupnı́ho signálu docházı́ k jeho fázovému posunu na výstupu. A protože se snažı́me snı́maný signál kompenzovat tak, aby byl nulový, je nutné, aby výstupnı́ kompenzačnı́ signál měl opačnou fázi. K tomu byl vytvořen blok phase_shifter zobrazený na obr. 3.16. 3.2. JEDNOTLIVÉ BLOKY REALIZOVANÉ V FPGA 37 Obrázek 3.15: Blok regulace amplitudy korekčnı́ho signálu Poté co je jeho činnost spuštěna krátkým impulzem na vstupu run, postupně měnı́ hodnotu svého výstupu phase a tı́m i fázový posuv rekonstruovaného průběhu. Na vstupy input_a a input_b je přivedený vstupnı́ signál rozložený do složek X a Y. Tento blok při každé změně fáze počı́tá modul vstupnı́ho signálu a poté, co projede celý rozsah fázového posunu, zvolı́ ten posun, při kterém byl modul vstupnı́ho signálu nejmenšı́. Tı́m zároveň docı́lı́me toho, že výstupnı́ průběh bude v protifázi se vstupnı́m průběhem a tı́m i maximálnı́ho potlačenı́ vstupnı́ho signálu. V rámci této práce byl nejprve realizován trochu jiný blok, který měl splňovat tuto úlohu. Ten také měl na vstupu složky X a Y snı́maného signálu a z nich počı́tal modul, ale nedělal to pro každý možný fázový posuv. Fungoval tak, že provedl drobnou změnu fáze a následně sledoval, jestli došlo k zmenšenı́ modulu vstupnı́ho signálu nebo k jeho zvětšenı́. V přı́padě že došlo k zmenšenı́, pokračoval ve změně fáze stejným směrem. V přı́padě, že došlo k zvětšenı́, změnil směr, kterým měnil fázi. Tento přı́stup však vykazoval jakési chvěnı́ ve změně fáze, a proto nakonec nebyl použit. I použitý způsob se může někdy dı́ky chybné heuristice zachytit na fázovém posunu, který nenı́ optimálnı́. Proto byla doplněna možnost tento fázový posun donastavit ručně pomocı́ počı́tače, USB portu a signálů phase_up a phase_down. 3.2.7 Řı́zenı́ zesı́lenı́ vstupnı́ch předzesilovačů Jak již bylo popsáné výše, nastavenı́ zesı́lenı́ vstupnı́ho předzesilovače má na starosti logika hradlového pole. K tomuto úkolu byl stvořen blok gain_control zobrazený na obr. 3.17. Na jeho vstupu definuji pomocı́ sběrnice gain1 respektive gain2 zesı́lenı́ daného kanálu. Po potvrzenı́ volby signálem wr blok přepne multiplexer ADG1408 na správný KAPITOLA 3. SOFTWAROVÁ ČÁST ŘEŠENÍ 38 Tabulka 3.10: Signály VHDL bloku phase shifter Název Port Datový typ Popis clk in std logic hodiny input a in std logic vector(13..0) vstup složky X input b in std logic vector(13..0) vstup složky Y reset in std logic reset run in std logic spuštěnı́ laděnı́ fáze phase up in std logic ručnı́ posuv fáze phase down in std logic ručnı́ posuv fáze phase std logic vector(17..0) fázový posun out Obrázek 3.16: Blok řı́dı́cı́ posun fáze výstupnı́ho signálu vstup a vypne nepoužité operačnı́ zesilovače pomocı́ analogového spı́nače ADG1414. Na obr. 3.17 je patrné, že signály pro multiplexer jsou vyvedeny jak pro prvnı́, tak pro druhý kanál. Zatı́mco signály nsync, din a sclk určené pro polovodičový spı́nač nemajı́ označenı́ kanálu, pro který jsou určeny. Je to proto, že tyto signály spolu tvořı́ sběrnici kompatibilnı́ se standartem SPI. Dı́ky tomu je možné po sběrnici nejprve poslat 8 bitů určených pro druhý spı́nač. Ty jsou postupně zachytávány v záchytném registru prvnı́ho spı́nače a jak posı́láme dalšı́ch 8 bitů pro prvnı́ spı́nač dojde k jejichy vyrolovánı́ na výstup záchytného registru, který je připojen na vstup druhého spı́nače. Tı́mto způsobem je možné odeslat informace o požadovaném stavu spı́nače za sebou a nenı́ nutné k tomu vyvádět z hradlového pole dalšı́ vodiče. 3.2. JEDNOTLIVÉ BLOKY REALIZOVANÉ V FPGA 39 Tabulka 3.11: Signály VHDL bloku gain control 3.2.8 Název Port Datový typ Popis gain1 in std logic vector(2..0) zesı́lenı́ 1. kanálu gain2 in std logic vector(2..0) zesı́lenı́ 2. kanálu wr in std logic zápis zesı́lenı́ clk in std logic hodiny reset in std logic reset ch1 out std logic vector(2..0) volba stavu 1. multiplexeru ch1en out std logic ch2a out std logic vector(2..0) volba stavu 2. multiplexeru ch2en out std logic sepnutı́ 2. multiplexeru nsync out std logic aktivačnı́ signál SPI din out std logic SPI data sclk out std logic SPI hodiny sepnutı́ 1. multiplexeru Zpracovánı́ sériové komunikace V předchozı́ch částech bylo uvedeno, že pro komunikaci přı́pravku s počı́tačem, byl použit USB port. Ten je pomocı́ obvodu FT232R převeden na jednoduchou asynchronnı́ sériovou komunikaci, kterou už dále obsluhuje logika v hradlovém poli. Proto tuto obsluhu byly vytvořeny dva bloky zobrazeny na obr. 3.19. Jejich funkcı́ je převod sériových dat na paralelnı́ pro přı́jem dat a převod paralelnı́ch dat na sériové pro vysı́lánı́ dat. V modulech byly některé hodnoty specifikovány jako proměnné a dı́ky tomu, je před překladem možné zvolit počet datových bitů a rychlost přenosu. Paralelnı́ osmibitové slova již lze zpracovat blokem na obr. 3.20. Ten testuje přijatá data, jestli neodpovı́dajı́ znaku kterému je přiřazena nějaká funkce, a pokud ano, tak tuto funkci provede. Proto z tohoto bloku vystupuje většı́ množstvı́ řı́dı́cı́ch signálů.Ty jsou určeny napřı́klad pro změnu zesı́lenı́, fáze, nebo pro vypnutı́ použitých regulátorů. Výhodou řešenı́ v podobě takovéhoto bloku je možnost jeho jednoduché implementace v hradlovém poli. Pokud bychom však chtěli implementovat protokol, kde by se přı́kazy skládaly z ASCII řetězců, na které by hradlové pole opět odpovı́dalo pomocı́ ASCII řetězců, byl by tuto úlohu řešı́cı́ stavový automat v jazyku VHDL velmi složitý. Proto by bylo výhodné pro tuto činnost na hradlovém poli syntetizovat jednoduchý procesor, který by se pro tuto činnost naprogramoval. KAPITOLA 3. SOFTWAROVÁ ČÁST ŘEŠENÍ 40 Tabulka 3.12: Signály VHDL bloku uart rx Název Port Datový typ data bits parameter generic integer Popis počet datový bitů uart baud rate parameter generic integer rychlost taget mclk parameter generic integer frekvence hodin clock in std logic hodiny reset in std logic reset rxd in std logic seriový vstup data out std logic vector(data bits-1..0) výstupnı́ slovo send out std logic přijetı́ slova fe out std logic chyba komunikace Tabulka 3.13: Signály VHDL bloku uart tx Název Port Datový typ data bits parameter generic integer Popis počet datový bitů uart baud rate parameter generic integer rychlost taget mclk parameter generic integer frekvence hodin clock in std logic hodiny reset in std logic reset data in std logic vector(data bits-1..0) vstupnı́ slovo send in std logic spuštěnı́ odesı́lánı́ ready out std logic signalizace odeslánı́ txd out std logic sériový výstup 3.2. JEDNOTLIVÉ BLOKY REALIZOVANÉ V FPGA Obrázek 3.17: Blok řı́dı́cı́ zesı́lenı́ předzesilovače Obrázek 3.18: Blok převodu sériového formátu dat na paralelnı́ Obrázek 3.19: Blok převodu paralelnı́ho formátu dat na sériové 41 KAPITOLA 3. SOFTWAROVÁ ČÁST ŘEŠENÍ 42 Tabulka 3.14: Signály VHDL bloku command decoder Název Port Datový typ Popis clk in std logic hodiny reset in std logic reset data in std logic vector(7..0) vstupnı́ byte data en in std logic channel1 o out std logic vector(2..0) zesı́lenı́ 1. kanálu channel2 o out std logic vector(2..0) zesı́lenı́ 2. kanálu gain en out std logic zápis zesı́lenı́ tune phase out std logic laděnı́ posuvu fáze ppl disable out std logic vypnutı́ PPL ac disable out std logic přemostěnı́ bloku AC phase1 up out std logic ručnı́ posuv fáze 1. kanálu phase1 down out std logic ručnı́ posuv fáze 1. kanálu phase2 up out std logic ručnı́ posuv fáze 2. kanálu phase2 down out std logic ručnı́ posuv fáze 2. kanálu zpracovánı́ vstupu Obrázek 3.20: Blok převodu sériového formátu dat na paralelnı́ a obráceně Kapitola 4 Způsob použitı́ realizovaného hardwaru 4.1 Popis realizované jednotky Na obr. 4.1 je realizovaná jednotka zobrazena při testovánı́. V levé části je zelená deska plošného spoje navrhovaná v rámci této diplomové práce. Vpravo je modrá deska vývojového kitu hradlového pole. Obě desky jsou propojeny modrým HSMC kabelem. Obrázek 4.1: Hradlové pole propojené s přı́davnou deskou při testovánı́ 43 44 KAPITOLA 4. ZPŮSOB POUŽITÍ REALIZOVANÉHO HARDWARU Obrázek 4.2: Konektory na přı́davné desce desce Na obr. 4.2 je podrobněji zobrazená navrhovaná deska s označenı́m jedlivých konektorů. BNC konektory A a B sloužı́ pro vstup signálu prvnı́ho a druhého kanálu. BNC konektor C je určen pro vstup TTL obdélnı́ku referenčnı́ho synchronizačnı́ho signálu generátoru. K svorkovnice D se připojuje externı́ symetrický zdroj napětı́ 7-12 V. Je to určeno předevšı́m pro připojenı́ bateriı́. Konektory E jsou učeny pro symetrický výstup druhého kanálu. Živý vodič je připojen na střed konektoru a stı́nenı́ nenı́ propojeno s žádnou jinou zemı́ na desce, pouze se stı́něnı́m druhého konektoru ve stejném kanálu. Konektory F jsou určeny pro symetrický výstup prvnı́ho kanálu se stejnými vlastnostmi jako konektory E. MiniUSB konektor spolu s obvodem FT232 je označen pı́smenem G a je určen pro propojenı́ jednotky s počı́tačem. Konektor označený jako H je HSMC konektor, kterým se celá tato deska připojuje k desce hradlového pole. Dalšı́ pı́smena jsou použity pro označenı́ jednotlivých částı́. Pı́smeno I patřı́ budičám sběrnice HSMC. A/D(nahoře) a D/A(dole) převodnı́ky jsou v rámečku označeném J. Dále jsou označeny bloky s předzesilovači. Zvláště blok K pro prvnı́ kanál a blok L pro 4.2. CELKOVÉ USPOŘÁDÁNÍ MĚŘICÍHO SYSTÉMU 45 druhý kanál. V bloku M je napájecı́ část. 4.2 Celkové uspořádánı́ měřicı́ho systému Zapojenı́ kompenzačnı́ jednotky KU do měřicı́ho obvodu je znázorněno na obr. 4.3. Jedná se o upravenou metodu třı́ voltmetrů popsanou v úvodnı́ kapitole. Protože kompenzačnı́ jednotka neobsahuje sama o sobě dostatečně výkonné výstupnı́ zesilovače, je nutné je před zavedenı́m korekčnı́ho napětı́ do měřicı́ho obvodu doplnit. Pro otestovánı́ funkčnosti byly použity operačnı́ zesilovače OPA 551[17] s transformátorem pro impedančnı́ přizpůsobenı́ a galvanické oddělenı́ výstupnı́ho napětı́. Obrázek 4.3: Připojenı́ kompenzačnı́ jednotky k měřenému obvodu KAPITOLA 4. ZPŮSOB POUŽITÍ REALIZOVANÉHO HARDWARU 46 4.3 Popis ovládánı́ jednotky Dı́ky malému počtu ovládacı́ch prvků na desce hradlového pole, je nutné kompenzačnı́ jednotku ovládat pomocı́ počı́tače. Po propojenı́ jednotky s počı́tačem dojde v počı́tači k detekci obvodu FT232 a vytvořenı́ rozhranı́ virtuálnı́ho sériového portu. Pro komunikaci s jednotkou je možné použı́t jakýkoliv program fungujı́cı́ jako emulátor sériového terminálu, včetně programu Hyperterminál, dodávaného s některými verzemi OS Windows. Data přicházejı́cı́ z počı́tače jsou očekávána v jedné konkrétnı́ podobě. Proto je nutné nastavit komunikaci sériového portu na režim 115200 8N1 To znamená bitovou rychlost 115200 kb/s, 8 datových bitů, žádný paritnı́ bit a jeden stop bit. Po nastavenı́ režimu sériové linky je již možné zadávat do terminálu přı́kazy. Každému přı́kazu odpovı́dá jedno pı́smeno. Pokud tedy stiskneme přı́slušnou klávesu, běl by být daný znak odeslán do kompenzačnı́ jednotky, která na něj neprodleně zareaguje. U některých typů terminálu dojde k odeslánı́ napsaných znaků až v okamžiku stisknutı́ klávesy Enter. V takovém přı́padě je ke stisku dané klávesy ještě nutné přidat jejı́ odeslánı́ klávesou Enter. Přı́pravkem bude tento stisk Enteru přijat jako znak nového řádku, kterému nenı́ přiřazena žádná funkce, a jako všechny takovéto znaky bude ignorován. Tabulka 4.1: Seznam přı́kazů Přı́kaz Popis a zmenšenı́ zesı́lenı́ 1. kanálu A zvětšenı́ zesı́lenı́ 1. kanálu s zvětšenı́ zesı́lenı́ 2. kanálu S zvětšenı́ zesı́lenı́ 2. kanálu r laděnı́ fázového posuvu 1. kanálu t laděnı́ fázového posuvu 2. kanálu v snı́ženı́ fázového posuvu 1. kanálu b zvýšenı́ fázového posuvu 1. kanálu n snı́ženı́ fázového posuvu 2. kanálu m zvýšenı́ fázového posuvu 2. kanálu p vypnutı́ fázového závěsu P zapnutı́ fázového závěsu Po resetu jsou oba vstupy jednotky odpojen od A/D převodnı́ku a zesı́lenı́ nastavené do stupně 0. Stiskem velkého pı́smene ’A’ dojde ke zvětšenı́ zesı́lenı́ prvnı́ho kanálu o je- 4.3. POPIS OVLÁDÁNÍ JEDNOTKY 47 den stupeň. Malé pı́smeno ’a’ funguje zase pro snı́ženı́ zesı́lenı́ kanálu. Pro druhý kanál jsou ke stejnému účelu určeny pı́smena ’S’ a ’s’. Takto je možné měnit zesı́lenı́ vstupnı́ho předzesilovače až do stupně 6. Po nastavenı́ dostatečného zesı́lenı́ předzesilovače je vhodné nastavit správný fázový posuv výstupnı́ho signálu. K tomu sloužı́ pı́smeno ’r’ pro prvnı́ kanál a pı́smeno ’t’ pro druhý kanál. Po jejich stisku dojde k proladěnı́ celého rozsahu 0-360◦ a zvolenı́ posuvu, kterému odpovı́dá nejnižšı́ hodnota vstupnı́ho napětı́ (signály jsou v protifázi a jejich rozdı́l je minimálnı́). Pokud by nám fázový posun tı́mto způsobem zvolený nevyhovoval, je ho možné ještě donastavit ručně. K tomu sloužı́ klávesy ’v’ a ’b’ pro prvnı́ kanál a klávesy ’n’ a ’m’ pro druhý kanál. Při správně zvoleném fázovém posuvu dojde k výraznému zmenšenı́ kompenzovaného napětı́ a tı́m klesne i vstupnı́ napětı́ kompenzačnı́ jednotky. Proto bývá obvykle výhodné zvětšit zesı́lenı́ vstupnı́ho předzesilovače ještě o jeden stupeň. Pro ladı́cı́ účely byly ještě přidány přı́kazy ’p’ a ’P’ určené pro vypnutı́ a zapnutı́ obvodu fázového závěsu. 48 KAPITOLA 4. ZPŮSOB POUŽITÍ REALIZOVANÉHO HARDWARU Kapitola 5 Závěr V práci byly dodrženy všechny hlavnı́ body zadánı́. Návrh, realizace a ověřenı́ funkce kompenzačnı́ jednotky. Při ověřovánı́ funkčnosti jednotky, se podařilo snı́žit napětı́ o frekvenci 1 MHz z původnı́ hodnoty 10 mV bez kompenzace na hodnotu 5 μV. Tedy vı́ce než o tři řády. Lze měřit i při nižšı́ frekvenci napětı́. Hodnota 100 kHz funguje bez problému a pro hodnoty 10 kHz nebo 1k Hz by stačilo upravit konstanty vnitřnı́ho dolnopropustnı́ho filtru, přı́padně taktovat celou čı́slicovou část nižšı́ frekvencı́. Přı́ hodnotě 10 MHz je již na průběhu znát pouhých 6 vzorků na periodu a proto tato frekvenci už nenı́ vhodná pro měřenı́. Přı́pravek tedy výrazně potlačuje zbytkové napětı́ a funguje v poměrně rozsáhlém frekvenčnı́m pásmu. Lze tedy prohlásit, že zadánı́ bylo plně splněno. Přesto obsahuje celý návrh relativně velké množstvı́ nedostatků. Zaměřı́me-li se na vyráběný plošný spoj, vzniklo na něm v průběhu návrhu několik chyb. Ty byly opraveny, přı́padně je na ně alespoň upozorněno v materiálech na přiloženém CD. Problém je velké ztrátové teplo na spojitých stabilizátorech. Pokud analogovou větvı́ s výstupnı́m napětı́m 3,3 V protéká proud 0,5 A, je při vstupnı́m napětı́ 12 V nutné vyzářit tepelný výkon kolem 5 W. A pokud bychom zároveň chtěli, aby se obvody přı́liš nezahřı́vali (teplota < 60◦ C), museli bychom tento stabilizátor vybavit masivnı́m chladičem. To se alespoň při prvnı́m návrhu desky nepodařilo. Jednou z možnostı́ řešenı́ by bylo použı́t impulznı́ stabilizátory napětı́ (měniče). U nich však může být problém s rušenı́m zesilovaného a převáděného signálu. Proto by nejprve bylo nutné toto řešenı́ velmi podrobně promyslet a ověřit. Alternativou by bylo přivedenı́ různých hodnot vstupnı́ho napětı́ a jejich následná stabilizace lineárnı́mi stabilizátory s ohledem na minimálnı́ vyzářený ztrátový výkon. Zde by bylo výhodné použitı́ stabilizátorů s označenı́m low drop“. ” V návrhu logiky hradlového pole přineslo velké sniženı́ využitı́ hradlového pole použitı́ CIC filtru s decimacı́. I tak zde však zůstal velký prostor pro optimalizaci. V současné 49 KAPITOLA 5. ZÁVĚR 50 době zabı́rá celá struktura na hradlovém poli kolem poloviny všech logických prvků. A největšı́m konzumentem je právě blok dolnofrekvenčnı́ propusti tvořený CIC filtrem s decimacı́. Pro jeho optimalizace by bylo dobré jeho funkčnost rozdělit do dvou stupňů. Prvnı́ stupeň by snižoval frekvenci pouze o pár řádů tak, že by druhý stupeň byl schopný provádět všechny výpočty sériově s použitı́m minimálnı́ho počtu bloků hradlového pole. Předpokládám, že tı́mto způsobem by šel vytvořit filtr, který by při stejném využitı́ hradlového pole zmenšil frekvenci signálu na desı́tky až jednotky hertzu. Pro provedenı́ optimálnı́ho návrhu tohoto členu je však nutné znát podrobně hardwarové bloky hradlového pole a znát struktury jazyka VHDL, kterými lze tyto bloky využı́t. Dalšı́m blokem, který by si ještě zasloužil optimalizace je blok řı́zenı́ posuvu fáze. Ten použı́vá velikost modulu vstupnı́ho signálu (vypočteného ze složek X a Y) jako heuristiku pro volbu optimálnı́ho fázového posunu. Bohužel tato heuristiky někdy nefunguje optimálně a zvolený fázový posuv je vı́ce či méně vzdálen od optimálnı́ hodnoty. Korekci je potom nutné provést ručně. Volně stažitelná verze Quartusu II sice obsahuje široké množstvı́ IP cores, ale velká většina z nich, je dostupná pouze v testovacı́ verzi. Funkčnost těchto verzı́ je omezena nutnostı́ připojeného počı́tače k hradlovému poli a 30 dennı́ zkušebnı́ dobou. To spolu s nestabilitou průvodců pro generovánı́ těchto bloků vedlo k tomu, že jsem byl nucen si tyto bloky napsat sám. Nejvı́ce času mi zabralo studium funkčnosti, laděnı́ a optimalizace CIC filtru s decimacı́. Ten je sice obsažen v ukázkových jádrech volně stažitelné verze programu Quartus II, ale v poslednı́ch dvou verzı́ch, které jsem vyzkoušel mi vždy průvodce pro jeho generaci selhal. Tabulka 5.1: Využitı́ hradlového pole Název Hodnota Total logic elements 6,242/24,624 (25 %) Total combinational functions 4,631/24,624 (19 %) Dedicated logic registers 5,697/24,624 (19 %) Total registers 5,697 Total pins 80/216 (37%) Total memory bits 344,064/608,256 (57 %) Embedded Multiplier 9-bit elements 24/132 (18 %) Total PLLs 1/4 (25 %) Využitı́ hradlového pole, tak jak ho vypı́še program Quartus II, je zobrazeno v ta- 51 bulce 5.1. Vidı́me, že nejvı́ce procentuálně vytı́žená je pamět’ (57 %). Největšı́ část paměti obsahuje tabulka hodnot sinusového průběhu. Jejı́ velikost bychom mohli snadno snı́žit využitı́m symetrie sinusového průběhu na čtvrtinu. Tı́m bychom zı́skali obdobné procentuálnı́ využitı́ jako v ostatnı́ch částech. Nikde v návrhu nebyly brány v potaz nějaké razantnı́ optimalizace pro velmi rychlý návrh a maximálnı́ taktovacı́ frekvence struktury je 150 MHz. To je samozřejmě pro současné použitı́ vı́ce než dostatečné. Proto by mělo být možné v přı́padné nové hardwarové revizi přesunout obvod hradlového pole na jednu desku k A/D a D/A převodnı́kům. V současné době je možné kompenzačnı́ jednotku ovládat pomocı́ počı́tače stiskem jednotlivých kláves. Avšak z jednotky nepřicházejı́ žádné zprávy potvrzujı́cı́ přijetı́ ani popisujı́cı́ jejı́ aktuálnı́ stav. Pokud bychom ji chtěli rozšı́řit o tuto funkčnost, bylo by možné na hradlovém poli implementovat jednoduchý mikroprocesor. Ten by se kromě potvrzovánı́ přijetı́ mohl starat i o dekódovánı́ přı́kazů z textu, a ne pouze pı́smen, a tak by se dal implementovat jakýkoliv složitějšı́ komunikačnı́ protokol. 52 KAPITOLA 5. ZÁVĚR Literatura [1] Jaroslav Boháček. Metrologie elektrických veličin. Vydavatelstvı́ ČVUT, 1994. [2] B.P. Kibble, G.H. Rayner. Coaxial AC bridges. Adam Hilger, Bristol, 1984. [3] L. Callegaro, V. D’Elia. Automated system for inductance realisation traceable to AC resistance with a three voltmeter method. IEEE Trans. on Instrum. and Meas., Vol.50, No.6, pp. 1630-1633, 2001. [4] L. Callegaro, V. D’Elia. Automatic compensation technigue for alternating current metrology based on synchronous filtering. Rev. Sci. Instrum., vol. 69, No. 12, pp-4238, 1998. [5] R. Sedláček. Digital Compensation Unit. In 2004 Conference on Precision Electromagnetic Measurements Digest, Piscataway: IEEE. 2004, pp. 601-605, ISBN 0-78038493-8, 2004. [6] High Speed Mezzanine Card (HSMC) Specification. http://www.altera.com/ literature/ds/hsmc_spec.pdf. [7] AD9248 Datasheet - Dual A/D Converter. http://www.analog.com/static/ imported-files/data_sheets/AD9248.pdf. [8] AD9767 Datasheet - Dual TxDAC+ Digital-to-Analog Converters. http://www. analog.com/static/imported-files/data_sheets/AD9763_9765_9767.pdf. [9] AD8066 Datasheet - High Performance FastFET Op Amps. http://www.analog. com/static/imported-files/data_sheets/AD8065_8066.pdf. [10] ADG1408 Datasheet - iCMOS Multiplexers. imported-files/data_sheets/AD9248.pdf. 53 http://www.analog.com/static/ LITERATURA 54 [11] ADG1414 Datasheet - Serially-Controlled Octal SPST Switches. http://www. analog.com/static/imported-files/data_sheets/AD9248.pdf. [12] Quartus II Web Edition Software page. http://www.altera.com/products/ software/quartus-ii/web-edition/qts-we-index.html. [13] ModelSim-Altera Software. http://www.altera.com/products/software/ quartus-ii/modelsim/qts-modelsim-index.html. [14] S. F. Nia, K. Balasubramaniam. ADPLL Implementation on FPGA. http://www. coursehero.com/file/2368864/adpll-fpga/. [15] Richard Lyons. Understanding cascaded integrator-comb filters. http://www.eetimes.com/design/signal-processing-dsp/4006446/ Understanding-cascaded-integrator-comb-filters. [16] Eugene Hogenauer. An Economical Class of Digital Filters For Decimation and Interpolation. IEEE Transactions on Acoustics, Speech and Signal Processing, Vol. ASSP-29, pp. 155-162, 1981. [17] OPA551, OPA552: High-Voltage, High-Current Operational Amplifiers. http:// www.ti.com/lit/gpn/opa551. Přı́loha A Seznam použitých symbolů a zkratek • ε0 - permitivita vakua • π - Ludolfovo čı́slo • h - Planckova konstanta • e - náboj elektronu • Rk - Klitzingova konstanta • HP, LP, HC, LC - High Potential, Low Potential, High Current, Low Current označenı́ svorek čtyřpárové impedance • ILP , UHP , U - fázory prudu a napětı́ • OZ - operačnı́ zesilovač • Vo - amlituda signálu na výstupu (output) • SFDR - Spurious-Free Dynamic Range - poměr efektivnı́ hodnoty nejsilnějšı́ho rušı́cı́ harmonické a efektivnı́ hodnoty nosné • fc - frekvence nosné (carrier) • dBc - decibel to carrier - hodnota v decibelech vzhledem k nosnému signálu • FPGA - Field-Programmable Gate Array - hradlové pole • HSMC - High Speed Mezzanine Card - popis způsobu připojenı́ přı́davné karty k vývojovému kitu, přı́padně označenı́ této karty I PŘÍLOHA A. SEZNAM POUŽITÝCH SYMBOLŮ A ZKRATEK II • VHDL - VHSIC Hardware Description Language - programovacı́ jazyk pro popis hardware • VHSIC - Very-High Speed Integrated Circuits • CIC filter - Cascaded Integrator-Comb filter - v češtině se někdy překládá jako hřebenový filtr • LUT - Look up Table - tabulka předem vypočı́taných hodnot Přı́loha B Obsah přiloženého CD K této práci je přiloženo CD, na kterém jsou uloženy zdrojové kódy. • Adresář text: zdrojové soubory této textu diplomové práce • Adresář pcb: zdrojové soubory desky plošného spoje vytvořené v programu OrCAD + vygenerované výstupy • Adresář vhdl: projekt programu Quartus II s jednotlivými VHDL bloky, testbenchy a výsledného binárnı́ho souboru určeného pro hradlové pole • Soubor readme.txt: podrobný popis obsahu CD III IV PŘÍLOHA B. OBSAH PŘILOŽENÉHO CD Přı́loha C VHDL kód popsaných bloků pos edge detect.vhd: LIBRARY ieee; USE ieee.std_logic_1164.all; use ieee.numeric_std.all; USE ieee.std_logic_unsigned.all; entity pos_edge_detect is port ( clock : in std_logic; input : in std_logic; reset : in std_logic; output : out std_logic); end pos_edge_detect; architecture behav of pos_edge_detect is signal old_input : std_logic; begin prepis: process (clock, reset) is begin if reset = ’1’ then output <= ’0’; elsif rising_edge(clock) then if input = ’1’ and old_input = ’0’ then output <= ’1’; old_input <= ’1’; else old_input <= input; output <= ’0’; end if; end if; end process prepis; end behav; freq comparator.vhd: LIBRARY ieee; USE ieee.std_logic_1164.all; use ieee.numeric_std.all; USE ieee.std_logic_unsigned.all; --TODO poctatecni hodnota a velikost promenne citac ovlivnuje rozsah hodnot entity freq_comparator is port ( clock : in std_logic; V PŘÍLOHA C. VHDL KÓD POPSANÝCH BLOKŮ VI reset : in std_logic; vco_msb : in std_logic; freq_imp: in std_logic; lo : out std_logic; hi : out std_logic); end freq_comparator; architecture behav of freq_comparator is signal vco_msb_last : std_logic; begin prepis: process (clock, reset) is variable citac : std_logic_vector(7 downto 0); begin if reset = ’1’ then citac := x"01"; lo <= ’0’; hi <= ’0’; elsif rising_edge(clock) then hi <= ’0’; lo <= ’0’; if vco_msb_last = ’0’ and vco_msb = ’1’ then citac := citac - 1; end if; if freq_imp = ’1’ then if citac /= x"00" then if citac(7) = ’1’ then hi <= ’1’; else lo <= ’1’; end if; end if; citac := x"01"; end if; vco_msb_last <= vco_msb; end if; end process prepis; end behav; phase comparator.vhd: LIBRARY ieee; USE ieee.std_logic_1164.all; use ieee.numeric_std.all; USE ieee.std_logic_unsigned.all; entity phase_comparator is port ( clock : in std_logic; vco : in std_logic_vector(15 downto 0); reset : in std_logic; freq_imp: in std_logic; lead : out std_logic; lag : out std_logic); end phase_comparator; architecture behav of phase_comparator is begin prepis: process (clock, reset) is begin if reset = ’1’ then lead <= ’0’; lag <= ’0’; elsif rising_edge(clock) then lead <= ’0’; lag <= ’0’; if freq_imp = ’1’ and vco /= x"ffff" and vco /= x"0000" then VII if vco(15) = ’1’ then lag <= ’1’; else lead <= ’1’; end if; end if; end if; end process prepis; end behav; counter.vhd: IBRARY ieee; USE ieee.std_logic_1164.all; use ieee.numeric_std.all; USE ieee.std_logic_unsigned.all; --TODO zmensit konstantu na jedna a osetrit jeji podteceni/preteceni entity counter is port ( lead : in std_logic; hi : in std_logic; lo : in std_logic; lag : in std_logic; reset : in std_logic; clock : in std_logic; fref_imp: in std_logic; disable : in std_logic; vco : out std_logic_vector(31 downto 0); locked : out std_logic); end counter; architecture behav of counter is signal konstanta : std_logic_vector(31 downto 0); signal vco_reg : std_logic_vector(31 downto 0); begin citac: process (clock, reset) is begin if reset = ’1’ then konstanta <= x"00FFFFFF"; locked <= ’0’; elsif rising_edge(clock) then --zmensit konstantu na jedna a osetrit preteceni/podteceni locked <= ’0’; if hi = ’1’ and disable = ’0’ then --frekvence je vysoka konstanta <= konstanta - x"000000FF"; elsif lo = ’1’ and disable = ’0’ then konstanta <= konstanta + x"000000FF"; elsif lead = ’1’ and disable = ’0’ then konstanta <= konstanta - x"000000FF"; elsif lag = ’1’ and disable = ’0’ then konstanta <= konstanta + x"000000FF"; else locked <= ’1’; end if; end if; end process citac; akumulator: process (clock, reset) is begin if reset = ’1’ then vco_reg <= konstanta; elsif rising_edge(clock) then if fref_imp = ’1’ and disable = ’0’ then vco_reg <= konstanta; else vco_reg <= vco_reg + konstanta; end if; VIII PŘÍLOHA C. VHDL KÓD POPSANÝCH BLOKŮ end if; end process akumulator; vco <= vco_reg; end behav; sinus rom.vhd: LIBRARY ieee; USE ieee.std_logic_1164.all; use ieee.numeric_std.all; USE ieee.std_logic_unsigned.all; USE ieee.std_logic_arith.all; entity sinus_rom is port ( adresa : in std_logic_vector(11 downto 0); phase1 : in std_logic_vector(11 downto 0); phase2 : in std_logic_vector(11 downto 0); clk : in std_logic; sinus : out std_logic_vector(15 downto 0); cosinus : out std_logic_vector(15 downto 0); sinus_p1 : out std_logic_vector(15 downto 0); cosinus_p1 : out std_logic_vector(15 downto 0); sinus_p2 : out std_logic_vector(15 downto 0); cosinus_p2 : out std_logic_vector(15 downto 0)); end sinus_rom; architecture behav of sinus_rom is -- signal sinus_o : std_logic_vector(15 downto 0); -- signal cosinus_o : std_logic_vector(15 downto 0); type lut_t is array (0 to 4095) of std_logic_vector(15 downto 0); constant MY_LUT1 : lut_t := ( x"2000", x"200d", x"2019", x"2026", x"2032", x"203f", x"204b", x"2058", x"2065", x"2071", ...a dalšı́ch mnoho řádků... x"1f37", x"1f44", x"1f50", x"1f5d", x"1f69", x"1f76", x"1f82", x"1f8f", x"1f9b", x"1fa8" ); begin process (clk) is begin if rising_edge(clk) then sinus <= MY_LUT1(conv_integer(adresa)); cosinus <= MY_LUT1(conv_integer(adresa+4095)); sinus_p1 <= MY_LUT1(conv_integer(adresa+phase1)); cosinus_p1 <= MY_LUT1(conv_integer(adresa+4095+phase1)); sinus_p2 <= MY_LUT1(conv_integer(adresa+phase2)); cosinus_p2 <= MY_LUT1(conv_integer(adresa+4095+phase2)); end if; end process; end behav; cic decimator.vhd: library ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_signed.all; use ieee.numeric_std.all; --data type conversion to_signed/unsigned USE ieee.math_real.log2; USE ieee.math_real.ceil; entity cic_decimator is generic ( STAGES : integer := 6; DECIMATION : integer := 16); IX port ( clk : in std_logic; reset : in std_logic; input : in std_logic_vector(13 downto 0); output : out std_logic_vector(13 downto 0)); end cic_decimator; architecture behav of cic_decimator is constant EXTRA_BITS : integer := INTEGER(CEIL(REAL(STAGES)*LOG2(REAL(DECIMATION)))); constant DECIMATOR_COUNTER_BITS : integer := INTEGER(CEIL(LOG2(REAL(DECIMATION)))); type t_memory is array ( natural range <> ) of std_logic_vector(EXTRA_BITS+input’high downto 0); signal memory : t_memory (STAGES*2-1 downto 0); signal tmp : t_memory (STAGES-1 downto 0); signal counter : std_logic_vector(DECIMATOR_COUNTER_BITS-1 downto 0); signal input_l : std_logic_vector(13 downto 0); begin prepis: process (clk, reset) is begin if reset = ’1’ then memory <= (others => (others => ’0’)); tmp <= (others => (others => ’0’)); output <= (others => ’0’); counter <= (others => ’0’); input_l <= (others => ’0’); elsif rising_edge(clk) then input_l <= input; memory(0) <= memory(0) + input_l; for i in 1 to STAGES-1 loop memory(i) <= memory(i) + memory(i-1); end loop; counter <= counter + 1; if counter = std_logic_vector(to_unsigned(DECIMATION-1, DECIMATOR_COUNTER_BITS)) then for i in 0 to STAGES-1 loop tmp(i) <= memory(STAGES-1+i); memory(STAGES+i) <= memory(STAGES-1+i) - tmp(i); end loop; output <= memory(STAGES*2-1)(memory(STAGES*2-1)’high downto memory(STAGES*2-1)’high-output’high); counter <= (others => ’0’); end if; end if; end process prepis; end behav; integrator counter.vhd: LIBRARY ieee; USE ieee.std_logic_1164.all; use ieee.numeric_std.all; USE ieee.std_logic_signed.all; entity integrator_counter is port ( clk : in std_logic; reset : in std_logic; disable : in std_logic; channel1_i : in std_logic_vector(13 downto 0); channel2_i : in std_logic_vector(13 downto 0); channel1_o : out std_logic_vector(13 downto 0); channel2_o : out std_logic_vector(13 downto 0)); end integrator_counter; architecture behav of integrator_counter is signal channel1_count : std_logic_vector(27 downto 0); signal channel2_count : std_logic_vector(27 downto 0); begin prepis: process (clk, reset) is variable channel1_adder : std_logic_vector(28 downto 0); PŘÍLOHA C. VHDL KÓD POPSANÝCH BLOKŮ X variable channel2_adder : std_logic_vector(28 downto 0); begin if reset = ’1’ then channel1_count <= (others => ’0’); channel2_count <= (others => ’0’); elsif rising_edge(clk) then channel1_adder := channel1_count(27)&channel1_count + channel1_i; channel2_adder := channel2_count(27)&channel2_count + channel2_i; if (channel1_adder(28) xor channel1_adder(27)) = ’1’ then --overflow detection if channel1_i(13) = ’1’ then --negative operand, minimum number channel1_adder(27 downto 0) := "1000000000000000000000000000"; else --positive operand, maximum number channel1_adder(27 downto 0) := "0111111111111111111111111111"; end if; end if; if (channel2_adder(28) xor channel2_adder(27)) = ’1’ then --overflow detection if channel2_i(13) = ’1’ then --negative operand, minimum number channel2_adder(27 downto 0) := "1000000000000000000000000000"; else --positive operand, maximum number channel2_adder(27 downto 0) := "0111111111111111111111111111"; end if; end if; channel1_count <= channel1_adder(27 downto 0); channel2_count <= channel2_adder(27 downto 0); if disable = ’1’ then channel1_o <= channel1_i; channel2_o <= channel1_i; else channel1_o <= channel1_count(27 downto 14); channel2_o <= channel2_count(27 downto 14); end if; end if; end process prepis; end behav; phase shifter.vhd: LIBRARY ieee; USE ieee.std_logic_1164.all; use ieee.numeric_std.all; USE ieee.std_logic_signed.all; entity phase_shifter is port ( clk : in std_logic; input_a : in std_logic_vector(13 downto 0); input_b : in std_logic_vector(13 downto 0); reset : in std_logic; run : in std_logic; phase_up : in std_logic; phase_down : in std_logic; square_o: out std_logic_vector(11 downto 0); phase : out std_logic_vector(11 downto 0)); end phase_shifter; architecture behav of phase_shifter is signal phase_shift : std_logic_vector(11 downto 0); signal best_shift : std_logic_vector(11 downto 0); signal square : std_logic_vector(28 downto 0); signal best_square : std_logic_vector(28 downto 0); signal counter : std_logic_vector(15 downto 0); signal dont_run : std_logic; signal best_static : std_logic_vector(43 downto 0); signal new_static : std_logic_vector(43 downto 0); begin prepis: process (clk, reset) is variable square1: std_logic_vector(27 downto 0); XI variable square2: std_logic_vector(27 downto 0); begin if reset = ’1’ then phase_shift <= (others => ’0’); best_shift <= "100000000000"; best_square <= "01111111111111111111111111111"; new_static <= (others => ’0’); best_static <= (others => ’0’); dont_run <= ’1’; counter <= (others => ’0’); square <= "01111111111111111111111111111"; elsif rising_edge(clk) then square1 := input_a*input_a; square2 := input_b*input_b; square <= square1(square1’high)&square1 + square2; new_static <= new_static + square; counter <= counter + 1; if run = ’1’ then dont_run <= ’0’; phase_shift <= (others => ’0’); new_static <= (others => ’0’); square <= "01111111111111111111111111111"; counter <= (others => ’0’); best_square <= "01111111111111111111111111111"; end if; if counter = "1111111111111111" and dont_run=’0’ then phase_shift <= phase_shift +1; new_static <= (others => ’0’); if phase_shift = 0 then best_shift <= (others => ’0’); best_square <= square; end if; if signed(best_square) > signed(square) then best_shift <= phase_shift; best_square <= square; end if; if phase_shift = 4095 then dont_run <= ’1’; phase_shift <= best_shift; end if; counter <= (others => ’0’); end if; if phase_up = ’1’ then phase_shift <= phase_shift + "000000000001"; end if; if phase_down = ’1’ then phase_shift <= phase_shift - "000000000001"; end if; end if; end process prepis; phase <= phase_shift; square_o <= best_square(best_square’high downto best_square’high - square_o’high); end behav; gain control.vhd: library ieee; USE ieee.std_logic_1164.all; use ieee.numeric_std.all; USE ieee.std_logic_unsigned.all; entity gain_control is generic ( BITRATE_COUNTER : integer := 100); port ( gain1 : in std_logic_vector(2 downto 0); gain2 : in std_logic_vector(2 downto 0); wr : in std_logic; clk : in std_logic; XII PŘÍLOHA C. VHDL KÓD POPSANÝCH BLOKŮ reset : in std_logic; ch1a : out std_logic_vector(2 downto 0); ch1en : out std_logic; ch2a : out std_logic_vector(2 downto 0); ch2en : out std_logic; nsync : out std_logic; din : out std_logic; sclk : out std_logic); end gain_control; architecture behav of gain_control is type tx_states_t is (ready, spi_tx1, spi_tx2, mux_address_tx, mux_enable); -- mohlo by zde byt i tx_parity pro vyslani paritniho bitu signal tx_state : tx_states_t; signal sync : std_logic; signal tx_br_cntr : integer range 0 to BITRATE_COUNTER; -- kolikrat ma byt pomalejsi pulperioda sclk, nez perioda clk, opakuje se to i v kodu, \\ tak by to chtelo tdat jako generic signal tx_bit_cntr : integer range 0 to 15; -- pocet datovych bitu k odeslani signal tx_data : std_logic_vector(15 downto 0); -- posuvny registr pro data k odeslani, \\ posilat data z prave strany type lut_t is array (0 to 7) of std_logic_vector(7 downto 0); constant CH1_LUT : lut_t := ("00100000", "00100001", "10001000", "11001000", "11001010", "11001110", "11011110", "00100000"); --look up tabulky podle zadratovanych dat constant CH2_LUT : lut_t := ("00100000", "00100001", "10001000", "11001000", "11001010", "11001110", "11011110", "00100000"); -- nahodou je priepinani obou kanalu stejny, ale kdyby nebylo, tak je to tu dvarkat. -- nebo to lze smazat a usetrit trochu pameti type lut_ta is array (0 to 7) of std_logic_vector(2 downto 0); constant CH1A_LUT : lut_ta := ("111", "101", "100", "011", "010", "001", "000", "111"); constant CH2A_LUT : lut_ta := ("111", "101", "100", "011", "010", "001", "000", "111"); begin vysilani: process (clk, reset) is begin if reset = ’1’ then ch1en <= ’0’; ch2en <= ’0’; ch1a <= "111"; ch2a <= "111"; sync <= ’0’; din <= ’0’; sclk <= ’1’; tx_bit_cntr <= 0; tx_state <= ready; elsif rising_edge(clk) then case tx_state is when ready => if wr = ’1’ then ch1en <= ’0’; ch2en <= ’0’; sync <= ’1’; sclk <= ’1’; din <= ’0’; tx_data(15 downto 8) <= CH1_LUT(conv_integer(gain1(2 downto 0))); tx_data(7 downto 0) <= CH2_LUT(conv_integer(gain2(2 downto 0))); tx_br_cntr <= BITRATE_COUNTER; tx_bit_cntr <= 0; tx_state <= spi_tx1; end if; when spi_tx1 => if tx_br_cntr = 0 then --sclk <= ’1’; sclk <= ’1’; din <= tx_data(tx_bit_cntr); tx_br_cntr <= BITRATE_COUNTER; XIII tx_state <= spi_tx2; else tx_br_cntr <= tx_br_cntr - 1; end if; when spi_tx2 => if tx_br_cntr = 0 then if tx_bit_cntr /= 15 then sclk <= ’0’; tx_bit_cntr <= tx_bit_cntr + 1; tx_br_cntr <= BITRATE_COUNTER; tx_state <= spi_tx1; else -- vsechny bity jiz poslany sclk <= ’0’; tx_br_cntr <= BITRATE_COUNTER; tx_state <= mux_address_tx; end if; else tx_br_cntr <= tx_br_cntr -1; end if; when mux_address_tx => if tx_br_cntr = 0 then sclk <= ’1’; din <= ’0’; ch1a <= CH1A_LUT(conv_integer(gain1(2 downto 0))); ch2a <= CH2A_LUT(conv_integer(gain2(2 downto 0))); tx_br_cntr <= BITRATE_COUNTER; tx_state <= mux_enable; else tx_br_cntr <= tx_br_cntr - 1; end if; when mux_enable => if tx_br_cntr = 0 then sync <= ’0’; ch1en <= ’1’; ch2en <= ’1’; if gain1 = "000" or gain1 = "111" then ch1en <= ’0’; end if; if gain2 = "000" or gain2 = "111" then ch2en <= ’0’; end if; tx_br_cntr <= BITRATE_COUNTER; tx_state <= ready; else tx_br_cntr <= tx_br_cntr - 1; end if; end case; end if; end process vysilani; nsync <= not sync; end behav; uart rx.vhd: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity uart_rx is generic ( -- definujeme interni DATA_BITS : integer := UART_BAUD_RATE : integer := TARGET_MCLK : integer := entitu, neni jiz potreba definovat polaritu signalu, vse je aktivni v 1 8; 115200; 50000000); PŘÍLOHA C. VHDL KÓD POPSANÝCH BLOKŮ XIV port ( clock reset data send fe rxd end uart_rx; : : : : : : in std_logic; -- hodiny in std_logic; -- interni reset aktivni v ’1’ out std_logic_vector(DATA_BITS-1 downto 0); -- prijata data out std_logic; -- priznak potvrzujici platnost vystupnich dat out std_logic; -- framing error - neplatnost prijatych dat in std_logic); -- generovany UART signal architecture rtl of uart_rx is type rx_states_t is (rx_ready, rx_start_bit, rx_receiv, rx_stop_bit); -- mohlo by zde byt i rx_parity pro prijem paritniho bitu signal rx_state : rx_states_t; signal rx_br_cntr : integer range 0 to TARGET_MCLK/UART_BAUD_RATE-1; -- pokud definujete integer, VZDY uvadejte jeho rozsah signal rx_bit_cntr : integer range 0 to DATA_BITS; -- pocet datovych bitu k odeslani signal rx_data : std_logic_vector(DATA_BITS-1 downto 0); -- posuvny registr pro prijata data signal rxd_latch : std_logic; begin prijem : process (clock, reset) is begin if reset = ’1’ then rx_state <= rx_ready; send <= ’0’; fe <= ’0’; rxd_latch <= ’0’; elsif rising_edge(clock) then rxd_latch <= rxd; case rx_state is when rx_ready => send <= ’0’; fe <= ’0’; if rxd_latch = ’0’ then rx_bit_cntr <= DATA_BITS; rx_state <= rx_start_bit; rx_br_cntr <= (TARGET_MCLK/UART_BAUD_RATE-1)/2; end if; when rx_start_bit => if rx_br_cntr = 0 then rx_state <= rx_receiv; rx_br_cntr <= TARGET_MCLK/UART_BAUD_RATE-1; else rx_br_cntr <= rx_br_cntr - 1; end if; when rx_receiv => if rx_br_cntr = 0 then if rx_bit_cntr /= 0 then rx_data(DATA_BITS - rx_bit_cntr) <= rxd_latch; rx_br_cntr <= TARGET_MCLK/UART_BAUD_RATE-1; rx_bit_cntr <= rx_bit_cntr - 1; else rx_state <= rx_stop_bit; rx_br_cntr <= TARGET_MCLK/UART_BAUD_RATE-1; end if; else rx_br_cntr <= rx_br_cntr - 1; end if; when rx_stop_bit => if rx_br_cntr = 0 then rx_state <= rx_ready; if rxd_latch = ’1’ then data <= rx_data ; send <= ’1’; else fe <= ’1’; end if; else XV rx_br_cntr <= rx_br_cntr - 1; end if; end case; end if; end process prijem; end rtl; uart tx.vhd: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity uart_tx is generic ( -- definujeme interni entitu, neni jiz potreba definovat polaritu signalu, vse je aktivni v 1 DATA_BITS : integer := 8; UART_BAUD_RATE : integer := 115200; TARGET_MCLK : integer := 50000000); port ( clock : in std_logic; -- hodiny reset : in std_logic; -- interni reset aktivni v ’1’ data : in std_logic_vector(DATA_BITS-1 downto 0); -- data k odeslani send : in std_logic; -- priznak potvrzujici platnost dat a startujici odeslani ready : out std_logic; -- priznak stavu entity ’1’ -> pripraveno vysilat txd : out std_logic); -- generovany UART signal end uart_tx; architecture rtl of uart_tx is type tx_states_t is (tx_ready, tx_send, tx_stop_bit); -- mohlo by zde byt i tx_parity pro vyslani paritniho bitu signal tx_state : tx_states_t; signal tx_br_cntr : integer range 0 to 434; signal tx_bit_cntr : integer range 0 to DATA_BITS; -- pocet datovych bitu k odeslani signal tx_data : std_logic_vector(DATA_BITS-1 downto 0); -- posuvny registr pro data k odeslani begin vysilani : process (clock, reset) is begin if reset = ’1’ then tx_state <= tx_ready; ready <= ’1’; txd <= ’1’; elsif rising_edge(clock) then case tx_state is when tx_ready => if send = ’1’ then tx_data <= data; tx_bit_cntr <= DATA_BITS; tx_state <= tx_send; tx_br_cntr <= TARGET_MCLK/UART_BAUD_RATE-1; txd <= ’0’; ready <= ’0’; end if; when tx_send => if tx_br_cntr = 0 then if tx_bit_cntr /= 0 then txd <= tx_data(DATA_BITS - tx_bit_cntr); tx_bit_cntr <= tx_bit_cntr - 1; else tx_state <= tx_stop_bit; txd <= ’1’; end if; tx_br_cntr <= TARGET_MCLK/UART_BAUD_RATE; else tx_br_cntr <= tx_br_cntr -1; end if; when tx_stop_bit => if tx_br_cntr = 0 then XVI PŘÍLOHA C. VHDL KÓD POPSANÝCH BLOKŮ tx_state <= tx_ready; ready <= ’1’; else tx_br_cntr <= tx_br_cntr -1; end if; end case; end if; end process vysilani; end rtl; command decoder.vhd: LIBRARY ieee; USE ieee.std_logic_1164.all; use ieee.numeric_std.all; USE ieee.std_logic_unsigned.all; entity command_decoder is port ( clk : in std_logic; reset : in std_logic; data : in std_logic_vector(7 downto 0); data_en : in std_logic; gain1_o : out std_logic_vector(2 downto 0); gain2_o : out std_logic_vector(2 downto 0); gain_en : out std_logic; tune_phase1: out std_logic; tune_phase2: out std_logic; ppl_disable: out std_logic; ac_disable : out std_logic; phase1_up : out std_logic; phase1_down : out std_logic; phase2_up : out std_logic; phase2_down : out std_logic); end command_decoder; architecture behav of command_decoder is signal gain1 : std_logic_vector(2 downto 0); signal gain2 : std_logic_vector(2 downto 0); begin prepis: process (clk, reset) is begin if reset = ’1’ then gain1 <= (others => ’0’); gain2 <= (others => ’0’); gain_en <= ’0’; tune_phase1 <= ’0’; tune_phase1 <= ’0’; ppl_disable <= ’0’; ac_disable <= ’1’; elsif rising_edge(clk) then gain_en <= ’0’; tune_phase1 <= ’0’; tune_phase2 <= ’0’; phase1_up <= ’0’; phase1_down <= ’0’; phase2_up <= ’0’; phase2_down <= ’0’; if data_en = ’1’ then case data is when x"61" => --a, gain1 down to_stdlogicvector() if gain1 /= 0 then gain1 <= gain1 - 1; gain_en <= ’1’; end if; when x"41" => --A, gain1 up if gain1 /= 6 then XVII gain1 <= gain1 + 1; gain_en <= ’1’; end if; when x"73" => --s, gain2 down if gain2 /= 0 then gain2 <= gain2 - 1; gain_en <= ’1’; end if; when x"53" => --S, gain2 up if gain2 /= 6 then gain2 <= gain2 + 1; gain_en <= ’1’; end if; when x"72" => --r, tune1 phase tune_phase1 <= ’1’; when x"74" => --t, tune2 phase tune_phase2 <= ’1’; when x"70" => --p, pll off ppl_disable <= ’1’; when x"50" => --P, pll on ppl_disable <= ’0’; when x"6f" => --o, amplitude regulator off ac_disable <= ’1’; when x"4f" => --O, amplitude regulator on ac_disable <= ’0’; when x"76" => --v, phase1 left phase1_down <= ’1’; when x"62" => --b, phase1 right phase1_up <= ’1’; when x"6e" => --n, phase2 left phase2_down <= ’1’; when x"6d" => --m, phase2 right phase2_up <= ’1’; when others => null; end case; end if; end if; end process prepis; gain1_o <= gain1; gain2_o <= gain2; end behav;
Podobné dokumenty
Internetové geografické zdroje
Studie o zemi a migraci lidí, rostlin a zvířata, o tom jak žijí..
http://keep3.sjfc.edu/students/jll6160/e-port/unitplan/glossary.htm
Studie o zemském povrchu; zahrnuje osobní odpovědi na topografi...
OSVĚTLENÍ, DŘEZY, BATERIE
Nosnost 15 kg
Pohybový senzor: rozsah 2 m, časové řízení 40 s
Sada obsahuje: 1 svítidlo se zářivkou T5, propojovací kabel 0,9m a
IP WatchDog2 Lite / Industrial MANUAL
OUT Clear to Send, (Receive Data)
IN Request to Send
IN Nepoužitý
IN
IN
OUT
OUT
oVirt - virtualizace datacentra aneb správa
spicevmc,id=charchannel2,name=vdagent -device virtserialport,bus=virtioserial0.0,nr=3,chardev=charchannel2,id=channel2,name=com.redhat.spice.0 -spice port=5904,tlsport=5905,addr=10.35.16.4,x509-dir...
Ческе-Будеёвице
Файл:Budvar UK.JPG Источник: http://ru.wikipedia.org/w/index.php?title=Файл:Budvar_UK.JPG Лицензия: Public Domain Редакторы: Original uploader was ML5 at en.wikipedia
Файл:Koh-i-noor 1.1.jpg Ис...
Slovíčka – Module 4A/B/C/D
film GBr / movie US
go to the movies US
good and evil
historical drama
horror movie/film
human characters
lonely
love story
musical n.
opinion; in my opinion…
plot
queue for sth v.
rent
robot
roman...
Základy práce s programem Simulink
Schopností tohoto bloku je nahrazovat vstupní signál, jehož hodnota leží
v oblasti necitlivosti, nulovou hodnotou výstupu. Oblast necitlivosti je vymezena hodnotami vepsanými do políček Start of de...
Radiová meteorická detekcn´ı stanice RMDS01A
tubusu vznikajı́cı́ho v atmosféře v těsné blı́zkosti meteoroidu. Je zřejmé, že tento jev nebude pozorovatelný naprosto vždy, nebot’ závisı́ na geometrii průletu meteoru vzhledem k
vysı́l...