Sampler/trommemaskine

Størrelse: px
Starte visningen fra side:

Download "Sampler/trommemaskine"

Transkript

1 Sampler/trommemaskine P4-projekt Gruppe 416 Elektronik & IT Aalborg Universitet Den 27. Maj 2014

2 2. Studieår v/ Det Teknisk- Naturvidenskabelige Fakultet Elektonik og IT Fredrik Bajers Vej Aalborg Titel: Sampler/trommemaskine Projekt: P4-projekt Projektperiode: Februar Juni 2014 Projektgruppe: 416 Deltagere: Anders Charly Rasmussen Rasmus Mogensen Tobias Nørgård Dahl Andreas Harbo Rukjær Vejledere: Søren Krarup Olesen Synopsis: Der bliver i dag udviklet og fremstillet ganske få hardware-samplere. På trods af dette er de stadig eftertragtede. Derfor vil en hardwaresampler blive designet, som kan optage lydklip og gemme dem i en hukommelse. Det er derudover valgt, at denne sampler også skal have visse funktioner fra en trommemaskine. Brugeren skal kunne programmere de samplede lyde ind i en sekvens, som derefter kan afspilles. Der vil blive konstrueret en prototype, som anvendes til accepttest. Til udvikling af prototypen tages der udgangspunkt i en spartan-3 platform. Efter testene kan det konkluderes, at prototypen ikke overholder krav til lydkvalitet, afspilning af samples og digitalt output. Sidetal: 106 Appendiks: 4 Afsluttet Rapportens indhold er frit tilgængeligt, men offentliggørelse (med kildeangivelse) må kun ske efter aftale med forfatterne.

3 Titelblad Anders Rasmussen Andreas Harbo Rukjær Rasmus Mogensen Tobias Nørgård Dahl iii

4 Forord Denne rapport er skrevet i 2014 af studerende fra Aalborg Unviersitet på fjerde semester med studieretningen Elektronik og IT. Rapporten omhandler design og test af en sampler, der er kombineret med en trommemaskine. Denne sampler kan optage lyde, lægge dem ind i en sekvens i en kombiantion efter brugerens ønske, og afspille denne sekvens. Rapporten indeholder design af sampleren med udgangspunkt i en spartan-3 platform. Der vil blive lavet en prototype af sampleren, hvorpå testene vil blive udført. iv

5 Læsevejledning Rapporten er inddelt i kapitler, hvor der i starten af hvert kapitel vil være en kort introduktion. Der vil ligeledes være en opsummering til sidst i hvert kapitel. I rapporten er til sidst en kildeliste. Samtlige kilder er desuden vedlagt på en CD, såfremt det er en internetside. Igennem rapporten er figurer og tabeller nummereret, i henhold til hvilket kapitel de befinder sig i. Det vil sige, at figur 3.1 eksempelvis er den første illustration i kapitel 3. Der vil blive refereret til kapitler med det tilhørende kapitelnummer. Der vil blive refereret til formler med parantes omkring formlens reference nummer. Efter konklusionen kommer bilag til rapporten. Der vil blive refereret til bilag på samme måde, som der referres til kapitler. v

6 Ordliste A/D (Analog til Digital) ADC (Analog to Digital Converter) ALU (Arithmetic Logical Unit) ASMD (Algorithmic State Machine with Data path) BCD (Binary-Coded Decimal) BPM (Beats Per Minute) CE (Chip Enable) FIT (Fixed Interval Timer) FPGA (Field-Programmable Gate Array) FSO (Frame Sync Out) GPI (General Purpose Input) GPO (General Purpose Output) LB (Lower byte Enable) LED (Light Emitted Diode) LSB (Least Significant Bit) MSB (Most Significant Bit) OE (Output Enable) RAM (Random Acces Memory) SCO (Serial Clock Out) SDO (Serial Data Out) SFMT (Serial Format) SIPO (Serial in Parallel Out) SRAM (Static Random Access Memory) UAR/T (Universal Asynchronous Receiver/Transmitter) UB (Upper byte Enable) VHDL (Very high speed integrated circuit Hardware Description Language) WE (Write/Read Enable) vi

7 Indholdsfortegnelse Kapitel 1 Indledning 1 Kapitel 2 Initierende problemformulering 2 Kapitel 3 Problemanalyse Grundlæggende om sampler og trommemaskine Sampler Sequencer Trommemaskine Kapitel 4 Indledning til problemformulering Problemformulering Kapitel 5 Kravspecikation Generelle krav Krav til sampler Krav til trommemaskine Kapitel 6 Design FPGA Microblaze Hukommelse Sampling af lyd Design af brugerflade Programmeringsfilosofier Funktionsbeskrivelser Softwareopdeling C-program Sekvenstiming segment display Kapitel 7 Accepttest Sampler Trommemaskine Kapitel 8 Konklusion 65 Kapitel 9 Perspektivering 66 Litteratur 68 Figurer 69 vii

8 Indholdsfortegnelse Aalborg Universitet Tabeller 72 Appendiks A Digital konvertering 73 A.1 Analogt til digitalt signal A.2 Sampling A.3 Kvantisering Appendiks B Test af analog til digtal konvertering med DSP56ADC16 Appendiks C C-program Appendiks D VHDL Kode viii

9 Indledning 1 I dag bliver langt det meste musik distribueret ved hjælp af digitale medier, eksempler på dette er Spotify, Youtube, lovlige eller ulovlige MP3-filer eller radio via nettet. Men sådan har det ikke altid været, overgangen fra analog til digital musik-teknologi skete sammen med CD ens udbredelse op igennem 90 erne. CD erne blev skabt med henblik på at finde en afløser for den gammeldags grammofonplade[cd]. Sammen med CD ens udbredelse, blev mere og mere musikudstyr konverteret til digital teknologi, og i dag er næsten alt musik blevet redigeret, eller på anden måde blevet behandlet på en computer. Der er også musikgenrer, som udelukkende eksisterer på baggrund af den digitale lyds gennembrud, her tænkes der især på elektroniske musikgenrer, heraf navnet elektronisk, som i de seneste år har fået en voldsom popularitet med egne festivaller og store koncerter. Hiphoppen tog også ret hurtigt de nye digitale instrumenter til sig, særligt blev trommemaskinen og sampleren brugt meget inden for denne genre. Et eksempel på sådan en maskine er E-MU SP-1200 [Emu] der blev udgivet i Med de digitale mediers stigende popularitet, blev det også nødvendigt at kunne håndtere musikken digitalt, for at gøre redigering, og tilpasningen nemmere for producerne. Der blev brugt samplere til at indspille lyden digitalt, da musikken skulle over på digital form. De første digitale samplere blev tilgængelige i slutningen af 1970 erne, men de var stadig meget dyre, og ofte skulle et helt computersystem bygget omkring sampleren, dette tog meget plads, og var beregnet til brug i musikstudier. Det var først senere at samplerne blev produceret til en pris og størrelse, som gjorde det muligt for hobbyister at bruge dem. I begyndelsen af den digitale musiks gennembrud, fandtes der kun hardwaresamplere. En hardwaresampler er som navnet antyder en sampler der er lavet ved hjælp af hardware, forskellige digitale kredsløb der kan behandle digital musik. Softwaresampleren var i begyndelsen ikke særlig anvendelig, på grund af den lave regnekraft i datidens computere. Men i dag er det den mest populære sampler, og med de computere der findes i dag er det muligt at lave meget advanceret lydbehandling på grund af den store regnekraft i nutidens computere. I dag bliver meget musik produceret på softwaresamplere og trommemaskiner, det har sat udviklingen af hardwaresampleren og trommemaskine i bero, da det er nemmere at opdatere et stykke software, og købe ekstra lyde til. Men der er stadig folk som anvender de gamle hardwaresamplere og trommemaskiner, da de har en unik lyd i forhold til de nyere softwaresamplere. 1

10 Initierende problemformulering 2 Hvilke grundlæggende funktioner har sampleren og trommemaskinen? Hvilke principper ligger til baggrund for samplerens og trommemaskinens funktioner? Hvad adskiller moderne samplere og trommemaskiner fra deres tidligste stadie? 2

11 Problemanalyse Grundlæggende om sampler og trommemaskine I dette afsnit vil de overordnede funktioner og principper, ved en sampler og en trommemaskine, blive forklaret. Disse uddybes senere i problemanalysen. For at skabe grundlag for forståelse indenfor digitale elektroniske instrumenter, vil forskellen mellem et analogt signal og et digitalt signal kort blive forklaret Analogt signal Et analog signal er kontinuerligt. Dvs. at amplituden og tiden har en uendelig høj opløsning. Analoge elektroniske musikinstrumenter består udelukkende af analoge komponenter, som modstande, spoler, kondensatorer og halvledere. Typisk sat sammen i store, tunge, komplicerede kredsløb. Signalvejen er altså analog hele vejen igennem. Eksempler på analoge musikinstrumenter kan være synthesizere, Hammond-orgel [ham] samt thereminen [the] Digitalt signal Modsat de analoge signaler har digitale signaler ikke en uendelig opløsning. Med andre ord er amplituden og tiden diskrete. Signalvejen for digitale elektroniske instrumenter kan have analog indgange og/eller udgange, hvor signalet er digitalt under instrumentets behandling af lyden. Digitale elektroniske instrumenter kan laves langt mindre og mere energieffektive end de analoge Sampleren En sampler er i stand til at optage lyde fra en lydkilde, og gemme det på dens indbygget hukommelse. Dette kan eksempelvis være lyde fra en pladespiller eller en mikrofon. En sampler konverterer altså analog lyd til digital lyd og gemmer det. I sampleren er det også muligt at manipulere med de lyde sampleren har optaget, dette kan fx være at tilpasse længden af den lyd der er optaget, eller ændre lydens toneleje. 3

12 3.2. Sampler Aalborg Universitet Trommemaskinen Trommemaskinen er et instrument der i forvejen indeholder af forskellige trommelyde, gemt på en intern hukommelse. Stortromme, lilletromme, hihat og tommer, kunne være eksempler på lyde i en trommemaskine. Trommemaskinen indeholder en sequencer, hvilket gør det muligt, at programmere en rytme til et justerbart tempo Opsummering I dette afsnit er forskellen mellem et analogt og digital signal beskrevet ved, at et digitalt signal er diskret. En sampler kan optage, redigere og gemme lyd, hvor en trommemaskine kan programmere eksisterende lyde ind i en sekvens, ved hjælp af en sequencer. De efterfølgende afsnit vil uddybe disse funktion og principper. 3.2 Sampler I dette afsnit vil en samplers funktioner samt anvendelsesmuligheder blive beskrevet. Samplerens mulighed, for at håndtere analoge og digitale signaler, vil blive beskrevet, ligeledes vil forskellen på moderne og ældre samplere blive beskrevet. Figur 3.1: Billedet viser SP-1200 erens interface. commons/9/99/111607sp1200.jpg De første samplere var fysiske maskiner, hvor de nu til dags hovedsageligt er software. Hardwaresamplere er dog stadig eftertragtede af mange musikere, fordi de kan skabe en hel speciel lyd. Et eksempel på en sampler, der stadig bliver brugt er E- MU SP-1200 fra 1987, se figur 3.1. Da den blev lanceret, blev den brugt til at lave skelsættende numre inden for hip-hop verdenen. En sampler kan optage, også kaldet at sample, et stykke lyd fra en lydkilde og derefter ændre dette lydstykke efter behov. Det er muligt at ændre f.eks. pitch, hastigheden, som samplet skal afspilles med, tilføje effekter eller filtrere lyden og fjerne uønskede aspekter. E-MU SP-1200 sampleren har en opløsning på 12-bit, med en samplingsfrekvens på 26,04 khz [Emu], se evt. bilag A for en nærmere forklaring af samplingsfrekvens og opløsning. 12-bits opløsning er, efter moderne standarder, ikke en særlig høj opløsning. I dag kan lyd, der bliver brugt til DVD og Blu-Ray, være op til 24-bits [blu]. E-MU SP-1200 er blevet brugt af kunstnere som Vanilla Ice, Dr. Dre, Daft Punk, ICE-T og Beastie Boys. Derfor er den statig meget eftertragtet, og priserne for en SP-1200 på ebay.com ligger omkring kr. for et eksemplar i god 4

13 3.2. Sampler Aalborg Universitet stand. Sampleren i sig selv kan betragtes som et instrument til at lave musik. Det er muligt, at lave hele musiknumre ved hjælp af en mikrofon og en sampler, dog anvendes der ofte en mixerpult til at finjustere og samle lyden. Nedenfor er der nævnt nogle af de essentielle funktioner sampleren har Funktioner Optage På grund af den analoge indgang, er det muligt at optage alle former for lyde. Enten ved hjælp af en mikrofon, direkte fra et instrument eller en pladespiller. Dette giver mulighed for uendelig mange forskellige samples at arbejde med, når der skal laves musik. Simpel redigering Når der er indspillet samples, giver det mulighed for at redigere i de indspillede samples. Redigeringen af et sample kan eksempelvis være at beskære længden, dele det op i flere samples, justere længden af et sample eller lægge effekter på samples. Dog er der en begrænsning på den længde et sample kan have, i en SP-1200 kan hvert sample kan maksimalt være 2,5 sekunder. Filtre Der sidder et lavpasfilter i den analoge indgang til SP-1200, sådan at det ikke er muligt at optage lyde med en frekvens højere end det som mennesket kan høre. Det er for at undgå støj ved digital konvertering, og kaldes et anti-aliasing filter (se bilag A). Derudover er der også mulighed for at filtrere et sample yderligere, dette kan være nødvendigt for at opnå den ønskede effekt Ind- og udgange Der kan være flere ind- og udgange på en sampler, dette betyder at der er flere muligheder at optage lyde, og samarbejde med andre instrumenter. Både ind- og udgange til samplere kan være analoge. Udgange kan også være digitale, men indgangen er typisk analog, da formålet med sampleren er at gøre analoge signaler digitale. Hvis det er et analogt indgangssignal, får den signalet eksempelvis fra en mikrofon, eller en pladespiller. Der kan være mange udgange på en sampler, et til hvert lydspor, samt et master output, hvor alle lydspor bliver afspillet Opsummering I afsnittet er det blevet forklaret, at sampleren har været banebrydende inden for flere genre af musik. Muligheden for at gøre analoge lyde digtale, og manipulere med dem har haft stor betydning, takket være den digitale teknik. Derudover er der gjort rede for nogle af de tekniske detaljer i en sampler, med 5

14 3.3. Sequencer Aalborg Universitet udgangspunkt i EMU SP-1200 hardwaresampleren. I det følgende afsnit vil sequencerens funktioner blive beskrevet. 3.3 Sequencer I dette afsnit vil det blive beskrevet hvad en sequencer er, samt typer af sequencere. Derudover vil vigtige funktioner i sequenceren blive fremhævet. En sequencer er et stykke hardware/software der giver et overblik over de forskellige lyde/samples, som er blevet indspillet via eksempelvis en sampler. Sequenceren kan også indeholde forskellige virtuelle instrumenter, dette er dog oftes tilfældet når det kommer til en software sequencer. Det er også muligt at lave redigering af lyden på en sequencer. En sequencer er som navnet antyder, noget der opstiller lyd i en sekvens og afspiller det igen og igen. Sequenceren holder også et givet tempo, så det der er optaget i sekvensen afspilles med konstant hastighed. Nogle sequencere har også mulighed for at passe sekvensen til, så takten automatisk holdes til det indstillede. Nedenunder vil nogle af de digitale sequencere blive forklaret Realtid En realtidssequencer arbejder ikke med et bestemt antal slag eller tid i en sekvens. Derimod optages der en sekvens, som varer den tid brugeren ønsker. Sekvensen er defineret fra brugeren starter den, ved tryk på en knap, og til at den afsluttes, ved tryk på en knap. Denne sekvens gentages, uanset hvordan opbygningen og længde af sekvensen er. Dette betyder at der ikke er bestemt et tempo på forhånd, hvilket kan gøre det svært for brugeren at skabe en taktfast sekvens. Det kræver altså præcision fra brugerens side, for at kunne håndtere en realtidssequencer Step En stepsequencer fungerer noget anderledes end realtime sequenceren. Der er fokus på at hvert step i sekvensen har det samme tidsinterval. Det gør at hver step kan programmeres præcist, uden at brugeren skal have meget erfaring. Stepsequenceren gør det desuden også muligt at lave en sekvens, der altid holder takten. Step sequenceren er typisk den der er implementeret i trommemaskiner eller rytmebokse. Et eksempel kan ses på billedet 3.2, der viser hvordan stepsequenceren placerer lydene med bestemte intervaller Funktioner Visuelt overblik Nogle sequencere viser hvornår i sekvensen de forskellige samples afspilles, dette kan eksempelvis være lamper. 6

15 3.3. Sequencer Aalborg Universitet Figur 3.2: Øverst på billedet ses 2 forskellige spor, det røde spor symboliserer hvornår stortrommen skal aktiveres i sekvensen, mens det grønne spor symboliserer hihatten. Master out er det samlede output. Nem redigering Ved at have de forskellige steps nemt tilgængelige,fx med en knap til hver sample, kan der hurtigt bestemmes hvilke samples der skal være på de forskellige steder i sekvensen. Tempo De forskellige samples bliver placeret ved forskellige tidspunkter i sekvensen. Hver gang sekvensen slutter, gentages sekvensen. Hvis der skrues op eller ned for tempoet, vil tiden imellem hvert step blive henholdsvis kortere eller længere. Placeringen af de forskellige samples i sekvensen vil ikke ændres Ind- og udgange Det sequenceren får ind som input er tryk på en knap fra brugeren. Det sequenceren sender ud er information om hvornår samples skal afspilles i sekvensen Opsummering Sequencer er et værktøj til at gentage en melodisk sekvens af lyde. Det kan enten være lyd fra en optagelse eller lyde fra et elektronisk instrument, der bliver aktiveret forskellige steder i sekvensen. Der er forskellige måder at sekvensere på, realtidssekvens eller en stepsekvens. Sequenceren giver typisk også en form for visuel afbildning af sekvensen, og hvad der måtte være programmeret derind i. Det er også muligt at ændre tempoet i en sekvens, uden at lydene flytter sig. I det følgende afsnit bliver trommemaskinen, samt dens funktioner gennemgået. 7

16 3.4. Trommemaskine Aalborg Universitet 3.4 Trommemaskine Dette kapitel vil omhandle hvordan en trommemaskine grundlæggende virker, samt nogle af de funktioner en trommemaskine har. Helt fra de første, og frem igennem tiden til de nyeste modeller. En trommemaskine er en elektronisk musikinstrument, som består af en kombination mellem samplede lyde, en sequencer, og en omfattende brugerflade. Trommemaskinen er i stand til at afspille forskellige lyde, hovedsageligt trommelyde, deraf navnet. Ideen bag dem er at sætte personen der bruger maskinen i stand til at producere unikke lydspor ved hjælp af en sekvens på eksempelvis 16 takter, og at personen så programmerer lydene ind afhængig af hvornår trommelyden ønskes. En sekvens er den tid det tager inden trommemaskinen begynder at afspille de samme lyde igen. En trommemaskine har mange funktioner, nogle af disse funktioner går igen fra de gamle til de nye modeller, men de nye trommemaskiner har flere effekter, og flere lyde, som ikke nødvendigvis er trommelyde. Nedenfor vil de mest gængse funktioner blive forklaret Funktioner Figur 3.3: Roland model TR-909. Den gule og grønne cirkel viser henholdsvis volumen og tempokontrol. Den blå firkant indeholder knapper der kan ændre på de enkelte lyde i trommemaskinen. I den røde firkant er de knapper, som bestemmer hvornår i sekvensen at de enkelte lyde skal afspilles. /ed3tqvp2ksk/s1600/1430_roland_tr909_1.jpg På billedet ovenfor ses en af de mest ikoniske trommemaskiner, denne model kom frem tilbage i Russ [2004] En af de mest essentielle dele af trommemaskinen er den række knapper der sidder nederst på billedet, dette kan ses i den røde firkant på billedet. I hver af disse knapper er der en LED, disse LED er viser hvor langt trommemaskinen 8

17 3.4. Trommemaskine Aalborg Universitet er kommet i en sekvens. Der vil blive afspillet en trommelyd, såfremt brugeren har trykket på den pågældende knap, når trommemaskinen når den del af sekvensen. Disse knapper gør brugeren i stand til at bestemme hvor i sekvensen at trommelydene skal være. Dog er der mere end én trommelyd i en trommemaskine, i TR-909 er der f.eks 10 lyde indlagt. Ved hjælp af en knap får brugeren mulighed for at vælge hvilken lyd der skal afspilles. Disse forskellige trommelyde lægges derpå ind i forskellige spor, disse spor er alle længden af en sekvens, og derved kan brugeren skabe en unik sekvens ved hjælp af få prædefinerede lyde. Enhver af disse prædefinerede lyde kan Figur 3.4: Roland model TR-8. På denne tegning er de samme funktioner indrammet som på billedet af model TR-909, det ses at selv 35 år senere går mange af de samme funktioner igen. desuden finindstilles, det sker på de knapper som kan ses i den blå firkant på figur 3.3 og 3.4. Disse finjusteringer er blandt andet hvor meget bas eller diskant der skal med fra den enkelte lyd, hvor høje de enkelte lyde skal være og hvor meget decay der skal være. På figur 3.4 ses et af de nyeste skud på stammen indenfor trommemaskiner, model TR-8 trommemaskinen blev lanceret i februar år [TR8] Decay Decay er, hvor lang tid lyden er om at ringe ud, det vil sige at en lyd uden decay vil stoppe meget pludseligt. Attack Attack er i modsætning af decay, hvor hurtigt lydens styrke skal starte. Hvis attack-tiden er kort, vil lydens styrke hurtigt stige, modsat hvis attack-tiden er lang vil det tage længere tid for lydstyrken at stige. Tune I hver lyd kan tune desuden ændres. Tune ændrer frekvensen, dvs. hvis 9

18 3.4. Trommemaskine Aalborg Universitet tune er på sin laveste, vil en lyd være meget dyb, skrues der derimod op på tune, vil lyden ikke længere være så dyb, altså lydens frekvens bliver højere. Comp Comp er en forkortelse af compression, på dansk kompression. Comp bruges til reducere lydens dynamik. Dynamikken er forskellen mellem lydens laveste og højeste amplitude. Afhængig af hvor meget Comp skrues op, vil lydens niveau presses, så lydniveauet til sidst er ens på hele lydsporet. Når comp skruer helt op, vil lyden være mere direkte. Accent Accent fremhæver tonen af lyden. Det kan gøres tidsmæssigt, dvs. lydstyrken kan hæves i kortere eller længere tid. Reverb Reverb, på dansk rumklang eller efterklang, er en effekt der bruges til at lave klang på lyden. Ved at skue op eller ned ændres klangen på lyden. Metronom Metronomen gør brugeren i stand til nemmere at kunne holde rytmen. Metronemen er typisk en kliklyd, der følger tempoet. Hvis der skrues op for hastigheden på sekvensen, så følger metronomen med. Alle disse funktioner kan justeres for hver trommelyd Ind- og udgange Der er mange ind- og udgange på en trommemaskine, dette gør at en trommemaskine har rig mulighed med at arbejde sammen med andre maskiner, blandt andet synthesizers og samplere. For et eksempel har model TR-909 en udgang for hvert enkel trommelyd, det betyder at en enkelt lyd kan moduleres yderligere ved hjælp af eksempelvis en mixer Opsummering En trommemaskine indeholder en sequencer, som kan afspille forudbestemte samples, i en programmeret kombination, som brugeren selv kan bestemme. Brugeren er altså i stand til at kreere unikke lydsekvenser, som kan afspilles igennem en eller flere analoge udgange. På baggrund af de muligheder vil der i det næste kapitel blive diskuteret hvad der ønskes konstrueret i løbet af projektet. 10

19 Indledning til problemformulering 4 Det følgende kapitel indeholder, på baggrund af problemanalysen, en beskrivelse af den prototype, der arbejdes hen imod i løbet af projektet, samt en forklaring på, hvorfor denne er valgt. Der er i de tidligere afsnit set på funktioner og principper ved samplere og trommemaskiner. På figur 4.1 ses en skitse af prototypen. Under figuren er alle funktionerne listet og forklaret i tabel 4.1. Derudover vil afsnittet også indeholde en mere generel beskrivelse af betjeningen af maskinen. Figur 4.1: Illustration af brugerflade. Der kan læses mere om de forskelle funktioner i tabel Funktioner Der er i dag meget begrænset udvikling indenfor hardwaresamplere, hvilket nævnes i afsnittet om sampleren. De er dog stadig eftertragtede, hvilket giver grundlag for udvikling, netop inden for dette område. Trommemaskinen giver brugeren frihed til at kreere en unik rytme, dog er den begrænset af indbyggede lyde, som ikke kan ændres. Det ønskes derfor i dette projekt, at lave en kombination af en sampler og en trommemaskine. Denne kombiantion skal forstås, som en sampler med indbygget sequencer, hvor det er muligt at optage lyd fra en kilde, sample bidder, og programmeres disse ind i en sekvens. 11

20 Aalborg Universitet On/Off Play/Pause BPM En vippeknap med den funktion at tænde for maskinen. Knap der starter eller stopper den optagede sekvens. Et display der viser det indstillede tempo. Tempo En trinløs drejeknap der kan bruges til at indstille tempoet. Master REC Mode Jam Programmér Step Step indikator Sample start Attack Decay Volumen Solo Mute En trinløs drejeknap der bruges til at indstille volumen ud af maskinens. En knap der starter optagelse af et nyt sample. I jam-mode skal det være muligt at spille på sample triggers uden at optage over en allerede optaget sekvens. I programmeringsmode skal det være muligt at programmere en sekvens, eller tilføje mere til en allerede optaget sekvens. Det skal også være muligt at optage en sekvens, step for step, når sekvensen er sat på pause. En knap der bruges til at skifte plads i sekvensen. En række LED er der viser hvor maskinen er i sekvensen. En drejeknap der har den funktion at flytte en fikseret sample tid frem eller tilbage for at vælge, hvilken del af det optagede sample, der skal afspilles når hver sample trigger aktiveres. En drejeknap der kan justere hvilken volumen et sample skal begynde med. Det kan give en mere eller mindre "punchy"lyd. En drejeknap der kan justere på slutningen af samplet. Ved at dreje på knappen, ændres den volumen den sidste del af samplet afspilles med. Hver kanal skal have en volumen fader der kan styre den individuelle volumen for hvert sample. Hver kanal skal kunne isoleres, så det kun er denne kanal der afspilles, selvom andre samples er programmeret ind i sekvensen. Hver kanal skal kunne mutes så den ikke længere kan høres på outputtet. Tabel 4.1: Tabellen indeholder en liste med beskrivelse af alle de funktioner der er vist på figur

21 4.1. Problemformulering Aalborg Universitet Ind- og udgange For at kunne sample et stykke lyd fra en mikrofon eller pladespiller, er det nødvendigt, at der er en indgang i maskinen, som er koblet til A/D konvertering, for at maskinen kan repræsentere den analoge verden digitalt. Dette koncept er forklaret nærmere i appendix A. Digital lyd skal konvereteres til analog lyd, før at det kan afspilles gennem højtalere. I afsnittet om trommemaskinen (3.4) står der at en TR-909 fra Roland har en analog udgang for hver trommelyd. Prototypen vil ikke have en analog udgang, men i stedet en enkel digital udgang, hvor alle signaler adderes, og sendes ud af et master output. På figur 4.2, ses et blokdiagram af systemet der ønskes udviklet i dette projekt. Figur 4.2: Blokdiagram for prototypen er vist i den sorte firkant. Figuren viser signalvejen. Der fokuseres ikke på den røde del af figuren Opsummering I det foregående afsnit er det blevet beskrevet, at visse egenskaber ved, henholdsvis en sampler, og en trommemaskine ønskes kombineret. Samplerens egenskab til at optage samples og gemme dem, samt trommemaskinens egenskab til at programmere samples ind i en sekvens ønskes samlet i én maskine. Dette er for at give brugeren mulighed for at kunne optage samples, som derefter kan programmeres ind i en sekvens. På baggrund af dette vil en endelig prolemformulering blive opstillet. 4.1 Problemformulering "Hvordan kan en hardwaresampler designes, således, at brugeren er i stand til, at optage samples og programmere dem ind i en sekvens, i en ønsket kombination og denne sekvens i et ønsket tempo ved hjælp af en brugerflade? " 13

22 4.1. Problemformulering Aalborg Universitet Afgrænsning I dette projekt skal en prototype konstrueres og dermed ikke et færdigt produkt. Prototypen vil senere kunne videreudvikles. Prototypens funktionalitet afgrænses til, at kunne optage en analog lydkilde og konveretere lyden til digital, hvorefter det skal gemmes på en hukommelse. Brugeren skal, ved hjælp af en brugerflade, kunne programmere og afspille en sekvens. Når sekvensen afspilles, skal de optagede samples hentes fra hukommelsen, hvorefter de afspilles, som et digitalt output. 14

23 Kravspecikation 5 Det produkt, som skal konstrueres i projektet, skal have nogle bestemte funktioner, for at det kan kvalificeres som en sampler og trommemaskine. Disse krav vil, sammen med andre, blive opstillet i det følgende kapitel. Det vil også blive beskrevet, hvorfor disse krav er relevante for produktet. 5.1 Generelle krav Fungerende Prototype: Produktet skal være en funktionel prototype, hvor der er mulighed for at indspille lyd, og gemme det på produktet i form af et sample. Funktionelt interface: Der skal være et passende antal knapper og skrueknapper, sådan at produktet er nemt at betjene. 5.2 Krav til sampler Herunder vil samplerens krav blive opstillet. Digital lyd: Sampleren skal arbejde med digital lyd. Konvertering: Sampleren skal indholde en analog til digital konverter, så det er muligt at indspille lyde fra analoge kilder. Lydkvalitet: Samplerens lydkvalitet skal være CD kvalitet. Altså 16-bit opløsning og minimum 44,1 khz samplingsfrekvens. Realtidsindspilning: Sampleren skal kunne gemme lyden i realtid. Hukommelsen skal kunne arbejde hurtigt nok, så lyden ikke bliver forsinket eller samples går tabt. Længde af samples: Sampleren skal kunne indeholde 2 samples af mimimum 2,5 sekunder. 5.3 Krav til trommemaskine Der skal være mulighed for at programmere en sekvens. Variabelt tempo: For at kunne lave forskellige genre af musik på trommemaskinen, skal det være muligt at variere tempoet. Visning af tempo: For at brugeren kan indstille et præcist tempo, skal det være muligt at se det aktuelle tempo i BPM (Beats Per Minute). Visning af sekvens: Der skal være en visuel repræsentation af, hvilken plads i sekvensen der bliver afspillet eller arbejdes med. Dette skal ske ved hjælp af lysdioder. 15

24 5.3. Krav til trommemaskine Aalborg Universitet Vise indholdet af sekvensen: Der skal være 2 dioder, der viser hvilke samples, der er programmeret ind på den viste plads i sekvensen. Digitalt output: Der skal være mulighed for at kunne afspille en sekvens med de samplede lyde, og få dette ud som et digitalt signal. Afspilningsmode: Der skal være mulighed for, at se sekvensen blive afspillet. Der skal derfor være et afspilningsmode på trommemaskinen Overblik af produktet For at give et overblik over hvad produktet kommer til at indeholde, er der lavet et blokdiagram. Blokdiagrammet viser, hvordan de forskellige knapper og funktioner er tilgængelige på produktet. Det færdige system kommer til at Figur 5.1: Et overblik over det samlede system. indeholde 4 komponenter: Brugerpanel: Brugerpanelet er det, som brugeren har mulighed for at justere på. Det er her tempo, sekvens samt hvilken mode, produktet skal befinde sig i, bliver styret. PC: PC en bruges til at programmere FPGA en og debugge ved hjælp af UAR/T. ADC: Analog til digital konverteringen laver analoge signaler om til digitale signaler. Dette er nødvendigt, før lyden kan blive gemt i hukommelse. Spartan-3 platform: Denne indeholder FPGA, Microblaze, lysdioder, switches, 7-segmentsdisplay og RAM. Næste del af rapporten vil beskrive, hvordan prototypen er designet udfra de stillede krav. Der bruges, i dette projekt, en Spartan-3 platform. Denne platforms egenskaber vil blive forklaret, som det første i næste kaptel. 16

25 Design 6 Til design af prototypen er der taget udgangspunkt i en Spartan-3 platform. Denne platform har mange fordele ved design af digitale systemer. For at kunne forstå desginprocessen, vil denne platforms egenskaber blive forklaret i rapporten. Dette kapitel vil omhandle den del af Spartan-3 platformen, som kaldes FPGA. 6.1 FPGA I dette projekt skal en prototype af sampleren designes. Hertil anvendes en FPGA (Field-Programmable Gate Array), som er et modificerbart integreret kredsløb. Overordnet set kan en FPGA betragtes som en programmerbar hardware-enhed. En FPGA er baseret på halvledere og har rekonfigurerbare logikblokke, som er forbundet med rekonfigurerbare ledninger og databusser. Fordelen ved at anvende en FPGA er, at den hardware, som er udviklet på FPGA en under projektet, kan ændres, selv langt inde i projektet. FPGAen kan moduleres ved hjælp af et tilegnet sprog, kaldt VHDL (Very high speed integrated circuit Hardware Description Language). Den konkrete FPGA, som anvendes i dette projekt, er en Spartan 3 XS1000. Denne er valgt, da den er egnet til at lave prototyper på, idet den giver mulighed for at tilslutte mange forskellige inputs og outputs, har integreret 4 7-segmentsdisplays, SRAM for større lagermulighed, dioder, knapper og RS232 port indbygget på platformen. Derudover kan Spartan-3 platformen også håndtere en Microblaze-processor. [FPG] Inputs og outputs Spartan-3 XS1000 har 3 40-pin udvidelsesstik, med mulighed for at tilslutte mange eksterne signaler. Dog er nogle af disse pins reserveret i tilfælde af, at visse af platformens funktioner er taget i brug. De tre udvidelsesporte ses på figuren nedenfor 6.1. A1-porten deler mange signaler med kommunikation til de RAM, der sidder på platformen. Derfor skal denne port ikke tages i brug, hvis det ønskes at benytte SRAM-blokkene. A2-porten er næsten kun dedikeret til in- og outputs. B1-porten har også delte porte, men de fleste kan bruges som in- eller outputs. Det er valgt, at benytte A2-porten til input fra knapper og encodere, samt outputs til dioder og A/D converter. A1-porten benyttes ikke til input eller output, da det ønskes at benytte RAM og derfor er disse signaler allerede optaget. Der er skrevet mere om RAM-controlleren i afsnit

26 6.1. FPGA Aalborg Universitet [Xilinx, 2005] Figur 6.1: På figuren ses en illustration af de 3 udvidelsesstik Constraint fil For at kunne bruge disse in- og outputs, skal FPGA en have fortalt, hvilket signaler der tilhøre hvilke ben. Dette sker i en opslags-fil, som kaldes en Constraint-fil. Filen mapper de signaler, som brugeren har defineret i sin VHDL kode, ud på de ønskede ben af FPGA en UAR/T Der er på spartan-3 platformen en RS232 port, som gør det nemt at udføre debugging på software, imens det skrives, da status kan skrives til en terminal på computeren Opsumering En FPGA er en reprogrammebar hardware-enhed. Denne giver mulighed for at designe hardware og ændre det undervejs ved at programmere det fra en PC. Sproget det programmeres med kaldes VHDL. I dette projekt er der valgt en Spartan3-platform, som har adskillige in- og outputs, samt knapper, switches, dioder, 7-segementsdisplays og UAR/T. UAR/T giver mulighed for at kunne debugge programmerne, som skrives ned på FPGA en. Det er også muligt at programmere en processor ned på FPGA en, hvilket næste kapitel vil omhandle. 18

27 6.2. Microblaze Aalborg Universitet 6.2 Microblaze Samplerens funktioner skal implementeres på spartan-3 platformen. Det er muligt at implementere en processor i FPGA en. Visse af samplerens funktioner kan med fordel håndteres af processoren, hvor andre bedst kan betale sig at lade selve FPGA en håndtere. Dette kapitel vil komme ind på Microblaze-processorens opbygning, egenskaber og hvordan den vil blive anvendt i dette projekt. En MicroBlaze-processor er en såkaldt softcore-processor, dvs. at processoren programmeres ned på FPGAen. Det er altså ikke en dedikeret fysisk processorenhed. Ved at lave en microprocessor i en FPGA, kombineres fordelene fra en alm. processor og FP- GA en i samme enhed. Microblazen er designet til at kunne programmeres, sådan at det kun er de funktioner, der skal bruges til den opgave, som skal løses, der bliver lagt ned i Microblazen og derved kan der spares plads, hvilket kan betyde at hastigheden af processoren øges. Microblazen er valgt, da den kan programmeres med C-kode, hvilket giver stor fleksibilitet i forhold til de opgaver, der kan løses med en Microblaze. Der er mulighed for at anvende 32 bits til hukommelsesbussen til Microblazen, hvilket vil sige at det er muligt at tildele processoren 4 Gb RAM. Planen i dette projekt er at bruge microblaze processoren til at behandle de data der samples fra AD konverteren og håndterer C-programmet Microblazens interne design Microblazen består af flere forskellige blokke internt. I dette afsnit vil de blokke, der gør at Microblazen kan betegnes som en processor, blive beskrevet og forklaret. På figur 6.2 ses et blokdiagram over Microblazen, i de følgende afsnit vil de farvede firkanter blive forklaret ALU og skifteregistre (Blå firkant) I den her firkant er der en ALU (Arithmetic Logical Unit) og et skifteregister. ALU en er ikke dokumenteret i Microblaze dokumentationen, så der vil i stedet blive lavet en beskrivelse af en 1-bits ALU. Der vil også blive givet en kort gennemgang af, hvordan skifteregisteret virker. Arithmetic Logical Unit (ALU) ALU-blokken er designet til at lave forskellige regneoperationer på 2 værdier. Regneoperationer kan være addition, subtraktion, multiplikation, division eller blot en sammenligning. Der tages udgangspunkt i en 1-bit ALU, som derefter kan udvides til en 8-, 16- eller flere bits ALU(Tanenbaum [2005]). Dette gøres ved at sætte flere 1-nit ALU er sammen, som vist på figur 6.4. For at give en bedre forklaring på, hvorfor 1-bit ALU er kan sættes sammen, er det nødvendigt at forstå, hvad der sker inde i ALU en. ALU ens interne dele er mulige at dele op i små blokke. De 3 blokke, som ALU en består af, er en logisk enhed, en dekoder samt en full adder. Disse 3 blokke gør det 19

28 6.2. Microblaze Aalborg Universitet ref_guide.pdf Figur 6.2: Blokdiagram over Microblaze processoren. I den blå firkant er ALU og skifteregistre, i den røde firkant er program-counteren, i den lyserøde firkant er instruktionsregistre og i den grønne er general purpose registre. Alle disse er beskrevet i dette kapitel Tanenbaum [2005] Figur 6.3: Billed af hvordan det er muligt at sammensætte flere ALU er for at udvide bit-kapaciteten muligt, at lave de nødvvendige regneoperationer. Nogle af disse operationer er sværere end andre. Det er f.eks. simplet at gange med 2 da det er en skifteregister-operation, alle tallene skal blot flyttes én plads i retning af den mest betydende bit. Det er sværere at trække 2 tal fra hinanden, da det er nødvendigt at lave det tal, der skal trækkes fra, om til 2s-kompliment. Dette er kun muligt ved at lave flere forskellige operationer, altså skal tallene igennem ALU en flere gange. 20

29 6.2. Microblaze Aalborg Universitet Tanenbaum [2005] Figur 6.4: Dette blokdiagram viser, hvordan en 1-bit ALU er opbygget. Denne opbygning er ikke nødvendigvis, som den i Microblazen. Logisk enhed ALU ens logiske enhed består af 3 kredse, som klarer de operationer, der skal laves. Derudover er der 3 kredse til at bestemme, hvilke af de 3 operationer, der skal føres videre ud til udgangen af ALU en. De 3 operationer bliver klaret af en AND gate, en OR gate og en inverter. I den logiske enhed, er det muligt at få A*B, A + B (addering) eller B inverteret. Med disse 3 operationer er det muligt at lave alle de arithmetriske operationer som plus, minus og gange. Division er, som oftest klaret af en floating point unit (kommatal), dette sker fordi ALU en kun er designet til at skulle klare integere (helttal). Ved division af 2 tal er det muligt at ende op med et tal, som ikke kan være i en integer og derfor er det en floating point unit, som tager sig af alt division. Med den logiske enhed og de gates, der sidder på indgangen af ALU en, er det også muligt at lave alle de logiske operationer som AND, OR, XOR og de inverterede operationer. Dekoder Dekoder kredsløbet kan ved hjælp af 2 bits, bestemme hvilke af de 4 operationer der skal åbnes op for ved hjælp af de AND gates, der sidder lige bag ved hver af de kredsløb, som er til de forskellige operationer. Det eneste den her 0 multiplexer består af er 4 invertere og 4 AND gates. A B A&B A&B A&B A&B

30 6.2. Microblaze Aalborg Universitet Som det ses ud fra sandhedstabellen, er det ikke nødvendigt med mere end de 2 inputs til dekoderen. Full Adder Full adder kredsløbet er, som navnet hentyder til, nemlig et kredsløb, der kan adderer 2 tal. Det bruges også uden for ALU en i processoren til at udregne adresser med Skifteregister Skifteregistret kan læse et register og skubbe indholdet af det register enten til højre eller venstre i bitrækken. For at give et bedre billede af, hvad et skifteregister kan, vil der blive givet et eksempel med 4 bits. Hvis de 4 bits er 0110 (6.1) og der udføres en skifte operation, som skifter mod venstre, vil det komme til at se ud således: 1100 (6.2) Hvis operationen så gentages igen, på det nye tal, vil den mest betydende bit blive smidt over i et carry flag. Det vil komme til at se sådan ud: et carry flag (6.3) Program-counter (Rød firkant) Figur 6.5: Overblik over de forskelligesignaler, der bruges fra Microblazen. Program-counteren er et register med 32 bits, hvor adressen på den næste instruktion er gemt. Programcounteren har et carry flag, som bliver brugt til interrupt. Programcounteren tæller op og henter den næste instruktion, der skal afvikles fra den programkode, som er lavet fra komplieren til Microblazen Instruktionsregistre (Lyserød firkant) Instruktionsregistrene indeholder de instruktioner, der skal bruges I ALU en. Disse instruktioner bliver læst ind fra Microblazen s instruktionssæt. ALU en henter fra program counteren, den adresse hvorpå instruktionen befinder 22

31 6.2. Microblaze Aalborg Universitet sig, herefter læses instruktionsregistret for at finde ud af, hvilken operation ALU en skal udføre. Instruktionsbufferen henter instruktioner forud, sådan at hastigheden af processoren øges General purpose registre (Grøn firkant) Her bliver alle variabler fra programkoden gemt, og kan hurtigt læses ind i ALU en. Der er 32 registre, som alle kan indeholde værdier på op til 32 bits. General purpose in- og outputs er, som navnet antyder, in- og outputs, der bliver brugt til det, som brugeren af Microblazen har brug for. I dette projekt bliver de brugt til dioder, knapper og andre former for bruger inputs. Derudover bliver de også brugt til kommunikationen til RAM og ADC, se figur Fixed interval timer (FIT) Fixed interval timer er en timer, der blive genereret sammen med Microblazen. Timeren tæller det antal clock cycler, som er bestemt der skal gå mellem hver gang signalet på FIT en går højt. En FIT kan genererer 2 signaler FIT_toggle og FIT_interrupt. Disse to kan ses på figur 6.6. Der bruges i dette projekt 2 FIT s. Figur 6.6: Diagrammet viser FIT_toggle og FIT_interrupt, hvor FIT_toggle har en 50 % duty cycle og FIT_interrupt blot kort sættes højt, når det tilhørende antal clock cycler er forløbet. På den ene FIT, bruges kun FIT_toggle og på den anden kun FIT_interrupt. FIT interrupts bruges til at lave en timer internt i softwaren. FIT-toggle bruges som en clock-generator til analog til digital konverteren, så der samples med den rette frekvens Interrupt Interrupt bruges generelt til at kunne prioritere et lille stykke programkode over resten af programmet. Når interrupt-benet går højt bliver det registreret internt i Microblazen, og resten af programmet sættes på pause. Når resten af programmet sættes på pause, gemmes den nuværende position, der er ved at blive eksekveret, i stakken. Stakken er den midlertidige hukommelse, hvor de variable der arbejdes med i programmet gemmes. Ved et interrupt bliver program-counterens værdi gemt i stakken, sammen med eventuelle variable, som var i brug da interruptet kom. Når program-counterens og de andre variables værdi er gemt, bliver interruptkoden kørt. I dette projekt er det valgt at håndtere tiden ved at tælle op hvert halve millisekund. Når interruptet 23

32 6.2. Microblaze Aalborg Universitet er afsluttet hentes programcounter værdien og de andre variable ind igen, og programmet fortsætter, som intet var sket Opsummering I det her afsnit er det blevet forklaret, hvordan Microblazen er opbygget. Den består af en ALU, som kan lave forskellige logiske beregninger. Der er en program-counter, der holder styr på hvor i programmet der bliver arbejdet. Dette giver mulighed for at lave interrupt kald. Interruptet stopper hovedprogrammet helt, gemmer program-counterens værdi i et register og kører interruptrutinen, som er højere prioriteret end hovedprogrammet. Når interruptrutinen er gennemført genoptages hovedpragrammen fra programcounterens værdi. Det bliver i dette projekt brugt til at lave en tæller som styre timingen af sekvensen og BPM. Interruptet bliver genereret med en Fixed interval timer eller FIT, som bliver genereret sammen med processoren, når den programmeres ned i FPGA en. FIT en sender et interrput for hvert gang et bestemt antal clock cycler er forløbet. Microblazen består også af en masse registre, der styrer alt fra instruktioner til in- og outputs. Microblazen er i dette projekt, hjernen der styrer næsten alle funktioner. Microblazen bliver blandt anden brugt til at tilgå hukommelsen. Det næste kapitel vil omhandle RAMcontrolleren, som er den anvendte hukommelse i dette projekt. 24

33 6.3. Hukommelse Aalborg Universitet 6.3 Hukommelse Sampleren skal kunne optage og afspille optagede lyde. Dette kræver at samples kan gemmes, hvilket betyder, at der er brug for hukommelse. Dette kapitel vil derfor omhandle tilgangen til de eksterne RAM på spartan-3 platformen, herunden hvilke porte der er, samt hvilke timing parametre der skal overholdes for at læse eller skrive til dem. Derefter vil den RAM-controller og tilgangen til RAM-blokken fra Microblazen blive gennemgået. Hastigheden af controlleren vil blive udregnet for at sikre sig at den overholder de krav, der er opstillet til den. Til sidst vil enkelte forbedringsmuligheder blive gennemgået. Det er i dette projekt nødvendigt at have mulighed for at gemme de data, der kommer ind fra A/D konverteringen, da disse data ikke altid bruges med det samme. Desuden åbner det også muligheder for at manipulere med data, dette kan for et eksempel være at justere enkelte samples, så brugeren kan få den ønskede effekt ud af den lyd der er optaget. Der er to måder at tilgå memory på en spartan-3 platform. Den første er at tilgå de eksterne RAM, der sidder på platformen. Disse eksterne RAM er asynkrone SRAM (Static Random Access Memory), dette betyder, at de ikke umiddelbart er til at læse eller skrive til på hvert clocksignal. Det er derfor nødvendigt med en controller, der holder styr på de forskellige signaler ind til de eksterne RAM-blokke. Den anden metode er at lave registre internt i spartan-3 platformen, denne metode er synkron med clocken, og kan derfor tilgås nemmere end de eksterne RAM, dog er kapaciteten af disse interne RAM langt fra at være lige så stor som de eksterne RAM. I dette projekt er det vigtigt, at have så meget plads til den konverterede lyd som muligt. Derfor er det valgt at bruge de eksterne SRAM. Spartan-3 platformen har to 256k x 16 asynkrone SRAM, det vil sige at der i alt er 1 mebibyte memory fordelt på de 2 blokke. Hver blok har plads til bits. Disse bits er af fabrikanten fordelt på 16-bit words. Words er ikke altid 16-bit, men dette passer til kravet om at sample med en opløsning på 16-bit. Nedenfor vil det blive udregnet, hvor lang en sample der er plads til på en enkelt blok: = ords (6.4) 16 Det er i kravspecifikationen blevet bestemt, at der samples med 44,1 khz, hvilket betyder, at der skal stykker data ind i sekundet. Derfor kan den maksimale længde af lydklippet udregnes: = 5,944 s (6.5) 44,1 khz Det vil sige, at der i hver blok kan være næsten 6 sekunders lyd. Dette er tilstrækkeligt til prototypen af produktet. En nem måde, at udvide dette på, 25

34 6.3. Hukommelse Aalborg Universitet er at gøre det muligt at skrive til den anden eksterne SRAM-blok på spartan-3 platformen, hvilket vil fordoble kapaciteten. Der er en del signaler ind og ud fra SRAM-blokken. På figur 6.7 er et blokdiagram over SRAM-blokken vist: [ISSI, 2011] Figur 6.7: Blokdiagram over ind- og udgange af spartan-3 platformens SRAM-blok Signal Størrelse(bits) Funktion A0-A17 18 Adresseben I/O0-I/O15 16 Databen CE* 1 Chip enable OE* 1 Output enable WE* 1 Write/Read enable UB* 1 Upper byte enable LB* 1 Lower byte enable * Bemærk at disse signaler er active-low, dvs. at de er afbrudt, når de har værdien 1. 26

35 6.3. Hukommelse Aalborg Universitet A 0-17: Er adresseben, disse ben bruges til at styre, hvor i RAM-blokken at de pågældende data skal gemmes. I/O 0-15: Er databen, disse ben gør de muligt både at læse og skrive til RAM-blokken. Data på disse ben bliver sendt til den adresse, der er bestemt af ovenstående adresseben. Disse ben er in- og output, hvilket vil sige at data til og fra RAM skal igennem samme ben. CE, (Chip Enable): Hvis dette signal sættes højt går RAM-blokken i standby, der reducerer strømforbruget. I dette projekt er signaltet lavt, da der altid ønskes mulighed for at tilgå RAM-blokken. OE, (Output Enable) Dette signal bruges til at tilgå RAM-blokken. Sættes dette signal højt, bliver de 16 databen højimpedante, hvilket betyder, at det ikke er muligt at tilgå disse databen WE, (Write Enable): Dette signal bruges til at bestemme, om der skal skrives eller læses til RAM-blokken. Når signalet er højt, er der mulighed for at læse fra RAM, hvis signalet derimod er lavt kan der skrives til RAM. UB, (Upper Byte enable): Dette signal sættes højt, hvis brugeren ikke ønsker at tilgå de øverste 8 databits. LB, (Lower Byte ebable): Dette signal bruges, ligesom det foregående, her er det dog omvendt, og signalet skal sættes højt, hvis brugeren ikke ønsker at tilgå de nederste 8 databits. Da der i dette projekt kun arbejdes med en enkelt RAM-blok, vil CE og OE altid være sat lav, ydermere vil UB og LB også altid være sat lav, da der kun skal læses og skrives 16 databit af gangen Timing For at læse eller skrive til RAM-blokken, er det nødvendigt at holde styr på en del parametre. Der er flere end 20 parametre[ref til datablad], heldigvis er det ikke alle, der skal kontrolleres for at få data ind eller ud af RAM. Der er flere måder at læse, og skrive til disse RAM på, nedenunder er et simplificeret timing-diagram for den metode, der er valgt til dette projekt, vist. Det fulde timing-diagram kan ses i [ref til datablad]. Bemærk at i timing-diagrammet for både read- og writecycle er ce, lb og ub lave. 27

36 6.3. Hukommelse Aalborg Universitet [ISSI, 2011] Figur 6.8: Timing diagram af en read-cycle t OHA : Output hold time, dette er den tid at output fra RAM vil være tilgængelige, efter at adressen er skiftet. t AA : Adress access time, den tid det tager fra at adressen sættes til at data er klar på data-bussen. t RC : Read cycle time, dette er minimumtiden imellem 2 læseoperationer på RAM. Tabel 6.1: Read-cycle parametre Symbol Parameter min max enhed t OHA output hold time 2 - ns t AA adress access time - 10 ns t RC read cycle time 10 - ns Der er ligesom før, flere forskellige måder at læse fra RAM på. I tabel 6.2 er et simplificeret timing-diagram af en write-cycle. Selve skrivningen ind i RAMblokken sker, når read/write signalet (write_enable) går fra lavt til højt. [ISSI, 2011] Figur 6.9: Timing diagram af en write-cycle 28

37 6.3. Hukommelse Aalborg Universitet Tabel 6.2: Write-cycle parametre Symbol Parameter min max enhed t SA adress setup time 0 - ns t HA adress hold time 0 - ns t WPE1 WE pulse width 8 - ns t SD data setup time 6 - ns t HD data hold time 0 - ns t WC write cycle time 10 - ns t SA : Address setup time, dette er den tid som adressen minimum skal være stabil inden read/write signalet sættes lavt. t HA : Adress hold time, det er den tid adressen minimum skal være stabil efter read/write signalet sættes lavt. t WPE1 : Write enable pulse width, minimumstiden at read/write signalet skal holdes lavt. t SD : Data setup time, den tid, dataen på databenene, som minimum skal være stabil, før der skrives til RAM. t HD : Data hold time, den tid som data skal holdes stabil efter at der er skrevet til RAM. t WC : Write cycle time, tiden som det minimum vil tage at foretage en write-operation. Med disse informationer er det nu muligt at konstruere en RAM-controller, der skal fungere som et link imellem microblazen og selve RAM-blokken. Dette er vigtigt da en læse eller skrive operation tager mere end 1 clock cycle, og for at gøre det nemmere at udføre operationer direkte fra microblazen SRAM-controller For bedre at kunne forstå, hvad en RAM-controllers opgave er, er der på figur 6.10 en overordnet tegning over de signaler, der kommer ind og ud fra den. [ISSI, 2011] Figur 6.10: Overordnet tegning over komponenter omkring RAM-controlleren samt signaler 29

38 6.3. Hukommelse Aalborg Universitet Bemærk på figur 6.10 at de 3 blokke mod venstre befinder sig inde i spartan-3 platformen, hvoraf Microblazen er en softcore-processor. De data der sendes fra Microblaze til Top_level vendes der tilbage til senere i dette afsnit. RAMcontrollerens opgave er at tage signaler fra microblazen, og sende de data videre, som noget RAM-blokken kan forstå. Den opgave Top_level har, er at gøre det nemmere at sende kommandoer fra microblaze, og omsætte de inputs til noget som RAM-contolleren kan forstå, den er med andre ord skridtet fra software til hardware programmering. Top_level sender disse data videre til RAM-controlleren. Skridtet imellem RAM-controlleren og RAM-blokken er kontrolleret ved hjælp af en constraints fil, som er blevet forklaret i afsnit For bedre at kunne sige præcis, hvad RAM-controlleren skal, kigges der på figur 6.8, hvorefter der opstilles en liste over de steps, som RAM-controller skal igennem for at gennemføre en read cycle. 1. Adressen, der skal læses fra, sættes ind, samt at output_enable signalet skal sættes lavt, disse signaler skal være stabile under hele read-cyclen. 2. Vent derefter på at t AA overholdes, i følge tabel 6.1 tager det maks 10 nanosekunder. Dette løses nemt ved bare at vente 1 clockcycle(20 ns). 3. Data er klar på Data_out, og der gøres klar til en ny cycle. Skal der derimod skrives er fremgangsmåden lidt anderledes, der tages udgangspunkt i figur Placer adressen på adresse-bussen, samt at write_enable sættes lavt da der skal skrives. 2. Vent derefter på at at t WPE1 overholdes, i følge tabel 6.2 tager dette minimum 8 nanosekunder, dette løses igen ved at vente 1 clock cycle (20 ns). 3. Sæt derpå write_enable høj igen, det er på det tidspunkt at data bliver skrevet ind. 4. Fjern data fra data_ind, og gør klar til ny cycle. Disse informationer er sat op i en ASMD (Algorithmic State Machine with Data path) i figur 6.11, for at gøre det nemmere at overskue. 30

39 6.3. Hukommelse Aalborg Universitet Figur 6.11: ASMD over RAM-controlleren, bemærk at alt inde i den røde firkant er 1 state Selve controlleren er opdelt i 5 states: klar, read1, read2, write1 og write2, RAM-controlleren kan kun være i et state af gangen, og bruger en clock cycle på at komme fra 1 state til den næste. I hvert state står der, hvad der skal ske i selve koden. Den nedenstående kode viser hvordan RAM-controlleren bevæger sig i klar-tilstanden. 57 process ( state_reg, mem, rw, dio_a, addr, data_f2s, data_f2s_reg, data_s2f_reg, addr_reg ) 58 begin 59 addr_next <= addr_reg ; 60 data_f2s_next <= data_f2s_reg ; 61 data_s2f_next <= data_s2f_reg ; 62 ready <= 0 ; ready say t i l 0, som i nu er en operation i gang 63 case state_reg i s 64 when idle => 65 i f mem= 0 then 66 state_next <= idle ; hvis mem er 0 bliver vi i " idle " state 67 else 68 addr_next <= addr ; e l l e r s opdateres adresesn 69 i f rw= 0 then write 70 state_next <= wr1; hopper ned i write1 state hvis read / write = 0 71 data_f2s_next <= data_f2s ; data sættes klar 72 else reading 73 state_next <= rd1 ; hvis ikke der skal skrives, så skal der læses 74 end i f ; 75 end i f ; 76 ready <= 1 ; Der er indsat et top_level, der skal gøre det nemt at kontrollere, hvad der sker ned til RAM fra microblazen. RAM kan kontrolleres ved hjælp af 2 signaler fra Microblazen, "data_skriv"og 31

40 6.3. Hukommelse Aalborg Universitet "memory". Memory bruges til at styre, hvornår RAM skal tilgås og sættes lavt, både hvis der skal læses og når der skal skrives. Data_skriv bruges til at bestemme, om der skal læses eller skrives, når data_skriv sættes lavt, signaleres der til RAM-blokken, at nu ønskes der en skrive operation, hvis signalet er højt ønskes der i stedet en læse operation. Et udsnit af koden, der gør netop dette, kan ses nedenfor: 131 process ( data_skriv, memory) 132 begin 133 data_f2s <= ( others=> 0 ) ; alle databit bliver sat t i l i f ( data_skriv = 0 and memory = 0) then skriv 135 mem <= 1 ; "Åbner" for ram 136 rw <= 0 ; siger t i l memory controlleren at vi v i l skrive 137 data_f2s <= data_fra_microblaze ; sender data fra microblaze videre ind t i l Memory contolleren 138 e l s i f ( data_skriv = 1 and memory = 0) then læs 139 mem <= 1 ; "Åbner" for ram 140 rw <= 1 ; siger t i l memory controlleren at vi v i l læse 141 else 142 mem <= 0 ; "Lukker" for tilgangen t i l RAM 143 rw <= 1 ; den kan stå på hvad den nu v i l 144 end i f ; 145 end process ; 146 output 147 data_til_microblaze <= data_s2f ; Data fra RAM bliver sendt tilbage ind i microblaze Dette styrer hvorvidt data skal ind eller ud af RAM-blokken, samt hvornår. Det fortæller derimod intet om, hvor disse data er. Adressen ned til RAM-blokken bliver opdateret ved hver clock cycle, dette foregår i en seperat proces, der kører ved hver clock cycle: 119 process ( Clk ) 120 begin 121 i f ( clk event and clk = 1 ) then 122 signal_addr <= adresse_fra_microblaze ; 123 data_f2s <= std_logic_vector ( data_fra_microblaze(17 downto 2) ) ; 124 data_skriv <= std_logic_vector ( data_fra_microblaze(1 downto 1) ) ; 125 memory <= std_logic_vector ( data_fra_microblaze(0 downto 0) ) ; 126 end i f ; 127 end process ; 128 addr <= signal_addr ; Hele koden kan desuden ses i appendiks D Hastighed af RAM Da der ønskes en samplingsfrekvens på 44,1 khz, det vil sige at der kommer en ny 16-bit datastring hver 22,68 millisekund ifølge formel = 22,68 ms (6.6) 44,1 khz Ifølge krav i kapitel 5.2 skal RAM-controller være i stand til at sætte en 16-bit string ind i RAM-blokken, inden de næste 16 bit dukker op fra A/D-converteren. 32

41 6.3. Hukommelse Aalborg Universitet Det betyder med andre ord at controlleren skal være i stand til, at udføre en read eller write cycle indenfor 22,68 millisekunder. Da Microblazen frekvens er 50 MHz, betyder det ifølge formel (6.7) 1 = 20 ns (6.7) 50 MHz at en clock cycle tager 20 nanosekunder, deraf kan det udregnes, hvor mange clockcykler der er til rådighed i formel (6.8), dog skal det huskes at en læse eller skrive operation hver tager 3 clock cycler dvs. 60 ns. 22, 68ms 60ns = c ockcyc er (6.8) Opsummering Den største hindring ved disse RAM er kapaciteten, der bliver i projektet kun tilgået 1 af de 2 eksterne RAM-blokke bag på spartan-3 platformen, det er valgt ikke at arbejde videre med at tilgå begge, da en er nok til at gemme 2 lyde af minimum 2,5 sekunder 5.2 i prototypen. Der er derimod ingen tvivl om, at hastigheden kan overholdes, men det er samtidig langt fra umuligt at gøre RAM-controlleren endnu hurtigere, det kunne for et eksempel være ved at eliminere klar-tilstanden, se figur På den måde vil alle læse- eller skriveoperationer ske lige efter hinanden uden nogen form for pause. En anden metode kunne være, at hæve clockfrekvensen til det dobbelte (100 MHz), det ville betyde at en clock cycle tog 10 ns i stedet for 20 ns. Dette vil stadig virke, da timing parametre fra RAM, se tabel 6.1 og 6.2, ikke overstiger 10 ns. Ingen af disse løsninger vil kunne betale sig, da RAM-controlleren overholder de krav, der er sat i projektet. Det at sætte hastigheden op forøger chancen for fejl. Det er i dette kapitel lykkedes at konstruere en RAM-controller der er i stand til at tilgå RAM-blokken fra Microblazen indenfor det ønskede tidsinterval. Næste kapitel omhandler sampling af den data, som skal gemmes. 33

42 6.4. Sampling af lyd Aalborg Universitet 6.4 Sampling af lyd Sampling af lyd foregår med analog til digital konvertering, ved brug af en DSP56ADC16-chip. Denne chips funktionalitet er forklaret og testet i appendiks B. Chippen kan konfigureres på mange forskellige måder. En kort opsummering af chippens konfiguration til fordel for dette projekt, følger. FIR-filter er valgt. Dette giver mulighed for 16 bit opløsning, og et dynamisk område på 96 db. SFMT (Serial Format) er valgt til 0. Dette valg gør så FSO benet giver en puls lige før hvert sample sendes ud på SDO. En ønsket output samplingsfrekvens på mindst 44,1 khz. Dette giver mulighed for at sample lyde på op til 22 khz Signaler Ind Chippen skal have et clock-signal for at fungere. Dette signal kommer fra Microblazens FIT2. Det er FIT_toggle der sendes ud, da dette signal har en 50 % duty-cycle. FIT_toggle signalet skal have en frekvens, der sørger for at chippens samplingsfrekvens bliver minimum 44,1 khz, se kapitel 5. Det fremgår af databladet [Motorola, 1992], at output samplingsfrekvensen er ƒ s,o t = ƒ s, n 128 (6.9) Her er ƒ s, n inputsamplingsfrekvensen, som svarer til FIT_toggle frekvensen og ƒ s,o t outputsamplingsfrekvensen. Den ønskede output samplingsfrekvens sættes ind i formlen og input samplingsfrekvensen isoleres. ƒ s, n = 44,1 khz 128 = 5,6448 MHz (6.10) Derfor skal FIT signalet have en frekvens på mindst 5,6448 MHz. For at dette lader sig gøre, skal der regnes ud, hvor mange 50 MHz clock cycler der skal til imellem hvert FIT signal. 50 MHz = 5,6448 MHz 50 MHz = 5,6448 MHz = 8,56 (6.11) Her er x antal clock cycler på 50 MHz, der skal gå for at opnå den ønskede inputsamplingssekvens. Da det ikke er muligt at dele Microblazens clock op i halve, er det valgt at have 8 cycler imellem hver FIT. Det giver den følgende inputsamplingssekvens 50 MHz ƒ s, n = = 6,25 MHz (6.12) 8 34

43 6.4. Sampling af lyd Aalborg Universitet Hvilket resulterer i en ny outputsamplingsfrekvens på ƒ s,o t = 6,25 MHz = 48,828 khz (6.13) Ud Der er 3 signaler fra ADC-chippen, som er vigtige for at kunne sample korrekt. Frame Sync Out (FSO), Serial Clock Out (SCO) og Serial Data Out (SDO). Disse kan ses på figur 5.1. Serial Data Out er det signal, der indeholder den samplede data. Mellem hvert sample er der 32 SCO pulser. De 16 første indeholder den samplede data, og de 16 sidste er alle 0. Denne data kommer ud af chippen serielt. Frame Sync Out er et signal, der sender en puls lige før den første bit i samplet transmitteres. Dette signal indikerer, hvornår et nyt sample kommer. Den adresse, det første sample ligges ind på, skal ændres, så det næste sample ikke overskriver det første sample. FSO kan benyttes til denne inkremering af adresse. Serial Clock Out signalet er en clock, der sender en puls hver gang en bit transmitteres. Dette giver mulighed for at holde styr på, hvor mange bit der er lagt ind i RAM, og derfor kan memory controlleren lukkes efter 16 bits. Dette sker, så det egentlige sample ikke bliver overskrevet af de efterfølgende 16 nuller, inden det næste sample kommer Håndtering af samples Det er valgt i dette projekt at konvertere det serielle data, der kommer ud af chippens SDO, til parallel data inden det sendes ind i Microblazen og videre til RAM. Dette realiseres ved at lave et skifteregister i VHDL der er timet efter to af chippens signaler FSO og SCO. Det første der skal ske i VHDL koden er at konstruere en måde hvorpå programmet er i stand til at detektere hvornår de SCO og FSO finder sted. For bedre at forstå hvorfor det er vigtigt at vide præcis hvornår SCO eller FSO kigges der på et timing fra databladet, se figur [Motorola, 1992] Figur 6.12: Uddrag af timing diagram for A/D konverter 35

44 6.4. Sampling af lyd Aalborg Universitet 1 Her ses det at data på SDO er stabile når der er en faldende flanke på SCO. Med det i mente, er det nu muligt at sende data ind i en 16-bit SIPO-buffer (Serial In Parallel Out). Dette realiseres i vhdl, og kan ses i kodeeksemplet nedenfor. 2 process ( detect_output_sco, detect_output_fso, parallel_out, s e r i a l _ i n ) SIPO buffer (16 bit ) 3 begin 4 i f ( detect_output_sco = 1 and detect_output_fso = 0 ) then hvis der er data klar, og der ikke er reset, så 5 parallel_out (15 downto 1) <= parallel_out (14 downto 0) ; s k i f t parallel output med 1 6 parallel_out (0) <= s e r i a l _ i n ; input nyt b it fra s e r i e l ind på plads 0 i parallel output 7 end i f ; 8 end process ; Koden tager data serielt ind på serial_in-benet, og sender det bit over i et 16-bit register, det register bliver så skiftet en plads til venstre, hver gang der kommer en faldende flanke fra SCO. Denne funktion vil blive ved med at gemme nye bits, og efter 16 pulser fra SCO, vil de første bits, der er sendt ind i registeret, forsvinde. Derfor kører der parallelt med denne funktion en counter, der tæller 1 op, hver gang der er en faldende flanke fra SCO. Når dette counter så når 16, sender den en puls ved navn max_tick, når max_tick går højt, fortæller den, at nu skal data sendes ud parallelt fra SIPO via en 16-bit bus, og videre til Microblazen. Hele koden kan ses i appendiks D Opsummering I dette afsnit er det blevet forklaret hvordan analog til digital konvertering er sat op i projektet. Der benyttes en DSP56ADCS chip til at konvertere det analoge signal til digitalt. Denne chip drives af en FIT der sendes ud af Microblazen, med en frekvens på 6,25 MHz. De kontrolsignaler og data signalet chippen sendes ud håndteres af en SIPO, der laver den serielle data parallel så den nemt kan læses ind i hukommelsen. I det næste vil det bliver forklaret hvordan hukommelsen på spartan-3 platformen håndteres. 36

45 6.5. Design af brugerflade Aalborg Universitet 6.5 Design af brugerflade Brugerfladen til et produkt, er det som brugeren kommer til at interegere med. Designet af brugerfladen er derfor vigtigt for brugervenligheden af produktet. Derfor vil der i det følgende afsnit blive beskrevet, hvad de forskellige komponenter i brugerfladen på produktet kan og hvordan de interagere med softwaren. Der vil også blive givet et overblik over, hvordan brugerfladen, for den prototype der vil blive produceret, vil komme til at se ud. På figur 4.1 ses et billede af prototypens brugerflade. Figur 6.13: Figuren viser prototypens brugerflade. Dioder til sekvens (Kasse nr. 1) Denne samling af 8 dioder, bliver brugt til at vise brugeren, hvor i sekvensen trommemaskinen befinder sig. Dette er lavet for at vise brugeren, hvor i sekvensen der bliver arbejdet. Når den sidste plads i sekvens er nået, skal sekvensen startes forfra, altså skal der komme lys i dioden i den modsatte ende af dioderækken. Disse dioder bliver styret af Microblazen for at holde styr på, hvor i sekvensen der arbejdes. 37

46 6.5. Design af brugerflade Aalborg Universitet Dioder til samples (Kasse nr. 2) Disse 2 dioder, giver brugeren et visuelt overblik over, hvilke samples der bliver afspillet. Hvis der, på en given plads i sekvensen, er programmeret en eller flere lyde ind, vil de tilsvarende dioder lyse. Disse dioder bliver også aktiveret af Microblazen, så der er mulighed for at holde styr på hvilke samples der afspilles, hvor i sekvensen. Knapper til at vælge forskellige tilstande (Kasse nr. 3) De 2 knapper der er angivet i kasse nummer 4, bliver brugt til at vælge mellem programmerings tilstand eller afspilnings tilstand. Disse knapper er hægtet på en vektor, hvor de bits, der er styret af knapperne, bliver tjekket inde i Microblazen. Udfra hvordan bit-kombinationen er på vektoren, vil det blive bestemt, hvilken tilstand trommemaskinen skal være i. Knapper til at trigge samples (Kasse nr. 4) På samme måde som det skal være muligt at bestemme hvilken tilstand trommemaskinen skal være i, skal det være muligt at bestemme, hvilke samples der skal puttes ind på de forskellige pladser i sekvensen. Denne funktion er tildelt knapperne i kasse nr. 4. De fungere på samme måde, som de knapper der er beskrevet i kasse nummer 3. Knapperne manipulere en vektor, hvor de bits, knapperne manipulerer, bliver tjekket inde i Microblazen. Udfra kombinationen af bit ene vil det blive bestemt, hvilket sample der skal placeres i sekvensen. Encoder til tempostyring (Kasse nr. 5) Brugeren kan justere tempoet ved at dreje på en encoder. Microblazen forøger eller reducerer tiden mellem hvert step, udfra drej på encoderen. Encoderen er lige som knapperne tilsluttet vektoren der tjekkes i Mikroblazen. En funktion i C-programmet sørger for at finde ud af hvilken vej encoderen drejer. Vippekontakt til stepskift(kasse nr. 6) Vippekontakten her i kasse 6, er den som brugeren kan bruge til at bestemme, hvilket step i sekvensen der skal arbejdes på, når sekvensen skal programmeres. Ved at vippe med kontakten bliver enten det højre eller venstre ben på kontakten sat højt og derved kan processoren registrere, hvilken retning der skal skiftes til. 7-segments display (Kasse nr. 7) 7-segments displayet bliver brugt til at vise brugeren, hvilke tempo der bliver afspillet med i trommemaskinen. BPM bliver udregnet ud fra den værdi, som microblazen har læst fra enkoderens input. Værdien bliver så lavet om til en vektor, der sendes til FPGA en, som styrer 7-segmentsdisplayet. 38

47 6.6. Programmeringsfilosofier Aalborg Universitet 6.6 Programmeringsfilosofier Der er mange forskellige måder at programmere det samme stykke software på. Det er muligt at gøre det efter forskellige filosofier, forskellige metoder, i forskellige sprog, og alt sammen har deres fordele og ulemper. I dette afsnit vil tanken bag de forskellige metoder, brugt i dette projekt, blive forklaret. Der vil blive givet et overblik over de mest anvendte filosofier, samt deres fordele og ulemper [Pro] De forskellige filosofier Når der tales om filosofier inden for programmering, er der tale om, hvordan forskellige programstykker kobles sammen. Nogle kodesprog kan bruges til flere forskellige af disse filosofier, mens andre kun egner sig til et enkelt af dem. Der er sprog, som med vilje kombinerer, hvad der menes at være det bedste fra hver af de mange filosofier, i følge personerne som står bag det pågældende kodesprog. Imperitiv filosofi Grundprincipperne i imperativ programmering, er at programmet bliver afviklet som en funktion af, hvor lang tid der er gået. Det skal forstås på den måde, at den tid, det tager at afvilke de foregående kommandoer, er den tid, som vil blive brugt på at afvilke en given kommando i et program. Denne programmeringsmetode har sine rødder i den digitale elektronik, ved at ideerne bag den og metoden er de samme, som der er lagt vægt på i en Von Neumann maskine. Funktionel filosofi Denne filosofi er baseret på et matematisk grundlag og er derfor i mange henseender meget simplere, end den imperitive filosofi. Tid spiller ikke så stor en rolle, som i imperitiv programmering, samt alle udregninger bliver lavet ved at lave funktionskald. Objekt-orienteret programmering Med objekt-orienteret programmering arbejdes der udfra en idé om, hvordan et program skal fungere, og arbejder sig frem imod at få de funktioner implementeret i et program inden for de givne rammer. Programmet bliver sat op, så der er en logisk sammenhæng mellem de forskellige blokke, som programmet kommer til at bestå af. Realtidsfilosofi Denne filosofi er lavet til realtidsoperationer, hvor det er muligt at sample på den virkelige verden ved hjælp af forskellige sensorer og en analog til digital konverter. Denne filosofi kræver også, at der bliver brugt et programmeringssprog, der gør det muligt at interegere med omverdenen i realtid. Eksemper på disse sprog er C/C++ og java. 39

48 6.6. Programmeringsfilosofier Aalborg Universitet Implementering af filosofier i projektet I dette projekt er der brug for en blanding af de ovennævnte filosofier. Grunden til at det er nødvendigt at blande alle disse filosofier er, at projektet består af flere forskellige systemer. Der er brug for realtidsprogrammering, når der skal samples lyde ind i hukommelsen. Der er også brug for de 3 andre filosofier, når der skal designes funktioner til produktet. Der vil blive brug for at lave en funktion til at afspille samples fra hukommelsen. Der vil blive brug for at lave flere funktionskald, når de indspillede samples skal programmeres ind i sekvensen. Så ved at lave en kombination af alle de forskellige filosofier, er det lettere at skrive den nødvendige kode, der skal til for at få de ønskede funktioner med. 40

49 6.7. Funktionsbeskrivelser Aalborg Universitet 6.7 Funktionsbeskrivelser Her vil de forskellige funktioner blive beskrevet og forklaret. Samtidig vil der være flowdiagrammer til bedre at give en visuel forklaring af funktionens egenskaber Indspilling af samples til RAM Figur 6.14: Flowchart af programsekvensen for hvordan samples bliver gemt i RAM. For at kunne indspille samples til RAM, er der visse betingelser, som skal være opfyldt. Produktet skal være sat i indspilningsmode og der skal være samples fra ADC en før programsekvensen kan afsluttes. Det første der skal være opfyldt, før det er muligt at indspille noget, er at indspilningmode skal være valgt. Det sker ved at lave et tjek på om en kontakt er sluttet eller afbrudt. Hvis kravet, for at gå videre i sekvensen, er opfyldt bliver der også tjekket 41

50 6.7. Funktionsbeskrivelser Aalborg Universitet hvilken knap brugeren har valgt, at lyden skal ligge på. Den adresse bliver sendt videre til Microblazen, som gemmer adressen og har styr på, hvor det pågældende sample er placeret i hukommelsen. Når det er sket så skal der ventes på det næste sample fra ADC en. Når samplet er modtaget bliver det lagt over i adressen i RAM, som brugeren valgte før Programmering af sekvens Figur 6.15: Flowchart af hvordan samples bliver programmeret ind i en Sekvens. Sekvensprogrammeringen foregår ved at der vælges en postion i sekvensen med step-skifteren. Ved at vippe kontakten til enten højre eller venstre, skiftes der position i sekvensen, og når den ønskede position er nået, vælges de/den pågældende sample(s), der ønskes på positionen. 42

51 6.8. Softwareopdeling Aalborg Universitet Afspilning af sekvens Figur 6.16: Flowchart af hvordan samples vil blive afspillet. Afspilningen foregår ved at, den første plads i sekvensen bliver undersøgt. Hvis der er et eller flere samples programmeret ind på pladsen, bliver adresserne hentet fra Microblazen og samples bliver læst. Herefter bliver næste plads i sekvensen undersøgt. Efter denne forklaring af de forskellige funktioner i produktet, vil det blive beskrevet, hvordan disse funktioner er opdelt inde i produktet. 6.8 Softwareopdeling I det følgende afsnit vil det blive beskrevet, hvordan de forskellige funktioner, produktet får, vil blive håndteret i dels FPGA en, men også i Microblazen. Derudover vil de forskellige funktioner også blive beskrevet meget overordnet, for at få et overblik over, hvilke inputs og outputs, der skal til, for at lave de beskrevne funktioner. De funktioner, som produktet kommer til at indeholde, vil blive styret af forskellige dele af FPGA en. Nogle af funktionerne vil blive styret af Microblazeprocessoren. Andre dele af programmet, vil bliver styret direkte af det hardware, som bliver lagt i FPGA en. 43

52 6.8. Softwareopdeling Aalborg Universitet Finite-state-maskiner Det hardware, der bliver lagt i FPGA en, skal ses som værende finite-statemaskiner, altså et kredsløb, som har endeligt mange tilstande. Disse maskiner kan med fordel laves i FPGA en, sådan at Microblaze-processoren ikke skal beskæftige sig med at lave de samme trivielle opgaver igen og igen. Opgaver, som har variable, er bedre egnet til Microblazen. For at en funktion kan beskrives, som en finite-state-maskine, skal den have et endeligt antal tilstande, den kan antage. En af de mest simple ting, der kan beskrives som en finite-state-maskine, er en dør. En dør har 2 tilstande, åbnet eller lukket. På samme måde er det muligt at beskrive funktioner i et produkt, som en finite-state-maskine. En af de funktioner der kan beskrives som en finite-state-maskine i produktet, er det at indspille samples til RAM (se 6.3.2). Det er en funktion, som består af 5 dele. Der skal laves et tjek om produktet er sat i indspilningsmode eller ej, hvis indspilningsmode er valgt, så skal der læses på A/D konverteren og data herfra lægges i RAM på en given adresse Microblazens opgaver Microblazen kommer til at håndtere alle de forskellige variable, som trommemaskinen opererer med. Dette gøres, da den C-kode, Microblazen bliver programmeret med, bedre kan tage højde for de mange forskellige variable og lave de beregninger, der skal til. Programmering af sekvens Sekvensen er den rækkefølge, som samples skal afspilles i. Hvor hurtigt en sekvens forløber bestemmes ud fra tempoet. Hvad der skal afspilles på de forskellige tidspunkter i sekvensen bestemmes af, hvad brugerens input er. Håndtering af samples i RAM Microblazen skal hele tiden have styr på, hvor de forskellige samples ligger i hukommelsen. Det er derfor muligt at bestemme, hvilke samples der skal afspilles ud fra det, sekvensen er programmeret til. IO-håndtering (knapper og drejeknapper) Nogle af de variable produktet skal håndtere, kommer fra knapperne eller encoderen. Værdien, som knapperne giver, er enten et digital højt eller lavt signal, så dette kan føres direkte ind til Microblazen. Tempoet bliver justeret ved hjælp af en encoder. Encoderen giver et signal, hvorfra det skal bestemmes om der skrues den ene eller anden vej. Dette skal henholdsvis øge eller sænke tempoet

53 6.8. Softwareopdeling Aalborg Universitet Opsumering Det er i det foregående afsnit blevet klarlagt, hvilke fordele der kan være ved at nogen funktioner bliver klaret på forskellige platforme. Hvis det er nødvendigt at lave mange forskellige typer regneoperationer på tal, er det smart at den opgave bliver klaret i Microblazen. Hvorimod det er hurtigere at klare opgaver i FPGA en og VHDL-koden hvis opgaven kan beskrives som en finite-state-maskine. Det er også blivet klarlagt hvilke opgaver, der skal varetages af hvilke platforme i projektet. Det næsten afsnit vil komme til at handle om hvordan Microblazens opgaver vil bliver programmeret, og der vil blive givet en kort gennemgang af nogen kodeeksempler. 45

54 6.9. C-program Aalborg Universitet 6.9 C-program Der er skrevet et C-program til at håndtere in- og outputs fra brugerfladen, samt sampling af lyd, programmering og afspilning af sekvens. Denne software har til formål at styre funktionaliteten af sampleren og trommemaskinen. Dette afsnit indeholder beskrivelse af de forskellige funktionaliteter, og hvordan de bliver realiseret i koden Aflæsning af inputvektor Det er vigtigt for programmet at kunne holde styr på, hvilke knapper eller funktioner brugeren betjener. Da alle brugerens interaktioner bliver registreret via et 12 bit GPI (General Purpose Input), skal der holdes styr på, hvilke bits der tændes, når brugeren trykker eller drejer på en knap. Dette gøres ved at tjekke de enkelte bits i den vektor, der læses på inputtet. De interaktioner brugeren laver, hænger ofte sammen med en bestemt tilstand, brugeren er i. Derfor vil det ikke altid være nødvendigt at tjekke hele vektoren, men kun de funktionaliteter, der er tilgængelige i en given tilstand. Alle disse inputs er tilkoblet Microblazens GPI4. Der benyttes en debounce funktion på denne vektor, for at kunne aflæse den korrekt. Debounce funktionen sørger for, at et knap tryk bliver mere stabilt og er nemmere at regne med. Hvis ikke der var en debounce funktion, vil der ved et enkelt tryk på en knap måske blive registreret 20 tryk. Denne inputvektor tjekkes efter og debounces med følgende kode [deb]. 72 int readinputfct ( ){ 73 input = XIOModule_DiscreteRead(&gpi, 4) ; 74 return ( input ) ; 75 } void debounceinput ( ){ 78 state [ indeks]=readinputfct ( ) ; / / det der læses på inputvektoren, gemmes på en plads i arrayet 79 indeks++; / / næste plads i arrayet gøres klar 80 j=0 x f f f f ; 81 for ( i=0 ; i<max_checks ; i++) j = j & state [ i ] ; / / AND operation udføres på j og det læste input, 10 gange 82 debouncedstate = j ; / / resultatet af and operationen gemmes i debouncedstate 83 i f ( indeks >= MAX_CHECKS) indeks = 0; / / index n u l s t i l l e s 84 } Afhængig af hvilken tilstand brugeren er i skal variablen DebouncedState tjekkes, men kun de bits der har relevans for den tilstand. Dette realiseres med følgende kode. 46

55 6.9. C-program Aalborg Universitet 97 void togglemode ( ){ 98 debounceinput ( ) ; 99 for ( i = 2 ; i < 4 ; i++){ / / her hardcodes de bits i inputvektoren der ønskes tjekket 100 i f ( debouncedstate & (1 << i ) ){ / / er en af de givne bits høje 101 modebtn = (1 << i ) ; / / sættes samme bit hø j i en variabel 102 } 103 else{ / / er en af de givne bits lave 104 modebtn &= ~(1 << i ) ; / / sættes den samme bit lav i variablen 105 } 106 } Her hardcodes hvilke bits i vektoren debouncedstate der ønskes tjekket. I eksemplet ovenfor er det bit 2 og 3 i vektoren der tjekkes Kontrol af tilstande Brugeren skal have mulighed for at bestemme, hvilken tilstand maskinen er i. Dette gøres via modeknapperne på brugerfladen, samt en switch der styrer sample mode. Det er op til softwaren at holde øje med, hvilken knap brugeren sidst har trykket ned, samt at registrerer om brugeren trykker på en ny, eller den samme knap igen. Menuen er delt op i 2 dele. Den første del tjekker om switchen står på 1 eller 0, står den på nul får brugeren adgang til at vælge programmeringstilstand eller afspilningstilstand. Står switchen på 1, har brugeren kun mulighed for at sample lyde ind i hukommelsen. Følgende kode viser den mekanisme der lader brugeren vælge programmeringstilstand eller afspilningstilstand. 107 i f (modebtn!= modesel) modesel = modebtn; 108 while (modesel!= lstmodesel ){ / / der tjekkes kun hvis der sker noget nyt på de to mode knapper 109 i f ( (mode == 2 1) && (modecounter1 == 2 modecounter2 == 2) ){ 110 mode = 0; / / hvis der tykkes på den samme knap igen 111 modecounter1 = 0; / / n u l s t i l l e s mode og modecountere 112 modecounter2 = 0; 113 } 114 else i f (modesel == 8){ / / trykkes der på den ene mode knap 115 mode = 2; / / sætttes mode t i l modecounter1++; / / og der tæl l e s op 117 } 118 else i f (modesel == 4){ / / trykkes der på den ene mode knap 119 mode = 1; / / sætttes mode t i l modecounter2++; / / og der tæl l e s op 121 } 122 else{ 123 } 124 lstmodesel = modesel; / / det nuværende input gemmes, så der kan tjekkes om det æ ndrer sig 125 } Tilstande I det følgende vil de forskellige tilstande blive gennemgået. På figur 6.17 er vist et flowchart af den software der skal kunne navigere rundt i menuen. 47

56 6.9. C-program Aalborg Universitet Figur 6.17: Figuren viser et flowchart af den software, der skal styre navigationen til samplerens forskellige funktioner. Sampling af lyd Sampling foregår i samspil med ADC-chippen og den 16-bit SIPO der er beskrevet i afsnit 6.4. Den 16-bit vektor der sendes ud af SIPO en indeholder data fra et sample og skal derfor aflæses. Det er vigtig at aflæse vektoren i rette tid, da alle bits i et nyt sample skal være på plads inden. Dette gøres ved at læse på det signal SIPO en sender ud, der hedder max_tick. Dette signal er tilsluttet Microblazens GPI samplingmode ( ) ; / / der polles på sample switchen 325 switch ( sampling ){ 326 case 1 : 327 toggletrigger ( ) ; / / det a f læses hvilken trigger det ønskes at gemme sample på 328 while ( trigger == 1){ 329 toggletrigger ( ) ; / / der polles på trigger igen for at kunne forlade l økke 330 addr_til_ram = lst_addr ; / / den sidst kendte adresse gemmes i addr_til_ram 331 nyt_sample = XIOModule_DiscreteRead(&gpi, 3) ; / / max_tick fra SIPO a f læses 332 i f ( ( nyt_sample!= gammelt_sample) && ( nyt_sample!= 0) ){ / / betingelser for at nyt sample skal hentes 333 addr_til_ram++; 334 XIOModule_DiscreteWrite(&gpo, 2, addr_til_ram ) ; / / adresse sendes t i l RAM controller 335 data_til_ram = XIOModule_DiscreteRead(&gpi, 2) ; / / data læses fra RAM 336 data_til_ram = data_til_ram << 2; / / data variablen bit manipuleres for at 48

57 6.9. C-program Aalborg Universitet 337 data_til_ram &= ~(1 << 0) ; / / holde styr på de 2 kontrol signaler i denne vektor 338 data_til_ram &= ~(1 << 1) ; / / bit 0 og bit 1 sættes lav 339 XIOModule_DiscreteWrite(&gpo, 1, data_til_ram ) ; / / kontrol signaler sendes t i l RAM controller 340 gammelt_sample = nyt_sample ; / / kontrol af betingelser for i f statement 341 } 342 i f ( nyt_sample == 0) gammelt_sample = 0; 343 lst_addr = addr_til_ram ; 344 } 345 XIOModule_DiscreteWrite(&gpo, 4, udgang) ; 346 break ; Programmering af sekvens Denne funktion giver brugeren mulighed for at programmere en given sekvens, til et sample efter brugerens ønske. Dette kan gøres inden sekvensen afspilles. Sekvensen programmeres ved hjælp af en vippeknap, der kan vippe til begge sider. Denne knap bruges til at navigere rundt i sekvensen, således at samples kan placeres på den ønskede plads i sekvensen. Trykkes der på et sample, gemmes den nuværende position, i sekvens-arrayet for det givne sample. Funktionen, der lader dette ske, er realiseret i softwaren med det følgende kode 236 void programsq( ){ 237 i f ( step!= prevstep ) trigger = 0; / / n u l s t i l l e r placering af sample hvis der skiftes plads i sekvensen 238 toggletrigger ( ) ; / / a f læser triggers for at placere sample 239 i f ( trigger == 1){ / / hvis trigger 1 trykkes på 240 sekvens[ trigger ] = (1 << step ) ; / / sættes den bit der svarer t i l den nuværende placering i sekvensen 241 i f ( trgcounter1 == 2){ / / trykkes der på den samme trigger igen, 242 sekvens[ trigger ] &= ~(1 << step ) ; / / fjernes den tilsvarende bit 243 } 244 } 245 else i f ( trigger == 2){ / / det samme sker for trigger sekvens[ trigger ] = (1 << step ) ; 247 i f ( trgcounter2 == 2){ 248 sekvens[ trigger ] &= ~(1 << step ) ; 249 } 250 } 251 else{ 252 } 253 prevstep = step ; 254 } Afspilning Denne funktion afspiller de førnævnte programmerede sekvenser i et givet tempo, der også kan justeres af brugeren. Det er nødvendigt at aflæse de forskellige sekvenser, der er blevet programmeret forinden, bit for bit for at finde ud af om der er sat et sample, som skal afspilles. Hvis der er sat et 49

58 6.9. C-program Aalborg Universitet sample et sted i sekvensen skal dette sample hentes fra hukommelsen. Dette lader sig gøre med følgende kode. 159 void samplemix ( ){ 160 sq = sekvens[1 ] ; / / den første sekvens indlæses midlertidigt 161 i f (sq & (1 << step ) ){ / / denne midlertidige variabel tjekkes for hø j bit på det nuværende step i sekvensen 162 udgang &= ~(1 << 8) ; / / er dette t i l fælde tændes den tilsvarende diode 163 data_til_ram = 0xFFFFFFFE ; 164 XIOModule_DiscreteWrite(&gpo, 1, data_til_ram ) ; / / der sendes kontrolsignaler t i l RAM controller for at læse fra RAM 165 addr_til_ram = 0; 166 while ( addr_til_ram < lst_addr ){ / / der læses fra RAM på alle de adresser der samplet ind på 167 XIOModule_DiscreteWrite(&gpo, 2, addr_til_ram ) ; / / adressen der ønskes læst sendes t i l RAM controller 168 data_fra_ram = XIOModule_DiscreteRead(&gpi, 1) ; / / der læses data fra RAM contoller 169 x i l _ p r i n t f ( "%d, \ n", data_fra_ram ) ; / / de læste data printes t i l UAR/ T 170 data_fra_ram = 0; / / data variablen sættes t i l 0 for at minimere f e j l 171 addr_til_ram = addr_til_ram + 1; / / der ligges en t i l adressen 172 } 173 } 174 else{ 175 udgang = (1 << 8) ; / / e l l e r s slukkes den 176 } 177 sq = sekvens[2 ] ; / / samme procedure for sekvens / funktion fortsættes / De data der hentes fra RAM printes via UAR/T i en.csv fil for at kunne plotte resultatet. Dette er valgt siden der i projektet ikke laves digital til analog konverter, og det derfor ikke er muligt at få lyd ud i en højtaler. Tempo Det er i dette projekt valgt at det skal være muligt at se det nuværende tempo på spartan-3 platformens 7-segmentsdisplay. For at kunne vise tempoet på 7-segmentsdisplayet er det nødvendigt at decode den hexadecimale BPMværdi, til et andet tal, der repræsenterer den samme værdi, men vist på 7-segmentsdisplayet. Dette gøres ved at konvertere hexadecimalværdien til BCD (Binary-Coded Decimal). Det er muligt at konvertere fra hexadecimal til BCD ved hjælp af det følgende stykke kode [BCD]. 86 unsigned long topackedbcd ( unsigned int val ){ 87 unsigned long bcdresult = 0; 88 for ( t = 0; val ; t++) 89 { 90 ( ( char )&bcdresult ) [ t / 2] = t & 1? ( val % 10) << 4 : ( val % 10) & 0xf ; 91 val /= 10; 92 } 93 return bcdresult ; 94 } Konverteringen resulterer i en vektor af 16 bits, der kan deles op i 4, hvor bit 1-4 styrer det første ciffer, bit 5-8 det næste ciffer osv. Denne vektor sendes ud af Microblazens GPO3, og behandles derefter i VHDL med en display-controller, 50

59 6.9. C-program Aalborg Universitet der er beskrevet i afsnit Det er beskrevet i næste afsnit, hvordan tempo udregnes og reguleres Kontrol af outputvektor Brugeren får feedback når der interageres med maskinen, i form af dioder der lyser. Disse dioder er styret af GPO4 fra Microblazen. Denne GPO er en 9 bit vektor, der ved en høj bit tænder en lysdiode. Afhængig af hvilken tilstand brugeren er i, skal forskellige dioder lyse. Dette løses ved at lave bitvis manipulation på en variabel, og derefter sende denne variabel ud af GPO4. Det følgende kodeeksempel vil tænde den diode der er tilsluttet den første plads i output vektoren. udgang = (1 << 0) ; XIOModule_DiscreteWrite(&gpo, 4, udgang) ; Denne outputvektor skal hele tiden bitmanipuleres afhængig af den tilstand maskinen er i Opsummering I dette kapitel er det beskrevet hvordan sampleren og trommemaskinens funktionaliteter er realiseret ved C-programmet i Microblazen. Det er forklaret, hvordan der holdes styr på brugerens tryk på knapper, og hvordan brugeren får feedback via diverse dioder. Derudover beskrives det, hvordan data flyttes fra SIPO til Microblaze og videre til RAM, samt hvordan data hentes fra RAM igen. Hele C-filen findes i appendiks C. 51

60 6.10. Sekvenstiming Aalborg Universitet 6.10 Sekvenstiming I dette afsnit vil det blive beskrevet, hvordan timingen af samplerens sequencer er designet. Dette indebærer dens implementering på FPGA en, hvordan tidsbegrebet implementeres, hvordan sequenceren forholder sig til tiden og hvordan tempoet kan ændres fra brugerfladen. Det er valgt, at sequenceren skal være af typen stepsequencer, som beskrevet i afsnit 3.3. Dette er for at sekvensen stemmer overens med takterne, som anvendes i det meste musik i dag Microblaze og FIT En sequencer skifter mellem hvert step med et bestemt tidsinterval. Dette betyder, at systemet skal kunne håndtere tid. Microblazen har en såkaldt FIT 6.2.5, som kan indstilles til at generere et interrupt, for hver gang et bestemt antal af FPGA ens clock cycler er forløbet, fra den indbyggede clock. Dette er illustreret på figur Figur 6.18 Spartan-3 platformen har en clockfrekvens på 50MHz. Hvis der skal være et interrupt for hvert halve millisekund, kan antal clock cycler mellem hver interrupt udregnes. Hvorfor der er valgt et halv millisekund, vil blive forklaret senere i kapitlet. En periodetid på et halvt millisekund kan udtrykkes i frekvens: ƒ nt = 1 T nt = 1 0, s = Hz (6.14) Her er T nt interruptets periodetid og ƒ nt er dets frekvens. Nu kan antal clock cycler udregnes ved følgende udtryk: Hz k = Hz k = Hz Hz Her er k antallet af clock cycler mellem hver interrupt. k = (6.15) Nu får Microblazen ét interrupt for hver halve millisekund. Dette interrupt kan bruges i Microblazens C-kode. For hvert interrupt der registreres, tælles der én op i variablen ct : 274 void timertick ( void ref ) { / dette er interrupt rutinen der køres ved FIT1 s interrupt / 275 ct++; / / ct tæl l e s op ved hvert interrupt hvert halve millisekund 276 debounceinput ( ) ; / / inputtet læses 277 readencoder ( ) ; / / encoderen a f læses og tempo korrigeres, hvis der er ændringer 278 } 52

61 6.10. Sekvenstiming Aalborg Universitet Funktionen readencoder(); kaldes også ved interruptet, denne funktion forklares senere i dette afsnit. Der laves en delay-funktion ved hjælp af interruptet. Denne er baseret på variablen ct : 1 void delay (u32 ms) { / denne funktion er en delay funktion / 2 ct = 0; / / tælleren n u l s t i l l e s 3 while ( ct < ms){ / / værdien der sendes ind i funktionen definerer delay tiden 4 } 5 } Der laves nu en while-løkke, hvori delay-funktionen kaldes. For hver gang løkken køres igennem skal sequenceren gå fra ét step til det næste. Tiden derimellem, bestemmes udfra den værdi, som delay-funktion kaldes med multipliceret med interruptets periodetid, T, på 0,5 ms: T step = T nt = 0, (6.16) Her er T step tiden mellem hvert step og x er den værdi, som delay-funktion kaldes med. Hele koden kan desuden ses i appendiks C BPM og periodetid Periodetiden T step er, som nævnt, tiden der går fra et step til det næste. Når der produceres musik angives tempoet i BPM (Beats Per Minute), hvilket betyder slag per minut. Tempoet ønskes derfor angivet i BPM, hvilket betyder at forholdet mellem BPM og x skal bestemmes. Der går 2 steps for hvert slag, hvilket er illustreret på figur Dvs. at tiden mellem hvert slag er dobbelt Figur 6.19: På figuren er sekvensens steps vist ved alle firkanterne. De røde firkanter viser slag. De grønne cirkler illustrerer de dioder brugeren kan se på brugerfladen. så stor, som tiden mellem hvert step, altså: T s g = 2 T step = 2 T nt = 2 0, = 10 3 (6.17) Her er T s g tiden mellem hvert slag. 53

62 6.10. Sekvenstiming Aalborg Universitet BPM kan betragtes som en frekvens afhængig af minutter, i stedet for sekunder. FPGA en clockfrekvens afhænger af sekunder, derfor ønskes BPM udtrykt ifht. sekunder. Først ses der på frekvensen for slagene i sekunder. ƒ s g = 1 T s g (6.18) Dette kan omregnes til BPM. 1 1 BPM = 60 ƒ s g = 60 = 60 T s g 10 3 = (6.19) Den værdi delay-funktionen skal kaldes med, på baggrund af BPM, kan nu findes ved at isolere x. = BPM (6.20) For at undgå at processoren skal lave denne udregning, hver gang tempoet ændres, udregnes x til tempo op til 240 BPM, hvilket musik sjældent overstiger. Disse lægges ind i et array, ved opstart af programmet, og kan derefter kaldes i delayfunktionen med udgangspunkt i tempo. Tiden mellem Figur 6.20 hvert interrupt, T nt, på et halvt millisekund, er bestemt ud fra denne række. Hvis T nt er et millisekund er det lettere at regne med, men det vil betyde at nogle af de laveste x-værdier, ved højt tempo, ikke vil variere. Tiden T nt kan reduceres yderligere, hvis større præcision af tempoet ønskes. Alle funktioner der kaldes i interrupt rutinen, vil blive eksekveret tilsvarende oftere, ved reduceret T nt, og vil derfor også belaste processoren yderligere Encoder Det er vigtigt for brugeren, at kunne indstille tempoet. Derfor skal en drejeknap implementeres til at styre tempoet. Til dette formål er der valgt en encoder, som er en drejeknap delt op i trin uden et minimum eller maksimum. Encoderen tilsluttes FPGA en, som vist på figur

63 6.10. Sekvenstiming Aalborg Universitet Figur 6.21: Figuren viser et eldiagram over encoderens forbindelse til FPGA en. To pull-up modstande er sat ind for at holde signalet stabilt. Encoderen er tilsluttet 2 inputs og kan derfor antage 4 forskellige binære værdier: 00, 01, 10 og 11. Retningen knappen drejes, bestemmer rækkefølgen på talrækken. Hvis der drejes med uret er rækkefølgen: 11, 01, 00 og 10. Hvis der drejes mod uret er rækkefølgen modsat: 11, 10, 00 og 01. Retningen encoderens drejes, afgøres ved at sammenligne den nuværende position med den forhenværende. Denne sammenligning sker ikke af sig selv, og skal derfor ske i programkoden. Mellem hvert trin, encoderen drejes, gennemgås samtlige værdier og ender med at stå på samme værdi, som udgangspunktet på forrige trin. Ved hjælp af bitmanipulation rykkes den tidligere værdi 2 pladser til venstre i dens binære række og den nye værdi tager de to pladser, hvor den tidligere værdi var før. Dette sker 4 gange for hver gang encoderen drejes et trin, hvilket er illustreret på figur For hvert trin encoderen drejes, ønskes det Figur 6.22 at skrue tempoet én BPM op eller én BPM ned, alt efter retningen der skrues. Det er derfor kun nødvendigt at registrere én af de 4 skift, som sker mellem hvert trin. En af disse skift vælges, til at skulle tælle op i tempoet og et andet til at tælle ned. Dette kan ses i kodeeksemplet nedenfor. 55

64 6.10. Sekvenstiming Aalborg Universitet 255 int readencoder ( ){ / denne funktion læser encoderens bevægelser og korrigerer BPM efterfølgende / 256 for ( i = 0 ; i < 2 ; i++){ 257 i f (debouncedstate & (1 << i ) ){ 258 encoder = (1 << i ) ; 259 } 260 else{ 261 encoder &= ~(1 << i ) ; 262 } 263 } 264 sum = ( lastencoded << 2) encoder ; / / f l y t t e r den nuværende værdi 2 pladser t i l venstre 265 i f (sum == 0b ) BPM ++; / / tæl l e r op hvis den sidste værdi er 11 og nuværende er i f (sum == 0b ) BPM ; / / tæl l e r op hvis den sidste værdi er 11 og nuværende er lastencoded = encoder ; Denne funktion kaldes for hvert interrupt, så det er sikkert at encoderens bevægelser registreres. Encoderen kan nu styre tempoet, hvilket er mappet til variablen x, der skal ind i delay-funktionen for at opnå den tilhørende tid mellem hver step. Da x er mappet til tempoet vha. et array må tempoet ikke overstige antallet af pladser i array et. Derfor begrænses tempoet til at ligge mellem 30 og 240 BPM. Dette sker ved at tilføje følge kode i funktionen, som registrerer encoderen. 269 i f (BPM > 240) BPM = 240; / / øvre BPM grænse på i f (BPM < 30) BPM = 30; / / nedre BPM grænse på return BPM; Opsumering Sequenceren designes på Microblazen igennem C-kode. Tiden, sequenceren forholder sig til, implementeres vha. interrupts fra Microblazens FIT1. En delayfunktion laves udfra disse interrupts, og bestemmer derved tiden mellem hvert step i sekvensen. Forholdet mellem periodetiden for steps og BPM udregnes. Dette bruges af en encoder, som programmeres til at ændre BPMvariablen, hvor den tilhørende periodetid bestemmes og på den måde styres tempoet. I næste kapitel ses der på, hvordan sampleren kan vise tempoet til brugeren. 56

65 segment display Aalborg Universitet segment display Det kan være svært for brugeren, at høre præcis hvilket tempo sekvensen spilles med. Der bliver derfor brugt 7-segmentsdisplays til at vise brugeren, den aktuelle BPM. Et 7-segmentsdisplay er et display, der er i stand til at vise tal og bogstaver. Der sidder fire 7-segmentsdisplays ved siden af hinanden på spartan-3 platformen. Hvert af disse 4 displays indeholder 8 forskellige LEDs, 7 lyser de forskellige streger op, mens den sidste er et punktum. Der er med andre ord 8 inputs til hvert 7-segmentsdisplay, som illustreret på figur Figur 6.23: Figuren viser de 8 inputs til de 8 segmenter i 7-segmentsdisplayet. Da der er 4 displays ved siden af hinanden skulle der umiddelbart være 32 inputs, men for at spare inputs bruges i stedet de samme 8 inputs til alle 4 displays. Dette gør at der kun skal 12 signaler til at styre fire 7- segmentsdisplays, dette kan ses på figur På figur 6.25 er et timing-diagram over, hvordan multiplexeren styrer hvilket af de fire 7-segments displays der er tændt Skiftefrekvens Der skal skiftes så hurtigt i mellem de fire 7-segmentdisplays, at brugerens øjne ikke kan se at der kun er et display tændt af gangen. Brugeren vil på den måde tro, at alle 4 displays lyser på samme tid med forskellige tal. Det må samtidig ikke gå så hurtigt, at LED erne ikke kan følge med til at slukke og tænde hurtigt nok. For at gøre dette, er der blevet implementeret en 18-bits counter. Det er med andre ord et binært tal der er 18 cifre langt, som ligger 1 til hver gang der kommer et clock-signal, fra FPGA ens indbyggede clock. Der er fire 7-segmentdisplays, hvilket betyder, at der skal være 4 forskellige tal, som kan dekodes. Derfor skal der bruges 2 bits fra counteren, for at lave 4 mulige kombinationer. Disse 2 bits kan tage kombiantionerne 00, 01, 10 eller 11, hvilket styrer 4 outputs. Disse to bits bliver de to MSB i 18-bit counteren, det er de 2 bits, der tager længst tid om at skifte når der tælles op. 57

66 segment display Aalborg Universitet Figur 6.24: Forklaring af hvordan 7segmentsdisplayet fungerer. Figur 6.25: Timing diagram over tids-multiplexer til de fire 7-segmentsdisplays. I formel 6.21 er det udregnet hvor hurtigt en af de 2 bits skifter. 50MHz Hz (6.21) Nedenfor er det vist, hvordan det er implementeret i VHDL. 1 process ( clk, reset ) 2 begin 3 i f reset= 1 then 4 q_reg <= ( others=> 0 ) ; 5 e l s i f ( clk event and clk = 1 ) then +1 hver clock (50 MHz) 6 q_reg <= q_next ; 7 end i f ; 8 end process ; 9 10 q_next <= q_reg + 1; ++ counter sel <= std_logic_vector ( q_reg (N 1 downto N 2)) ; tager værdien af de to MSB af counteren og ligger dem over i sel 58

67 segment display Aalborg Universitet Sel er det signal der bruges til at skifte mellem de 4 displays. For at kunne kommunikere med disse displays fra microblazen, er der konstrueret et mellemled. Dette mellemled tager 16 bits fra Microblazen og sender med ud til de 4 forskellige displays. Nedenfor er det vist i et kodeeksempel. 1 architecture arch of hex_mux_test i s 2 signal bpm_segment: std_logic_vector (15 downto 0) ; signal t i l at holde input 3 4 begin 5 disp_unit : entity work. disp_hex_mux 6 port map( 7 clk=>clk, reset=> 0, 8 hex3=>bpm_segment(15 downto 12), s p l i t t e r input fra microblaze 9 hex2=>bpm_segment(11 downto 8), op i 4, og sender dem t i l 10 hex1=>bpm_segment(7 downto 4), hvert deres 7 segments display 11 hex0=>bpm_segment(3 downto 0), 12 dp_in=>"1111", an=>an, sseg=>sseg ) ; dp_in = punkttummer 13 bpm_segment <= BPM; sender input over i et signal så det er klar t i l at blive sendt videre Hele koden kan desuden ses i bilag D Opsumering Sekvensens tempo vises i BPM på spartan-3 platformens indbyggede 7- segmentsdisplays. Et 7-segmentsdisplay er et display, der er i stand til at vise tal og bogstaver. Hex-værdien, for de enkelte cifre i tempoets værdi, decodes til en 4 bit lang række, som bestemmer de enkelte LEDs på ét display. Når flere displays anvendes, skiftes der mellem dem så hurtigt, at de, for menneskets øjne, ser ud til at være tændt samtidigt. Der tælles op i en 18-bits counter og skiftene baseres på de to MSBs. Disse skift sker med en frekvens på ca. 763 Hz, idet der tælles op i counteren med en frekvens på 50 MHz. Det næste afsnit vil indeholde accepttest af produktet. 59

68 Accepttest 7 For at finde ud af om kravene fra kravsspecifikationen bliver overholdt, vil der i dette kapitel blive foretaget tests. Disse tests vil blive foretaget modulvis, i henhold til de moduler kravene er opstillet i. Først er en liste, der viser om de pågældende krav er overholdt, og derefter vil de generelle fremgangsmåder, for hvordan disse tests er foretaget, blive opstillet. En mere dybdegående forklaring på resultaterne vil følge. 7.1 Sampler Kravene, der er blevet opstillet til sampleren, kan ses i afsnit 5.2. Visse krav er ikke nødvendige at teste, da de grundlæggende i designet. Digital lyd: Da prototypen indeholder en analog til digital konverter, vides det på forhånd at sampleren arbejder med digital lyd. Derfor kan kravet hertil siges at være overholdt. Konvertering: Den analog til digitale konverter giver mulighed for, at konvertere analog lyd til digital. Derfor kan kravet hertil siges at være overholdt. Da disse krav er overholdt, allerede i måden hvorpå sampleren er designet, vil yderligere forsøg og tests af dette være overflødige. Dog er der andre krav, hvor det er nødvendigt at udføre tests. For at vise, at det er muligt at sample med en 16-bit opløsning ved minimum 44,1 khz, er der blevet udført en simpel test dertil Fremgangsmåde for test af lydkvalitet Denne test er fremstillet, for at kunne vise om sampleren overholder de krav, der er blevet stillet til lydkvaliteten. Testen er blevet foretaget af Andreas og Rasmus i laboratoriet fredag d. 23/ Der vil blive givet en gennemgang af, hvordan testen er foretaget, samt præsenteret testresultater Testopstillingen Testen er blevet foretaget med følgende udstyr: B&O RC-Oscillator TG7 AAU-nummer: Funktionsgeneratoren bliver brugt til at sende et 1 khz sinussignal til ADCindgangen. ADC en sender signalet videre til Microblazen, som gemmer samp- 60

69 7.1. Sampler Aalborg Universitet les i SRAM. Herefter sendes værdierne ud til en computer via RS232. Se figur 7.1 På computeren behandles de data, der er sendt, således, at de kan plottes i Matlab. Dataene behandles, da de angives i 2s kompliment. Disse værdier konverteres til decimaltal for at kunne afbilde dem på en graf, hvorpå sinussignalet gerne skulle gengives. Dette sker i Matlab med et script (vedlagt på CD). Figur 7.1: Billede af testopstillingen Resultat Figur 7.2: Plot af alle data der blev sendt via. RS232 i testen til sampleren. På figur 7.2 ses det samlede plot, for hele sekvensen. Mellem hvert sample sender programmet 0. På den måde fås et overblik over, hvornår et sample er 61

70 7.2. Trommemaskine Aalborg Universitet sendt. For at det er muligt at anskue de forskellige samples, er det nødvendigt at zoome ind. På figur 7.3 ses et sample. Det er muligt at ane en sinuskurve, Figur 7.3: På billedet er der zoomet ind på et sample, for at se om det ligner den sinus, der er sendt ind i sampleren. hvis grafen følges. Det lader dog til, at mange samples er gået tabt, og at data på grafen er inkomplet, da det burde være muligt at se en tydelig sinuskurve istedet for de transienter, der er på plottet Konklusion på test af sampler Ud fra figur 7.3 kan det konkluderes, at kvaliteten af lyden, ikke lever op til kravene. Dette kan muligvis skyldes et timingsproblem mellem enten ADC og Microblaze, Microblaze og SIPO eller SIPO og RAM. Fordi der muligvis er problemer timingen, er der andre krav, som ikke kan testes ordentligt. Det er f.eks. ikke muligt at undersøge kravene om realtidsindspilning og længde af samples. Derfor vil det blive vurderet, udfra beregninger, om det er muligt, at overholde disse krav, hvis testen var mulig at lave. Realtidsindspilning: Der blev i kapitel 6.3 udregnet, at der var ledige clock cycler mellem hvert sample, (6.8). Udfra dette, er kravet om realtidsindspilning mulig at overholde. Samplelængde: I 6.3 blev det også udregnet, hvor lang tid det er muligt at sample, før hukommelsen bliver fyldt, (6.5). På baggrund af dette kan det siges, at kravet er muligt at overholde. 7.2 Trommemaskine Trommemaskinens krav er tæt knyttet til brugerfladen. Derfor er testene af disse krav ikke alle afhængige af, at der kan lægges samplede lyde ind i sekvensen. Kravene vil blive gennemgået herunder, og det vil blive vurderet, hvorvidt de er overholdt. Variabelt tempo: Der er til trommemaskinen tilføjet en drejeknap, der kan justere på tempoet. Kravet er derfor overholdt. Visning af tempo: Tempoet bliver vist på tre 7-segmentsdisplays, der befinder sig på spartan-3 platformen. Kravet er derfor overholdt. Der er 62

71 7.2. Trommemaskine Aalborg Universitet Figur 7.4: FSO signalet målt ved hjælp af et oscilloskop, se især hvor støjfyldt signalet er. dog alligevel blevet konstrueret en test, for at se, om tempoet stemmer overens med den viste BPM på displayet. Denne test vil blive beskrevet senere i dette afsnit. Visning af sekvens: De 8 dioder på spartan-3 platformen bruges til at vise, hvilken plads i sekvensen der arbejdes på. Kravet er derfor overholdt. Vise indholdet af sekvensen: Der er lavet et print med 2 dioder og knapper, som del af prototypen. Dette er lavet for at kunne vise sekvensen. Kravet er derfor overholdt. Digitalt output: Dette krav er ikke overholdt. Det er blevet undersøgt, hvordan lyden kan sendes videre digitalt. Det er dog blevet vurderet for omfattende for projektperioden. Afspilningsmode: Et afspilingsmode er implementeret i softwaren, så det er muligt at se sekvensen blive afspillet visuelt. Kravet er derfor overholdt Test af tempo Denne test skal undersøge, hvorvidt det viste tempo på 7-segmentsdisplayet, stemmer overens med tempoet, som sekvensen afspilles med. Testen er blvet fortaget af Andreas og Tobias i laboratoriet d. 27/

72 7.2. Trommemaskine Aalborg Universitet Testopstilling Testen blev fortaget ved hjælp af et stopur på en mobiltelefon. Det vides fra tidligere i rapporten, at der kun skal være et slag for hvert andet step i sekvensen. Derfor skal pladsen, som der arbejdes på i sekvensen, flyttes 2 pladser for hvert slag. Der er blevet foretaget målinger med 3 forskellige tempoer, som viser hvor mange pladser sekvensen flytter på 10 sekunder. Tabellen nedenfor viser hvor mange pladser sekvensen skal flytte sig på 10 sekunder i forhold til, hvad tempoet viser i BPM. Testen foretages ved først Tempo (BPM) Pladser sekvensen skal flytte sig pr. 10 sekunder at lade sekvensen løbe, stopuret startes, når det første step i sekvensen rammes. Dette er blevet optaget på film, som kan ses på cd en, der er vedlagt rapporten Konklusion på test af tempo Ved at studere filmene kan det konkluderes, at tempoet, der bliver vist på 7-segmentsdisplayet, stemmer overens med sekvensens gang. Der er dog usikkerhedsfaktore ved den måde, som testen er foretaget på, bla. er der mulighed for fejl, når stopuret bliver startet af en person, da dette afhænger af personens præcision. For at få mere præcise resultater, kan der tages udgangspunkt i tiden på selve filmen, hvor der er mulighed for at stoppe tiden og notere start- og stoptid Opsumering kravene om at sampeleren skal arbejde med digital lyd og konvereteringen er overholdt, da det er en generel del af designet. Det lykkedes ikke at overholde kravet, om lydkvalitet tilsvarende en CD s. Alle krav til trommemaskienen er overholdt, på nær kraven om et digitalt output. Tempoet testes, for at se om det viste tempo stemmer overns med sekvensens. Nu hvor accepttesten er udført, er det muligt at opstille en konklusion. 64

73 Konklusion 8 Målet for dette projekt er at designe en sampler, som gør brugeren i stand til at optage lyde og sætte dem ind i en sekvens, som derefter kan afspilles. Det er lykkedes at designe og konstruere en prototype, som arbejder med digital lyd, konvertere analog til digital lyd og lægge denne ned i hukommelsen. Det er dog ikke lykkedes at opnå en lydkvalitet tilsvarende en CD s. Dette kan muligvis skyldes timingsproblemer. Det er derfor ikke muligt at teste de specifikke krav til lydindspilningen. Ud fra udregner kan det konkluderes, at det teoretisk er muligt både at have 2 samples af 2,5 sekunder og indspille i realtid. Det er lykkedes at lave en sekvens, som kan programmeres og afspilles, med lysdioder som indikatorer af sekvensens gang. Trykknapper giver brugeren mulighed for, at vælge mellem samplerens tilstande. Der kan vælges mellem indspilning, programmering og afspilning. Tempoet kan indstilles ved hjælp af en encoder og vises på tre 7-segementsdisplays. Det er dog ikke lykkedes, at kunne afspille samples, som er programmeret ned i sekvensen, da dette resulterer i, at sekvensen forsinkes. Ligeledes har sampleren ikke et digitalt output af sekvensen. 65

74 Perspektivering 9 Det følgende afsnit vil omhandle projektarbejdets forløb. Der vil blive set på, hvilke valg der er blevet truffet i projektet, hvad der kunne være gjort anderledes og hvad der kan gøres fremadrettet. Igennem dette projektforløb, er der blevet truffet valg sent i processen, der har haft store konsekvenser for det produkt, som er blevet konstrueret. I en lang periode af projektet blev der arbejdet på en spartan-6 platform. I den forbindelse opstod der problemer med at få UAR/T til at fungere. UAR/T en skulle bruges, som en mulighed for at debugge koden på Microblazen. UAR/T er en yderst effektiv måde at debugge kode på, derfor blev der lagt en del kræfter i at få UAR/T til at fungere på spartan-6 platformen. Efter lang tids undren over, at det var muligt med et oscilloskop, at se ASCIIværdierne, for den karakter som blev sendt, blev der fundet en løsning på problemet. Det viste sig at signalerne som blev sent ikke var kraftige nok. FGPA en kan maksimalt levere 3,3 V og et RS232 signal, ligger oftest på 15 V eller mere. Der blev lavet et print med en MAX232AEPE-kreds på, der omdanner de 3,3 V til signalstyrker RS232 kan arbejde med. Det var et problem at finde ordentlig dokumentation, til denne spartan-6 platform. Det gav problemer, da RAM-blokkene skulle tages i brug. Det var ikke muligt at finde timingsdiagrammer, eller anden dokumentation til at tilgå RAMblokkene. Sent i projektet, blev det en nødvendighed, at skifte til en spartan-3 platform med bedre dokumentation. Dette satte projektet lidt tilbage. Der kom også for sen fokus på at få Microblaze processoren til at arbejde sammen med VHDL koden, hvilket resulterede i ekstra pres på gruppen. Der blev dog fundet en løsning på problemet, dog kunne mere have været nået hvis dette var blevet overvejet fra starten. Hvis der var mere tid til projektet, vil følgende kunne forbedre produktet. SD-kort: Der er på nuværende tidspunkt ikke mulighed for, at gemme samples efter produktet er slukket. Derfor vil et SD-kort passe fint til dette formål. Der er udfordringer med at få det implementeret, blandt andet er det ikke undersøgt, om det er muligt at læse samples direkte ind til SD-kortet, da det måske ikke er hurtigt nok. Dette kan måske løses med en buffer, hvor samples bliver læst ind i RAM først og derefter over på SD-kortet. Signalbehandling: Det kunne været spændende at lave signalbehandling på lyden, og ændre på lydens karakterestik. Eksempler på dette kunne være at fjerne samples i et enkelt lydklip, ændre på længden af samples, eller volumen af samples. 66

75 Aalborg Universitet Digital lyd ud: Der er i den nuværende prototype, ikke mulighed for at arbejde videre med lyden i andre enheder. Dette kunne være spændende at gøre muligt. Der er flere forskellige lydprogrammer der bruges til at lave musik med, som giver mulighed for at indlæse digital lyd fra andre enheder. Dette kunne ske ved at have en usb udgang til den digitale lyd. 67

76 Litteratur Binary to BCD. URL convert-integer-from-pure-binary-to-bcd. Compact Disk. URL E-mu SP URL whatisanfpga. URL fpga-field-programmable-gate-array.htm. Programmerings filosofier. URL paradigms_themes-paradigm-overview-section.html. Udgivelsesdato TR roland-aira-the-tr-8-rhythm-machine.htmll. Audio Bit Depth. URL Debounce. URL Digital Lydbehandling. URL History of the Hammond B-3 Organ. URL How a Theremin Works. URL gadgets/audio-music/theremin4.htm. Brice, Richard Brice. Music Engineering - Kapitel 10, Bits n Peices - digital audio, side 168. ISBN: Newnes, Chu, Pong P. Chu. FPGA Prototyping By VHDL Examples. ISBN John Wiley and Sons, inc., ISSI, ISSI. Datablad for RAM (IS61LV25616AL), Motorola, Motorola. Datablad for DSP56ADC16S, Russ, Martin Russ. Sound synthesis and Sampling - side 66. ISBN: , Music technology. Elsevier, second edition, (tilgængelig på books.google.com). Tanenbaum, Andrew S. Tanenbaum. Structured Computer Organization - side ISBN Pearson Education, Inc., fifth edition, Xilinx, Xilinx. Datablad for Spartan-3 platform (Spartan-3),

77 Figurer 3.1 Billedet viser SP-1200 erens interface Øverst på billedet ses 2 forskellige spor, det røde spor symboliserer hvornår stortrommen skal aktiveres i sekvensen, mens det grønne spor symboliserer hihatten. Master out er det samlede output Roland model TR-909. Den gule og grønne cirkel viser henholdsvis volumen og tempokontrol. Den blå firkant indeholder knapper der kan ændre på de enkelte lyde i trommemaskinen. I den røde firkant er de knapper, som bestemmer hvornår i sekvensen at de enkelte lyde skal afspilles Roland model TR-8. På denne tegning er de samme funktioner indrammet som på billedet af model TR-909, det ses at selv 35 år senere går mange af de samme funktioner igen Illustration af brugerflade. Der kan læses mere om de forskelle funktioner i tabel Blokdiagram for prototypen er vist i den sorte firkant. Figuren viser signalvejen. Der fokuseres ikke på den røde del af figuren Et overblik over det samlede system På figuren ses en illustration af de 3 udvidelsesstik Blokdiagram over Microblaze processoren. I den blå firkant er ALU og skifteregistre, i den røde firkant er program-counteren, i den lyserøde firkant er instruktionsregistre og i den grønne er general purpose registre. Alle disse er beskrevet i dette kapitel Billed af hvordan det er muligt at sammensætte flere ALU er for at udvide bit-kapaciteten Dette blokdiagram viser, hvordan en 1-bit ALU er opbygget. Denne opbygning er ikke nødvendigvis, som den i Microblazen Overblik over de forskelligesignaler, der bruges fra Microblazen Diagrammet viser FIT_toggle og FIT_interrupt, hvor FIT_toggle har en 50 % duty cycle og FIT_interrupt blot kort sættes højt, når det tilhørende antal clock cycler er forløbet Blokdiagram over ind- og udgange af spartan-3 platformens SRAMblok Timing diagram af en read-cycle Timing diagram af en write-cycle Overordnet tegning over komponenter omkring RAM-controlleren samt signaler ASMD over RAM-controlleren, bemærk at alt inde i den røde firkant er 1 state

78 Figurer Aalborg Universitet 6.12Uddrag af timing diagram for A/D konverter Figuren viser prototypens brugerflade Flowchart af programsekvensen for hvordan samples bliver gemt i RAM Flowchart af hvordan samples bliver programmeret ind i en Sekvens Flowchart af hvordan samples vil blive afspillet Figuren viser et flowchart af den software, der skal styre navigationen til samplerens forskellige funktioner På figuren er sekvensens steps vist ved alle firkanterne. De røde firkanter viser slag. De grønne cirkler illustrerer de dioder brugeren kan se på brugerfladen Figuren viser et eldiagram over encoderens forbindelse til FPGA en. To pull-up modstande er sat ind for at holde signalet stabilt Figuren viser de 8 inputs til de 8 segmenter i 7-segmentsdisplayet Forklaring af hvordan 7segmentsdisplayet fungerer Timing diagram over tids-multiplexer til de fire 7-segmentsdisplays Billede af testopstillingen Plot af alle data der blev sendt via. RS232 i testen til sampleren På billedet er der zoomet ind på et sample, for at se om det ligner den sinus, der er sendt ind i sampleren FSO signalet målt ved hjælp af et oscilloskop, se især hvor støjfyldt signalet er A.1 Illustration af sample og samplingsperiode. De lilla punkter er samples og den den røde streg indikerer én samplingsperiode A.2 Illustration af samplingsfrekvens, hvor de lilla prikker indikerer samples. Grafen (A) viser sampling, hvor ƒ s > 2 ƒ m. Her ligger det fortolkede signal oven i det analoge signal, som ønskes samplet og repræsentere derfor den sande frekvens. Grafen (B) viser sampling, hvor ƒ s < 2 ƒ m. Her ligger det fortolkede signal ikke oven i det analog signal og er derfor ikke en sand repræsentation af signalet.. 74 A.3 Illustration af kvantisering. Her ses det på 2. aksen, at der er 16 mulige værdier amplituden kan antage for hver sample. Hver sample kan ses, som en kort lodret streg på 1. aksen B.1 Figuren viser den laboratorieopstilling der er lavet for at teste chippen. Der sættes en DC spænding på indgangen, og bitmønsteret på SDO porten aflæses på oscilloscopet B.2 Kredsløb fra databladet (Motorola [1992]) der konfigurerer chippen til et enkelt input

79 Figurer Aalborg Universitet B.3 Grafen fortæller, hvilken spænding hver enkel bit repræsenterer, hvor MSB er 16 og LSB er 1 på bits-aksen. Den 16. bit angiver, som nævnt, om der repræsenteres positive eller negative tal. Dette betyder, at når der aflæses en spænding til den 16. bit, kan det anses, som værdien af den 15. bit, samt summen af alle bits op til den B.4 Sign-magnitude-, et-kompliment- og to-kompliment-metode. Nederst ses hvilke operationer, der skal udføres ved hver metode, for at angive negative værdier B.5 to-kompliment-metdoen udført på det binære tal for

80 Tabeller 4.1 Tabellen indeholder en liste med beskrivelse af alle de funktioner der er vist på figur Read-cycle parametre Write-cycle parametre B.1 Tabellen for formel (B.6) viser den spænding, som en given bit repræsentere. Tabellen for (B.5) viser den spædning, som en given bit, samt summen af alle de mindre betydende bits, repræsenterer. Spændingen er beregnet i forhold til det maksimale spændingssving der må være på indgangen, på 3,5 V. Da chippen leverer det digitale output som 2 s komplement, vil den 16. bit være den, der bestemmer om spændingen er på den positive eller negative side af det nye nulpunkt, på 2,5 V B.2 Tabellen viser resultaterne af forsøget. Spændingen, tilhørende de forskellige bits, er målt og noteret på tabellen. Da chippen leverer det digitale output som 2 s komplement, bestemmer den 16. bit, om spændingen er på den positive eller negative side af nulpunktet, på 2,5 V

81 Digital konvertering A A.1 Analogt til digitalt signal Når et analogt signal skal konverteres til et digitalt, gennemgår det forskellige trin. Overordnet set gennemgår signalet to trin, sampling og kvantisering. Et analogt signal er kontinuerligt, dvs. at til en vilkårlig tid, findes der en tilhørende amplitude. Denne amplitude har en uendelig høj opløsning. Et digitalt signal har, modsat det analoge, både en opløsning på tid og amplitude. Når det analoge signal skal konverteres til digitalt, skal det først deles op tidsmæssigt, og derefter skal amplituden tilpasses en bestemt opløsning. At signalet deles op tidsmæssigt kaldes sampling og når amplituden skal tilpasses en bestemt opløsning kaldes det kvantisering. A.2 Sampling A.2.1 samplingperiode og frekvens Når et analogt signal skal samples, gøres det tidsdiskret. Signalets amplitude måles én gang pr. samplingsperiode, T s. Et sample er en måling af amplituden til en bestemt tid. Dette er illustreret på figur A.1. Samplingsfrekvens er antal Figur A.1: Illustration af sample og samplingsperiode. De lilla punkter er samples og den den røde streg indikerer én samplingsperiode. samples pr. sekund. Denne hænger derfor sammen med samplingsperioden, som kan ses i udtrykket A.1 ƒ s = 1 T s (A.1) Hvor ƒ s [Hz] er samplingsfrekvensen og T s [s] er samplingsperioden Denne samplefrekvens har betydning for, hvor højfrekvent et signal der er 73

82 A.3. Kvantisering Aalborg Universitet muligt at sample. Samplingsfrekvensen skal være mere end det dobbelte af frekvensen på det analoge signal, som ønskes samplet. Dette kan ses ved udtrykket (A.1). ƒ s > 2 ƒ m (A.2) Hvor ƒ m er den maximale frekvens for det analoge signal, som ønskes samplet. Hvis samplingsfrekvensen er det dobbelte eller lavere, vil der kunne opstå et fænomen kaldet aliasing. A.2.2 Aliasing Aliasing betyder, at høje frekvenser bliver fortolket som lave frekvenser, når et signal samples. Dette skyldes, at der ikke er et tilstrækkelig antal samples til at afslører den rigitge frekvens. Dette fænomen er illustreret på figur A.2. Den Figur A.2: Illustration af samplingsfrekvens, hvor de lilla prikker indikerer samples. Grafen (A) viser sampling, hvor ƒ s > 2 ƒ m. Her ligger det fortolkede signal oven i det analoge signal, som ønskes samplet og repræsentere derfor den sande frekvens. Grafen (B) viser sampling, hvor ƒ s < 2 ƒ m. Her ligger det fortolkede signal ikke oven i det analog signal og er derfor ikke en sand repræsentation af signalet. maksimale frekvens, menneskets øre kan registrere, er omkring 20kHz. Hvis et lydsignal skal samples, skal det altså have en samplingsfrekvens på over det dobbelte. På en CD er samplefrekvensen 44.1 khz, hvilke anvendes for det meste digitale lyd i dag. Et signal kan indehold frekvenser, som er højere end dem mennesker kan høre. Når der opstår aliasing ved disse høje frekvenser, vil de blive fortolket som lave frekvenser og fremstå som støj.for at forhindre disse frekvenser i at forstyrre lydbilledet, skal frekvenser over 20kHz fjernes fra det analoge signal, før det samples. Dette kaldes anti-aliasing og kan gøres ved hjælp af et lavpass-filter på det analoge signal, før det samples. A.3 Kvantisering Når det analoge signal er samplet, altså gjort tidsdiskret, er det amplituden der skal digitaliseres. Før kvantisering har amplituden en uendelig høj opløsning. Dette kan selvfølgelig ikke lade sig gøre at opnå digitalt, da det vil betyde, at lyden vil tage uendeligt meget plads i et digitalt system. Derfor 74

83 A.3. Kvantisering Aalborg Universitet skal der bestemmes en opløsning amplituden skal tilpasses. Denne opløsning angives i bits. Hvor opløsningen er givet ved (A.3). Q = 2 n Hvor Q er opløsningen og n er antal bits (A.3) Hvis et lydsignal kvantiseres med en 4 bit opløsning, vil amplituden altså kunne antage 2 4 = 16 forskellige værdier. Amplituden til hver sample bliver afrundet til den nærmeste værdi, som vist på figur A.3. Figur A.3: Illustration af kvantisering. Her ses det på 2. aksen, at der er 16 mulige værdier amplituden kan antage for hver sample. Hver sample kan ses, som en kort lodret streg på 1. aksen. Kilder: (Brice [1998]) (dig) 75

84 Test af analog til digtal konvertering med DSP56ADC16 B I dette appendix vil IC en DSP56ADC16 og dens funktioner blive beskrevet og testet. DSP56ADC16 er en analog til digtal konverter, der giver mulighed for at konvertere et analogt signal til et digitalt signal. Fra databladet (Motorola [1992]) er de vigtigste funktioner, denne chip har, samlet og listet nedenunder. B.1 Informationer fra datablad Chippen oversampler i indgangen, og det eliminerer aliasing. Der er mulighed for at benytte to forskellige slags filtre inde i chippen. De to filtre giver chippen forskellige egenskaber. Med FIR-filter, er følgende gældende: Output sample rate: 8 khz khz Dynamic range: 96 db Opløsning: 16 bit Med COMP-filter er følgende gældende: Output sample rate: 32 khz khz Dynamic range: 72 db Opløsning: 12 bit Af andre vigtige oplysninger kan nævnes: Maksimal intern clock rate: 12,8 MHz Forsyning: +5 V ±10% Serial data out, 2 s komplement. MSB transmitteres først, hvilket betyder fra venstre og mod højre på et oscilloskop. B.2 Testens formål Denne chip testes for at verificere at den fungere som ønsket. Testen forventes at give indsigt i: DSP56ADC16 og dens output ved forskellige DC-spændinger på inputtet. Om chippen kan levere den ønskede samplingsfrekvens. 76

85 B.3. Forsøgsopstilling Aalborg Universitet B.3 Forsøgsopstilling På figur B.1, kan opstillingen af forsøget ses. Endvidere er der fra databladet hentet et testdiagram (Motorola [1992]), som viser det kredsløb, der skal bygges omkring chippen, for at teste den. Dette ses på figur B.2. Figur B.1: Figuren viser den laboratorieopstilling der er lavet for at teste chippen. Der sættes en DC spænding på indgangen, og bitmønsteret på SDO porten aflæses på oscilloscopet. B.4 Konfiguration af DSP56ADC16 B.4.1 Valg af filter Det ses fra ovenstående (B.1) at DSP56ADC16 har forskellige funktioner, afhængig af hvordan den konfigureres. Da der, i dette projekt, ønskes en opløsning på 16-bit og en samplefrekvens på 44,1 khz, er det valgt at benytte FIR-filteret. Det ses fra databladet, at Filter Select (FSEL), på ben 6, skal sættes lav, for at FIR filteret aktiveres. B.4.2 Referencespænding Chippen har en REFIN og en REFOUT pin. Den spænding, der sættes på REFIN benet, bestemmer det maksimale spændingssving, der kan være på den analoge indgang. Der kan sættes en ekstern reference på, eller REFOUT kan benyttes. Værdien af REFOUT er defineret ved formel (B.1). V REFOUT = 2 AV CC 5 [V] (B.1) Da denne test er lavet med testkredsløbet fra databladet, vist på figur B.2, benyttes REFOUT som reference på REFIN. Da AV CC = 5 V er spændingen på 77

86 B.5. Testopstilling Aalborg Universitet REFOUT udregnet i formel (B.2). V REFOUT = = 2 V (B.2) Det maksimale spændingssving, der kan være på indgangen, er som nævnt, styret af spændingen på REFIN, og defineret ved formel (B.3). V n,m kss ng = 2 V REF N 0,5 [V pp ] (B.3) Det fremgår af databladet (Motorola [1992]), at den maksimalt tilladte spænding på REFIN er +2 V. Det maksimale spændningssving kan nu beregnes til 3,5 V. V n,m kss ng = 2 2 0,5 = 3, 5 [V pp ] (B.4) B.5 Testopstilling Kredsløbet der måles på er vist på figur B.2. Figur B.2: Kredsløb fra databladet (Motorola [1992]) der konfigurerer chippen til et enkelt input. Med dette kredsløb bliver chippens fulde potentiale, til et højt signal-støj forhold, ikke udnyttet, da der kun benyttes en indgang. Det er ca 3 til 4 db, af signalstøj-forholdet der mistes. B.6 Forventninger På figur B.2, ses det på kredsløbet, at chippen er opsat således, at der på V + n er en fast spænding på 2,5 V. Da chippen har et differentielt input er outputtet en funktion af de to indgange, hvilket betyder at med 2,5 V på den ene, bliver det en form for reference punkt, eller et nyt nulpunkt, som signalet 78

87 B.6. Forventninger Aalborg Universitet skal svinge omkring. Fremover i dette appendix vil 2,5 V være nulpunkt, og når spændinger beskrives som plus, vil de være over 2,5 V og hvis spændingen beskrives som minus, vil den være under 2,5 V. Chippen leverer et serielt output formateret efter 2 s komplement, hvilket vil sige at den 16. bit bestemmer, om tallet er minus eller plus. Se appendix B.8. For at finde ud af hvilket bitmønster chippen vil levere på outputtet, ved forskellige spændinger på inputtet, er der opstillet 2 forskellige formler, som kan danne et billede af, hvordan chippens output bliver. V n b t,s m = 2n 3,5 V (B.5) 216 V n b t = 2n 2 n ,5 V (B.6) Formel (B.5) viser, hvilken spænding der bliver repræsenteret, hvis den n de bit samt alle bits med lavere betydning er høje. Formel (B.6) viser den spænding der bliver repræsenteret, hvis den n de bit og kun den n de bit er høj. Formel (B.6) er plottet på figur (reference til figur). Figur B.3: Grafen fortæller, hvilken spænding hver enkel bit repræsenterer, hvor MSB er 16 og LSB er 1 på bits-aksen. Den 16. bit angiver, som nævnt, om der repræsenteres positive eller negative tal. Dette betyder, at når der aflæses en spænding til den 16. bit, kan det anses, som værdien af den 15. bit, samt summen af alle bits op til den 15. I tabel B.1 vises resultaterne af de to formler, ved de bits der på grafen på B.3, giver en tydelig forskel i spænding. 79

88 B.7. Målinger Aalborg Universitet Formel (B.6) Bit Bitmønster Spænding ,027 V ,055 V ,109 V ,219 V ,438 V ,875 V Formel (B.5) Bit Bitmønster Spænding ,055 V ,109 V ,219 V ,438 V ,875 V ,75 V Tabel B.1: Tabellen for formel (B.6) viser den spænding, som en given bit repræsentere. Tabellen for (B.5) viser den spædning, som en given bit, samt summen af alle de mindre betydende bits, repræsenterer. Spændingen er beregnet i forhold til det maksimale spændingssving der må være på indgangen, på 3,5 V. Da chippen leverer det digitale output som 2 s komplement, vil den 16. bit være den, der bestemmer om spændingen er på den positive eller negative side af det nye nulpunkt, på 2,5 V B.7 Målinger For at teste disse forventninger, er der lavet en forsøgsopstilling som på figur B.1. Der testes i første omgang med 0 V og forskellige DC spændinger på inputtet. Først sluttes V + n til V n således at differensen mellem de 2 indgange er meget tæt på 0 V. På oscilloskopet vil outputtet kunne ses som et bitmønster, som flakker mellem at ingen bits er tændt, og at alle bits er tændt B.8. Testens næste skridt er at sende DC-spænding til inputtet og aflæse spændingen for de enkelte bits. De lave bits repræsenterer meget små spændinger, hvilket kan ses på grafen i figur B.3. Disse har større tendens til at flakke, da de lettere bliver påvirket af støj. Derfor skrues der op for DC-værdien indtil, at en stabil bit viser sig. Dette har vist sig, at være den 9. bit. Spændingen noteres, og der skrues op indtil at den næste mere betydende bit tænder, og alle under den slukker. Spændingen noteres igen. Denne procedure gentages op til den 15. bit. Den samme procedure gentages for spændinger under nulpunktet på 2,5V, her er bitstrømmen dog inverteret og har altid den 16. bit tændt. Derfor skrues der ned indtil en bit er slukket stabilt og spændingen noteres. Derefter skrues der yderelere ned til den næste bit slukker stabilt osv. 80

89 B.7. Målinger Aalborg Universitet Test resultater Bit Bitmønster Spænding ,02 V ,03 V ,09 V ,17 V ,34 V ,67 V ,35 V Test resultater Bit Bitmønster Spænding ,02 V ,04 V ,08 V ,16 V ,33 V ,67 V ,32 V Tabel B.2: Tabellen viser resultaterne af forsøget. Spændingen, tilhørende de forskellige bits, er målt og noteret på tabellen. Da chippen leverer det digitale output som 2 s komplement, bestemmer den 16. bit, om spændingen er på den positive eller negative side af nulpunktet, på 2,5 V B.7.1 Konklusion Resultaterne viser, at spændingerne, målt under forsøge, afviger fra de forventede. Det kan ses på formel (B.5) og (B.6), at der er en faktor 2 mellem spændingen for hvert bit. Denne sammenhæng er stadig gældende for forsøgsresultaterne. Den 16. bit er ligeledes tilstede ved alle negative spændinger. Dette viser, at chippens output er 2s-kompliment, men dog med en afvigelse på spændingen. 81

90 B.8. To-kompliment Aalborg Universitet B.8 To-kompliment To-kompliment er en metode til at repræsentere både positive og negative heltal vha. det binære talsystem. For bedre at kunne forstå fordelene ved to-kompliment-metoden, præsenteres to andre metoder ligeledes. Disse to metoder kaldes hhv. sign-magnitude og et-kompliment. Hvis der tages udgangspunkt i en 3-bits talrække, eksisterer 2 3 = 8 forskellige kombinationer i den binære talrække. De tre metoder anvendes, for at kunne repræsentere både positive og negative værdier med de 8 kombinationer. Figur B.4: Sign-magnitude-, et-kompliment- og to-kompliment-metode. Nederst ses hvilke operationer, der skal udføres ved hver metode, for at angive negative værdier. På figur B.5 kan det ses, at metoderne udtrykker negative decimalværdier på forskellig vis vha. binære tal. B.8.1 Sign-magnitude og et-kompliment Sign-magnitude repræsenterer negative værdier, når den mest betydende bit (MSB) er 1. Et-kompliment repræsenterer negative værdier ved at invertere det binære tal. På tabellen øverst på figur B.5 kan det ses, at både sign-magnitude- og etkompliment-metoden har et udtryk for en negativ nulværdi. Denne værdi kan siges, at være overflødig, da -0 og 0 forstås, som værende ens. Der er altså to binære tal, som begge udtrykker det samme. Èn af disse kunne passende antage en anden værdi, for at maksimere antallet af værdier, som kan udtrykkes med en n-bit talrække. 82

91 B.8. To-kompliment Aalborg Universitet B To-kompliment To-kompliment-metoden har, modsat sign-magnitude og et-kompliment, kun et binært tal, der repræsentere 0. Dette gør, at to-kompliment kan repræsentere ét heltal mere end de andre metoder. For at opnå dette, repræsenteres de negative heltal ved at invertere det binære tal og derefter lægge 1 til. Når de to operationer udføres på det binære tal for 0, ændres det ikke. Figur B.5: to-kompliment-metdoen udført på det binære tal for 0. Med en n-bit talrække kan heltallene fra (2 n 1 ) til (2 n 1 ) 1 repræsenteres med to-komplement-metoden. 83

92 C-program C 1 #include <stdio. h> 2 #include " platform. h" 3 #include "xparameters. h" 4 #include "xiomodule. h" 5 6 XIOModule gpo; 7 XIOModule gpi ; 8 9 u32 data ; i nt n = 0; #define MAX_CHECKS int debouncedstate = 0; 15 int state [MAX_CHECKS] ; 16 int indeks = 0; v o l a t i l e u32 ct = 0; int samplemode = 0; 21 int smpcnt = 0; unsigned int nul = 0; 24 v o l a t i l e char encoder = 0; 25 char lastencoded = 0; 26 int periodetid = 0; 27 int encodervalue_array [242 ] ; 28 v o l a t i l e unsigned long BPM = 60; / / Beats per minute 29 char sum = 0; i nt i, k, j ; int udgang = 0x000; 34 int input ; 35 i nt lstinput ; char modebtn = 0; 38 char modesel = 0, lstmodesel = 0; 39 char mode = 0; 40 char modecounter1 = 0, modecounter2 = 0; char trgbtn = 0; 43 char trgsel = 0, lsttrgsel = 0; 44 int trigger = 0; 45 char trgcounter1 = 0, trgcounter2 = 0; int sekvens[3 ] ; 48 i nt sq = 0; 49 int step = 0; 50 int sqstep = 0; 51 int lststep = 0; 52 char prevstep = 0; 53 84

93 Aalborg Universitet 54 unsigned int data_til_ram = 0; 55 unsigned int addr_til_ram = 0; 56 unsigned int data_fra_ram = 0; 57 unsigned int sampling = 0; 58 int nyt_sample = 0; 59 int gammelt_sample = 0; 60 int lst_addr = 0; 61 int lst_addr2 = 0; 62 int addr1, addr2 ; int uiresult = 0; 65 unsigned long disp = 0; 66 char t ; int FSO = 0; 69 int SCO = 0; 70 int SDO = 0; int readinputfct ( ){ 73 input = XIOModule_DiscreteRead(&gpi, 4) ; 74 return ( input ) ; 75 } void debounceinput ( ){ 78 state [ indeks]=readinputfct ( ) ; / / det der læses på inputvektoren, gemmes på en plads i arrayet 79 indeks++; / / næste plads i arrayet gøres klar 80 j=0 x f f f f ; 81 for ( i=0 ; i<max_checks ; i++) j = j & state [ i ] ; / / AND operation udføres på j og det læste input, 10 gange 82 debouncedstate = j ; / / resultatet af and operationen gemmes i debouncedstate 83 i f ( indeks >= MAX_CHECKS) indeks = 0; / / index n u l s t i l l e s 84 } unsigned long topackedbcd ( unsigned int val ) 87 { 88 unsigned long bcdresult = 0; 89 for ( t = 0; val ; t++) 90 { 91 ( ( char )&bcdresult ) [ t / 2] = t & 1? ( val % 10) << 4 : ( val % 10) & 0xf ; 92 val /= 10; 93 } 94 return bcdresult ; 95 } void togglemode ( ){ 98 debounceinput ( ) ; 99 for ( i = 2 ; i < 4 ; i++){ / / her hardcodes de bits i inputvektoren der ønskes tjekket 100 i f ( debouncedstate & (1 << i ) ){ / / er en af de givne bits høje 101 modebtn = (1 << i ) ; / / sættes samme bit hø j i en variabel 102 } 103 else{ / / er en af de givne bits lave 104 modebtn &= ~(1 << i ) ; / / sættes den samme bit lav i variablen 105 } 106 } 107 i f (modebtn!= modesel) modesel = modebtn; 108 while (modesel!= lstmodesel ){ / / der tjekkes kun hvis der sker noget nyt på de to mode knapper 109 i f ( (mode == 2 1) && (modecounter1 == 2 modecounter2 == 2) ){ 110 mode = 0; / / hvis der tykkes på den samme knap igen 111 modecounter1 = 0; / / n u l s t i l l e s mode og modecountere 112 modecounter2 = 0; 113 } 114 else i f (modesel == 8){ / / trykkes der på den ene mode knap 115 mode = 2; / / sætttes mode t i l 2 85

94 Aalborg Universitet 116 modecounter1++; / / og der tæl l e s op 117 } 118 else i f (modesel == 4){ / / trykkes der på den ene mode knap 119 mode = 1; / / sætttes mode t i l modecounter2++; / / og der tæl l e s op 121 } 122 else{ 123 } 124 lstmodesel = modesel; / / det nuværende input gemmes, så der kan tjekkes om det æ ndrer sig 125 } 126 } void toggletrigger ( ){ / denne funktion har samme formå l som togglemode, men gælder for trigger knapper / 129 debounceinput ( ) ; 130 for ( i = 4 ; i < 6 ; i++){ 131 i f (debouncedstate & (1 << i ) ){ 132 trgbtn = (1 << i ) ; 133 } 134 else{ 135 trgbtn &= ~(1 << i ) ; 136 } 137 } 138 trgsel = trgbtn ; 139 while ( trgsel!= lsttrgsel ){ 140 i f ( ( trigger == 2 1) && ( trgcounter1 == 2 trgcounter2 == 2) ){ 141 trigger = 0; 142 trgcounter1 = 0; 143 trgcounter2 = 0; 144 } 145 else i f ( trgsel == 16){ 146 trigger = 1; 147 trgcounter2++; 148 } 149 else i f ( trgsel == 32){ 150 trigger = 2; 151 trgcounter1++; 152 } 153 else{ 154 } 155 lsttrgsel = trgsel ; 156 } 157 } void samplemix ( ){ 160 sq = sekvens[1 ] ; / / den første sekvens indlæses midlertidigt 161 i f (sq & (1 << step ) ){ / / denne midlertidige variabel tjekkes for hø j bit på det nuværende step i sekvensen 162 udgang &= ~(1 << 8) ; / / er dette t i l fælde tændes den tilsvarende diode 163 data_til_ram = 0xFFFFFFFE ; 164 XIOModule_DiscreteWrite(&gpo, 1, data_til_ram ) ; / / der sendes kontrolsignaler t i l RAM controller for at læse fra RAM 165 addr_til_ram = 0; 166 while ( addr_til_ram < lst_addr ){ / / der læses fra RAM på alle de adresser der samplet ind på 167 XIOModule_DiscreteWrite(&gpo, 2, addr_til_ram ) ; / / adressen der ønskes læst sendes t i l RAM controller 168 data_fra_ram = XIOModule_DiscreteRead(&gpi, 1) ; / / der læses data fra RAM contoller 169 x i l _ p r i n t f ( "%d, \ n", data_fra_ram ) ; / / de læste data printes t i l UAR/ T 170 data_fra_ram = 0; / / data variablen sættes t i l 0 for at minimere f e j l 171 addr_til_ram = addr_til_ram + 1; / / der ligges en t i l adressen 172 } 173 } 174 else{ 86

95 Aalborg Universitet 175 udgang = (1 << 8) ; / / e l l e r s slukkes den 176 } 177 sq = sekvens[2 ] ; / / samme procedure for sekvens i f (sq & (1 << step ) ){ 179 udgang &= ~(1 << 9) ; 180 } 181 else{ 182 udgang = (1 << 9) ; 183 } 184 } void samplemixled ( ){ / denne funktion bruges t i l at tænde LED er når sekvens programmeres / 187 sq = sekvens[1 ] ; / / den første sekvens indlæses midlertidigt 188 i f (sq & (1 << step ) ){ / / denne midlertidige variabel tjekkes for hø j bit på det nuværende step i sekvensen 189 udgang &= ~(1 << 8) ; / / er dette t i l fælde tændes den tilsvarende diode 190 } 191 else{ 192 udgang = (1 << 8) ; / / e l l e r s slukkes den 193 } 194 sq = sekvens[2 ] ; / / samme procedure for sekvens i f (sq & (1 << step ) ){ 196 udgang &= ~(1 << 9) ; 197 } 198 else{ 199 udgang = (1 << 9) ; 200 } 201 } void stepcontrol ( ){ / denne funktion bruges t i l at navigere i sekvensen under programmering / 204 debounceinput ( ) ; / / læs inputs 205 for ( i = 6 ; i < 8 ; i++){ / / fra vippeknap 206 i f (debouncedstate & (1 << i ) ){ 207 sqstep = (1 << i ) ; 208 } 209 else{ 210 sqstep &= ~(1 << i ) ; 211 } 212 } 213 while ( sqstep!= lststep ){ / / hvis der er sker en ændring af knappens position 214 i f (sqstep == 128){ / / t i l den ene side 215 step ; / / tæl l e s step ned 216 udgang &= ~(1 << ( step+1) ) ; / / dioden for den foregående position slukkes 217 i f ( step <= 1) step = 7; / / hvis step overskrider 7 ( det 8. step ) 218 udgang = (1 << step ) ; / / dioden for den nuværende position tændes 219 } 220 else i f ( sqstep == 64){ / / det samme sker hvis knappen vippes den anden vej 221 step++; / / dog tæl l e s step op 222 udgang &= ~(1 << ( step 1) ) ; 223 i f ( step >= 8) step = 0; 224 udgang = (1 << step ) ; 225 } 226 else i f (sqstep > 64){ 227 } 228 else{ 229 udgang = (1 << step ) ; 230 } 231 lststep = sqstep ; 232 } 233 samplemixled ( ) ; / / denn funktion kaldes for at tænde trigger dioder hvis sample programmeres ind 234 } void programsq( ){ 87

96 Aalborg Universitet 237 i f ( step!= prevstep ) trigger = 0; / / n u l s t i l l e r placering af sample hvis der skiftes plads i sekvensen 238 toggletrigger ( ) ; / / a f læser triggers for at placere sample 239 i f ( trigger == 1){ / / hvis trigger 1 trykkes på 240 sekvens[ trigger ] = (1 << step ) ; / / sættes den bit der svarer t i l den nuværende placering i sekvensen 241 i f ( trgcounter1 == 2){ / / trykkes der på den samme trigger igen, 242 sekvens[ trigger ] &= ~(1 << step ) ; / / fjernes den tilsvarende bit 243 } 244 } 245 else i f ( trigger == 2){ / / det samme sker for trigger sekvens[ trigger ] = (1 << step ) ; 247 i f ( trgcounter2 == 2){ 248 sekvens[ trigger ] &= ~(1 << step ) ; 249 } 250 } 251 else{ 252 } 253 prevstep = step ; 254 } int readencoder ( ){ / denne funktion læser encoderens bevægelser og korrigerer BPM efterfølgende / 257 for ( i = 0 ; i < 2 ; i++){ 258 i f (debouncedstate & (1 << i ) ){ 259 encoder = (1 << i ) ; 260 } 261 else{ 262 encoder &= ~(1 << i ) ; 263 } 264 } 265 sum = ( lastencoded << 2) encoder ; / / f l y t t e r den nuværende værdi 2 pladser t i l venstre 266 i f (sum == 0b ) BPM ++; / / tæl l e r op hvis den sidste værdi er 11 og nuværende er i f (sum == 0b ) BPM ; / / tæl l e r op hvis den sidste værdi er 11 og nuværende er lastencoded = encoder ; i f (BPM > 240) BPM = 240; / / øvre BPM grænse på i f (BPM < 30) BPM = 30; / / nedre BPM grænse på return BPM; 273 } void timertick ( void ref ) { / dette er interrupt rutinen der køres ved FIT1 s interrupt / 276 ct++; / / ct tæl l e s op ved hvert interrupt hvert halve millisekund 277 debounceinput ( ) ; / / inputtet læses 278 readencoder ( ) ; / / encoderen a f læses og tempo korrigeres, hvis der er ændringer 279 } void delay (u32 ms) { / denne funktion er en delay funktion / 282 ct = 0; / / tælleren n u l s t i l l e s 283 while ( ct < ms){ / / værdien der sendes ind i funktionen definerer delay tiden 284 x i l _ p r i n t f ( "%d, \ n", nul ) ; / / printes for at teste afspilning 285 } 286 } void samplingmode ( ){ / denne funktion holder styr på om samplings mode er valgt / 289 debounceinput ( ) ; 290 i f (debouncedstate & (1 << 8) ){ 291 sampling = (1 << 0) ; 292 } 293 else{ 294 sampling = 0; 295 } 88

97 Aalborg Universitet 296 } i nt main( ) { 299 x i l _ p r i n t f ( " entering main\n\ r " ) ; / / DEBUG 300 for ( k=0; k<241; k++){ / / k repraesenterer BPM 301 periodetid= (60000 / ( k) ) 2; 302 encodervalue_array [ k] = periodetid ; 303 } data = XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID) ; / / i n i t i a l i s e r e r GPO modulet 306 data = XIOModule_Initialize(&gpi, XPAR_IOMODULE_0_DEVICE_ID) ; / / i n i t i a l i s e r e r GPI modulet microblaze_register_handler ( XIOModule_DeviceInterruptHandler, 309 XPAR_IOMODULE_0_DEVICE_ID) ; / / registrer interrupt handleren data = XIOModule_Start(&gpo) ; / / start the GPO module 312 data = XIOModule_Start(&gpi ) ; / / start the GPI module XIOModule_Connect(&gpo, XIN_IOMODULE_FIT_1_INTERRUPT_INTR, timertick, 315 NULL) ; / / registrer timertick ( ) som interrupt rutinen XIOModule_Enable(&gpo, XIN_IOMODULE_FIT_1_INTERRUPT_INTR) ; / / t i l l a d e r interrupts 318 microblaze_enable_interrupts ( ) ; / / t i l l a d e r globale interrupts x i l _ p r i n t f ( " entering while \n\ r " ) ; / / DEBUG while (1){ 324 samplingmode ( ) ; / / der polles på sample switchen 325 switch ( sampling ){ 326 case 1 : 327 toggletrigger ( ) ; / / det a f læses hvilken trigger det ønskes at gemme sample på 328 while ( trigger == 1){ 329 toggletrigger ( ) ; / / der polles på trigger igen for at kunne forlade l økke 330 addr_til_ram = lst_addr ; / / den sidst kendte adresse gemmes i addr_til_ram 331 nyt_sample = XIOModule_DiscreteRead(&gpi, 3) ; / / max_tick fra SIPO a f læses 332 i f ( ( nyt_sample!= gammelt_sample) && ( nyt_sample!= 0) ){ / / betingelser for at nyt sample skal hentes 333 addr_til_ram++; 334 XIOModule_DiscreteWrite(&gpo, 2, addr_til_ram ) ; / / adresse sendes t i l RAM controller 335 data_til_ram = XIOModule_DiscreteRead(&gpi, 2) ; / / data læses fra RAM 336 data_til_ram = data_til_ram << 2; / / data variablen bit manipuleres for at 337 data_til_ram &= ~(1 << 0) ; / / holde styr på de 2 kontrol signaler i denne vektor 338 data_til_ram &= ~(1 << 1) ; / / bit 0 og bit 1 sættes lav 339 XIOModule_DiscreteWrite(&gpo, 1, data_til_ram ) ; / / kontrol signaler sendes t i l RAM controller 340 gammelt_sample = nyt_sample ; / / kontrol af betingelser for i f statement 341 } 342 i f ( nyt_sample == 0) gammelt_sample = 0; 343 lst_addr = addr_til_ram ; 344 } 345 XIOModule_DiscreteWrite(&gpo, 4, udgang) ; 346 break ; 347 case 0 : 348 togglemode ( ) ; 349 switch (mode) / / switch case der styrer hvilket mode sampleren er i 350 { 351 case 1 : / / programmerings mode 352 stepcontrol ( ) ; 353 programsq( ) ; 354 togglemode ( ) ; 355 XIOModule_DiscreteWrite(&gpo, 4, udgang) ; 89

98 Aalborg Universitet 356 break ; 357 case 2 : / / afspilnings mode 358 samplemix ( ) ; / / funktionen kaldes for at a f s p i l l e samples 359 step++; 360 i f ( step >= 8){ / / rutine der sørger for at sekvensen kører i ring 361 step = 0; 362 udgang &= ~(1 << 7) ; 363 } 364 udgang &= ~(1 << ( step 1) ) ; / / forrige diode slukkes 365 udgang = (1 << step ) ; / / nuværende diode tændes 366 uiresult = topackedbcd(bpm) ; / / BPM værdien konverteres t i l BCD 367 XIOModule_DiscreteWrite(&gpo, 3, uiresult ) ; / / og sendes t i l 7 segmentsdisplay 368 delay ( encodervalue_array [BPM] ) ; / / delay funktion kaldes 369 XIOModule_DiscreteWrite(&gpo, 4, udgang) ; / / outputvektor sendes t i l VHDL 370 break ; 371 case 0 : / / standby 372 udgang = 0x0F00; 373 XIOModule_DiscreteWrite(&gpo, 4, udgang) ; 374 } 375 break ; 376 } 377 } 378 } 90

99 VHDL Kode D D.1 mcs_top_level.vhd Der er i mcs_top_level uddrag af kode fra bogen [Chu, 2008] side library IEEE ; 2 use IEEE. STD_LOGIC_1164. ALL ; 3 use IEEE. std_logic_unsigned. a l l ; 4 5 entity mcs_top_level i s 6 Port ( clk : in STD_LOGIC; 7 reset : in STD_LOGIC; 8 FIT1_Interrupt : out STD_LOGIC; 9 FIT1_Toggle : out STD_LOGIC; 10 FIT2_Tog : out STD_LOGIC; output clock t i l ADC chip 11 BPM : inout STD_LOGIC_VECTOR (15 downto 0) ; outputvektor t i l 7 segmentsdisplay 12 udgange : out STD_LOGIC_VECTOR (9 downto 0) ; outputvektor t i l dioder 13 indgange : in STD_LOGIC_VECTOR (9 downto 0) ; inputvektor fra knapper og encoder 14 data_fra_adc : in STD_LOGIC_VECTOR (15 downto 0) ; 15 nyt_sample : in STD_LOGIC_VECTOR (0 DOWNTO 0) ; 16 INTC_IRQ : out STD_LOGIC; 17 rx : in STD_LOGIC; 18 tx : out STD_LOGIC; 19 GPI1_Interrupt : OUT STD_LOGIC; 20 GPI2_Interrupt : OUT STD_LOGIC; 21 GPI3_Interrupt : OUT STD_LOGIC; 22 GPI4_Interrupt : OUT STD_LOGIC; 23 PORTE TIL 7 SEGMENTSDISPLAY 24 an : out STD_LOGIC_VECTOR (3 DOWNTO 0) ; 25 sseg : out STD_LOGIC_VECTOR (7 DOWNTO 0) ; 26 PORTE TIL RAM CONTROLLER 27 data_fra_microblaze : inout STD_LOGIC_VECTOR(17 DOWNTO 0) ; data fra microblaze 28 data_til_microblaze : inout STD_LOGIC_VECTOR(15 DOWNTO 0) ; data der skal sendes tilbage t i l microblaze 29 ad : OUT STD_LOGIC_VECTOR(17 DOWNTO 0) ; adresse bits 30 adresse_fra_microblaze : inout STD_LOGIC_VECTOR(17 downto 0) ; adressen fra c_programmet 31 we_n, oe_n : out STD_LOGIC; 32 ce_b_n, ce_a_n, lb_a_n, ub_a_n : out STD_LOGIC; forskellige signaler t i l kontrol af ramblokken 33 dio_a : inout STD_LOGIC_VECTOR(15 downto 0) ; 34 data_skriv, memory : inout STD_LOGIC_VECTOR(0 downto 0) ben fra microblaze der f o r tæl l e r os om der skal læses / skrives 35 ) ; 36 end mcs_top_level ; architecture Behavioral of mcs_top_level i s signal bpm_segment : STD_LOGIC_VECTOR (15 DOWNTO 0) ; 41 signal addr : std_logic_vector (17 downto 0) ; 42 signal data_f2s, data_s2f : std_logic_vector (15 downto 0) ; 43 signal mem, rw : std_logic ; signaler t i l " tændt / slukket " og skriv / læs 44 signal signal_addr : std_logic_vector (17 downto 0) ; 91

100 D.1. mcs_top_level.vhd Aalborg Universitet COMPONENT microblaze_mcs 47 PORT ( 48 Clk : IN STD_LOGIC; 49 Reset : IN STD_LOGIC; 50 UART_Rx : IN STD_LOGIC; 51 UART_Tx : OUT STD_LOGIC; 52 FIT1_Toggle : OUT STD_LOGIC; 53 FIT1_Interrupt : OUT STD_LOGIC; bruges t i l at lave en timer i c 54 FIT2_Toggle : OUT STD_LOGIC; 55 GPO1 : OUT STD_LOGIC_VECTOR(17 DOWNTO 0) ; bruges t i l at sende data fra microblaze (ADC) 56 GPO2 : OUT STD_LOGIC_VECTOR(17 DOWNTO 0) ; bruges t i l at sende adresse fra microblaze 57 GPO3 : OUT STD_LOGIC_VECTOR(15 DOWNTO 0) ; bruges t i l at sende BPM t i l 7 segment 58 GPO4 : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) ; bruges t i l at sende signaler t i l dioder, fra microblaze 59 GPI1 : IN STD_LOGIC_VECTOR(15 DOWNTO 0) ; data fra RAM t i l microblaze 60 GPI1_Interrupt : OUT STD_LOGIC; 61 GPI2 : IN STD_LOGIC_VECTOR(15 DOWNTO 0) ; bruges t i l parallel data fra 2. fpga 62 GPI2_Interrupt : OUT STD_LOGIC; 63 GPI3 : IN STD_LOGIC_VECTOR(0 DOWNTO 0) ; bruges t i l signal om nyt sample fra 2. fpga 64 GPI3_Interrupt : OUT STD_LOGIC; 65 GPI4 : IN STD_LOGIC_VECTOR(9 DOWNTO 0) ; bruges t i l inputs fra omverdenen 66 GPI4_Interrupt : OUT STD_LOGIC; 67 INTC_IRQ : OUT STD_LOGIC 68 ) ; 69 END COMPONENT; begin 72 mcs_0 : microblaze_mcs 73 PORT MAP ( det ses i følgende kode hvordan VHDL og Microblaze er forbundet 74 Clk => clk, 75 Reset => reset, 76 UART_Rx => rx, 77 UART_Tx => tx, 78 FIT1_Interrupt => FIT1_Interrupt, 79 FIT1_Toggle => FIT1_Toggle, 80 FIT2_Toggle => FIT2_Tog, 81 GPO1 => data_fra_microblaze, 82 GPO2 => adresse_fra_microblaze, 83 GPO3 => BPM, 84 GPO4 => udgange, 85 GPI1 => data_til_microblaze, 86 GPI1_Interrupt => GPI1_Interrupt, 87 GPI2 => data_fra_adc, 88 GPI2_Interrupt => GPI2_Interrupt, 89 GPI3 => nyt_sample, 90 GPI3_Interrupt => GPI3_Interrupt, 91 GPI4 => indgange, 92 INTC_IRQ => INTC_IRQ, 93 GPI4_Interrupt => GPI4_Interrupt 94 ) ; disp_unit : entity work. disp_hex_mux 97 port map( 98 clk=>clk, reset=> 0, 99 følgende s p l i t t e r input op i 4, og sender dem t i l hvert deres 7segments display 100 hex3=>"1111", bpm_segment(15 downto 12), segmentet længst t i l højre 101 hex2=>bpm_segment(11 downto 8), 102 hex1=>bpm_segment(7 downto 4), 103 hex0=>bpm_segment(3 downto 0), segmentet længst t i l venstre 104 dp_in=>"1111", an=>an, sseg=>sseg ) ; 105 bpm_segment <= BPM; sender input over i et signal så det er klar t i l at blive sendt videre 92

101 D.2. disp_hex_mux.vhd Aalborg Universitet c t r l _ u n i t : entity work. sram_ctrl 108 port map( 109 clk=>clk, reset=>reset, 110 mem=>mem, rw=>rw, addr=>addr, data_f2s=>data_f2s, 111 ready=>open, data_s2f_r=>data_s2f, 112 data_s2f_ur=>open, ad=>ad, 113 we_n=>we_n, oe_n=>oe_n, dio_a=>dio_a, 114 ce_a_n=>ce_a_n, ub_a_n=>ub_a_n, lb_a_n=>lb_a_n, ce_b_n=>ce_b_n ) ; opdateres ved hver clock 117 process ( Clk ) 118 begin 119 i f ( clk event and clk = 1 ) then 120 signal_addr <= adresse_fra_microblaze ; 121 data_f2s <= std_logic_vector ( data_fra_microblaze(17 downto 2) ) ; 122 data_skriv <= std_logic_vector ( data_fra_microblaze(1 downto 1) ) ; 123 memory <= std_logic_vector ( data_fra_microblaze(0 downto 0) ) ; 124 end i f ; 125 end process ; 126 addr <= signal_addr ; 127 process der bestemmer om skriver e l l e r læser fra ram, tager input fra microblaze 128 process ( data_skriv, memory) 129 begin 130 i f ( data_skriv = 0 and memory = 0) then skriv 131 mem <= 1 ; "Åbner" for ram 132 rw <= 0 ; siger t i l memory controlleren at vi v i l skrive 133 e l s i f ( data_skriv = 1 and memory = 0) then læs 134 mem <= 1 ; "Åbner" for ram 135 rw <= 1 ; siger t i l memory controlleren at vi v i l læse 136 else 137 mem <= 0 ; "Lukker" for tilgangen t i l RAM 138 rw <= 1 ; den kan stå på hvad den nu v i l 139 end i f ; 140 end process ; 141 output 142 data_til_microblaze <= data_s2f ; Data fra RAM bliver sendt tilbage ind i microblaze 143 end Behavioral ; D.2 disp_hex_mux.vhd Disp_hex_mux er et eksempel fra bogen [Chu, 2008] listing 4.15 side Listing library ieee ; 3 use ieee. std_logic_1164. a l l ; 4 use ieee. numeric_std. a l l ; 5 entity disp_hex_mux i s 6 port ( 7 clk, reset : in std_logic ; 8 hex3, hex2, hex1, hex0: in std_logic_vector (3 downto 0) ; 9 dp_in : in std_logic_vector (3 downto 0) ; 10 an: out std_logic_vector (3 downto 0) ; 11 sseg : out std_logic_vector (7 downto 0) 12 ) ; 13 end disp_hex_mux ; architecture arch of disp_hex_mux i s 16 hvert 7seg er tændt i (2^18/4) 25 ns (40 ms) 17 constant N: integer:=18; 18 signal q_reg, q_next : unsigned (N 1 downto 0) ; 93

102 D.2. disp_hex_mux.vhd Aalborg Universitet 19 signal sel : std_logic_vector (1 downto 0) ; 20 signal hex: std_logic_vector (3 downto 0) ; 21 signal dp: std_logic ; 22 begin 23 register 24 process ( clk, reset ) 25 begin 26 i f reset= 1 then 27 q_reg <= ( others=> 0 ) ; 28 e l s i f ( clk event and clk = 1 ) then 29 q_reg <= q_next ; 30 end i f ; 31 end process ; next state logic for the counter 34 q_next <= q_reg + 1; MSBs of counter to control 4 to 1 multiplexing 37 sel <= std_logic_vector ( q_reg (N 1 downto N 2)) ; 38 process ( sel, hex0, hex1, hex2, hex3, dp_in ) 39 begin 40 case sel i s 41 when "00" => 42 an <= "1110" ; 43 hex <= hex0; 44 dp <= dp_in (0) ; 45 when "01" => 46 an <= "1101" ; 47 hex <= hex1; 48 dp <= dp_in (1) ; 49 when "10" => 50 an <= "1011" ; 51 hex <= hex2; 52 dp <= dp_in (2) ; 53 when others => 54 an <= "0111" ; 55 hex <= hex3; 56 dp <= dp_in (3) ; 57 end case ; 58 end process ; 59 hex to 7 segment led decoding 60 with hex select 61 sseg(6 downto 0) <= dekoder de signaler der kommer ind fra microblaze t i l 7 segments t a l (bemærk at 7segment er aktiv lav ) 62 " " when "0000", 0 63 " " when "0001", 1 64 " " when "0010", 2 65 " " when "0011", 3 66 " " when "0100", 4 67 " " when "0101", 5 68 " " when "0110", 6 69 " " when "0111", 7 70 " " when "1000", 8 71 " " when "1001", 9 72 " " when "1111", sluk segment 73 " " when others ; a for debug 74 sseg(7) <= dp; decimal prik 75 end arch ; 94

103 D.3. sram_ctrl.vhd Aalborg Universitet D.3 sram_ctrl.vhd Sram_ctrl er et eksempel fra bogen [Chu, 2008] listing 10.1 side library IEEE ; 2 use IEEE. STD_LOGIC_1164. ALL ; 3 4 entity sram_ctrl i s 5 port ( 6 clk, reset : in std_logic ; 7 to / from main system 8 mem: in std_logic ; Signal fra Top_level om at RAM skal t i l g ås e l l e r ej 9 rw: in std_logic ; Read/ write signal fra Top_level 10 addr : in std_logic_vector (17 downto 0 ) ; Adressen t i l RAM fra Top_level 11 data_f2s : in std_logic_vector (15 downto 0) ; Data t i l RAM fra Top_lvel 12 ready : out std_logic ; Ready signal, der f o r tæl l e r hvornår controlleren er klar t i l en ny operation 13 data_s2f_r, data_s2f_ur : 14 out std_logic_vector (15 downto 0) ; Data fra RAM ud t i l microblaze 15 t i l / fra RAM blokken 16 ad: out std_logic_vector ( 17 downto 0) ; Adressen ud t i l RAM blokken 17 we_n, oe_n : out std_logic ; write_enable og output_enable ud t i l RAM blokken 18 t i l en specifik chip, 19 dio_a : inout std_logic_vector(15 downto 0) ; Data ind og ud fra 1 af de 2 RAM blokke 20 ce_b_n, ce_a_n, ub_a_n, lb_a_n : out std_logic chip_enable, upper og lower_byte_enable, ud t i l 1 af de 2 RAM blokke, bemærk at disse 3 signaler a l t i d er lave (0) 21 ) ; 22 end sram_ctrl ; architecture Behavioral of sram_ctrl i s 25 type state_type i s ( idle, rd1, rd2, wr1, wr2) ; De forskellige states memory controller kan gå i 26 signal state_reg, state_next : state_type ; signaler t i l at styre næste state 27 signal data_f2s_reg, data_f2s_next : 28 std_logic_vector (15 downto 0) ; signaler t i l data ud t i l ram 29 signal data_s2f_reg, data_s2f_next : 30 std_logic_vector (15 downto 0) ; signaler t i l data fra ram 31 signal addr_reg, addr_next : std_logic_vector (17 downto 0) ; adresse signaler 32 signal we_buf, oe_buf, tri_ bu f : std_logic ; signaler t i l t r i state buffer 33 signal we_reg, oe_reg, tri_ reg : std_logic ; signaler t i l t r i state buffer begin 36 process ( clk, reset ) hvis reset sættes hø j t bliver alle registre sat t i l 0, samt output enable bliver hø j ( ingen output ) 37 begin 38 i f ( reset = 1 ) then 39 state_reg <= idle ; 40 addr_reg <= ( others=> 0 ) ; 41 data_f2s_reg <= ( others=> 0 ) ; 42 data_s2f_reg <= ( others=> 0 ) ; 43 we_reg <= 1 ; 44 oe_reg <= 1 ; 45 tri_reg <= 1 ; 46 e l s i f ( clk event and clk = 1 ) then opdaterer adresse, data og signaler ved hver clock signal 47 state_reg <= state_next ; ved hver clock signal går memory controller i det næste state 48 addr_reg <= addr_next ; 49 data_f2s_reg <= data_f2s_next ; 50 data_s2f_reg <= data_s2f_next ; 51 we_reg <= we_buf ; 52 oe_reg <= oe_buf ; 53 tri_reg <= t r i _ b u f ; 54 end i f ; 95

104 D.3. sram_ctrl.vhd Aalborg Universitet 55 end process ; 56 hvad der sker hver gang vi går i et nyt " state " 57 process ( state_reg, mem, rw, dio_a, addr, data_f2s, data_f2s_reg, data_s2f_reg, addr_reg ) 58 begin 59 addr_next <= addr_reg ; 60 data_f2s_next <= data_f2s_reg ; 61 data_s2f_next <= data_s2f_reg ; 62 ready <= 0 ; ready say t i l 0, som i nu er en operation i gang 63 case state_reg i s 64 when idle => 65 i f mem= 0 then 66 state_next <= idle ; hvis mem er 0 bliver vi i " idle " state 67 else 68 addr_next <= addr ; e l l e r s opdateres adresesn 69 i f rw= 0 then write 70 state_next <= wr1; hopper ned i write1 state hvis read / write = 0 71 data_f2s_next <= data_f2s ; data sættes klar 72 else reading 73 state_next <= rd1 ; hvis ikke der skal skrives, så skal der læses 74 end i f ; 75 end i f ; 76 ready <= 1 ; 77 when wr1 => 78 state_next <= wr2; 79 when wr2 => 80 state_next <= idle ; hopper fra write2 tilbage t i l idle 81 when rd1 => 82 state_next <= rd2 ; 83 when rd2 => 84 data_s2f_next <= dio_a ; data kommer ud fra RAM og ind i data register 85 state_next <= idle ; hopper fra read2 tilbage i idle 86 end case ; 87 end process ; 88 look ahead t r i state ting for stabile signaler 89 process ( state_next ) hver gang state s k i f t e r kører denne del af koden 90 begin dette stykker sætter buffer signaler klar en clock cycle før de skal bruges, dette gør at der spares en clock cycle, der e l l e r s v i l l e være tabt i buffer 91 t r i _ b u f <= 1 ; 92 we_buf <= 1 ; 93 oe_buf <= 1 ; 94 case state_next i s 95 when idle => 96 when wr1 => 97 t r i _ b u f <= 0 ; 98 we_buf <= 0 ; write_enable sættes lavt en clock cycle før den skal bruges 99 when wr2 => 100 t r i _ b u f <= 0 ; 101 when rd1 => 102 oe_buf <= 0 ; output_enable sættes lavt en clock cycle for den skal bruges 103 when rd2 => 104 oe_buf <= 0 ; 105 end case ; 106 end process ; 107 t i l top_level 108 data_s2f_r <= data_s2f_reg ; data ud fra ram t i l top_level 109 data_s2f_ur <= dio_a ; data ud fra ram t i l top_level 110 t i l RAM 111 we_n <= we_reg ; write_enable 112 oe_n <= oe_reg ; output_enable 113 ad <= addr_reg ; adresse 114 in / out for RAM chip 115 ce_a_n <= 0 ; ChipA_enable a l t i d lav 116 ub_a_n <= 0 ; upper_byte_enable a l t i d lav 117 lb_a_n <= 0 ; lower_byte_enable a l t i d lav 118 ce_b_n <= 1 ; ChipB_enable a l t i d hø j 119 dio_a <= data_f2s_reg when tri_ reg = 0 else ( others=> Z ) ; data ind t i l ram kommer 96

105 D.4. SIPO.vhd Aalborg Universitet fra register når t r i state t i l l a d e r det, e l l e r s højimpedant 120 end Behavioral ; D.4 SIPO.vhd 1 library IEEE ; 2 use IEEE. STD_LOGIC_1164. ALL ; 3 use ieee. numeric_std. a l l ; 4 5 entity SIPO i s 6 generic ( 7 N: integer := 6; antallet af bits der skal bruges for at tæl l e t i l M(40) 8 M: integer := 40 Hvad tælleren maks tæl l e r t i l minus 1 (M 1) 9 ) ; Port ( clk, reset : in std_logic ; 12 fso, sco : in std_logic ; Inputs fra A/D chip 13 s e r i a l _ i n : in STD_LOGIC; Serielle data ind fra A/D chip 14 data_ud : inout std_logic_vector (15 downto 0) ) ; Paralelle data ud(kommer ind i microblaze ) 15 end SIPO ; architecture Behavioral of SIPO i s 18 signal r_reg : unsigned (N 1 downto 0) ; signal t i l counter 19 signal r_next : unsigned (N 1 downto 0) ; signal t i l counter 20 signal signal_sco, signal_fso, max_tick : std_logic ; signaler t i l edge detection samt " reset " t i l counter 21 signal detect_output_sco, detect_output_fso : std_logic ; signaler t i l edge detection 22 signal parallel_out : std_logic_vector (15 downto 0) ; vector t i l at holde paralelle data i n d t i l der er 16 bits klar begin 25 process ( clk ) edge detection finder nedadgående flanke på sco, og skriver det over i detect_output 26 begin 27 i f ( clk = 1 and clk event ) then 28 signal_sco<=sco ; signal_sco bliver opdateret ved hver clock cycle 29 end i f ; 30 end process ; 31 detect_output_sco<=(not sco ) and signal_sco ; logik der detekterer faldende flanke på sco process ( clk ) edge detection finder nedadgående flanke på FSO, og skriver det over i detect_output 34 begin 35 i f ( clk = 1 and clk event ) then 36 signal_fso<=fso ; signal_fso bliver opdateret ved hver clock cycle 37 end i f ; 38 end process ; 39 detect_output_fso<=(not fso ) and signal_fso ; logik der dedekterer faldende flanke på fso process ( detect_output_sco, detect_output_fso, parallel_out, s e r i a l _ i n ) SIPO buffer (16 bit ) 42 begin 43 i f ( detect_output_sco = 1 and detect_output_fso = 0 ) then hvis der er data klar, og der ikke er reset, så 44 parallel_out (15 downto 1) <= parallel_out (14 downto 0) ; s k i f t parallel output med 1 97

106 D.4. SIPO.vhd Aalborg Universitet 45 parallel_out (0) <= s e r i a l _ i n ; input nyt b it fra s e r i e l ind på plads 0 i parallel output 46 end i f ; 47 end process ; process ( clk, reset, detect_output_fso, detect_output_sco, r_next, r_reg ) 50 begin 51 i f ( detect_output_fso = 1 ) then hvis der kommer et signal fra fso, sæt tlkker t i l 0 52 r_reg <= ( others=> 0 ) ; 53 e l s i f ( detect_output_sco = 1 and detect_output_fso = 0 ) then tæl l e r en op hver gang der kommer detect_output 54 r_reg <= r_next ; 55 end i f ; 56 end process ; 57 next state logic 58 r_next <= ( others=> 0 ) when r_reg=(m 1) else såfremt der ikke er t a l t t i l M 1(40 1) så +1, e l l e r s reset ( sker aldrig ) 59 r_reg + 1; 60 output logic 61 max_tick <= 1 when r_reg=(16) else 0 ; send signal på max_tick når der er t a l t t i l process ( reset, max_tick, parallel_out ) sender data ud p a r a l l e l t når max_tick er hø j 64 begin 65 i f ( reset = 1 ) then 66 data_ud <= ( others=> 0 ) ; 67 e l s i f ( max_tick= 1 ) then 68 data_ud <= parallel_out ; data bliver sendt fra register og videre t i l microblaze npr max_tick er hø j 69 end i f ; 70 end process ; 71 end Behavioral ; 98

Lyskryds. Thomas Olsson Søren Guldbrand Pedersen. Og der blev lys!

Lyskryds. Thomas Olsson Søren Guldbrand Pedersen. Og der blev lys! Og der blev lys! OPGAVEFORMULERING:... 2 DESIGN AF SEKVENS:... 3 PROGRAMMERING AF PEEL KREDS... 6 UDREGNING AF RC-LED CLOCK-GENERAOR:... 9 LYSDIODER:... 12 KOMPONENLISE:... 13 DIAGRAM:... 14 KONKLUSION:...

Læs mere

Indholdsfortegnelse :

Indholdsfortegnelse : Rapporten er udarbejdet af Daniel & Kasper D. 23/1-2001 Indholdsfortegnelse : 1.0 STEPMOTEREN : 4 1.1 Stepmotorens formål : 4 1.2 Stepmotorens opbygning : 4 2.0 PEEL-KREDSEN 4 2.1 PEEL - Kredsen Generelt

Læs mere

Computerens Anatomi. Af Martin Arnetoft

Computerens Anatomi. Af Martin Arnetoft Computerens Anatomi Af Martin Arnetoft Moores lov Moores lov siger, at antallet af transistorer på et stykke hardware over 18 eller 24 måneder fordobles. Denne lov bruges til at beskrive udviklingen indenfor

Læs mere

Der er derfor, for at alle kan sende, kun tilladt, at sende intermitterende. Altså korte pakker. ( Dette skal dog verificeres!!)

Der er derfor, for at alle kan sende, kun tilladt, at sende intermitterende. Altså korte pakker. ( Dette skal dog verificeres!!) MHz KIT Rev: /- Det er ikke tilladt, at man bare udsender radiobølger på den frekvens, man ønsker. Forskellige frekvenser er udlagt til forskellige formål. Nogle til politiet, militæret, FM-radio-transmission,

Læs mere

Journal JTAG: Udarbejde af: Benjamin Grydehøj I samarbejde med PDA Projektgruppen. Elektronikteknologafdelingen på Erhvervsakademi Fyn.

Journal JTAG: Udarbejde af: Benjamin Grydehøj I samarbejde med PDA Projektgruppen. Elektronikteknologafdelingen på Erhvervsakademi Fyn. Journal JTAG: Udarbejde af: Benjamin Grydehøj I samarbejde med PDA Projektgruppen Elektronikteknologafdelingen på Erhvervsakademi Fyn. Journal JTAG Xilinx XC9536 29-9-3 Generel beskrivelse af JTAG: JTAG:

Læs mere

Opslagsbog om computer. Af Erik Veidorf og Mike T. Krogh.

Opslagsbog om computer. Af Erik Veidorf og Mike T. Krogh. Opslagsbog om computer Af Erik Veidorf og Mike T. Krogh. Indhold: Side 1-------------------------------------------------------------------------------------------------------------CD-Rom/disk drev/ Side

Læs mere

Start af nyt schematic projekt i Quartus II

Start af nyt schematic projekt i Quartus II Start af nyt schematic projekt i Quartus II Det følgende er ikke fremstillet som en brugsanvisning der gennemgår alle de muligheder der er omkring oprettelse af et Schematic projekt i Quartus II men kun

Læs mere

wwwdk Digital lydredigering på computeren grundlæggende begreber

wwwdk Digital lydredigering på computeren grundlæggende begreber wwwdk Digital lydredigering på computeren grundlæggende begreber Indhold Digital lydredigering på computeren grundlæggende begreber... 1 Indhold... 2 Lyd er trykforandringer i luftens molekyler... 3 Frekvens,

Læs mere

Elektronikken bag medicinsk måleudstyr

Elektronikken bag medicinsk måleudstyr Elektronikken bag medicinsk måleudstyr Måling af svage elektriske signaler Indholdsfortegnelse Indholdsfortegnelse... 1 Introduktion... 1 Grundlæggende kredsløbteknik... 2 Ohms lov... 2 Strøm- og spændingsdeling...

Læs mere

LYDOPTAGER ROLAND R-05

LYDOPTAGER ROLAND R-05 INTRODUKTION TIL LYDOPTAGER ROLAND R-05 Rolands R-05 er en lille lydoptager, der nemt kan ligge i tasken. Den har indbygget mikrofon men også mulighed for tilslutning af en ordentlig interviewmikrofon,

Læs mere

AVR MP3 29-05-08 05576 Ingeniørhøjskolen i Århus Michael Kaalund

AVR MP3 29-05-08 05576 Ingeniørhøjskolen i Århus Michael Kaalund AVR MP3 29-05-08 Indholdsfortegnelse 1 Introduktion...2 2 Udviklingsmiljø...2 3 Beskrivelse af systemet...3 3.1 VS1001k...3 3.2 MP3 file formatet...6 4 Konklusion...6 5 Litteratur liste...6 6 Illustrations

Læs mere

Vurdering af digitalt læringsmiddel:

Vurdering af digitalt læringsmiddel: Vurdering af digitalt læringsmiddel: Indholdsfortegnelse: 1) Beskrivelse af Photo Story 3.. 2 a. Trin 1.. 3 b. Trin 2.. 5 c. Trin 3.. 5 d. Trin 4.. 6 e. Trin 5.. 6 2) Konklusion. 7 Claus B. Jensen Side

Læs mere

Brug Photo Story 3 en let introduktion

Brug Photo Story 3 en let introduktion Brug Photo Story 3 en let introduktion Denne vejledning forudsætter at programmet Photo Story 3 er installeret på din computer. Se andetsteds for vejledning i at installere programmet, der kan findes gratis

Læs mere

Simulering af en Mux2

Simulering af en Mux2 Simulering af en Mux2 Indhold Start QuartusII op start et nyt projekt.... 2 Fitter opsætning... 6 Opstart af nyt Block diagram... 8 ModelSim... 14 Hvis man vil ændre data grafisk kan det også lade sig

Læs mere

Projekt - RoboNet Del Journal.

Projekt - RoboNet Del Journal. Projekt - RoboNet Del Journal. A/D Konvertering. Udarbejdet af: Klaus Jørgensen. Gruppe: Jacob Clausen, Klaus Jørgensen og Ole Rud It og Elektronikteknolog, a Erhvervsakademiet Fyn Udarbejdet i perioden:

Læs mere

Tips og Tricks 2. Indholdsfortegnelse. 1. De væsentligste features i Fantom-G s sequencer...2. 2. Brug af Sequenceren...3. 3. Audio Track demo...

Tips og Tricks 2. Indholdsfortegnelse. 1. De væsentligste features i Fantom-G s sequencer...2. 2. Brug af Sequenceren...3. 3. Audio Track demo... Tips og Tricks 2 Indholdsfortegnelse Side 1. De væsentligste features i Fantom-G s sequencer...2 2. Brug af Sequenceren...3 Optag Trommer, Bas og Keyboard Brug af Arpeggio og Chord Memory 3. Audio Track

Læs mere

Afsluttende - Projekt

Afsluttende - Projekt 2014 Afsluttende - Projekt Rapporten er udarbejdet af Ali, Andreas og Daniel Vejleder Karl G Bjarnason Indholdsfortegnelse Indledning... 2 Case... 3 Design... 4 Python kalender:... 4 Poster:... 4 Planlægning...

Læs mere

Til dig som vil have et indblik i computeren

Til dig som vil have et indblik i computeren Vi håber du nu har fået indblik i computerens hardware. Til dig som vil have et indblik i computeren Brochuren er skrevet af Anders Bøge Paulsen, Betina Kopp Pedersen, Frederik Hejgaard Andersen og Oscar

Læs mere

DATALOGI 1E. Skriftlig eksamen torsdag den 3. juni 2004

DATALOGI 1E. Skriftlig eksamen torsdag den 3. juni 2004 Københavns Universitet Naturvidenskabelig Embedseksamen DATALOGI 1E Skriftlig eksamen torsdag den 3. juni 2004 Opgaverne vægtes i forhold til tidsangivelsen herunder, og hver opgaves besvarelse bedømmes

Læs mere

Arduino Programmering

Arduino Programmering Microcontroller, Arduino I teknologi skal vi lære at lave programmer til uc for at have muligheden til eksamen at kunne lave intelligente el-produkter. I hvert fald skal vi have set mulighederne, og forstået

Læs mere

Niveauer af abstrakte maskiner

Niveauer af abstrakte maskiner Det digitale niveau Niveauer af abstrakte maskiner Mikroarkitektur: Mic-1 Digitale kredsløb Logiske tilstande: 0 (0-1 V), 1 (2-5 V) Mikroarkitektur: Mic-1 Kombinatoriske kredsløb Logiske tilstande: 0 (0-1

Læs mere

Automatisering Af Hverdagen

Automatisering Af Hverdagen Automatisering Af Hverdagen Programmering - Eksamensopgave 10-05-2011 Roskilde Tekniske Gymnasium (Kl. 3,3m) Mads Christiansen & Tobias Hjelholt Svendsen 2 Automatisering Af Hverdagen Indhold Introduktion:...

Læs mere

Vejledning til Audacity, version beta 1.3.7

Vejledning til Audacity, version beta 1.3.7 Vejledning til Audacity, version beta 1.3.7 Teknisk forberedelse: 1. Programmet Audacity kan frit downloades fra nettet. En simpel søgning på navnet vil angive en netside med den nyeste version. Programmet

Læs mere

Hjertets elektriske potentialer og målingen af disse

Hjertets elektriske potentialer og målingen af disse Hjertets elektriske potentialer og målingen af disse Indholdsfortegnelse Indholdsfortegnelse... 1 Introduktion... 1 Grundlæggende kredsløbteknik... 1 Ohms lov... 2 Strøm- og spændingsdeling... 4 Elektriske

Læs mere

Studerendes video- optagelser til prøver

Studerendes video- optagelser til prøver Studerendes video- optagelser til prøver Resume Video til brug ved prøver kan optages i flere forskellige formater og lagres på forskellige medier. Hvis video optages på dvd (f.eks. 80 mm skive, der sættes

Læs mere

fotografisk kommunikation

fotografisk kommunikation XDANMARKS MEDIE- OG JOURNALISTHØJSKOLE CAMPUS KØBENHAVN Forprøve 2016 fotografisk kommunikation 1/2 Professionsbacheloruddannelsen i Visuel Kommunikation Studieretning: Fotografisk Kommunikation Del 1:

Læs mere

Microcontroller, Arduino

Microcontroller, Arduino Microcontroller, Arduino Programmerbar elektronik. uc Vi skal lære at lave programmer til uc for at kunne lave el-produkter. Forstå princippet i programmering af en uc og se mulighederne. Programmeringen

Læs mere

Eksamens spørgsmål i Teknologi (Digital) 3. Semester (i)

Eksamens spørgsmål i Teknologi (Digital) 3. Semester (i) Eksamens spørgsmål i Teknologi (Digital) 3. Semester (i) 1. DS1821 1-WIRE KOMMUNIKATION (HERUNDER TIMING KRAV) ------------------------ 2 2. DS1821 SOFTWARE (OPBYGNING AF STYREPROGRAM I SYSTEM51 C) -----------

Læs mere

Kravspecifikation For. Gruppen

Kravspecifikation For. Gruppen Kravspecifikation For Gruppen Indholdsfortegnelse 1. INDLEDNING...3 1.1 FORMÅL...3 1.2 REFERENCER...3 1.3 LÆSEVEJLEDNING...3 2. GENEREL BESKRIVELSE...4 2.1 SYSTEM BESKRIVELSE...4 2.2 SYSTEMETS FUNKTION...4

Læs mere

Bredbånds-TV. Brugervejledning. ComX brugervejledning version 4.0

Bredbånds-TV. Brugervejledning. ComX brugervejledning version 4.0 Bredbånds-TV Brugervejledning ComX brugervejledning version 4.0 1 INDHOLD PAKKENS INDHOLD Pakkens indhold side 2 Fjernbetjening side 2 Tilslutning af Settop-boksen side 3 Introduktion til Bredbånds-TV

Læs mere

CANSAT & ARDUINO step by step

CANSAT & ARDUINO step by step CANSAT & ARDUINO step by step Jens Dalsgaard Nielsen SATLAB Aalborg Universitet Danmark [email protected] 1/51 Arduino CANSAT - MÅL At måle ved hjælp af sensor temperatur, tryk, acceleration, CO2, lys,...

Læs mere

Quick-guide til Konftel 250

Quick-guide til Konftel 250 Conference phones for every situation Quick-guide til Konftel 250 DANSK BESKRIVELSE Konftel 250 er en konferencetelefon, der kan tilsluttes analogt telefonstik. På www.konftel.com/250 finder du en håndbog

Læs mere

Speciale. Evaluering af Java til udvikling af indlejrede realtidssystemer ved brug af en eksisterende Java Optimized Processor (JOP)

Speciale. Evaluering af Java til udvikling af indlejrede realtidssystemer ved brug af en eksisterende Java Optimized Processor (JOP) Speciale Evaluering af Java til udvikling af indlejrede realtidssystemer ved brug af en eksisterende Java Optimized Processor (JOP) Speciale efterår 2005 Teknisk Informationsteknologi Jan Lauritzen & Mads

Læs mere

Betjeningsvejledning. BeoLab 2000 giver Deres centrale Bang & Olufsen system en ekstra dimension.

Betjeningsvejledning. BeoLab 2000 giver Deres centrale Bang & Olufsen system en ekstra dimension. B E O L A B 2 0 0 0 1 BeoLab 2000 giver Deres centrale Bang & Olufsen system en ekstra dimension. De kan nu spille den musik- eller videokilde De ønsker på Deres centrale system og lytte til det via Deres

Læs mere

Lærer nye styresystemer Installerer programmer som kun kan bruges i ældre versioner

Lærer nye styresystemer Installerer programmer som kun kan bruges i ældre versioner Virtuel PC Fordele/ulemper Fordele: Lærer nye styresystemer Installerer programmer som kun kan bruges i ældre versioner Ulemper: Reserverer RAM (Windows 7) Problemer med at ureglementeret lukke ned Mister

Læs mere

BeoSound Vejledning

BeoSound Vejledning BeoSound 9000 Vejledning BeoVision Avant Guide BeoVision Avant Reference book Vejledningens indhold 3 For at du kan lære dit Bang & Olufsen produkt at kende, har du to vejledninger til rådighed. Vejledningen

Læs mere

3.0 Velkommen til manualen for kanalen Shift 1. 3.1 Introduktion til kanalen 1. 3.2.1 Hvad er et spot? 2. 3.2.2 Opret et nyt spot 2

3.0 Velkommen til manualen for kanalen Shift 1. 3.1 Introduktion til kanalen 1. 3.2.1 Hvad er et spot? 2. 3.2.2 Opret et nyt spot 2 3.0 Velkommen til manualen for kanalen Shift 1 3.1 Introduktion til kanalen 1 3.2 Shift kanalside 1 3.2.1 Hvad er et spot? 2 3.2.2 Opret et nyt spot 2 3.2.3 Aktivt og inaktivt spot 3 3.2.4 Rediger et spot

Læs mere

Analoge indgange og A/D konvertering. Analoge udgange

Analoge indgange og A/D konvertering. Analoge udgange Programmering for begyndere Brug af Arduino Programmeringskursus Analoge indgange og A/D konvertering Analoge udgange Knud Krogsgaard Jensen OZ1QK Oversigt Oversigt over i aften: A/D konvertering iterations

Læs mere

Lydklip i PP elevøvelse (uden installation af Audacity) Side 1. Dette er en papirudgave af opgaven www.frborg-gymhf.dk/gj/genre

Lydklip i PP elevøvelse (uden installation af Audacity) Side 1. Dette er en papirudgave af opgaven www.frborg-gymhf.dk/gj/genre Lydklip i PP elevøvelse (uden installation af Audacity) Side 1 Lyd-klip i PP Genre-øvelser - uden at installere Audacity Dette er en papirudgave af opgaven www.frborg-gymhf.dk/gj/genre Dette er en øvelse

Læs mere

Computerens Anatomi Af Mathias og Mark

Computerens Anatomi Af Mathias og Mark Computerens Anatomi Af Mathias og Mark Planlægning af projekt Case Størstedelen af nutidens unge har deres egen smartphone, computer og fjernsyn. Computere i alle afskygninger bliver fortsat en større

Læs mere

Sådan laver du en film (VIDEO)

Sådan laver du en film (VIDEO) QUICK GUIDE Sådan laver du en film (VIDEO) En trinvis guide til nogle af de værktøjer, der er nødvendige for at lave en digital fortælling 1. Sådan skaber du en digital fortælling For at skabe en digital

Læs mere

DAB+ adaptor. Kære kunde,

DAB+ adaptor. Kære kunde, Kære kunde, Kvalitet har altid været drivkraften for os og grundlæggelsen af Argon Audio er en naturlig forlængelse af denne filosofi. Vi har 20 års erfaring i at lave og specificere høj kvalitetsprodukter

Læs mere

AM signalet er et automatisk mellemblok signal. Det består af 3 lamper og er opbygget som et U signal med 3 lamper.

AM signalet er et automatisk mellemblok signal. Det består af 3 lamper og er opbygget som et U signal med 3 lamper. Signaler Der skal signaler på modelbanen. En modelbane med signaler er som prikken over i et. Der er forskellige signaler. I signal, U signal og AM signaler. Desuden er der PU signaler. Alle disse signaler

Læs mere

Clarion DXZ638RMP, DXZ738RMP, DXZ838RMP - Sådan laver man WMA filer, samt evt. Play Lists. -

Clarion DXZ638RMP, DXZ738RMP, DXZ838RMP - Sådan laver man WMA filer, samt evt. Play Lists. - Clarion DXZ638RMP, DXZ738RMP, DXZ838RMP - Sådan laver man WMA filer, samt evt. Play Lists. - For at lave sine musik CD er om til WMA format kræver det en PC med Microsoft Media Player version 7.1 eller

Læs mere

Projekt - Valgfrit Tema

Projekt - Valgfrit Tema Projekt - Valgfrit Tema Søren Witek & Christoffer Thor Paulsen 2012 Projektet Valgfrit Tema var et projekt hvor vi nærmest fik frie tøjler til at arbejde med hvad vi ville. Så vi satte os for at arbejde

Læs mere

Enes Kücükavci Roskilde Tekniske Gymnasium 20 05 2010 Mathias Turac Informationsteknolog B Vejleder: Karl Bjranasson Programmering C

Enes Kücükavci Roskilde Tekniske Gymnasium 20 05 2010 Mathias Turac Informationsteknolog B Vejleder: Karl Bjranasson Programmering C Indhold Indledning(Enes)... 2 Problemstilling (Enes)... 2 Teori (Enes)... 2 Løsningsforslag (Enes)... 4 RFID relæet (Mathias)... 6 Krav (Enes og Mathias)... 8 Målgruppen (Mathias)... 8 Rekvirent... 8 Implementering(Mathias)...

Læs mere

Quickstart Guide. Dansk

Quickstart Guide. Dansk Quickstart Guide Dansk Support: For produktregistrering, besøg venligst ION hjemmeside: ionaudio.com For de seneste oplysninger om dette produkt, kan du besøge hjemmesiden ionaudio.com/blockpartylive.

Læs mere

Det er nødvendigt for brugeren at læse, forstå og følge vejledningens instruktioner.

Det er nødvendigt for brugeren at læse, forstå og følge vejledningens instruktioner. Tams Elektronik LD-G-3 / LD-W-3 (1) Lokomotivdekoder LD-G-3 / LD-W-3 i Märklin-Motorola format Denne oversættelse omfatter monterings- og anvendelsesvejledningerne til LD-G-3 / LD-W-3 dekoderen. Den originale

Læs mere

Hvad skal du vide for at bygge din egen computer?

Hvad skal du vide for at bygge din egen computer? Hvad skal du vide for at bygge din egen computer? Kender du alle de her dele og hvad de gør godt for? Er du mellem 11 og 16 år, og tænker på at sammensætte din egen computer? Så er denne her guide lige

Læs mere

DCC digital dekoder til magnetiske produkter

DCC digital dekoder til magnetiske produkter Viessmann 5212 Digital Dekoder Dansk Brugervejledning DCC digital dekoder til magnetiske produkter med fire udgangsgrupper Indhold 1. Vigtige oplysninger... 2 2. Indledning / Egenskaber... 3 3. Montering...

Læs mere

Brugervenlig og kommunikativ!

Brugervenlig og kommunikativ! Brugervenlig og kommunikativ! Altivar 312 Frekvensomformer til tre-faset asynkrone motorer, 0,18 til 2,2 kw en-faset 240V 0,18 til 15kW tre-faset 200-600V Specielle funktioner til alle typer af maskiner

Læs mere

ADVARSEL: Smid ikke dette produkt i husholdningsaffaldet. Aflever det til et indsamlingssted for genanvendelse af elektroniske apparater.

ADVARSEL: Smid ikke dette produkt i husholdningsaffaldet. Aflever det til et indsamlingssted for genanvendelse af elektroniske apparater. Garanti & Support Dette produkt har en ét-års garanti, der dækker over eventuelle problemer ved normalt brug. Misbrug af Easi-Speak eller at åbne enheden vil ugyldiggøre denne garanti. Alle data, der er

Læs mere

MYLOQ 1101 Kodecylinder

MYLOQ 1101 Kodecylinder MYLOQ 1101 Kodecylinder Brugsanvisning DK Vigtig information før anvending Kodecylinderen skal aktiveres før brug (se side 3). En administrationskode skal tilføjes. Vær sikker på at få skrevet den nye

Læs mere

Svane Electronic Universal timer med 2 relæer og 18 funktioner hver 1

Svane Electronic Universal timer med 2 relæer og 18 funktioner hver 1 Svane Electronic Universal timer med 2 relæer og 18 funktioner hver 1 Digital dobbelt timer print modul 12V 2000.2236 Multi funktions timer med 18 funktioner pr. relæ, anvendelig i mange installationer,

Læs mere

- en manual fra Skolekonsulenterne.dk. Versionsdato: August 2008

- en manual fra Skolekonsulenterne.dk. Versionsdato: August 2008 - en manual fra Skolekonsulenterne.dk Versionsdato: August 2008 Indholdsfortegnelse Generelt om manualer fra Skolekonsulenterne.dk...3 Audacity...4 Få fat i programmet...4 Brugerfladen...5 Optag fra mikrofon

Læs mere

EMSD 7 Gr. 15 Aalborg Universitet

EMSD 7 Gr. 15 Aalborg Universitet Elektro Mekanisk System Design EMSD 7 Gr. 15 Aalborg Universitet Institut for EnergiTeknik Pontoppidanstræde 101, 9220 Aalborg Øst Det Teknisk-Naturvidenskabelige Fakultet Aalborg Universitet M-sektoren

Læs mere

Dansk Mink Papir. Teknisk brugermanual

Dansk Mink Papir. Teknisk brugermanual Dansk Mink Papir Teknisk brugermanual Styring til FIX tørrekasse Beskrivelse Enheden styrer en AC blæser-motor via en relæudgang. Betjening foregår via et tastatur og et display, og brugeren kan vælge

Læs mere

Program Dokumentation PC Software Skrevet af. Gruppen. Version 1.0

Program Dokumentation PC Software Skrevet af. Gruppen. Version 1.0 Program Dokumentation PC Software Skrevet af Gruppen. Version 1.0 Indholds fortegnelse 1. INDLEDNING...3 1.1. FORMÅL...3 1.2. REFERENCER...3 1.3. VERSIONSHISTORIE...3 1.4. DEFINITIONER...3 1.5. DOKUMENTATIONENS

Læs mere

Velkommen til. EDR Frederikssund Afdelings Almen elektronik kursus. Steen Gruby OZ9ZI

Velkommen til. EDR Frederikssund Afdelings Almen elektronik kursus. Steen Gruby OZ9ZI Emne 19 & 20: Sender & Modtagerteknik Velkommen til EDR Frederikssund Afdelings Steen Gruby 1 I øvrigt Emne 19 & 20: Sender & Modtagerteknik Tidsrum :1900 2200 I pause ca. i midten Toilettet er i gangen

Læs mere

PhotoStory. Et fedt program til præsentation af digitale billeder. Version: August 2012

PhotoStory. Et fedt program til præsentation af digitale billeder. Version: August 2012 PhotoStory Et fedt program til præsentation af digitale billeder Version: August 2012 Indholdsfortegnelse Hvad er PhotoStory 3?...4 PhotoStory 3 i undervisningen / på skolen...4 Hvad skal jeg bruge?...4

Læs mere

GSM SMS Modem MODEL: SA RTU-1 V1.01

GSM SMS Modem MODEL: SA RTU-1 V1.01 GSM SMS Modem MODEL: SA RTU1 V1.01 Brugervejledning Indgange: Der er fire indgange på modulet. De kan programmeres som normale indgange. De kan programmeres som tæller. Udgange: Der er en udgang på modulet

Læs mere

IFC Egenskaber. Mohammad Hussain Parsianfar s102951 BYG DTU

IFC Egenskaber. Mohammad Hussain Parsianfar s102951 BYG DTU Mohammad Hussain Parsianfar s102951 Indholdsfortegnelse 1 Introduktion... 3 1.1 Hvorfor er det interessant... 3 1.2 Formål... 4 2 Simplebim... 5 2.1 Præsentation af softwaren... 5 2.1.1 Brugergrænseflade...

Læs mere

Niveauer af abstrakte maskiner

Niveauer af abstrakte maskiner Det digitale niveau Niveauer af abstrakte maskiner Digitale kredsløb Logiske tilstande: (- V), (2-5 V) Kombinatoriske kredsløb Logiske tilstande: (- V), (2-5 V) Registre Logiske tilstande: (- V), (2-5

Læs mere

Kom godt i gang med. AirTies TV boks. med harddisk

Kom godt i gang med. AirTies TV boks. med harddisk Kom godt i gang med AirTies TV boks med harddisk Tillykke med din nye TV boks med harddisk Det er nemt både at installere og indstille din nye TV boks. Følg guiden og oplev alle de spændende og nye funktioner.

Læs mere

Brugervejledning. OneRemote DVB-T Scart II Modtager. B&O betjening MPEG4 HD FTA. Type 30012663. 30012663u2

Brugervejledning. OneRemote DVB-T Scart II Modtager. B&O betjening MPEG4 HD FTA. Type 30012663. 30012663u2 Brugervejledning OneRemote DVB-T Scart II Modtager MPEG4 HD FTA Type 30012663 B&O betjening 30012663u2 Tastesekvenser til den daglige betjening Beo4, Beo5 eller Beo6 betjening Optage og afspille fra tilsluttet

Læs mere

DENVER DPF-407. Digital Billedramme Betjeningsvejledning

DENVER DPF-407. Digital Billedramme Betjeningsvejledning DENVER DPF-407 Digital Billedramme Betjeningsvejledning 1 INDHOLD : FEATURES:...3 KNAPPER OG KONTROLLER:...4 FJERNBETJENINGEN...5 GRUNDLÆGGENDE BETJENING:...6 1. MENUEN VALG AF FUNKTION...6 2. MENUEN VALG

Læs mere

DENVER DPF-722 Betjeningsvejledning. Digital Fotoramme ADVARSEL. Sørg for, at der altid er fri adgang til den stikkontakt, apparatet er tilsluttet.

DENVER DPF-722 Betjeningsvejledning. Digital Fotoramme ADVARSEL. Sørg for, at der altid er fri adgang til den stikkontakt, apparatet er tilsluttet. DENVER DPF-722 Betjeningsvejledning Digital Fotoramme ADVARSEL Sørg for, at der altid er fri adgang til den stikkontakt, apparatet er tilsluttet. 1 Introduktion Tillykke med købet af din nye Digitale Fotoramme.

Læs mere

Talrækker. Aktivitet Emne Klassetrin Side

Talrækker. Aktivitet Emne Klassetrin Side VisiRegn ideer 3 Talrækker Inge B. Larsen [email protected] INFA juli 2001 Indhold: Aktivitet Emne Klassetrin Side Vejledning til Talrækker 2-4 Elevaktiviteter til Talrækker 3.1 Talrækker (1) M-Æ 5-9 3.2 Hanoi-spillet

Læs mere

DM536. Rapport og debug

DM536. Rapport og debug DM536 Rapport og debug Kilder Vigtig.it (Felix Palludan Hargreaves) http://vigtig.it/dm502/howto_report.pdf http://vigtig.it/blog/teaching/#toc-relevant-tips Peter Schneider-Kamp http://imada.sdu.dk/~petersk/dm536/project2.pdf

Læs mere

RefWorks Workshop Medicinsk Bibliotek Aalborg Universitetshospital. Oprettelse af konto/log in... 2. RefWorks-databasen... 2

RefWorks Workshop Medicinsk Bibliotek Aalborg Universitetshospital. Oprettelse af konto/log in... 2. RefWorks-databasen... 2 RefWorks vejledning Indhold Oprettelse af konto/log in... 2 RefWorks-databasen... 2 Import af referencer... 2 Pubmed... 3 Embase/Psycinfo/Medline (Ovid)... 4 Cinahl... 5 RefGrab-it... 6 Organisering af

Læs mere

Micro Hi-Fi System. Brugervejledning ENV-1152

Micro Hi-Fi System. Brugervejledning ENV-1152 Micro Hi-Fi System Brugervejledning ENV-1152 Indhold Kom godt i gang... 2 Strømforsyning... 2 Antenne... 2 Højttaler ledningsforbindelse... 2 Brug af fjernbetjening... 2 Knapper... 3 Betjeningsvejledning...

Læs mere

Strømforsyning +/- 12V serieregulator og 5V Switch mode

Strømforsyning +/- 12V serieregulator og 5V Switch mode Udarbejdet af: +/- 12V serieregulator og 5V Switch mode Side 1 af 15 Udarbejdet af: Komponentliste. B1: 4 stk. LN4007 1A/1000V diode D1: RGP30D diode Fast Recovery 150nS - 500nS, 3A 200V C1 C3 og C4: 100nF

Læs mere

BRUGER MANUAL. Model: TK-004 37 TANGENTS MULTI-FUNKTIONS ELEKTRONISK KEYBOARD

BRUGER MANUAL. Model: TK-004 37 TANGENTS MULTI-FUNKTIONS ELEKTRONISK KEYBOARD Model: TK-004 37 TANGENTS MULTI-FUNKTIONS ELEKTRONISK KEYBOARD BRUGER MANUAL 37 tangenter 8 timbre/ 8 rytmer / 4 percussion 8 volume indstillinger 32-level tempo kontrol Optag / afspil /

Læs mere

VoicePilot TSA2100 Elevatoralarm

VoicePilot TSA2100 Elevatoralarm Fire Fighter Communication system - FFK10 og FFP10 Kommunikationssystem for brandelevatorer i henhold til EN 81-72. Giver mulighed for kommunikation imellem elevatorstolen, motorrummet (FFP10) og indsatslederens

Læs mere

Digital Drejeskive Decoder til 7286 / 7686

Digital Drejeskive Decoder til 7286 / 7686 Digital Drejeskive Decoder til 7286 / 7686 7687 Marklin 7687 Drejeskive Decoderen kan anvendes på følgende måder til etablering af Styring til Drejeskiven fra Centralstation 2. (Dette dokument tager udgangspunkt

Læs mere

Temperaturmåler. Klaus Jørgensen. Itet. 1a. Klaus Jørgensen & Ole Rud. Odense Tekniskskole. Allegade 79 Odense C 5000 28/10 2002.

Temperaturmåler. Klaus Jørgensen. Itet. 1a. Klaus Jørgensen & Ole Rud. Odense Tekniskskole. Allegade 79 Odense C 5000 28/10 2002. Temperaturmåler Klaus Jørgensen Klaus Jørgensen & Ole Rud Odense Tekniskskole Allegade 79 Odense C 5000 28/10 2002 Vejleder: PSS Forord.: Denne rapport omhandler et forsøg hvor der skal opbygges et apparat,

Læs mere

Music hall AV 2.1 Dansk kvik guide. Findes i sort eller silver. Begge med kraftig børstet aluminiumsfront

Music hall AV 2.1 Dansk kvik guide. Findes i sort eller silver. Begge med kraftig børstet aluminiumsfront Music hall AV 2.1 Dansk kvik guide Findes i sort eller silver. Begge med kraftig børstet aluminiumsfront 1 Medier & introduktion: Tillykke med dit nye music hall anlæg. Med AV2.1 har du let adgang til

Læs mere

Andreas Nordbek & Kristoffer Skude Jensen. DMX Styring 31-05-2010. Side 1 af 15

Andreas Nordbek & Kristoffer Skude Jensen. DMX Styring 31-05-2010. Side 1 af 15 Andreas Nordbek & Kristoffer Skude Jensen DMX Styring 31-05-2010 Side 1 af 15 Indholdsfortegnelse 1 Indledning... 3 2 DMX... 4 3 Arkitektur... 5 4 Hardware design... 6 4.1 SPI... 9 5 Software... 10 5.1

Læs mere

PMR Radio Bruger Manual. electronic

PMR Radio Bruger Manual. electronic PMR Radio Bruger Manual electronic Antenne TOT: Tryk og Tal Knap Tryk og hold inde for at sende Tænd/Sluk Knap Tryk og hold inde, for at tænde eller slukke for PRM Radioen LCD Display Viser hvilke kanal

Læs mere

Vejledning til Tidtagningssystem til ridebanespring. Sønderborg. Manuel Signal ( Radiosignal ) knap på pult ( Stopursfunktion )

Vejledning til Tidtagningssystem til ridebanespring. Sønderborg. Manuel Signal ( Radiosignal ) knap på pult ( Stopursfunktion ) Model: Sønderborg Valgfri portrækkefølge. Visning af tid for hovedspring / omspring. Visning af fejl Automatisk addering af fejl ved overskridelse af fejlfri tid Mulighed for visning af starttid for næste

Læs mere

BeoSound Vejledning. CENTER v/henriksens ELEKTR

BeoSound Vejledning. CENTER v/henriksens ELEKTR BeoSound 3000 1 Vejledning BeoSound 3000 Guide BeoSound 3000 Reference book Denne vejledning indeholder 3 Der findes to vejledninger, du kan læse for at lære dit Bang & Olufsen produkt at kende. Vejledning

Læs mere

Arduino kursus lektion 3:

Arduino kursus lektion 3: Arduino kursus lektion 3: I denne lektion skal vi lave få en diode til at fade op og ned! Herefter skal denne diode bruges sammen med en lysføler til at lave en smart lysfølsom diode som selv justere lyset

Læs mere

Digital stemmeoptager

Digital stemmeoptager Digital stemmeoptager I. Funktionsbeskrivelse 1. REC (optagerknap) 2. STOP (stop/tænd og sluk) 3. UP (spring frem) 4. DOWN (spring tilbage) 5. HOLD (låseknap) 6. VOL+ (lydstyrke op) 7. VOL (lydstyrke ned)

Læs mere

Hold 6 Tirsdag. Kristian Krøier, Jacob Christiansen & Thomas Duerlund Jensen Fag: ELA Lærer: Jan Petersen (JPe) Dato for aflevering: 29.

Hold 6 Tirsdag. Kristian Krøier, Jacob Christiansen & Thomas Duerlund Jensen Fag: ELA Lærer: Jan Petersen (JPe) Dato for aflevering: 29. ELA journal: Øvelse 3 Grundlæggende Op. Amp. Koblinger. Dato for øvelse:. nov. 00 & 9. nov. 00 Hold 6 Tirsdag Kristian Krøier, Jacob Christiansen & Thomas Duerlund Jensen Fag: ELA Lærer: Jan Petersen (JPe)

Læs mere

Quick Setup Guide SB168-ES og LS9 Dansk version

Quick Setup Guide SB168-ES og LS9 Dansk version Quick Setup Guide SB168-ES og LS9 Dansk version February, 2009 SB168-ES og LS9 Quick Setup Guide Beskrivelse af denne guide. Denne guide indeholder en hurtig og enkelt opsætning af LS932 med SB168ES digital

Læs mere

MCE2040 SERIEL KOMMUNIKATIONSMODUL

MCE2040 SERIEL KOMMUNIKATIONSMODUL Kokkedal Industripark 4 DK-2980 Kokkedal DANMARK Tlf.: +45 49 18 01 00 Fax: +45 49 18 02 00 MCE2040 SERIEL KOMMUNIKATIONSMODUL Overførsel af status og vægt for digitale vejeceller via simpel PC/PLC protokol

Læs mere

Audacity. Arbejd med lyd computeren. Version: August 2012

Audacity. Arbejd med lyd computeren. Version: August 2012 Audacity Arbejd med lyd computeren Version: August 2012 Indholdsfortegnelse Audacity...4 Få fat i programmet...4 Brugerfladen...5 Optag fra mikrofon / line in / cd osv...5 Klip...6 Fade-in og fade-out...6

Læs mere

Introduktion Gripit GI1319 Storyboard Detaljering

Introduktion Gripit GI1319 Storyboard Detaljering Produktrapport 7 8 1 16 Introduktion Gripit GI1319 Storyboard Detaljering Asbjørn Maigaard Axelsen Hans Toft Hornemann Ditte Maria Buus Nielsen Betina Røge Jensen Terkel Skou Steffensen 4 Projekttitel

Læs mere

1 System oversigt.. 3 1.1 Enheder... 3 1.2 Prioritering af signaler... 4

1 System oversigt.. 3 1.1 Enheder... 3 1.2 Prioritering af signaler... 4 Indholdsfortegnelse 1 System oversigt.. 3 1.1 Enheder... 3 1.2 Prioritering af signaler... 4 2 Installation 5 2.1 Kontrol Enhed. 5 2.1.1 Tilslutning af forsyning... 5 2.1.2 Tilslutning af højttalere...

Læs mere