Implementering av FIR filter
samt CORDIC algoritm på XSA-50
Joachim Andersson
Nima Khakpour
Implementering av FIR filter
samt CORDIC algoritm på XSA-50
Examensarbete utfört i Datakommunikation
vid Linköpings Tekniska Högskola, Campus
Norrköping
Joachim Andersson
Nima Khakpour
Handledare Qin-Zhong Ye
Examinator Qin-Zhong Ye
Norrköping 2006-01-09
Rapporttyp Report category Examensarbete B-uppsats C-uppsats D-uppsats _ ________________ Språk Language Svenska/Swedish Engelska/English _ ________________ Titel Title Författare Author Sammanfattning Abstract ISBN _____________________________________________________ ISRN _________________________________________________________________
Serietitel och serienummer ISSN
Title of series, numbering ___________________________________
URL för elektronisk version
Department of Science and Technology
x
x
LITH-ITN-EX--06/001--SE
Implementering av FIR filter samt CORDIC algoritm på XSA-50
Joachim Andersson, Nima Khakpour
Denna rapport visar hur ett FIR filter kan konstrueras i språket VHDL samt implementeras på XSA-50 kortet. Det andra som tas upp är hur CORDIC algoritmen används och hur den implementeras på samma kortsystem.
Rapporten är uppställd på så sätt att den först ska ge en grundläggande inblick i de två ämnesområdena FIR respektive CORDIC. Vidare så redovisas hur projekten har utförts för de båda konstruktionerna. Det ges även en beskrivning av XSA-50 kortet.
under en längre tid från publiceringsdatum under förutsättning att inga
extra-ordinära omständigheter uppstår.
Tillgång till dokumentet innebär tillstånd för var och en att läsa, ladda ner,
skriva ut enstaka kopior för enskilt bruk och att använda det oförändrat för
ickekommersiell forskning och för undervisning. Överföring av upphovsrätten
vid en senare tidpunkt kan inte upphäva detta tillstånd. All annan användning av
dokumentet kräver upphovsmannens medgivande. För att garantera äktheten,
säkerheten och tillgängligheten finns det lösningar av teknisk och administrativ
art.
Upphovsmannens ideella rätt innefattar rätt att bli nämnd som upphovsman i
den omfattning som god sed kräver vid användning av dokumentet på ovan
beskrivna sätt samt skydd mot att dokumentet ändras eller presenteras i sådan
form eller i sådant sammanhang som är kränkande för upphovsmannens litterära
eller konstnärliga anseende eller egenart.
För ytterligare information om Linköping University Electronic Press se
förlagets hemsida
http://www.ep.liu.se/
Copyright
The publishers will keep this document online on the Internet - or its possible
replacement - for a considerable time from the date of publication barring
exceptional circumstances.
The online availability of the document implies a permanent permission for
anyone to read, to download, to print out single copies for your own use and to
use it unchanged for any non-commercial research and educational purpose.
Subsequent transfers of copyright cannot revoke this permission. All other uses
of the document are conditional on the consent of the copyright owner. The
publisher has taken technical and administrative measures to assure authenticity,
security and accessibility.
According to intellectual property law the author has the right to be
mentioned when his/her work is accessed as described above and to be protected
against infringement.
Implementering av FIR filter samt CORDIC
algoritm på XSA-50
Nima Khakpour, Joachim Andersson
Sammanfattning
Denna rapport visar hur ett FIR filter kan konstrueras i språket VHDL samt
implementeras på XSA-50 kortet. Det andra som tas upp är hur CORDIC
algoritmen används och hur den implementeras på samma kortsystem.
Rapporten är uppställd på så sätt att den först ska ge en grundläggande inblick i
de två ämnesområdena FIR respektive CORDIC. Vidare så redovisas hur
projekten har utförts för de båda konstruktionerna. Det ges även en beskrivning
av XSA-50 kortet.
Abstract
This report shows how to construct a FIR-filter in VHDL and implement it on
the XSA-50 card. The other thing that the report looks up on is how the
CORDIC-algoritm is used and how to implement it on the same cardsystem.
The report is presented in such way that it starts with a basic insight in the two
subjects FIR and CORDIC. Further on the report shows how the project was
carried out for the both constructions. There is also a section describing the
XSA-50 card.
Innehållsförteckning
1 INLEDNING...2 1.1 BAKGRUND CORDIC...2 1.2 BAKGRUND FIR ...2 1.3 SYFTE...3 1.4 METOD...3 1.5 STRUKTUR...3 2 CORDIC ...5 2.1 CORDIC-MODER ...6 2.1.1 Framåtrotation...6 2.1.2 Bakåtrotation ...72.2 BEGRÄNSNINGAR I CORDIC-ROTATION...8
3 CORDIC-ALGORITMER FÖR FPGA DESIGN...11
3.1 KONVENTIONELL KONTRA REDUNDANT ARITMETIK PÅ FPGA ...13
3.1.1 Konventionell Aritmetik på FPGA ...13
3.1.2 Adderare och Subtraherare ...13
3.1.3 Adder/Subtraktor ...14
3.2 RADIX-2REDUNDANT ARITMETIK PÅ FPGA ...14
3.3 KONVENTIONELL CORDIC PÅ FPGA ...15
3.4 REDUNDANT CORDIC PÅ FPGA ...15
3.4.1 Uppskattning av tecken ...16
3.4.2 Differential CORDIC (DCORDIC)...16
3.4.3 Pre-Computed CORDIC (P-CORDIC)...16
4 DIGITALA FILTER...18
4.2 ICKE-REKURSIVA FILTER...18
5 DESIGN AV FIR-FILTER...21
5.1 FÖNSTERMETODER...21
5.2 FREKVENSDOMÄN DESIGN...21
5.3 FALTNING...22
6 XSA-50 KRETSKORT ...27
6.1 KOPPLA KORTET TILL PC ...27
6.2 VGA MONITOR TILL XSA-50 ...27
6.3 PS/2 PORT...28 6.4 100MHZ OSCILLATOR...28 6.5 SYNKRON DRAM ...28 6.6 FLASH RAM...29 6.7 SJU-SEGMENT LED ...29 6.8 DIPSWITCHAR...30 6.9 PUSHBUTTON...30 7 PROJEKTBESKRIVNING...32
7.3.5 Filter_muls...40 7.3.6 Adder...40 7.3.7 Adder2...41 7.3.8 Store ...41 8 AVSLUTNING ...43 8.1 RESULTAT CORDIC ...43 8.2 RESULTAT FIR ...43 8.3 PROBLEM...43 8.4 DISKUSSION...44 9 TERMINOLOGI...46 10 REFERENSER ...49 BILAGOR:
Bilaga A - Källkod för FIR filter
Bilaga B – Källkod för CORDIC
Bilaga C – Manual för FIR filter
Bilaga D – Schema över FIR filter
Bilaga E – Matlabkod för CORDIC
Bilaga F – Matlabkod för HEX-fil
Bilaga G – Matlabprogram för faltning
Bilaga H – Manual för CORDIC
1
Inledning
1.1
Bakgrund CORDIC
I mitten av 1950-talet kom det ett direktiv från den amerikanska militären om
att digitalisera den analoga datordrivna navigationssystemet till B-58
bombflygplan. Det ansågs att det analoga systemet hade en alldeles för
begränsad noggrannhet. Den största svårigheten vid en övergång till ett
digitaltsystem var att kunna göra real-tids beräkningar av navigations
ekvationer för att bestämma den nuvarande positionen på ett sfärisk planet. Vid
den tiden hade det redan utvecklats digitala differentialanalysatorer som kunde
utföra fortlöpande navigations beräkningar. Men dessa system klarade inte av
att producera resultat vid flygningar nära Nordpolen, och de hade även endel
andra tillkortakommanden. Därför krävdes det ett helt nytt sätt att lösa detta
problem på.
Volder presenterade en lösning på detta problem i sin artikel [1] om COordinate
Rotation DIgital Computer det vill säga förkortningen CORDIC. Senare
vidareutvecklades CORDIC-algoritmen av bland andra John Walther [2].
Walther generaliserade CORDIC-algoritmen så att den även löste hyperboliska
och exponentialfunktioner. Tack vare algoritmens förträfflighet när det gäller
lösningar för bland annat Very Large Scale Integrated Circuit (VLSI) teknik och
Field Programmable Gate Array (FPGA) har intresset kring den vuxit starkt.
Andra områden som algoritmen har använts i är miniräknare och andra Digital
Signal Processing (DSP) objekt, så som adaptiva filter, Fast Fourier Transform
(FFT), demodulatorer, och neurala nätverk. VLSI implementationer har
diskuterats i bl.a. doktorsavhandlingar av Timmermann [5] och Hahn [6]. Den
första FPGA implementationen undersöktes av Meyer-Bäse et al. [7,8].
1.2
Bakgrund FIR
Namnet ”FIR” står för ”Finite Impulse Response” och betyder ändligt pulssvar.
Detta pulssvar kan användas för att beskriva hur ett digitalt system beter sig. Ett
pulssvar som finns på ett filters utgång kan mätas då en enhetspuls finns på
filtrets ingång.
En enhetspuls är en puls med amplituden 1 som dyker upp då funktionens
argument är noll.
1.3
Syfte
Examensarbetets syfte var att implementera ett FIR filter samt CORDIC
algoritmen på kretskortet XSA-50. Arbetet ska vidare användas i
utbildningssyfte. I rapporten presenteras en del grundläggande information om
respektive ämnesområde, detta för att ge en övergripande insyn i ämnena.
Arbetet ska resultera i manualer för de båda konstruktionerna. Dessa kan
användas som utbildningsmaterial alternativt i självstudiematerial. Manualernas
syfte är att ge steg för steg förklaring till hur man implementerar dessa
konstruktioner på XSA-50 kortet.
1.4
Metod
Först genom diskussion med kursansvarig vid institutionen togs det fram en
kravspecifikation. Kraven omfattade simulering samt implementering av FIR
filtret och CORDIC-algoritmen. Vidare skulle det framtagna resultatet
sammanställas till att användas som kursmaterial.
1.5 Struktur
Rapporten börjar med en presentation av CORDIC-algoritmen för att sedan
fortsätta med olika metoder för tillämpning av algoritmen. Därefter visas
simulationer och praktisk implementation på kortet XSA-50. Rapporten
fortsätter med en övergripande bild av FIR filter samt en generell beskrivning
av några olika filter designer. Efter detta presenteras simulering och praktisk
implementering av filtret på kortet. Slutligen bifogas ett antal bilagor
2
CORDIC
I detta kapitel beskrivs grundläggande information om CORDIC-algoritmen.
Med hjälp av en vektorrotation kan man beräkna en trigonometriskfunktion. Det
är på denna bakgrund som algoritmen har tagits fram.
CORDIC-algoritmen roterar en vektor ett antal gånger mot en antagen vinkel. Algoritmen
närmar sig genom att de iterativa rotationerna sker med successivt mindre
vinklar. Detta kallas även ibland för mikrorotationer. Algoritmen [1] är härledd
från de generella ekvationerna för vektorrotation. En vektor v(x,y) roteras med
vinkeln φ blir:
⎥
⎦
⎤
⎢
⎣
⎡
Φ
+
Φ
Φ
Φ
=
⎥
⎦
⎤
⎢
⎣
⎡
=
)
sin(
*
x
)
cos(
*
y
)
sin(
*
y
-)
cos(
*
x
´
´
´
y
x
v
(2.1)
Figuren 2.1 visar en rotation av en vektor v med vinkeln φ.
figur. 2.1 Rotation av en vektor v med vinkeln φ.
Ekvationen (2.1) kan även skrivas så att:
)]
tan(
[
)
cos(
´
=
Φ
⋅
x
−
y
Φ
x
(2.2)
)]
tan(
[
)
cos(
´
=
Φ
⋅
x
+
y
Φ
y
(2.3)
Om rotationsvinkeln begränsas så att
reduceras multiplikationen
med tangenstermen till en skiftoperation. En godtycklig rotationsvinkel uppnås
i −
±
=
Φ
)
2
tan(
]
2
[
1 i i i i i iK
y
x
d
y
+=
+
⋅
⋅
−(2.5)
där:
i i iK
2 12
1
1
)
2
cos(tan
− − −+
=
=
1
±
=
id
Om man avlägsnar konstanten från den iterativa ekvationen, så har man bara en
skift/additions algoritm för vektrorotation. Produkten av konstanten
kan
beräknas separat och sedan appliceras i systemet. När antalet iterationer går mot
oändligheten så närmar sig produkten 0.6073. Därför har rotations algoritmen
en ökning,
på ca 1.647. Den exakta ökningen beror på antalet iterationer.
i
K
nA
∏
+
−=
n i nA
1
2
2(2.6)
Vinkeln för en sammansatt rotation bestäms unikt av en serie av riktningar för
mikrorotationerna. Den totala vinkelrotationen blir:
)
2
(
tan
1 1 i i i iz
d
z
+=
−
⋅
− −(2.7)
2.1
CORDIC-MODER
CORDIC-algoritmen arbetar oftast i en av två moder. Den ena moden kallas
rotation eller framåtrotation, i detta mode så roterar en inputvektor med en
specifik vinkel, given som argument. Den andra moden kallas för
vektoriseringsmoden eller för bakåtrotation, i detta mode så roterar inputvektorn
till x-axeln undertiden så sparas vinklarna för att genomföra rotationen.
2.1.1
Framåtrotation
I framåtrotations moden initieras vinkelackumulatorn med den önskade
rotationsvinkeln. Vid varje iterations tas ett beslut så att storleken på
residualvinkeln minimeras i vinkelackumulatorn. Därav baseras varje beslut på
tecknet för residualvinkeln vid varje steg. För framåtrotation är CORDIC
ekvationen följande:
1
−
=
id
om
z
i<
0
, annars +1
1 + iz
= Residualvinkeln
iz = Tecken på rotationsvinkel
Vilket ger det här resultatet:
∏
+
−=
=
+
=
−
=
n i n n n n n nA
z
z
x
z
y
A
y
z
y
z
x
A
x
2 0 0 0 0 0 0 0 02
1
0
]
sin
cos
[
]
sin
cos
[
(2.9)
Figur 2.2 visar en iterativ framåtrotation initierad med vektor v0.
Figur 2.2 iterativ framåtrotation initierad med vektor v0
2.1.2
Bakåtrotation
I bakåtrotations moden roterar inputvektorn mot x-axeln. Resultatet från
vektoreringsoperationen är en rotationsvinkel och en skalad storlek av original
vektorn. Vektoreringsfunktionen fungerar på så sätt att den försöker minimera y
komponenten i residualvektorn vid varje rotation. Tecknet från den återstående
delen av y-komponenten används till att bestämma vilken riktning som
Där:
1
+
=
id
om
y
i<
0
, annars –1
Vilket ger det här resultatet:
∏
− −+
=
+
=
=
+
=
n i n n n n nA
x
y
z
z
y
y
x
A
x
2 0 0 1 0 2 0 2 02
1
)
(
tan
0
(2.11)
Figur 2.3 visar en Bakåtrotation initierad med vektor v0.
Figur 2.3 Bakåtrotation initierad med vektor v0
2.2
Begränsningar i CORDIC-rotation
Båda CORDIC moderna är så som de är uppgivna begränsade i rotationsvinkeln
till värden mellan -π/2 och π/2. Denna begränsning beror på att vinkeln vid den
första iterationen är
. För sammansatta rotationsvinklar större än
π/2 krävs det en extra rotation. Volder [1] beskriver initial rotationen till ±π/2.
Detta ger korrigerings iterationen:
)
2
(
tan
1 0 0 −=
Φ
d=+1 om y<0, annars –1.
Det finns ingen ökning för denna initialrotation. Ett annat alternativ är att man
kan göra en initial rotation för antingen π eller 0, och på så sätt undvika att
tilldela x och y komponenterna till roterande elementet. Det finns ingen ökning
då heller tackvare initialrotationen:
y
d
y
x
d
x
⋅
=
⋅
=
´
´
(2.13)
z´=z om d=1 eller z´=z-π om d=-1.
d=-1 om x<0, annars +1.
3
CORDIC-algoritmer för FPGA Design
I detta kapitel presenteras en större del av CORDIC-algoritmen i självstudie
syfte.
Den höga kapacitet och prestanda som FPGA, har uppnått de senaste åren, har
resulterat i en acceleration av DSPs uppgiftslösning. FPGA utrustningen har
dragit stor nytta av ” VLSI deep sub-micron technology,” för att få bl.a. högre
hastighet och kapacitet.
Tidiga FPGAs kunde inte implementera parallell CORDIC-algoritmer på grund
av begränsningar i chip storlek och möjligheten att routa hårdvaruskiftningen
[4]. Därför har många FPGA baserade DSP applikationer använt sig av en
iterativ struktur.
En nackdel med konventionell CORDIC implementationer som är baserade på
ripple-carry-adderare eller subtraherare, är den interna carry
överföringsfördröjningen. För att öka prestanda har redundant aritmetik
föreslagits. Denna aritmetik skulle då kunna rationalisera bort fördröjningen.
Dock innebär detta flera svårigheter. Det är inte möjligt att upptäcka tecknet för
en redundant siffra utan att inspektera alla siffror som måste propageras från
MSB till LSB. Eftersom alla siffror inte undersöks så finns det en chans för att
tecknet inte kan bestämmas. I ett sådant fall kan någon av siffrorna {-1, 0, 1}
väljas, detta kan i sin tur leda till icke-konstant skalfaktor eller godtycklig
rotation måste utföras. I det första fallet så måste skalfaktorn beräknas parallellt
med CORDIC iterationen, medan en fel vald rotation måste kompenseras.
Xiling FPGA har en matris struktur, där varje element av matrisen är en
Configurable Logic Block (CLB). CLB:arna är kopplade internt och omgivna
av programmerbara Input-Output Block (IOB). En CLB består av två 4-input
Look-Up Tables (LUTs), en 3-ingångs och två stycken register se figur 3.1. I
sin rapport [9] har Valls et al. undersökt FPGA implementationer av dessa
operationer både genom att använda konventionell och redundant aritmetik. Där
säger de att en jämförelse mellan olika design kan enkelt göras genom att
utvärdera den kritiska fördröjningsvägen (t.ex. genom att räkna antalet full
adderare mellan två register). Men i en FPGA design kan prestationen förändras
beroende på hur väl man utnyttjar arean. Det är inte tillräckligt att bara räkna
antal CLB som ingår därför att routingen är en viktigt komponent för
beräkningen av den totala fördröjningen. Den långa routingfördröjningen beror
på dessa faktorer enligt Valls et al. [9]:
• Det är inte möjligt att finna en optimal placering och routing
för alla problem p.g.a. begränsade resurser och fasta strukturer
av utrustningen.
• Placering och routing är automatiska eller halv-automatiska
processer.
Figur 3.1 tagen direkt ur Valls et al. [9].
I deras rapport så karakteriseras throughput av propagations fördröjningen i
kritiska vägar. Tabell 3.1 visar värden och beskrivningar av symboler som
används för att beteckna fördröjningen i den kritiska vägen. De korresponderar
till Xilings XC4000XL chips med hastighetsgraden 1.
Tabell 3.1 taget direkt ur Valls et al. [9].
3.1
Konventionell kontra Redundant Aritmetik på FPGA
Operationer som ingår i CORDIC är addition och subtraktion. I denna del av
rapporten tittar vi på en del utvalda delar av Valls et al. [9] resultat. För en
djupare inblick och mer utförligt redovisning rekommenderas läsning av hela
rapporten [9].
3.1.1
Konventionell Aritmetik på FPGA
Aktuella FPGAn tillhandahåller resurser för att effektivt kunna implementera
aritmetiska operationer.
3.1.2
Adderare och Subtraherare
Grunddelen av en konventionell adderare och subtraherare är Full Adder (FA).
En FA består av två stycken 3-ingångsfunktioner, därför kan den realiseras med
hjälp av en enda CLB. Om man använder sig av FPGA:ns resurs att generera
Carry Signal (CS), resulterar detta i en reduktion av area och en ökning i
hastighet uppnås. I detta fall kan två FAn användas i samma CLB, så en
N-bitars adderare eller subtraherare kräver N/2 CLBn. Propagationsfördröjningen
Den kritiskavägen bestäms av propagationstiden för ripple carry och
routingfördröjningen en av de minst signifikanta input av kretsen.
3.1.3
Adder/Subtraktor
En adder/subtraktor utför en addition eller subtraktion beroende på ingångsvalet
på A/S. Denna ingång indikerar om en operand är 2-komplement. Add/Sub
grundcellen består av två 4-ingångsfunktioner. Ena till att beräkna ut värdet och
den andra till att sänd carry. Enligt detta kan en N-bitars Add/Sub få plats i
(N+1)/2 CLBn. Den andra halvan av CLBn används till att beräkna LSB 1 vid
subtraktion. Den kritiska vägen för denna krets uttrycks av:
[
t
N
]
ns
T
T
T
N
T
t
T
T
Nf net SUM NET BYP ASCY Nf net CKO p45
.
0
2
/
)
4
(
5
.
6
)
(
2
/
)
4
(
1 , 1 ,⋅
−
+
+
=
+
+
⋅
−
+
+
+
=
(3.2)
3.2
Radix-2 Redundant Aritmetik på FPGA
Redundant aritmetik är användbart då hastigheten vill höjas i operationer som
karakteriseras av lång propagationsfördröjning. Utöver denna funktion så kan
data processas med Most Significant Digit First (MSDF). Detta förenklar
implementering av operationer som i sig arbetar på MSDF-sätt, som t.ex.
division eller roten ur eller förbättrade algoritmer så som Differential CORDIC
[10].
Implementering av vissa operationer så som, multiplikation, skalning och
dividerare på FPGA kan finnas i [11].
I radix-2 redundant aritmetik kan en siffra X representeras som:
∑
− = − −=
=
1 0 1 2 1 0 2...
2
N i i i Nx
x
x
x
x
X
(3.3)
där varje siffra
x
itillhör {-1, 0, 1} enligt:
− +
−
=
i i ix
x
x
(3.4)
där
x
i+,
x
i−∈
{
0
,
1
}
.
3.3
Konventionell CORDIC på FPGA
Den bit-parallella fullt pipelineade kretsen för att beräkna ekvation (2.8) för
framåtrotation visas[9]. Den är baserad på ripple carry adderare/subtraherare (se
3.1.3). Tecken biten från
är A/S linjen, som indikerar om nästa operation är
en addition eller subtraktion. Hela processen kräver (2·(M+1) ·(N +1)+ (M
+1)^2)/2 CLB:n. Den kritiska vägen ordnas av M+1 A/S näten. Varenda en av
dessa nät har en fan-out på 2N + M + 3. Ekvationen för propagationstiden i den
kritiska vägen ges av:
i
Z
ns
N
t
T
T
T
N
T
t
T
T
M f M N net SUM NET BYP ASCY M f M N net CKO p]
45
.
0
2
/
)
4
(
5
.
6
[
)
(
2
/
)
4
(
1 , ) 1 2 ( 1 , ) 1 2 (⋅
−
+
+
=
+
+
⋅
−
+
+
+
=
+ + + + + +(3.5)
Processorns latens är M+1 klockcykler. I fall av CORDIC implementering som
beräknar antingen framåt- eller bakåtrotation med en precision av M=16 bitar,
så är den area som ockuperas på FPGA:n 535.5 CLBn. Den sämsta
routingfördröjningen ges av en av de 17 näten med en fan-out på 61. Den
maximala operations frekvensen är ungefär 25MHz när den får plats på ett chip
med hastighetsgraden 1 och med en ockupation av mindre än 25%. För en
struktur som beräknar både framåt- och bakåtrotation så är resurserna 100%
delade. I sådana fall räcker det med att inkludera en multiplexor för att välja
A/S signal mellan tecken biten
framåtrotation eller
i bakåtrotation. Det
krävs bara en extra (M+1)/2 CLB. Men trots allt så försämrar det prestanda
något p.g.a. extra routingfördröjning. Den resulterande kritiska vägen ges av:
i
Z
Y
ins
N
t
t
T
T
T
N
T
t
T
t
T
T
M f M N net net SUM NET BYP ASCY M f M N net ILO net CKO p]
45
.
0
2
/
)
4
(
8
.
7
[
)
(
2
/
)
4
(
1 , ) 1 2 ( 17 , 1 1 , ) 1 2 ( 17 , 1⋅
−
+
+
+
=
+
+
⋅
−
+
+
+
+
+
=
+ + + + + +(3.6)
3.4
Redundant CORDIC på FPGA
För att kunna lösa problemet med redundant aritmetik baserad CORDIC, har
flera metoder föreslagits. Alla dessa förslag behåller skalfaktorn konstant. De
har blivit klassificerade i tre grupper: (i) sådana som baseras på uppskattning av
tecknet, (ii) differential CORDIC-algoritm och (iii) de som baseras på
3.4.1
Uppskattning av tecken
Flera metorder utför uppskattning på tecknet genom att utforska några av
värdena. Dessa är:
• Double Rotation CORDIC [12].
• Correcting Rotation CORDIC ([12] för framåtrotation och [13]
för bakåtrotation).
• Householder [14-16]
Bland dessa är Correcting Rotation CORDIC den enklaste att implementera.
Uppsättningen av ekvationer är inte samma för alla iterationer i denna metod.
De andra metoderna för uppskattning av tecken, har mer avancerade ekvationer
vilket leder till att en större area användes och den får en lägre throughput.
3.4.2
Differential CORDIC (DCORDIC)
Differential CORDIC [17] är en redundant aritmetik baserad metod som
behåller en konstant skalfaktor, utan att behöva extra rotationer. I DCORDIC
väljs riktningen för mikrorotationen på så sätt att den återstående
rotationsvinkeln i framåtrotation-moden och
variabeln i bakåtrotation-moden
alltid minskas. Målet med denna metod är MSDF beräkningen av alla
involverade operationer.
i
Y
3.4.3
Pre-Computed CORDIC (P-CORDIC)
En annan metod att utföra CORDIC-algoritmen på är att direkt beräkna
riktningen för mikrorotationen utan iterationer.
I [18,19] uppnås sambandet mellan riktningen, mikrorotationen och
inputvinkeln för framåtrotationsmoden. Sambandet mellan X- och Y-ingången i
bakåtrotationsmoden uppnås i [18]. Denna metod har uteslutits för FPGA
design då dess implementering kräver två MSDF multiplikationer och en MSDF
addition.
4
Digitala Filter
Det finns olika sätt att specificera digitala filter[20]. Exempel på detta är en
klass av processer som kallas all-pass. De är designade till att ha en flat
magnitudkaraktäristik men har även en faskaraktäristik som varierar med
frekvensen i vissa fall. Många designer är framtagna för att kunna lösa olika
problem, som att till exempel kunna se ett specifikt impulssvar eller stegsvar.
Impulssvaret är den term som bäst beskriver ett systems egenskaper medan
stegsvaret inte är lika unikt i det syftet.
De mest förekommande digitala filtren är Linear Time-Invariant (LTI) filter. Ett
LTI påverkas av sin in-signal genom en process som kallas linjär faltning, som
betecknas av f*x där f är filtrets impulssvar. Den generella formeln för
ekvationen till en godtycklig LTI process är:
∑
∑
= =−
=
−
M k k N K ky
n
k
b
x
n
k
a
0 0]
[
]
[
(4.1)
4.2
Icke-rekursiva filter
I ett icke-rekursivt filter så beror utsignalen endast på nuvarande eller senaste
in-signal. Differentialekvationen för ett sådant filter ser ut som nedan
∑
=−
=
M k kx
n
k
b
n
y
0]
[
]
[
(4.2)
Detta filter har ingen återkoppling av utsignalen så summan skickas ut direkt på
utgången. Koefficienterna
är helt enkelt lika med successiva termer i filtrets
impulssvar. FIR filter är att föredra när antalet koefficienter måste vara ändligt.
Konsten att designa ett icke-rekursivt filter är att uppnå ett acceptabelt
k
frekvenskomponenter som passerar filtren. Ett exempel på ett pulssvar är till
exempel funktionen δ[n] som blir 1 endast då n=0 alla andra n ger δ[n]=0. Det
ter sig så att om pulssvaret är känt och en insignal är given så kan utsignalen
beräknas med hjälp av faltning.
5
Design av FIR-filter
FIR filter spelar en betydande roll för design av diskreta tidssystem[21]. Till
skillnad från Infinite Impulse Response (IIR) filter så kan dessa filter designas
till att vara slumpmässiga och ha exakt linjär fas. FIR filter kan implementeras
med hjälp av Discrete Fourier Transform (DFT). Det finns flertalet olika
metoder för att designa FIR filter som till exempel fönstermetoden.
5.1
Fönstermetoder
Fönstermetoden är en av de äldsta och enklaste metoderna för att designa ett
FIR filter, den är även en av de bästa. Fönster kan användas till att designa FIR
filter av vilken storlek som helst. Vidare så kan det med fönster skapas filter
med linjär eller icke-linjär faskaraktäristik och med reellt eller komplext
impulssvar.
Fönstermetoden är ett exempel på en tidsdomän teknik. Den väljer filtrets
impulssvar h[n] och approximerar ett idealiskt impulssvar i[n].
5.2
Frekvensdomän design
Andra filtermetoder är frekvensdomän designalgoritmer. Dessa väljer filtrets
impulssvar så att filtrets frekvenssvar approximerar ett idealiskt frekvenssvar
I(
). Det här menas att när specifikationen är given på det här viset måste
den inversa DTFT användas först för att utvärdera i[n].
jw
e
Impulssvaret h[n] bestäms genom att multiplicera det idealiska impulssvaret
med en N-punkters fönstersekvens, w[n]:
]
[
]
[
]
[
n
i
n
w
n
h
=
(5.1)
5.3
Faltning
En annan metod som kan tillämpas för att designa FIR filter är faltning. Kort
sagt är faltning en matematisk operation som inom signalbehandling används
till exempel när linjära filter appliceras.
Ett system beskrivs ofta med differentialekvationer [23], dessa kan vara svåra
att formulera. I stället för att använda metoden med differentialekvationer när
utsignalen från ett system ska bestämmas, kan faltningsmetoden utnyttjas.
Denna metod innebär följande:
En enhetspuls kan används som insignal, betecknad δ(t) eller δ[n] till ett okänt
system (ett system sägs vara okänt då det inte har några formulerade
differentialekvationer). Detta system kommer då att svara med en utsignal som
kallas för impulssvaret h(t) eller h[n] för den tidsdiskreta varianten.
Impulssvaret ger en bra beskrivning av hela systemet.
Fortsättningsvis kan utsignalen y(t) eller y[n] från ett system beräknas med
hjälp falting mellan impulssvaret h(t) och insignalen x(t) eller h[n] och x[n].
Faltning kan göras i två varianter, tidskontinuerlig eller tidsdiskret.
∑
∞ =−
=
0]
[
*
]
[
]
[
ii
n
h
i
x
n
y
,n
≥
0
tidsdiskret variant
(5.2)
∫
∞−
=
0)
(
*
)
(
)
(
t
x
λ
h
t
λ
d
λ
y
,t
≥
0
tidskontinuerlig variant
(5.3)
Den tidsdiskreta varianten är tillämpad i detta exjobb, vilken kan förklaras på
följande sätt:
• I en tidsdiskret signal kan varje sampelvärde ”klippas ut” från hela signalen.
Detta genom att signalen multipliceras med en förskjuten impuls, figur 5.2.
• En impuls ger som svar ett impulssvar, oavsett om den är förskjuten eller
Insignal till Systemet
Utsignal från systemet
δ[n]
h[n]
δ[n-1]
h[n-1]
δ[n-2]
h[n-2]
δ[n-i]
h[n-i]
Tabell 5.1Om impulsen till exempel skulle vara förskjuten 3 steg åt höger, det vill säga
δ[n-3] så kommer impulssvaret att fördröjas med 3 steg åt höger.
• En multiplicering av termerna i vänstra kolumnen av tabell 5.1 med till
exempel en konstant, måste på grund av att systemet är linjärt, motsvaras av
en multiplicering i högra kolumnen med samma konstant
• Hela insignalen ”x” alltså signalens samtliga sampels fås genom att
summera alla sampelvärden multiplicerade med ”förskjutna impulser” där
av formeln,
∑
∞ =−
=
0]
[
*
]
[
]
[
ii
n
i
x
n
x
δ
(5.4)
Vidare fås utsignalen ”y” genom att summera alla impulssvar multiplicerade
med ”konstanter” det vill säga sampelvärdena. Det gör att den slutliga
faltningsformlen blir,
∑
på grund av linjärt system. (5.5
)
∞ =
−
=
0]
[
*
]
[
]
[
ii
n
h
i
x
n
y
Faltningsformelns index ”i” börjar vid i=0 och sträcker sig till ett ändligt värde i
=N i kausala system.
För att visa på hur den tidsdiskreta faltningsformeln fungerar så illustreras ett
exempel nedan. Signalen x(i) i figur 5.1 faltas med impulssvaret h(n) i figur 5.2
då erhålls resultatet enligt tabell 5.2.
0 1
1
2 3
Figur 5.1 Visar en signal x(i) med 3 stycken sampelvärden alla med värde 1.
1 2 3
0 1
Antal(i) Insignal
x(i) Impulssvaret h(n) Utsignal y(n)
0 1
1
1
1 1
1
2
2 1
1
3
3 1
1
3
4 1
1
2
5 1
1
1
6 1
1
0
6
XSA-50 kretskort
XSA-50 kortet är ett avancerat kretskort med många utvecklings möjligheter. I
detta kapitel beskrivs kortets olika funktioner. Se figur 6.1 för en översiktsbild.
Figur 6.1 Översiktsbild av XSA-50 kortet ur [24].
För en detaljerad genomgång av XSA-50 kortet rekommenderas [24]. I
manualen till kortet [24] så finns det även ett schema över XSA-50 och en
presentation av alla pinnar, samt vad de är kopplade till på kortet. Där finns
även en beskrivning av hur man laddar ner program till kortet.
6.1
Koppla kortet till PC
Kortet kan kopplas till en PC genom parallell in-/utgångs porten. Detta är
användbart då kortet ska programmeras med det egna programmet, eller då
SDRAM:en ska fyllas med värden.
6.3
PS/2 port
På kortet finns det en PS/2 ingångs port som kan användas till att koppla in en
mus eller ett tangentbord. Programmering av ett mus- eller
tangentbordsinterface måste göras för att kunna behandla informationen som tas
emot från tangentbordet eller musen.
6.4
100 MHz oscillator
Kortet innehåller även en intern 100MHz oscillator. Denna kan ställas om från
100 MHz ner till 48.7 KHz. Det går även att koppla in en extern oscillator på
kortet på pin 64. Den externa oscillatorn får dock inte ha en högre frekvens än
50 MHz. När det har kopplats in en extern oscillator så tar den ”över”
funktionen av den interna.
6.5
Synkron DRAM
XSA-50 kortet innehåller även en SDRAM som kan användas till att spara eller
hämta in information till programmet som man har skapat. Se bilaga H för en
steg för steg genomgång av detta.
SDRAM:en är organiserad på detta sätt:
Figur 6.2 ur [24].
Figur 6.3 ur [24].
För tillfället så används inte pin 133 på SDRAM:en men den kan komma att
användas i framtiden.
6.6
Flash RAM
Kortet innehåller även en Flash RAM. För en större förståelse av Flash RAM:en
rekommenderas läsning av [24] och [25].
6.7
Sju-Segment LED
På kortet finns det en sju-segments LED display se figuren nedan. Displayen är
aktivt-hög det vill säga att den visar ett tecken då den är logiskt hög.
6.8
DIP Switchar
Kortet innehåller även fyra stycken switchar, se figur 6.1. för mer information
om switcharna rekommenderas läsning av [24].
6.9
Pushbutton
Pushbutton som finns på kortet delar samma pin som PS/2 data. Se figuren
nedan
Figur 6.5 ur [24].
Detta gör att man inte kan använda PS/2 ingången samtidigt som man använder
pushbutton.
7
Projektbeskrivning
I detta kapitel presenteras projekten som har utförts.
7.1
Projektbeskrivning för CORDIC
Målet med CORIC delen av projektet var att implementera en av
CORDIC-moderna på FPGA kortet XSA-50. Detta skulle sedan resultera i ett häfte
(bilaga H) som studenter senare ska kunna använda för självstudier. För att göra
projektet mer användbart än bara vid studier av CORDIC-algoritmen så
användes även SDRAM funktionen på kortet. Detta för att studenter ska kunna
följa vårat arbete för att implementera SDRAM i egna framtida projekt.
Valet av CORDIC-mode föll på framåtrotation eller rotationmode som det även
kallas. Detta för att förenkla förståelse av annan studiematerial som kommer att
tillgängliggöras för studenterna under kursens gång.
För att implementera algoritmen med hjälp av den interna SDRAM:en så
utgicks det ifrån ett exempel från XESS Corporations hemsida [26]. Deras
exempel fungerade på sådant sätt att den skapar en slumpgenererad
sifferkombination. Denna kombination sparas sedan på SDRAM:en, därefter så
läses värdena tillbaka från SDRAM:en och jämförs med de framslumpade
värdena. Om sifferkombinationen inte stämmer med varandra så har något fel
skett vid antingen skrivningen eller läsningen till/från SDRAM:en. Detta
indikeras då på LED displayen.
Deras stomme [26] användes till detta projekt. Men istället för att skapa en
slumpgenerator som spara siffror i minnen, så skapades
CORDIC-framåtrotation.
Y- och Z-värdena är satta i förväg i programmet. Det vill säga att dessa värden
är konstanter. Men x-värdet skapas externt igenom ett Matlab program som har
konstruerats specifikt för detta projekt. Z-värdet måste ligga i intervallet +45 till
-45. Om man ska använda ett negativt värde på z så måste man dock räkna ut
tvåkomplementet.
7.1.2
Utföra CORDIC algoritm på kortet
Det första som händer när programmet utförs är att den läser in x-värdet som
tidigare har sparats i SDRAM:en. Värdet sparas på den först minnesplatsen på
SDRAM:en.
Med hjälp av detta värde utförs CORDIC algoritmen. Sedan sparas det
uträknade värdet tillbaka på SDRAM:en. Det sparas på den andra adress raden i
SDRAM:en.
När uträkningen är färdig så visar LED displayen på kortet ”0”. Då kan
laddning av det nya uträknade värdet ske till en PC för att verifieras.
7.1.3
Verifierng av CORDIC algoritmen
För att verifiera de värden som har beräknats fram på kortet utfördes simulering
med hjälp av ett program skapat i Matlab. Se bilaga E för Matlabkoden.
Nedan i tabell 7.1 visas resultatet av simuleringar utförda i Matlab och de
beräknade värden utförda av programmet på XSA-50 kortet.
x-värde
y-värde z-värde Resultat med XSA-50 Resultat med Matlab
14 10 40 7
7.0734
5 10
40
FFFB
1-4.2792
20 15 35 12
12.8065
8 15
35
FFFC
1-3.3796
25 20 30 21
19.1806
15 20 30 6
4.9201
30 30 20 27
29.5258
10 30 20 FFFD
1-1.4230
Tabell 7.1 Resultat av värden på XSA-50 kortet med programmet som har tagits fram
den enda felkällan. När man utför simulering i Matlab så har man möjlighet att
utföra många fler iterationer och därmed uppnå en mycket högre precision i
beräkningarna. Men detta är inte möjligt då man utför algoritmen i en
hårdvarumiljö. I Matlabsimulationen utförs det 15 iterationer medan det bara är
5 iterationer i hårdvaran. För VHDL kod se bilaga B. För en mer detaljera
genomgång av hur experimenten har utförts rekommenderas läsning av bilaga
H.
7.2
Projektbeskrivning FIR Filter
Detta avsnitt har för avsikt att ge en bra inblick i hur skapandet av FIR filtret
gick till, från ide till färdig konstruktion.
Projektet inleddes med att bestämma vilken metod som skulle tillämpas vid
beräkning av filtret, metoden som valdes var Falting. Därefter gjordes en studie
i hur filtrets överföringsfunktion skulle se ut. Inspiration hämtades från [22]
som lade grunden till funktionen. Detta gjordes för att knyta an till exjobbets
mål, att underlätta självstudier för studenter i detta ämne.
Filtrets överföringsfunktion kom att bli enligt figur 7.1 nedan:
Figur 7.1 FIR filter.
I figuren 7.1 syns det att filtret har 3 stycken koefficienter h[2], h[1] och h[0].
Antalet är orelevant eftersom tillvägagångssättet vid konstruktion av större filter
med flera koefficienter är detsamma.
Filtret fungerar på så sätt att insignalen x[n] sätts till godtyckliga värden som
matas in i systemet. Sedan multipliceras x[n] med den 1:a filterkoefficienten
h[0] och resultatet adderas med
och läggs ut som utsignalen y[n]. Efter det
multipliceras x[n] med den 2:a koefficienten h[1] och resultatet summeras ihop
med det tidigare värdet i
. Till sist så multipliceras x[n] med den 3:e
koefficienten h[2] och det värdet sparas i
. Ett exempel visas i tabellen 7.2.
1 −
z
1 −z
1 −z
Insignal x[n] Koefficienter h[n] Utsignal y[n]
1,0,0,0 h[2]=1, h[1]=2, h[0]=3 3,2,1,0
Det framtagna filtret simulerades i Matlab och implementerades på hårdvaran
för att se att det överrensstämmer med teorin. Vid simulering så testades värden
mellan 0-9 på insignalen x[n]. Denna begränsning av insignalen beror på
tangentbordsavkodningen. Filterkoefficienterna är fasta i detta fall men kan anta
vilka heltal som helst. Resultatet av simuleringen visas i tabell 7.3 och
implementeringen på hårdvara i tabell 7.4.
Insignal x[n] Koefficienter h[n]
Utsignal y[n]
1,0,0
h[2]=1, h[1]=2, h[0]=1 1,2,1
2,0,0
h[2]=1, h[1]=2, h[0]=1 2,4,2
3,0,0
h[2]=1, h[1]=2, h[0]=1 3,6,3
4,0,0
h[2]=1, h[1]=2, h[0]=1 4,8,4
5,0,0
h[2]=1, h[1]=2, h[0]=1 5,10,5
6,0,0
h[2]=1, h[1]=2, h[0]=1 6,12,6
7,0,0
h[2]=1, h[1]=2, h[0]=1 7,14,7
8,0,0
h[2]=1, h[1]=2, h[0]=1 8,16,8
9,0,0
h[2]=1, h[1]=2, h[0]=1 9,18,9
Tabell 7.3 Simulering i Matlab.
Resultatet av testerna på hårdvaran och simuleringarna i Matlab ser ut på olika
sätt. Till exempel när insignal till filtret är 1 så blir utsignalen i Matlab 1,2,1
medan den på hårdvaran blir 4. Detta är för att utsignalen från hårdvarna visar
summan av multiplikationerna mellan insignal x[n] och filterkoefficienterna
h[n]. Medan den i Matlab visar varje multiplikation var för sig.
Insignal x[n] Koefficienter h[n]
Utsignal y[n]
1
h[2]=1, h[1]=2, h[0]=1
4
2
h[2]=1, h[1]=2, h[0]=1
8
3
h[2]=1, h[1]=2, h[0]=1 12
4
h[2]=1, h[1]=2, h[0]=1
16
5
h[2]=1, h[1]=2, h[0]=1
20
6
h[2]=1, h[1]=2, h[0]=1
24
7
h[2]=1, h[1]=2, h[0]=1
28
8
h[2]=1, h[1]=2, h[0]=1
32
9
h[2]=1, h[1]=2, h[0]=1
36
Tabell 7.4 Utförande på XSA-50 kortet.
Efter utförda simuleringar så startade projektet med att koda konstruktionen i
programmet Xillinx ISE 7.1i. Programmet byggdes upp i blockform för att
underlätta vid exekveringen/simulering samt vid felsökning. Se avsnitt 7.3 för
beskrivning av blocken.
När programkoden var färdigställd så generades en .bit fil som laddades ner till
XSA-50 kortet. Därefter provkördes filtret genom att mata in värden med det
inkopplade tangentbordet via PS/2 porten på kortet [27]. För att se koden till
tangentbordsavkodningen se bilaga A. Ett oscilloskop kopplades in för att
kunna avläsa utsignalen från filtret. För en mer detaljerad genomgång av
utförandet av experimentet rekommenderas läsning av bilaga C. Som stomme
till tangentbordsavkodningen har [27] används.
7.3
Blockstrukturen i FIR Filtret
I detta avsnitt beskrivs de olika blocken i FIR filtret. Systemet fungerar på så
sätt att inmatning av data sker med hjälp av ett tangentbord. Denna data
behandlas sedan i filtret för att sedan läggas som en utsignal. Utsignalen kan
sedan användas på olika sätt, till exempel genom att sparas och presentera
7.3.1
Ps2_kbd
Här sker inladdningen av värden från tangentbordet som sedan skickas vidare
till blocket Keyb_scan för avkodningen.
Figur 7.2
7.3.2
Keyb_scan
I denna modul sker avkodningen av tangentbordet. När användaren matar in ett
värde mellan 0-9 med tangentbordet så läggs det på ingången scancode. Är
signalen rdy hög så avkodas detta värde och läggs på utgången x_ut. X_ut blir
det nya x-invärdet i loadbuff.
7.3.3
Loadbuff
Detta block har till uppgift att ladda X-värden och sätta värden på
filterkoefficienterna. X-värdet som har laddats in från keyb_scan modulen
skickas sedan vidare när loadsignalen är låg. Detta värde skickas vidare till
multiplier blocken med utsignalen x_ut .
Ready signalen är kopplad till load signalen på samtliga multipliers.
Figur 7.4
7.3.4
One_pulse
Detta block genererar en puls i taget. Detta för att undvika kontaktstudsar då
man använder switchboarden.
7.3.5
Filter_muls
Det finns tre sådana block och i dessa sker multiplikationerna av
filterkoefficienterna och insignal.
När signalen load är låg så laddas x_in och c_in i x- respektive c-registret.
Sedan sker multiplikationen mellan dessa värden och produkten läggs på
utsignalen y1. När en multiplikation är klar så skickas en ready signal.
Figur 7.6
7.3.6
Adder
Ready signalen i detta block är sammankopplad med ready signalen från
multiplier modulen. När denna signal blir låg så sparas det tidigare inkommande
värdet z_in i register s. Efter att detta har inträffats så adderas värdet i register s
och in_add. Efter denna addition läggs summan ut på utsignalen ut.
7.3.7
Adder2
Adder2 fungerar på liknade sätt som adder men den har ingen ready signal. Det
gör att ett inkommande värde(z_in) sparas i register s utan att någon ready
signal sätts. Sedan läggs produkten från multiplier på in_add och adderas till sist
med värdet i s och läggs på utsignalen ut.
Figur 7.8
7.3.8
Store
I detta block skall produkten av x_in. När signalen ready är låg så sparas det
inkommande värdet från in_data i register z. Därefter så läggs värdet ut på
utsignalen ut_data.
8
Avslutning
I detta avsnitt diskuteras arbetet och resultaten redovisas.
8.1
Resultat CORDIC
Simuleringarna utförda i Matlab skilde sig jämfört med resultaten från
utförandet på XSA-50 kortet.
Andledningen till detta är att hårdvaruutförandet av CORDIC-framåtrotationen
bara kan utföra ett fåtal iterationer, så kan det uppstå vissa felaktigheter. De
uppmätta värdena från hårdvaruutförandet av programmet kan även skilja sig
från de simulerade värdena på grund av avrundningsfel. Detta beror på att man i
hårdvaran endast kan jobba med heltal.
Matlabprogram som har skrivits skapar den nödvändiga HEX filen, som behövs
för att ladda ner det valda x-värdet på SDRAM:en. Detta underlättar då man
slipper räkna ut checksumovärdena som är nödvändiga.
Vidare har det skapts en manual som kan användas vid självstudier av bland
annat implementering av CORDIC-algoritmen och SDRAM funktionen på
XSA-50 kortet.
8.2
Resultat FIR
Efter att simuleringsresultatet i Matlab har jämförts med det på hårdvaran så
kunde det konstateras att implementeringen var lyckad. Filtret fungerade enligt
förutsättningarna.
Utsignalen y[n] visades på olika sätt vid simulering respektive
hårdvaruimplementering. I Matlab visades multiplikationerna av insignalen och
filterkoefficienterna var för sig. Medan det på hårdvaran är summan av samtliga
multiplikationer som visas.
Vidare har det skapts en manual som kan användas vid självstudier av bland
annat implementering av FIR-filter och tangentbordsfunktionen på XSA-50
kortet.
8.3
Problem
8.4
Diskussion
CORDIC-algoritmen är väl anpassad till att användas på DSP tillämpningar. Då
den till största delen handlar om addition och skiftoperationer. I detta arbete så
har algoritmen anpassats till att fungerar med XSA-50 kortet. Detta har fungerat
väl då laborationskortet har många funktioner som kan utnyttjas. I CORDIC
tillämpningen så används den inbyggda SDRAM:en. Genom att utgå från detta
projekt kan man lätt använda SDRAM till egna projekt och tillämpningar.
Vid konstruktionen av FIR filtret så utfördes simulation i Matlab, detta
underlättade vidare arbete med konstruktionen på XSA-50 kortet.
Blockkonstruktion tillämpades med stor fördel. Detta gjorde det mycket enklare
att skapa en bra översikt över de olika delarna i filtret. Felsökning av FIR filtret
underlättades avsevärt, då varje block kunde simuleras var för sig. För denna
del av projektet har PS/2 ingången använts för inläsning ifrån tangentbordet.
Detta projekt kan vara en utgångspunkt för att anpassa tangentbordsinläsning
till egna tillämpningar.
9
Terminologi
Akrynom
Förklaring
CLB
Configurable Logic Block
CORDIC
COordinate Rotation DIgital Computer
CS
Carry
Signal
DCORDIC
Differential
CORDIC
DFT
Discrete Fourier Transform
DSP
Digital Signal Processor
DTFT
Discrete Time Fourier Transform
FA
Full
Adder
FFT
Fast Fourier Transform
FIR
Finite Impulse Response
FPGA
Field Programmable Gate Array
IIR
Infinite Impulse Response
IOB
Input Output Block
LSB
Least Significant Bit
LTI
Linear Time Invariant
LUT
Look-Up
Tables
MSB
Most Significant Bit
10
Referenser
1. J.E. Volder, "The CORDIC Trigonometric Computing Technique," IRE
Trans Electronic Computers, vol8, pp. 330-334, Sept. 1959.
2. J. S. Walther, "A Unified Algorithm for Elementary Functions," Proc.
Spring. Joint Computer Conf., pp. 379-385, 1971.
3. R. Andraka, “A Survey of CORDIC Algorithms for FPGAs,” in
Proceedings of the 1998 ACM/SIGDA Sixth International Symposium on
Field Programmable Gate Arrays (FPGA ’98),Monterey, CA, Feb. 22–24,
1998, pp. 191–200.
4. J.E. Volder, ”The Birth of CORDIC”, 2000
5. D. Timmermann (1990): “CORDIC-Algorithmen, Architekturen und
monolithische Realisierungen mit Anwendungen in der Bildverarbeitung,”
Ph.D. thesis, VDI/Springer, Düsseldorf, Vol. 10, No. 152
6. H. Hahn (1991): “Untersuchung und Integration von Berechnungsverfahren
elementarer Funktionen auf CORDIC-Basis mit Anwendungen in der
adaptiven Signalverarbeitung,” Ph.D. thesis, VDI/Springer, Düsseldorf, Vol.
9, No. 125
7. U. Meyer-Bäse: The Use of Complex Algorithm in the Realization of
Universal Sampling Receiver Using FPGAs (in German) (VDI/Springer,
Düsseldorf, 1995), Vol. 10, No.404, 215 pages
8. U. Meyer-Bäse, A. Meyer-Bäse, W. Hilberg: “ COordinate Rotation DIgital
Computer (CORDIC) Synthesis for FPGA,” Lecture Notes in Computer
Science 849, 397-408 (Springer, Heidelberg, 1994)
9.
J. Valls, M. Kuhlmann, K.K. Parhi, “Evaluation of CORDIC Algorithms for
FPGA Design,“ Journal of VLSI Signal Processing 32, pp. 207-222, 2002.
10.
H. Dawid and H. Meyr, “The Differential CORDIC Algorithm: Constant
Scale Factor Redundant Implementation without Correcting Iterations,”
12.
N. Takagi, T. Asada, and S.Yajima, “Redundant CORDIC Methods with a
Constant Scale Factor for Sine and Cosine Computation,” IEEE
Transactions on Computers, vol. 40, no. 9, 1991.
13.
J.-A. Lee andT. Lang, “Constant-Factor RedundantCORDICfor Angle
Calculation and Rotation,” IEEE Transactions on Computers, vol. 41, no. 8,
1992.
14.
Shen-Fu Hsiao and Jean-Marc Delosme, “Householder CORDIC
Algorithm,” IEEE Transactions on Computers, vol. 44, no. 8, 1995.
15.
Shen-Fu Hsiao and Jen-Yin Chen, “Design, Implementation and Analysis of
aNewRedundant CORDIC Processor with Constant Scaling Factor and
Regular Structure,” Journal of VLSI Signal Processing, vol. 20, 1998, pp.
267–278.
16.
Shen-Fu, Hsiao, “A High-Speed Constant-Factor Redundant CORDIC
Processor without Extra Correcting or Scaling Iterations,” in IEEE Int. Conf.
On Circuits and Systems (ISCAS’99), Florida, 1999.
17.
H. Dawid and H. Meyr, “The Differential CORDIC Algorithm: Constant
Scale Factor Redundant implementation without Correcting Iterations,”
IEEE Transactions on Computers, vol. 45, no. 3, 1996.
18.
M. Kuhlmann and K.K. Parhi, “A High-Speed CORDIC Algorithm and
Architecture for DPS Applications,” in Proc. of the 1999 IEEE Workshop
on Signal Processing Systems (SiPS’99), Taipei, Taiwan, Oct. 1999.
19.
M. Kuhlmann and K.K. Parhi, “A New CORDIC Rotation Method for
Generalized Coodinate Systems,” in Proc. of the 1999 Asilomar Conference
on Signal, Systems and Computers, Pacific Grove, CA, Oct. 1999.
20.
P.A. Lynn, W. Fuerst, ”Introductory Digital Signal Processing” 1994
21.R.M. Mersereau, M.J.T. Smith, ”Digital Filtering” 1994
22.
U.M. Baese,”Dgital Signal Processing with Field Programmable Gate
Arrays” 2001
23.
O. Pedersen, ”Signaler och System kompendium för teori och praktik”, mars
2003, 2:a editionen.
-- Filename Ps2_kbd.vhd
--- -- This circuit accepts a serial datastream and clock from a PS/2 keyboard
-- and outputs the scancode for any key that is pressed. --
-- Notes: --
-- 1. The clock from the PS/2 keyboard does not drive the clock inputs of -- any of the registers in this circuit. Instead, it is sampled at the
-- frequency of the main clock input and edges are extracted from the samples. -- So you have to apply a main clock that is substantially faster than
-- the 10 KHz PS/2 clock. It should be 200 KHz or more. --
-- 2. The scancode is only valid when the ready signal is high. The scancode -- should be registered by an external circuit on the first clock edge -- after the ready signal goes high.
--
-- 3. The ready signal pulses only after the key is released. --
-- 4. The error flag is set whenever the PS/2 clock stops pulsing and the -- PS/2 clock is either at a low level or less than 11 bits of serial -- data have been received (start + 8 data + parity + stop). The circuit -- locks up once an error is detected and will not resume operation until -- a reset is applied. library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; package ps2_kbd_pckg is component ps2_kbd generic(
FREQ : natural := 100_000 -- frequency of the main clock (KHz) );
port(
clk : in std_logic; -- main clock
rst : in std_logic; -- asynchronous reset
ps2_clk : in std_logic; -- clock from keyboard
ps2_data : in std_logic; -- data from keyboard
scancode : out std_logic_vector(7 downto 0); -- key scancode
rdy : out std_logic; -- scancode ready pulse
error : out std_logic -- error receiving scancode
);
end component ps2_kbd; end package ps2_kbd_pckg;
library IEEE;