Мазмұны:

Basys3 FPGA сандық дыбыс синтезаторы: 5 қадам
Basys3 FPGA сандық дыбыс синтезаторы: 5 қадам

Бейне: Basys3 FPGA сандық дыбыс синтезаторы: 5 қадам

Бейне: Basys3 FPGA сандық дыбыс синтезаторы: 5 қадам
Бейне: Basys 3 Introduction 2024, Шілде
Anonim
Image
Image
Basys3 FPGA сандық дыбыс синтезаторы
Basys3 FPGA сандық дыбыс синтезаторы
Basys3 FPGA сандық дыбыс синтезаторы
Basys3 FPGA сандық дыбыс синтезаторы

Бұл цифрлық синусоидты пернетақта синтезаторы пайдаланушыға пернетақта сияқты орнатылған қосқыштар арқылы кіріс енгізеді және дыбыс толқынын динамик арқылы шығарады. Пайдаланушылардың енгізулеріне сүйене отырып, құрылғы С4 -тен С6 -ға дейінгі әр түрлі жиіліктегі синусоиды толқындарды шығарады. Пайдаланушы C4 -тен C6 -ға дейінгі жазбаларды енгізе алады (барлығы 25 нота), және бір мезгілде төрт пернеге дейін - егер төрт пернені бассаңыз, ең төменгі төрт дыбыс ойнатылады.

Бұл жобаны Райан Моррис пен Мавис Цой біздің Cal Poly CPE 133 цифрлық дизайн сабағы үшін жасады:)

1 -қадам: Теория

FPGA тақтасы тек сандық сигналдарды шығара алады. Басқаша айтқанда, ол тек жоғары (3,3В) кернеуді немесе төмен (0В) кернеуді шығара алады. Алайда, дыбыстық сигналдар аналогты болып табылады және кернеуде шексіз көптеген қадамдарға ие болуы мүмкін. Бұған жол бермеу үшін біз аналогтық толқынға еліктеу үшін PWM (импульстік ені модуляциясы) сигналын қолданамыз. Егер сіз PWM деген не екенін білмесеңіз, мынаны қараңыз:

2 -қадам: ингредиенттер мен құралдар

  • Vivado орнатылған компьютер
  • Біз Vivado 2017.2 нұсқасын қолданатын боламыз
  • Basys3 FPGA тақтасы
  • 25 SPDT шектеулі қосқыштары (біз оларды қолдандық)
  • 30 секіргіш сымдар (бір ұшы еркек, екінші ұшы маңызды емес), 12 дюйм
  • Сым кескіштер
  • Сымды тазартқыштар
  • Дәнекерлеуге арналған қосалқы сым
  • Шайыр-өзек дәнекері
  • Пісіру темірі
  • ¼ »әйел дыбыс ұясы
  • Күшейткіш/динамик
  • Қосқыштарды қосатын нәрсе (біз протободы + ағаш қорапты қолдандық)

3 -қадам: сымдар мен жабдықты орнату

Сымдар мен жабдықты орнату
Сымдар мен жабдықты орнату
Сымдар мен жабдықты орнату
Сымдар мен жабдықты орнату
Сымдар мен жабдықты орнату
Сымдар мен жабдықты орнату

Жүйелік архитектура

1 суретті қараңыз: 25 қол жетімді кіріс → Basys3 тақтасы → күшейткіш пен динамик.

Шығу

2 -суретті қараңыз: Basys3 тақтасы → 1/2 дюймдік аудио ұяшы → динамик (күшейткішпен)

Енгізу

Basys3 тақтасындағы pmod қосылымдары төмен кірісті көру үшін жерге қосылуы керек және ашық тізбек ретінде қалса дұрыс жұмыс істемейді. Осыған байланысты, біз барлық нота кілттері үшін SPDT қосқыштарын қолдануға мәжбүрміз. SPDT қосқышы пайдаланушыға басылған кезде тізбектер арасында ауысуға мүмкіндік береді, сондықтан біз оларды Basys3 тақтасына төмен (0В) немесе жоғары (3.3V) сигналдарды енгізу үшін «түймелер» ретінде қолданамыз.

Әрбір коммутаторда 3.3В -ға қосылған NO (қалыпты ашылатын) терминалы, GND -ге қосылған NC (қалыпты жабық) терминалы және FPGA кірісіне қосылған COM (ортақ) терминалы болады. 3 суретті қараңыз.

Бізде 25 шектік қосқыш болғандықтан, олардың барлығы ортақ 3.3В желісі мен ортақ GND желісін бөліседі. Содан кейін, әр шектік қосқыштан келетін сигнал желісі 8 топқа біріктіріліп, біз жасайтын монументалды шатасуды азайту үшін қысылатын өтпелі сымдардың көмегімен Basys3 тақтасындағы pmod қосылымдарына қосылады. 4 -суретті немесе алғашқы сегіз кілттің мысалын қараңыз.

4 -қадам: VHDL орнату (Vivado)

VHDL орнату (Vivado)
VHDL орнату (Vivado)
VHDL орнату (Vivado)
VHDL орнату (Vivado)

Синусонды генератор мен PWM генераторы біздің тұжырымдамамыздың жұмыс істейтініне көз жеткізу үшін алдымен сыналды, содан кейін кіріс шектегіші мен амплитудалық қосқыш/ауыстырғыш біріктірілген. Әрбір технологиялық блоктың функциясы мен енгізу -шығару мәліметтері суретте көрсетілгендей. Код төменде көрсетілген, сонымен қатар VHD және txt файлдары ретінде тіркелген. Егер сәйкессіздіктер болса, VHD файлдарымен бірге жүріңіз.

BTW: бәлкім, біз өз жолдарымызды қысқартуға тиіспіз, бірақ Instructables -ке кодты енгізу де тітіркендіргіш болып шықты, сондықтан интервал ең үлкен емес және синтаксисті бөлектеу жоқ. Егер сізде Vivado болса және кодты ұстанғыңыз келсе, біз сізге файлды жүктеп алуды ұсынамыз.

Алдымен синус толқын генераторының модулін қарастырайық.

IEEE кітапханасы; IEEE. STD_LOGIC_1164. ALL пайдаланыңыз; IEEE. NUMERIC_STD. ALL қолданыңыз; Wave_Generator нысаны - бұл порт (Триггер: STD_LOGIC -те; - Freq_Cnt пернесін басу: STD_LOGIC_VECTOR ішінде (15 төмен 0); - Санау мәні = 100МГц / (Ескерту жиілігі*64 толқынның бөлімдері) (дөңгелек ең жақын санға дейін) - аты өзгертілді Freq wavegenCLK -тен: STD_LOGIC -те; - Basys3 100MHz CLK WaveOut: STD_LOGIC_VECTOR -дан (0 -ге дейін 9 төмен)); - Wave_Generator толқынының қол қойылған амплитудасы; сәулет Wave_Generator -тің мінез -құлқы - бұл сигнал i: 0 -ден 64 -ке дейінгі бүтін сандар: = 0; -memory_type типті амплитудалық жады индексі -64 -тен 63 -ке дейінгі бүтін диапазондағы массив (0 -ден 63 -ке дейін); - амплитудалық мәндерді сақтау үшін жад банкін (ROM) жасаңыз- бұл жедел жады немесе ROM-ды таң қалдырады ма? сигнал амплитудасы: 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); - синусоидалық толқынды бастау процесінің амплитудалық жады банкі (wavegenCLK, Trigger) айнымалы есептегіш: белгісіз (15 төмен 0 дейін): = to_unsigned (0, 16); - count1 деп өзгертілген сағат бөлгіш есептегіші, егер (көтерілу жиегі (wavegenCLK)) if if (Trigger = '1'), онда- пернетақта басылады: = counter + 1; if (counter = unsigned (Freq_Cnt)) then - Freq_Cnt = 100Mhz / (жиілік * синусоиданың 64 бөліміне назар аударыңыз) - есептегішті қалпына келтіріңіз және шығыс санауышына амплитудалық деректерді тағайындаңыз: = to_unsigned (0, 16); WaveOut <= STD_LOGIC_VECTOR (to_signed (амплитудасы (i), 10)); - келесі оқылым үшін i қадамы i <= i + 1; - егер бір синусоидалық толқын аяқталған болса, i қалпына келтіру (i = 63), онда i <= 0; егер аяқталса; егер аяқталса; - (counter = unsigned (Freq_Cnt)) else- перне басылмайды- шығуды, амплитудалық индексті және WaveOut есептегішін қалпына келтіру <= «0000000000»; мен <= 0; санауыш: = to_unzigned (0, 16); -шығыс амплитудасы = -64, егер нота ойнатылмаса, соңы; - (Trigger = '1') end, if; - (көтерілу жиегі (CLK)) аяқталу процесі; мінез -құлықты тоқтату;

Біз Basys3 -те ішкі сағатты және ROM -ды қолдану арқылы цифрлық синусоиданы құрамыз. Бұл ROM синус толқынында 64 амплитудасын көрсететін 64 мәнді сақтайды. 1 -суретті қараңыз. Біз қолданатын 64 мән синусоиды жақсы ажыратымдылықпен имитациялайды.

Ішкі сағатты қолдана отырып, біз қажет жылдамдыққа сәйкес келетін толқын жиілігін көрсететін мәнді есептейміз және 64: Clk div = 100MHz / (Frequ * 64) Біздің санауыш осы мәнге жеткен сайын біз нөмірді шақырамыз. ROM және оны толқын генераторы модулінен жіберіңіз. Біздің толқынның жиілігі бұл амплитудаларды қаншалықты тез атайтынымызға байланысты болады.

Бізде әрқайсысы бір жиілікпен/нотамен байланысты 25 қосалқы модуль болады.

Міне, синус толқын генераторының модульдерін шақыратын кодтың қалған бөлігі:

IEEE кітапханасы; IEEE. STD_LOGIC_1164. ALL пайдаланыңыз; IEEE. NUMERIC_STD. ALL қолданыңыз; Two_Octave_Synth нысаны - бұл порт (CLK: STD_LOGIC; O4: STD_LOGIC_VECTOR (11 төмен 0); O5: STD_LOGIC_VECTOR (12 төменге 0); шығу: STD_LOGIC); аяқтау Two_Octave_Synth; архитектура Two_Octave_Synth компоненті болып табылады Wave_Generator - бұл порт (триггер: STD_LOGIC; Freq_Cnt: STD_LOGIC_VECTOR (15 төмен 0); wavegenCLK: STD_LOGIC; WaveOut: STD_LOGIC_VECTOR) (9 төмен) соңғы компонент; --------------------------- толқын генераторынан шығатын сигналдар ------------------ ----- сигнал WaveC4, WaveCs4, WaveD4, WaveDs4, WaveE4, WaveF4, WaveFs4, WaveG4, WaveGs4, WaveA4, WaveAs4, WaveB4, WaveC5, WaveCs5, WaveD5, WaveDs5, Wave5, Wave5. WaveAs5, WaveB5, WaveC6: қол қойылған (9 төмен 0); -------------------------------- жазбаны таңдау логикасы үшін -------------- ------ сигнал 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: белгісіз (4 төменге 0); 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 сигнал: белгісіз (4 төменге 0); сигнал қатесі: STD_LOGIC; ----------------------------------- синус толқындарын қосу үшін ----------- --------------- сигнал Wave0, Wave1, Wave2, Wave3: қол қойылған (9 төменге 0); -толқын генераторы модулінің шығыс сигналынан сигналдар WaveSum: STD_LOGIC_VECTOR (9 төмен 0); -синусызды толқындар үшін сигнал (2 комплименті -512 -511) оң сигнал WaveSum: STD_LOGIC_VECTOR (9 төмен 0); -0-ден 1023-ке дейін қол қойылмаған, PWM генераторында пайдалану үшін ----------------------------------- PWM генерациялау үшін ------------------------------- сигналдың ping_length: белгісіз (0-ден 9-ға дейін): = белгісіз (оңды WaveSum); -сигналдың өшіру ұзындығы: белгісіз (0 төмен қарай 6): = қол қойылмаған (127, 7) -белгісіз (WAVE); сигнал PWM: белгісіз (9 төмен 0): = to_unzigned (0, 10); бастау Note_C4: Wave_Generator порт картасы (Trigger => O4 (0), Freq_Cnt => X «1755», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveC4); --5973, 261.63 Гц Note_Cs4: Wave_Generator порт картасы (Trigger => O4 (1), Freq_Cnt => X «1606», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveCs4);-5638, 277.18 Гц Note_D4: Wave_Generator порт картасы (Trigger => O4 (2), Freq_Cnt => X «14C9», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveD4); --5321, 293.66 Гц Note_Ds4: Wave_Generator порт картасы (Trigger => O4 (3), Freq_Cnt => X «139F», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveDs4);-5023, 311.13 Гц Note_E4: Wave_Generator порт картасы (Trigger => O4 (4), Freq_Cnt => X «1285», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveE4); --4741, 329.63 Гц Note_F4: Wave_Generator порт картасы (Trigger => O4 (5), Freq_Cnt => X «117B», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveF4); --4475, 349.23 Гц Note_Fs4: Wave_Generator порт картасы (Trigger => O4 (6), Freq_Cnt => X «1080», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveFs4);-4224, 369.99 Гц Note_G4: Wave_Generator порт картасы (Trigger => O4 (7), Freq_Cnt => X «0F92», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveG4); --3986, 392.00 Гц Note_Gs4: Wave_Generator порт картасы (Trigger => O4 (8), Freq_Cnt => X «0EB3», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveGs4);-3763, 415.30 Гц Note_A4: Wave_Generator порт картасы (Trigger => O4 (9), Freq_Cnt => X «0DE0», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveA4); --3552, 440.00 Гц Note_As4: Wave_Generator порт картасы (Trigger => O4 (10), Freq_Cnt => X «0D18», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveAs4);-3352, 466.16 Гц Note_B4: Wave_Generator порт картасы (Trigger => O4 (11), Freq_Cnt => X «0C5C», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveB4); --3164, 493.88 Гц -------------------------------------------- -------------------------------------------------- --------------------------- Note_C5: Wave_Generator порт картасы (Trigger => O5 (0), Freq_Cnt => X «0BAB», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveC5); --2987, 523.25 Гц Note_Cs5: Wave_Generator порт картасы (Trigger => O5 (1), Freq_Cnt => X «0B03», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveCs5);-2819, 554.37 Гц Note_D5: Wave_Generator порт картасы (Trigger => O5 (2), Freq_Cnt => X «0A65», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveD5); --2661, 587.33 Гц Note_Ds5: Wave_Generator порт картасы (Trigger => O5 (3), Freq_Cnt => X «09D0», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveDs5);-2512, 622.25 Гц Note_E5: Wave_Generator порт картасы (Trigger => O5 (4), Freq_Cnt => X «0943», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveE5); --2371, 659.25 Гц Note_F5: Wave_Generator порт картасы (Trigger => O5 (5), Freq_Cnt => X «08Be», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveF5); --2238, 698.46 Гц Note_Fs5: Wave_Generator порт картасы (Trigger => O5 (6), Freq_Cnt => X «0840», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveFs5);-2112, 739.99 Гц Note_G5: Wave_Generator порт картасы (Trigger => O5 (7), Freq_Cnt => X «07CA», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveG5); --1994, 783.99 Гц Note_Gs5: Wave_Generator порт картасы (Trigger => O5 (8), Freq_Cnt => X «075A», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveGs5);-1882, 830.61 Гц Note_A5: Wave_Generator порт картасы (Trigger => O5 (9), Freq_Cnt => X «06F0», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveA5); --1776, 880.00 Гц Note_As5: Wave_Generator порт картасы (Trigger => O5 (10), Freq_Cnt => X «068C», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveAs5);-1676, 932.33 Гц Note_B5: Wave_Generator порт картасы (Trigger => O5 (11), Freq_Cnt => X «062E», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveB5); --1582, 987.77 Гц Note_C6: Wave_Generator порт картасы (Trigger => O5 (12), Freq_Cnt => X «05D6», wavegenCLK => CLK, қол қойылған (WaveOut) => WaveC6); --1494, 1046,5 Гц ------------ жазбаны таңдау логикасы ------------ C4 <= «0000» & O4 (0); Cs4 <= «0000» & O4 (1); D4 <= «0000» & O4 (2); Ds4 <= «0000» & O4 (3); E4 <= «0000» & O4 (4); F4 <= «0000» & O4 (5); Fs4 <= «0000» & O4 (6); G4 <= «0000» & O4 (7); Gs4 <= «0000» & O4 (8); A4 <= «0000» & O4 (9); As4 <= «0000» & O4 (10); B4 <= «0000» & O4 (11); C5 <= «0000» & O5 (0); Cs5 <= «0000» & O5 (1); D5 <= «0000» & O5 (2); Ds5 <= «0000» & O5 (3); E5 <= «0000» & O5 (4); F5 <= «0000» & O5 (5); Fs5 <= «0000» & O5 (6); G5 <= «0000» & O5 (7); Gs5 <= «0000» & O5 (8); A5 <= «0000» & 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; Таңдау: процесс (WaveC4, WaveCs4, WaveD4, WaveDs4, WaveE4, WaveF4, WaveFs4, WaveG4, WaveGs4, WaveA4, WaveAs4, WaveB4, WaveC5, WaveCs5, WaveD5, Wave5 Wave, 5, Wave5. WaveB5, WaveC6) басталады, егер (cntC6 = «00000»), содан кейін --------------- егер сигнал жасалмаса Wave0 <= «0000000000»; Толқын1 <= «0000000000»; Wave2 <= «0000000000»; Wave3 <= «0000000000»; әйтпесе (O4 (0) = '1') онда ------------------- C4 ойыны Wave0 Wave0 Wave1 қатесі Wave0 Wave1 Wave2 қатесі Wave0 Wave1 Wave2 Wave3 Wave0 Wave1 қатесі ойнады Wave2 Wave3 қате Wave0 Wave1 Wave2 Wave3 қате Wave0 Wave1 Wave2 Wave3 қате Wave0 Wave1 Wave2 Wave3 қате Wave0 Wave1 Wave2 Wave3 қате Wave0 Wave1 Wave2 Wave3 қате Wave0 Wave1 Wave2 Wave3 қате Wave0 Wave1 Wave2 Wave3 қате Wave0 Wave1 Wave2 Wave3 қате Wave0 Wave1 Wave2 Wave3 қате Wave0 Wave1 Wave2 Wave3 қатесі Wave0 Wave1 Wave2 Wave3 қатесі Wave0 Wave1 Wave2 Wave3 қатесі Wave0 Wave1 Wave2 Wave3 қатесі Wave0 Wave1 Wave2 Wave3 error Wave0 Wave1 Wave3 Wave3 Wave3 Wave1 Wave2 Wave2 Wave2 Wave2 Wave2 Wave2 = WaveC6; Толқын1 <= «0000000000»; Wave2 <= «0000000000»; Wave3 Wave1 <= WaveC6; Wave2 <= «0000000000»; Wave3 Wave2 <= WaveC6; Wave3 Wave3 қатесі Wave1 <= «0000000000»; Wave2 <= «0000000000»; Wave3 Wave2 <= «0000000000»; Wave3 Wave3 қатесі <= '1'; соңғы жағдай; егер аяқталса; егер аяқталса; процесті аяқтау; ------------- синусоидты қосқыш -------------------- WaveSum <= STD_LOGIC_VECTOR (Wave0 + Wave1 + Wave2 + Wave3); --------- синусоиданы pwm үшін оң етеді); ------------- PWM генераторы --------------------- процесс (CLK)-айнымалы санау: белгісіз (1 төмен 0): = қол қойылмаған (0, 2); бастаңыз, егер (жоғарылау_шеті (CLK)) онда --сана: = санау + 1; --if (count = to_unsigned (4, 2)) then --count: = to_unsigned (0, 2); --if (PWM = to_ if (PWM <ping_length) болса, онда шығыс <= '1'; әйтпесе шығыс <= '0'; егер аяқталса; PWM <= PWM + 1; ping_length <= белгісіз (оңды WaveSum);-соңы if; end if; end процесс; end behavioral;

4 Ескерту селекторы Бұл жобаның ең қиын бөлігі - тек төрт жиілікті таңдау. Біз мұны лотта IF мәлімдемелерімен жасадық және процесті модельдеуге және жөндеуге болатындай айнымалылардың орнына сигналдарды қолдандық. Біз айнымалылар мен FOR ілмектерін қолдана отырып, басқа әдістерді қолдандық, бірақ жұмыс уақытында қателерге тап болдық. Ақырында, егер ол жұмыс істесе, оны жалғыз қалдырамыз деп шештік. Амирит бұзылмаған нәрсені түзетпейсіз бе?

Төрт шығыс толқыны Wave0, Wave1, Wave2, Wave3 деп белгіленген - бұл соңғы нәтижені қалыптастыру үшін қосылады.

Кодқа қарасаңыз, сіз C4, Cs4, D4, Ds4 және т.б. белгісі бар сигналдарды көресіз. Бұл 5 биттік сигналдар, олар О4 (октава 4) немесе О5 (октава 5) сәйкес триггерін алады және оларды жасайды Қосуға арналған 5 биттік.

Әрі қарай, cntC4, cntCs4 және т.б айнымалылар мақсатты нотадан төмен қанша нота ойнағанын көрсетеді. Мысалы, егер C4, E4, G4, A#4 және D5 ойналса (C9 аккорды) cntC4 1 болады, cntE4 2 болады, cntG4 3 болады және т.б.

Содан кейін, нота ойнатылған сайын, нота сигналының қайда ілінетінін білу үшін мақсатты нотаның саны тексеріледі. Мысалы, егер D5 нотасы ойналса (бұл O5 (2) жоғары дегенді білдіреді) және cntD5 3 болса, онда қазіргі уақытта 3 нота ойнатылады, оның ішінде 2 нотасы D5 -тен төмен, сондықтан біз D5 толқынын Wave2 -ге қосамыз (үшінші толқын) толқыннан сигналдарды санау0). Сонымен қатар, егер cntD5 5 болса, онда қазіргі уақытта 5 нота ойнатылып жатыр, оның ішінде D5 -тен төмен 4 нотасы бар, сондықтан біз waveD5 ілулі тұрамыз және онымен ештеңе жасамаймыз.

IF мәлімдемелері барлық 25 ескертулерге қатысты жағдайларды жабу үшін қайталанады.

Amplitude Adder

Ең төменгі 4 толқын таңдалғаннан кейін біз оларды біріктіруіміз керек. Біз тек төрт жазбаны қосатын себебіміз, біз шығаратын PWM идеясы PWM өте баяу жұмыс істемейынша және динамик PWM шаршы толқынын қабылдай бастағанға дейін белгілі бір ажыратымдылыққа ие болуы мүмкін. Мысалы, егер біз 8192 (13 бит) ажыратымдылықты қолданатын болсақ, онда сол 8192 нүктенің әрқайсысы борттық сағаттың көтерілетін жиегіне сәйкес келуі керек. Сонымен, 100 МГц / 8192 = 12,2 кГц, бұл адамның есту қабілетіне жақын.

Амплитудалардың нақты қосылуы өте қарапайым, сіз оның өте жылдам жұмыс істейтініне көз жеткізуіңіз керек.

PWM шығысы

PWM -дің жұмыс циклы біздің шығу толқынының амплитудасын көрсетеді. Мысалы, егер бізде 0 -ден 128 -ге дейінгі амплитудалық диапазон болса, 0 - 0%жұмыс циклы, 64 - 50%, 128 - 100%және т. динамик жеке шаршы толқындарды танымайды, керісінше орташа кернеуге қарап, біздің «аналогты» сигналды жасайды.

Шектеулер файлы

Сіз өзіңіздің аппараттық құралыңызды басқаша қосқан боларсыз, сондықтан шектеулер файлының сәйкес келетініне көз жеткізіңіз.

5 -қадам: кодты жүктеу

Төменде Vivado үшін.txt форматындағы және.vhd форматындағы код бар. Wave_Generator-толқын генераторының қосалқы модулі, ал Two_Octave_Synth-қалғаны бар жоғарғы модуль.

Ұсынылған: