Mundarija:
- 1 -qadam: nazariya
- 2 -qadam: Tarkibi va asboblari
- 3 -qadam: simlar va uskunalarni sozlash
- 4 -qadam: VHDL -ni sozlash (Vivado)
- 5 -qadam: Kodni yuklab olish
Video: Basys3 FPGA raqamli audio sintezatori: 5 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:28
Bu sinus to'lqinli raqamli klaviatura sintezatori klaviatura singari bir necha lahzali kalitlar orqali foydalanuvchi ma'lumotlarini oladi va karnay orqali ovoz to'lqinini chiqaradi. Foydalanuvchi ma'lumotlariga asoslanib, qurilma C4 dan C6 gacha turli chastotali sinus to'lqinlarni hosil qiladi. Foydalanuvchi C4 dan C6 gacha bo'lgan yozuvlarni kiritishi mumkin (jami 25 ta eslatma) va bir vaqtning o'zida to'rtta tugmacha - agar to'rtdan ortiq tugma bosilsa, eng past to'rtta tovush ijro etiladi.
Bu loyihani Rayan Morris va Mavis Tsoy bizning Cal Poly CPE 133 raqamli dizayn darsi uchun qilishdi:)
1 -qadam: nazariya
FPGA kartasi faqat raqamli signallarni chiqarishi mumkin. Boshqacha aytganda, u faqat yuqori (3,3V) yoki past (0V) kuchlanishni ishlab chiqarishi mumkin. Shu bilan birga, audio signallar analog bo'lib, ular kuchlanishning cheksiz ko'p o'sishiga ega bo'lishi mumkin. Buning oldini olish uchun biz analog to'lqinni taqlid qilish uchun PWM (puls kengligi modulyatsiyasi) signalidan foydalanamiz. Agar siz PWM nima ekanligini bilmasangiz, buni tekshirib ko'ring:
2 -qadam: Tarkibi va asboblari
- Vivado o'rnatilgan kompyuter
- Biz Vivado 2017.2 versiyasidan foydalanamiz
- Basys3 FPGA kengashi
- 25 SPDT chegara kalitlari (biz ulardan foydalanganmiz)
- 30 ta o'tish simlari (bir uchi erkak, ikkinchi uchi muhim emas), 12 dyuym
- Tel kesgichlar
- Tel -chiziqlar
- Lehimlash uchun zaxira simlar
- Qatronli yadroli lehim
- Lehimlash temir
- ¼”ayol audio uyasi
- Kuchaytirgich/karnay
- Kalitlarni o'rnatish uchun biror narsa (biz protoboard + yog'och qutidan foydalanganmiz)
3 -qadam: simlar va uskunalarni sozlash
Tizim arxitekturasi
1 -rasmga qarang: 25 ta kirish → Basys3 Board → kuchaytirgich va karnay.
Chiqish
2 -rasmga qarang: Basys3 taxtasi → 1/2 Ayollar uchun audio raz'em → Karnay (kuchaytirgich bilan)
Kiritish
Basys3 platasidagi pmod ulanishlari past kirishni ko'rish uchun erga ulangan bo'lishi kerak va agar ochiq zanjir sifatida qoldirilsa, u to'g'ri ishlamaydi. Shuning uchun biz barcha eslatma kalitlari uchun SPDT kalitlaridan foydalanishimiz kerak. SPDT kaliti asosan foydalanuvchiga bosilganda kontaktlarning zanglashiga o'tishga imkon beradi, shuning uchun biz ularni "tugmalarimiz" sifatida Basys3 kartasiga past (0V) yoki yuqori (3.3V) signallarni kiritish uchun ishlatamiz.
Har bir kalitda 3.3V ga ulangan NO (odatda ochiladigan) terminali, GND ga ulangan NC (odatda yopiq) terminali va FPGA kirishiga ulangan COM (umumiy) terminali bo'ladi. 3 -rasmga qarang.
Bizda 25 ta chegara kalitlari borligi sababli, ularning barchasi umumiy 3.3V va umumiy GND liniyalarini ulashadi. Keyin, har bir cheklovchining signal chizig'i 8 kishilik guruhlarga bo'linadi va biz o'rnatadigan monumental tartibsizlikni minimallashtirish uchun zipli o'tish simlari yordamida Basys3 platasidagi pmod ulanishlariga ulanadi. Qarang: 4 -rasm yoki birinchi sakkizta kalit.
4 -qadam: VHDL -ni sozlash (Vivado)
Sinus to'lqin generatori va PWM generatori bizning kontseptsiyamiz ishlaganiga ishonch hosil qilish uchun avval sinovdan o'tkazildi, so'ngra kirish cheklovchisi va amplitudali yig'uvchi/almashtirgich birlashtirildi. Har bir jarayon blokining funktsiyasi va kirish -chiqishining tafsilotlari rasmda ko'rsatilgan. Kod quyida ko'rsatilgan, lekin VHD va txt fayllari sifatida biriktirilgan. Agar nomuvofiqliklar bo'lsa, VHD fayllari bilan o'ting.
BTW: biz, ehtimol, chiziqlarimizni qisqartirishimiz kerak edi, lekin Instructables -ga kodni joylashtirish ham juda zerikarli bo'lib chiqdi, shuning uchun intervallar eng katta emas va sintaksisni ajratib ko'rsatish yo'q. Agar sizda Vivado bo'lsa va kodga amal qilmoqchi bo'lsangiz, faylni yuklab olishni tavsiya qilamiz.
Birinchidan, sinus to'lqin generatori modulini ko'rib chiqaylik.
kutubxona IEEE; IEEE. STD_LOGIC_1164. ALL dan foydalaning; IEEE. NUMERIC_STD. ALL dan foydalaning; Wave_Generator - bu Port (Trigger: STD_LOGIC da; - Freq_Cnt tugmachasini bosing: STD_LOGIC_VECTOR da (15 pastga 0); - Hisoblagich qiymati = 100 MGts / (Eslatma Chastotasi*64 to'lqin bo'linmalari) (dumaloqdan eng yaqin raqamgacha) - qayta nomlangan Frequ wavegenCLK dan: STD_LOGIC da; - Basys3 100MHz CLK WaveOut: STD_LOGIC_VECTORdan tashqarida (9 pastga 0gacha)); - Wave_Generator to'lqin uchining imzolangan amplitudasi; arxitektura Wave_Generatorning xulq -atvori i: tamsayılar oralig'i 0 dan 64 gacha: = 0; -memory_type tipidagi amplitudali xotira indeksi -64 dan 63 gacha bo'lgan butun sonli qator (0 dan 63 gacha); - amplitudali qiymatlarni saqlash uchun xotira bankini (ROM) yarating- bu RAM yoki ROMni qiziqtiradimi … signal amplitudasi: memory_type: = (0, 7, 13, 19, 25, 30, 35, 40, 45, 49, 52, 55, 58, 60, 62, 63, 63, 63, 62, 60, 58, 55, 52, 49, 45, 40, 35, 30, 25, 19, 13, 7, 0, -7, -13, -19, -25, -30, -35, -40, -45, -49, -52, -55, -58, -60, -62, -63, -63, -63, -62, - 60, -58, -55, -52, -49, -45, -40, -35, -30, -25, -19, -13, -7); - sinus to'lqinni boshlash jarayonining amplitudali xotira banki (wavegenCLK, Trigger) o'zgarmaydigan hisoblagich: unsigned (15 dan 0 gacha): = to_unsigned (0, 16); - Count1 nomidan qayta nomlangan soatni ajratuvchi hisoblagichi, agar (ko'tarilish_hajmi (wavegenCLK)), keyin (Trigger = '1') bo'lsa,- tugmachasi bosiladi: = taymer + 1; if (counter = unsigned (Freq_Cnt)) then - Freq_Cnt = 100Mhz / (sinus to'lqinning chastotasi * 64 bo'linmasiga e'tibor bering) - hisoblagichni qayta o'rnating va chiqish hisoblagichiga amplitudali ma'lumotlarni tayinlang: = to_unsigned (0, 16); WaveOut <= STD_LOGIC_VECTOR (to_signed (amplituda (i), 10)); - keyingi o'qish uchun i oshishi i <= i + 1; - agar i sinus to'lqin tugallansa, i ni tiklash (i = 63), keyin i <= 0; tugatish, agar; tugatish, agar; - (counter = unsigned (Freq_Cnt)) else- tugma bosilmaydi- chiqishni, amplitudali indeksni va WaveOut taymerini qayta o'rnatish <= "0000000000"; i <= 0; hisoblagich: = to_unsigned (0, 16); -chiqish amplitudasi = -64, hech qanday eslatma ijro etilmaganda tugaydi, agar; - (Trigger = '1') agar tugasa; - (ko'tarilish_ qirrasi (CLK)) tugatish jarayoni; xulq -atvorni tugatish;
Biz ichki soat va ROM yordamida Basys3 da raqamli sinus to'lqin hosil qilamiz. Bu ROM sinus to'lqinda 64 amplitudani ifodalovchi 64 qiymatni saqlaydi. 1 -rasmga qarang. Biz ishlatadigan 64 qiymat sinus to'lqinni juda yaxshi aniqlikda taqlid qiladi.
Ichki soat yordamida biz soat tezligini kerakli to'lqin chastotasiga bo'linadigan qiymatga hisoblaymiz va 64: Clk div = 100MHz / (Freq * 64) Har safar hisoblagichimiz bu qiymatga etib kelganida, biz raqamni chaqiramiz. ROM va uni to'lqin generatori modulidan yuboring. Bizning to'lqin chastotasi bu amplitudalarning qanchalik tez chaqirilishiga bog'liq bo'ladi.
Bizda 25 ta kichik modul bo'ladi, ularning har biri bitta chastota/eslatma bilan bog'liq.
Sinus to'lqin generatori modullarini chaqiradigan kodning qolgan qismi:
kutubxona IEEE; IEEE. STD_LOGIC_1164. ALL dan foydalaning; IEEE. NUMERIC_STD. ALL dan foydalaning; Two_Octave_Synth - bu port (CLK: STD_LOGIC da; O4: STD_LOGIC_VECTOR da (11 dan 0 gacha); O5: STD_LOGIC_VECTOR da (12 pastga 0 ga); chiqish: STD_LOGICga); tugatish Two_Octave_Synth; Two_Octave_Synth arxitekturasi Wave_Generator komponentidir Port (Trigger: STD_LOGIC da; Freq_Cnt: STD_LOGIC_VECTOR da (15 pastga 0); wavegenCLK: STD_LOGIC; WaveOut: tashqarida STD_LOGIC_VECTOR); oxirgi komponent; --------------------------- to'lqin generatoridan chiqish signallari ------------------ ----- signal WaveC4, WaveCs4, WaveD4, WaveDs4, WaveE4, WaveF4, WaveFs4, WaveG4, WaveGs4, WaveA4, WaveAs4, WaveB4, WaveC5, WaveCs5, WaveD5, Wave5, Wave5, Wave5, WaveAs5, WaveB5, WaveC6: imzolangan (9 dan 0 gacha); -------------------------------- eslatma tanlash mantig'i uchun -------------- ------ signal C4, Cs4, D4, Ds4, E4, F4, Fs4, G4, Gs4, A4, As4, B4, C5, Cs5, D5, Ds5, E5, F5, Fs5, G5, Gs5, A5, As5, B5, C6: imzosiz (4 pastdan 0gacha); signal cntC4, cntCs4, cntD4, cntDs4, cntE4, cntF4, cntFs4, cntG4, cntGs4, cntA4, cntAs4, cntB4, cntC5, cntCs5, cntD5, cntDs5, cntE5, cntF5, cntFs5, cntG5, cntGs5, cntA5, cntAs5, cntB5, cntC6: imzosiz (4 dan 0 gacha); signal xatosi: STD_LOGIC; ----------------------------------- sinus to'lqinlarni qo'shish uchun ----------- --------------- signal to'lqin0, to'lqin1, to'lqin2, to'lqin3: imzolangan (9 pastga 0); -WaveSum to'lqin generatori modulining chiqish signalidan signallar: STD_LOGIC_VECTOR (9 pastga 0gacha); -sinus to'lqinlarining yig'indisi uchun signal (2 -ning 512 dan 511 gacha) ijobiy signal to'lqinlari: STD_LOGIC_VECTOR (9 dan 0 gacha); -0 dan 1023 gacha imzolanmagan, PWM generatorida foydalanish uchun ----------------------------------- PWM ishlab chiqarish uchun ------------------------------ signal ping_length: imzosiz (9 dan 0 gacha): = imzosiz (ijobiyWaveSum); --signal off_length: imzosiz (0 dan 0 gacha): = to_unsigned (127, 7) -imzosiz (WAVE); signal PWM: imzosiz (9 pastga 0): = to_unsigned (0, 10); boshlash Note_C4: Wave_Generator port xaritasi (Trigger => O4 (0), Freq_Cnt => X "1755", wavegenCLK => CLK, imzolangan (WaveOut) => WaveC4); --5973, 261.63 Hz Note_Cs4: Wave_Generator port xaritasi (Trigger => O4 (1), Freq_Cnt => X "1606", wavegenCLK => CLK, imzolangan (WaveOut) => WaveCs4);-5638, 277.18 Hz Note_D4: Wave_Generator port xaritasi (Trigger => O4 (2), Freq_Cnt => X "14C9", wavegenCLK => CLK, imzolangan (WaveOut) => WaveD4); --5321, 293.66 Hz Note_Ds4: Wave_Generator port xaritasi (Trigger => O4 (3), Freq_Cnt => X "139F", wavegenCLK => CLK, imzolangan (WaveOut) => WaveDs4);-5023, 311.13 Hz Note_E4: Wave_Generator port xaritasi (Trigger => O4 (4), Freq_Cnt => X "1285", wavegenCLK => CLK, imzolangan (WaveOut) => WaveE4); --4741, 329.63 Hz Note_F4: Wave_Generator port xaritasi (Trigger => O4 (5), Freq_Cnt => X "117B", wavegenCLK => CLK, imzolangan (WaveOut) => WaveF4); --4475, 349.23 Hz Note_Fs4: Wave_Generator port xaritasi (Trigger => O4 (6), Freq_Cnt => X "1080", wavegenCLK => CLK, imzolangan (WaveOut) => WaveFs4);-4224, 369.99 Hz Note_G4: Wave_Generator port xaritasi (Trigger => O4 (7), Freq_Cnt => X "0F92", wavegenCLK => CLK, imzolangan (WaveOut) => WaveG4); --3986, 392.00 Hz Note_Gs4: Wave_Generator port xaritasi (Trigger => O4 (8), Freq_Cnt => X "0EB3", wavegenCLK => CLK, imzolangan (WaveOut) => WaveGs4);-3763, 415.30 Hz Note_A4: Wave_Generator port xaritasi (Trigger => O4 (9), Freq_Cnt => X "0DE0", wavegenCLK => CLK, imzolangan (WaveOut) => WaveA4); --3552, 440.00 Hz Note_As4: Wave_Generator port xaritasi (Trigger => O4 (10), Freq_Cnt => X "0D18", wavegenCLK => CLK, imzolangan (WaveOut) => WaveAs4);-3352, 466.16 Hz Note_B4: Wave_Generator port xaritasi (Trigger => O4 (11), Freq_Cnt => X "0C5C", wavegenCLK => CLK, imzolangan (WaveOut) => WaveB4); --3164, 493.88 Gts -------------------------------------------- -------------------------------------------------- --------------------------- Note_C5: Wave_Generator port xaritasi (Trigger => O5 (0), Freq_Cnt => X "0BAB", wavegenCLK => CLK, imzolangan (WaveOut) => WaveC5); --2987, 523.25 Hz Note_Cs5: Wave_Generator port xaritasi (Trigger => O5 (1), Freq_Cnt => X "0B03", wavegenCLK => CLK, imzolangan (WaveOut) => WaveCs5);-2819, 554.37 Hz Note_D5: Wave_Generator port xaritasi (Trigger => O5 (2), Freq_Cnt => X "0A65", wavegenCLK => CLK, imzolangan (WaveOut) => WaveD5); --2661, 587.33 Hz Note_Ds5: Wave_Generator port xaritasi (Trigger => O5 (3), Freq_Cnt => X "09D0", wavegenCLK => CLK, imzolangan (WaveOut) => WaveDs5);-2512, 622.25 Hz Note_E5: Wave_Generator port xaritasi (Trigger => O5 (4), Freq_Cnt => X "0943", wavegenCLK => CLK, imzolangan (WaveOut) => WaveE5); --2371, 659.25 Hz Note_F5: Wave_Generator port xaritasi (Trigger => O5 (5), Freq_Cnt => X "08Be", wavegenCLK => CLK, imzolangan (WaveOut) => WaveF5); --2238, 698.46 Hz Note_Fs5: Wave_Generator port xaritasi (Trigger => O5 (6), Freq_Cnt => X "0840", wavegenCLK => CLK, imzolangan (WaveOut) => WaveFs5);-2112, 739.99 Hz Note_G5: Wave_Generator port xaritasi (Trigger => O5 (7), Freq_Cnt => X "07CA", wavegenCLK => CLK, imzolangan (WaveOut) => WaveG5); --1994, 783.99 Hz Note_Gs5: Wave_Generator port xaritasi (Trigger => O5 (8), Freq_Cnt => X "075A", wavegenCLK => CLK, imzolangan (WaveOut) => WaveGs5);-1882, 830.61 Hz Note_A5: Wave_Generator port xaritasi (Trigger => O5 (9), Freq_Cnt => X "06F0", wavegenCLK => CLK, imzolangan (WaveOut) => WaveA5); --1776, 880.00 Hz Note_As5: Wave_Generator port xaritasi (Trigger => O5 (10), Freq_Cnt => X "068C", wavegenCLK => CLK, imzolangan (WaveOut) => WaveAs5);-1676, 932.33 Hz Note_B5: Wave_Generator port xaritasi (Trigger => O5 (11), Freq_Cnt => X "062E", wavegenCLK => CLK, imzolangan (WaveOut) => WaveB5); --1582, 987.77 Hz Note_C6: Wave_Generator port xaritasi (Trigger => O5 (12), Freq_Cnt => X "05D6", wavegenCLK => CLK, imzolangan (WaveOut) => WaveC6); --1494, 1046,5 Hz ------------ eslatma tanlash mantig'i ------------ C4 <= "0000" & O4 (0); Cs4 <= "0000" va O4 (1); D4 <= "0000" va O4 (2); Ds4 <= "0000" & O4 (3); E4 <= "0000" va O4 (4); F4 <= "0000" va O4 (5); Fs4 <= "0000" & O4 (6); G4 <= "0000" va O4 (7); Gs4 <= "0000" & O4 (8); A4 <= "0000" va O4 (9); As4 <= "0000" & O4 (10); B4 <= "0000" va O4 (11); C5 <= "0000" va O5 (0); Cs5 <= "0000" va O5 (1); D5 <= "0000" va O5 (2); Ds5 <= "0000" & O5 (3); E5 <= "0000" va O5 (4); F5 <= "0000" va O5 (5); Fs5 <= "0000" & O5 (6); G5 <= "0000" va O5 (7); Gs5 <= "0000" & O5 (8); A5 <= "0000" va O5 (9); As5 <= "0000" & O5 (10); B5 <= "0000" & O5 (11); C6 <= "0000" & O5 (12); cntC4 <= C4; cntCs4 <= C4 + Cs4; cntD4 <= C4 + Cs4 + D4; cntDs4 <= C4 + Cs4 + D4 + Ds4; cntE4 <= C4 + Cs4 + D4 + Ds4 + E4; cntF4 <= C4 + Cs4 + D4 + Ds4 + E4 + F4; cntFs4 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4; cntG4 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4; cntGs4 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4; cntA4 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4; cntAs4 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4; cntB4 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4 + B4; cntC5 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4 + B4 + C5; cntCs5 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4 + B4 + C5 + Cs5; cntD5 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4 + B4 + C5 + Cs5 + D5; cntDs5 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4 + B4 + C5 + Cs5 + D5 + Ds5; cntE5 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4 + B4 + C5 + Cs5 + D5 + Ds5 + E5; cntF5 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4 + B4 + C5 + Cs5 + D5 + Ds5 + E5 + F5; cntFs5 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4 + B4 + C5 + Cs5 + D5 + Ds5 + E5 + F5 + Fs5; cntG5 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4 + B4 + C5 + Cs5 + D5 + Ds5 + E5 + F5 + Fs5 + G5; cntGs5 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4 + B4 + C5 + Cs5 + D5 + Ds5 + E5 + F5 + Fs5 + G5 + Gs5; cntA5 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4 + B4 + C5 + Cs5 + D5 + Ds5 + E5 + F5 + Fs5 + G5 + Gs5 + A5; cntAs5 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4 + B4 + C5 + Cs5 + D5 + Ds5 + E5 + F5 + Fs5 + G5 + Gs5 + A5 + As5; cntB5 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4 + B4 + C5 + Cs5 + D5 + Ds5 + E5 + F5 + Fs5 + G5 + Gs5 + A5 + As5 + B5; cntC6 <= C4 + Cs4 + D4 + Ds4 + E4 + F4 + Fs4 + G4 + Gs4 + A4 + As4 + B4 + C5 + Cs5 + D5 + Ds5 + E5 + F5 + Fs5 + G5 + Gs5 + A5 + As5 + B5 + C6; Tanlash: jarayon (WaveC4, WaveCs4, WaveD4, WaveDs4, WaveE4, WaveF4, WaveFs4, WaveG4, WaveGs4, WaveA4, WaveAs4, WaveB4, WaveC5, WaveCs5, WaveD5, Wave5 Wave, 5, Wave5, WaveB5, WaveC6) agar boshlanadi (cntC6 = "00000") keyin --------------- agar signallar ishlab chiqarilmasa Wave0 <= "0000000000"; To'lqin1 <= "0000000000"; To'lqin2 <= "0000000000"; To'lqin3 <= "0000000000"; aks holda (O4 (0) = '1'), keyin ------------------- eslatma C4 o'ynadi to'lqin0 to'lqin0 to'lqin1 xato to'lqin0 to'lqin1 to'lqin2 xato to'lqin0 to'lqin1 to'lqin2 to'lqin3 xato to'lqin0 to'lqin1 Wave2 Wave3 xato to'lqin0 Wave1 Wave2 Wave3 xato Wave0 Wave1 Wave2 Wave3 error Wave0 Wave1 Wave2 Wave3 error Wave0 Wave1 Wave2 Wave3 error Wave0 Wave1 Wave2 Wave3 Wave3 Wave1 Wave2 Wave2 Wave2 Wave2 Wave2 Wave2 To'lqin2 to'lqin3 xato to'lqin0 to'lqin2 to'lqin3 to'lqin2 to'lqin2 to'lqin2 to'lqin2 to'lqin2 to'lqin2 to'lqin2 to'lqin2 to'lqin2 to'lqin2 to'lqin2 to'lqin2 to'lqin2 to'lqin = WaveC6; To'lqin1 <= "0000000000"; To'lqin2 <= "0000000000"; To'lqin3 to'lqin1 <= to'lqinC6; To'lqin2 <= "0000000000"; To'lqin3 To'lqin2 <= To'lqinC6; Wave3 Wave3 xatosi Wave1 <= "0000000000"; To'lqin2 <= "0000000000"; To'lqin3 to'lqin2 <= "0000000000"; Wave3 Wave3 xatosi <= '1'; oxirgi holat; tugatish, agar; tugatish, agar; jarayonni tugatish; ------------- sinus to'lqin qo'shuvchi -------------------- WaveSum <= STD_LOGIC_VECTOR (to'lqin0 + to'lqin1 + to'lqin2 + to'lqin3); --------- sinus to'lqinni pwm uchun ijobiy qilish --------------------- musbatWaveSum <= WaveSum (9) va WaveSum (8 dan 0gacha); ------------- PWM generatori --------------------- jarayon (CLK)-o'zgarmaydiganlar soni: imzosiz (1 dan 0 gacha): = to_unsigned (0, 2); boshlang, agar (ko'tarilish_ qirrasi (CLK)) keyin --count: = count + 1; --if (hisoblash = to_unsigned (4, 2)) keyin --count: = to_unsigned (0, 2); -if (PWM = to_ if (PWM <ping_length), keyin chiqish <= '1'; aks holda chiqish <= '0'; agar tugasa; PWM <= PWM + 1; ping_length <= imzosiz (pozitiv WaveSum);- agar; tugatish agar; jarayonni tugatish; xulq -atvorni tugatish;
Loyihaning eng qiyin qismi to'rtta chastotani tanlashdir. Biz buni lotta IF so'zlari bilan qildik va jarayonni simulyatsiya qilish va disk raskadrovka qilish uchun o'zgaruvchilar o'rniga signallardan foydalandik. Biz o'zgaruvchilar va FOR ko'chadan yordamida boshqa usullarni sinab ko'rdik, lekin ish vaqtida xatolarga yo'l qo'ydik. Shunday qilib, oxirida, agar u ishlayotgan bo'lsa, uni yolg'iz qoldirishga qaror qildik. Buzilmagan amiritni tuzatmaysizmi?
To'rt chiqish to'lqini Wave0, Wave1, Wave2, Wave3 deb nomlangan - bu yakuniy chiqishni yaratish uchun qo'shiladi.
Kodga qarasangiz, siz C4, Cs4, D4, Ds4 va boshqalarni o'z ichiga olgan signallarni ko'rasiz. Bu 5 bitli signal bo'lib, ular O4 (oktava 4) yoki O5 (oktava 5) dan mos keladigan tetikni oladi va ularni bajaradi. Qo'shish uchun 5 bit.
Keyinchalik cntC4, cntCs4 va boshqalar o'zgaruvchilari maqsadli notadan pastroq bo'lgan nechta notalar, shu jumladan maqsadli eslatmani ko'rsatadi. Masalan, agar C4, E4, G4, A#4 va D5 ijro etilsa (C9 akkord) cntC4 1 bo'ladi, cntE4 2 bo'ladi, cntG4 3 bo'ladi va hokazo.
So'ngra, har safar nota ijro etilganda, nota signalini qayerga yopishtirish kerakligi aniqlanadi. Masalan, agar D5 notasi ijro etilsa (bu O5 (2) baland degan ma'noni anglatadi) va cntD5 3 bo'lsa, hozirda D5dan pastroq 2 nota bilan 3 ta nota ijro etilmoqda, shuning uchun biz D5 to'lqinini Wave2 ga bog'laymiz (uchinchi to'lqin) to'lqindan signallarni hisoblash0). Shu bilan bir qatorda, agar cntD5 5 bo'lsa, hozirda 5 ta nota o'ynalmoqda, D5dan pastroq 4 ta nota, shuning uchun biz faqat waveD5ni osib qo'yamiz va u bilan hech narsa qilmaymiz.
Agar IF bayonotlari barcha 25 ta eslatmani ko'rib chiqish uchun takrorlanadi.
Amplitudali qo'shuvchi
Eng past 4 to'lqin tanlangach, biz ularni bir -biriga qo'shishimiz kerak. Biz birgalikda faqat to'rtta eslatmani qo'shishimizning sababi shundaki, biz ishlab chiqarishda ishlatadigan PWM g'oyasi faqat PWM juda sekin ishlamaguncha va karnay PWM kvadrat to'lqinini qabul qila boshlaguncha ma'lum o'lchamlarga ega bo'lishi mumkin. Misol uchun, agar biz 8192 (13 bit) piksellar sonini ishlatadigan bo'lsak, bu 8192 nuqtaning har biri bort soatining ko'tarilgan chetiga to'g'ri kelishi kerak. Shunday qilib, 100 MGts / 8192 = 12,2 kHz, bu odamlarning eshitish doirasiga juda mos keladi.
Amplitudalarning qo'shilishi juda oddiy, siz uning juda tez ishlashiga ishonch hosil qilishingiz kerak.
PWM chiqishi
PWMning ish aylanishi bizning chiqish to'lqinining amplitudasini ko'rsatadi. Misol uchun, agar biz 0 dan 128 gacha amplitudali diapazonga ega bo'lsak, 0 - 0%ish tsikli, 64 - 50%, 128 - 100%va hokazo. Bu PWM juda tez ishlaydi (bizniki 97,6 kHz), shunchalik tezki, karnay individual kvadrat to'lqinlarni taniy olmaydi va uning o'rniga "kuchlanish" signalini yaratib, o'rtacha kuchlanishga qaraydi.
Cheklovlar fayli
Siz apparatingizni boshqacha ulashgan bo'lishingiz mumkin, shuning uchun cheklovlar faylining mos kelishiga ishonch hosil qiling.
5 -qadam: Kodni yuklab olish
Quyida Vivado uchun.txt formatidagi va.vhd kodi. Wave_Generator-to'lqin generatorining pastki moduli, va Two_Octave_Synth-hamma narsaning eng yuqori moduli.
Tavsiya:
Arpeggiing sintezatori (chivin I): 6 qadam
Arpeggiating sintezatori (Mosquito I): Mosquito I - bu Arduino Nano va Mozzi tovush sintezi kutubxonasidan foydalanadigan kichik arpejli sintezator. U yigirma sakkiz bosqichli ketma-ketlikni o'ynashi mumkin, lekin siz xohlaganingizcha ko'p shaxsiy ketma-ketlikni qo'shishingiz mumkin. O'rnatish nisbatan sodda va bajarilmaydi
MakeyMakey va Scratch bilan suv sintezatori: 6 qadam (rasmlar bilan)
MakeyMakey va Scratch yordamida suv sintezatori: MakeyMakey -dan foydalanib, turli materiallarni kalitlarga yoki tugmalarga aylantirish va shu tariqa kompyuterda harakatlar yoki tovushlarni ishga tushirish ajoyib ishdir. Qaysi material kuchsiz oqim impulsini o'tkazishini bilib oladi va men bilan tajriba o'tkazishi mumkin
Wii Nunchuck sintezatori: 4 qadam
Wii Nunchuck sintezatori: Wii musiqasi olami: men nihoyat musiqaga bo'lgan muhabbatimni so'nggi bir necha yil ichida to'plagan dasturiy tajribam bilan birlashtirishga qaror qildim. Men Tod Machoning nutqini ko'rganimdan beri o'z asbobimni yaratishga qiziqib qoldim
Arduino MIDI Chiptune sintezatori: 7 qadam (rasmlar bilan)
Arduino MIDI Chiptune sintezatori: 8-bitli chiptun sintezatori yordamida kompyuter o'yinlarining dastlabki musiqasini zavqlantirib, MIDI-ni har qanday zamonaviy DAW dasturidan boshqarish mumkin. 8910 dasturlashtiriladigan ovozli avlod
Raqamli va ikkilik soat 8 raqamli X 7 segmentli LED displeyda: 4 qadam (rasmlar bilan)
Raqamli va ikkilik soat 8 ta raqamli X 7 segmentli LED displeyda: Bu mening raqamli & 8 dyuymli x 7 segmentli LED displey yordamida ikkilik soat. Men odatiy qurilmalar, xususan, soatlar uchun yangi xususiyatlar berishni yaxshi ko'raman va bu holda ikkilik soat uchun 7 segmentli displeydan foydalanish noan'anaviy va