INHOUDSOPGAWE:

4 -stap digitale volgorde: 19 stappe (met foto's)
4 -stap digitale volgorde: 19 stappe (met foto's)

Video: 4 -stap digitale volgorde: 19 stappe (met foto's)

Video: 4 -stap digitale volgorde: 19 stappe (met foto's)
Video: 🧭 Arno Wellens: Digitale Euro (CBDC), een vloek of een zegen? | Madelon Navigeert 2024, November
Anonim
4 -stap digitale volgorde
4 -stap digitale volgorde
4 -stap digitale volgorde
4 -stap digitale volgorde

CPE 133, Cal Poly San Luis Obispo

Skeppers van projekte: Jayson Johnston en Bjorn Nelson

In die huidige musiekbedryf is die digitale sintetiseerder een van die mees gebruikte 'instrumente'. Elke genre van musiek, van hip-hop tot pop en selfs country, gebruik 'n digitale sintetiseerder in die ateljee om die maat en klanke te skep wat hulle nodig het om hul musiek lewendig te maak. In hierdie handleiding sal ons 'n baie eenvoudige sintetiseerder skep met die Basys 3 FPGA -bord.

Die sintetiseerder kan vier geselekteerde kwartnote teen 'n konstante aantal slae per minuut speel. Gebruikers sal die skakelaars gebruik om elke kwartnoot aan 'n musikale toonhoogte toe te ken. Vir hierdie projek gebruik ons 'n 4-bis digitale na analoog omskakelaar (DAC) om die uitset van die bord af te neem en om te skakel in 'n analoog sein. Die uitset van die DAC word dan na 'n standaard rekenaarluidspreker gevoer om ons musiek te skep. Sestien afsonderlike staanplekke is moontlik. Ons sal ons sintetiseerder beperk tot 'n enkele oktaaf van 12 note, wat tussen middel C (261,6 Hz) en B4 (493,9 Hz) val. Die gebruiker sal ook die opsie hĂȘ om verskeie note gelyktydig toe te ken, sowel as om 'n rustyd toe te ken deur op toewysing te klik terwyl geen van die toonhoogte -skakelaars opwaarts geskuif word nie. Namate elke noot gekies en gespeel word, word die letternoot op die 7-segment vertoon. Ons sal ook drie van die knoppies op die bord gebruik, een om die musiek te speel en te onderbreek, een om die sintetiseerder terug te stel en in die "seleksiemodus" te plaas, en die derde om elke noot 'n toonhoogte toe te ken terwyl hy in die keusemodus is.

Sodra die gebruiker tevrede is met sy keuse van notas, en nadat hy op die speelknoppie gedruk het, speel die sintetiseerder elke noot herhaaldelik totdat die gebruiker Ăłf op pouse druk Ăłf kies.

Hier is 'n lys van die nodige toerusting:

  • Vivado (of enige VHDL -werkruimte)
  • Basys 3 of soortgelyke FPGA -bord
  • Digitaal na analoog omskakelaar (min. 4-bis)
  • Luidspreker met koptelefoonaansluiting
  • Draad lei

Stap 1: Gebruikersbediening van Digital Sequencer

Gebruikersbediening van Digital Sequencer
Gebruikersbediening van Digital Sequencer

Die volgende stappe is om die digitale sequencer te gebruik. Die digitale sequencer ondersteun die afspeel van 12 verskillende toonhoogtes (C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B), wat wissel van 261,6 Hz tot 493,9 Hz.

1. Druk die linkerknoppie om die bord in die keusemodus te plaas. In hierdie modus word die vier skakelaars links (skakelaars 13 tot 16) links gebruik om 'n duidelike toonhoogte te stoor.

2. Om 'n keuse te maak, skakel een van die skakelaars aan die linkerkant aan en gebruik dan die regterkantste 4 skakelaars (skakelaars 1 tot 4) om die gewenste toonhoogte te kies. Die toonhoogte wat verband hou met 'n spesifieke kombinasie van regterskakelaars, sal op die sewesegment vertoon word, en die skerm sal na die nuwe geassosieerde toonhoogte bywerk wanneer die regte skakelaars na 'n nuwe kombinasie verskuif word. 'N Rus kan toegeken word deur nooit 'n toonhoogte aan een van die skakelaars aan die linkerkant toe te ken nie, of deur 'n toonhoogte wat as 0 op die skerm verskyn, aan die noot toe te ken. Sodra die gewenste toonhoogte gevind is en op die skerm vertoon word, druk op die onderste knoppie om die spesifieke toonhoogte aan die noot toe te ken.

3. Herhaal stap 2 vir die drie oorblywende note, deur elkeen van die oorblywende skakelaars links aan te skakel, die onderskeie toonhoogte met die regte skakelaars te kies en op die onderste knoppie te druk om die toonhoogte aan die noot toe te ken. Meervoudige note kan dieselfde toonhoogte toegeken word deur meer as een van die linker skakelaars terselfdertyd opwaarts te skuif.

4. Noudat al die toonhoogtes toegeken is, is die digitale sequencer gereed om te speel. Om die notas op die luidspreker te speel, druk eenvoudig op die regte speel/pouse knoppie om die musiek te begin speel. Die volgorde van die afspeelvolgorde weerspieël die toonhoogtes wat met die linker skakelaars verband hou, van links na regs. Die note sal gespeel word teen 'n vasgestelde aantal slae per minuut, in die volgorde 1, 2, 3, 4, 1, 2
. Die noot wat tans speel, word op die skerm vertoon terwyl die luidsprekers die musiek speel. Om die afspeel van musiek te onderbreek, druk net op die regterknoppie, dan stop die musiek met speel en 'n pouse -simbool sal op die skerm verskyn. Deur weer op die regterknoppie te druk, sal die afspeel hervat word.

Stap 2: Tegniese besonderhede

Tegniese besonderhede
Tegniese besonderhede

Ons sintetiseerder maak gebruik van baie verskillende digitale komponente. Ingesluit is eindige staatsmasjiene, registers, multiplexers, klokverdelers en meer. Om ons sintetiseerder te bou, het ons 10 unieke modulĂȘre lĂȘers gebruik. In plaas van om elke module 'n komponent te maak, het ons die modulĂȘre lĂȘers volgens funksie afgebreek. Die meeste modules is gevolglik meer as een komponent. Let op die prent hierbo toon elke blok wat in ons topontwerp aan mekaar vasgemaak is.

Ons sal elke module bespreek deur die insette en uitsette te beskryf, die komponente daarvan af te breek en die doel daarvan in die algemene ontwerp te verduidelik. Onderaan die instruksies is 'n zip -lĂȘer, wat elke VHDL -kode lĂȘer bevat wat in die projek gebruik word.

Insette

  • Clk (inheemse kloksein)
  • PP (speel/pouse)
  • Sel (plaas die sintetiseerder in die keusemodus)
  • Ken toe (ken 'n stap toe aan 'n toonhoogte)
  • Stap (posisionele aantekeninge)
  • Freq (die skakelaars wat die gewenste toonhoogte skep)

Uitsette

  • Anode (7-segment anodes)
  • Katode (7-segment katodes)
  • DAC (4-bisse wat die DAC bestuur)

Stap 3: Tegniese besonderhede

Tegniese besonderhede
Tegniese besonderhede

Stap 4: 7-segment klokverdeler

7-segment klokverdeler
7-segment klokverdeler

Ons sintetiseerder maak gebruik van drie klokverdelers, wat almal seine lewer wat 'n ander doel in ons projek dien. 'N Klokskeider neem 'n inheemse kloksignaal en produseer 'n veranderde sein met 'n frekwensie wat kleiner is as die oorspronklike kloksignaal. Die oorspronklike klok van die Basys 3 is 100 MHz. Dit is die frekwensie wat ons klokverdelers gebruik. As u 'n ander FPGA -bord met 'n ander oorspronklike klokfrekwensie gebruik, moet u moontlik die kode verander.

Die 7-segment klokverdeler lewer 'n sein wat die seg_display-lĂȘer dryf. Ons sal in meer besonderhede verduidelik hoe hierdie lĂȘer werk wanneer ons by die afdeling kom. Hierdie klokverdeler lewer in wese 'n 240 Hz -sein wat gebruik sal word om tussen anodes en katodes op die skerm te skakel. Die sein is 240 Hz omdat die frekwensie waarop die menslike oog die afwesigheid van lig nie kan herken nie, 60 Hz is. Ons gebruik twee syfers, dus deur hierdie frekwensie te verdubbel, sal elke syfer by 60 Hz ossilleer. Dan verdubbel ons dit tot 240 Hz omdat die stelsel slegs verander as die sein hoog is, nie as dit laag word nie.

Om dit te bereik, neem die verdeler die inheemse 100 MHz -sein en tel op elke stygende rand. As die teller 416667 bereik, gaan die uitset van laag na hoog, of omgekeerd.

Insette

Clk (inheemse kloksein)

Uitsette

Clk_7seg (na seg_display)

Komponente

  • D registreer
  • MUX
  • Omskakelaar
  • Adder

Stap 5: Klopverdeler vir slae per minuut

Klopverdeler vir slae per minuut
Klopverdeler vir slae per minuut

Die BPM -klokverdeler werk op dieselfde manier. Hierdie verdeler produseer die klokfrekwensie wat die omskakeling tussen die vier stappe dryf wanneer die toon in die speeltoestand geplaas word. Ons het besluit om oor te skakel tussen notas teen 100 BPM. Teen 100 BPM word elke noot 3/5 sekondes gespeel. Die gevolglike sein het 'n frekwensie van 1,67 Hz.

Om 'n sein van hierdie frekwensie te lewer, het ons weer 'n telstelsel gebruik, maar hierdie keer was die telling 60 miljoen. Elke keer as die toonbank 60 miljoen bereik het, sou die uitsetsein hoog of laag wissel.

Insette

Clk (inheemse klokfrekwensie)

Uitsette

Clk_BPM (na output_FSM)

Komponente

  • D registreer
  • MUX
  • Omskakelaar
  • Adder

Stap 6: Pitches Clock Divider

Pitches Clock Divider
Pitches Clock Divider

Die Pitches Clock Divider is die grootste van ons klokverdelers. Hierdie verdeler gee 12 verskillende seine af wat ooreenstem met die 12 verskillende note wat ons sintetiseerder kan speel. Deur basiese kennis van musiekteorie te gebruik, het ons afgelei dat 'n bietjie of 'n bus kan ossilleer teen 'n tempo wat ooreenstem met die frekwensie van musieknote. Kyk hier na die frekwensies wat ons gebruik het. Ons het die vierde oktaaf van toonhoogtes gebruik.

Dieselfde telstelsel word hier gebruik. Sien die lĂȘer met die naam Clk_div_pitches vir die spesifieke waardes waarop ons getel het.

Insette

Clk (inheemse klokfrekwensie)

Uitsette

C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B (na output_select)

Komponente

  • D registreer
  • MUX
  • Omskakelaar
  • Adder

Stap 7: Speel/pouse/kies staatsmasjien

Speel/pouse/kies staatsmasjien
Speel/pouse/kies staatsmasjien

In ons projek is daar twee eindige staatsmasjiene (FSM). 'N FSM is 'n logiese toestel wat in 'n beperkte toestand in slegs een toestand kan bestaan. Deur 'n FSM te gebruik, kan 'n digitale stroombaan na 'n nuwe toestand beweeg, gebaseer op 'n kombinasie van insette. Deur insetlogika te gebruik, sal die toestand van 'n FSM verander as daar 'n stygende rand van die klok is. Vanuit die toestand en insette in die stroombaan, kan u uitvoerlogika skep wat uitsette gee wat slegs bestaan as die FSM in 'n sekere toestand is.

Die PPS -staatsmasjien is die eerste FSM in ons kring. Daar is drie state in hierdie FSM; Speel-, pouse- en keusemodus. Om deur die verskillende toestande te beweeg, gebruik ons die knoppies PP en Selection. Sien die toestand diagram hierbo om te sien hoe oorgange tussen toestande plaasvind. Ons het hierdie FSM -oorgang gemaak op die stygende rand van die inheemse 100 MHz -horlosie, sodat dit onmoontlik sou wees dat die masjien nie oorgaan as een van die knoppies ingedruk word nie, selfs vir 'n baie kort tydjie. Die huidige toestand (P_staat) is die enigste uitset van hierdie module.

Insette

  • Clk (inheemse klokfrekwensie)
  • Sel (knoppie links)
  • PP (regter knoppie)

Uitsette

P_staat (huidige toestand, na output_FSM, note_assign, seg_dsiplay, final_select)

Komponente

  • MUX
  • D registreer

Stap 8: Speel/pouse/kies staatsmasjien

Speel/pouse/kies staatsmasjien
Speel/pouse/kies staatsmasjien

Stap 9: Uitvoer FSM

Uitset FSM
Uitset FSM

Dit is die tweede FSM waarna in die vorige afdeling verwys is. Hierdie FSM dien 'n ander funksie as die ander, maar die basis hiervoor is in wese dieselfde.

Die uitset FSM werk slegs as die huidige toestand van die eerste FSM "01" is (die speelstatus). In wese is dit die inskakeling vir die module. As die toestand "01" is, gaan die FSM oorskakel tussen toestande op die stygende rand van die BPM -kloksein. Ons doen dit omdat die output_FSM beheer watter binĂȘre getal vir die geselekteerde toonhoogte na die output_select- en seg_display -modules gestuur word. Die FSM het 'n 16-bis-invoer wat afkomstig is van die note-toewysingsmodule, wat vervolgens behandel sal word. In die toestand "00" vir die output_FSM, sal die module "xxxx" uitvoer vir die eerste noot wat toegeken is. Dan, in "01", sal dit "yyyy" vir die tweede noot gee, ensovoorts vir elke noot voordat dit na die eerste noot terugdraai. Sien die toestand diagram hierbo.

Hierdie FSM verskil van die eerste omdat daar geen insetlogika is om die skakel tussen toestande te beheer nie. In plaas daarvan gaan die FSM slegs werk as die toestand van die eerste FSM "01" is, en dan sal hierdie FSM slegs tussen state op die stygende rand van die kloksein oorgaan. 'N Ander verskil is dat hierdie module uitvoerlogika het, wat beteken dat dit nie die huidige toestand uitvoer nie, maar die binĂȘre getal vir die toonhoogte in daardie toestand uitvoer.

Insette

  • Clk_BPM (BPM -kloksein van klokverdeler)
  • FSM1_state (PS van PPS FSM)
  • Pitch_in (toonhoogtes van note_assign)

Uitsette

Pitch_out (een toonhoogte op 'n slag, om output_select en seg_display te wys)

Komponente

  • MUX
  • D registreer

Stap 10: Uitvoer FSM

Uitset FSM
Uitset FSM

Stap 11: Let op Ken toe

Let op Ken toe
Let op Ken toe

Die module -toewysingsmodule is verantwoordelik om 'n toonhoogte aan die posisionele noot of stap toe te ken. Hierdie module is eintlik redelik eenvoudig. Dit kyk eers of die stroombaan in die "seleksie" toestand is en of 'n stapskakelaar (heel links) hoog is. As dit waar is en die toewysingsknoppie ingedruk word, is die uitset van die module gelyk aan die binĂȘre getal wat deur die frekwensie -skakelaars (heel regs) voorgestel word.

Oorspronklik het ons probeer om 'n module te maak wat eintlik een van die toonhoogteklokseine na die uitset sou stoor, maar ons het probleme ondervind met die uitset wat verander na die ingangsklokseine. Dit is die enigste module wat meer as een keer in die finale ontwerp gebruik is. Elke stap het 'n note_assign -module wat daarmee gepaard gaan, en daarom kry elke instansie van die module 'n bietjie van die Step -bus.

Insette

  • P_staat (huidige toestand van PPS FSM)
  • Sel (knoppie links)
  • Skakelaar (eenstapskakelaar)
  • Freq (heel regs skakelaars vir toonhoogte)
  • Wys toe (onderste knoppie, ken 'n nota toe)

Uitsette

Toonhoogte (binĂȘre getal, na output_FSM)

Komponente

  • MUX
  • D registreer

Stap 12: Kies uitset

Uitset kies
Uitset kies

Uitvoer kies is verantwoordelik vir die neem van die binĂȘre getal vir 'n toonhoogte en die verbinding met die onderskeie kloksignaal. Ondanks die grootte daarvan, is dit ook 'n relatief eenvoudige module. Output_select is in wese 'n binĂȘre dekodeerder wat die binĂȘre getal vir 'n toonhoogte na 'n spesifieke kloksignaal dekodeer. Om die uitset aan 'n klokfrekwensie toe te ken, het hier beter gewerk in vergelyking met die note_assign -module, want al wat hierdie module moes doen, was om die klok seine met die binĂȘre nommer wat die beheerinvoer verteenwoordig, te MUX.

Ons vra om verskoning vir die vreemde routing, Vivado het die toonhoogte seine alfabeties georganiseer vir die clk_div_pitches lĂȘer, maar vir hierdie lĂȘer het dit hulle georganiseer deur stygende binĂȘre getal, wat veroorsaak dat die toonhoogtes in 'n ander volgorde is. Let ook daarop dat as die binĂȘre getal van die output_FSM "0000" of enigiets groter as "1100" was, die MUX deur 'n plat '0' -sein gestuur word.

Invoer

  • Toonhoogte (vanaf output_FSM);
  • C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B (toonklokseine)

Uitset

Toon ('n enkele bis wat by die geselekteerde kloksignaal pas by square_wave)

Komponente

MUX

Stap 13: Square Wave Gen

Square Wave Genl
Square Wave Genl

Module square_wave is die kragopwekker vir die vierkantgolf wat van die bord na die DAC gestuur word. Deur die toonsignaal van die vorige lĂȘer te gebruik, draai hierdie square_wave die 4 bis getal om tussen "0000" en "1111" op die stygende rand van Tone. Toon is 'n spesifieke toonhoogtefrekwensie, so square_wave produseer 'n golf met 'n ander frekwensie wanneer output_FSM na 'n ander toestand oorgaan. Die 4-bis-uitset van hierdie module gaan na die fin_sel-module, waar logika bepaal of hierdie bus op grond van die toestand van PPS FSM uitgevoer sal word.

'N Alternatief vir hierdie vierkantsgolfopwekker is die vervaardiging van 'n sinusgolf. Alhoewel dit waarskynlik 'n beter eindtoon sou lewer, is dit aansienlik moeiliker om te implementeer, daarom het ons besluit om net 'n vierkantgolf te genereer.

Insette

Toon (ossillerende bietjie van output_select)

Uitsette

DAC_input (ossillerende 4-bis bus wat met dieselfde toonfrekwensie verander)

Komponente

  • Omskakelaar
  • D registreer

Stap 14: 7-segment vertoon

7-segment vertoon
7-segment vertoon

Die seg_display-module beheer die 7-segment-skerm op ons basys-bord. Binne die module vind twee prosesse plaas. Die eerste proses dekodeer Freq in die "seleksie" -toestand of Pitch as dit in die "speel" -modus is. In die "pouse" -modus, dekodeer die module om die pouse -simbool te wys. As u na die VHDL -kode kyk, kan u sien dat die binĂȘre dekodeerder eintlik die invoer in twee verskillende seine, katode1 en katode2, dekodeer. Katode1 verteenwoordig die letter wat ooreenstem met die toonhoogte wat vertoon moet word, en katode2 stel die plat simbool (b) voor as daar een is. Die rede hiervoor hou verband met die tweede proses wat die seg_display -module doen.

Op 'n basys3 -bord het die segmentvertoning algemene katodes. Terwyl die anodes bepaal watter syfer aangeskakel word, beheer die katodes watter segmente aan is. Aangesien die skerm algemene katodes het, beteken dit dat u slegs een stel segmente tegelyk kan vertoon. Dit is 'n probleem vir hierdie projek, want ons wil terselfdertyd 'n letter met die eerste syfer en die plat simbool tegelyk vertoon. Onthou u nou die seinsignaal van 7seg? Om hierdie probleem te vermy, verander ons die anodes en katodes heen en weer op die 7seg -kloksein. Omdat die kloksignaal 240 Hz is en ons twee syfers gebruik, sal elke syfer teen 60 Hz ossilleer. Vir die menslike oog sal dit lyk asof die syfers glad nie ossilleer nie.

Let ook daarop dat die basys3 -bordskerm negatiewe logika gebruik. Dit beteken dat as 'n anode of katode op '0' is, daardie syfer of segment sal wees, en omgekeerd.

Insette

  • Toonhoogte (binĂȘre nommer vir 'n noot, gebruik in speeltoestand)
  • Freq (frekwensie skakelaars, gebruik in seleksie toestand)
  • P_staat (huidige toestand van PPS FSM)
  • Clk_240Hz (kloksein van Clk_div_7seg, dubbel 120 omdat ons slegs die stygende rand gebruik)

Uitsette

  • Katode (bus wat segmente op die skerm beheer, finale uitset)
  • Anode (bus wat syfers op die skerm beheer, finale uitset)

Komponente

  • Grendel
  • MUX
  • D registreer

Stap 15: Finale keuse

Finale keuse
Finale keuse

Finale keuse is die laaste module wat in hierdie projek gebruik is. 'N Ander eenvoudige module, hierdie module beheer die finale uitset wat na die DAC gaan. As die module in die "seleksie" of "pouse" toestand is, sal die module 'n statiese "0000" uitvoer, sodat geen musiek uit die luidsprekers gespeel sal word nie. In die "speel" -toestand gee die module die ossillerende 4-bisse uit, soos bepaal deur square_wave.

Insette

  • P_staat (huidige toestand van PPS FSM)
  • DAC_input (die ossillerende 4-bisse van square_wave)

Uitsette

DAC (gelyk aan DAC_input in speeltoestand, finale uitset)

Komponente

MUX

Stap 16: Eksterne toestelle: DAC

Eksterne toestelle: DAC
Eksterne toestelle: DAC

'N Digitaal na analoog omskakelaar (DAC) neem 'n diskrete sein en omskep dit in 'n deurlopende sein. Ons DAC het vier bisse en is gemaak van 'n somversterker. Deur 'n verhouding van weerstande in die toevoer- en terugvoerlus te gebruik, kon ons 'n stelsel skep wat op 16 verskillende vlakke uitset deur die 'som' van elke tak. Bit0, die boonste vertakking, dra die minste gewig en dra die kleinste potensiaal by as dit hoog is as gevolg van die vertakking van hoĂ«r weerstand. Die gewig neem toe as jy oor die takke gaan. As u in binĂȘre op en dan terugtel met behulp van die bit -insette, sou die uitsetspannings soos 'n stapsgewyse sinusgolf lyk. Die invoer van die DAC is gekoppel aan die een van die PMOD's op die bord om die 4-bis-sein oor te dra.

Die DAC is oorspronklik saamgestel vir 'n Elektriese Ingenieurswese klas en is deur ons ontwerp en gesoldeer, nie by 'n winkel gekoop nie. Hierbo is 'n beeld van die ontwerplĂȘer vir die skep van die printplaat.

Stap 17: Eksterne toestelle: luidspreker

Eksterne toestelle: Spreker
Eksterne toestelle: Spreker

Vir hierdie projek wil u nie 'n super mooi luidspreker koop nie. Soos u kan sien, is die klank redelik basies. Ons het 'n stel rekenaarluidsprekers van $ 8 by Best Buy gekoop. Enigiets met 'n koptelefoonaansluiting werk goed. Monoton werk ook goed. U kan selfs 'n koptelefoon gebruik, maar u kan dit blaas!

Om die uitset van die DAC aan die luidsprekers te koppel, het ons jumperkabels gebruik en die uitgangskabel dan aan die punt van die koptelefoonaansluiting gehou en die kabel vir die grond tot by die basis. Ons het probeer om elektriese band te gebruik om die kabels vas te hou, maar dit het baie inmenging veroorsaak. Deur 'n ander bandstyl te probeer, kan hierdie probleem opgelos word.

Vir ons luidsprekers het ons hulle na die hoogste omgewing gedraai en 'n ordentlike harde geluid gekry.

En dit is die laaste stap om 'n digitale sequencer van 'n FPGA -bord te skep! Gaan na die volgende twee afdelings om al ons VHDL -kode af te laai en die sequencer in aksie te sien.

Stap 18: Videodemo

Hierdie video toon die finale weergawe van die werkprojek, insluitend die proses om die skakelaars aan 4 verskillende toonhoogtes toe te ken, en die sprekers wat die onderskeie note speel.

Stap 19: VHDL -kode

Hier is die kode vir die hele projek, insluitend die beperking en sim -lĂȘers wat gebruik word tydens die bou van die sequencer. Let daarop dat ongebruikte ontwerplĂȘers dit in die argitektuur sĂȘ.

Aanbeveel: