數(shù)字邏輯課程設(shè)計(jì)之電子琴_第1頁
已閱讀1頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論