Sisukord:

4 -astmeline digitaalne järjestus: 19 sammu (piltidega)
4 -astmeline digitaalne järjestus: 19 sammu (piltidega)

Video: 4 -astmeline digitaalne järjestus: 19 sammu (piltidega)

Video: 4 -astmeline digitaalne järjestus: 19 sammu (piltidega)
Video: Маша и Медведь (Masha and The Bear) - Маша плюс каша (17 Серия) 2024, Juuli
Anonim
4 -astmeline digitaalne järjestusseade
4 -astmeline digitaalne järjestusseade
4 -astmeline digitaalne järjestusseade
4 -astmeline digitaalne järjestusseade

CPE 133, Cal Poly San Luis Obispo

Projekti loojad: Jayson Johnston ja Bjorn Nelson

Tänapäeva muusikatööstuses on üks levinumaid „instrumente” digitaalne süntesaator. Iga muusikažanr, alates hip-hopist kuni popi ja isegi kantrini, kasutab stuudios digitaalset süntesaatorit, et luua oma muusika elustamiseks vajalikke lööke ja helisid. Selles õpetuses loome Basys 3 FPGA plaadiga väga lihtsa süntesaatori.

Süntesaator suudab mängida nelja valitud veerandnooti konstantse löökide arvuga minutis. Kasutajad kasutavad lülitite abil iga veerandnooti muusikalisele helikõrgusele. Selle projekti jaoks kasutame 4-bitist digitaalset analoogmuundurit (DAC), et võtta plaadilt väljund ja teisendada see analoogsignaaliks. Seejärel edastatakse DAC -i väljund tavalisele arvuti kõlarile, luues meie muusika. Võimalik on kuusteist diskreetset väljakut. Me piirame oma süntesaatorit ühe kaheteistkümne noodiga 12 noodiga, mis jäävad keskmise C (261,6 Hz) ja B4 (493,9 Hz) vahele. Kasutajal on ka võimalus määrata mitu nooti korraga, samuti määrata puhkus, vajutades käsku käsku, samal ajal kui ükski helikõrguse lüliti ei ole ülespoole nihutatud. Kui iga noot on valitud ja seda mängitakse, kuvatakse tähemärk 7-segmendilisel ekraanil. Kasutame ka kolme tahvli nuppu, ühte muusika esitamiseks ja peatamiseks, ühte süntesaatori lähtestamiseks ja valimisrežiimi viimiseks ning kolmandat valimisrežiimis igale noodile helikõrguse määramiseks.

Kui kasutaja on oma nootide valikuga rahul ja pärast esitusnupu vajutamist mängib süntesaator igat nooti järjest korduvalt, kuni kasutaja vajutab pausi või vali.

Siin on nimekiri vajalikest seadmetest:

  • Vivado (või mis tahes VHDL -i tööruum)
  • Basys 3 või sarnane FPGA -plaat
  • Digitaal-analoogmuundur (min. 4-bitine)
  • Kõlar kõrvaklappide pesaga
  • Juhtmed

Samm 1: Digitaalse järjestuse kasutaja toimimine

Digitaalse jada kasutaja kasutamine
Digitaalse jada kasutaja kasutamine

Järgmised sammud on digitaalse järjestuse kasutamiseks. Digitaaljärjestus toetab 12 erineva helikõrguse (C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B) taasesitust, mis on vahemikus 261,6 Hz kuni 493,9 Hz.

1. Tahvli valimisrežiimi lülitamiseks vajutage vasakut nuppu. Selles režiimis kasutatakse iga vasakpoolsemat 4 lülitit (lülitid 13 kuni 16) erineva sammu väärtuse salvestamiseks.

2. Valiku tegemiseks keerake üks vasakpoolsetest lülititest sisse ja seejärel kasutage soovitud sammu valimiseks kõige parempoolsemat 4 lülitit (lülitid 1 kuni 4). Parema lülitite konkreetse kombinatsiooniga seotud helikõrgus kuvatakse seitsme segmendi ekraanil ja ekraan uuendatakse uueks seatud sammuks iga kord, kui õiged lülitid uuele kombinatsioonile nihutatakse. Puhkehetke saab määrata nii, et ühele vasakule lülitile ei määrata kunagi helikõrgust või kui noodile määrata numbril 0 näidatud samm. Kui soovitud helikõrgus on leitud ja see kuvatakse ekraanil, vajutage alumist määramisnuppu, et määrata konkreetne helikõrgus noodile.

3. Korrake 2. sammu kolme ülejäänud noodi puhul, keerates kõik ülejäänud vasakpoolsed lülitid eraldi sisse, valides paremate lülititega vastava helikõrguse ja vajutades alumisele nupule, et noodile helikõrgus määrata. Samale helikõrgusele saab määrata mitu nooti, nihutades korraga rohkem kui ühte vasakpoolset lülitit ülespoole.

4. Nüüd, kui kõik noodiväljad on määratud, on digitaalne järjestus mängimiseks valmis. Kõlarist märkmete esitamiseks vajutage lihtsalt muusika esitamise alustamiseks paremat esitus-/pausinuppu. Taasesituse järjestus peegeldab vasakpoolsete lülititega seotud kõrgusi vasakult paremale. Noodid mängitakse kindlaksmääratud löökide arvuga minutis, järjekorras 1, 2, 3, 4, 1, 2…. Ekraanile ilmub märge, mida praegu mängitakse, kui kõlarid muusikat esitavad. Muusika taasesituse peatamiseks vajutage lihtsalt parempoolset nuppu, siis muusika esitamine peatub ja ekraanile ilmub pausi sümbol. Taaskäivitamist jätkatakse parema nupu uuesti vajutamisega.

Samm: tehnilised üksikasjad

Tehnilised detailid
Tehnilised detailid

Meie süntesaator kasutab palju erinevaid digitaalseid komponente. Siia kuuluvad piiratud olekuga masinad, registrid, multiplekserid, kellajagurid ja palju muud. Süntesaatori ehitamiseks kasutasime 10 unikaalset moodulfaili. Selle asemel, et muuta iga moodul komponendiks, lõhkusime moodulfailid funktsioonide kaupa. Seetõttu on enamik mooduleid rohkem kui üks komponent. Pange tähele, et ülaltoodud pilt näitab kõiki meie parima kujundusega seotud plokke.

Me arutame iga moodulit, kirjeldades sisendeid ja väljundeid, jaotades selle komponendid ja selgitades selle eesmärki üldises disainis. Juhendi allosas on ZIP -fail, mis sisaldab kõiki projektis kasutatud VHDL -koodifaile.

Sisendid

  • Clk (omas kella signaal)
  • PP (esitamine/paus)
  • Sel (pange süntesaator valimisrežiimi)
  • Määra (määra samm sammule)
  • Samm (positsioonilised märkmed)
  • Sagedus (lülitid, mis loovad soovitud sammu)

Väljundid

  • Anood (7-segmendiline anood)
  • Katood (7-segmendilised katoodid)
  • DAC (4-bitine DAC-i juhtimine)

Samm: tehnilised üksikasjad

Tehnilised detailid
Tehnilised detailid

4. samm: 7-segmendiline kellajagur

7-segmendiline kellajagur
7-segmendiline kellajagur

Meie süntesaator kasutab kolme kellajaoturit, mis kõik toodavad signaale, mis täidavad meie projektis erinevat eesmärki. Kellajagur võtab algse kella signaali ja tekitab muudetud signaali, mille sagedus on väiksem kui algne kella signaal. Basys 3 algkell on 100 MHz. See on sagedus, mida meie kellajagurid kasutavad. Kui kasutate erinevat FPGA -plaati erineva algse taktsagedusega, peate võib -olla koodi muutma.

7-segmendiline kellajagur annab signaali, mis juhib faili seg_display. Kuidas see fail töötab, selgitame üksikasjalikumalt, kui jõuame selle sektsiooni. Põhimõtteliselt toodab see kellajagur 240 Hz signaali, mida kasutatakse ekraanil anoodide ja katoodide vahel vahetamiseks. Signaal on 240 Hz, kuna sagedus, mille juures inimsilm ei suuda valguse puudumist ära tunda, on 60 Hz. Me kasutame kahte numbrit, nii et kahekordistades seda sagedust, võnkub iga number 60 Hz juures. Siis kahekordistame selle, et saada 240 Hz, sest süsteem muutub ainult siis, kui signaal läheb kõrgeks, mitte siis, kui see väheneb.

Selle saavutamiseks võtab eraldaja 100 MHz algse signaali ja loeb üles iga tõusva serva. Kui loendur jõuab 416667 -ni, läheb väljund madalalt kõrgele või vastupidi.

Sisendid

Clk (natiivne kella signaal)

Väljundid

Clk_7seg (seg_display)

Komponendid

  • D register
  • MUX
  • Inverter
  • Liitja

5. samm: lööki minutis kellajagur

Lööki minutis kellajagur
Lööki minutis kellajagur

BPM kellajagur töötab sarnaselt. See jagur tekitab taktsageduse, mis juhib nelja etapi vahel lülitumist, kui esitusolekus toone väljastatakse. Otsustasime vahetada märkmete vahel kiirusel 100 BPM. 100 BPM juures mängitakse iga nooti 3/5 sekundit. Saadud signaali sagedus oleks 1,67 Hz.

Sellise sagedusega signaali tootmiseks kasutasime taas loendussüsteemi, kuid seekord oli see arv 60 miljonit. Iga kord, kui loendur jõudis 60 miljonini, muutus väljundsignaal kõrgeks või madalaks.

Sisendid

Clk (omaaegne taktsagedus)

Väljundid

Clk_BPM (väljundi_FSM -ile)

Komponendid

  • D register
  • MUX
  • Inverter
  • Liitja

6. samm: Kellajagur

Kellade jagaja
Kellade jagaja

Kellajagur Pitches on meie kellajaoturitest suurim. See jagaja väljastab 12 erinevat signaali, mis vastavad 12 erinevale noodile, mida meie süntesaator saab mängida. Kasutades muusikateooria põhiteadmisi, jõudsime järeldusele, et bitt või buss võib võnkuda kiirusega, mis vastab nootide sagedusele. Kasutatud sageduste nägemiseks vaadake siin. Kasutasime väljakute neljandat oktavi.

Siin kasutatakse sama loendussüsteemi. Konkreetsete väärtuste jaoks, milleni me loendasime, vaadake faili nimega Clk_div_pitches.

Sisendid

Clk (natiivne taktsagedus)

Väljundid

C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B (väljundi valimiseks)

Komponendid

  • D register
  • MUX
  • Inverter
  • Liitja

Samm 7: Esita/peatage/valige olekumasin

Esita/peatage/valige olekumasin
Esita/peatage/valige olekumasin

Meie projektis on kaks piiratud olekuga masinat (FSM). FSM on loogikaseade, mis saab eksisteerida ainult ühes olekus piiratud hulgast olekutest. FSM -i kasutades saab digitaalskeem liikuda uude olekusse sisendite kombinatsiooni põhjal. Sisendloogikat kasutades muutub FSM -i olek kella tõusva serva korral. Olekust ja ahela sisenditest saate luua väljundloogika, mis annab väljundid, mis eksisteerivad ainult siis, kui Mikroneesia on teatud olekus.

PPS olekumasin on meie ahela esimene FSM. Selles Mikroneesia Liidus on kolm osariiki; Esitus-, pausi- ja valikurežiim. Erinevates olekutes liikumiseks kasutasime nuppe PP ja valik. Vaadake ülaltoodud olekudiagrammi, et näha, kuidas olekute vahel üleminekud toimuvad. Tegime selle FSM -i ülemineku loodusliku 100 MHz kella tõusvas servas, nii et oleks võimalik, et masin ei lülituks ühe nupu vajutamisel isegi väga lühikese aja jooksul üle. Praegune olek (P_state) on selle mooduli ainus väljund.

Sisendid

  • Clk (omaaegne taktsagedus)
  • Sel (vasak nupp)
  • PP (parem nupp)

Väljundid

P_state (praegune olek, väljundi_FSM, märkmete määramine, seg_dsiplay, lõplik_valimine)

Komponendid

  • MUX
  • D register

8. samm: esita/peatage/valige olekumasin

Esita/peatage/valige olekumasin
Esita/peatage/valige olekumasin

9. samm: väljund FSM

Väljund FSM
Väljund FSM

See on teine eelmises jaotises viidatud Mikroneesia Liiduriikide Liit. See Mikroneesia Liitmik täidab teist funktsiooni, kuid selle alus on sisuliselt sama.

Väljundi FSM töötab ainult siis, kui esimese FSM -i praegune olek on "01" (esitusolek). Põhimõtteliselt on see mooduli sisselülitamine. Kui olek on "01", siis hakkab FSM vahetama BPM -kella signaali tõusva serva olekute vahel. Me teeme seda seetõttu, et output_FSM juhib valitud pigi kahendnumbrit, mis saadetakse moodulitele output_select ja seg_display. Mikroneesial on 16-bitine sisend, mis pärineb märkmete määramise moodulist ja mida käsitletakse järgmisena. Väljundi_FSM olekus "00" väljastab moodul esimese määratud noodi jaoks "xxxx". Seejärel väljastab "01" teises noodis "yyyy" ja nii iga noodi puhul enne esimese noodi juurde tagasipööramist. Vaadake ülaltoodud olekuskeemi.

See FSM erineb esimesest, kuna puudub sisendloogika olekute vahel vahetamise juhtimiseks. Selle asemel hakkab Mikroneesia toimima alles siis, kui esimese Mikroneesia olek on "01", ja siis läheb see Mikroneesia olekute vahel üle ainult kella signaali tõusvas servas. Teine erinevus on see, et sellel moodulil on väljundloogika, see tähendab, et see ei väljasta praegust olekut, vaid väljastab selle oleku helikõrguse binaarnumbri.

Sisendid

  • Clk_BPM (kella jaguri BPM kella signaal)
  • FSM1_state (PS PPS FSM -ist)
  • Pitch_in (helikõrgused märkme määramisest)

Väljundid

Pitch_out (üks samm korraga, väljundi valimiseks ja seg_kuvaks)

Komponendid

  • MUX
  • D register

Samm 10: väljund FSM

Väljund FSM
Väljund FSM

Samm 11: Märkus Määra

Märkus Määra
Märkus Määra

Märkmete määramise moodul vastutab positsioonilisele noolele või sammule helikõrguse tegeliku määramise eest. See moodul on tegelikult üsna lihtne. Esmalt kontrollib see, kas ahel on "valiku" olekus ja kas astmelüliti (vasakpoolne) on kõrgel. Kui see on tõsi ja omistamisnuppu vajutatakse, on mooduli väljund võrdne sageduslülitite (paremal) binaararvuga.

Algselt olime püüdnud teha moodulit, mis tegelikult salvestaks ühe helikõrguse kella signaali väljundisse, kuid tekkis probleeme väljundi muutmisega, et järgida sisendkella signaale. See on ainus moodul, mida kasutatakse lõplikus disainis rohkem kui üks kord. Iga sammuga on seotud moodul note_assign ja seetõttu saab iga mooduli eksemplar ühe biti Step -siinist.

Sisendid

  • P_state (praegune olek PPS FSM -ist)
  • Sel (vasak nupp)
  • Lüliti (üheastmeline lüliti)
  • Sagedus (parempoolsed lülitid pigi jaoks)
  • Määra (alumine nupp, määrab märkme)

Väljundid

Pigi (kahendarv, väljund_FSM)

Komponendid

  • MUX
  • Registreeru uuesti

12. samm: väljundi valimine

Väljund Vali
Väljund Vali

Väljundivalija vastutab binaarnumbri võtmise eest helikõrguse jaoks ja selle ühendamise oma vastava kellasignaaliga. Vaatamata oma suurusele on see ka suhteliselt lihtne moodul. Output_select on sisuliselt binaarne dekooder, mis dekodeerib helikõrguse kahendarvu kindlale kella signaalile. Tegelikult toimis väljundi määramine taktsagedusele siin paremini kui note_assign moodul, sest see moodul ei pidanud muud tegema kui MUX kella signaale, mille binaarne number esindab juhtsisendit.

Vabandame kummalise marsruutimise pärast, Vivado organiseeris faili clk_div_pitches helisignaalid tähestikulises järjekorras, kuid selle faili puhul korrastas need kasvava kahendnumbri järgi, põhjustades helikõrgused teises järjekorras. Pange tähele ka seda, et kui väljund_FSM -i binaararv oli "0000" või midagi muud kui "1100", siis saatis MUX lame '0' signaali.

Sisend

  • Pitch (väljundist_FSM);
  • C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B (pigi kella signaalid)

Väljund

Toon (üks bit, mis vastab valitud kella signaalile, ruutlaineks)

Komponendid

MUX

Samm 13: Square Wave Gen

Square Wave Gen
Square Wave Gen

Moodul square_wave on generaator ruutlainele, mis väljastatakse plaadilt DAC -i. Kasutades eelmise faili toonisignaali, muudab see square_wave 4 -bitise numbri "0000" ja "1111" vahel tooni tõusvas servas. Toon on konkreetne helisagedus, nii et square_wave tekitab erineva sagedusega laine, kui output_FSM läheb teise olekusse. Selle mooduli 4-bitine väljund läheb moodulisse fin_sel, kus loogika määrab, kas see buss väljastatakse PPS FSM-i oleku põhjal.

Selle ruutlainegeneraatori alternatiiviks on siinuslaine tekitamine. Kuigi see tooks suure tõenäosusega parema lõpptooni, on seda oluliselt raskem rakendada, seega otsustasime lihtsalt ruudulaine genereerida.

Sisendid

Toon (võnkuv bit väljundi valimisest)

Väljundid

DAC_input (võnkuv 4-bitine siin, mis muutub sama toonisagedusega)

Komponendid

  • Inverter
  • D register

14. samm: 7-segmendiline kuva

7-segmendiline ekraan
7-segmendiline ekraan

Moodul seg_display juhib meie põhiplaadi 7-segmendilist ekraani. Mooduli sees toimub kaks protsessi. Esimene protsess dekodeerib sageduse "valiku" olekus või "Pitch", kui see on "esitusrežiimis". "Pausi" režiimis dekodeerib moodul pausi sümboli. Vaadates VHDL -koodi, näete, et binaarne dekooder dekodeerib sisendi tegelikult kaheks erinevaks signaaliks - katood1 ja katood2. Katood1 tähistab kuvatavale helikõrgusele vastavat tähte ja katood2 tähistab tasast sümbolit (b), kui see on olemas. Selle põhjus on seotud seg_display mooduli teise protsessiga.

Basys3 -plaadil on segmendi ekraanil tavalised katoodid. Kui anoodid kontrollivad, milline number on sisse lülitatud, siis katoodid kontrollivad, millised segmendid on sisse lülitatud. Kuna ekraanil on ühised katoodid, tähendab see, et saate korraga kuvada ainult ühte segmendikomplekti. See tekitab selle projekti jaoks probleeme, sest soovime kuvada tähe esimesel kohal ja vajadusel tasase sümboli samal ajal. Mäletate nüüd 7seglase kella signaali? Selle probleemi lahendamiseks muudame anoodid ja katoodid edasi -tagasi 7 -sekundilise kella signaalil. Kuna kella signaal on 240 Hz ja me kasutame kahte numbrit, võnkub iga number 60 Hz juures. Inimsilmale tundub, et numbrid ei võnguta üldse.

Pange tähele ka seda, et basys3 tahvli ekraan kasutab negatiivset loogikat. See tähendab, et kui anood või katood on seatud väärtusele „0”, jääb see number või segment sisse ja vastupidi.

Sisendid

  • Kõne (noodi kahendnumber, kasutusel esituses)
  • Sagedus (sageduslülitid, kasutatakse valimisolekus)
  • P_state (praegune olek PPS FSM -ist)
  • Clk_240Hz (kella signaal Clk_div_7segilt, topelt 120, kuna kasutame ainult tõusvat serva)

Väljundid

  • Katood (siinil olevaid segmente juhtiv siin, lõppväljund)
  • Anood (siin, mis juhib ekraanil olevaid numbreid, lõppväljund)

Komponendid

  • Riiv
  • MUX
  • D register

Samm 15: Lõplik valik

Lõplik valik
Lõplik valik

Lõplik valik on viimane selles projektis kasutatud moodul. Veel üks lihtne moodul, see moodul juhib DAC -i lõpptulemust. "Valiku" või "pausi" olekus väljastab moodul staatilise "0000", nii et kõlaritest ei esitata muusikat. "Mängimise" olekus väljastab moodul võnkuvaid 4-bitiseid ruutu_laine abil.

Sisendid

  • P_state (praegune olek PPS FSM -ist)
  • DAC_input (võnkuvad 4-bitised ruudust_laine)

Väljundid

DAC (võrdub DAC -sisendiga olekus, lõppväljund)

Komponendid

MUX

16. samm: välisseadmed: DAC

Välised seadmed: DAC
Välised seadmed: DAC

Digitaal -analoogmuundur (DAC) võtab diskreetse signaali ja muudab selle pidevaks signaaliks. Meie DAC -l on neli bitti ja see on valmistatud summeerimisvõimendist. Kasutades toite- ja tagasisideahelas takistite suhet, suutsime luua süsteemi, mis toodab 16 erinevat taset, luues iga haru "summeerimise" abil. Bit0, ülemine haru, kannab kõige vähem kaalu ja annab kõrgeima väikseima potentsiaali, kuna sellel on suurem vastupanu. Kaal suureneb okste alla minnes. Kui loeksite binaarsisendite abil binaarselt üles ja seejärel tagasi, näeksid väljundpinged samm -sammult siinusena. DAC-i sisend ühendati 4-bitise signaali edastamiseks tahvli ühe PMOD-iga.

DAC oli algselt kokku pandud elektrotehnikaklassi jaoks ja see on meie projekteeritud ja joodetud, mitte poest ostetud. Ülal on kujutatud trükkplaadi loomiseks mõeldud disainifail.

17. samm: välisseadmed: kõlar

Välised seadmed: kõlar
Välised seadmed: kõlar

Selle projekti jaoks ei taha te osta ülimõnusat kõlaripaari. Nagu näete, on heli üsna lihtne. Läksime ja ostsime Best Buy'ist 8 -dollarise arvutikõlarite komplekti. Kõik, millel on kõrvaklappide pesa, töötab hästi. Monotoon töötab hästi. Võite isegi kõrvaklappe kasutada, kuid võite need välja puhuda!

DAC -i väljundi ühendamiseks kõlaritega kasutasime hüppajakaableid ja seejärel hoidsime väljundkaablit kõrvaklappide pesa otsas ja maanduskaablit aluse külge. Proovisime kaablite paigal hoidmiseks kasutada elektrilinti, kuid see tekitas palju häireid. Teistsuguse lindi proovimine võib selle probleemi lahendada.

Meie kõlarite jaoks keerasime need kõrgeimale seadele ja saime korralikult valju müra.

Ja see on viimane samm digitaalse järjestuse loomiseks FPGA plaadilt! Minge järgmise kahe sektsiooni alla, et alla laadida kogu meie VHDL -kood ja näha järjestust toimimas.

18. samm: video demo

See video näitab tööprojekti lõplikku versiooni, sealhulgas lülitite määramist neljale erinevale helikõrgusele ja kõlareid, kes esitavad vastavaid noote.

19. samm: VHDL -kood

Siin on kogu projekti kood, sealhulgas sekventseri ehitamisel kasutatud piirangud ja sim -failid. Pange tähele, et kasutamata disainifailid ütlevad seda arhitektuuris.

Soovitan: