Orodha ya maudhui:

Synthesizer ya Sauti ya Basys3 FPGA: Hatua 5
Synthesizer ya Sauti ya Basys3 FPGA: Hatua 5

Video: Synthesizer ya Sauti ya Basys3 FPGA: Hatua 5

Video: Synthesizer ya Sauti ya Basys3 FPGA: Hatua 5
Video: Jifunze kutofautisha Sauti ya Kwanza,Ya Pili na ya Tatu katika Uimbaji. 2024, Julai
Anonim
Image
Image
Synthesizer ya Sauti ya Basys3 FPGA
Synthesizer ya Sauti ya Basys3 FPGA
Synthesizer ya Sauti ya Basys3 FPGA
Synthesizer ya Sauti ya Basys3 FPGA

Synthesizer hii ya dijiti ya sine ya dijiti itachukua pembejeo za watumiaji kupitia safu ya swichi za kitambo zilizowekwa kama kibodi na kutoa wimbi la sauti kupitia spika. Kulingana na pembejeo za mtumiaji, kifaa kitazalisha mawimbi ya sine ya masafa anuwai kutoka C4 hadi C6. Mtumiaji anaweza kuingiza noti kutoka C4 hadi C6 (jumla ya noti 25), na hadi funguo nne kwa wakati mmoja - ikiwa funguo zaidi ya nne zimebanwa, tani nne za chini kabisa zitachezwa.

Mradi huu ulifanywa na Ryan Morris na Mavis Tsoi kwa darasa letu la Cal Poly CPE 133 Digital Design:)

Hatua ya 1: Nadharia

Bodi ya FPGA inaweza kutoa tu ishara za dijiti. Kwa maneno mengine, inaweza tu kutoa voltage ya juu (3.3V) au voltage ya chini (0V). Walakini, ishara za sauti ni analog na zinaweza kuwa na nyongeza nyingi kwa voltage. Ili kuzunguka hii, tutatumia ishara ya PWM (mwendo wa upana wa mapigo) kuiga wimbi la analog. Ikiwa haujui PWM ni nini, angalia hii:

Hatua ya 2: Viunga na Zana

  • Kompyuta na Vivado imewekwa
  • Tutatumia toleo la Vivado 2017.2
  • Bodi ya FPGA ya Basys3
  • Mabadiliko 25 ya Kikomo cha SPDT (tulitumia hizi)
  • Waya 30 za kuruka (mwisho mmoja kiume, mwisho mwingine haijalishi), inchi 12
  • Wakata waya
  • Vipande vya waya
  • Vipuri waya kwa soldering
  • Solder ya msingi wa resin
  • Chuma cha kulehemu
  • Jack”sauti ya kike jack
  • Amplifier / spika
  • Kitu cha kuweka swichi (tulitumia protoboard + sanduku la mbao)

Hatua ya 3: Usanidi wa waya na vifaa

Wiring & Usanidi wa Vifaa
Wiring & Usanidi wa Vifaa
Wiring & Usanidi wa Vifaa
Wiring & Usanidi wa Vifaa
Wiring & Usanidi wa Vifaa
Wiring & Usanidi wa Vifaa

Usanifu wa Mfumo

Tazama Mchoro 1:25 pembejeo zinazopatikana → Bodi ya Basys3 → kipaza sauti na spika.

Pato

Tazama Kielelezo 2: Bodi ya Basys3 → 1/2 Jack ya Sauti ya Kike → Spika (na Amplifier)

Ingizo

Uunganisho wa pmod kwenye bodi ya Basys3 lazima iunganishwe na ardhi ili kuona uingizaji wa chini na haitafanya kazi vizuri ikiwa imeachwa kama mzunguko wazi. Kwa sababu ya hii, lazima tutumie swichi za SPDT kwa vitufe vyetu vyote vya kumbuka. Kubadilisha SPDT kimsingi inaruhusu mtumiaji kubadili kati ya mizunguko wakati wa kubanwa, kwa hivyo tutayatumia kama "vifungo" vyetu kuingiza ishara za chini (0V) au za juu (3.3V) kwa bodi ya Basys3.

Kila ubadilishaji hautakuwa na kituo cha NO (kawaida hufunguliwa) kilichounganishwa na 3.3V, NC (kawaida imefungwa) terminal iliyounganishwa na GND, na kituo cha COM (kawaida) kilichounganishwa na ingizo la FPGA. Angalia Kielelezo 3.

Kwa sababu tuna swichi 25 za kikomo, zote zitashiriki laini ya kawaida ya 3.3V na laini ya kawaida ya GND. Halafu, laini ya ishara kutoka kwa kila ubadilishaji wa kikomo itakusanywa katika vikundi vya 8 na kushikamana na viunganisho vya pmod kwenye bodi ya Basys3 kwa kutumia waya za kuruka za zipu ili kupunguza fujo kubwa tutakalofanya. Angalia Kielelezo 4 au mfano wa funguo nane za kwanza.

Hatua ya 4: Usanidi wa VHDL (Vivado)

Usanidi wa VHDL (Vivado)
Usanidi wa VHDL (Vivado)
Usanidi wa VHDL (Vivado)
Usanidi wa VHDL (Vivado)

Jenereta ya mawimbi ya sine na jenereta ya PWM ilijaribiwa kwanza ili kuhakikisha dhana yetu inafanya kazi, basi kikomo cha pembejeo na kiongezaji cha amplitude kilijumuishwa. Maelezo ya kazi na I / O ya kila mchakato wa kuzuia ni kama inavyoonyeshwa kwenye Kielelezo. Nambari imeonyeshwa hapa chini, lakini pia imeambatishwa kama faili za VHD na txt. Ikiwa kuna tofauti, nenda na faili za VHD.

BTW: labda tunapaswa kuwa tumefanya mistari yetu kuwa fupi lakini upachikaji wa nambari kwenye Maagizo pia ilikasirisha sana kushughulikia, kwa hivyo nafasi sio kubwa zaidi na hakuna mwangaza wa sintaksia. Ikiwa una Vivado na ungependa kufuata kificho, tunapendekeza sana upakue faili.

Kwanza, wacha tuangalie moduli ya Sine Wave Generator.

tumia IEEE. STD_LOGIC_1164. ALL; tumia IEEE. NUMERIC_STD. ALL; chombo Wave_Generator ni Bandari (Trigger: katika STD_LOGIC; - Bonyeza kitufe Freq_Cnt: katika STD_LOGIC_VECTOR (15 chini ya 0); - Thamani ya kukanusha = 100MHz / (Kumbuka Mzunguko * Mgawanyiko 64 wa Mganda wa Sine) (pande zote hadi nambari ya karibu) - imepewa jina kutoka kwa wimbi la FreqCLK: katika STD_LOGIC; - Basys3 100MHz CLK WaveOut: nje STD_LOGIC_VECTOR (9 downto 0)); - Saini ya amplitude ya Wave_Generator ya mwisho wa wimbi; Tabia ya usanifu wa Wave_Generator ni ishara i: nambari kamili 0 hadi 64: = 0; - faharisi ya aina ya kumbukumbu ya kiwango cha benki aina ya kumbukumbu ni aina (0 hadi 63) ya nambari kamili -64 hadi 63; - tengeneza benki ya kumbukumbu (ROM) kushikilia viwango vya amplitude - je! hii ni RAM au ROM inashangaa tu … amplitude ya ishara: 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, -63, -62, - 60, -58, -55, -52, -49, -45, -40, -35, -30, -25, -19, -13, -7); - benki ya kumbukumbu ya amplitude ya mchakato wa kuanza kwa wimbi la sine (wavegenCLK, Trigger) counter counter: unsigned (15 downto 0): = to_unsigned (0, 16); - kaunta ya saa, iliyobadilishwa jina kutoka kwa hesabu1 inaanza ikiwa (rising_edge (wavegenCLK)) basi ikiwa (Trigger = '1') basi - kitufe ni taabu counter: = counter + 1; ikiwa (counter = unsigned (Freq_Cnt)) basi - Freq_Cnt = 100Mhz / (kumbuka freq * 64 mgawanyiko wa wimbi la sine) - rekebisha counter na upe data ya amplitude kwa counter counter: = to_unigned (0, 16); WaveOut <= STD_LOGIC_VECTOR (to_signed (amplitude (i), 10)); - nyongeza i ya kusoma ijayo i <= i + 1; - weka upya ikiwa wimbi moja la sine limekamilika ikiwa (i = 63) basi i <= 0; mwisho ikiwa; mwisho ikiwa; - (counter = unsigned (Freq_Cnt)) kingine - kitufe hakijashinikizwa - kuweka upya pato, faharisi ya amplitude, na counter WaveOut <= "0000000000"; i <= 0; kaunta: = to_unigned (0, 16); - Pato la Ukubwa = -64 wakati hakuna kumbuka inayochezwa inaisha ikiwa; - (Trigger = '1') mwisho ikiwa; - (rising_edge (CLK)) mchakato wa mwisho; mwisho Tabia;

Tutazalisha wimbi la dijiti kwenye Basys3 kwa kutumia saa ya ndani na ROM. ROM hii itahifadhi maadili 64 ambayo yanawakilisha amplitudes 64 kwenye wimbi la sine. Tazama Mchoro 1. Maadili 64 tunayotumia kuiga wimbi la sine na azimio zuri sana.

Kutumia saa ya ndani, tunahesabu kwa thamani inayowakilisha kasi ya saa iliyogawanywa na masafa ya wimbi tunalotaka na 64: Clk div = 100MHz / (Freq * 64) Kila wakati kaunta yetu inapofikia thamani hiyo, tunaita nambari kutoka ROM na tuma hiyo kutoka kwa moduli yetu ya jenereta ya mawimbi. Mzunguko wa wimbi letu utategemea jinsi tunavyoita hizi amplitudes haraka.

Tutakuwa na moduli ndogo 25, kila moja ikihusishwa na masafa / dokezo moja.

Hapa kuna nambari iliyobaki inayoita moduli za Sine Wave Generator:

tumia IEEE. STD_LOGIC_1164. ALL; tumia IEEE. NUMERIC_STD. ALL; chombo Two_Octave_Synth is Port (CLK: in STD_LOGIC; O4: in STD_LOGIC_VECTOR (11 downto 0); O5: in STD_LOGIC_VECTOR (12 downto 0); pato: nje STD_LOGIC); mwisho mbili_Octave_Synth; Tabia ya usanifu wa Two_Octave_Synth ni sehemu Wave_Generator ni Port (Trigger: in STD_LOGIC; Freq_Cnt: in STD_LOGIC_VECTOR (15 downto 0); wavegenCLK: in STD_LOGIC; WaveOut: nje STD_LOGIC_VECTOR (9 downto 0)); sehemu ya mwisho; --------------------------- ishara za pato kutoka kwa jenereta ya mawimbi ------ ----- ishara WaveC4, WaveCs4, WaveD4, WaveDs4, WaveE4, WaveF4, WaveFs4, WaveG4, WaveGs4, WaveA4, WaveAs4, WaveB4, WaveC5, WaveCs5, WaveD5, WaveDs5, WaveE5, WaveF5, WaveFs5, WaveG5, WaveGs5, Wave WaveAs5, WaveB5, WaveC6: saini (9 chini ya 0); -------------------------------- kwa mantiki ya uteuzi wa maandishi ------------ ------ ishara 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: haijasainiwa (4 chini ya 0); ishara cntC4, cntCs4, cntD4, cntDs4, cntE4, cntF4, cntFs4, cntG4, cntGs4, cntA4, cntAs4, cntB4, cntC5, cntCs5, cntD5, cntDs5, cntE5, cnt5, cnt5, cnt5, cnt5, cnt5: haijasainiwa (4 chini ya 0); kosa la ishara: STD_LOGIC; ----------------------------------- kwa kuongeza mawimbi ya sine ----------- --------------- ishara Wave0, Wave1, Wave2, Wave3: saini (9 chini ya 0); - ishara kutoka kwa ishara ya moduli ya jenereta ya Wimbi WaveSum: STD_LOGIC_VECTOR (9 chini ya 0); - ishara ya mawimbi ya sine yaliyofupishwa (pongezi ya 2 -512 hadi 511) ishara chanyaWaveSum: STD_LOGIC_VECTOR (9 downto 0); - imewekwa 0 hadi 1023, kwa matumizi ya jenereta ya PWM ---------------------------------- ------------------------- - saini ya mbali_saini: haijasainiwa (6 chini ya 0): = kwa_kusainiwa (127, 7) - haijasainiwa (WAVE); ishara PWM: haijasainiwa (9 chini ya 0): = to_unigned (0, 10); anza Kumbuka_C4: Ramani ya bandari ya Wave_Generator (Trigger => O4 (0), Freq_Cnt => X "1755", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveC4); - 5973, 261.63 Hz Kumbuka_Cs4: Ramani ya bandari ya Wave_Generator (Trigger => O4 (1), Freq_Cnt => X "1606", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveCs4); - 5638, 277.18 Hz Kumbuka_D4: Ramani ya bandari ya Wave_Generator (Trigger => O4 (2), Freq_Cnt => X "14C9", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveD4); -5321, 293.66 Hz Kumbuka_Ds4: Ramani ya bandari ya Wave_Generator (Trigger => O4 (3), Freq_Cnt => X "139F", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveDs4); - 5023, 311.13 Hz Kumbuka_E4: Ramani ya bandari ya Wave_Generator (Trigger => O4 (4), Freq_Cnt => X "1285", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveE4); --4741, 329.63 Hz Kumbuka_F4: Ramani ya bandari ya Wave_Generator (Trigger => O4 (5), Freq_Cnt => X "117B", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveF4); -4475, 349.23 Hz Kumbuka_Fs4: Ramani ya bandari ya Wave_Generator (Trigger => O4 (6), Freq_Cnt => X "1080", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveFs4); - 4224, 369.99 Hz Kumbuka_G4: Ramani ya bandari ya Wave_Generator (Trigger => O4 (7), Freq_Cnt => X "0F92", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveG4); - 3986, 392.00 Hz Kumbuka_Gs4: Ramani ya bandari ya Wave_Generator (Trigger => O4 (8), Freq_Cnt => X "0EB3", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveGs4); - 3763, 415.30 Hz Kumbuka_A4: Ramani ya bandari ya Wave_Generator (Trigger => O4 (9), Freq_Cnt => X "0DE0", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveA4); - 3552, 440.00 Hz Kumbuka_As4: Ramani ya bandari ya Wave_Generator (Trigger => O4 (10), Freq_Cnt => X "0D18", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveAs4); - 3352, 466.16 Hz Kumbuka_B4: Ramani ya bandari ya Wave_Generator (Trigger => O4 (11), Freq_Cnt => X "0C5C", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveB4); --3164, 493.88 Hz ------------------------------ -------------------------------------------------- ----------- => CLK, iliyosainiwa (WaveOut) => WaveC5); - 2987, 523.25 Hz Kumbuka_Cs5: Ramani ya bandari ya Wave_Generator (Trigger => O5 (1), Freq_Cnt => X "0B03", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveCs5); - 2819, 554.37 Hz Kumbuka_D5: Ramani ya bandari ya Wave_Generator (Trigger => O5 (2), Freq_Cnt => X "0A65", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveD5); --2661, 587.33 Hz Kumbuka_Ds5: Ramani ya bandari ya Wave_Generator (Trigger => O5 (3), Freq_Cnt => X "09D0", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveDs5); - 2512, 622.25 Hz Kumbuka_E5: Ramani ya bandari ya Wave_Generator (Trigger => O5 (4), Freq_Cnt => X "0943", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveE5); --2371, 659.25 Hz Kumbuka_F5: Ramani ya bandari ya Wave_Generator (Trigger => O5 (5), Freq_Cnt => X "08Be", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveF5); --2238, 698.46 Hz Kumbuka_Fs5: Ramani ya bandari ya Wave_Generator (Trigger => O5 (6), Freq_Cnt => X "0840", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveFs5); - 2112, 739.99 Hz Kumbuka_G5: Ramani ya bandari ya Wave_Generator (Trigger => O5 (7), Freq_Cnt => X "07CA", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveG5); 1994, 783.99 Hz Kumbuka_Gs5: Ramani ya bandari ya Wave_Generator (Trigger => O5 (8), Freq_Cnt => X "075A", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveGs5); - 1882, 830.61 Hz Kumbuka_A5: Ramani ya bandari ya Wave_Generator (Trigger => O5 (9), Freq_Cnt => X "06F0", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveA5); --1776, 880.00 Hz Kumbuka_As5: Ramani ya bandari ya Wave_Generator (Trigger => O5 (10), Freq_Cnt => X "068C", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveAs5); - 1676, 932.33 Hz Kumbuka_B5: Ramani ya bandari ya Wave_Generator (Trigger => O5 (11), Freq_Cnt => X "062E", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveB5); -1582, 987.77 Hz Kumbuka_C6: Ramani ya bandari ya Wave_Generator (Trigger => O5 (12), Freq_Cnt => X "05D6", wavegenCLK => CLK, iliyosainiwa (WaveOut) => WaveC6); -1494, 1046.5 Hz ------------ mantiki ya uteuzi wa maandishi -------- 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; Uchaguzi: mchakato (WaveC4, WaveCs4, WaveD4, WaveDs4, WaveE4, WaveF4, WaveFs4, WaveG4, WaveGs4, WaveA4, WaveAs4, WaveB4, WaveC5, WaveCs5, WaveD5, WaveDs5, WaveE5, WaveF5, WaveFs5, WaveG5, WaveGs5, WaveG5 WaveB5, WaveC6) huanza ikiwa (cntC6 = "00000") basi --------------- ikiwa hakuna ishara zinazozalishwa Wave0 <= "0000000000"; Wimbi1 <= "0000000000"; Wimbi2 <= "0000000000"; Wimbi3 <= "0000000000"; vinginevyo ikiwa (O4 (0) = '1') basi ------------------- kumbuka C4 ilicheza Wave0 Wave0 Wave0 makosa1 Wave1 Wave1 Wave2 Wave2 Wave1 Wave2 Wave2 Wave3 kosa Wave0 Wave1 Hitilafu ya Wave2 Wave3 Wave2 Wave2 Wave2 Wave3 kosa Wave0 Wave1 Wave2 Wave3 kosa Wave0 Wave1 Wave2 kosa3 Wave0 Wave2 Wave2 Wave3 makosa Wave Wave Wave2 makosa3 Wave3 Wave2 Wave2 Wave3 Wave2 Wave2 Wave2 kosa Wave Wave2 Wave2 Wave3 Wave2 Wave2 Wave2 Wave2 Wave1 Hitilafu ya Wave2 Wave3 Wave1 Wave2 Wave2 Wave3 kosa Wave0 Wave1 Wave2 Wave3 kosa Wave0 Wave1 Wave2 kosa3 Wave0 Wave2 Wave2 Wave3 kosa Wave Wave Wave2 Wave3 kosa Wave Wave Wave Wave2 Wave3 Wave1 Wave2 Wave3 kosa Wave0 Wave2 Wave2 Wave3 Wave2 Wave2 Wave3 kosa Wave0 = MgandaC6; Wimbi1 <= "0000000000"; Wimbi2 <= "0000000000"; Mganda3 Mganda1 = MgandaC6; Wimbi2 <= "0000000000"; Mganda3 Mganda2 = MgandaC6; Hitilafu ya Wave3 Wave3 Wave1 <= "0000000000"; Wimbi2 <= "0000000000"; Mganda3 Wave2 <= "0000000000"; Hitilafu ya Wave3 Wave3 <= '1'; kesi ya mwisho; mwisho ikiwa; mwisho ikiwa; mchakato wa mwisho; ------ --------- tengeneza wimbi la sine chanya kwa pwm --------------------- chanyaWaveSum <= sio WaveSum (9) & WaveSum (8 downto 0); ------------- PWM jenereta --------------------- mchakato (CLK) - hesabu inayobadilika: haijasainiwa (1 chini 0): = kuachiliwa (0, 2); anza ikiwa (kupanda_edge (CLK)) basi - hesabu: = hesabu + 1; - ikiwa (hesabu = imewekwa kwa (4, 2)) kisha - hesabu: = ku_kusainiwa (0, 2); - if (PWM = to_ if (PWM <ping_length) kisha pato <= '1'; pato lingine <= '0'; mwisho ikiwa; PWM <= PWM + 1; ping_length <= unsigned (positiveWaveSum); - end ikiwa; mwisho ikiwa; mchakato wa mwisho; mwisho Tabia;

Sehemu ya ujanja zaidi ya mradi huu ni kuchagua masafa manne tu. Tulifanya hivyo na taarifa nyingi za IF, na tulitumia ishara badala ya vigeuzi ili mchakato uweze kuigwa na utatuzi. Tulijaribu njia zingine kutumia vigeuzi na KWA vitanzi, lakini tukakosa makosa ya wakati wa kukimbia. Kwa hivyo, mwishowe, tuliamua kwamba ikiwa inafanya kazi, tutaiacha peke yake. Usitengeneze ni nini ambacho hakijavunjika amirite?

Mawimbi manne ya pato yameitwa Wave0, Wave1, Wave2, Wave3 - hizi ndizo zitaongezwa pamoja ili kuunda pato la mwisho.

Kuangalia nambari hiyo, utaona rundo la ishara zilizoandikwa C4, Cs4, D4, Ds4, nk Hizi ni ishara 5-bit ambazo huchukua kichocheo kinachofanana kutoka O4 (octave 4) au O5 (octave 5) na kuzifanya 5-bit kwa kuongeza.

Ifuatayo cntC4, cntCs4, nk vigeuzi vinawakilisha ni vidokezo vingapi chini ya dokezo lengwa iliyochezwa, pamoja na dokezo lengwa. Kwa mfano, ikiwa C4, E4, G4, A # 4, na D5 zitachezwa (C9 chord) cntC4 itakuwa 1, cntE4 itakuwa 2, cntG4 itakuwa 3, nk.

Halafu, wakati wowote dokezo linachezwa, hesabu ya dokezo lengwa itachunguzwa ili kuona mahali pa kushikamana na ishara hiyo. Kwa mfano. kuhesabu ishara kutoka Wave0). Vinginevyo, ikiwa cntD5 ni 5, basi kwa sasa kuna vidokezo 5 vinachezwa, na noti 4 chini ya D5, kwa hivyo tutaacha wimbiD5 likiwa limetundikwa na tusifanye chochote nalo.

Taarifa za IF zinarudiwa kufunika kesi hizo kwa noti zote 25.

Kuongeza Amplitude

Baada ya mawimbi 4 ya chini kabisa kuchaguliwa lazima tuongeze pamoja. Sababu tutakayoongeza noti nne pamoja ni kwa sababu wazo la PWM tunalotumia kwa pato letu linaweza tu kuwa na azimio fulani hadi PWM inakwenda polepole sana na spika ataanza kuchukua wimbi la mraba la PWM. Kwa mfano, ikiwa tungetumia azimio la 8192 (13 bit), kila moja ya alama hizo 8192 lazima zilingane na ukingo unaoinuka wa saa ya ndani. Kwa hivyo, 100MHz / 8192 = 12.2kHz, ambayo iko katikati ya usikilizaji wa wanadamu.

Nyongeza halisi ya amplitudes ni rahisi sana, lazima tu uhakikishe inaweza kukimbia haraka sana.

Pato la PWM

Mzunguko wa ushuru wa PWM utawakilisha ukubwa wa wimbi la pato letu wakati huo huo. Kwa mfano, ikiwa tuna kiwango cha urefu wa 0 hadi 128, 0 itakuwa mzunguko wa ushuru wa 0%, 64 itakuwa 50%, 128 itakuwa 100%, nk PWM hii itaendesha haraka sana (yetu ni 97.6 kHz), haraka sana kwamba msemaji hatatambua mawimbi ya mraba ya mtu binafsi na badala yake aangalie voltage wastani, akiunda ishara yetu ya "analog".

Faili ya Vizuizi

Labda umeunganisha vifaa vyako tofauti, kwa hivyo hakikisha faili ya vizuizi inalingana.

Hatua ya 5: Upakuaji wa Nambari

Chini ni nambari, zote katika muundo wa.txt na.vhd ya Vivado. Wave_Generator ni moduli ndogo ya jenereta ya mawimbi, na Two_Octave_Synth ni moduli ya juu na kila kitu kingine.

Ilipendekeza: