DIPLOMOV´A PR´ACE Digitáln´ı kompenzacn´ı jednotka pro

Transkript

DIPLOMOV´A PR´ACE Digitáln´ı kompenzacn´ı jednotka pro
Č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

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...

Více

OSVĚTLENÍ, DŘEZY, BATERIE

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

Více

IP WatchDog2 Lite / Industrial MANUAL

IP WatchDog2 Lite / Industrial MANUAL OUT Clear to Send, (Receive Data) IN Request to Send IN Nepoužitý IN IN OUT OUT

Více

oVirt - virtualizace datacentra aneb správa

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...

Více

Ческе-Будеёвице

Ческе-Будеёвице Файл: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  Ис...

Více

Slovíčka – Module 4A/B/C/D

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...

Více

Základy práce s programem Simulink

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...

Více

Radiová meteorická detekcn´ı stanice RMDS01A

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...

Více