Sisukord:

Laserharfisüntesaator Zybo pardal: 10 sammu (piltidega)
Laserharfisüntesaator Zybo pardal: 10 sammu (piltidega)

Video: Laserharfisüntesaator Zybo pardal: 10 sammu (piltidega)

Video: Laserharfisüntesaator Zybo pardal: 10 sammu (piltidega)
Video: Java Tech Talk: Telegram Bot auf Java für 1 Stunde 2024, Juuli
Anonim
Laserharfisüntesaator Zybo pardal
Laserharfisüntesaator Zybo pardal

Selles õpetuses loome täisfunktsionaalse laserharfi, kasutades IR -andureid, millel on jadaliides, mis võimaldab kasutajal muuta instrumendi häälestust ja tooni. See harf on 21. sajandi uusversioon vanast pillist. Süsteem loodi Xilinx Zybo arendusplaadi abil koos Vivado Design Suitesiga. Mida on vaja projekti lõpuleviimiseks:

  • 12 IR -andurit ja kiirgurit (sõltuvalt stringide arvust saab kasutada rohkem või vähem)
  • Zybo Zynq-7000 arendusplaat
  • Tasuta RTOS
  • Vivado Design Suite
  • Traat (andurite ühendamiseks plaadiga)
  • 3 tükki PVC toru ((2) 18 tolli ja (1) 8 tolli)
  • 2 PVC küünarnukki

Samm: hankige Digilent Zybo DMA helidemo

Selle projekti FPGA pool põhineb suuresti siin leitud demoprojektil. See kasutab otsest juurdepääsu mälule, et saata andmeid otse mälust, kuhu protsessor saab AXI Streami kaudu I2S heliplokki kirjutada. Järgmised sammud aitavad teil DMA helidemoprojekti käivitada:

  1. Võimalik, et Zybo tahvli jaoks on vaja uut tahvlifaili versiooni. Järgige neid juhiseid Vivado jaoks uute tahvlifailide hankimiseks.
  2. Demoprojekti avamiseks Vivados järgige sellel lehel olevate juhiste samme 1 ja 2. Kasutage Vivado meetodit, mitte SDK riistvara üleandmist.
  3. Võite saada sõnumi, mis ütleb, et mõnda teie IP -plokki tuleks värskendada. Kui jah, valige "Kuva IP olek" ja seejärel vahekaardil IP olek valige kõik aegunud IP -d ja klõpsake "Uuenda valitud". Kui see on lõppenud ja ilmub aken, kus küsitakse, kas soovite väljundtoodet luua, jätkake ja klõpsake nuppu "Loo". Kui saate kriitilise hoiatusteate, ignoreerige seda.
  4. Lähtefailide nägemiseks lülituge kujunduselt vahekaardile Vivado. Paremklõpsake ploki kujundust "design_1" ja valige "Create HDL Wrapper". Kui küsitakse, valige "kopeeri loodud ümbris, et lubada kasutajal muudatusi". Projekti jaoks luuakse ümbrisfail.
  5. Nüüd, kui need kriitilised sammud, mis teises õppetükis kuidagi välja jäeti, on lõpule viidud, saate naasta varem lingitud õpetuse juurde ja jätkata 4. sammust lõpuni ning veenduda, et demoprojekt töötab õigesti. Kui teil pole võimalust salvestamiseks heli sisestada, siis salvestage lihtsalt kõrvaklappidega ja kuulake taasesitusnuppu vajutades 5-10-sekundilist hägusat heli. Kuni taasesituse nuppu vajutades tuleb kõrvaklappide pesast midagi välja, töötab see tõenäoliselt õigesti.

Samm: tehke mõned muudatused Vivados

Tehke Vivados mõningaid muudatusi
Tehke Vivados mõningaid muudatusi

Nüüd on teil Digilendi DMA -heli demo töökorras, kuid see pole siin sugugi lõppeesmärk. Seega peame naasma Vivadosse ja tegema mõned muudatused, et meie andurid saaksid PMOD -päistesse ühendada ja saaksime nende väärtust tarkvara poolel kasutada.

  1. Avage plokkskeem Vivados
  2. Looge GPIO plokk, paremklõpsates plokkskeemi tühjal alal ja valides menüüst "Lisa IP". Leidke ja valige "AXI GPIO".
  3. Topeltklõpsake uut IP-plokki ja minge IP-i uuesti kohandamise aknas vahekaardile IP-konfiguratsioon. Valige kõik sisendid ja seadke laius kaheteistkümnele, kuna meie harfil on 12 "stringi" ja seetõttu vajame 12 andurit. Kui soovite kasutada vähem või rohkem andureid, reguleerige seda numbrit sobivalt. Samuti määrake katkestamise lubamine.
  4. Paremklõpsake uut GPIO IP -plokki ja valige käsk "käivita ühenduse automatiseerimine". Märkige ruut AXI ja klõpsake nuppu OK. See peaks automaatselt ühendama AXI liidese, kuid jätma ploki väljundid ühendamata.
  5. Täiendava katkestuse tegemiseks topeltklõpsake IP -plokil xlconcat_0 ja muutke portide arvu 4 -lt 5. Seejärel saate ühendada ip2intc_irpt tihvti uuest GPIO -plokist xlconcat -ploki uue kasutamata pordiga.
  6. Paremklõpsake uue GPIO IP -ploki väljundil "GPIO" ja valige "make external". Leidke, kuhu joon läheb, ja klõpsake väikest külgsuunalist viisnurka ning vasakul peaks avanema aken, kus saate nime muuta. Muutke nimi "SENSORS". Kui soovite, et meie pakutavate piirangute fail töötaks, on oluline kasutada sama nime, vastasel juhul peate piirangute failis nime muutma.
  7. Tagasi allikate vahekaardile leidke piirangute fail ja asendage see meie pakutavaga. Võite faili asendada või lihtsalt kopeerida meie piirangute faili sisu ja kleepida selle vana sisu peale. Üks meie piirangute faili olulisi asju on PMOD päiste tõmbetakistuste lubamine. See on vajalik konkreetsete meie kasutatavate andurite jaoks, kuid kõik andurid pole ühesugused. Kui teie andurid vajavad väljatõmmatavaid takistid, saate iga "set_property PULLUP true" eksemplari muuta "set_property PULLDOWN true" -ga. Kui need vajavad tahvli väärtusest erinevat takisti väärtust, saate need read eemaldada ja kasutada väliseid takistoreid. Tihvtide nimed on piirangute faili kommentaarides ja need vastavad Zybo skeemi esimese diagrammi siltidele leht, mille leiate siit. Kui soovite kasutada erinevaid pmod -nööpnõelu, sobitage piirangufailis olevad nimed skemaatiliselt siltidega. Me kasutame PMOD päist JE ja JD ning kasutame mõlemal kuut andmestikku, jättes välja tihvtid 1 ja 7. See teave on oluline andurite ühendamisel. Nagu on näidatud skemaatiliselt, on PMODS -i tihvtid 6 ja 12 VCC ja tihvtid 5 ja 11 on maandatud.
  8. Regenereerige HDL -ümbris nagu varem ning kopeerige ja kirjutage vana üle. Kui see on tehtud, genereerige bitivoog ja eksportige riistvara nagu varem ning taaskäivitage SDK. Kui teilt küsitakse, kas soovite vana riistvarafaili asendada, on vastus jaatav. Tõenäoliselt on kõige parem sulgeda SDK riistvara eksportimisel, et see saaks korralikult välja vahetatud.
  9. Käivitage SDK.

3. samm: käivitage FreeRTOS

Järgmine samm on FreeRTOSe käivitamine Zybo pardal.

  1. Kui teil pole veel koopiat, laadige siit alla FreeRTOS ja eraldage failid.
  2. Importige FreeRTOS Zynq demo, mis asub aadressil FreeRTOSv9.0.0 / FreeRTOS / Demo / CORTEX_A9_Zynq_ZC702 / RTOSDemo. Impordiprotsess on peaaegu sama, mis teise demoprojekti puhul, kuid kuna FreeRTOS Zynq demo tugineb teistele FreeRTOS -kausta failidele, ei tohiks te faile oma tööruumi kopeerida. Selle asemel peaksite paigutama kogu FreeRTOS -kausta oma projekti kausta.
  3. Looge uus plaadi tugipakett, minnes jaotisse "file" -> "new" -> "board support package". Veenduge, et valitud on eraldiseisev ja klõpsake nuppu Lõpeta. Mõne aja pärast ilmub aken, märkige ruut lwip141 kõrval (see peatab ühe FreeRTOS -demo kompileerimise nurjumise) ja klõpsake nuppu OK. Pärast seda, kui olete lõpetanud RTOSdemo projekti paremklõpsamise ja minge jaotisse "Atribuudid", minge vahekaardile "projekti viited" ja märkige ruut teie loodud uue bsp kõrval. Loodetavasti tuntakse see ära, kuid mõnikord võib Xilinxi SDK sellises asjas imelik olla. Kui pärast seda sammu kuvatakse ikka tõrge, et xparameters.h puudub või midagi sellist, proovige seda sammu korrata ning võib -olla SDK -st väljuda ja taaskäivitada.

Samm: lisage laserharfikood

Nüüd, kui FreeRTOS on imporditud, saate tuua laserharfiprojekti failid FreeRTOSe demosse

  1. Looge FreeRTOSe demo src kausta alla uus kaust ning kopeerige ja kleepige sellesse kausta kõik pakutavad c -failid, välja arvatud main.c.
  2. Asenda RTOSDemo main.c kaasasoleva main.c vastu.
  3. Kui kõik on õigesti tehtud, peaksite suutma laserharfi koodi käivitada. Testimiseks kasutatakse nüüd DMA demoprojektis kasutatud nupusisendit helide esitamiseks ilma anduriteta (mis tahes neljast põhinupust töötab). See mängib stringi iga kord, kui seda vajutate, ja liigub mitme vajutusega läbi kõik süsteemi stringid. Ühendage mõned kõrvaklapid või kõlarid Zybo pardal olevate kõrvaklappide pesasse ja veenduge, et kuulete nuppu vajutades kõlavate keelte helisid.

Samm 5: Koodeksi kohta

Paljud teist, kes seda õpetust loevad, õpivad siin tõenäoliselt heli seadistamist või DMA kasutamist millegi teistsuguse tegemiseks või mõne muu muusikariista loomiseks. Sel põhjusel on järgmistes osades kirjeldatud, kuidas pakutud kood töötab koos eelnevalt kirjeldatud riistvaraga, et saada DMA abil toimiv heliväljund. Kui saate aru, miks kooditükid seal on, peaksite saama neid kohandada vastavalt sellele, mida soovite luua.

Katkestab

Kõigepealt mainin, kuidas selles projektis katkestusi luuakse. Nii tegime kõigepealt katkestusvektoritabeli struktuuri, mis jälgib ID -d, katkestuste käitlejat ja iga katkestuse kohta viidet seadmele. Katkestuste ID -d pärinevad xparameters.h. Katkestuste käitleja on funktsioon, mille me kirjutasime DMA ja GPIO jaoks ning I2C katkestus pärineb Xlic I2C draiverist. Seadme viide osutab iga seadme eksemplaridele, mille lähtestame mujal. Funktsiooni _init_audio lõpus jõuab silmus läbi katkestusvektorite tabeli iga üksuse ja kutsub katkestuste ühendamiseks ja aktiveerimiseks kaks funktsiooni XScuGic_Connect () ja XScuGic_Enable (). Need viitavad xInterruptControllerile, mis on vaikimisi FreeRTOS main.c -s loodud katkestuskontroller. Põhimõtteliselt lisame kõik oma katkestused sellele katkestuskontrollerile, mille FreeRTOS meile juba lõi.

DMA

DMA lähtestamiskood algab lh_main.c. Esiteks deklareeritakse XAxiDma struktuuri staatiline eksemplar. Seejärel konfigureeritakse see funktsioonis _init_audio (). Esmalt kutsutakse välja demoprojekti konfigureerimisfunktsioon, mis asub dma.c -s. See on päris hästi dokumenteeritud ja pärineb otse demost. Seejärel ühendatakse katkestus ja see lubatakse. Selle projekti jaoks on vajalik ainult ülem-alam-katkestus, kuna DMA saadab kõik andmed I2S-kontrollerile. Kui soovite heli salvestada, vajate ka orja-peremehe katkestust. Master-to-slave katkestusele helistatakse, kui DMA lõpetab mis tahes andmete väljasaatmise. See katkestus on meie projekti jaoks uskumatult oluline, sest iga kord, kui DMA lõpetab ühe heliproovide puhvri saatmise, peab ta kohe alustama järgmise puhvri saatmist, vastasel juhul tekib saatmiste vahel kuuldav viivitus. Funktsiooni dma_mm2s_ISR () sees näete, kuidas me katkestust käsitleme. Oluline osa on lõpu lähedal, kus me kasutame xSemaphoreGiveFromISR () ja portYIELD_FROM_ISR (), et teavitada _audio_task (), et see saab algatada järgmise DMA ülekande. Pidevaid heliandmeid saadame kahe puhvri vaheldumisi. Kui üks puhver edastatakse I2C plokile, arvutatakse ja salvestatakse teise puhvri väärtused. Siis, kui katkestus pärineb DMA -st, lülitub aktiivne puhver sisse ja hiljuti kirjutatud puhver hakkab üle kandma, samal ajal kui varem edastatud puhver hakkab uute andmetega üle kirjutama. Funktsiooni _audio_task põhiosa on koht, kuhu kutsutakse fnAudioPlay (). fnAudioPlay () võtab arvesse DMA eksemplari, puhvri pikkuse ja osuti puhvrile, kust andmeid edastatakse. Mõned väärtused saadetakse I2S registritesse, et anda teada, et uusi proove on tulemas. Seejärel kutsutakse XAxiDma_SimpleTransfer () ülekande alustamiseks.

I2S heli

audio.c ja audio.h on need, kus toimub I2S -i lähtestamine. I2S -i lähtestamiskood on üsna tavaline kooditükk, mis hõljub paljudes kohtades, võite leida mõningaid erinevusi muudest allikatest, kuid see peaks toimima. See on üsna hästi dokumenteeritud ja harfiprojekti jaoks pole seda palju vaja muuta. DMA -heli demost, millest see tuli, on funktsioonid mikrofoni või liini sisenditele üleminekuks, nii et saate neid funktsioone vajadusel kasutada.

Heli süntees

Helisünteesi toimimise kirjeldamiseks loetlen kõik arenduses kasutatud helimudelid, mis viisid lõpliku meetodini, sest see annab teile aimu, miks seda tehakse nii, nagu seda tehakse.

1. meetod: iga stringi jaoks arvutatakse üks siinusväärtuste periood selle stringi noodile vastaval sagedusel ja salvestatakse massiivi. Näiteks on massiivi pikkuseks näidiste siinuslaine periood, mis võrdub proovide arvuga tsükli kohta. Kui diskreetimissagedus on 48 kHz ja noodisagedus on 100 Hz, siis on tsükli kohta 48 000 proovi sekundis ja 100 tsüklit sekundis, mille tulemuseks on 4800 proovi ja massiivi pikkus on 4800 proovi ning see sisaldab ühe täieliku väärtust siinuslaine periood. Stringi esitamisel täidetakse heliproovide puhver, võttes siinusmassiivist väärtuse ja pannes selle prooviks helipuhvrisse, suurendades seejärel indeksit siinusmassiivi, nii et kasutades meie eelmist näidet 4800 proovist pannakse üks siinuslaine tsükkel helipuhvrisse. Massiiviindeksil kasutatakse modulo -operatsiooni, nii et see jääb alati 0 ja pikkuse vahele ning kui massiivi indeks ületab teatud läve (näiteks võib -olla 2 sekundi väärtuses proove), lülitatakse string välja. Mitme stringi korraga esitamiseks jälgige iga stringide massiiviindeksit eraldi ja lisage iga proovi saamiseks iga stringide siinuslaine väärtus.

2. meetod: Muusikalisema tooni loomiseks alustame eelmisest mudelist ja lisame igale põhisagedusele harmoonilised. Harmoonilised sagedused on sagedused, mis on põhisageduse täisarvulised kordsed. Erinevalt kahe sõltumatu sageduse summeerimisest, mille tulemusel esitatakse samaaegselt kahte erinevat heli, kõlab harmoonikute liitmisel see endiselt ühe helina, kuid erineva tooniga. Selle saavutamiseks lisame iga kord heliproovile siinuslaine väärtuse asukohas (massiiviindeksi % massiivi pikkus), samuti (2 * massiiviindeksi % massiivi pikkus) ja (3 * massiiviindeksi % massiivi pikkus) ja nii edasi, kui palju harmoonilisi soovitakse. Need korrutatud indeksid läbivad siinuslaine sagedustel, mis on algse sageduse täisarvulised kordsed. Tooni paremaks kontrollimiseks korrutatakse iga harmoonilise väärtused muutujaga, mis esindab selle harmoonilise kogust helis. Näiteks võib siinuse põhilaine väärtused korrutada 6 -ga, et muuta see üldise heli teguriks, samal ajal kui viiendal harmoonil võib olla kordaja 1, mis tähendab, et selle väärtused aitavad üldist heli palju vähem.

Meetod 3: Olgu, nii et nüüd on meil nootidel väga kena toon, kuid siiski on üsna oluline probleem: need mängivad kindla helitugevusega kindla aja jooksul. Et kõlada nagu päris instrument, peaks mängitava stringi helitugevus aja jooksul sujuvalt vähenema. Selle saavutamiseks täidetakse massiiv eksponentsiaalselt laguneva funktsiooni väärtustega. Nüüd, kui heliproove luuakse, arvutatakse igast stringist tulev heli nagu eelmisel meetodil, kuid enne heliproovile lisamist korrutatakse see selle stringide massiiviindeksi väärtusega eksponentsiaalse lagunemise funktsioonide massiivis. See muudab heli aja jooksul sujuvalt hajutatuks. Kui massiivi indeks jõuab lagunemismassiivi lõppu, peatatakse string.

Meetod 4: see viimane samm annab stringide helidele tõeliselt realistliku kõla. Enne kõlasid nad meeldivalt, kuid olid selgelt sünteesitud. Reaalse harfi stringi paremaks jäljendamiseks on igale harmoonikule määratud erinev lagunemiskiirus. Tegelikes stringides on stringi esmakordsel löömisel kõrge sagedusega harmooniliste sisaldus, mis loob sellise kitkumise heli, mida me stringilt ootame. Need kõrgsageduslikud harmoonilised on väga lühidalt põhiosa helist, kõlav keel kõlab, kuid aeglasemate harmooniliste võimul olles nad lagunevad väga kiiresti. Iga helisünteesis kasutatava harmoonilise arvu jaoks luuakse lagunemismassiiv, igaühel on oma lagunemiskiirus. Nüüd saab iga harmoonilise iseseisvalt korrutada väärtusega, mis on selle vastaval lagunemismassiivil stringi massiiviindeksis, ja lisada helile.

Üldiselt on helisüntees intuitiivne, kuid arvutamine raske. Kogu keelheli korraga mällu salvestamine võtaks liiga palju mälu, kuid siinuslaine ja eksponentsiaalfunktsiooni arvutamine iga kaadri vahel võtaks liiga kaua aega, et olla kursis heli taasesituse kiirusega. Arvutamise kiirendamiseks kasutatakse koodis mitmeid trikke. Kogu matemaatika, välja arvatud siinus- ja eksponentsiaalse lagunemise tabelite esialgne loomine, toimub täisarvuvormingus, mis nõuab 24 -bitises heliväljundis olemasoleva numbrilise ruumi laiali jaotamist. Näiteks siinuslaua amplituud on 150, nii et see on sile, kuid mitte nii suur, et paljud koos mängitavad stringid võivad olla rohkem kui 24 bitti. Samamoodi korrutatakse eksponentsiaalse tabeli väärtused 80 -ga, enne kui ümardatakse täisarvudeks ja salvestatakse. Harmoonilised kaalud võivad võtta diskreetseid väärtusi vahemikus 0 kuni 10. Ka kõik proovid kahekordistuvad ja siinuslained indekseeritakse 2 -ga, vähendades tegelikult proovivõtu sagedust poole võrra. See piirab maksimaalset esitatavat sagedust, kuid oli vajalik, et praegust keelte ja harmooniliste arvu piisavalt kiiresti arvutada.

Selle helimudeli loomine ja selle tööle saamine nõudis protsessori poolel märkimisväärseid jõupingutusi ning selle projekti aja jooksul oleks olnud uskumatult raske seda fpga poolel nullist tööle panna (kujutage ette, et peate bitivoo iga kord uuesti looma Heli testimiseks muudeti verilogi tükk). Fpga -ga tegemine võib aga tõenäoliselt olla parem viis selle tegemiseks, kõrvaldades tõenäoliselt probleemi, et proovid ei saa piisavalt kiiresti välja arvutada ja võimaldada rohkem stringe, harmoonilisi ja isegi heliefekte või muid ülesandeid. protsessori pool.

6. samm: andurite ühendamine

Andurite ühendamine
Andurite ühendamine

Stringide loomiseks kasutasime IR -katkestusandureid, mis tuvastavad stringi esitamise. Tellisime oma andurid järgmiselt lingilt. Anduritel on toite-, maandus- ja andmejuhe, samal ajal kui kiirgajatel on ainult toite- ja maandusjuhe. Me kasutasime nii kiirgajate kui ka andurite toiteks PMOD -päiste 3,3 V ja maanduspistikuid. Kõigi andurite ja kiirgajate toiteks on vaja kõik andurid ja kiirgur paralleelselt ühendada. Andurite andmejuhtmed peavad kumbki minema oma pmod -tihvti juurde.

7. samm: skeleti ehitamine

Skeleti ehitamine
Skeleti ehitamine

Harfi kuju loomiseks kasutatakse neid kolme tükki luustikuna andurite ja kiirgajate paigutamiseks. Joondage ühel kahest 18 -tollise PVC -toru tükist andurid ja kiirgurid vahelduvas järjekorras 1,5 tolli kaugusel üksteisest ja kleepige need seejärel torule. Teise 18 -tollise PVC toru puhul joondage andurid ja kiirgurid vahelduvas järjekorras, kuid veenduge, et need oleksid järjekorras nihutatud (st kui esimesel torul oli esmalt andur, peaks teisel olema emitter ja vastupidi). Andmete, toite- ja maandusjuhtmete külge on vaja joota pikemad juhtmed, et tagada nende jõudmine plaadile.

8. samm: puidust välisilme ehitamine

Puidust välisilme ehitamine
Puidust välisilme ehitamine

See samm on valikuline, kuid väga soovitatav. Puidust välispind ei muuda harfi mitte ainult kenaks, vaid kaitseb ka andureid ja juhtmeid kahjustuste eest. Puitraami saab luua puidust püha ristkülikukujulise rõnga abil. Ristküliku siseküljel peab olema ava vähemalt 1-1/2 tolli, et see sobiks toru ja anduri karkassiga. Kui raam on konstrueeritud, puurige kaks auku, mis lasevad andurilt ja kiirgajatelt juhtmed välja, et need plaadiga ühendada.

*Märkus. Soovitatav on lisada juurdepääsupunktid, et saaksite eemaldada ja sisestada toru karkassi juhuks, kui on vaja remonti teha või kergeid muudatusi teha.

9. samm: kõik tükid kokku panna

Kõigi tükkide kokku panemine
Kõigi tükkide kokku panemine

Kui kõik eelnevad sammud on lõpetatud, on aeg harf ehitada. Esmalt asetage torustik puidust välispinna sisse. Seejärel ühendage andurite ja kiirgajate juhtmed tahvli õigesse kohta. Seejärel avage SDK ja klõpsake tahvli programmeerimiseks silumisnuppu. Kui plaat on programmeeritud, ühendage kõrvaklapid või kõlar. Sõltuvalt sellest, milline andur millisesse pmod -porti jõuab, on teie harfi keelpillid tõenäoliselt korrast ära. Kuna võib olla raske öelda, milline juhe millisele andurile läheb, kui nii palju juhtmeid on kaasatud, lisasime viisi stringide numbrite kaardistamiseks, et katkestada tarkvara bitipositsioonid. Otsige üles "staatiline int sensor_map [NUM_STRINGS]" ja reguleerige massiivi väärtusi, kuni stringid esitatakse järjestuses madalaimast kõrgeimani.

Menüüd saab kasutada jadaterminali (nt RealTerm) avamisega ja edastuskiiruseks 115200 ning kuvarile ANSI. Menüüs saab liikuda, kasutades üles ja alla liikumiseks klahve w ja s ning väärtuste muutmiseks klahve a ja d.

Samm 10: ROCK OUT

Kui harf on täielikult töökorras. Õppige harfi ja kuulake oma muusika magusat heli!

Soovitan: