27.07.2013 Views

Hovedoppgave av Jan Jakobsen

Hovedoppgave av Jan Jakobsen

Hovedoppgave av Jan Jakobsen

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Hovedoppg<strong>av</strong>e</strong><br />

<strong>av</strong> <strong>Jan</strong> <strong>Jakobsen</strong><br />

Institutt for Fysikk<br />

Universitetet i Oslo


Innholdsfortegnelse<br />

Innledning ................................................................................................................................ 4<br />

Problemstilling.................................................................................................................... 4<br />

Nummer representasjon .................................................................................................... 4<br />

Filterbeskrivelser................................................................................................................. 5<br />

Ulike typer design ................................................................................................................... 8<br />

Bitparallell aritmetikk ........................................................................................................ 8<br />

Bit seriell aritmetikk ........................................................................................................... 8<br />

Fordeler og ulemper........................................................................................................... 8<br />

Om digitale filtre ................................................................................................................... 10<br />

Design <strong>av</strong> filtre .................................................................................................................. 10<br />

Spesifisering.................................................................................................................. 10<br />

Aproksimering ............................................................................................................. 10<br />

Ulike filterstrukturer/realisering .............................................................................. 10<br />

Direkte form 1.......................................................................................................... 10<br />

Direkte form 2.......................................................................................................... 11<br />

Kaskadeform............................................................................................................ 12<br />

FIR Lattice................................................................................................................. 13<br />

IIR-filtre................................................................................................................................... 14<br />

Standard Z-transformering ............................................................................................. 15<br />

Billineær Z-transformering.............................................................................................. 15<br />

Stabilitet.............................................................................................................................. 16<br />

FIR-filtre.................................................................................................................................. 18<br />

Vindu metoden ................................................................................................................. 19<br />

Frekvensvinduer............................................................................................................... 21<br />

Minimax ............................................................................................................................. 21<br />

Bitserielt bibliotek.................................................................................................................. 22<br />

Seriell arkitektur. .............................................................................................................. 22<br />

Tallrepresentasjon............................................................................................................. 22<br />

ABSOLUTT........................................................................................................................ 23<br />

ADDER............................................................................................................................... 25<br />

SUBTRAKT........................................................................................................................ 28<br />

DSHIFT............................................................................................................................... 30<br />

MSHIFT.............................................................................................................................. 32<br />

ORDER ............................................................................................................................... 33<br />

FORMAT1TO2 .................................................................................................................. 37<br />

FORMAT 3TO1. ................................................................................................................ 38<br />

LIMIT.................................................................................................................................. 40<br />

MULTIPLY......................................................................................................................... 43<br />

Usignert multiplikasjon .............................................................................................. 43<br />

Multiplikasjon med signert koeffisient ..................................................................... 44<br />

Multiplikasjon med signert data og koeffisient. ...................................................... 49<br />

Avrundingsmultiplikator ........................................................................................... 51<br />

Seriell/seriell multiplikator........................................................................................ 52<br />

2


Dobbelpresisjonsmultiplikator. ................................................................................. 56<br />

Implementering. .................................................................................................................... 61<br />

IIR filter. ............................................................................................................................. 61<br />

FIR filtre. ............................................................................................................................ 63<br />

Multiplekset FIR filter. ..................................................................................................... 66<br />

Test <strong>av</strong> filtere . ................................................................................................................... 69<br />

Konklusjon.............................................................................................................................. 73<br />

Litteratur................................................................................................................................. 74<br />

3


Innledning<br />

Problemstilling<br />

Lage ett sett med kretser basert på bitseriell arkitektur. Kretsene skal modelleres i<br />

maskinvaremodelleringsspråket verilog. Verilog modulene skal være parametriserbare og med<br />

et veldefinert grensesnitt. Modulene utgjør de mest brukte funksjonene i digital<br />

signalbehandling. Målet med å lage dette funksjonsbiblioteket er å forenkle arbeidet med å<br />

lage vilkårlige bitserielle kretser. Funksjonene skal kunne brukes i ett<br />

maskinvaremodelleringsspråk omtrent som funksjoner i for eksempel C .<br />

Stadig raskere digitale kretser vil i mange tilfeller muliggjøre en filter-realisering med<br />

bitseriell arkitektur. Denne arkitekturen er mindre arealkrevende enn en vanlig parallell<br />

arkitektur og større funksjonalitet kan derfor legges inn på en enkelt brikke. Med minkende<br />

transistorer får også parallelle kretser problemer med kommunikasjon internt i brikken og<br />

mellom brikken og omverdenen 1 .Tidligere var bitseriell arkitektur vanligere pga. høy pris på<br />

maskinvare og liten plass på brikkene. I dag er prisen på maskinvare l<strong>av</strong> og parallelle<br />

arkitektur dominerer. I programmerbare kretser, FPGA, er plassen liten og en seriell arkitektur<br />

vil være ypperlig å bruke i disse 2 .<br />

Størstedelen <strong>av</strong> arbeidet med denne oppg<strong>av</strong>en er lagt i å utvikle ett sett med bitserielle kretser<br />

som utfører de vanligste operasjonene i ett digitalt filter design og å simulere noen filtre som<br />

er realisert med disse. Denne oppg<strong>av</strong>en er dermed to-delt. I den første delen drøfter jeg<br />

generell teori om digitale filtre frem til implementeringen <strong>av</strong> filtrene. I den andre delen tar jeg<br />

for meg bitseriell design, med hovedvekt på utviklingen og simuleringen <strong>av</strong> det bitserielle<br />

biblioteket. Disse delene knyttes tilslutt sammen i implementeringen <strong>av</strong> noen filtre.<br />

Den første delen <strong>av</strong> oppg<strong>av</strong>en er delt opp i fire <strong>av</strong>snitt:<br />

-Definerer og klargjør noen begreper.<br />

-FIR-filtre.<br />

-IIR-filtre.<br />

-Ulike filterstrukturer.<br />

Jeg har valgt å skrive om FIR og IIR hver for seg fordi de er veldig forskjellige, både i hvilke<br />

egenskaper de har og hvordan de utvikles.<br />

Nummer representasjon<br />

For binærkodet aritmetikk er det flere mulige nummerrepresentasjoner, 'signed magnitude' og<br />

1' komplement er mulige, men de har ikke en unik definisjon <strong>av</strong> null og dette vil komplisere<br />

operasjoner som addisjon og subtraksjon 3 . Det vanligste er å bruke 2'komplement<br />

representasjon. Dette har ett unikt nullpunkt og signert addisjon og subtraksjon kan behandles<br />

likt som usignert addisjon og subtraksjon. En annen viktig egenskap med denne<br />

representasjonen er at den er tolerant for overflyt i addisjon og subtraksjon, så lenge det<br />

endelige resultatet ligger innenfor det tillate dynamiske<br />

området 4 .


Ett tall representert i 2'komplement er definert til å ligge mellom -1 og 1.<br />

n1 X x x0<br />

<br />

i <br />

1<br />

Der n er antall bit som skal brukes i representasjonen.<br />

X0 kalles heretter fortegnsbiten eller MSB 'Most Signifficant Bit', x(n-1) kalles LSB 'Least<br />

Signifficant Bit'.<br />

Den mest signifikante bit'en har negativt fortegn mens de resterende er positive.<br />

En ulempe med denne representasjonen er at en total konvertering (positiv til negativ) blir<br />

mer komplisert. 5 Alle bitene må inverteres og en må legges til på LSB. Dette kan gjøres med<br />

SUB-kretsen, som jeg skal vise senere.<br />

Filterbeskrivelser<br />

xi 2 i <br />

De filtrene jeg skal beskrive her er alle tidsinvariante og linære. Det finnes mange måter å<br />

beskrive slike filtre, det vanligste er ved impulsresponsen h(t). Det kan vises at<br />

impulsresponsen til ett filter, beskriver filteret fullstendig. Hvis impulsresponsen først er<br />

kjent, kan responsen til ett vilkårlig signal u(t) finnes ved konvulsjon 6 :<br />

Y( t)<br />

<br />

<br />

u( T)<br />

m m(<br />

t T)<br />

dT<br />

<br />

<br />

Y(t) = Int[u(tt) m(t-tt)] , for det kontinuerlige tilfellet.<br />

<br />

Y( n)<br />

u( m)<br />

h h(<br />

n m)<br />

m<br />

<br />

<br />

Y(n) = Sum[u(n) h(m-n)], for det diskrete tilfellet.<br />

Ofte skrives konvulsjon bare som y = h*u.<br />

Konvulsjon er en vanskelig prosess å utføre, derfor foretrekkes en beskrivelse <strong>av</strong> filteret i<br />

frekvensdomenet. En konvulsjon i tidsdomene er en enkel multiplikasjon i frekvensdomenet:<br />

5


L[y] =L[h*u] = H(s)U(s).<br />

H(z) kalles systemets overføringsfunksjon og den gir en enkel sammenheng mellom<br />

utgangssignal Y(z) og inngangssignal U(z) til filteret:<br />

Y(z) = H(z) U(z).<br />

Med en beskrivelse <strong>av</strong> filteret på formen H(w) eller H(z) er det enkelt trekke ut opplysninger<br />

om frekvensresponsen til filteret. Mesteparten <strong>av</strong> metodikken i signalbehandling er derfor<br />

konsentrert om denne beskrivelsen.<br />

Beregninger på filtre gjøres altså i frekvenssdomenet og den klassiske overgangen mellom<br />

tids og frekvensdomenet er fourieranalyse. Det er to typer fourieranalyse, DFT, diskret<br />

fouriertransformering for diskrete signaler (digitale) og CFT, kontinuerlig<br />

fouriertransformering, for kontinuerlige (analoge) signaler. Det kan vises at<br />

Laplacetransformasjon er en generalisering <strong>av</strong> CFT og Z-transformasjon er en generalisering<br />

<strong>av</strong> DFT. Digitale filtre vil jeg altså beskrive i Z-domenet, i denne oppg<strong>av</strong>en. Filtere i sdomene<br />

kommer jeg bare til å drøfte i forbindelse men IIR-filtre.<br />

Digitale filtre beskrives, på generell form, i tidsdomenet med det som kalles standard<br />

differenslikningen:<br />

y(k)+a1y(k-1)++any(k-1) = b0u(k)+b1y(k-1)++bnu(k-n).<br />

I z-domenet kan dette skrives som:<br />

H(z) = sum[ajz^-j]/(1+sum[bjz^-j]).<br />

Alternativt kan vi skrive det ut som:<br />

H(z) = Y(z)/U(z)<br />

Y(z) = U(z)sum[aj^-j] - Y(z)sum[bjz^-j].<br />

Hvis minst en ai og en bi er ulik null, er filteret ikke bare <strong>av</strong>hengig <strong>av</strong> nåværende og tidligere<br />

inngangsdata U(), men også <strong>av</strong> tidligere utgangsdata Y(). Dette er ett rekursivt filter eller IIR.<br />

IIR 'Infinite Impulse Respons' betyr at ett signal, i teorien, aldri vil dø ut i filteret. Denne<br />

tilbakeføringen er det som kan gi ustabilitet i filteret og dette må tas hensyn til i design <strong>av</strong><br />

denne type filtre.<br />

Hvis derimot alle bi er null, er filteret ikke-rekursivt eller FIR. Utgangen er bare <strong>av</strong>hengig <strong>av</strong><br />

nåværende og N tidligere inngangsdata. FIR 'Finite Impulse Respons' betyr at ett signal i<br />

filteret tilslutt vil dø ut, da det ikke er noen tilbakeføring.<br />

FIR og IIR er de to hovedklassene <strong>av</strong> filtere. IIR kan sees på som en digital ekvivalent til<br />

6


analoge filtre og i design <strong>av</strong> IIR brukes vanligvis ett analogt filter som utgangspunkt. Som for<br />

analoge filtre har H(z) til ett IIR-filter poler og det er derfor viktig å passe på å velge filter<br />

koeffisientene ai og bi, slik at filteret blir stabilt. FIR-filteret har ikke noen analog ekvivalent,<br />

overføringsfunksjonen H(z) har ingen poler og er derfor garantert stabilt. FIR-filtre har som<br />

oftest gode fase-egenskaper. Ulempen med FIR-filtre er at det trengs ett stort antall ledd for å<br />

få en skarp frekvensrespons.<br />

7


Ulike typer design<br />

Kretser kan realiseres på ulik måte, bitseriell, digitseriell og parallell. Bitseriell arkitektur<br />

prosesserer en bit hver klokke syklus, digitseriell prosesserer ett bestemt antall biter <strong>av</strong> et ord<br />

per klokke syklus og parallell arkitektur prosesserer hele ordet i en klokke-sykel.<br />

Bitparallell aritmetikk<br />

Inngangene og utgangene er busser ett ord brede, og i teorien skal alle bitene prosesseres<br />

samtidig og alle bitene kommer til utgangen samtidig 7 .<br />

Siden alle bit-ene prosesseres samtidig må prosesserings elementene gjøre mye arbeid per<br />

klokke syklus og klokkehastigheten begrenses. I praksis må bitene ofte prosesseres<br />

sekvensielt likevel, for eksempel i ett addisjonselement hvor resultat biten <strong>av</strong>henger <strong>av</strong><br />

resultatet <strong>av</strong> biter med lik eller mindre signifikans. Dette gir opph<strong>av</strong> til en forsinkelse som i<br />

sin tur begrenser klokke hastigheten. Det er mulig å bruke ulike teknikker for å minske dette<br />

problemet, for eksempel med 'carry look ahead', 'carry s<strong>av</strong>e' logikk osv. Felles for disse er at<br />

de krever mer logikk og dermed større areal. En addisjon i parallell logikk må realiseres med<br />

en rekke 'full addere' FA, like mange som det er bit i ordet og med en mente logikk som<br />

forbinder dem. Parallell multiplikasjon gjøres på samme måte som når man multipliserer for<br />

hånd, et array <strong>av</strong> addere og AND porter danner de partielle produktene og legger dem<br />

sammen. For å danne produktet A*B, trengs det en diagonal med FA og en AND port for hver<br />

ny bit <strong>av</strong> A og en ny rekke FA for hver ny bit <strong>av</strong> B. For en m-bit *n-bit multiplikator trengs<br />

det (m-1)n FA. Multiplikasjons tiden <strong>av</strong>henger <strong>av</strong> tiden menten bruker ti å bevege seg<br />

gjennom arrayet.<br />

Bit seriell aritmetikk<br />

Inngangene og utgangene et en bit bred. Signalene går altså på enkelt ledninger. En bit<br />

prosesseres <strong>av</strong> gangen, vanligvis LSB først 8 . Alle bitene passerer gjennom den samme<br />

logikken og dette sparer enormt mye plass. Etterfølgende ord vil vanligvis komme rett etter<br />

hverandre uten pause. Bit seriell arkitektur krever kontroll signaler c1, for å markere<br />

ankomsten <strong>av</strong> LSB gjennom alle aritmetiske operasjoner.<br />

Operasjonene er ukompliserte fordi det er få bit som skal prosesseres per klokke syklus og<br />

den kombinatoriske veien er kort. Dette tillater en veldig høy bitrate. Det er denne høye<br />

bitraten som gjør at den totale beregningstiden er sammenlignbar med beregningstiden i<br />

parallelle strukturer.<br />

En seriell addisjonskrets adderer to bit <strong>av</strong> gangen <strong>av</strong> tar vare på menten for å bruke den i neste<br />

klokke syklus. En klokke for å markere begynnelsen på ett nytt ord c1, trengs for å nullstille<br />

DFF hvor menten lagres. Se fig.10. En seriell multiplikasjonskrets er mer komplisert fordi alle<br />

bitene i A må multipliseres med alle bitene i B. I denne oppg<strong>av</strong>en har jeg sett på flere ulike<br />

typer multiplikatorer. Seriell-seriell, hvor begge tallene kommer seriellt til multiplikatoren og<br />

parallell-seriell, hvor det ene ordet kommer serielt og det andre i parallell form, noe som er<br />

nyttig i flere typer filtre.<br />

Disse serielle multiplikatorene kan ikke behandle 2' komplementære tall direkte, slik som en<br />

parallel Booth multiplikator, men det er måter å få dette til på som jeg skal vise senere.<br />

Fordeler og ulemper<br />

Parallell og seriell arkitektur er på mange områder fundamentalt forskjellig og dette viser seg i<br />

deres respektive fordeler og ulemper.<br />

8


-Arealbruk<br />

Bitseriell arkitektur kan gi større funksjonalitet på ett begrenset areal. En tilsvarende<br />

funksjonalitet utført med paralell logikk vil ta mye større plass.<br />

-Klokkehastighet<br />

Klokkehastigheten for seriell arkitektur vil være mye høyere enn for parallell. Dette fordi<br />

seriell arkitektur muliggjør mindre logikk per operasjon og ingen bruk <strong>av</strong> mentegjennomstrømnings<br />

logikk.<br />

-Gjennomstrømning (Throughtput)<br />

Der serielle operasjoner krever WL (word lenght) klokkesykluser for å utføre en operasjon,<br />

gjør en parallell operasjon det samme med en klokkesyklus. De bitserielle elementene<br />

arbeider likt på hver bit i ordet, bare underlagt et kontrollsignal c1. De kan derfor lett<br />

'pipelines', for å muliggjøre en høy klokkefrekvens og dermed stor gjennomstrømning.<br />

-Ord lengde<br />

Bitserielle systemer har en fastsatt ord lengde, det er heller ikke lett å operere med flere<br />

ordlengder for intern representasjon. Dette er mye enklere å få til i kretser med en parallell<br />

arkitektur.<br />

-Tilgjengelighet<br />

Verktøy for simulering og konstruksjon er lettere tilgjengelig for paralell logikk enn for<br />

seriell. Det finnes mye mer litteratur om parallell logikk.<br />

-Kommunikasjon<br />

Intern og ekstern kommunikasjon er enklere i ett seriellt system enn for ett parallelt. Dataene<br />

kommer på enkelt ledninger i stedet for på busser, dette gjør det enklere å rute på<br />

brikken og kommunikasjonen med utenverden er ikke begrenset <strong>av</strong> antallet pinner på<br />

brikken. Man får også en mer effektiv bruk <strong>av</strong> ledningene/banene ved å kjøre brikken på<br />

høyest mulig hastighet.<br />

-Effekt forbruk<br />

Effektforbruket i en bitseriell arkitektur er høyere enn for en parallelle arkitektur, grunnene<br />

til dette er raskere bevegelse <strong>av</strong> data. Maskinvaren utnyttes mer effektivt.<br />

-FPGA<br />

En parallell arkitektur innebærer brede busser på brikken, noe som legger beslag på mange<br />

celler i en FPGA. Seriell arkitektur har overvekt <strong>av</strong> lokale forbindelser, og dette gjør den<br />

ideell til bruk i FPGA kretser.<br />

9


Om digitale filtre<br />

I dette kapitlet skal jeg drøfte ulike typer digitale filtre og matematikken rundt disse. 6 Jeg<br />

begynner med å beskrive ulike typer filtre, fordeler ulemper osv. Deretter klargjør jeg en del<br />

begreper, for så å drøfte problematikken rundt det å realisere ett filter. Denne gjennomgangen<br />

<strong>av</strong> filterteori er u<strong>av</strong>hengig <strong>av</strong> hvilken arkitektur som velges i implementeringen.<br />

Digitale filtre skiller seg fra analoge filtre ved at:<br />

Nøyaktigheten er helt bestemt <strong>av</strong> ord lengden og er ikke begrenset <strong>av</strong> usikkerheten i<br />

komponentverdier.<br />

-De er mer holdbare, komponentverdier i analoge filtre endres over tid.<br />

-De er mere forutsigbare, FIR-filtre er for eksempel alltid BIBO stabile.<br />

-De er 100% reproduserbare.<br />

-De kan være programmerbare, for eksempel ved å laste ned nye filter koeffisienter.<br />

Ulempen digitale filtre har over analoge, er forsinkelser i signalgangen, spesielt kan FIR-filtre<br />

ha så store forsinkelser at de ikke egner seg til sanntidssignalbehandling.<br />

Design <strong>av</strong> filtre<br />

Arbeidet med å lage ett filter kan deles opp i fire deler:<br />

-Spesifisering <strong>av</strong> en ideell overføringsfunksjon Hid(z).<br />

-Aproksimering <strong>av</strong> en realiserbar overføringsfunksjon Hre(z) til H(ideel)(z).<br />

-Realisering/valg <strong>av</strong> struktur.<br />

-Implementering.<br />

Spesifisering<br />

Bestemmelse <strong>av</strong> filterets ideelle frekvensrespons, faserespons og andre spesifikasjoner som<br />

største tillatte 'ripple' og 'overshot'.<br />

Aproksimering<br />

Aproksimerer den ideelle overføringsfunksjonen Hi(z), med en realiserbar H(z). H(z) må<br />

tilfredsstille alle kr<strong>av</strong> som er gitt i spesifikasjonen til filteret. Her er først steget å bestemme<br />

seg for å bruke enten ett FIR-filter eller ett IIR-filter. Når filtertype er valgt, er neste steg å<br />

approksimere det realiserbare til det ideele. Det finnes flere ulike approksimasjonsmetoder.<br />

Aproksimasjonsmetodene går i praksis ut på a finne koeffisientene ai og bi i H(z).<br />

Ulike filterstrukturer/realisering<br />

Ett filter med overføringsfunksjon H(z) kan realiseres på mange forskjellige måter, jeg skal<br />

her skissere noen 6 .<br />

Direkte form 1<br />

Uttrykkes H(z) som en differenslikning:<br />

Y(n) = biX(n-i) - ai Y(n-i) ,<br />

kan formen taes direkte fra likningen:<br />

10


Fig 1.<br />

Denne strukturen består <strong>av</strong> to halvdeler hvor resultatet legges sammen.<br />

Direkte form 2<br />

Uttrykkes H(z) som ett produkt <strong>av</strong> to overføringsfunksjoner H1(z) og H2(z):<br />

H(z) = H1(z) H2(z) = [1/(1+biX(n-i))] [ai(n-i)]<br />

H1(z) = W(z)/X(z) , H2(z) = Y(z)/W(z)<br />

Uttrykt ved diff:<br />

W(n) = X(n) -ai W(n-i) ,Y(n) = bi W(n-i)<br />

Dette gir en struktur hvor de to halvdelene i som utgjør Direkte-Form I er byttet om. De to<br />

grenene kan nå dele forsinkelseselementer og ett filter på denne formen utnytter derfor<br />

maskinvaren mer effektivt.<br />

Filteret kan nå realiseres direkte som i fig 2:<br />

11


Fig 2.<br />

Begge disse løsningene er enkle å implementere fordi filterets form kan finnes direkte <strong>av</strong><br />

diffrensiallikningen, og koeffisientene i multiplikatorene er identisk med koeffisientene i<br />

likningene H(z).<br />

Kaskadeform<br />

IIR-filtre blir, som jeg skal vise senere, mer følsom for kvantiseringsfeil i koeffisientene når<br />

filterets orden øker. Det er derfor vanlig å bryte ett IIR-filter ned i 1. og 2. ordens subfiltre.<br />

Dette gjøres ved å faktorisere H(z) slik at H(z) kan uttrykkes ved en produktrekke:<br />

H(z) = Hi(z)<br />

Der Hi(z) er ett 1. eller 2. ordens ledd<br />

Dette gir en kaskade struktur, som vist i fig . 3<br />

Fig 3.<br />

H(z) kan også deles opp i partielle fraksjoner, slik at H(z) kan uttrykkes som en sum <strong>av</strong> 2.<br />

ordens polynomer:<br />

(z) = Hi(z).<br />

Dette gir en parallell struktur som i fig 4.<br />

12


Fig 4.<br />

I en parallell struktur er det likegyldig hvilken rekkefølge subfiltrene står i, mens i en seriell<br />

struktur er rekkefølgen viktig. I begge tilfeller må det vurderes nøye hvilke røtter som skal<br />

kombineres i subfiltrene. En filterseksjon med høy forsterkning øker behovet for skalering.<br />

Økt skalering gir økt kvantiseringsfeil. For at forsterkningen i hver seksjon skal bli minst<br />

mulig, bør nullpunktene og polene grupperes på en sånn måte at effekten <strong>av</strong> polene blir minst<br />

mulig.<br />

Størrelsen |H(z)| er forholdet mellom nullpunktsvektorene og polvektorene. Polvektorer som<br />

ligger nær enhetssirkelen |z| = 1 blir små og gir derfor stor forsterkning. Reglen for gruppering<br />

<strong>av</strong> poler og nullpunkter er da å velge nullpunkter som ligger nærmest polen, og å begynne<br />

med den polen som ligger nærmest enhetssirkelen.<br />

Rekkefølgen <strong>av</strong> subfiltrene i en seriell struktur er viktig. Plasseres det filterleddet med størst<br />

forsterkning først, øker dette behovet for skalering. Plasseres det sist, vil det bidra til å<br />

forsterke støyen fra alle tidligere filterledd og gi ett dårligere signal/støy forhold.<br />

FIR Lattice<br />

Ved hjelp <strong>av</strong> gjentatt rekursjon <strong>av</strong> H(z) kan vi få en struktur som vist nedenfor:<br />

Fig 5.<br />

hvor er figuren??<br />

13


IIR-filtre<br />

IIR-filtre kan sees på som den digitale ekvivalenten til analoge filtre, da de begge gjør bruk <strong>av</strong><br />

tilbakeføring 9 .<br />

Alle filtre som er drøftet her er LSI (Linear Shift Invariant). De kan beskrives med deres<br />

overføringsfunksjoner H(z). H(z) er forholdet mellom utgangen Y(z) og inngangen X(z):<br />

H( z)<br />

Denne er vanligvis reel og kan uttrykkes som forholdet mellom to polynomer:<br />

H( z)<br />

der er n er filterets orden.<br />

Filterkoeffisientene aj og bj bestemmer filterets egenskaper.<br />

I z-domenet er z^-n ensbetydende med en forsinkelse n, likningen ovenfor kan derfor<br />

uttrykkes med differenslikningen:<br />

aN y((n+N)T) + aN-1 y((n+N-1)T) +. a0 y(nT)=<br />

bM x((n+M)T) + bM-1 x((n+M-1)T)+b0 x(nT).<br />

Filterlikninger på denne formen er spesielt nyttige da de forteller noe om strukturen filteret<br />

vil få.<br />

Y( z)<br />

<br />

X<br />

( z)<br />

b0 b1 z 1 <br />

.... bn z n <br />

<br />

1 a1 z 1 <br />

.... a z n <br />

....<br />

<br />

<br />

Når ett digitalt filter designes, bestemmes først spesifikasjonene til det filtre man ønsker å<br />

lage, dette kan være cuttoff frekvens, hvor 'skarpt' filteret skal være, største tillatte 'overshot',<br />

faseresponsen osv. Vi kan kalle overføringsfunksjonen for dette ideelle filteret for Hid.<br />

Utfordringen er nå å finne en realiserbar H(z) som er mest mulig lik Hid. Her finnes det flere<br />

metoder og jeg skal beskrive to <strong>av</strong> dem, Standard Z-transformering og Bilineær Ztransformering.<br />

IIR-filtre har poler og nullpunkter som ett analogt filter og det er derfor mulig å ta<br />

utgangspunkt i analoge filtre. Dette er en todelt tilnærming, hvor det første steget er å velge et<br />

analogt filter, med en overføringsfunksjon H(s), som er mest mulig lik overføringsfunksjonen<br />

til det filteret vi ønsker, Hid. Steg to er å digitalisere dette filteret, for å danne en digital<br />

overføringsfunksjon H(z). H(z) vil ha like mange poler og nullpunkter som H(s) (samme<br />

orden). Fordelen med denne metoden er at vi kan ta i bruk en rekke kjente analoge filtere med<br />

velkjente egenskaper, som feks. Butterworth og Chebychev.<br />

Digitaliseringen <strong>av</strong> den analoge overføringsfunksjonen H(s) er ingen 'rett frem' prosedyre,<br />

H(s) er ikke periodisk, mens H(z) er periodisk langs frekvensaksen w med periode ws.<br />

14


H(s) er stabil i området til venstre for Im-aksen i s-planet, H(z) er stabil innenfor<br />

enhetssirkelen |z| ws/2, er det digitale filteret identisk med det kontinuerlige, men dette<br />

kr<strong>av</strong>et er jo i praksis aldri oppfylt.<br />

Generelt kan det sies at hvis filterets orden er stor og wcutoff


Eller motsatt:<br />

Z = (1-s)/(1+s).<br />

Det kan vises 6 at denne transformasjonen overfører hele den negative (og stabile) siden <strong>av</strong> splanet<br />

til området innenfor enhetssirkelen i z-planet. Det er åpenbart at denne<br />

transformasjonen vil føre til en forvrengning <strong>av</strong> frekvens-skalaen og det kan lages ett utrykk<br />

for forvrengningen ved å sette s = jw inn i utrykket ovenfor:<br />

jw = (e^jwT - 1)/(e^iwT + 1).<br />

Utrykt ved det analoge filterets cutoff-frekvens wc og det digitale filterets cutoff-frekvens qc<br />

og ved å anvende Eulers formel får vi utrykket:<br />

wc = tan(qcT)/2 .<br />

Dette utrykket er langt fra lineært. Frekvensen til den transformerte H(z) <strong>av</strong>viker sterkt fra det<br />

linære når qc er en betydelig del <strong>av</strong> ws. Dette <strong>av</strong>viket må kompenseres for når H(z) skal<br />

dannes med bilineær z-transformering. Ved kritiske frekvenser, for eksempel ved cutofffrekvensen,<br />

er det mulig å 'pre-warpe' ved å sette wc = tan(qcT/2) inn i den analoge<br />

prototypen.<br />

Bilineær z-transformasjon er en algebraisk substitusjon som er lett å utføre. Den overfører<br />

amplitude-frekvenskarakteristikken direkte, fra det analoge filteret til det digitale, men med en<br />

forskyvning <strong>av</strong> frekvensaksen som resultat. Kritiske frekvenser forskyves med en forskyvning<br />

som lett å beregne og som kan kompenseres med 'prewarping'.<br />

Frekvensresponsen til det analoge filteret må kunne deles opp i områder der det er tilnærmet<br />

konstant for at metoden med 'prewarping' skal kunne benyttes. Kan ikke H(s) deles opp i<br />

områder på denne måten må standard z-transformasjon benyttes.<br />

En annen metode for å tilnærme H(s) med en digital H(z) er å finne koeffisientene aj og bj ( i<br />

polynomutrykket til H(z)) ved å numerisk tilnærme polynomene til H(s), og her finnes det ett<br />

utall metoder og mye programvare er tilgjengelig for dette.<br />

Stabilitet<br />

Hvis polene er godt innenfor enhetssirkelen, er filteret stabilt. Hvis polene til H(z) ligger<br />

nærme enhetssirkelen |z| =1, må vi være forsiktig så ikke kvantiseringsfeil flytter polene<br />

utenfor det stabile området. Dette gjelder spesielt hvis IIR-filteret skal inngå som en del <strong>av</strong> ett<br />

adaptivt filter, hvor koeffisientene kan forandres under kjøring. Risikoen for ustabilitet legger<br />

16


føringer for filterkoeffisientene som det må taes hensyn til i designet <strong>av</strong> alle typer IIR-filtre 6 .<br />

En måte å analysere dette på er å undersøke hvordan polene til H(z) beveger seg i z-planet,<br />

når koeffisientene kvantifiseres med ulik nøyaktighet. Det kan lages ett mål på dette ved å<br />

beregne forandringen i en pol dpi mot forandring i filter koeffisientene, dak.<br />

H(z) kan faktoriseres og skrives som:<br />

H( z)<br />

n<br />

1 ni z<br />

i 0<br />

1 <br />

1 pi z 1 <br />

<br />

<br />

<br />

p<br />

Der ni er filterets nullpunkter og pi er filterets poler.<br />

For ett filter realisert med direkte-form er filteret karakterisert med filterkoeffisientene ak og<br />

bk og vi kan beregne den deriverte direkte:<br />

dpi/dak = sum[dpi/dak]<br />

og vi får ett uttrykk for dpi:<br />

dpi = -sum[(pi^(-k+1) dak)/prod[(1-pjpi^-1)] (j |= i).<br />

Denne likningen gir ett mål for polenes følsomhet i forhold til små forandringer i<br />

filterkoeffisientene, dak.<br />

Når polene til filteret ligger svært tett, går utrykket i nevneren (1-pj/pi) mot null og filteret blir<br />

spesielt følsomt for kvantiseringsfeil. Det kan vises 6 at polene ligger tettere når forholdet w/fs,<br />

der w er filterets virkeområdet og fs samplefrekvensen, blir mindre. Likningen ovenfor viser<br />

også at polene blir mer følsomme jo høyere orden filteret har.<br />

Høy samplefrekvens og høy orden øker altså kr<strong>av</strong>et til nøyaktighet i filterkoeffisientene, det<br />

er derfor ikke vanlig å realisere filteret i direkte form. Vanligvis deles filteret H(s), opp i<br />

mindre subfiltre før digitaliseringen. Subfiltrene kan så settes sammen i kaskade eller parallell<br />

form.<br />

17


FIR-filtre<br />

FIR-filtre er en klasse <strong>av</strong> digitale filtre som ikke benytter seg <strong>av</strong> tilbakeføring, det er altså ett<br />

ikke-rekursivt filter. En impuls på inngangen, etterfulgt <strong>av</strong> nuller, vil derfor dø ut <strong>av</strong> seg selv,<br />

der<strong>av</strong> betegnelsen 'endelig impulsrespons'. FIR-filteres overføringsfunksjoner er karakterisert<br />

ved at de bare har nullpunkter og at eventuelle poler er lokalisert på origo, der de ikke har<br />

noen effekt på amplituderesponsen. Ett analogt filter kan ikke ha flere nullpunkter enn poler,<br />

FIR-filtre har derfor ingen analog ekvivalent 9 . FIR-filtre er alltid stabile og de er derfor ideelle<br />

som utgangspunkt for adaptive filtre. Stabiliteten til FIR-filtre gjør at de er mindre følsomme<br />

for kvantiseringsfeil i filterkoeffisientene. En annen fordel disse filtrene har er at de lett kan<br />

realiseres med en linær faserespons, som jeg skal vise nedenfor. Ulempen med FIR-filtre er at<br />

de krever mange filter-ledd for å få til en skarp overgang i frekvensresponsen. Jeg skal<br />

begrense diskusjonen om FIR-filtre til filtre med linær fase. Disse filtrene kan skrives på polar<br />

form som :<br />

H(w) = |H1(w)|e^f(w).<br />

Der |H1(w)| er en reel funksjon <strong>av</strong> w, og f(w) er linær. Om filteret har linær faserespons eller<br />

ikke <strong>av</strong>henger <strong>av</strong> symmetrien til H. Filtere har vanligvis like symmetri dvs. filteret har orden<br />

N = 2M+1 og h(2M - k) = h(k).<br />

Frekvensresponsen til denne type filter er:<br />

H(w) = e^(-jMw) Re[sum(h(k)e^-jkw)]<br />

Konstruksjonen <strong>av</strong> ett FIR-filter begynner, som for IIR-filtre, med å definere en ønsket<br />

overføringsfunksjon, Hideel(w), og deretter approksimere en realiserbar H(z) som tilfredsstiller<br />

kr<strong>av</strong>ene til filtret. Selve approksimeringen gjøres med dataprogrammer basert på FFT og jeg<br />

skal drøfte teorien bak en metode som involverer bruk <strong>av</strong> funksjoner kalt ’vinduer’.<br />

FIR er et digitalt filter med endelig impulsrespons.<br />

Dette kan uttrykkes ved H(z) med ai = 0 for alle i:<br />

<br />

H( z)<br />

b0 b1 z 1 <br />

.... bn z n <br />

....<br />

<br />

Utrykt ved differens likningen:<br />

Y(nT) = b(0) x(nT) +b(1) x((n-1)T) +.b(m) x((n-m)T) , der b(m) er den m'te impulsresponsen,<br />

dette filteret har m+1 impulsresponsledd.<br />

H(z) = sum[ajz^-1] = sum[h(k)z^-1] k=0 til N-1<br />

Filteret er <strong>av</strong> orden N.<br />

Frekvensresponsen er :<br />

H(f) = sum[h(k)e^-jkT].<br />

Frekvensresponsen er altså bare fouriertransformasjonen <strong>av</strong> filterkoeffisientene og<br />

filterkoeffisientene finnes ved å danne den inverse fouriertransformasjonen <strong>av</strong> Hid(w). Den<br />

18


ønskede overføringsfunksjonen er Hid(w), denne kan representeres <strong>av</strong> DFT med<br />

Hid(w) = sum[hd(k)e^-ikt] fra +/- uendelig<br />

Der sekvensen {hid(k)} er Hid(w)'s impulsrespons.<br />

Vindu metoden<br />

Velges h(k) = hid(k) for alle k og filterets orden går mot uendelig, blir H(z) = Hid(w). For å<br />

danne en realiserbar H(z) må den uendelige sekvensen {hid(k)} <strong>av</strong>kortes.<br />

Impulsresponsene til Hi(z), hi(n) er gitt ved den omvendte Fouriertransformasjonen:<br />

h( i)<br />

<br />

<br />

Hid <br />

<br />

<br />

Sekvensen {h(n)} består <strong>av</strong> uendelig mange ledd og vindumetoden går ut på å <strong>av</strong>korte til ett<br />

antall ledd N som man multipliserer med en vindu funksjon w(n).<br />

H(n) = w(n)h(n), der -M < n < M<br />

FIR-filteret blir <strong>av</strong> lengde N=2M+1.<br />

FIR-filterets frekvensrespons blir da:<br />

<br />

H e i<br />

H e i<br />

Et mål på hvor godt denne aproksimerer den ideelle Hi() får vi ved å se på<br />

'mean-square error' ^2:<br />

<br />

FFT <strong>av</strong> en vindu-funksjon danner en kurve med en sentral hovedlobe og flere mindre<br />

sidelober, symmetrisk om origo.<br />

Det sentrale i teorien om dannelse <strong>av</strong> en realiserbar H(z) på denne måten, er å se hvilken<br />

effekt formen på vindusfunksjonen w(k) har på frekvensresponsen til H(z). Effekten <strong>av</strong> å<br />

multiplisere med ett vindu i tidsdomenet er en konvulsjon i frekvensdomenet.<br />

2<br />

<br />

Hid H e <br />

<br />

i <br />

2<br />

<br />

<br />

Hid<br />

d<br />

<br />

Dette gir :<br />

e in<br />

H(z) = int[Hid(w)W(w)]<br />

in<br />

d<br />

M<br />

h( n)<br />

e<br />

n M<br />

in <br />

M<br />

h( n)<br />

e<br />

n M<br />

in <br />

<br />

<br />

Der W(w) er den fouriertransformerte <strong>av</strong> w(k).<br />

19


W(w) for det rektangulære vinduet er :<br />

W(w) = sin(Nw/2)/sin(w/2) .<br />

Fig 6.<br />

Hovedloben blir smalere og høyere jo flere ledd N, i {hid(k)}, som tas med, amplituden på<br />

sidelobene varierer ikke nevneverdig med N, men frekvensen <strong>av</strong> dem øker. Når N - ><br />

uendelig går W mot deltaimpulsfunksjonen (0) og H(z) = Hid(). Effekten <strong>av</strong> en konvulsjon<br />

med w(k) kan leses direkte <strong>av</strong> plottet <strong>av</strong> W. Bredden <strong>av</strong> den sentrale hovedloben, vil glatte ut<br />

skarpe overganger i Hid() og sidelobene vil gi oscillasjoner i H(z), kalt Gibbs fenomen. Gibbs<br />

oscillasjon kan gi filteret en 'overshot' ved overganger i amplituderesponsen, som kan gjøre<br />

filteret ubrukelig. Utglattingen <strong>av</strong> frekvensresponsen henger sammen med filterets orden og<br />

vinduets oppløsning som er definert med:<br />

R = |hovedloben bredde|/|1.sidelobes bredde|.<br />

Hovedlobens bredde er et mål for hvor skarpt filteret er. For dette vinduet er bredden b =<br />

2/N. Felles for alle vindufunksjonene er at bredden er proporsjonalt med 1/N. Det kan vises 6<br />

at dette vinduet minimaliserer ^2, men dette filteret gir store oscillasjoner i signalet (ripple)<br />

og 'overshot' ved overganger i Hi(). Det kan vises 6 at den relative amplituden til sidelobene<br />

ikke reduseres nevneverdig med økende N. Derfor brukes alltid andre vinduer, som har bedre<br />

egenskaper.<br />

De viktigste egenskaper til ett vindu er hovedlobens bredde og størrelsen på sidelobene. Det<br />

finnes en rekke vinduer som kan brukes. De tre kritiske parameterene i ett FIR-filter design er<br />

filterets størrelse (orden N), skarpheten i overgangene, som bestemmes <strong>av</strong> hovedlobens<br />

bredde (oppløsning R) og hvor stor oscillasjon som kan godtas, bestemt <strong>av</strong> amplituden til<br />

sidelobene. Disse parameterene er delvis forbundet med hverandre og er ofte motstridene<br />

kr<strong>av</strong>. Hvilket vindu som velges er helt <strong>av</strong>hengig <strong>av</strong> hvilke kr<strong>av</strong> som er gitt til designet. Felles<br />

for vindu funksjonene er at større dempning i sidelobene oppnås på bekostning <strong>av</strong><br />

oppløsningen. De viktigste vindu funksjonene er Hanning, Bralett, Kaisser og Chebyshev. For<br />

eksempel har Kaisser en veldig variabel form, der oppløsningen kan byttes mot størrelsen på<br />

sidelobene.<br />

Problemstillingen med dannelse <strong>av</strong> ett FIR-filter er altså å finne ett filter som akkurat<br />

tilfredsstiller kr<strong>av</strong>ene, med færrest mulige filterkoeffisienter. Skulle dette hvert gjort for hånd<br />

20


ville man prøvd ut flere ulike vinduer, helt til man fikk det beste resultatet.<br />

I praksis brukes algoritmer som Remez. Remez baserer seg på en iterativ prosess, der<br />

filterkoeffesientene justeres helt til resultatet er optimalt med l<strong>av</strong>est mulig orden men innenfor<br />

kr<strong>av</strong>ene. Parameterene som gis til en algoritme <strong>av</strong> denne typen er filterets orden N, maksimalt<br />

tillatte oscillasjoner i frekvensbåndene og påkrevet dempningen i stoppbandet.<br />

Frekvensvinduer<br />

Mens den foregående metoden multipliserte ett utvalg impulsresponser <strong>av</strong> Hi() med ett<br />

vindu i tidsdomenet, gjøres med denne metoden et utvalg <strong>av</strong> Hi i et frekvensområdet [-F,<br />

F] og dette multipliseres med ett frekvensvindu. Mye <strong>av</strong> diskusjonen rundt tidsvinduer gjelder<br />

også her, multiplikasjonen med et vindu i frekvensdomenet gir opph<strong>av</strong> til konvulsjon i<br />

tidsdomenet og fenomener som 'ripple' og 'overshot' oppstår. I praksis så løses problemet ved<br />

å approksimere Hi() med ett polynom. Dette polynomet interpolerer verdiene mellom<br />

frekvenssamplene.<br />

Minimax<br />

I vindumetoden forsøker man å minimalisere feilen ^2 (mean-sqr error.)<br />

Med Minimax minimaliseres den maksimale feilen, altså:<br />

||Hi-Hr|| = max|Hi() - Hr(e^i)| over alle <br />

Utfordringen er nå å finne Hr(z) = hr(k)z^-k , -M < k < M<br />

som minimaliserer denne feilen.<br />

Dette løses numeriske.<br />

21


Bitserielt bibliotek<br />

I en seriell krets, kommer dataene en bit <strong>av</strong> gangen på en ledning, i stedet for ett ord <strong>av</strong><br />

gangen på en buss <strong>av</strong> samme bredde som ordlengden. All kommunikasjon mellom<br />

prosesseringselementene og innad i elementene skjer altså på en ledning. Fordelene med dette<br />

er innlysende, fr<strong>av</strong>æret <strong>av</strong> brede busser på brikken muliggjør en tett VLSI design og<br />

kommunikasjonen mellom brikkene forenkles. Bitserielle prosesseringselementer er også<br />

mindre enn et tilsvarende utført i parallell logikk. Dette gjør en bitseriell design attraktiv i<br />

systemer der hastighetskr<strong>av</strong> ikke krever en parallell prosessering. Dette gjelder spesielt tale<br />

systemer, som telefoni. Hastighet er l<strong>av</strong>ere for en seriell krets som prosesserer en bit <strong>av</strong><br />

gangen, ved første øyekast er parallell prosessering N ganger raskere, der N er ordlengden.<br />

Men en bitseriell implementering kan klokkes mye raskere på grunn <strong>av</strong> kortere logisk vei<br />

mellom registrene. En parallell adder for eksempel kan ikke klokkes raskere enn at menten<br />

rekker å bevege seg gjennom hele adderen.<br />

Seriell arkitektur.<br />

Målet med denne oppg<strong>av</strong>en er å lage et sett <strong>av</strong> vanlig brukte funksjoner utført i seriell logikk,<br />

utgangspunktet mitt var de elementene som var foreslått i boka 'VLSI SIGNAL<br />

PROCESSING : A bitserial approach' 8 .<br />

Jeg presenterer her elementene med kretsskjema og en verilog modell. Verilog modellene er<br />

simulert på PC på 'logisk nivå' dvs. uten hensyn til forsinkelser i portene. En mer nøyaktig<br />

spice simulering er nødvendig for å bestemme hvor raskt man kan klokke disse elementene.<br />

Elementer som DFF (dflipflop), FA (full adder), MUX (multiplekser), FIFO-registre er<br />

standard celler og jeg modellerer bare deres oppførsel. Bibloteket er tenk mest mulig<br />

teknologi u<strong>av</strong>hengig.<br />

Som nevnt ovenfor kreves bare to kontrollsignaler, bitklokke c0 og ordklokke c1.C1 skal<br />

tilkjennegjøre begynnelsen på et nytt ord og fordi datastrømmen forsinkes i ulik grad gjennom<br />

elementene, har jeg valgt å la c1 gå gjennom ett signalnettverk med like mye forsinkelse som<br />

elementet. Et alternativ er å la kontrollgeneratoren danne alle c10, c12 osv. Her kan det spares<br />

en del DFF i kretsene før et endelig utlegg skal lages.<br />

Nummerrepresentasjonen er tokomplementere tall med LSB først og MSB sist.<br />

Fordelen med denne representasjonen er at addisjon og subtraksjon går riktig for seg uten å<br />

kjenne fortegnet på forhånd. Ulempen viser seg i de kretser der resultatet ikke kan bestemmes<br />

før fortegnet er kjent, som i multiplikatoren.<br />

Tallrepresentasjon<br />

Dataene kommer altså på en ledning LSB først og MSB sist. Kretsene er designet for å<br />

behandle data uten buffring, dvs. dataene kommer rygg mot rygg inn til modulene.<br />

Før jeg kunne begynne dette arbeidet måtte jeg bestemme meg for hvordan tallene skulle<br />

representeres. Data og koeffisienter i ett signalbehandlingssystem er alltid signerte tall, og en<br />

vanlig måte å angi tegnet på er ved å definere MSB som fortegnsbiten. MSB gis negativ vekt<br />

og de resterende bitene representerer størrelsen på tallet.<br />

To vanlig brukte representasjoner er 1'komplement og 2'komplement, de representerer begge<br />

tall i området -1 =< X < 1.Større tallområde er mulig ved å skalere denne representasjonen<br />

22


med en faktor 2^k, der k er det ønskede antallet heltallsbiter. Faktoren 2^k kaller jeg heretter<br />

. bestemmer det dynamiske området til X dvs. at |X| = 0 og kommer ut uforandret ut hvis x < 0.<br />

Hvis tallet er negativt må vi strengt tatt legge til 1, etter at tallet er invertert. Dette kan gjøres<br />

ved å sette inn en adder etter inverteringen. Denne adderen har inngang b jordet og carry-inn<br />

satt til 1 ved c11=1. Om man trenger dette eller ikke er <strong>av</strong>hengig <strong>av</strong> hvilken nøyaktighet som<br />

kreves.<br />

Begge varianter er vist nedenfor.<br />

Helt tilslutt er det en DFF på utgangen.<br />

23


Forsinkelsen i denne kretsen er swl+2 for den uten adder og swl+3 for den med.<br />

Fig 7.<br />

Fig 8. Absolutt uten adder:<br />

Fig 9.Absolutt med adder:<br />

Verilog modell:<br />

abs #(swl)(out,c0,c1,in).<br />

In = inngangssignal.<br />

Out = utgangssignal.<br />

Kontrollsignaler c0,c1.<br />

Parameter swl = ordlengde.<br />

Forsinkelse swl+2.<br />

24


module abs(out,clk,wclk,in);<br />

parameter swl=9;<br />

output out;input clk,wclk,in;<br />

wire [swl-1:0] reg_out;<br />

shift_reg #(swl+1)r(reg_out,clk,in);<br />

latch l(l_out,wclk,reg_out[swl-1]);<br />

not<br />

(Nl_out,l_out),<br />

(Nreg_out,reg_out[1]);<br />

and<br />

(A0,Nreg_out,l_out),<br />

(A1,reg_out,Nl_out);<br />

or (out,A0,A1);<br />

endmodule<br />

Fig.10 Absolutt <strong>av</strong> en sinus.<br />

140<br />

120<br />

100<br />

80<br />

60<br />

40<br />

20<br />

0<br />

sampel<br />

ADDER<br />

abs<br />

Legger sammen to tall A og B. f(A,B) = A+B.<br />

Addisjonen foregår i en tre bit's fulladder. Summen lagres i DFF1, og menten lagres i DFF2<br />

og føres tilbake til fulladderen. Menten forsinkes i DFF2 slik at den legge til i neste addisjon,<br />

hele veien opp til fortegnsbiten. Når c1 signaliserer ankomsten <strong>av</strong> neste ord, kanselleres<br />

menten.<br />

2's komplementær representasjon brukes nettopp fordi tallene kan adderes direkte u<strong>av</strong>hengig<br />

<strong>av</strong> fortegnet.<br />

abs<br />

25


Eksempel:<br />

Swl=5.<br />

A = 5 => 00101<br />

B = 10 => 01010<br />

Sum = 15 => 01111<br />

A = 5 => 00101<br />

B = -7 => 11001<br />

Sum = -2 => 11110<br />

A = 10 => 01010<br />

B = 10 => 01010<br />

Sum = -2 => 10100 !<br />

Det andre eksemplet viser hvordan 2'komplementær representasjon virker når vi adderer et<br />

positivt tall med ett negativt. Summen i det siste eksemplet overflyter, summen 10 + 10 ble -<br />

2, ett negativt tall. En <strong>av</strong> utfordringene med design <strong>av</strong> digitale kretser er nettopp å passe på at<br />

signalene ved alle noder i kretsen ligger innenfor det tillatte dynamiske området. Verken<br />

adderen eller subtraktoren kan <strong>av</strong>korte eller <strong>av</strong>runde resultatet slik som multiplikatoren. Vi må<br />

ta hensyn til bit-veksten ved å skalere dataene A og B, eller begrense (klippe) størrelsen på<br />

dataene med LIMIT, som jeg skal beskrive senere.<br />

ADD har tre innganger A, B og Cin, to utganger Sum og Cout, og bruker to kontroll signaler c0<br />

og c1.<br />

Cin og Cout er tatt med for at man skal kunne lage en dobbelpresisjons-adder, fig. 11.<br />

I en dobbelpresisjons adder er Cin i den første adderen jordet, Cout fra denne føres inn til Cin<br />

på den neste osv. LW går in på den første adderen, HW på den neste. På denne måten kan vi<br />

operere med økt dynamisk område internt i en krets. Å representere dataene med dobbel<br />

presisjon enkelte steder i kretsen, kan være nødvendig for å hanskes med bitveksten etter<br />

enkelte operasjoner.<br />

Kontrollsignalet c1 styrer enten menten fra en tidligere addisjon eller Cin, inn i fulladderen.<br />

Adder elementene kan også brukes til å lage kolonne addere. Disse er nyttige for å legge<br />

sammen flere enn to signaler. En kolonne adder er en tre-struktur <strong>av</strong> serielle addere som vist i<br />

fig.12. Kolonne adderen i fig. 12 adderer 7 signaler, A,B,C,D,E,F og G. Resultatet kommer på<br />

Sum_Out, etter en forsinkelse på 3.<br />

Hver adder kombinerer to innganger til en utgang, dermed halveres antall signaler for hvert<br />

lag <strong>av</strong> addere. Hvis antallet signaler er odde, leveres en inngang til neste lag gjennom en DFF<br />

for synkronisering. Summen har like mange biter som inngangene, det er derfor nødvendig<br />

med 'guard bits' på inngangene. For å forhindre overflyt, må det være en 'guard bit' for hvert<br />

lag med addere.<br />

26


Fig 11.<br />

Fig 12 ADD celle.<br />

Fig 13.Dobbel presisjonsadder.<br />

27


Fig. 14. Kolonne adder.<br />

Verilog modell:<br />

add (Sum,Cout,c0,c1,A,B,Cin);<br />

A,B = inngangsdata.<br />

Sum = utgangsdata.<br />

Cin,Cout = mente inn/ut.<br />

c0,c1 =kontrollsignaler.<br />

Forsinkelse på Sum = 1.<br />

module add(sum,c_out,c0,c1,a,b,c_in);<br />

output sum,c_out;input c0,c1,a,b,c_in;<br />

multiplex m1(ci,c1,c_out,c_in);<br />

full_adder fa(si,carry,a,b,ci);<br />

dEdgeFF dff1(c_out,clk,carry);<br />

dEdgeFF dff2(sum,clk,si);<br />

endmodule<br />

SUBTRAKT<br />

Trekker B fra A.f(A,B) = A-B.<br />

Denne kretsen er nesten lik adderen, med den forskjell at B inverteres og 1 legges til på LSB.<br />

Kjernen i kretsen er en tre bits fulladder, en multiplekser styrer menten tilbake til fulladderen.<br />

Når c1 signaliserer nytt ord kanselerer den menten og setter Cin lik 1 for å tilfredstille<br />

konvensjonen -B = inv(B) + 1. Det brukes to DFF, en til menten og en på utgangen. En NOT<br />

port inverterer B.<br />

SUB har tre innganger A, B og Cin.Utganger Diff og Cout.Cin og Cout kan brukes til å lage<br />

subtraktorer med større presisjon eller kolonne subtraktorer.<br />

Cin settes alltid til 1 i den første enheten.<br />

Kretsen kan også brukes til å negere ett tall f(B) = -B, ved å jorde A.<br />

28


Fig 15.<br />

Fig. 16. SUB celle.<br />

Verilog modell:<br />

sub(Diff,Cout,c0,c1,A,B,Cin);<br />

A,B = inngangsdata.<br />

Diff = utgangsdata.<br />

Cin,Cout = mente inn, mente ut.<br />

c0,c1 = kontrollsignaler.<br />

Forsinkelse = 1.<br />

module serial_sub(sum,c_out,c0,c1,a,b,c_in);<br />

output sum,c_out;<br />

input c0,c1,a,b,c_in;<br />

multiplex m1(ci,c1,c_out,c_in);<br />

not (nb,b);<br />

full_adder fa(si,carry,a,nb,ci);<br />

dEdgeFF dff1(c_out,c0,carry);<br />

dEdgeFF dff2(sum,c0,si);<br />

endmodule<br />

29


DSHIFT<br />

Aritmetisk høyreskift. Kretsen skifter A p plasser til høyre. f(A) = A / 2^p. Med positive tall<br />

ville dette hvert enkelt, vi kunne brukt en DFF og en multiplekser i signalveien som satt MSB<br />

til null. Men for 2'komplimentere tall må vi 'redde' fortegnsbiten MSB og så fortegnsutvide<br />

ved å sette de p øverste bitene lik MSB.<br />

Eksempel:<br />

Swl = 6<br />

A = -19 => 101101<br />

p = 1 , f(A) = 110110<br />

p =2 , f(A) = 111011<br />

Resultatet kommer ut <strong>av</strong>kortet med p biter.<br />

Operasjonen gjøres ved å sette en multiplekser i signalveien som styrer signalet til utgangen,<br />

eller setter utgangen til MSB. c1 styrer multiplekseren og lagringen <strong>av</strong> MSB. Selve<br />

høyreskiftingen <strong>av</strong> A gjøres ved å definere forsinkelsen til swl = 2 +p, der 2 er kretsens 'reelle'<br />

forsinkelse. Forsinkelsen p er ikke en fysisk forsinkelse i den forstand at signalet forsinkes <strong>av</strong><br />

DFF i signalveien, men er en redefinering <strong>av</strong> hvor signalet starter og hvor det ender.<br />

Kretsen er altså bygget rundt en multiplekser som sender enten signalet eller MSB gjennom.<br />

Signalet går først inn i DFF1, ved c1 lagres denne i en DFF2. Ett kontrollsignal til<br />

multiplekseren styrer den lagrede MSB gjennom ved c11,c12 c1p.Forsinkelses linjer <strong>av</strong> DFF<br />

genererer dette signalet.<br />

Fig. 17.<br />

Fig. 16. DSHIFT celle.<br />

30


I fig.18 er vist to forsinkelseslinjer for p=2 og p=3.<br />

Generelt trengs p DFF og en OR port med p innganger. I fig. 17 er signalene vist for p=2 og<br />

p=3.<br />

Fig. 17. Kontroll signaler. Fig 18.<br />

Verilog modell:<br />

dshift #(p)(out,c0,c1,in);<br />

In = inngangsdata.<br />

Out = utgang.<br />

c0,c1 = kontrollsignaler.<br />

Parameter p = antall høyreskift.<br />

Forsinkelse = 2+p.<br />

module dshift(out,c0,c1,in);<br />

output out;<br />

input c0,c1,in);<br />

multiplex m1(m_out,c_m,s_1,s_2);<br />

dEdgeFF dff1(s_1,c0,in),<br />

dff2(s_2,c1,s_1),<br />

dff3(out,c0,m_out),<br />

dff4(c_11,c0,c1),<br />

dff5(c_12,c0,c_11);<br />

or (c_m,c_11,c_12);<br />

endmodule<br />

31


MSHIFT<br />

Aritmetisk venstreskift. Kretsen skifter A p plasser til venstre. f(A) = A * 2^p. I DSHIFT<br />

måtte MSB lagres og settes inn på rett sted i signalet, her trenger vi bare å skifte tallet p<br />

plasser til venstre og sette de p nederste bitene til null.<br />

Eksempel:<br />

Swl=6.<br />

A = 13 => 001101<br />

p = 1 , A = 26 => 011010<br />

p = 2 , A = -12 => 110100 Overflyt!<br />

A = -5 => 111011<br />

p = 1 , A = -10 => 110110<br />

Overflyt forekommer når de p+1 mest signifikante bitene er ulike før en skift operasjon. I<br />

kretsen jeg beskriver her er det ingen overflytsdetektor, men det kan legges inn ved å teste de<br />

p+1 mest signffikante bitene. Selve skift operasjonen foregår ved å definere en forsinkelse p.<br />

For å unngå å få en primitiv med negativ eller null forsinkelse legges p+1 DFF på utgangen,<br />

slik at forsinkelsen totalt blir 1.<br />

En multiplekser styrer signalet gjennom eller setter det til null. Signalet settes til null fra LSB<br />

og opptil p-1. Multiplekseren styres <strong>av</strong> en forsinkelseslinje med lengde p, og som har c1 på<br />

inngangen.<br />

Fig 19.<br />

Fig. 20. mshift.<br />

32


For kretsen i fig. 20 er p = 2, det er satt på 3 DFF for at den totale forsinkelsen skal bli lik 1.<br />

En DFF må alltid stå foran MUX for å hindre at LSB overskrives.<br />

Verilog modell:<br />

mshift #(p)(out,c0,c1,in).<br />

In = inngangsdata.<br />

Out = utgang.<br />

c0,c1 = kontrollsignaler.<br />

Parameter p = antall skift.<br />

Forsinkelsen er 1.<br />

module mshift(out,c0,c1,in);<br />

output out;<br />

input c0,c1,in;<br />

multiplex (m_out,c_m,in,1'b0);<br />

dEdgeFF dff1(s_1,c0,m_out),<br />

dff2(s_2,c0,s_1),<br />

dff3(out,c0,s_3,<br />

dff4(c_11,c0,c1);<br />

or (c_m,c1,c_11);<br />

endmodule<br />

ORDER<br />

Finner det største <strong>av</strong> to tall og sender dette til utgang max, det minste tallet sendes på utgang<br />

min. Jeg antar her at dataene A og B, begge er positive. I kretsen kan det ikke <strong>av</strong>gjøres<br />

hvilken som er størst og hvilken som er minst før de siste bitene er sammenliknet.<br />

A og B kommer inn på to skiftregistre. Sammenlikningen kan enten skje med en parallell<br />

komparator når begge dataene er i registere, ved c1, eller med en to bit's komparator.<br />

En to bit's komparator sammenlikner en og en bit etter hvert som de kommer inn, informasjon<br />

om hvilket tall som foreløpig er størst, lagres i en DFF.Når alle bitene er ferdig sammenliknet,<br />

styrer resultatet <strong>av</strong> sammenlikningen en multiplekser på utgangen.<br />

En to bit's komparator består <strong>av</strong> en NOT, en XNOR og en AND port, som vist i fig 21.<br />

Fig 21.<br />

33


Utgangen på AND porten er 1 hvis A > B, ellers 0. Utgangen på XNOR er 1 hvis A = B, 0<br />

ellers. Forbinder jeg disse to med en OR port er utgangen 1 hvis A >= B. På utgangen <strong>av</strong><br />

denne er DFF1.Hvis denne er 1 når alle bitene er sammenliknet er A >=B og A kommer ut på<br />

max, B på min. Når bitene er like skal verdien <strong>av</strong> DFF1 forbli uforandret, dette skjer ved en<br />

tilbakeføring gjennom AND porten. Når An > Bn skal DFF1 settes til 1.<br />

Sannhetstabellen for komparatoren finnes i tab 1.<br />

Tabell 1.<br />

Fig 22.<br />

FF1<br />

T-1<br />

A = B<br />

Komparatoren er vist i fig 23.<br />

Fig 23.<br />

0 1<br />

FF1(t) =<br />

FF1(t-1)<br />

FF1(t) =<br />

FF1(t-1)<br />

A > B FF1 = 1 FF1(t) =<br />

FF1(t-1)<br />

A < B<br />

FF1(t) =<br />

FF1(t-1)<br />

FF1 = 0<br />

34


Den siste DFF sampler resultatet ved slutten <strong>av</strong> sammenlikningen og holder denne en hel<br />

ordlengde swl. Denne styrer multiplekseren. Multiplekseren nullstiller DFF1 i starten <strong>av</strong> en ny<br />

sammenlikning.<br />

Hele kretsen er vist i fig 24.<br />

Fig 24.<br />

Verilog modell:<br />

order(max,min,c0,c1,in1,in2);<br />

A,B = inngangssignal.<br />

MAX,MIN = utgang.<br />

c0,c1 = kontroll.<br />

Forsinkelse = swl+3<br />

module order(max,min,c0,c1,in1,in2);<br />

parameter swl=6;<br />

output max,min;<br />

input c0,c1,in1,in2;<br />

wire [swl+1:0] reg_a,reg_b;<br />

shift_reg #(swl+2)a(reg_a,c0,in1),<br />

b(reg_b,c0,in2);<br />

ord ord1(out,c0,c1,in1,in2);<br />

demux de(max1,min1,out,reg_a[0],reg_b[0]);<br />

dEdgeFF dFF1(max,c0,max1),<br />

dFF2(min,c0,min1);<br />

endmodule<br />

module ord(out,c0,c1,in_a,in_b);<br />

35


output out;<br />

input c0,c1,in_a,in_b;<br />

and (greater,in_a,N_in_b);<br />

not (N_in_b,in_b);<br />

xnor (eq,in_a,in_b);<br />

and (d,eq,o3);<br />

or (o1,greater,d);<br />

multiplex m1(o3,c1,o2,1'b0);<br />

dEdgeFF F1(o2,c0,o1),<br />

F2(out,c1,o2);<br />

endmodule<br />

module demux(max,min,g,a,b);<br />

output max,min;input g,a,b;<br />

not (Ng,g);<br />

and<br />

(a_min,a,Ng),<br />

(a_max,a,g),<br />

(b_max,b,Ng),<br />

(b_min,b,g);<br />

or<br />

(max,a_max,b_max),<br />

(min,a_min,b_min);<br />

endmodule<br />

Fig.25 max <strong>av</strong> en sinus og en cosinus.<br />

300<br />

250<br />

200<br />

150<br />

100<br />

50<br />

0<br />

max<br />

1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65<br />

sampel<br />

max<br />

36


FORMAT1TO2<br />

Denne kretsen som gjør om et signal fra enkelpresisjon til dobbelpresisjon. Dette formatet er<br />

beskrevet i innledningen.<br />

Signalet økes fra en ordlengde swl til 2*swl. Det nylig introduserte ordet fylles med<br />

fortegnsutvidelser.<br />

Eksempel :<br />

swl = 6 => 12<br />

101100 => 111111 101100<br />

011011 => 000000 011011<br />

De to ordene LW og LW sendes ut på to ledninger. HW kommer forsinket swl, etter LW.<br />

At dataene nå sendes gjennom to ledninger i stedet for en, introduserer en form for ’digit<br />

serial’ prossesering.<br />

Kretsen består <strong>av</strong> to DFF og en multiplekser. Ved c1, lagres fortegnsbiten. Denne resirkuleres<br />

ved tilbakeføring gjennom multiplekseren.<br />

Fig 26.<br />

Fig 27. Format1to2.<br />

37


Verilog modell:<br />

format1to2(lw,hw,c0,c1,in);<br />

in = inngang.<br />

lw = l<strong>av</strong>este 0 .. swl-1 biter.<br />

hw = høyste swl-1 .. 2*swl-1 biter.<br />

c0,c1 = kontrollsignaler.<br />

Forsinkelse = 1.<br />

module format1to2(lw,hw,c0,c1,in);<br />

output lw,hw;<br />

input c0,c1,in;<br />

dEdgeFF dFF1(lw,c0,in),<br />

dFF2(hw,c0,mout);<br />

multiplex m1(mout,c1,hw,lw);<br />

endmodule<br />

FORMAT 3TO1.<br />

Denne kretsen gjør signalet om fra tredobbel-presisjon til enkel-presisjon.<br />

Kretsen virker på den måten at den henter ut swl biter fra tre innganger LW, MW, HW og<br />

setter dette ut på linje out. En parameter d bestemmer hvor ordet out begynner.<br />

Eksempel:<br />

swl = 9 og d=12.Kommaene impliserer HW, MW, LW.<br />

h0 h1 h2 h3 h4 h5 h6 h7 h8 m0 m1 m2 m3 m4 m5 m6 m7 m8, l0 l1 l2 l3 l4 l5 l6 l7 l8<br />

out = h7 h8 m0 m1 m2 m3 m4 m5 m6.<br />

Her er det mange mulige realiseringer. Jeg har valgt å styre LW, MW og HW inn i en<br />

multiplekser. Multiplekseren styres <strong>av</strong> k1 og k2. En kontroll generator lager styringssignalene<br />

til multiplekseren <strong>av</strong> ordklokken c1.<br />

Tabellen under viser hvilke signaler som kontrollgeneratoren må generere:<br />

Klokkeperiode: d < swl d > swl<br />

[d swl > 00 01<br />

[swl d > 01 10<br />

Alle kontrollsignalene er <strong>av</strong> varighet d eller swl-d . De kan genereres med en forsinkelseslinje<br />

som vist i fig. 29. I dette eksemplet er swl = 9 og d = 4.<br />

38


Fig 28.<br />

Fig 29. forsinkelses linje med d = 4<br />

Rekken består <strong>av</strong> d antall DFF, deretter swl -d DFF, knyttet sammen med OR porter for å<br />

generere b og c.<br />

c1_out kan hentes fra denne rekken som vist ovenfor.<br />

Forsinkelsen er d.<br />

Regelen for styring <strong>av</strong> multiplekseren er :<br />

d < swl k1 = a , k2 = c .<br />

d > swl k1 = c , k2 = b .<br />

39


Verilog modell:<br />

format3to1(out,c1_out,c0,c1,lw,mw,hw);<br />

lw,mw,hw = inngangsdata.<br />

out = utgangsdata.<br />

c0, c1 = kontrollsignaler.<br />

c1_out = kontrollsignal ut.<br />

forsinkelse = d.<br />

module format3to1(out,c1_out,c0,c1,lw,mw,hw);<br />

parameter swl=9;parameter d=4;<br />

output out,c1_out;<br />

input c0,c1,lw,mw,hw;<br />

wire [swl-1:0] ffout;wire a,b,c;wire [1:0] ctrl;<br />

assign c1_out = c1;<br />

assign ctrl[1]=(dswl) ? c:1'b0; //Tilkobler mux<br />

dEdgeFF ff0(ffout[0],c0,c1),<br />

ff1(ffout[1],c0,ffout[0]),<br />

ff2(ffout[2],c0,ffout[1]),<br />

ff3(ffout[3],c0,ffout[2]),<br />

ff4(ffout[4],c0,ffout[3]),<br />

ff5(ffout[5],c0,ffout[4]),<br />

ff6(ffout[6],c0,ffout[5]),<br />

ff7(ffout[7],c0,ffout[6]),<br />

ff8(ffout[8],c0,ffout[7]);<br />

or o1(o1_out,ffout[3],ffout[4]),<br />

o2(o2_out,ffout[5],ffout[6]),<br />

o3(o3_out,ffout[7],ffout[8]);<br />

or o4(b,o1_out,o2_out,o3_out);<br />

not (c,b);<br />

multiplex3 m1(out,lw,mw,hw,ctrl);<br />

endmodule<br />

LIMIT<br />

LIMIT skal sørge for at signalet data, holdes innenfor området [-limit, limit], dvs.<br />

hvis ABS(data) < limit slipper data uforandret gjennom til out, ellers settes out = limit.<br />

Kretsen skal virke på 2’komplementære tall.<br />

En løsning kunne være å hardkode limit og – limit og en testlogikk som tester data mot disse<br />

to. Denne testlogikken kunne være en parallell komparator og resultatet <strong>av</strong> testen kan deretter<br />

styre enten limit, -limit eller data til utgangen out.<br />

Jeg har valgt å lage kretsen med subtraktorer som kan utføre sammenlikingen seriellt.<br />

Fordelen med dette er at SUB allerede er en del <strong>av</strong> det bitserielle biblioteket og verdien limit<br />

kan settes in i ett programmerbart skiftregister. Størrelsen til kretsen vil heller ikke øke så<br />

40


mye med økende swl, bare registerene R1(data) og R2(limit) vil øke.<br />

Fig 30.<br />

Fig. 31.<br />

Sammenlikningen gjøres med subtraktorer. Data må sammenliknes med limit hvis data er<br />

positiv, -limit hvis data er negativ. Kretsen kjenner ikke fortegnet på forhånd og det er derfor<br />

nødvendig med to grener, slik som i MULTIPLY. En gren for positiv data og en for negativ.<br />

Limit sirkuleres i skiftregisteret R2. SUB1 tar differansen, limit – data, og hvis denne er<br />

negativ er data større enn limit. Fortegnet til differansen lagres en hel ord-periode (klokkes <strong>av</strong><br />

c11) i DFF4 som A. Er data negativ gir SUB1 bare meningsløs informasjon.<br />

SUB2, med a jordet, danner –limit. Denne sammenliknes med data i SUB3. Når data er<br />

negativ, er differansen (-limit) – data positiv hvis data er mindre enn -limit. Resultatet lagres i<br />

DFF5, som B. DFF5 klokkes <strong>av</strong> c11.<br />

Resultatet <strong>av</strong> sammenlikningene A og B, styrer hver sin multiplekser MUX1 og MUX2.<br />

Fortegnet til data holdes en ordperiode i DFF1, og denne klokkes <strong>av</strong> c10. Fortegnet styrer<br />

MUX3 og bestemmer hvilket <strong>av</strong> resultatene som skal komme på utgangen.<br />

41


Tabellen nedenfor viser resultatene <strong>av</strong> testene, A og B. Stjerne betyr at resultatet ikke brukes.<br />

Tabell 2.<br />

data > 0 data > 0<br />

A: data > limit 1 (out = limit) 0*<br />

A: data < limit 0 (out = data) 0*<br />

B: data > -limit 1* 1 (out = data)<br />

B: data < -limit 1* 0 (out = - limit)<br />

Verilog modell:<br />

Limit(out,c0,c1,in);<br />

in = inngangsdata.<br />

out = utgangsdata.<br />

c0,c1 = kontrollsignaler.<br />

Forsinkelse = swl + 4.<br />

module Limit(out,c0,c10,in);<br />

output out;<br />

input c0,c10,in;<br />

parameter swl=9;<br />

parameter limit=9'b001000001;// 65, brukt til testing<br />

wire d12_out;<br />

assign out=d12_out;<br />

Sub SUB1(s1_out,s1Cout,c0,c11,d5_out,d4_out,1'b1),<br />

SUB2(s2_out,s2Cout,c0,c10,1'b0,r2_out,1'b1),<br />

SUB3(s3_out,s3Cout,c0,c11,s2_out,d4_out,1'b1);<br />

multiplex MUX1(m1_out,A,r1_out,d7_out),<br />

MUX2(m2_out,B,d10_out,r1_out),<br />

MUX3(m3_out,d3_out,m1_out,m2_out);<br />

dEdgeFF DFF1(d1_out,c10,d4_out),<br />

DFF2(d2_out,c0,d1_out),<br />

DFF3(d3_out,c0,d2_out),<br />

DFF4(d4_out,c0,in),<br />

DFF5(d5_out,c0,r2_out),<br />

DFF6(d6_out,c0,d5_out),<br />

DFF7(d7_out,c0,d6_out),<br />

DFF8(A,c11,s1_out),<br />

DFF9(d9_out,c0,s2_out),<br />

DFF10(d10_out,c0,d9_out),<br />

DFF11(B,c11,s3_out),<br />

DFF12(d12_out,c0,m3_out),<br />

DFF13(c11,c0,c10);<br />

42


endmodule<br />

Register #(swl+2)R1(r1_out,c0,d4_out);<br />

RegisterProg #(swl,limit)R2(r2_out,c0,r2_out);<br />

Fig.32 Sinus med limit =100.<br />

150<br />

100<br />

50<br />

0<br />

-50<br />

-100<br />

-150<br />

MULTIPLY<br />

Multiplikatoren multipliserer to tall A og B, f(A,B) = A * B. Multiplikatoren er den mest<br />

kompliserte og største kretsen i biblioteket. Den kan lages på mange forskjellige måter<br />

<strong>av</strong>hengig <strong>av</strong> kr<strong>av</strong> til tallformat, dobbel/ enkelpresisjon, areal, forsinkelse og <strong>av</strong>runding. Jeg<br />

skal først drøfte aritmetikken og så se på forskjellige løsninger.<br />

Usignert multiplikasjon<br />

limit<br />

1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65<br />

sampel<br />

To tall c (koeffisient) og d (data) skal multipliseres .<br />

c har lengde m, d lengde n.<br />

c0, d0 = MSB c4,d4 = LSB.<br />

c => c0 c1 c2 c3 c4<br />

d => d0 d1 d2 d3 d4<br />

(c0 c1 c2 c3 c4) * d4<br />

(c0 c1 c2 c3 c4) * d3<br />

(c0 c1 c2 c3 c4) * d2<br />

(c0 c1 c2 c3 c4) * d1<br />

(c0 c1 c2 c3 c4) * d0<br />

y0 y1 y2 y3 y4 y5 y6 y7 y8<br />

To tall, c og d, med lengde m og n danner ett produkt med størrelse m+n-1 og m*n delprodukter.<br />

Utregningen ovenfor illustrerer virkemåten til en seriell/parallell multiplikator. c<br />

limit<br />

43


påtrykkes parallelt og d serielt. Koeffisienten c multipliseres med hver <strong>av</strong> bitene i d, adderes<br />

med ett tidligere resultat og skiftes en gang til høyre. Dette gjentas hele veien fra d4 til d0.<br />

Den binære multiplikasjonen gjøres bitvis i m AND porter, der verdien <strong>av</strong> di <strong>av</strong>gjør om<br />

koeffisienten c skal legges til produktet eller ikke.<br />

En krets som gjør dette finnes i fig 31. Den første biten d4 multipliseres med alle bitene i c og<br />

resultatet legges inn i en adder rekke. Når neste bit d3 kommer, er det forrige produktet flyttet<br />

en plass til høyre og det nye produktet c *d3 legges til. Alle DFF'ene må nullstilles når ett nytt<br />

produkt skal dannes.<br />

AND porten og den serielle adderen utgjør en celle i multiplikatoren, og en multiplikator som<br />

den i fig 1 består <strong>av</strong> m celler koblet i serie. Produktet kommer seriellt ut fra den siste cellen,<br />

med LSB først.<br />

Fig 33.<br />

Multiplikasjon med signert koeffisient<br />

Det vi trenger er en multiplikator som kan arbeide med 2'komplementære tall.<br />

Multiplikatoren må også klare å utregne produktene sekvensielt, der både c og d kommer<br />

kontinuerlig og uten noen form for buffring. Det betyr at en celle som er ferdig med å beregne<br />

siste delprodukt p(m+n-1), i neste klokke syklus må kunne beregne p0 i ett nytt produkt.<br />

Som nevnt tidligere har MSB negativt fortegn:<br />

c = -c0 + ci/2^i<br />

d = -d0 + di/2^i<br />

c * d = d* ci/2^i + d * (-c0)<br />

44


En multiplikasjon mellom to 2'komlementære tall blir som vist nedenfor. Jeg har her byttet<br />

om på c og d.<br />

(d0 d0 d0 d0 d0 d1 d2 d3 d4) * c4<br />

(d0 d0 d0 d0 d1 d2 d3 d4) * c3<br />

(d0 d0 d0 d1 d2 d3 d4) * c2<br />

(d0 d0 d1 d2 d3 d4) * c1<br />

+/- (d0 d1 d2 d3 d4) * c0<br />

y0 y1 y2 y3 y4 y5 y6 y7 y8<br />

Fortegnsutvidelsen <strong>av</strong> d0 er nødvendig pga bitveksten og for å bevare det 2'komplementære<br />

formatet når delproduktene skal legges sammen. c0 har negativ vekt, og hvis c0 = 1 må d<br />

trekkes fra i den siste linjen.<br />

Den multiplikatoren jeg skal beskrive her er delvis bygget på den beskrevet i boka 'VLSI<br />

SIGNAL PROCESSING: A BITSERIAL APPROACH.'. Det er en <strong>av</strong>kortingsmultiplikator,<br />

dvs. produktet 'kuttes' slik at det får samme lengde som dataen. I eksemplet ovenfor ville<br />

produktet bestå <strong>av</strong> bitene y0 y1 y2 y3 y4, mens y5 y6 y7 y8 ville blitt kansellert.<br />

Jeg skal også vise hvordan en <strong>av</strong>rundingsmultiplikator og en dobbelpresisjonsmultiplikator<br />

kan lages ved å gjøre noen modifikasjoner på <strong>av</strong>kortingsmultiplikatoren.<br />

En del <strong>av</strong> strukturen kan tas direkte fra utregningen ovenfor. Den vil ha n celler der den siste<br />

cellen må danne det 2'komplmentære <strong>av</strong> d. Produktet må skiftes en plass til høyre i forhold til<br />

de nye delproduktene som legges til.<br />

Cellen MULT er tegnet i fig.3, og MSBMULT i fig.5.<br />

MULT utgjør de første n-1 cellene og MSBMULT den siste.<br />

MULT består <strong>av</strong> en AND port der data_in multipliseres med koeffisientbiten cn.<br />

Delproduktet går inn i en seriell adder der menten resirkuleres helt til LSB ankommer, da<br />

kanseleres menten. På utgangen <strong>av</strong> adderen er det en multiplekser som styrer signalet ut til<br />

DFF3, denne tilbakeføres og dupliseres når c1 er høy. Det er denne tilbakeføringen som<br />

utfører fortegnsutvidelsen.<br />

Data_in forsinkes to ganger i DFF1 og DFF2 før det kommer ut som data_out. c1 skal følge<br />

LSB og forsinkes to ganger i FF5 og FF6 før det kommer ut som c1_out. c1_in sletter menten<br />

fra FF4 når c1_in = 1.<br />

Den siste cellen i rekken er MSBMULT, her multipliseres data_in med fortegnsbiten c0.<br />

Denne cellen er nesten lik MULT men med en seriell subtraktor der det 2'komplementære <strong>av</strong><br />

data kan legges til produktet. Det ferdige produktet kommer seriellt ut på p_out.<br />

Fig 34.<br />

45


Fig 35. multcelle<br />

Fig 36.<br />

Fig 37.msb-multcelle<br />

Cellene kobles sammen som vist i fig. 38. Dette er en multiplikator med 5 celler (n = 5).<br />

Det <strong>av</strong>kortede produktet kommer ut serielt ved product_out.<br />

46


Fig 38.Multiplikator med cwl=5.<br />

Verilog modell:<br />

spmult(p_out,d_out,c_out,c0,c_in,d_in,y);<br />

d_in = data inn.<br />

y = koeffisient inn.<br />

p_out = produkt ut.<br />

d_out = data ut.<br />

c0,c1 = kontrollsignaler.<br />

Forsinkelse på p_out = 2*cwl.<br />

module spMultCell(p_out,d_out,c_out,c0,p_in,d_in,c_in,y_in); // seriell-paralell modul<br />

output p_out,d_out,c_out;<br />

input c0,p_in,d_in,c_in,y_in;<br />

dEdgeFF DFF1(ff1_out,c0,d_in),<br />

DFF 2(d_out,c0,ff1_out),<br />

DFF 4(ff4_out,c0,carry),<br />

DFF 3(p_out,c0,m1_out),<br />

DFF 5(ff5_out,c0,c_in),<br />

DFF 6(c_out,c0,ff5_out);<br />

and (a1,y_in,d_in),<br />

(a2,ff4_out,nc_in);<br />

not (nc_in,c_in);<br />

full_adder fa1(sum,carry,a1,p_in,a2);<br />

multiplex m1(m1_out,c_in,sum,p_out);<br />

endmodule<br />

module spMultCellMsb(p_out,d_out,c_out,c0,p_in,d_in,c_in,y_in); // seriell-paralell modul<br />

47


output p_out,d_out,c_out;<br />

input c0,p_in,d_in,c_in,y_in;<br />

dEdgeFF DFF1(ff1_out,c0,d_in),<br />

DFF2(d_out,c0,ff1_out),<br />

DFF3(p_out,c0,sum),<br />

DFF4(ff4_out,c0,carry),<br />

DFF5(ff5_out,c0,c_in),<br />

DFF6(c_out,c0,ff5_out);<br />

and (a1,y_in,nd_in),<br />

(a2,o1,y_in);<br />

not (nd_in,d_in);<br />

or (o1,ff4_out,c_in);<br />

full_adder fa1(sum,carry,a1,p_in,a2);<br />

endmodule<br />

module spMultiplier(p_out,d_out,c_out,c0,c1_in,d_in,y);<br />

parameter swl=9;<br />

output p_out,d_out,c_out;<br />

input c0,c1_in,d_in;<br />

input [swl-1:0] y;<br />

wire [swl-1:0] p,d,c;<br />

assign p_out=p[8],d_out=d[8],c_out=c[8];<br />

spMultCell<br />

s0(p[0],d[0],c[0], c0,1'b0,d_in,c1_in,y[0]),<br />

s1(p[1],d[1],c[1], c0,p[0],d[0],c[0],y[1]),<br />

s2(p[2],d[2],c[2], c0,p[1],d[1],c[1],y[2]),<br />

s3(p[3],d[3],c[3], c0,p[2],d[2],c[2],y[3]),<br />

s4(p[4],d[4],c[4], c0,p[3],d[3],c[3],y[4]),<br />

s5(p[5],d[5],c[5], c0,p[4],d[4],c[4],y[5]),<br />

s6(p[6],d[6],c[6], c0,p[5],d[5],c[5],y[6]),<br />

s7(p[7],d[7],c[7], c0,p[6],d[6],c[6],y[7]);<br />

spMultCellMsb s8(p[8],d[8],c[8], c0,p[7],d[7],c[7],y[8]);<br />

endmodule<br />

I tabellen nedenfor er det vist i detalj hvor og når de ulike delproduktene dannes i denne<br />

multiplikatoren.<br />

Den horisontale aksen betegner cellen's posisjon og den vertikale betegner tiden angitt i<br />

klokke steg c0.<br />

48


Posisjon <br />

c0 Mult1 (c4) Mult2 (c3) Mult3 (c2) Mult4 (c1) Msbmult (c0)<br />

1 d4c4<br />

2 d3c4<br />

3 d2c4 d4c3<br />

4 d1c4 d3c3<br />

5 d0c4 d2c3 d4c2<br />

6 d1c3 d3c2<br />

7 d0c3 d2c2 d4c1<br />

8 d1c1 d3c1<br />

9 d0c0 d2c1 d4c0<br />

10 d1c1 d3c0<br />

11 d0c1 d2c0<br />

12 d1c0<br />

13 d0c0<br />

Delproduktene summeres diagonalt nedover i denne tabellen, for eksempel y8 = d4c4 og y7 =<br />

d3c4+d4c3. I tabellen er noen delprodukter anngitt i kursiv, dette er delprodukter som<br />

fortegnsutvidelsen sletter. Den delen <strong>av</strong> produktet som ikke slettes, y0y1y2y3, kommer ut <strong>av</strong><br />

MSBMULT etter T = 10, eller 2*n.<br />

Fortegnsutvidelsen i denne multiplikatoren tjener to hensikter. Den ene er å <strong>av</strong>korte produktet<br />

med n biter, slik at produktet er <strong>av</strong> samme størrelse (swl) som data. Den andre er å hindre nye<br />

delsummer, i et nytt produkt, fra å interferere med tidligere delsummer som allerede finnes i<br />

multiplikatoren.<br />

Multiplikasjon med signert data og koeffisient.<br />

Multiplikatoren ovenfor kan bare multiplisere signerte koeffisienter, data må være positiv.<br />

Hvis data var negativ, d0 =1, måtte multiplikatoren legge til den 2'komplementære <strong>av</strong><br />

koeffisienten til summen, når d0 entrer multiplikatoren.<br />

En måte å omgå dette på er å lage det 2'komplementære <strong>av</strong> data når denne er negativ, så<br />

multiplisere koeffesienten med denne, og deretter ta det 2'komplemetære <strong>av</strong> produktet for å få<br />

det riktig tegnet tilbake.<br />

Problemet er at fortegnsbiten d0 ikke blir kjent før helt tilslutt i multiplikasjonen. Jeg har løst<br />

dette med en multiplikator som har to grener, en for positiv data og en for negativ. Når d0<br />

entrer multiplikatoren, styrer denne en multiplekser på utgangen som velger hvilken <strong>av</strong> de to<br />

produktene som skal komme ut på product_out.<br />

I den nederste banen beregnes produktet som om data var negativ. Data negeres, dvs. det<br />

danner det 2'komplementære <strong>av</strong> data, ved å kjøre det gjennom b inngangen på primitiven<br />

SUB, a inngangen jordes. På utgangen <strong>av</strong> den nederste banen dannes det 2'komplementære <strong>av</strong><br />

produktet for å gjenopprette fortegnet.<br />

De to SUB primitivene har hver en forsinkelse 1 og for å kompensere benyttes to DFF i den<br />

øverste banen.<br />

DFF1 har som oppg<strong>av</strong>e å holde fortegnsbiten d0 gjennom en hel ordlengde swl. Den klokkes<br />

<strong>av</strong> c1_in. Denne styrer igjen multiplekseren på utgangen.<br />

49


Fig 39. spSignedMultiplier, cwl = 5.<br />

Verilog modell:<br />

spSignedMultiplier (prod,d_out,c1_out,c0,c1_in,d_in,y);<br />

d_in = data inn.<br />

y = koeffisient.<br />

c0,c1 = kontrollsignaler.<br />

c1_out = c1 ut.<br />

prod = produkt ut.<br />

d_out = data ut.<br />

forsinkelse på prod, d_out = 2* cwl + 3.<br />

module spSignedMultiplier(prod,d_out,c1_out,c0,c1_in,d_in,y);<br />

parameter swl=9;<br />

output prod,d_out,c1_out;<br />

input c0,c1_in,d_in;<br />

input [swl-1:0] y;<br />

// Positiv gren ----><br />

dEdgeFF DFF1(ff1_out,c0,c1_in),<br />

DFF2(ff2_out,c0,d_in),<br />

DFF3(ff3_out,c1_in,ff2_out), // Låser fortegnet.<br />

DFF4(ff4_out,c0,prod_pos_out),<br />

DFF5(prod,c0,prod1),<br />

DFF6(ff6_out,c0,d_pos_out),<br />

DFF7(d_out,c0,ff6_out),<br />

50


endmodule<br />

DFF8(c1_out,c0,c1_pos_out);<br />

spMultiplier sp(prod_pos_out,d_pos_out,c1_pos_out,c0,ff1_out,ff2_out,y);<br />

// Negativ gren ----><br />

serial_sub sub1(d_neg,c_out1,c0,c1_in,1'b0,d_in,1'b1),<br />

sub2(prod_neg,c_out2,c0,c1_neg_out,1'b0,prod_neg_out,1'b1);<br />

spMultiplier sn(prod_neg_out,d_neg_out,c1_neg_out,c0,ff1_out,d_neg,y);<br />

multiplex m1(prod1,ff3_out,ff4_out,prod_neg); // Velger resultat.<br />

Det tette designet setter en del kr<strong>av</strong> til både data og koeffisienter. Data må ha en 'guard'-bit,<br />

dvs. data må ligge mellom 11 000 000 < data < 01 000 000.Hvis ikke vil den mest<br />

signifikante biten overskrives og resultatet vil bli meningsløst. Produktet skal være <strong>av</strong> samme<br />

størrelsesorden som data, derfor må koeffisienten defineres som en fraksjon og koeffisientene<br />

må ligge mellom -1 < koeff < 1. Denne begrensningen på koeffisientene er i virkeligheten<br />

ikke noe problem fordi koeffisientene uansett må skaleres før de gis til multiplikatorene. Jeg<br />

kjørte flere simuleringer <strong>av</strong> multiplikatoren på PC, og resultatet stemte med teorien så lenge<br />

kr<strong>av</strong>ene ovenfor var overholdt. Hele kretsen har en forsinkelse på m+3. Den produserer en bit<br />

<strong>av</strong> produktet per c0 og ett helt produkt per c1. Multiplikatoren kan behandle data og<br />

koeffisienter <strong>av</strong> ulik lengde, produktet vil uansett være <strong>av</strong> lengde n. Jeg skal se på tre<br />

forskjellige scenarioer, m > n , m = n og m < n. Hvis m > n er det rimelig å anta at<br />

konverterings-støyen som introduseres i multiplikasjonen minker, men produktet vil likevel<br />

<strong>av</strong>korte de ekstra bitene m-n. De 'ekstra' bitene som dannes internt vil kanselleres før de når<br />

utgangen, og jeg konkluderer med at lengre koeffisienter i forhold til data er unødvendig.<br />

Hvis m < n kan det spares en del maskinvare, men produktet må fortsatt være <strong>av</strong> lengde n.<br />

Den delen <strong>av</strong> produktet som kanselleres vil ha større vekt og derfor øke konverterings-støyen<br />

fra multiplikatoren. I en filter konfigurasjon betyr dette at posisjonen til nullpunkter og poler<br />

ikke kan bestemmes nøyaktig. Av dette konkluderer jeg at m = n er den mest fornuftige<br />

konfigurasjonen.<br />

Avrundingsmultiplikator<br />

Multiplikatoren ovenfor <strong>av</strong>korter produktet, dvs. den fjerner de l<strong>av</strong>este m -1 bitene.<br />

Avkortingen vil sette de positive tallene ned til det nærmeste heltall, de negative tallene<br />

<strong>av</strong>rundes også nedover dvs. magnituden på negative tall øker.<br />

Effekten <strong>av</strong> dette er en <strong>av</strong>rundingsstøy i området q[-1,0]. Fra signalteori er det kjent at dette<br />

gir mer støy totalt enn om støyen lå i området q[- ½ , ½].<br />

Det er mulig å modifisere <strong>av</strong>kortings multiplikatoren slik at den virker som en<br />

<strong>av</strong>rundingsmultiplikator, ved å sette inn en <strong>av</strong>rundings bit på rett sted i utregningen. I<br />

eksemplet nedenfor har jeg prøvd å illustrere dette. Bitene til høyre for kommaet <strong>av</strong>kortes/<br />

<strong>av</strong>rundes. Produktet før <strong>av</strong>korting: 00110,1000<br />

51


Ved å legge til en bit blir produktet:<br />

00110,1000<br />

+00000,1000<br />

00111,<br />

Biten kan legges til i den første modulen i rekken, ved tiden T0 + m-2.Dette kan løses ved å<br />

bruke en <strong>av</strong> de tilgjengelige kontrollsignalene c1n, og en multiplekser som setter c_in til 1 i<br />

den første cellen.<br />

Seriell/seriell multiplikator<br />

I multiplikatorene ovenfor påtrykkes data seriellt og koeffisientene parallellt. Det er mulig å<br />

lage en multiplikator der også koeffisientene påtrykkes seriellt.<br />

Fig 40 ssMultCell.<br />

Denne modulen er nesten helt lik den forrige. Forskjellen er DFF7 og DFF8. DFF7 holder<br />

koeffisientenbiten fast gjennom hele ordperioden, mens DFF8 sørger for at den neste<br />

koeffisientbiten ankommer til rett tid i den neste modulen. Ved å flytte DFF1 og DFF5 slik<br />

som jeg har gjort, kan kontrollsignalet c1_in brukes direkte til å låse koeffisientbitene.<br />

fig 41. ssMultCellMsb.<br />

52


Verilog modell:<br />

module ssMultiplier(prod,d_out,c1_out,c0,c1_in,d_in,y);<br />

d_in = data inn.<br />

y = koeffisient inn.<br />

c0,c1 = kontrollsignaler.<br />

prod = produkt ut.<br />

d_out = data ut.<br />

c1_out = c1 ut.<br />

forsinkelse på 2* cwl + 3<br />

module ssMultCell (p_out,d_out,c_out,y_out,c0,p_in,d_in,c_in,y_in); // seriell-seriell modul<br />

output p_out,d_out,c_out,y_out;<br />

input c0,p_in,d_in,c_in,y_in;<br />

dEdgeFF ff1(ff1_out,c0,d_in),<br />

ff2(d_out,c0,ff1_out),<br />

ff3(p_out,c0,m1_out),<br />

ff4(ff4_out,c0,carry),<br />

ff5(ff5_out,c0,c_in),<br />

ff6(c_out,c0,ff5_out),<br />

ff7(ff7_out,c_in,y_in),<br />

ff8(y_out,c0,y_in);<br />

and (a1,ff7_out,ff1_out),<br />

(a2,ff4_out,nc_in);<br />

not (nc_in,ff5_out);<br />

53


full_adder fa1(sum,carry,a1,p_in,a2);<br />

multiplex m1(m1_out,ff5_out,sum,p_out);//ff5<br />

endmodule<br />

module ssMultCellMsb (p_out,d_out,c_out,c0,p_in,d_in,c_in,y_in); // seriell-seriell modul<br />

output p_out,d_out,c_out;<br />

input c0,p_in,d_in,c_in,y_in;<br />

dEdgeFF ff1(ff1_out,c0,d_in),<br />

ff2(d_out,c0,ff1_out),<br />

ff3(p_out,c0,sum),//<br />

ff4(ff4_out,c0,carry),<br />

ff5(ff5_out,c0,c_in),<br />

ff6(c_out,c0,ff5_out),<br />

ff7(ff7_out,c_in,y_in);<br />

and (a1,ff7_out,nd_in),<br />

(a2,o1,ff7_out);<br />

not (nd_in,ff1_out),<br />

(no1,o1);<br />

or (o1,ff4_out,ff5_out);<br />

full_adder fa1(sum,carry,a1,p_in,a2);<br />

endmodule<br />

module ssMult(p_out,d_out,c_out,c0,c_in,d_in,y_in);<br />

parameter swl=9;<br />

output p_out,d_out,c_out;<br />

input c0,c_in,d_in,y_in;<br />

wire [swl-1:0] p,d,c,y;<br />

assign p_out=p[8],d_out=d[8],c_out=c[8];<br />

ssMultCell<br />

s0(p[0],d[0],c[0],y[0],c0,1'b0,d_in,c_in,y_in),<br />

s1(p[1],d[1],c[1],y[1],c0,p[0],d[0],c[0],y[0]),<br />

s2(p[2],d[2],c[2],y[2],c0,p[1],d[1],c[1],y[1]),<br />

s3(p[3],d[3],c[3],y[3],c0,p[2],d[2],c[2],y[2]),<br />

s4(p[4],d[4],c[4],y[4],c0,p[3],d[3],c[3],y[3]),<br />

s5(p[5],d[5],c[5],y[5],c0,p[4],d[4],c[4],y[4]),<br />

s6(p[6],d[6],c[6],y[6],c0,p[5],d[5],c[5],y[5]),<br />

s7(p[7],d[7],c[7],y[7],c0,p[6],d[6],c[6],y[6]);<br />

ssMultCellMsb s8(p[8],d[8],c[8] ,c0,p[7],d[7],c[7],y[7]);<br />

endmodule<br />

module ssMultiplier(prod,d_out,c1_out,c0,c1_in,d_in,y);<br />

parameter swl=9;<br />

output prod,d_out,c1_out;<br />

input c0,c1_in,d_in,y;<br />

54


endmodule<br />

// Positiv gren ----><br />

dEdgeFF ff1(ff1_out,c0,c1_in),<br />

ff2(ff2_out,c0,d_in),<br />

ff3(ff3_out,c1_in,ff2_out), // Låser fortegnet.<br />

ff4(ff4_out,c0,prod_pos_out),<br />

ff5(prod,c0,prod1),<br />

ff6(ff6_out,c0,d_pos_out),<br />

ff7(d_out,c0,ff6_out),<br />

ff8(c1_out,c0,c1_pos_out),<br />

ff10(ff10_out,c0,y),<br />

ff11(d1_out,c0,ff12_out),<br />

ff12(ff12_out,c0,ff13_out),<br />

ff13(ff13_out,c1_in,ff3_out);<br />

ssMultsp(prod_pos_out,d_pos_out,c1_pos_out,c0,ff1_out,ff2_out,ff10_out);<br />

// Negativ gren ----><br />

serial_sub sub1(d_neg,c_out1,c0,c1_in,1'b0,d_in,1'b1),//<br />

sub2(prod_neg,c_out2,c0,c1_neg_out,1'b0,prod_neg_out,1'b1);<br />

ssMultsn(prod_neg_out,d_neg_out,c1_neg_out,c0,ff1_out,d_neg,ff10_out);<br />

multiplex m1(prod1,ff12_out,ff4_out,prod_neg); // Velger resultat.<br />

Fig. 42 Produkt <strong>av</strong> ’Spike’-signal og sinus.<br />

150<br />

100<br />

50<br />

0<br />

-50<br />

-100<br />

-150<br />

Serial-Serial Multiplier<br />

1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65<br />

product<br />

55


Dobbelpresisjonsmultiplikator.<br />

Det er noen ganger være nødvendig å arbeide med dobbelpresisjon internt i en krets, et<br />

eksempel er FIR filtre der mange produkter skal summeres. Dobbelpresisjon vil også minke<br />

<strong>av</strong>rundingsstøyen på utgangen. Multiplikatoren jeg har beskrevet ovenfor kan med noen<br />

modifikasjoner gi hele produktet i dobbelpresisjon. I multiplikatorene ovenfor, kanseleres de<br />

interne delproduktene i multiplekseren i hver celle. I multiplikator-cellen i fig.43 'reddes' disse<br />

delproduktene og legges ned i en rekke <strong>av</strong> DFF og kommer ut <strong>av</strong> multiplikatoren på en egen<br />

linje som LW. Multiplikatoren har nå fått to utganger, HW og LW. Hele produktet har derfor<br />

bredde 2*swl.<br />

Fig 43. dpssms<br />

Fig 44. dpspmlasts.<br />

56


Denne multiplikatoren må også fortegnsutvide i den siste cellen slik at HW og LW begge blir<br />

<strong>av</strong> bredde SWL.<br />

Hele multiplikatoren vises i fig 45.<br />

Fig 45.Dobbelpresisjons-multiplikator.<br />

57


For eksempel med swl = 5 må produktet bli y0 y0 y1 y2 y4 y5 y6 y7 y8 ,<br />

der HW = y0 y0 y1 y2 y3 og LW = y4 y5 y6 y7 y8.<br />

Verilog modell:<br />

dpssMultiplier(hw,lw,d_out,c1_out,c0,c1_in,d_in,y);<br />

d_in = data inn.<br />

y = koeffisient inn.<br />

c0,c1 = kontrollsignaler.<br />

hw,lw = produkt ut.<br />

d_out = data ut.<br />

c1_out = c1 ut.<br />

forsinkelse på hw = 2* cwl + 3<br />

forsinkelse på lw = cwl + 3<br />

module dpssms(hw_out,lw_out,d_out,c_out,y_out,c0,hw_in,lw_in,d_in,c_in,y_in);<br />

output hw_out,lw_out,d_out,c_out,y_out;<br />

input c0,hw_in,lw_in,d_in,c_in,y_in;<br />

dEdgeFF ff1(ff1_out,c0,d_in),<br />

ff2(d_out,c0,ff1_out),<br />

ff3(hw_out,c0,m1_out),<br />

ff4(ff4_out,c0,carry),<br />

ff5(ff5_out,c0,c_in),<br />

ff6(c_out,c0,ff5_out),<br />

ff7(ff7_out,c_in,y_in), //låser coeffesienten<br />

ff8(y_out,c0,y_in),<br />

ff9(lw_out,c0,m2_out);<br />

and (a1,ff7_out,ff1_out),<br />

(a2,ff4_out,nc_in);<br />

not (nc_in,ff5_out);<br />

full_adder fa1(sum,carry,a1,hw_in,a2);<br />

multiplex m1(m1_out,ff5_out,sum,hw_out),<br />

m2(m2_out,ff5_out,lw_in,sum);<br />

endmodule<br />

module dpspmlasts(hw_out,lw_out,d_out,c_out,c0,hw_in,lw_in,d_in,c_in,y_in); // dp seriellseriell<br />

modul msb<br />

output hw_out,lw_out,d_out,c_out;<br />

input c0,hw_in,lw_in,d_in,c_in,y_in;<br />

dEdgeFF ff1(ff1_out,c0,d_in),<br />

ff2(d_out,c0,ff1_out),// data out<br />

ff3(hw_out,c0,m1_out),<br />

ff4(ff4_out,c0,carry),<br />

58


endmodule<br />

ff5(ff5_out,c0,c_in),<br />

ff6(ff6_out,c0,ff5_out),<br />

ff7(ff7_out,c_in,y_in),<br />

ff8(lw_out,c0,lw_in),// lw out<br />

ff9(c_out,c0,ff5_out),<br />

ff10(y_out,c0,y_in);<br />

and (a1,ff7_out,nd_in),<br />

(a2,o1,ff7_out);<br />

not (nd_in,ff1_out),<br />

(neg_ff5_out,ff5_out),<br />

(no1,o1);<br />

or (o1,ff4_out,ff5_out);<br />

full_adder fa1(sum,carry,a1,hw_in,a2);<br />

multiplex m1(m1_out,c_in,sum,hw_out);<br />

// I dpssmult må Koeffesient lengden bestemmes<br />

// Nedenfor brukes 12 bit<br />

module dpssmult(hw_out,lw_out,d_out,c_out,c0,c_in,d_in,y_in);<br />

parameter swl=12;<br />

output hw_out,lw_out,d_out,c_out;<br />

input c0,c_in,d_in,y_in;<br />

wire [swl-1:0] hw,lw,d,c,y;<br />

assign hw_out=hw[11],lw_out=lw[11],d_out=d[11],c_out=c[11]; // definerer hvor<br />

utgangene er<br />

dpspms<br />

s0(hw[0],lw[0],d[0],c[0],y[0],c0,1'b0,1'b0,d_in,c_in,y_in),<br />

s1(hw[1],lw[1],d[1],c[1],y[1],c0,hw[0],lw[0],d[0],c[0],y[0]),<br />

s2(hw[2],lw[2],d[2],c[2],y[2],c0,hw[1],lw[1],d[1],c[1],y[1]),<br />

s3(hw[3],lw[3],d[3],c[3],y[3],c0,hw[2],lw[2],d[2],c[2],y[2]),<br />

s4(hw[4],lw[4],d[4],c[4],y[4],c0,hw[3],lw[3],d[3],c[3],y[3]),<br />

s5(hw[5],lw[5],d[5],c[5],y[5],c0,hw[4],lw[4],d[4],c[4],y[4]),<br />

s6(hw[6],lw[6],d[6],c[6],y[6],c0,hw[5],lw[5],d[5],c[5],y[5]),<br />

s7(hw[7],lw[7],d[7],c[7],y[7],c0,hw[6],lw[6],d[6],c[6],y[6]),<br />

s8(hw[8],lw[8],d[8],c[8],y[8],c0,hw[7],lw[7],d[7],c[7],y[7]),<br />

s9(hw[9],lw[9],d[9],c[9],y[9],c0,hw[8],lw[8],d[8],c[8],y[8]),<br />

s10(hw[10],lw[10],d[10],c[10],y[10],c0,hw[9],lw[9],d[9],c[9],y[9]);<br />

dpspmlasts s11(hw[11],lw[11],d[11],c[11] ,c0,hw[10],lw[10],d[10],c[10],y[10]);<br />

endmodule<br />

59


OBS! dpssmultiplier lw har ingen fortegnsbit, lw er derfor skiftet en til venstre i forhold til<br />

et signert resultat<br />

// LSB i lw vil derfor alltid være 0<br />

// Har forsinkelse 2*cwl+2 ( i dette tilfelle 24)<br />

module dpssmultiplier(hw,lw,d_out,c1_out,c0,c1_in,d_in,coef_in);<br />

parameter swl=12;<br />

output hw,lw,d_out,c1_out;<br />

input c0,c1_in,d_in,coef_in;<br />

endmodule<br />

// ff5,ff7,ff9,ff13 er buffer på utgangen <strong>av</strong> mux'ene.<br />

// De kan som oftest sløyfes<br />

// Positiv gren ----><br />

dEdgeFF ff1(ff1_out,c0,c1_in),<br />

ff2(ff2_out,c0,d_in),<br />

ff3(ff3_out,c1_in,ff2_out), // Låser fortegnet.<br />

ff4(ff4_out,c0,hw_pos_out),<br />

//ff5(hw,c0,prodhw), // ikke nødvendig<br />

ff6(d_out,c0,d_pos_out),<br />

//ff7(d_out,c0,ff6_out), // kan fjernes sammen med ff5,ff9,ff13<br />

ff8(c1_out,c0,c1_pos_out),<br />

//ff9(lw_prod_neg,c0,lw_neg_out),<br />

ff10(ff10_out,c0,coef_in),<br />

ff11(ff11_out,c1_in,ff3_out),//<br />

ff12(ff12_out,c0,ff11_out),<br />

//ff13(lw,c0,prodlw),<br />

ff14(ff14_out,c0,lw_pos_out),<br />

ff15(ff15_out,c0,ff3_out);<br />

dpssmult<br />

sp(hw_pos_out,lw_pos_out,d_pos_out,c1_pos_out,c0,ff1_out,ff2_out,ff10_out);<br />

// Negativ gren ----><br />

serial_sub sub1(d_neg,c_out1,c0,c1_in,1'b0,d_in,1'b1),// feil på signalering <strong>av</strong> lsb<br />

sub2(lw_prod_neg,c_out2,c0,c1_pos_out,1'b0,lw_neg_out,1'b1),<br />

sub3(hw_prod_neg,c_out3,c0,c1_pos_out,1'b0,hw_neg_out,c_out2);<br />

dpssmult<br />

sn(hw_neg_out,lw_neg_out,d_neg_out,c1_neg_out,c0,ff1_out,d_neg,ff10_out);<br />

multiplex m1(hw,ff12_out,ff4_out,hw_prod_neg),<br />

m2(lw,ff15_out,ff14_out,lw_prod_neg); // Velger gren.<br />

60


Implementering.<br />

Filterstrukturene jeg har beskrevet under <strong>av</strong>snittet ’Filterstrukturer’ er alle virtuelle maskiner,<br />

dvs. multiplikatorene og adderene er ikke ment å ha forsinkelse på signalveien. All forsinkelse<br />

ligger implisitt i ett forsinkelsesregister.<br />

I det bitserielle biblioteket har alle modulene forsinkelse på en eller mer. Dette må tas hensyn<br />

til når filteret skal implementeres i maskinvare.<br />

Jeg skal først implementere en 2’ordens IIR filter modul.<br />

IIR filter.<br />

Fig 46.<br />

Multiplikatorene er merket m1,m2,m3 og m4. Adderene er merket a1,a2,a3 og a4.<br />

Forsinkelses elementene R1 og R2. Filterstrukturen er <strong>av</strong> typen ’Direkte Form II’, med to<br />

poler og to nullpunkter. Jeg har valgt å analysere et 2. ordens filter for eksempelets skyld,<br />

normalt vil et filter bestå <strong>av</strong> flere slike ledd.<br />

Filteret må tilfredstille rekursjonen y(n) = Ax(n) + Bx(n-1) + Cy(n-1) + Dy(n-2), der<br />

koeffesientene er skalert slik at A = 1.<br />

Jeg skal analysere forsinkelsen gjennom de ulike grenene og velger origo, t = 0, ved<br />

inngangen, x(n). Adderen har en forsinkelse 1,R1 har forsinkelse f1 og multiplikatoren, med<br />

koeffesientlengde cwl har en forsinkelse 2*cwl + 3. Den totale forsinkelsen i<br />

tilbakeføringssløyfen fra a1,R1,m1,a2 tilbake til a1, blir summen <strong>av</strong> forsinkelsene, 1 + f1 +<br />

2*cwl +3 +1 = f1+2*cwl + f1.<br />

Skal rekursjonslikningen være oppfyllt må forsinkelsen i sløyfen være lik swl. Om jeg setter<br />

f1 = 0 er forsinkelsen lik 2*cwl + 5.Hvis cwl = swl blir forsinkelsen i multiplikatoren så stor at<br />

den ikke rekker å beregne ett resultat før en ny sampel annkommer filteret. Dette <strong>av</strong>slører ett<br />

problem med bitseriell implementering <strong>av</strong> IIR filtere. Forsinkelsen i elementene er så stor at<br />

det setter begrensninger på størrelsen til koeffesientene.<br />

En måte å komme rundt dette på kan være å buffre data-samplene. Man må da godta at<br />

61


multiplikatorene vil beregne ’skrot’ i deler <strong>av</strong> klokkesyklene, slik at resultatet får tid til å<br />

kommer gjenom tilbakeføringen. Dette bufferet kan være en rekke med fortegnsutvidelser<br />

mellom samplene. Denne løsningen gir mulighet til vilkårlig store koeffesient-lengder på<br />

bekostning <strong>av</strong> økt forsinkelse og dårligere utnyttelse <strong>av</strong> maskinvaren.<br />

Ellers må bredden på koeffesienteene (cwl) reduseres i forhold til swl. Tids-likningen for den<br />

første tilbakeføringssløyfen blir da 2*cwl+5


Koeffesientene må skaleres før de gis til multiplikatoren, mshift skalerer utgangssignalet opp<br />

igjen med s^2.<br />

Den store forsinkelsen i multiplikatorene gjør altså at bredden på koeffesientene må reduseres<br />

i forhold til bredden på signalet. Dette gjelder for alle filtere som har tilbakeføring, også<br />

lattice filtere<br />

FIR filtre.<br />

Ett FIR filter har ingen tilbakeføringer og bredden på koeffesientene er bare begrenset <strong>av</strong> hvor<br />

stor forsinkelse filteret kan tillates å ha.<br />

Som eksempel har jeg valgt å bruke en seriell-seriell multiplikator med forsinkelse swl, dvs.<br />

en koeffesientlengde swl-3. Produktet vil nå komme til rett tid til adderen a1. Adderen har<br />

forsinkelse 1. For å kompensere for dette må jeg legge til en DFF på data_out. Hvert filterledd<br />

har en total forsinkelse swl.<br />

Ett FIR filterledd har verilog modell :<br />

parametere :<br />

swl – signal-ordbredde<br />

cwl – koeffesient ordbredde<br />

module Fl(y_out,d_out,c1_out,c0,c1_in,d_in,y_in,coeff);<br />

parameter swl,cwl;<br />

output y_out,d_out,c1_out;<br />

input c0,c1_in,d_in,y_in;<br />

input [cwl-1:0] coeff;<br />

multiply #(cwl) m1(p_out,data_out,c1_out,c0,c1_in,d_in,coeff);<br />

add a1(a1_out,c_out,c0,c1_out,p_out,y_in,1'b0);<br />

delay #(swl-1) d1(y_out,c0,a1_out);<br />

endmodule<br />

Y_out,d_out og kontrollsignalet c_out kommer nå ut sammtidig og dette forenkler arbeidet<br />

med å lage et FIR filtere <strong>av</strong> vilkårlig orden N.<br />

module FIR(y,c0,c1,data,coeff);<br />

output y;<br />

input c0,c1,data;<br />

input [cl-1:0] coeff [N-1:0];<br />

wire [N-1:0] y_out,dd,cc;<br />

ledd l1(y_out[1],dd[1],cc[1],c0,c1 ,data ,coeff[1]),<br />

l2(y_out[2],dd[2],cc[2],c0,cc[1],dd[1],coeff[2]),<br />

l3(y_out[3],dd[3],cc[3],c0,cc[2],dd[2],coeff[3]),<br />

l4(y_out[4],dd[4],cc[4],c0,cc[3],dd[3],coeff[4]),<br />

.<br />

63


endmodule<br />

.<br />

.<br />

lN(y,dd[N],dd[N],c0,cc[N],d[N-1],coeff[N]);<br />

c0 er det eneste kontrollsignalet som er globalt, c1 påtrykkes bare på inngangen <strong>av</strong> FIR<br />

filteret.<br />

Praktiske FIR filtere har høy orden, og utgangen består da <strong>av</strong> mange del-produkter som legges<br />

sammen. Dette gir en stor bitvekst i summen. Enten kan koeffesientene skaleres så l<strong>av</strong>t at delproduktene<br />

blir små, eller så kan swl økes for å gi rom til bitvekseten. En annen metode er å<br />

øke data representasjonen der hvor bitveksten skjer. Jeg gjør dette i eksemplet nedenfor. Jeg<br />

bruker dpSeriellSeriell multiplikator og denne gir produktet i dobbelpresisjon. På utgangen <strong>av</strong><br />

denne brukes format2to3, dermed er ordlengden 3*swl i adder-rekken. Dette gir en god<br />

dynamisk bredde. På utgangen må bredden på signalet reduseres til swl igjen. Dette gjøres<br />

med format3to1.<br />

I multiplikatoren DPMULTIPLY, kommer produktene ut LW_int forsinket swl+2 og HW_int<br />

er forsinket 2*swl+2. MW og HW fra Format1To2 er forsinket 1 i forhold til LW_int, DFF5<br />

kompenserer for dette før delproduktene gis til adder rekken.<br />

I filterlerleddet IP skal alle signalene ankomme med LSB langs samme bølgefront, og<br />

DFF6 – DFF14 synkroniserer signalene i adder-rekken. DFF1 – DFF4 synkroniserer d_out og<br />

c1_out med LW_out, MW_out og HW_out. På utgangen <strong>av</strong> disse igjen, er skiftregistere R1,<br />

R2 og R3 med lengde swl.<br />

Forsinkelsen i data banen er 2*swl+4 og i adder banen swl+4, dette tillfredstiller FIR filter<br />

likningen. ’Ekstra’ forsinkelsen på swl+4 er lik i alle signalveiene og forandrer derfor ikke<br />

resultatet. Dette er en ’pipelining’ prosessoren. Registerene R1, R2 og R3 kan sløyfes i det<br />

siste leddet i en ’full array’ implementasjon.<br />

Fig 47. Filterledd IP.<br />

64


Verilog modell:<br />

module<br />

IP(hw_out,mw_out,lw_out,data_out,c1_out,c0,c1_in,hw_in,mw_in,lw_in,data_in,coeff_in);<br />

output hw_out,mw_out,lw_out,data_out,c1_out;<br />

input c0,c1_in,hw_in,mw_in,lw_in,data_in,coeff_in;<br />

parameter swl=12;<br />

endmodule<br />

dpssmultiplier #(swl)mult(hw,lw,di,ci,c0,c1_in,data_in,coeff_in);<br />

format1to2 form(hwi,mwi,c0,ci,hw);<br />

serial_adder a1(lwii,carry1,c0,d3_out,d5_out,d8_out,1'b0),<br />

a2(mwii,carry2,c0,d3_out,mwi,d11_out,carry1),<br />

a3(hwii,carry3,c0,d3_out,hwi,d14_out,carry2);<br />

dEdgeFF d1(d1_out,c0,di),<br />

d2(data_out,c0,d1_out), // data_out forsinkes 2<br />

//ganger for å synce med lw_out<br />

d3(d3_out,c0,ci), // brukes til å klokke adderene<br />

d4(c1_out,c0,d3_out),<br />

d5(d5_out,c0,lw);<br />

dEdgeFF d6(d6_out,c0,lw_in),<br />

d7(d7_out,c0,d6_out), // alle data inn i adderene<br />

//må forsinkes 3 ganger<br />

d8(d8_out,c0,d7_out), // for å synkronisere med ny<br />

// addend<br />

d9(d9_out,c0,mw_in),<br />

d10(d10_out,c0,d9_out),<br />

d11(d11_out,c0,d10_out),<br />

d12(d12_out,c0,hw_in),<br />

d13(d13_out,c0,d12_out),<br />

d14(d14_out,c0,d13_out);<br />

Register r1(lw_out,c0,lwii), // disse kan sløyfes i siste ledd i en<br />

// 'full array' arkitektur<br />

r2(mw_out,c0,mwii),<br />

r3(hw_out,c0,hwii);<br />

Fig 48. N-ordens FIR filter. ’Full array’ arkitektur.<br />

65


Hvis filteret realiseres med en prosessor per koeffesient som ovenfor, vil det oftest bli raskere<br />

enn nødvendig.<br />

Målet med implementeringen <strong>av</strong> ett filter må være å utnytte maskinvaren best mulig dvs. å<br />

klokke den på høyest mulig frekvens. Er filteret raskere enn nødvendig er det mulig å<br />

multiplekse filteret og dermed spare maskinvare ressurser. Dette er det samme som å<br />

båndbredde tillpasse filteret.<br />

Multiplekset FIR filter.<br />

Nedenfor har jeg laget en modul som bruker ett filterledd til alle beregningene. Filteret har<br />

orden N. Koeffesientene har bredde cwl biter.<br />

Filterleddet har jeg kalt IP2 og det er likt IP bortsett fra at R1, R2 og R3 er sløyfet.<br />

Prossesoren har to innganger, en for seriell data og en for seriell koeffesient buss. Utgangen er<br />

seriell.<br />

Internt er det to kontrollsignaler, en bit klokke c0 og en ordklokke c1. Ordklokkens frekvens<br />

må være N*sampelfrekvensen.<br />

Koeffesientsløyfen sirkulerer koeffesientene til multiplikatoren og akkumulatorsløyfen samler<br />

opp resultatene. Koeffesientsløyfen er ikke vist i figuren. Resultatet hentes på utgangen hver<br />

c_sample.<br />

Skiftregisterene d1,d2,d3 og d4, sørger for minne til prosessoren. Forsinkelsen i IP mellom<br />

d_in og d_out er 2*cwl+4. Forsinkelsen i hele sløyfen skal være N*swl + 1, d1 må derfor ha<br />

forsinkelse N*swl – 2*cwl – 3.<br />

Forsinkelsen mellom LW_in,MW_in, HW_in og LW_out, MW_out , HW_out er 1.<br />

Denne sløyfen skal ha en total forsinkelse på swl. Registerene d1, d2 og d3 må derfor ha<br />

lengde swl-1.<br />

Multiplekserene styres <strong>av</strong> ordklokker med pulser <strong>av</strong> lengde swl. Cm1 styrer in ett nytt sampel<br />

så snart prosessoren er ferdig med N iterasjoner. Cm2, Cm3, og Cm4 sørger for å slette<br />

resultatet i akkumulatoren når prosessoren er klar til å ta fatt på N nye iterasjoner. Dette må<br />

skje samtidig med at LW fra det nye samplet kommer til ADD1. Dette skjer cwl+3 etter Cm1.<br />

Cm3 of Cm4 er forsinket med swl i forhold til Cm2.<br />

Altså:<br />

Cm1 = C20. Cm2 = C2(cwl + 3). Cm3 = C2(swl + cwl + 3). Cm4 = C2(2*swl + cwl + 3).<br />

66


Fig 45. Multiplekset FIR filter.<br />

Verilog modell:<br />

// Ett FIR filterledd uten R1, R2 og R3 registere på adderrekken,<br />

// kan brukes som siste ledd in en 'full array' arkitektur eller i ett multipleksed FIR filter<br />

// forsinkelse på data er 2*cwl+4 = 28<br />

// forsinkelse i adderrekken er 4<br />

module<br />

IP2(hw_out,mw_out,lw_out,data_out,c1_out,c0,c1_in,hw_in,mw_in,lw_in,data_in,coeff_in);<br />

output hw_out,mw_out,lw_out,data_out,c1_out;<br />

input c0,c1_in,hw_in,mw_in,lw_in,data_in,coeff_in;<br />

parameter swl=12;<br />

dpssmultiplier #(swl)mult(hw,lw,di,ci,c0,c1_in,data_in,coeff_in);<br />

format1to2 form(hwi,mwi,c0,ci,hw);<br />

serial_adder a1(lw_out,carry1,c0,d3_out,d5_out,d8_out,1'b0),<br />

a2(mw_out,carry2,c0,d3_out,mwi,d11_out,carry1),<br />

a3(hw_out,carry3,c0,d3_out,hwi,d14_out,carry2);<br />

dEdgeFF d1(d1_out,c0,di),<br />

d2(data_out,c0,d1_out), // data_out forsinkes 2<br />

//ganger for å synce med lw_out<br />

67


endmodule<br />

d3(d3_out,c0,ci), // brukes til å klokke adderene<br />

d4(c1_out,c0,d3_out),<br />

d5(d5_out,c0,lw); // format1to3 har forsinkelse 1,<br />

// denne synkroniserer dem<br />

dEdgeFF d6(d6_out,c0,lw_in),<br />

d7(d7_out,c0,d6_out), // alle data inn i adderene<br />

d8(d8_out,c0,d7_out), // må forsinkes 3 ganger<br />

d9(d9_out,c0,mw_in), // for å synkronisere med ny addend<br />

d10(d10_out,c0,d9_out),<br />

d11(d11_out,c0,d10_out),<br />

d12(d12_out,c0,hw_in),<br />

d13(d13_out,c0,d12_out),<br />

d14(d14_out,c0,d13_out);<br />

// multipleksed FIR filter<br />

// med ekstern koeffesient sløyfe<br />

//<br />

module multiplexFIR(out,test,c1_out,c0,c1_in,c20_in,c21_in,c22_in,data_in,coeff_in);<br />

output out,test,c1_out;<br />

input c0,c1_in,c20_in,c21_in,c22_in,data_in,coeff_in;<br />

wire lwi_out,mwi_out;<br />

assign out=lwi_out,test=mwi_out;<br />

IP2<br />

#(12)ip(hwi_out,mwi_out,lwi_out,di_out,c1_out,c0,c1_in,m4_out,m3_out,m2_out,<br />

m1_out,coeff_in);<br />

Register2 r2(r2_out,c0,lwi_out), // registerene i adder rekken swl-4<br />

r3(r3_out,c0,mwi_out),<br />

r4(r4_out,c0,hwi_out);<br />

Register3 r1(r1_out,c0,di_out); // registeret i data sløyfen<br />

// ((N+1)*swl – (2*cwl+4))<br />

multiplex m1(m1_out,c20_in,r1_out,data_in),<br />

m2(m2_out,c20_in,r2_out,1'b0),<br />

m3(m3_out,c21_in,r3_out,1'b0),<br />

m4(m4_out,c22_in,r4_out,1'b0);<br />

endmodule<br />

Filteret ovenfor har en von Neumann arkitektur. Når filteret skal båndbredde tilpasses, vil det<br />

vanligvis kreve at flere moduler <strong>av</strong> typen ovenfor seriekobles. Dette krever at data-sløyfene<br />

og akkumulator-sløyfene i multiplexFIR-modulene sammenkobles. Dette lar seg enkelt gjøre,<br />

68


og alle grader <strong>av</strong> multipleksing mellom ’full array’ og ’von Neumann’ er mulig.<br />

Test <strong>av</strong> filtere .<br />

FIR filterene ovenfor kan enkelt testes med en ’konvulsjonstest’ 10 . Koeffesientene i denne<br />

testen danner en firkant (N=11) {0,0,0,A,A,A,A,A,0,0,0} og datasignalet ett firkant signal<br />

...0,0,0,B,B,B,B,B,0,0,0... . Konvulsjonen <strong>av</strong> to firkanter er en trekant, i dette tillfellet en<br />

trekant med maks høyde 5AB : ..0,0,AB,2AB,3AB,4AB,5AB,4AB,3AB,2AB,AB,0,0...<br />

Kjøringen <strong>av</strong> denne testen viser at filterene fungerer som de skal.<br />

Fig. 47. Test <strong>av</strong> filter.<br />

1200<br />

1000<br />

800<br />

600<br />

400<br />

200<br />

0<br />

Test <strong>av</strong> FIR filter<br />

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29<br />

Jeg skal lage en mer realistisk test med å danne ett l<strong>av</strong>pass-filter. L<strong>av</strong>pass-filteret skal ha disse<br />

egenskapene:<br />

F(cuttof) =1/10 F(nyqvist)<br />

swl = 12<br />

Filterorden N = 21<br />

Antallet desimalplasser som er nødvendig for å representere ett 12 bits fraksjon er gitt <strong>av</strong><br />

formelen 7 : d = I(0.3b + 1), der d er antallet desimalplasser, b er cwl og I(x) er absolutt<br />

verdien <strong>av</strong> x.<br />

I dette tilfellet, med cwl =12, blir d = I(0.3*12+1) = I(4.6) = 4.<br />

Med disse parameterene gir Remez-algoritmen i matlab følgende koeffesienter:<br />

f=[0 0.1 0.2 1];% frekvensommrådet<br />

a=[1 1 0 0]; %ønsket amplitude respons<br />

b = remez(n,f,a);<br />

Serie1<br />

69


{-0.0390 -0.0187 -0.0146 -0.0028 0.0168 0.0433 0.0736 0.1039 0.1298 0.1472<br />

0.1533 0.1472 0.1298 0.1039 0.0736 0.0433 0.0168 -0.0028 -0.0146 -0.0187 -0.0390 }<br />

Frekvensresponsen til dette filteret er vist i fig 48 nedenfor. Dette er den teoretiske responsen,<br />

generert <strong>av</strong> matlab.<br />

Fig 48.<br />

Koeffesientene som gis til multiplikatoren må ligge mellom , den største her er 0.1533<br />

og den minste er -0.0390. Jeg finner først den største faktoren, delelig på 2, som gjør at<br />

koeffesientene utnytter området best mulig. I dette tillfellet er det 4.<br />

Multiplisert med 4 blir koeffesientene nå:<br />

{ -0.1560 -0.0748 -0.0584 -0.0114 0.0674 0.1732 0.2946 0.4156 0.5191 0.5886<br />

0.6134 0.5886 0.5191 0.4156 0.2946 0.1732 0.0674 -0.0114 -0.0584 -0.0748 -0.1560 }<br />

70


I binær representasjon og med cwl = 12 , blir koeffesientene:<br />

{ 111011000001, 111101100111, 111110001001, 111111101001, 000010001010,<br />

000101100010, 001001011111, 001101010011, 010000100111, 010010110101,<br />

010011101000, 010010110101, 010000100111, 001101010011, 001001011111,<br />

000101100010, 000010001010, 111111101001, 111110001001, 111101100111,<br />

111011000001 }<br />

For å <strong>av</strong>gjøre hvilken del <strong>av</strong> resultatet Format2To1 skal plukke ut på utgangen, må jeg finne<br />

det størst mulige resultatet som kan komme ut <strong>av</strong> filteret. Med cwl =12 og en ’guard-bit’ på<br />

data, er det største signalet som kommer inn til filteret 001111111111 = 1023. Største signal<br />

på utgangen blir da 1023*(-319 –153 –119 –23 +138 +354 +607 +851 +1063 +1205 + 1256<br />

+1205 +1063 +851 + 607 +354 +138 –23 -119 –153 -319) = 1023*8464 eller<br />

100001000001111011110000 .<br />

Format3To1 må derfor plukke ordet fra hw1 til mw2, dvs. out består <strong>av</strong> :<br />

{hw1 hw0 mw11 mw10 mw9 mw8 mw7 mw6 mw5 mw4 mw3 mw2}.<br />

Test signalet består <strong>av</strong> 3 sinus signaler, y=sin(400*t) + 0.5*sin(3300*t) + 0.5*sin(1900*t).<br />

De er samplet slik at fs=10000Hz, fn=5000 og dermed blir fcuttof=500Hz.<br />

Den første sinusen ligger innenfor passbandet, de to andre ligger i stoppbandet.<br />

Før filtrering ser signalet ut som i figuren nedenfor:<br />

Fig. 49.<br />

71


Etter filtreringen ser signalet slik ut:<br />

De to signalene som lå i stoppbandet er effektivt dempetm mens signalet i passbandet er<br />

uforandret. Uregelmessighetene i starten <strong>av</strong> filtreringen (før 21. sampel) skyldes at minnet i<br />

filteret er ’tomt’ i utgangspunktet.<br />

Fig. 50.<br />

800<br />

600<br />

400<br />

200<br />

0<br />

-200<br />

-400<br />

-600<br />

-800<br />

1 9 17 25 33 41 49 57 65 73 81 89 97<br />

out<br />

72


Konklusjon.<br />

Jeg har i denne oppg<strong>av</strong>en vist at det er mulig å lage alle vanlige funksjoner i en bitseriell<br />

implementering. De bitserielle cellene vil være små og strukturen muligjør en kompakt<br />

realisering i utlegget.<br />

Det som også har kommet fram er at cellene øker mindre i størrelse med økende ordlengder<br />

enn tilsvarende funksjoner uført i parallell logikk.<br />

Ulempen viser seg i cellenes forsinkelse, særlig i multiplikatorene. Dette fører til<br />

begrensninger i koeffesientlengdene for filtere med tilbakeføring (IIR/Lattice). Denne<br />

begrensningen gjelder ikke for FIR filtere og i multipleksede FIR filtere vil denne<br />

forsinkelsen utnyttes som en del <strong>av</strong> minnet i data-sløyfen og adder-sløyfen. Bitseriell<br />

implementering er derfor godt egnet til disse filterene.<br />

Det som idag begrenser bruken <strong>av</strong> bitseriell implementering er hastigheten, parallell<br />

implementering vil alltid kunne lages raskere enn en tilsvarende seriell implementering. Jeg<br />

tror likevel at seriell implementering har så mange fordeler at det vil få flere og flere<br />

annvendelses områder.<br />

73


Litteratur<br />

1 D<strong>av</strong>id Pescovitz. "Wired for Speed."<br />

SCIENTIFIC AMERICAN, MAY 2000<br />

2 Raymond J. Andraka."FIR Filter Fits in an FPGA using Bit Serial Approach"<br />

3 DIGITAL NUMBER SYSTEMS<br />

4<br />

Kent Palmkvist. "Design and Implementation of Recursive Digital Filters using Bit-Serial<br />

arithmetics."<br />

Linkøping University, S-581 83 Linkøping Sweden.<br />

5 Per Larsson-Edefors."High-Speed CMOS Design Bit-Serial Arithmetic Applications and<br />

Tecnology Mapping of Combinational Boolean Equations."<br />

Linkøping University, S-581 83 Linkøping, Sweden.<br />

6 Richard A. Roberts,Clifford T. Mullis." DIGITAL SIGNAL PROCESSING."<br />

Addison-Wesly.ISBN 0-201-16350-0<br />

7 E.L . Johnson, M.A Karim,"DIGITAL DESIGN. A PRAGMATIC APPROACH"<br />

PWS ENGINEERING. ISBN 0-534-06972<br />

8<br />

Peter Denyer, D<strong>av</strong>id Renshaw. "VLSI SIGNAL PROCESSING:A BIT-SERIAL<br />

APPROACH."<br />

ADDISON-WESLEY PUBLISHING COMPANY. ISBN 0-201-14404-2<br />

9 Howard Hutchings. "INTERFACING WITH C"<br />

An Elektronics World + Wireless World Publication.<br />

10 Sanjit K. Mitra. "Digital Signal Processing. A Computer-Based Approach."<br />

McGraw-Hill Higher Education. ISBN 0-07-118175-X<br />

74

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!