日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

基于Basys2开发板的简易电子琴和音乐播放器设计

發布時間:2024/3/26 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Basys2开发板的简易电子琴和音乐播放器设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景:華中科技大學 電測綜合實驗

?

主要功能:Basys2開發板外接一個揚聲器(或無源蜂鳴器也可)實現電子琴和音樂播放器的功能。其中由于開發板上只有4個按鍵,所以電子琴功能只做了4個音調,分別對應于4個輕觸開關。音樂播放器功能需要根據挑選出來的樂譜,人工翻譯為代碼中對應的音調代碼,然后輸入到代碼的狀態機之中。兩個功能分別采用兩個不同的聲道輸出,因此兩個功能互不干擾,可以同時進行。實現了一個符合綜合實驗要求的簡單項目。因為沒有隊友,是一個人不到2天的時間趕出來的成果,所以比較簡易,給需要的人做一個參考。

?

ISE工程文件(github鏈接)(包含實驗報告):https://github.com/W-yt/yutian_sundry_zip/blob/master/piano%26palyer.zip

?

以下直接粘貼課設報告的主要內容。

如有問題歡迎指正交流。

?

一、實驗目的

1.熟練掌握Basys2的開發流程;

2.提高FPGA綜合調試的能力;

?

二、實驗選題及設計目標

實驗選題:音樂播放器+電子琴(雙聲道)

?

?項目目標:本項目要設計實現一個基于BASYS2的多功能電子琴,音樂播放和電子琴各占用一個聲道的雙聲道電子琴。計劃采用兩個揚聲器作為雙聲道的輸出設備,利用撥碼開關實現音樂播放器的控制,利用輕觸開關實現電子琴的琴鍵(這里由于BASYS2開發板上只有4個輕觸開關,因此電子琴部分僅選用了四個音,僅用來演示電子琴的實現原理,也可以外接按鍵,或者矩陣鍵盤拓展)。另外在程序中寫定一個音樂的樂譜,實現音樂播放器的演示功能,如果時間允許,會在程序中存儲多段音樂,使用撥碼開關選擇播放曲目。

?

三、硬件部分

  • 實驗整體電路
  • ?

    2.揚聲器簡易驅動電路:

    ?

    四、軟件部分

    1.系統主頻

    獲取系統主頻由開發板主頻經過10分頻得到:50MHz分頻為5MHz

    ???????? 代碼(digital_piano.v):??????

    /* 10分頻:50MHz到5Mhz分頻 */always@(posedge inclk)???????????????????????????begin???if(cnt<3'd5)cnt <= cnt + 3'b1;elsebegincnt <= 3'b0;clk_5MHz <= ~clk_5MHz;endend

    ?

    2.電子琴子模塊

    ?讀取輸入的輕觸按鍵的狀態,決定聲音頻率,再通過計數器實現定頻率方波的輸出,作為揚聲器的驅動信號。其中origin的值為根據各個音調對應的聲音頻率換算確定的。

    ???????? 代碼(piano.v):???????

    ? /* piano子模塊 */module piano(inclk, clk_5MHz, key_in, beep);input? inclk;????????????????????? //開發板主頻input? clk_5MHz;???????????? //系統時鐘input [3:0] ?key_in;???????? //輕觸按鍵輸入output ?beep;? ?????????????? //揚聲器輸出wire carry;reg beep_r;???????assign beep = beep_r;?????? //輸出音樂/* 按鍵轉換音調輸出 */always @ (posedge clk_5MHz)begincase (key_in[3:0])/* 消除不按時的噪聲 */4'b0000: origin<=0000;4'b0001: origin<=6826;?? // Hdo4'b0010: origin<=7871;?? // Hre4'b0100: origin<=8798;?? // Hmi4'b1000: origin<=9224;?? // Hfadefault: origin<=0000;endcaseendassign carry=(count == 16383);/* 獲取驅動信號 */always @(posedge clk_5MHz)begin?if(key_in[3:0] == 4'b0000)beginendelseif(carry)count = origin;elsecount = count + 1;end/* 揚聲器驅動 */always @(posedge carry)beginbeep_r<=~beep_r;endendmodule

    3.音樂播放器子模塊

    ?????? 音樂播放器子模塊首先通過分頻實現了一個低頻時鐘(這里采用5Hz),作為音樂的節拍器。然后調用按照程序翻譯出來的曲譜函數(這里由于時間原因僅翻譯了天空之城一首音樂的一部分)。

    ?????? 代碼(song.v):????????

    module song(clk_5MHz, select, beep);input clk_5MHz;input select;?????????????? //音樂播放暫停選項???????????????? ??????output beep;????????????? //蜂鳴器輸出reg? [25:0] cnt2;???? //計數器reg? clk_5Hz;wire? beep_r;wire out3;????????????????? //曲譜的輸出wire clk;assign beep = beep_r;/* 調用曲譜模塊——模擬有限狀態機實現 *//* 《天空之城》 */song3 m3(.clk_5MHz(clk_5MHz),.clk_4Hz(clk),.select(select),.beep(out3));assign beep_r = out3;assign clk = clk_5Hz;/* 5hz分頻 */always@(posedge clk_5MHz)??????????????????begin???//???? if(select)//???? beginif(cnt2<25'd400000)cnt2 <= cnt2+25'b1;elsebegincnt2<=25'b0;clk_5Hz <= ~clk_5Hz;end//???? endendendmodule

    4.曲譜子模塊

    ???????? 這里對天空之城曲譜的一部分進行了翻譯,由于鋼琴譜比較復雜,且一般為雙手譜,這里選擇了一個較為簡單的吉他譜,按照吉他譜中的簡譜進行逐拍翻譯。

    ???????? 曲譜如下:

    ?

    ?

    ???????? 代碼(song3.v):??????

    /* 《天空之城》 */module song3(clk_5MHz,clk_4Hz,select,beep);input clk_5MHz,clk_4Hz,select;?? //系統時鐘,節拍時鐘,播放暫停選項output beep;????????????????????????????????????????? //揚聲器輸出?reg? [3:0] high,med,low;reg? [15:0] origin;reg??? beep_r;?????????????????????????????????????????? ?reg? [7:0] state;???????????????????????????????????????????reg? [15:0] count;????????????????????assign beep = beep_r;?????? ????/* 揚聲器基本驅動 */always @(posedge clk_5MHz)begin/* 計數器 */count <= count + 1'b1;?????????????If(count == origin)begin/* 計數器清零 */count <= 16'h0;??????????????????????????/* 輸出取反 */beep_r <= !beep_r;????????????endend/* 音調輸出轉換 */always@(posedge clk_4Hz)beginif(select)begincase({high,med,low})/*? 24音轉換為方波頻率 */'b000000000001:origin=22900; //低1'b000000000010:origin=20408; //低2'b000000000011:origin=18181; //低3'b000000000100:origin=17142; //低4'b000000000101:origin=15267; //低5'b000000000110:origin=13605; //低6'b000000000111:origin=12121; //低7'b000000010000:origin=11472; //中1'b000000100000:origin=10216; //中2'b000000110000:origin=9101;? //中3'b000000111000:origin=8571;? //中4'b000001010000:origin=7653;? //中5'b000001100000:origin=6818;? //中6'b000010000000:origin=6060;? //中7'b000100000000:origin=5733;? //高1'b001000000000:origin=5108;? //高2'b001100000000:origin=4551;? //高3'b001010000000:origin=4294;? //高4'b010000000000:origin=3826;? //高5'b011000000000:origin=3409;? //高6'b010100000000:origin=3050; ?//高7endcaseendelse/* 消除雜音 */origin=0000;end/* 《天空之城》樂譜翻譯 */always @(posedge clk_4Hz)??beginif(select)begin/* 全曲總節拍數 */if(state ==193)/* 自動重放 */state = 0;else/* 節拍計數 */state = state + 1'b1;case(state)/* 按小節間隔 *//* 1 */0:?????????????? ??????????????????????????????????????????????????????? {high,med,low}='b000001100000;//中61:?????????????? ??????????????????????????????????????????????????????? {high,med,low}='b000010000000;//中7? ? ? ? ? ? ??/* 2 */2,3,4:???????? ??????????????????????????????????????????????????????? {high,med,low}='b000100000000;//高15:?????????????? ??????????????????????????????????????????????????????? {high,med,low}='b000010000000;//中76,7:???? ???????????????????????????????????????????????????????? {high,med,low}='b000100000000;//高18,9:??????????? ??????????????????????????????????????????????????????? {high,med,low}='b001100000000;//高3? ??/* 3 */10,11,12,13,14,15:?? ???????? ??????????????????????????? {high,med,low}='b000010000000;//中716,17:??????????? ??????? ??????????????????????????? high,med,low}='b000000110000;//中3/* 4 */???????????????18,19,20:????????????????????????????? ??????????????????????????? {high,med,low}='b000001100000;//中621:???????????? ????????????????????????? ??????????????????????????? {high,med,low}='b000001010000;//中522,23:????????????? ??? ??????????????????????????? {high,med,low}='b000001100000;//中624,25:?????????????????????????????????? ??????????????????????????? {high,med,low}='b000100000000;//高1………………………………../* 25 */186,187,188,189,190,191,192,193:????????? {high,med,low}='b001100000000;//高3???????endcaseendendendmodule

    ?

    5.管腳定義

    ?????? 代碼(digital_piano_ucf.ucf):????????

    NET "inclk" ??? LOC = "B8";??????????????? //開發板主頻NET "select" LOC = "N3"; ??????????????? //撥碼開關作為播放器暫停選項/* 雙聲道輸出:電子琴&音樂播放器,互不干擾NET "out_r"? LOC = "D12";????????????? //右聲道輸出NET "out_l"? LOC = "C9";????????????????? //左聲道輸出/* 電子琴演示琴鍵:輕觸開關 */NET "key_in[3]" LOC = "G12"; ??????NET "key_in[2]" LOC = "C11";NET "key_in[1]" LOC = "M4";NET "key_in[0]" LOC = "A7";NET "select" CLOCK_DEDICATED_ROUTE = FALSE;

    如有問題歡迎指正交流。

    ?

    ?——cloud over sky

    ?——2020/1/18

    總結

    以上是生活随笔為你收集整理的基于Basys2开发板的简易电子琴和音乐播放器设计的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。