【ChatGPT】前些天發(fā)現(xiàn)了一個巨牛的人工智能學習電子書,通俗易懂,風趣幽默,無廣告,忍不住分享一下給大家。(點擊查看學習資料)
wx供重浩:創(chuàng)享日記
對話框發(fā)送:樂曲電路
免費獲取完整無水印論文報告(包含電路圖)
一、設計任務要求
1、課程設計題目
設計一個樂曲演奏電路,能夠自動播放編寫好的音樂。要求將音樂通過實驗箱上的喇叭播放出來,用發(fā)光二級管顯示出樂曲的節(jié)拍。
(附加功能:本設計在題目所要求的功能全部實現(xiàn)的基礎(chǔ)之上又添加了許多附加功能,所有的功能將在“工程設計總述”中闡明,特此聲明。)
2、設計分析
(1) 音樂硬件演奏電路基本原理
硬件電路的發(fā)聲原理,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制FPGA芯片某個引腳輸出一定頻率的矩形波,接上揚聲器就能發(fā)出相應頻率的聲音。樂曲中的每一音符對應著一個確定的頻率,要想FPGA發(fā)出不同音符的音調(diào),實際上只要控制它輸出相應音符的頻率即可。樂曲都是由一連串的音符組成,因此按照樂曲的樂譜依次輸出這些音符所對應的頻,就可以在揚聲器上連續(xù)地發(fā)出各個音符的音調(diào)。而要準確地演奏出一首樂曲,僅僅讓揚聲器能夠發(fā)生是不夠的,還必須準確地控制樂曲的節(jié)奏,即樂曲中每個音符的發(fā)生頻率及其持續(xù)時間是樂曲能夠連續(xù)演奏的兩個關(guān)鍵因素。
(2) 音符頻率的獲得
多個不同頻率的信號可通過對某個基準頻率進行分頻器獲得。由于各個音符的頻率多為非整數(shù),而分頻系數(shù)又不能為小數(shù),故必須將計算機得到的分頻系數(shù)四舍五入取整。若基準頻率過低,則分頻系數(shù)過小,四舍五入取整后的誤差較大。若基準頻率過高,雖然可以減少頻率的相對誤差,但分頻結(jié)構(gòu)將變大。實際上應該綜合考慮這兩個方面的因素,在盡量減少誤差的前提下,選取合適的基準頻率。本設計中選取1MHz的基準頻率。數(shù)控分頻器采用12位二進制計數(shù)器,樂曲中的休止符,只要將分頻系數(shù)設為0,即初始值=4095,此時揚聲器不會發(fā)聲。
根據(jù)分頻系數(shù),可計算數(shù)控分頻器得到的初始值。(語言已經(jīng)無法描述其中的原理了,程序可以說明此問題,關(guān)于初始值的解釋,請看下文給出的程序)
初始值的計算公式如下:由于所設計的數(shù)控分頻計采用12MHZ作為時鐘源,并通過一次12分頻給出頻率為1MHZ的脈沖溢出信號,再對該1MHZ的溢出信號進行12位2進制碼的帶預置數(shù)進行計數(shù),并給出一個頻率隨預置數(shù)變化的脈沖信號。由于該脈沖信號不具有驅(qū)動蜂鳴器的能力,故對此脈沖信號進行2分頻以推動蜂鳴器發(fā)聲,故最終輸出信號的頻率與預置數(shù)的關(guān)系如下:
(3) 樂曲節(jié)奏的控制
一般樂曲最小的節(jié)拍為1/4拍,若將1拍的時間定為1秒,則只需要輸出4Hz的1/4拍的時長(0.25秒),對于其它占用時間較長的節(jié)拍(必為1/4拍的整數(shù)倍)則只需要將該音符連續(xù)輸出相應的次數(shù)即可。
計數(shù)時鐘信號作為輸出音符快慢的控制信號,時鐘快時輸出節(jié)拍速度就快,演奏的速度也就快,時鐘慢時輸出節(jié)拍的速度就慢,演奏的速度自然降低,由于最后的蜂鳴器前需加一個二分頻的程序,因此計數(shù)器的時鐘信號應為4Hz的2倍,即8Hz。
(4) 樂譜的發(fā)生
本設計將樂譜中的音符數(shù)據(jù)存儲在LPM-ROM中,若某音在邏輯中停留了4個時鐘節(jié)拍,即1秒的時間,相應地,該音符就要在LPM-ROM中連續(xù)的四個地址上都存儲。當一個4Hz的時鐘來時,相應地就從LPM-ROM中輸出一個音符數(shù)據(jù)。
(5) 選擇模塊
選擇模塊將用一個4位數(shù)的控制信號控制樂譜模塊數(shù)據(jù)的選擇性,用vhdl語言描述比較簡單,不在此詳述。
(6)譯碼器等其他模塊
譯碼器等模塊在以前做實驗的時候做過,且原理比較簡單易懂,不再這里闡述。
3、工程設計總述
當一個4Hz的時鐘脈沖來到時,樂譜發(fā)生器模塊輸出一個音符數(shù)據(jù)給分頻系數(shù)模塊,分頻系數(shù)模塊輸出此音符相應的分頻系數(shù)所需的初始值,將初始值送給數(shù)控分頻器模塊,當12MHz的時鐘脈沖來到時,數(shù)控分頻器就根據(jù)分頻系數(shù)輸出相應的頻率(即此音符所對應的發(fā)生頻率)給揚聲器,揚聲器就可發(fā)出對應音符的聲音來.連續(xù)的8Hz的時鐘脈沖就將樂譜發(fā)生器里所存儲的音符數(shù)據(jù)一個接一個的送給了分頻系數(shù)模塊,再經(jīng)過數(shù)控分頻模塊,最后揚聲器一個接一個的發(fā)出音符數(shù)據(jù)所對應的聲音來。曲子也就流暢的播放出來了。同時led數(shù)碼管會隨著音樂顯示相應的樂譜,3位led燈會隨著高中低的頻率,相應的閃爍。當樂曲一遍演奏完成后,樂曲發(fā)生器能自動從頭開始循環(huán)演奏,這時用撥碼開關(guān)選擇播放的樂曲,撥碼開關(guān)給選擇器一個選擇信號,即可選擇相應的歌曲莫開中的數(shù)據(jù)進入數(shù)據(jù)翻譯模塊,播放出相應的歌曲,本工程選取了四首樂曲,以格雷碼的形式編碼,每次只變一位撥碼開關(guān),比較方便選擇。(其余完整詳見下載)
二、總體框圖
該工程由是個模塊構(gòu)成,其中有四個為樂譜儲存模塊ROM,如圖所示。
1、分頻器的功能是將芯片上提供的50MHz的時鐘分頻為12MHz和8Hz的時鐘,分別供計數(shù)器與分頻驅(qū)動器(數(shù)控分頻器)使用。
2、計數(shù)器完成計數(shù)功能,183進制(最長的歌曲菊花臺有183個字符)每個時鐘沿加一。
3、四個音樂模塊分別記錄了4首歌的樂譜。根據(jù)上一模塊計數(shù)器所計的數(shù)讀取相應地址里的數(shù)據(jù)傳遞給下一模塊。
4、選擇器完成選擇歌曲的功能。
5、數(shù)據(jù)翻譯模塊將選擇器所選擇的歌曲rom里的地址的數(shù)據(jù)翻譯成分頻驅(qū)動器(數(shù)控分頻器)分頻所需的控制數(shù)據(jù)、3個led燈數(shù)據(jù)(高中低音)、以及譯碼器所需的數(shù)據(jù)。
6、分頻驅(qū)動器也就是一個數(shù)控分頻器,完成分頻的功能,并驅(qū)動蜂鳴器。
7、譯碼器將樂譜數(shù)據(jù)在led數(shù)碼管上顯示。
三、選擇器件
詳見下載
四、功能模塊
1.分頻器(div)
將芯片上提供的50MHz的時鐘分頻為12MHz和8Hz的時鐘,分別供計數(shù)器與分頻驅(qū)動器(數(shù)控分頻器)使用。
(1)模塊圖形:
(2)程序如下:
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY div IS
PORT(
clk :IN STD_LOGIC;
CLK12MHz,CLK8Hz: OUT std_logic);
END div;
ARCHITECTURE one of div is
begin
nana:process(clk)
variable cnt:integer range 0 to 2;
variable tmp:std_logic;
begin
if(clk'event and clk='1')then
if cnt>=1 then
cnt:=0;
tmp:=not tmp;
else
cnt:=cnt+1;
end if;
end if;
CLK12MHz<=tmp;
end process nana;
nbnb:process(clk)
variable cnt:integer range 0 to 3125000;
variable tmp:std_logic;
begin
if(clk'event and clk='1')then
if cnt>=3124999 then
cnt:=0;
tmp:=not tmp;
else
cnt:=cnt+1;
end if;
end if;
CLK8Hz<=tmp;
end process nbnb;
end one;
(3)仿真波形:
(4)仿真波形分析
由波形可看出ckl為輸入50MHz的時鐘信號,ckl12輸出為平12MHz的時鐘信號,clk8為8Hz的時鐘信號,由于紙張有限沒有打印出其全部波形。
經(jīng)分析該模塊功能完全正確。
2、計數(shù)器(notetabs)
(詳見下載)
3、選擇模塊(choice)
(詳見下載)
4、數(shù)據(jù)翻譯模塊(tontaba)
將選擇器所選擇的歌曲rom里的地址的數(shù)據(jù)翻譯成分頻驅(qū)動器(數(shù)控分頻器)分頻所需的控制數(shù)據(jù)、3個led燈數(shù)據(jù)(高中低音)、以及譯碼器所需的數(shù)據(jù)。
(1)模塊圖像:
(2)程序如下:
library ieee;
use ieee.std_logic_1164.all;
entity tonetaba is
port(index:in std_logic_vector (4 downto 0);
code:out std_logic_vector(3 downto 0);
high0:out std_logic_vector(2 downto 0);
tone:out std_logic_vector(11 downto 0))
;
end;
architecture one of tonetaba is
begin
search:process(index)
begin
case index is
when"00000"=>tone<="111111111111";code<="0000";high0<="000";--0/4095
when"00001"=>tone<="011100011111";code<="0001";high0<="001";--L1/1823
when"00010"=>tone<="100000001111";code<="0010";high0<="001";--L2/2063
when"00011"=>tone<="100011110010";code<="0011";high0<="001";--L3/2291
when"00100"=>tone<="100101010101";code<="0100";high0<="001";--L4/2390
when"00101"=>tone<="101000010000";code<="0101";high0<="001";--L5/2576
when"00110"=>tone<="101010111000";code<="0110";high0<="001";--L6/2745
when"00111"=>tone<="101101001011";code<="0111";high0<="001";--L7/2891
when"01000"=>tone<="101110001111";code<="0001";high0<="010";--M1/2960
when"01001"=>tone<="110000001001";code<="0010";high0<="010";--M2/3082
when"01010"=>tone<="110001111001";code<="0011";high0<="010";--M3/3193
when"01011"=>tone<="110010101100";code<="0100";high0<="010";--M4/3244
when"01100"=>tone<="110100001001";code<="0101";high0<="010";--M5/3337
when"01101"=>tone<="110101011100";code<="0110";high0<="010";--M6/3420
when"01110"=>tone<="110110100101";code<="0111";high0<="010";--M7/3494
when"01111"=>tone<="110111000111";code<="0001";high0<="100";--H1/3528
when"10000"=>tone<="111000000101";code<="0010";high0<="100";--H2/3589
when"10001"=>tone<="111000111100";code<="0011";high0<="100";--H3/3645
when"10010"=>tone<="111001010110";code<="0100";high0<="100";--H4/3670
when"10011"=>tone<="111010000100";code<="0101";high0<="100";--H5/3717
when"10100"=>tone<="111010101101";code<="0110";high0<="100";--H6/3758
when"10101"=>tone<="111011010010";code<="0111";high0<="100";--H7/3795
when others=>null;
end case;
end process;
end;
(3)仿真波形:
(4)仿真波形分析
由波形可看出,當輸入信號index為00110時high0顯示1,code顯示6(即 中音6),預置初值為101010111000,查詢上文所列的表,可發(fā)現(xiàn)功能完全正確。
第二個波形圖,輸入信號00010,輸出為中音2,再查預置初值,同樣可發(fā)現(xiàn)完全正確。因此該模塊功能完全正確。
5、譯碼器模塊(deled)
(詳見下載)
6、數(shù)控分頻器模塊(speakera)
(詳見下載)
7、樂譜數(shù)據(jù)ROM(四個模塊)
(詳見下載)
8、地址線的選擇:
除了上文所寫到的模塊外,還需要加入地址線的選擇,已選擇實驗底箱的不同功能,本實驗用到led數(shù)碼管,因此地址線vga的賦值為vga0=0,vga1=1,vga2=0,vga3=0。如下圖:
9、led數(shù)碼管位選功能的解決方案:
本工程只需顯示一位簡樸,因此選用一位數(shù)碼管即可,由于實驗箱上的數(shù)碼管是共陽數(shù)碼管,因此只需選取一位數(shù)碼管賦上低電平即可,如圖:(我在這里選取了2、4、6、8四位數(shù)碼管共同顯示)
五、總體設計電路圖
1、頂層設計的電路原理圖
2、頂層設計的仿真結(jié)果
由于該工程總體的輸入時鐘信號為50MHz,其中要經(jīng)過多個分頻器且分頻系數(shù)巨大,因此不可能整體仿真成功,(會導致仿真時間過長而失?。jP(guān)于這個問題,我特意請教了李兵老師,老師告訴我仿真的時候去掉幾個模塊,只仿真一部分功能,去掉的模塊再單獨仿真即可證明整個工程的正確性,我按這個方案想了很久,發(fā)現(xiàn)這個仿真可以先去掉div分頻模塊,再更改speakera的程序(像仿真speakera模塊那樣)仿真,也可以同時去掉div與speakera模塊,進行仿真。但這兩種方法也都是拆分為幾塊分別仿真,而沒有整個工程的仿真,因此這種仿真與將每個模塊分別仿真驗證其功能的正確性本質(zhì)上是一樣的。
只要證明了每個模塊的功能完全正確,即可得出本工程整體的功能可以實現(xiàn),在上文已經(jīng)分別證明了每個模塊功能的完全正確,因此,整個工程的功能也是完全正確的。經(jīng)分析,頂層設計仿真功能完全正確。
3、電路的頂層文件管腳分配圖如下
4、連線及下載
在硬件電路上實現(xiàn)此程序 CLK接50MHz晶振輸入;音樂選擇指示燈分別接IO9、I010、IO11、IO12,然后再與LED燈連接;高中低音分別接IO14、IO15、IO16,然后再與LED連接,SPKOUT接IO13,然后與揚聲器連接。文章來源:http://www.zghlxwxcb.cn/news/detail-454056.html
六、結(jié)束語
樂曲演奏廣泛用于自動答錄裝置、手機鈴聲、集團電話、及智能儀器儀表設備。實現(xiàn)方法有許多種,在眾多的實現(xiàn)方法中,以純硬件完成樂曲演奏,隨著FPGA集成度的提高,價格下降,EDA設計工具更新?lián)Q代,功能日益普及與流行,使這種方案的應用越來越多。如今的數(shù)字邏輯設計者面臨日益縮短的上市時間的壓力,不得不進行上萬門的設計,同時設計者不允許以犧牲硅的效率達到保持結(jié)構(gòu)的獨特性。使用現(xiàn)今的EDA軟件工具來應付這些問題,并不是一件簡單的事情。FPGA預裝了很多已構(gòu)造好的參數(shù)化庫單元LPM器件。通過引入支持LPM的EDA[1]軟件工具,設計者可以設計出結(jié)構(gòu)獨立而且硅片的使用效率非常高的產(chǎn)品。
這種基于FPGA的音樂硬件演奏電路的設計與實現(xiàn),不僅通過VHDL層次化和模塊化設計方法,同時采用數(shù)控分頻和定制LPM-ROM的設計思想,更好的優(yōu)化了樂曲演奏數(shù)字電路的設計,在此基礎(chǔ)上不必變化頂層文件架構(gòu)可隨意變更樂曲,有效縮短了產(chǎn)品開發(fā)周期、減少了設計芯片的數(shù)量、降低了功耗、提高了設計的靈活性、可靠性和可擴展性。文章來源地址http://www.zghlxwxcb.cn/news/detail-454056.html
到了這里,關(guān)于電子技術(shù)課程設計基于FPGA的音樂硬件演奏電路的設計與實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!