基于Basys2开发板的简易电子琴和音乐播放器设计
背景:華中科技大學(xué) 電測綜合實驗
?
主要功能:Basys2開發(fā)板外接一個揚聲器(或無源蜂鳴器也可)實現(xiàn)電子琴和音樂播放器的功能。其中由于開發(fā)板上只有4個按鍵,所以電子琴功能只做了4個音調(diào),分別對應(yīng)于4個輕觸開關(guān)。音樂播放器功能需要根據(jù)挑選出來的樂譜,人工翻譯為代碼中對應(yīng)的音調(diào)代碼,然后輸入到代碼的狀態(tài)機之中。兩個功能分別采用兩個不同的聲道輸出,因此兩個功能互不干擾,可以同時進(jìn)行。實現(xiàn)了一個符合綜合實驗要求的簡單項目。因為沒有隊友,是一個人不到2天的時間趕出來的成果,所以比較簡易,給需要的人做一個參考。
?
ISE工程文件(github鏈接)(包含實驗報告):https://github.com/W-yt/yutian_sundry_zip/blob/master/piano%26palyer.zip
?
以下直接粘貼課設(shè)報告的主要內(nèi)容。
如有問題歡迎指正交流。
?
一、實驗?zāi)康?/h1>
1.熟練掌握Basys2的開發(fā)流程;
2.提高FPGA綜合調(diào)試的能力;
?
二、實驗選題及設(shè)計目標(biāo)
實驗選題:音樂播放器+電子琴(雙聲道)
?
?項目目標(biāo):本項目要設(shè)計實現(xiàn)一個基于BASYS2的多功能電子琴,音樂播放和電子琴各占用一個聲道的雙聲道電子琴。計劃采用兩個揚聲器作為雙聲道的輸出設(shè)備,利用撥碼開關(guān)實現(xiàn)音樂播放器的控制,利用輕觸開關(guān)實現(xiàn)電子琴的琴鍵(這里由于BASYS2開發(fā)板上只有4個輕觸開關(guān),因此電子琴部分僅選用了四個音,僅用來演示電子琴的實現(xiàn)原理,也可以外接按鍵,或者矩陣鍵盤拓展)。另外在程序中寫定一個音樂的樂譜,實現(xiàn)音樂播放器的演示功能,如果時間允許,會在程序中存儲多段音樂,使用撥碼開關(guān)選擇播放曲目。
?
三、硬件部分
?
2.揚聲器簡易驅(qū)動電路:
?
四、軟件部分
1.系統(tǒng)主頻
獲取系統(tǒng)主頻由開發(fā)板主頻經(jīng)過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.電子琴子模塊
?讀取輸入的輕觸按鍵的狀態(tài),決定聲音頻率,再通過計數(shù)器實現(xiàn)定頻率方波的輸出,作為揚聲器的驅(qū)動信號。其中origin的值為根據(jù)各個音調(diào)對應(yīng)的聲音頻率換算確定的。
???????? 代碼(piano.v):???????
? /* piano子模塊 */module piano(inclk, clk_5MHz, key_in, beep);input? inclk;????????????????????? //開發(fā)板主頻input? clk_5MHz;???????????? //系統(tǒng)時鐘input [3:0] ?key_in;???????? //輕觸按鍵輸入output ?beep;? ?????????????? //揚聲器輸出wire carry;reg beep_r;???????assign beep = beep_r;?????? //輸出音樂/* 按鍵轉(zhuǎn)換音調(diào)輸出 */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);/* 獲取驅(qū)動信號 */always @(posedge clk_5MHz)begin?if(key_in[3:0] == 4'b0000)beginendelseif(carry)count = origin;elsecount = count + 1;end/* 揚聲器驅(qū)動 */always @(posedge carry)beginbeep_r<=~beep_r;endendmodule3.音樂播放器子模塊
?????? 音樂播放器子模塊首先通過分頻實現(xiàn)了一個低頻時鐘(這里采用5Hz),作為音樂的節(jié)拍器。然后調(diào)用按照程序翻譯出來的曲譜函數(shù)(這里由于時間原因僅翻譯了天空之城一首音樂的一部分)。
?????? 代碼(song.v):????????
module song(clk_5MHz, select, beep);input clk_5MHz;input select;?????????????? //音樂播放暫停選項???????????????? ??????output beep;????????????? //蜂鳴器輸出reg? [25:0] cnt2;???? //計數(shù)器reg? clk_5Hz;wire? beep_r;wire out3;????????????????? //曲譜的輸出wire clk;assign beep = beep_r;/* 調(diào)用曲譜模塊——模擬有限狀態(tài)機實現(xiàn) *//* 《天空之城》 */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//???? endendendmodule4.曲譜子模塊
???????? 這里對天空之城曲譜的一部分進(jìn)行了翻譯,由于鋼琴譜比較復(fù)雜,且一般為雙手譜,這里選擇了一個較為簡單的吉他譜,按照吉他譜中的簡譜進(jìn)行逐拍翻譯。
???????? 曲譜如下:
?
?
???????? 代碼(song3.v):??????
/* 《天空之城》 */module song3(clk_5MHz,clk_4Hz,select,beep);input clk_5MHz,clk_4Hz,select;?? //系統(tǒng)時鐘,節(jié)拍時鐘,播放暫停選項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;?????? ????/* 揚聲器基本驅(qū)動 */always @(posedge clk_5MHz)begin/* 計數(shù)器 */count <= count + 1'b1;?????????????If(count == origin)begin/* 計數(shù)器清零 */count <= 16'h0;??????????????????????????/* 輸出取反 */beep_r <= !beep_r;????????????endend/* 音調(diào)輸出轉(zhuǎn)換 */always@(posedge clk_4Hz)beginif(select)begincase({high,med,low})/*? 24音轉(zhuǎn)換為方波頻率 */'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/* 全曲總節(jié)拍數(shù) */if(state ==193)/* 自動重放 */state = 0;else/* 節(jié)拍計數(shù) */state = state + 1'b1;case(state)/* 按小節(jié)間隔 *//* 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";??????????????? //開發(fā)板主頻NET "select" LOC = "N3"; ??????????????? //撥碼開關(guān)作為播放器暫停選項/* 雙聲道輸出:電子琴&音樂播放器,互不干擾NET "out_r"? LOC = "D12";????????????? //右聲道輸出NET "out_l"? LOC = "C9";????????????????? //左聲道輸出/* 電子琴演示琴鍵:輕觸開關(guān) */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
總結(jié)
以上是生活随笔為你收集整理的基于Basys2开发板的简易电子琴和音乐播放器设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟机使用pc摄像头
- 下一篇: 计算机在工程设计的应用,计算机辅助软件和