數(shù)字電路自由創(chuàng)作三_第1頁
數(shù)字電路自由創(chuàng)作三_第2頁
數(shù)字電路自由創(chuàng)作三_第3頁
數(shù)字電路自由創(chuàng)作三_第4頁
數(shù)字電路自由創(chuàng)作三_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、數(shù)電實驗報告題 目 基于FPGA的八音符電子琴電路設(shè)計 時 間 2011年6月25日 第一章 實驗任務與原理一、實現(xiàn)功能基于FPGA開發(fā)辦設(shè)計一個八音符電子琴,由鍵盤輸入控制音響或自動演奏。用戶可以將自己編制的樂曲存入電子琴,演奏時可以選擇鍵盤輸入樂曲或者自動演奏已存入的樂曲。二、原理闡述1、系統(tǒng)設(shè)計方案:采用VHDL語言編程來實現(xiàn)電子琴的各項功能。系統(tǒng)主要由電子琴發(fā)聲模塊、選擇控制模塊和儲存器模塊組成。分頻器NOTETABSTONETABASPEAKERA揚聲器譯碼器 八音符電子琴設(shè)計總體框圖該系統(tǒng)由三個模塊:Songer、Div和SEG7(7段譯碼器)組成。(1) Songer模塊:此模塊

2、包括3個小模塊,分別是NoteTabs模塊,ToneTab模塊和Speakera模塊。此外,還需建立一個名為“music”的LPM_ROM模塊與NoteTabs模塊連接。(2) NoteTabs模塊:該模塊的功能就是定義音符數(shù)據(jù)ROM“music”隨著該模塊中的計數(shù)器控制時鐘頻率速率作加法計數(shù)時,即地址值遞增時,音符數(shù)據(jù)ROM中的音符數(shù)據(jù)。將從ROM中通過ToneIndex3.0端口輸向ToneTaba模塊,演奏采茶舞曲。(3) ToneTaba模塊:是樂曲簡譜碼對應的分頻預置數(shù)查找表電路,其中設(shè)置了樂曲的全部音符所對應的分頻置數(shù),每一音符的停留時間由音樂節(jié)拍和音調(diào)發(fā)生器模塊NoteTabs的

3、CLK的輸入頻率決定,這些值由對應于ToneTaba的4位輸入值Index3.0確定,最多有16種可選值。輸向ToneTaba中Index3.0的值ToneIndex3.0的輸出值與持續(xù)的時間由模塊NoteTabs決定。(4) Speakera模塊:是一個數(shù)控分頻器,音符的頻率可由此模塊獲得。由CLK端輸入一具有較高頻率的信號,通過Speakera分頻后由SPKOUT輸出。由于直接從數(shù)控分頻器中出來的輸出信號是脈寬極窄的脈沖式信號。為了利用驅(qū)動揚聲器,需加一個D觸發(fā)器以均衡其占空比,頻率將是原來的1/2。Speakera對CLK輸入信號的分頻比由預置數(shù)Tone決定。SPKOUT的輸出頻率將決定

4、每一音符的音調(diào)。(5) Div模塊:由于所使用的硬件設(shè)備不能滿足設(shè)計所需要的兩個CLK輸出 的頻率,所以使用一個分頻器來實現(xiàn)把一個50MHz的晶體振蕩頻率分成一個12MHz,一個8Hz兩個分頻率,再把兩個頻率分別給所需的兩個模塊。(6)EG7模塊:SEG7 模塊是一個七段譯碼器,作用是在硬件上顯示音頻的高低,用0到7分別對應空節(jié)拍do、ri、mi、fa、suo、la、xi,高音時,LED燈亮,數(shù)碼管顯示對應數(shù)字。2、發(fā)音原理:(1) 樂曲演奏的原理組成樂曲的每個音符的頻率值(音調(diào))及其持續(xù)時間(音長)是樂曲能連續(xù)演奏所需的兩個基本數(shù)據(jù),因此只要控制輸出到揚聲器的激勵信號的頻率的高低和持續(xù)時間,

5、就可以使揚聲器發(fā)出連續(xù)的樂曲聲。(2)音調(diào)的控制: 頻率的高低決定了音調(diào)的高低。(4)基準頻率f0的選取 所有不同頻率的信號都是從同一個基準頻率f0分頻而得到的。由于音節(jié)頻率多為非整數(shù),而分頻系數(shù)又不能為小數(shù),因此必須將計算所得的分頻數(shù)四舍五入取整。若基準頻率過高,則分頻比太小,取整后誤差較大。若基準頻率過高,雖然誤差減小,但分頻數(shù)變大。綜合這兩方面因素,在盡量減小頻率誤差的前提下取合適的基準頻率,在此取f0=12MHz。(5)分頻系數(shù),二進制計數(shù)器計數(shù)的容量N和預置數(shù)的選取 分頻系數(shù)A=f0/音名頻率分頻系數(shù)n=f0/音名頻率/2N=MAX分頻系數(shù)n 由表1可得最大分頻系數(shù)為1274,因此N

6、=2048為2的11次方。因此二進制計數(shù)器設(shè)為11位二進制加法計數(shù)器,其計數(shù)容量為2048,計數(shù)的最大值為2047。預置數(shù)=N-分頻系數(shù)n表1為各音階的頻率、對應的分頻系數(shù)及預置數(shù):(6)音長的控制:音符的持續(xù)時間須根據(jù)樂曲的速度及每個音符的節(jié)拍數(shù)來確定的。采茶舞曲中最短的音符為四分音符,如果全音符的持續(xù)時間為1s,則四分音符的持續(xù)時間為0.25s,二分音符持續(xù)的時間為0.5s等等,只需再提供一個4Hz的時鐘頻率。每來一個脈沖計一次數(shù),每一計數(shù)值的停留時間為0.25s,即要輸入一個全音符時需要計四次數(shù)才行,則應在Rom表格中輸出相應音符四次,表示一個全音符的持續(xù)時間。第二章 FPGA模塊程序設(shè)

7、計與仿真1、Songer模塊Songer模塊由三個模塊組成:NoteTabs模塊,ToneTaba模塊和Speakera模塊。Notetabs模塊類似于彈琴人的手指,Tonetaba類似于琴鍵,Speakera類似于琴弦或音調(diào)發(fā)生器。(1)NoteTabs模塊:原理:在這個模塊中設(shè)置了一個8位二進制計數(shù)器,作為音符數(shù)據(jù)ROM的地址發(fā)生器。這個計數(shù)器的計數(shù)頻率選為4HZ,即每一計數(shù)值的停留時間為0.25秒,當全音符設(shè)為1秒時,4分音符持續(xù)時間為0.25s, 2分音符持續(xù)的時間為0.5s等等。每來一個脈沖計一次數(shù),每一計數(shù)值的停留時間為0.25s,即要輸入一個全音符時需要計數(shù)4次才行,則應在Rom

8、表格中輸出相應音符四次,表示一個全音符的持續(xù)時間,要輸入一個2分音符則需要計數(shù)2次,依次類推。程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee。Std_logic_arith.all;entity notetabs is port(clk1:in std_logic; toneindex:out std_logic_vector(3 downto 0);End notetabs;architecture one of notetabs iscomponent music po

9、rt(address:in std_logic_vector(7 downto 0); clock:in std_logic; q:out std_logic_vector(3 downto 0);end component; signal counter:std_logic_vector(7 downto 0);begincnt8:process(clk1,counter) begin if counter=336 then counter<="00000000" elsif(clk1'event and clk1='1')then coun

10、ter<=counter+1; end if; end process;u1:music port map(address=>counter,q=>toneindex,clock=>clk1);end;NoteTabs模塊波形仿真圖:(注:每來一個時鐘clk,輸出一個相應的數(shù),每個音符的拍子不一樣所記次數(shù)也不一樣)圖5 Notetabs的波形仿真圖采茶舞曲簡譜如圖6圖6 采茶舞曲簡譜下表7是Rom表格:(即為此程序中調(diào)用的music模塊)。表7 Rom表格(2)ToneTaba模塊:原理:ToneTaba是樂曲簡譜碼對應的分頻預置數(shù)查表電路。音符的持續(xù)時間需要根據(jù)樂曲的

11、速度及每個音符的節(jié)拍數(shù)來確定,Tonetaba的功能首先是為Speakera提供決定所發(fā)音符的分頻預置數(shù),而此數(shù)在Speakera輸入口停留的時間為此音符的節(jié)拍值。模塊Tonetaba是樂曲簡碼對應的分頻預置數(shù)查表電路,其中設(shè)置了采茶舞曲樂曲全部音符所對應的分頻預置數(shù),共16 個,每一音符的停留時間由音樂節(jié)拍和音調(diào)發(fā)生器模塊Notetabs的clk的輸入頻決定,在此為4Hz。這16個值得輸出由對應于Tonetaba的4位輸入值Index3.0確定。輸向Tonetaba中Index3.0的值,ToneIndex3.0的輸出值與持續(xù)的時間由模塊Notetabs決定。程序library ieee;u

12、se ieee.std_logic_1164.all;use ieee,std_logic_arith.all;use ieee.std_logic_unsigned.all;entity ToneTaba isport( Index : in std_logic_vector(3 downto 0); CODE : out std_logic_vector(3 downto 0); HIGH : out std_logic; Tone : out std_logic_vector(10 downto 0);End ToneTaba;architecture one of ToneTaba i

13、s beginSearch: process(Index)begincase Index is When "0001"=>tone<="01100000101"code<="0001"high<='0'-773When "0010"=>tone<="01110010000"code<="0010"high<='0'-912When others => null; end case;end p

14、rocess;end;(注:每一個index的值都對應一個code,tone值,index的值從0000到0111對應的,high為低電,從1000到1111對應的high為高電。)ToneTaba模塊波形仿真圖如圖10:圖10 Tonetaba的波形仿真圖(3)Speakera(數(shù)控分頻器)模塊:原理:數(shù)控分頻器的功能是當在輸入端給定不同的輸入數(shù)時,將對輸入的時鐘信號有不同的分頻比,數(shù)控分頻器是用計數(shù)值可并行預置的加法計數(shù)器來完成的。在此,音符的頻率可由數(shù)控分頻器Speakera獲得。由其clk端輸入一具有較高頻率的信號,通過Speakera分頻后由 Spkout 輸出,由于直接從數(shù)控分頻器

15、中出來的輸出信號是脈寬極窄的脈沖式信號,為了有利于驅(qū)動揚聲器,需加一個D觸發(fā)器以均衡其占空比,但這時的頻率將是原來的1/2。Speakera對clk輸入信號的分頻比由11位預置數(shù)Tone10.0決定。Spkout 的輸出頻率將決定每一音符的音調(diào),這樣分頻計數(shù)器的預置值Tone10.0與Spkout的輸出頻率就有了對應關(guān)系。程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity speakera is port(clk2:in s

16、td_logic; tone:in std_logic_vector(10 downto 0); spks:out std_logic);end speakera;architecture one of speakera is signal preclk,fullspks:std_logic;begin divideclk:process(clk2) variable count4:std_logic_vector(3 downto 0); begin preclk<='0' if count4>11 then preclk<='1' coun

17、t4:="0000" elsif clk2'event and clk2='1' then count4:=count4+1; end if; end process; genspks:process(preclk,tone) variable count11:std_logic_vector(10 downto 0); begin if preclk'event and preclk='1' then if count11=16#7FF# then count11:=tone; fullspks<='1'

18、; else count11:=count11+1; fullspks<='0' end if; end if; end process; delayspks:process(fullspks) variable count2:std_logic; begin if fullspks'event and fullspks='1' then count2:=not count2; if count2='1' then spks<='1' else spks<='0' end if; end

19、if; end process;end;Speakera(數(shù)控分頻器)模塊仿真波形如圖12:圖12 Speakera的波形仿真圖2、Div模塊:原理:由于我們所使用的硬件設(shè)備不能滿足我們所需要的兩個CLK輸出的頻率,所以我們使用一個分頻器來實現(xiàn)把一個50MHz的晶體振蕩頻率分成一個12MHz,一個8Hz兩個分頻率,再把兩個頻率分別給所需的兩個模塊。程序:LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;ENTITY div IS PORT(

20、clk :IN STD_LOGIC; CLK12MHz,CLK8Hz: OUT std_logic);END div;ARCHITECTURE one of div is begin u1: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<

21、=tmp; end process u1; u2: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 u2;end one;Div模塊波形仿真圖如圖14: 圖14 Div的波形仿真圖(注

22、:由50MHz的時鐘信號分頻得到CLK12MHz,CLK12MHz)3、SEG7模塊:原理: SEG7 模塊是一個七段譯碼器,作用是在硬件上顯示音頻的高低,用0到7分別對應空節(jié)拍do、ri、mi、fa、suo、la、xi,高音時,LED燈亮,數(shù)碼管顯示對應數(shù)字。VGA為0010。 程序:library ieee; use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee std_logic_arith.all;ENTITY SEG7 IS PORT(num:IN std_logic_vector(3 downto

23、0); A:OUT std_logic; B:OUT std_logic; C:OUT std_logic; D:OUT std_logic; E:OUT std_logic; F:OUT std_logic; G:OUT std_logic; DP:OUT std_logic );END SEG7;ARCHITECTURE fun OF SEG7 ISsignal led:std_logic_vector(6 downto 0);BEGIN A<=led(6); B<=led(5); C<=led(4); D<=led(3); E<=led(2); F<=

24、led(1); G<=led(0); DP<='0' led<="1111110"when num="0000"else "0110000"when num="0001"else "1101101"when num="0010"else "1111001"when num="0011"else "0110011"when num="0100"else "

25、1011011"when num="0101"else "1011111"when num="0110"else "1110000"when num="0111"else "1111111"when num="1000"else "1111011"when num="1001"else "1110111"when num="1010"else "001111

26、1"when num="1011"else "1001110"when num="1100"else "0111101"when num="1101"else "1001111"when num="1110"else "1000111"when num="1111"END fun;SEG7模塊波形仿真如圖17: 圖17 Seg7的波形仿真圖(0000-1000)( 注:當nums輸入0000-1000時,A

27、-H輸出0-8的相應值) 圖17 Seg7的波形仿真圖1001-1111)(nums輸入1001-1111時,A-H輸出916的相應值)4、 總體設(shè)計電路圖(1)頂層設(shè)計的電路原理圖如圖18:圖18 頂層設(shè)計的電路原理圖原理:Notetabs中按Rom表格中已填好的樂曲輸出一譜子,轉(zhuǎn)化為相應的二進制數(shù)輸出,再將輸出的二進制數(shù)輸入Tonetaba中,轉(zhuǎn)化為相應的預置數(shù)輸入數(shù)控分頻器Speakera中進行分頻并輸出,輸出接揚聲器用于發(fā)音。從Notetabs中輸出的二進制數(shù)也將對應于Tonetaba中的二進制數(shù),輸出接數(shù)碼顯示管用于顯示所發(fā)音的簡碼,還有一個高低音的輸出連接一個Led燈,燈亮表示高音

28、,燈暗表示低音。Songer模塊就是頂層設(shè)計文件,所有的模塊都由它調(diào)用。Songer模塊的程序為:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity songer is port(clk8HZ,clk12MHZ:in std_logic; num:out std_logic_vector(3 downto 0); high1:out std_logic; spkout:out std_logic);end entity songer;architecture one of songer i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論