版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 數(shù)字邏輯課程設(shè)計(jì)之電子琴</p><p><b> 實(shí)驗(yàn)內(nèi)容:</b></p><p> 設(shè)計(jì)一個(gè)八音電子琴,能通過八個(gè)鍵進(jìn)行手動控制音響,也可以通過自動控制有效自動播放一段音樂。</p><p><b> 實(shí)驗(yàn)設(shè)計(jì):</b></p><p> 本實(shí)驗(yàn)分為四個(gè)模塊:一個(gè)
2、模塊是主程序,一個(gè)模塊是自動播放音樂部分,一個(gè)模塊是音調(diào)發(fā)生器部分,一個(gè)模塊是數(shù)控分頻部分。通過接口和結(jié)構(gòu)體component的定義將各個(gè)模塊連接起來。</p><p> 本程序總的有11個(gè)輸入,1個(gè)輸出,2個(gè)輸入為時(shí)鐘脈沖,1個(gè)輸入是控制電子琴自動演奏或者手動演奏的使能端,8個(gè)輸入端為電子琴的八個(gè)鍵,1個(gè)輸出為揚(yáng)聲器輸出音樂。</p><p> 在音調(diào)發(fā)生器部分中,需要按照模=500
3、00/頻率的方法進(jìn)行分頻,但是要達(dá)到提高音量使占空比為50%的效果還需要再對信號進(jìn)行二分頻,因此最后得到的音調(diào)發(fā)生器進(jìn)行分頻預(yù)置值如下:</p><p> 當(dāng)某位音符電平輸入有效時(shí),對應(yīng)不同的分頻預(yù)置值,將分頻預(yù)置值輸出并作為數(shù)控分頻部分的輸入,分頻預(yù)置值控制對主頻的分頻。</p><p> 在數(shù)控分頻部分,將輸入的分頻預(yù)置值和時(shí)鐘脈沖作為輸入,最后輸出直接連接揚(yáng)聲器。這一部分一共包含
4、了兩個(gè)進(jìn)程,第一個(gè)進(jìn)程是根據(jù)不同音符的不同頻率進(jìn)行在主頻下進(jìn)行分頻,得到音符的相應(yīng)頻率,第二個(gè)進(jìn)程是為了提高音量使占空比為50%而進(jìn)行二分頻。</p><p> 在自動播放部分,1個(gè)時(shí)鐘脈沖輸入,1個(gè)自動播放的使能端輸入,還有8個(gè)音符的鍵為輸入,輸出為音符對應(yīng)的8位高低電平,輸出連接到音調(diào)發(fā)生器的8位輸入,如果自動播放的使能端(auto)無效則進(jìn)行手動操作,在手動操作下,該模塊的輸出直接為輸入。如果自動播放的使
5、能端輸入有效,則播放事先存儲的一段音樂,首先將主頻50KHZ進(jìn)行10000分頻,因此一個(gè)脈沖為0.2秒,每來一個(gè)脈沖進(jìn)行計(jì)數(shù)并播放一個(gè)音符。直到設(shè)置的音符全部播放完畢,計(jì)數(shù)器回0。</p><p><b> 源代碼:</b></p><p> 主模塊部分:定義了結(jié)構(gòu)體和各模塊函數(shù)</p><p> library ieee;</p&
6、gt;<p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> entity piano is</p><p> port(clk
7、0,clk1:in std_logic;</p><p> auto:in std_logic;</p><p> inplay:in std_logic_vector(7 downto 0);</p><p> play:out std_logic);</p><p> end piano;</p><p>
8、 architecture run of piano is</p><p> component autoplay is --自動播放部分</p><p> port(A:in std_logic_vector(7 downto 0);</p><p> B,C:in std_logic;</p><p> D:out
9、std_logic_vector(7 downto 0));</p><p> end component;</p><p> component tone is ?。粽{(diào)發(fā)生器部分</p><p> port(A:in std_logic_vector(7 downto 0);</p><p> B:out inte
10、ger range 0 to 170);</p><p> end component;</p><p> component control is --數(shù)控分頻部分</p><p> port(A:in std_logic;</p><p> B:in integer range 0 to 170;</p>
11、<p> C:out std_logic);</p><p> end component;</p><p> signal sw0:std_logic_vector(7 downto 0);</p><p> ?。詣硬シ挪糠值妮敵龊鸵粽{(diào)發(fā)生器的輸入,表示八個(gè)音符</p><p> signal tone0:inte
12、ger range 0 to 170;</p><p> --音調(diào)發(fā)生器的輸出和數(shù)控分頻部分的輸入,表示音符的頻率</p><p> begin ――在這個(gè)進(jìn)程中把各個(gè)部分連接起來</p><p> G1:autoplay port map(A=>inplay,B=>auto,C=>clk0,D=>sw0);</
13、p><p> G2:tone port map(A=>sw0,B=>tone0);</p><p> G3:control port map(A=>clk1,B=>tone0,C=>play);</p><p><b> end run;</b></p><p><b> 自動
14、播放模塊:</b></p><p> library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std_logic_unsigned.all;</p>
15、<p> entity autoplay is</p><p> port(A:in std_logic_vector(7 downto 0); --A=>inplay,B=>auto,C=>clk0,D=>sw0</p><p> B,C:in std_logic;</p><p> D:out std_logic_
16、vector(7 downto 0));</p><p> end autoplay;</p><p> architecture music of autoplay is</p><p> signal clk2:std_logic; --對50KHZ脈沖進(jìn)行分頻得到的5HZ的脈沖信號</p><p> signal count0
17、:integer range 0 to 62; --記錄自動播放的樂曲的脈沖并控制播放</p><p> signal count3:integer range 0 to 10000;--分頻時(shí)的計(jì)數(shù)</p><p><b> begin</b></p><p> separate:process(C,B) ――分頻將脈沖變?yōu)椋担龋诘男盘?/p>
18、</p><p><b> begin</b></p><p> if B='0' then count3<=0;clk2<='0';</p><p> elsif(C'event and C='1') then count3<=count3+1;</p&g
19、t;<p> if count3=5000 then clk2<='1';</p><p> elsif count3=10000 then clk2<='0';count3<=0;</p><p><b> end if;</b></p><p><b> en
20、d if;</b></p><p> end process;</p><p> half:process(clk2) </p><p><b> begin</b></p><p> if(clk2'event and clk2='1') then </p>
21、<p> ――如果脈沖個(gè)數(shù)多于自動播放的音符,則計(jì)數(shù)器回0,否則記錄第幾個(gè)脈沖</p><p> if count0=62 then count0<=0; </p><p> else count0<=count0+1;</p><p><b> end if;</b></p>&
22、lt;p><b> end if;</b></p><p> end process;</p><p> musicplay:process(C,B,A)</p><p><b> begin</b></p><p> if B='1' then </p>
23、;<p> ――啟動自動播放后,在5HZ的脈沖下,每來一個(gè)脈沖相應(yīng)播放一個(gè)音符</p><p> case count0 is</p><p> when 0 => D<="00010000";</p><p> when 1 => D<="00000100";</p>
24、<p> when 2 => D<="00000100";</p><p> when 3 => D<="00000100";</p><p> when 4 => D<="00001000";</p><p> when 5 => D<
25、="00000010";</p><p> when 6 => D<="00000010";</p><p> when 7 => D<="00000010";</p><p> when 8 => D<="00000001";</p>
26、;<p> when 9 => D<="00000010";</p><p> when 10 => D<="00000100";</p><p> when 11 => D<="00001000";</p><p> when 12 => D
27、<="00010000";</p><p> when 13 => D<="00010000";</p><p> when 14 => D<="00010000";</p><p> when 15 => D<="00010000";&l
28、t;/p><p> when 16 => D<="00010000";</p><p> when 17 => D<="00000100";</p><p> when 18 => D<="00000100";</p><p> when 19
29、 => D<="00001000";</p><p> when 20 => D<="00000010";</p><p> when 21 => D<="00000010";</p><p> when 22 => D<="00000010&
30、quot;;</p><p> when 23 => D<="00000001";</p><p> when 24 => D<="00000100";</p><p> when 25 => D<="00010000";</p><p>
31、 when 26 => D<="00010000";</p><p> when 27 => D<="00000001";</p><p> when 28 => D<="00000001";</p><p> when 29 => D<="0
32、0000001";</p><p> when 30 => D<="00000001";</p><p> when 31 => D<="00000010";</p><p> when 32 => D<="00000010";</p>&l
33、t;p> when 33 => D<="00000010";</p><p> when 34 => D<="00000010";</p><p> when 35 => D<="00000010";</p><p> when 36 => D<
34、="00000100";</p><p> when 37 => D<="00001000";</p><p> when 38 => D<="00001000";</p><p> when 39 => D<="00000100";</p
35、><p> when 40 => D<="00000100";</p><p> when 41 => D<="00000100";</p><p> when 42 => D<="00000100";</p><p> when 43 =&g
36、t; D<="00000100";</p><p> when 44 => D<="00001000";</p><p> when 45 => D<="00010000";</p><p> when 46 => D<="00010000"
37、;;</p><p> when 47 => D<="00010000";</p><p> when 48 => D<="00000100";</p><p> when 49 => D<="00000100";</p><p> whe
38、n 50 => D<="00000100";</p><p> when 51 => D<="00001000";</p><p> when 52 => D<="00000010";</p><p> when 53 => D<="00000
39、010";</p><p> when 54 => D<="00000010";</p><p> when 55 => D<="00000001";</p><p> when 56 => D<="00000100";</p><p&
40、gt; when 57 => D<="00010000";</p><p> when 58 => D<="00010000";</p><p> when 59 => D<="00000001";</p><p> when 60 => D<=&qu
41、ot;00000001";</p><p> when 61 => D<="00000001";</p><p> when 62 => D<="00000001";</p><p> when others => null;</p><p><b&g
42、t; end case;</b></p><p> else D<=A; --如果不進(jìn)行自動播放,則將輸入8位音符直接輸出,并且不執(zhí)行前兩個(gè)進(jìn)程的操作</p><p><b> end if;</b></p><p> end process;</p><p> end music;<
43、/p><p><b> 音調(diào)發(fā)生器模塊:</b></p><p> library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std
44、_logic_unsigned.all;</p><p> entity tone is</p><p> port(A:in std_logic_vector(7 downto 0); ――輸入的是8位音符的電平</p><p> B:out integer range 0 to 170); ――輸出的是各音符對應(yīng)的模值</p><
45、p><b> end tone;</b></p><p> architecture rtl of tone is</p><p><b> begin </b></p><p> search:process(A)</p><p><b> begin</b>
46、</p><p><b> case A is</b></p><p> when "00000001" =>B<=95;</p><p> when "00000010" =>B<=85;</p><p> when "00000100&
47、quot; =>B<=75;</p><p> when "00001000" =>B<=71;</p><p> when "00010000" =>B<=63;</p><p> when "00100000" =>B<=56;</p>
48、<p> when "01000000" =>B<=50;</p><p> when "10000000" =>B<=47;</p><p> when others =>B<=170;</p><p><b> end case;</b><
49、/p><p> end process;</p><p><b> end rtl;</b></p><p><b> 數(shù)控分頻模塊:</b></p><p> library ieee;</p><p> use ieee.std_logic_1164.all;<
50、;/p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> entity control is</p><p> port(A:in std_logic; ――時(shí)鐘信號</p><p> B
51、:in integer range 0 to 170; ――各音符的模值</p><p> C:out std_logic);</p><p> end control;</p><p> architecture abc of control is</p><p> signal spk:std_logic;</p>
52、<p><b> begin</b></p><p> twoclock:process(A,B)</p><p> ――將各個(gè)音符按照不同的模值分頻得到各音符的頻率的2倍</p><p> variable count1:integer range 0 to 170; </p><p><b&
53、gt; begin </b></p><p> if(A'event and A='1') then </p><p> if count1=B then count1:=0;spk<='1';</p><p> else count1:=count1+1;spk<='0
54、9;;</p><p><b> end if;</b></p><p><b> end if;</b></p><p> end process;</p><p> reverse:process(spk) ――二分頻使占空比為50%并直接輸出</p><p>
55、 variable count2:std_logic;</p><p><b> begin</b></p><p> if(spk'event and spk='1') then count2:=not count2;</p><p> if count2='1' then C<=
56、39;1';</p><p> else C<='0';</p><p><b> end if;</b></p><p><b> end if;</b></p><p> end process;</p><p><b>
57、 end abc;</b></p><p><b> 實(shí)驗(yàn)總結(jié):</b></p><p> 在這次實(shí)驗(yàn)中,我們首先想到的是做實(shí)現(xiàn)手動操作的電子琴,但是在后面的電子鐘實(shí)驗(yàn)中整點(diǎn)報(bào)時(shí)時(shí)需要播放一段音樂,因此想到了在電子琴的實(shí)驗(yàn)中實(shí)現(xiàn)手動操作和自動播放兩種模式,,并且也遇到了很多問題。在初學(xué)VHDL語言時(shí)并沒有編寫復(fù)雜的程序,但是在這次課程設(shè)計(jì)中涉及到了工程
58、、模塊、分頻等內(nèi)容,,接觸了很多新的內(nèi)容,也遇到了很多困難,但是通過小組的討論和學(xué)習(xí)都得到了很好的解決。</p><p> 遇到的問題1、:只知道分頻的含義而不知道VHDL語言中怎么實(shí)現(xiàn)操作。解決:通過查資料知道了分頻是通過計(jì)數(shù)記錄脈沖的個(gè)數(shù),根據(jù)要求按照脈沖的個(gè)數(shù)調(diào)整輸出脈沖。</p><p> 2、不知道怎么實(shí)現(xiàn)自動播放。解決:通過來脈沖信號的個(gè)數(shù)來控制每個(gè)音符的輸出,每個(gè)脈沖對應(yīng)
59、每個(gè)音符。</p><p> 3、編譯錯誤很多,存在各個(gè)模塊之間的接口的定義不一致的情況而導(dǎo)致的編譯錯誤,在自動播放模塊中與主函數(shù)的定義不匹配,導(dǎo)致代碼的變量多處不匹配。而且在自動播放模塊與音調(diào)發(fā)生器模塊的連接接口也有不匹配的情況,所以在編譯器的提示下將這些問題一一解決了。在自動播放部分,在進(jìn)程中定義了一個(gè)variable變量count0但是對它賦值的語句也不能通過編譯,在改為signal變量并在進(jìn)程外定義時(shí)編
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 555簡易電子琴數(shù)字邏輯課程設(shè)計(jì)報(bào)告
- 電子琴課程設(shè)計(jì)
- 課程設(shè)計(jì)--電子琴
- 電子琴課程設(shè)計(jì)
- 電子琴課程設(shè)計(jì)---電子琴的設(shè)計(jì)與實(shí)現(xiàn)
- 微機(jī)課程設(shè)計(jì)電子琴
- 接口課程設(shè)計(jì)電子琴
- 簡易電子琴課程設(shè)計(jì)
- 簡易電子琴課程設(shè)計(jì)
- 簡易電子琴課程設(shè)計(jì)
- 電子琴課程設(shè)計(jì)報(bào)告
- 電子琴的課程設(shè)計(jì)
- 電子琴課程設(shè)計(jì)論文
- 電子琴課程設(shè)計(jì)--基于單片機(jī)的電子琴設(shè)計(jì)
- 電子琴的設(shè)計(jì) 課程設(shè)計(jì)
- 電子琴課程設(shè)計(jì)--基于單片機(jī)的電子琴設(shè)計(jì)
- 電子琴課程設(shè)計(jì)-- 基于單片機(jī)的電子琴設(shè)計(jì)
- eda課程設(shè)計(jì)---自動電子琴
- 數(shù)電課程設(shè)計(jì)---電子琴
- 課程設(shè)計(jì)報(bào)告--- 簡易電子琴
評論
0/150
提交評論