ዝርዝር ሁኔታ:

Basys3 FPGA ዲጂታል ኦዲዮ ማቀናበሪያ -5 ደረጃዎች
Basys3 FPGA ዲጂታል ኦዲዮ ማቀናበሪያ -5 ደረጃዎች

ቪዲዮ: Basys3 FPGA ዲጂታል ኦዲዮ ማቀናበሪያ -5 ደረጃዎች

ቪዲዮ: Basys3 FPGA ዲጂታል ኦዲዮ ማቀናበሪያ -5 ደረጃዎች
ቪዲዮ: Hearing loss explained: Testing, equipment & communication during COVID-19 | Close to Home Ep. 27 2024, ሀምሌ
Anonim
Image
Image
Basys3 FPGA ዲጂታል ኦዲዮ ማቀናበሪያ
Basys3 FPGA ዲጂታል ኦዲዮ ማቀናበሪያ
Basys3 FPGA ዲጂታል ኦዲዮ ማቀናበሪያ
Basys3 FPGA ዲጂታል ኦዲዮ ማቀናበሪያ

ይህ ዲጂታል ሳይን ሞገድ ቁልፍ ሰሌዳ ማቀናበሪያ እንደ ቁልፍ ሰሌዳ በተዘረጉ በተከታታይ ጊዜያዊ መቀያየሪያዎች አማካይነት የተጠቃሚ ግብዓቶችን ይወስዳል እና የድምፅ ማጉያውን በድምጽ ማጉያ በኩል ያወጣል። በተጠቃሚ ግብዓቶች ላይ በመመስረት መሣሪያው ከ C4 እስከ C6 ድረስ የተለያዩ ድግግሞሾችን ሳይን ሞገዶችን ይፈጥራል። ተጠቃሚው ማስታወሻዎችን ከ C4 እስከ C6 (በአጠቃላይ 25 ማስታወሻዎች) ፣ እና እስከ አራት ቁልፎች በአንድ ጊዜ ማስገባት ይችላል - ከአራት በላይ ቁልፎች ከተጫኑ አራቱ ዝቅተኛ ድምፆች ይጫወታሉ።

ይህ ፕሮጀክት በሪያን ሞሪስ እና ማቪስ Tsoi ለካሎ ፖሊ ሲፒኢ 133 ዲጂታል ዲዛይን ክፍላችን ተከናውኗል:)

ደረጃ 1 ንድፈ ሃሳብ

የ FPGA ቦርድ ዲጂታል ምልክቶችን ብቻ ሊያወጣ ይችላል። በሌላ አነጋገር ከፍተኛ (3.3 ቪ) ቮልቴጅ ወይም ዝቅተኛ (0V) ቮልቴጅ ብቻ ሊያመነጭ ይችላል። ሆኖም ፣ የድምፅ ምልክቶች አናሎግ ናቸው እና በቮልቴጅ ውስጥ እጅግ በጣም ብዙ ጭማሪዎች ሊኖራቸው ይችላል። በዚህ ዙሪያ ለማግኘት የአናሎግ ሞገድን ለመምሰል የ PWM (pulse width modulation) ምልክት እንጠቀማለን። PWM ምን እንደሆነ ካላወቁ ይህንን ይመልከቱ-

ደረጃ 2 - ግብዓቶች እና መሣሪያዎች

  • ቪቫዶ ያለው ኮምፒተር ተጭኗል
  • እኛ የቪቫዶ ስሪት 2017.2 ን እንጠቀማለን
  • Basys3 FPGA ቦርድ
  • 25 የ SPDT ወሰን መቀየሪያዎች (እነዚህን ተጠቅመናል)
  • 30 ዝላይ ሽቦዎች (አንድ መጨረሻ ወንድ ፣ ሌላኛው ጫፍ ምንም አይደለም) ፣ 12 ኢንች
  • የሽቦ ቆራጮች
  • የሽቦ ቆራጮች
  • ለሽያጭ መለዋወጫ ሽቦ
  • ሬንጅ-ኮር Solder
  • የመሸጫ ብረት
  • ¼”ሴት የድምጽ መሰኪያ
  • ማጉያ/ማጉያ
  • ማብሪያ / ማጥፊያዎቹን ለመጫን የሆነ ነገር (ፕሮቶቦርድን + የእንጨት ሳጥን እንጠቀም ነበር)

ደረጃ 3 - ሽቦ እና የሃርድዌር ማዋቀር

ሽቦ እና ሃርድዌር ማዋቀር
ሽቦ እና ሃርድዌር ማዋቀር
ሽቦ እና ሃርድዌር ማዋቀር
ሽቦ እና ሃርድዌር ማዋቀር
ሽቦ እና ሃርድዌር ማዋቀር
ሽቦ እና ሃርድዌር ማዋቀር

የስርዓት ሥነ ሕንፃ

ምስል 1: 25 የሚገኙ ግብዓቶች → Basys3 ቦርድ → ማጉያ እና ድምጽ ማጉያ ይመልከቱ።

ውፅዓት

ስእል 2 ን ይመልከቱ - Basys3 ቦርድ → 1/2 Fe የሴት ኦዲዮ ጃክ → ድምጽ ማጉያ (በአጉሊ መነፅር)

ግቤት

ዝቅተኛ ግቤትን ለማየት በ Basys3 ሰሌዳ ላይ ያሉት የ pmod ግንኙነቶች ከመሬት ጋር መገናኘት አለባቸው እና እንደ ክፍት ወረዳ ከተተዉ በትክክል አይሰሩም። በዚህ ምክንያት ፣ ለሁሉም የማስታወሻ ቁልፎቻችን የ SPDT መቀየሪያዎችን መጠቀም አለብን። የ SPDT መቀየሪያ በመሠረቱ ተጠቃሚው ሲጫን በወረዳዎች መካከል እንዲቀያየር ያስችለዋል ፣ ስለዚህ ወደ Basys3 ቦርድ ዝቅተኛ (0V) ወይም ከፍተኛ (3.3V) ምልክቶችን ለማስገባት እንደ “አዝራሮቻችን” እንጠቀማቸዋለን።

እያንዳንዱ መቀየሪያ ከ 3.3V ፣ ከኤንዲኤን (በተለምዶ የተዘጋ) ተርሚናል ከ GND እና ከ FPGA ግብዓት ጋር የተገናኘ የ COM (የጋራ) ተርሚናል ጋር የተገናኘ NO (በተለምዶ የተከፈተ) ተርሚናል ይኖረዋል። ምስል 3 ን ይመልከቱ።

25 ገደቦች መቀየሪያዎች ስላሉን ፣ ሁሉም አንድ የጋራ 3.3 ቪ መስመር እና የጋራ የ GND መስመር ይጋራሉ። ከዚያ ፣ ከእያንዳንዱ ገደብ ማብሪያ / ማጥፊያ ያለው የምልክት መስመር በ 8 ቡድኖች ተሰብስቦ የምንሠራውን ግዙፍ ውጥንቅጥ ለመቀነስ ዚፕ የሚዘል ዝላይ ሽቦዎችን በመጠቀም በ Basys3 ቦርድ ላይ ከፒሞድ ግንኙነቶች ጋር ይገናኛል። ስእል 4 ን ወይም የመጀመሪያዎቹ ስምንት ቁልፎችን ምሳሌ ይመልከቱ።

ደረጃ 4 የ VHDL ማዋቀር (ቪቫዶ)

የ VHDL ማዋቀር (ቪቫዶ)
የ VHDL ማዋቀር (ቪቫዶ)
የ VHDL ማዋቀር (ቪቫዶ)
የ VHDL ማዋቀር (ቪቫዶ)

የሳይን ሞገድ ጄኔሬተር እና የ PWM ጄኔሬተር በመጀመሪያ የተፈተኑት የእኛ ጽንሰ -ሀሳብ መሥራቱን ለማረጋገጥ ነው ፣ ከዚያ የግቤት ገደቡ እና ስፋት አድደር/መቀየሪያ ተቀናጅተዋል። የእያንዳንዱ የሂደት ማገጃ ተግባር እና እኔ/ኦ ዝርዝሮች በስዕሉ ላይ እንደሚታየው። ኮዱ ከዚህ በታች ይታያል ፣ ግን እንደ ቪኤችዲ እና txt ፋይሎችም ተያይዘዋል። ልዩነቶች ካሉ ፣ ከ VHD ፋይሎች ጋር ይሂዱ።

BTW ምናልባት መስመሮቻችንን አጭር ማድረግ ነበረብን ነገር ግን በመምህራን ላይ ኮድ መክተት እንዲሁ ለመቋቋም በጣም የሚያበሳጭ ሆኖ ተገኝቷል ፣ ስለዚህ ክፍተቱ ትልቁ አይደለም እና አገባብ ማድመቅ የለም። ቪቫዶ ካለዎት እና ኮዱን ለመከተል ከፈለጉ ፋይሉን በቀላሉ እንዲያወርዱ እንመክርዎታለን።

በመጀመሪያ ፣ የሳይን ሞገድ ጄኔሬተር ሞጁሉን እንመልከት።

ቤተ -መጽሐፍት IEEE ፣ IEEE. STD_LOGIC_1164. ALL ን ይጠቀሙ። IEEE. NUMERIC_STD. ALL ን ይጠቀሙ ፤ አካል Wave_Generator ወደብ ነው (ቀስቅሴ በ STD_LOGIC ውስጥ ፤ - ቁልፍ ይጫኑ Freq_Cnt በ STD_LOGIC_VECTOR (15 downto 0) ፤ - የቆጣሪ እሴት = 100 ሜኸ / / (ማስታወሻ ድግግሞሽ*64 የሲን ሞገድ ክፍሎች) (ዙር ወደ ቅርብ ቁጥር) - እንደገና ተሰይሟል ከ Freq wavegenCLK በ STD_LOGIC ውስጥ - - Basys3 100MHz CLK WaveOut: ውጭ STD_LOGIC_VECTOR (9 እስከ 0)); - የሞገድ መጨረሻ Wave_Generator የተፈረመ ስፋት; ሥነ ሕንፃ የ Wave_Generator ባህሪ ምልክት i ነው - ኢንቲጀር ክልል ከ 0 እስከ 64: = 0; -ስፋት ስፋት የባንክ ዓይነት memory_type ኢንቲጀር ክልል -64 ወደ 63 ድርድር (0 እስከ 63) ነው። - የመጠን እሴቶችን ለመያዝ የማህደረ ትውስታ ባንክ (ሮም) ይፍጠሩ- ይህ ራም ወይም ሮም የሚገርመው… የምልክት ስፋት- 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); - የኃይለኛ ሞገድ ጅምር ሂደት (ሞገገንሲኤልኬ ፣ ቀስቅሴ) ተለዋዋጭ ቆጣሪ (ስፋት) የማስታወሻ ባንክ- ያልተፈረመ (15 ዳውንቶ 0): = ያልተመዘገበ (0 ፣ 16); - የሰዓት መከፋፈያ ቆጣሪ ፣ ከቁጥር 1 የተሰየመ (የሚነሳ ከሆነ) ከሆነ (ቆጣሪ = ያልተፈረመ (Freq_Cnt)) ከዚያ - Freq_Cnt = 100Mhz / (ማስታወሻ freq * 64 የሳይን ሞገድ ክፍሎች) - ቆጣሪን እንደገና ያስጀምሩ እና የውጤት ቆጣሪውን ስፋት መጠን ውሂብ ይመድቡ = = ያልተመዘገበ (0 ፣ 16); WaveOut <= STD_LOGIC_VECTOR (ለመፈረም (ስፋት (i) ፣ 10)); - I ን ለቀጣይ ንባብ i <= i + 1; - አንድ ሳይን ሞገድ ከተጠናቀቀ (i = 63) ከሆነ i <= 0; ከሆነ ያበቃል; ከሆነ ያበቃል; - (ቆጣሪ = ያልተፈረመ (Freq_Cnt)) ሌላ- ቁልፉ አልተጫነም- ውፅዓት ዳግም ማስጀመር ፣ ስፋት ስፋት ጠቋሚ እና ቆጣሪ WaveOut <= "0000000000"; እኔ <= 0; ቆጣሪ = = ያልተፈረመ (0 ፣ 16); -የውጤት ስፋት = -64 ምንም ማስታወሻ ካልተጫወተ ያበቃል ፤ - (ቀስቅሴ = '1') ካለቀ; - (የማደግ_ገደል (CLK)) የማብቂያ ሂደት; የባህሪ መጨረሻ;

ውስጣዊ ሰዓትን እና ሮምን በመጠቀም በ Basys3 ውስጥ የዲጂታል ሳይን ሞገድ እናመነጫለን። ይህ ሮም በሲን ሞገድ ላይ 64 ስፋቶችን የሚወክሉ 64 እሴቶችን ያከማቻል። ምስል 1 ን የምንጠቀምባቸው 64 እሴቶች እጅግ በጣም ጥሩ ጥራት ባለው የኃጢአት ማዕበልን ይከተላሉ።

ውስጣዊ ሰዓቱን በመጠቀም እኛ በፈለግነው የሞገድ ድግግሞሽ እና 64 የተከፋፈለውን የሰዓት ፍጥነትን በሚወክል እሴት እንቆጥራለን - Clk div = 100MHz / (Freq * 64) የእኛ ቆጣሪ ያንን እሴት በደረሰ ቁጥር ቁጥርን ከ ሮም እና ያንን ከኛ ሞገድ ጄኔሬተር ሞዱል ውስጥ ይልኩ። የእኛ ማዕበል ድግግሞሽ እነዚህን መጠኖች በምንጠራው ፍጥነት ላይ ይወሰናል።

እያንዳንዳቸው ከአንድ ድግግሞሽ/ማስታወሻ ጋር የተቆራኙ 25 ንዑስ ሞጁሎች ይኖረናል።

የሲን ሞገድ ጄኔሬተር ሞጁሎችን የሚጠራው ቀሪው እዚህ አለ -

ቤተ -መጽሐፍት IEEE ፣ IEEE. STD_LOGIC_1164. ALL ን ይጠቀሙ። IEEE. NUMERIC_STD. ALL ን ይጠቀሙ ፤ አካል Two_Octave_Synth ወደብ ነው (CLK: በ STD_LOGIC ፣ O4: በ STD_LOGIC_VECTOR (11 downto 0) ፤ O5: በ STD_LOGIC_VECTOR (12 ወደ 0) ፤ ውጤት ፦ ከ STD_LOGIC ውጭ ፤ መጨረሻ Two_Octave_Synth; የሕንፃ ሥነ -ምግባር የሁለት_ኦክታቭ_ሲንትዝ አካል አካል ሞገድ_ጄነሬተር ወደብ ነው (ቀስቅሴ ፦ በ STD_LOGIC ፤ Freq_Cnt: በ STD_LOGIC_VECTOR (15 downto 0) ፤ wavegenCLK: በ STD_LOGIC ውስጥ; WaveOut: out STD_LOGIC_VECTOR (9 downto) የመጨረሻ ክፍል; --------------------------- ከማዕበል ማመንጫ የውጤት ምልክቶች ------------------ ----- ምልክት WaveC4 ፣ WaveCs4 ፣ WaveD4 ፣ WaveDs4 ፣ WaveE4 ፣ WaveF4 ፣ WaveFs4 ፣ WaveG4 ፣ WaveGs4 ፣ WaveA4 ፣ WaveAs4 ፣ WaveB4 ፣ WaveC5 ፣ WaveCs5 ፣ WaveD5 ፣ WaveDs5 ፣ Wa5F ፣ 5 ፣ WaveF5 ፣ WaveF5 ፣ WaveE5 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, cntF5, cntF5: ያልተፈረመ (4 ወደ 0); የምልክት ስህተት STD_LOGIC; ----------------------------------- ሳይን ሞገዶችን ለመጨመር ----------- --------------- ምልክት Wave0 ፣ Wave1 ፣ Wave2 ፣ Wave3: የተፈረመ (9 ወደ ታች 0); -ምልክቶች ከ Wave Generator ሞዱል የውጤት ምልክት WaveSum: STD_LOGIC_VECTOR (9 እስከ 0); -ለተጠቃለሉ የኃጢያት ሞገዶች (2 ዎቹ ምስጋና -512 እስከ 511) ምልክት አዎንታዊWaveSum: STD_LOGIC_VECTOR (9 እስከ 0); -በ PWM ጄኔሬተር ውስጥ ለመጠቀም ከ 0 እስከ 1023 ተፈርሟል ----------------------------------- PWM ለማመንጨት ------------------------------- ምልክት ping_length: ያልተፈረመ (9 ወደ 0): = ያልተፈረመ (positiveWaveSum); -ሲግናል off_length: ያልተፈረመ (6 ወደ 0): = ያልተፈረመ (127 ፣ 7) -ያልተፈረመ (ማዕበል); ምልክት PWM: ያልተፈረመ (9 ወደ 0): = ያልተፈረመ (0, 10); Note_C4: Wave_Generator ወደብ ካርታ (ቀስቅሴ => O4 (0) ፣ Freq_Cnt => X "1755" ፣ wavegenCLK => CLK ፣ የተፈረመ (WaveOut) => WaveC4); --5973 ፣ 261.63 Hz Note_Cs4: Wave_Generator port map (Trigger => O4 (1) ፣ Freq_Cnt => X “1606” ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveCs4) ፤-5638 ፣ 277.18 Hz Note_D4: Wave_Generator ወደብ ካርታ (ቀስቅሴ => O4 (2) ፣ Freq_Cnt => X "14C9" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveD4); --5321 ፣ 293.66 Hz Note_Ds4: Wave_Generator port map (Trigger => O4 (3) ፣ Freq_Cnt => X “139F” ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveDs4) ፤-5023 ፣ 311.13 Hz Note_E4: Wave_Generator ወደብ ካርታ (ቀስቅሴ => O4 (4) ፣ Freq_Cnt => X “1285” ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveE4); --4741 ፣ 329.63 Hz Note_F4: Wave_Generator port map (Trigger => O4 (5) ፣ Freq_Cnt => X “117B” ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveF4); --4475 ፣ 349.23 Hz Note_Fs4: Wave_Generator port map (Trigger => O4 (6) ፣ Freq_Cnt => X “1080” ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveFs4) ፤-4224 ፣ 369.99 Hz Note_G4 ፦ Wave_Generator ወደብ ካርታ (ቀስቅሴ => O4 (7) ፣ Freq_Cnt => X "0F92" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveG4); --3986 ፣ 392.00 Hz Note_Gs4: Wave_Generator port map (Trigger => O4 (8) ፣ Freq_Cnt => X "0EB3" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveGs4);-3763 ፣ 415.30 Hz Note_A4: Wave_Generator ወደብ ካርታ (ቀስቅሴ => O4 (9) ፣ Freq_Cnt => X "0DE0" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveA4); --3552 ፣ 440.00 Hz Note_As4: Wave_Generator port map (Trigger => O4 (10) ፣ Freq_Cnt => X "0D18" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveAs4);-3352 ፣ 466.16 Hz Note_B4: Wave_Generator ወደብ ካርታ (ቀስቅሴ => O4 (11) ፣ Freq_Cnt => X “0C5C” ፣ wavegenCLK => CLK ፣ የተፈረመ (WaveOut) => WaveB4); --3164 ፣ 493.88 Hz -------------------------------------------- -------------------------------------------------- --------------------------- Note_C5: Wave_Generator port map (Trigger => O5 (0) ፣ Freq_Cnt => X "0BAB" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveC5); --2987 ፣ 523.25 Hz Note_Cs5: Wave_Generator port map (Trigger => O5 (1) ፣ Freq_Cnt => X "0B03" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveCs5);-2819 ፣ 554.37 Hz Note_D5: Wave_Generator ወደብ ካርታ (ቀስቅሴ => O5 (2) ፣ Freq_Cnt => X "0A65" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveD5); --2661 ፣ 587.33 Hz Note_Ds5: Wave_Generator port map (Trigger => O5 (3) ፣ Freq_Cnt => X "09D0" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveDs5) ፤-2512 ፣ 622.25 Hz Note_E5: Wave_Generator ወደብ ካርታ (ቀስቅሴ => O5 (4) ፣ Freq_Cnt => X "0943" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveE5); --2371 ፣ 659.25 Hz Note_F5: Wave_Generator port map (Trigger => O5 (5) ፣ Freq_Cnt => X "08Be" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveF5); --2238 ፣ 698.46 Hz Note_Fs5: Wave_Generator port map (Trigger => O5 (6) ፣ Freq_Cnt => X "0840" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveFs5) ፤-2112 ፣ 739.99 Hz Note_G5 ፦ Wave_Generator ወደብ ካርታ (ቀስቅሴ => O5 (7) ፣ Freq_Cnt => X “07CA” ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveG5); --1994 ፣ 783.99 Hz Note_Gs5: Wave_Generator port map (Trigger => O5 (8) ፣ Freq_Cnt => X "075A" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveGs5) ፤-1882 ፣ 830.61 Hz Note_A5: Wave_Generator ወደብ ካርታ (ቀስቅሴ => O5 (9) ፣ Freq_Cnt => X "06F0" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveA5); --1776 ፣ 880.00 Hz Note_As5: Wave_Generator port map (Trigger => O5 (10) ፣ Freq_Cnt => X "068C" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveAs5) ፤-1676 ፣ 932.33 Hz Note_B5: Wave_Generator ወደብ ካርታ (ቀስቅሴ => O5 (11) ፣ Freq_Cnt => X “062E” ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveB5); --1582 ፣ 987.77 Hz Note_C6: Wave_Generator port map (Trigger => O5 (12) ፣ Freq_Cnt => X "05D6" ፣ wavegenCLK => CLK ፣ ተፈርሟል (WaveOut) => WaveC6); --1494 ፣ 1046.5 Hz ------------ የማስታወሻ ምርጫ አመክንዮ ------------ 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); አስ 4 <= "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); አስ 5 <= "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 ፣ WaveDs5 ፣ Wa5 ፣ 5 ፣ 5 ፣ Wa5 ፣ 5 WaveB5 ፣ WaveC6) የሚጀምረው ከሆነ (cntC6 = "00000") ከዚያ --------------- ምንም ምልክቶች ካልተፈጠሩ Wave0 <= "0000000000"; ማዕበል 1 <= "0000000000"; ማዕበል 2 <= "0000000000"; ማዕበል 3 <= "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 Wave2 Wave0 Wave0 Wave0 Wave0 Wave0 Wave0 Wave Wave2 Wave3 ስህተት Wave0 Wave1 Wave2 Wave3 ስህተት Wave0 Wave1 Wave2 Wave3 ስህተት Wave0 Wave1 Wave2 Wave3 ስህተት Wave0 Wave1 Wave2 Wave3 ስህተት Wave0 Wave1 Wave2 Wave3 ስህተት Wave0 Wave2 Wave0 Wave0 Wave0 Wave0 Wave0 Wave = WaveC6; ማዕበል 1 <= "0000000000"; ማዕበል 2 <= "0000000000"; Wave3 Wave1 <= WaveC6; ማዕበል 2 <= "0000000000"; Wave3 Wave2 <= WaveC6; Wave3 Wave3 ስህተት Wave1 <= "0000000000"; ማዕበል 2 <= "0000000000"; Wave3 Wave2 <= "0000000000"; Wave3 Wave3 ስህተት <= '1'; የመጨረሻ ጉዳይ; ከሆነ ያበቃል; ከሆነ ያበቃል; የማጠናቀቂያ ሂደት; ------------- ሳይን ሞገድ አድደር -------------------- WaveSum <= STD_LOGIC_VECTOR (Wave0 + Wave1 + Wave2 + Wave3); --------- ሳይን ሞገድ ለ pwm አዎንታዊ ያድርጉት --------------------- አዎንታዊWaveSum <= not WaveSum (9) & WaveSum (8 ወደ 0); ------------- PWM ጄኔሬተር --------------------- ሂደት (CLK)-ተለዋዋጭ ቆጠራ-ያልተፈረመ (1 ወደ 0): = ያልተፈረመ (0, 2); (የሚነሳ_ጅጅ (CLK)) ከሆነ ከዚያ -ቁጥር -= ቆጠራ + 1; -ከሆነ (ቆጠራ = ያልተመዘገበ (4 ፣ 2)) ከዚያ-ቆጠራ = = ያልተፈረመ (0 ፣ 2); --if (PWM = to_ ከሆነ (PWM <ping_length) ከዚያ ውፅዓት <= '1' ፤ ሌላ ውፅዓት <= '0' ፤ ካለቀ ያበቃል ፤ PWM <= PWM + 1 ፤ ping_length <= ያልተፈረመ (positiveWaveSum); --end ከሆነ ፣ ካለቀ ፣ መጨረሻው ሂደት ፣ የባህሪይ መጨረሻ

4 ማስታወሻ መምረጫ የዚህ ፕሮጀክት በጣም አስቸጋሪው ክፍል አራት ድግግሞሾችን ብቻ መምረጥ ነው። እኛ በጠቅላላው የሎታ IF መግለጫዎች አደረግነው ፣ እና ሂደቱ አስመስሎ እንዲታረም ከተለዋዋጮች ይልቅ ምልክቶችን እንጠቀም ነበር። ተለዋዋጮችን እና FOR loops ን በመጠቀም ሌሎች ዘዴዎችን ሞክረናል ፣ ግን ወደ ሩጫ-ጊዜ ስህተቶች ገባን። ስለዚህ ፣ በመጨረሻ ፣ እኛ የሚሰራ ከሆነ እኛ ብቻውን እንተወዋለን ብለን ወስነናል።የማይሰበር አሚር ያልሆነውን አያስተካክሉ?

አራቱ የውጤት ሞገዶች Wave0 ፣ Wave1 ፣ Wave2 ፣ Wave3 የሚል ስያሜ ተሰጥቷቸዋል - እነዚህ የመጨረሻውን ውጤት ለመፍጠር አብረው የሚጨመሩ ናቸው።

ኮዱን ሲመለከቱ ፣ C4 ፣ Cs4 ፣ D4 ፣ Ds4 ፣ ወዘተ የተሰየሙ ብዙ የምልክት ምልክቶች ያያሉ። ለማከል 5-ቢት።

ቀጥሎም cntC4 ፣ cntCs4 ፣ ወዘተ ተለዋዋጮች የዒላማ ማስታወሻውን ጨምሮ ከዒላማው ማስታወሻ ምን ያህል ዝቅተኛ ማስታወሻዎች እንደተጫወቱ ይወክላሉ። ለምሳሌ ፣ C4 ፣ E4 ፣ G4 ፣ A#4 እና D5 ከተጫወቱ (C9 chord) cntC4 1 ፣ cntE4 2 ፣ cntG4 3 ፣ ወዘተ.

ከዚያ ፣ ማስታወሻ በሚጫወትበት ጊዜ ሁሉ ፣ የታለመው ማስታወሻ ቆጠራው የማስታወሻ ምልክቱን የት እንደሚይዝ ለማየት ይመረመራል። ለምሳሌ ፣ የ D5 ማስታወሻ ከተጫወተ (ይህ ማለት O5 (2) ከፍ ያለ ነው) እና cntD5 3 ከሆነ ፣ በአሁኑ ጊዜ 3 ማስታወሻዎች እየተጫወቱ ነው ፣ 2 ማስታወሻዎች ከ D5 በታች ናቸው ፣ ስለዚህ እኛ ማዕበል D5 ን ወደ Wave2 (ሦስተኛው ማዕበል) እናያይዛለን። የምልክት ቆጠራ ከ Wave0)። እንደአማራጭ ፣ cntD5 5 ከሆነ ፣ በአሁኑ ጊዜ 5 ማስታወሻዎች እየተጫወቱ ነው ፣ 4 ማስታወሻዎች ከ D5 በታች ናቸው ፣ ስለዚህ እኛ ሞገድ D5 ን አንጠልጥለን እንተዋለን እና በእሱ ምንም አንሠራም።

የ IF መግለጫዎች ለ 25 ማስታወሻዎች ሁሉ ጉዳዮችን ለመሸፈን ይደጋገማሉ።

ስፋት አድደር

ዝቅተኛው 4 ሞገዶች ከተመረጡ በኋላ አንድ ላይ ማከል አለብን። አራት ማስታወሻዎችን አንድ ላይ የምናክልበት ምክንያት PWM በጣም ቀርፋፋ እስኪያደርግ ድረስ እና ተናጋሪው የ PWM ካሬ ማዕበል ማንሳት እስኪጀምር ድረስ ለውጤታችን የምንጠቀምበት የ PWM ሀሳብ የተወሰነ ጥራት ሊኖረው ስለሚችል ነው። ለምሳሌ ፣ የ 8192 (13 ቢት) ጥራት የምንጠቀም ከሆነ ፣ እያንዳንዳቸው 8192 ነጥቦች ከቦርዱ ሰዓት ከፍ ካለው ጠርዝ ጋር መዛመድ አለባቸው። ስለዚህ ፣ 100MHz / 8192 = 12.2kHz ፣ እሱም በሰዎች የመስማት ክልል ውስጥ ያለው።

የ amplitudes ትክክለኛው መደመር እጅግ በጣም ቀላል ነው ፣ በእውነቱ በፍጥነት መሮጡን ማረጋገጥ አለብዎት።

PWM ውፅዓት

የ PWM የግዴታ ዑደት በዚያ ቅጽበት የእኛን የውፅዓት ሞገድ ስፋት ይወክላል። ለምሳሌ ፣ እኛ ከ 0 እስከ 128 ስፋት ያለው ክልል ቢኖረን ፣ 0 የ 0%የቀን ዑደት ይሆናል ፣ 64 ይሆናል 50%፣ 128 100%ይሆናል ፣ ወዘተ ይህ PWM በከፍተኛ ፍጥነት ይሠራል (የእኛ 97.6 kHz ነው) ፣ በጣም ፈጣን በመሆኑ ተናጋሪው የግለሰቡን ካሬ ሞገዶች አያውቀውም ይልቁንም የእኛን “አናሎግ” ምልክት በመፍጠር አማካይ ቮልቴጅን ይመልከቱ።

ገደቦች ፋይል

ሃርድዌርዎን በተለየ መንገድ ያያይዙት ይሆናል ፣ ስለዚህ የእገዳዎች ፋይል መመሳሰሉን ያረጋግጡ።

ደረጃ 5 የኮድ ውርዶች

ከዚህ በታች ኮዱ ፣ በ.txt ቅርጸት እና ለቪቫዶ.vhd። Wave_Generator የሞገድ ጄኔሬተር ንዑስ ሞጁል ሲሆን ሁለት_Octave_Synth ከሌላው ሁሉ ጋር የላይኛው ሞጁል ነው።

የሚመከር: