veriloghdl电子琴课程设计.docx
《veriloghdl电子琴课程设计.docx》由会员分享,可在线阅读,更多相关《veriloghdl电子琴课程设计.docx(8页珍藏版)》请在冰点文库上搜索。
![veriloghdl电子琴课程设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/7/5f977c2e-dbed-4b54-9696-3e5f2676ba24/5f977c2e-dbed-4b54-9696-3e5f2676ba241.gif)
veriloghdl电子琴课程设计
veriloghdl电子琴课程设计
VerilogHDLelectricpianomodulefractionalfrequency第一章系统设计第一节课题目标及总体方案本次项目设计课程的目标是让我们在学习VerilogHDL的基础上更加深入的理解硬件设计语言的功能、作用及其特征,并且将我们的动手能力与创新能力结合起来。
本次电子琴实验的目标是:
1、具有手动弹奏和自动播放功能;
2、以按键(或开关)作为琴键,至少可以通过蜂鸣器输出7个音阶;
3、自动播放曲目至少两首;
本次实验的方框图为:
(每个模块中都有分频)主模块九个键Key1到Key7用于弹奏Key8与Key9(mm)用于选择歌曲mm=00按键模块Key1到Key7模块名digital_pianomm=01曲目1《两只老虎》模块名bellmm=10曲目2《康定情歌》模块名bell2mm=11曲目3《天空之城》模块名bell3第二节设计框图说明一、主模块主模块中用mm=(key8,key9)值的不同选择调用不同模块,mm=01调用曲目1模块,即bell模块;
mm=10调用曲目2模块,即bell2模块;
mm=11调用曲目3模块,即bell3模块;
而在key8与key9没有被按下的情况下,程序调用按键模块,即digital_piano模块modulemain(inclk,outclk,key1,key2,key3,key4,key5,key6,key7,key8,key9,num);inputinclk;inputkey1,key2,key3,key4,key5,key6,key7,key8,key9;outputoutclk;output[3:
0]num;regoutclk,clk_6M;reg[3:
0]c;wireout1,out2,out3,out4;wire[8:
0]key;reg[1:
0]mm;assignkey={key1,key2,key3,key4,key5,key6,key7,key8,key9};//由按键拼键为变量key//调用子调块digital_pianom1(.inclk(inclk),.key1(key1),.key2(key2),.key3(key3),.key4(key4),.key5(key5),.key6(key6),.key7(key7),.beep2(out2),.num(num));bellm2(.inclk(inclk),.beep1(out1));bell2m3(.inclk(inclk),.beep3(out3));bell3m4(.inclk(inclk),.beep4(out4));always@(posedgeclk_6M)//在时钟的上升沿检测是否有按键按下beginif(key==9'b***-*****0)mm=2'b01;elseif(key==9'b***-*****1)mm=2'b10;elseif(key==9'b***-*****0)mm=2'b11;elsemm=2'b00;endalways@(posedgeinclk)beginif(c4'd4)c=c+4'd1;elsebeginc=4'd0;clk_6M=~clk_6M;endendalways@(posedgeclk_6M)beginif(mm==2'b01)outclk=out1;elseif(mm==2'b00)outclk=out2;elseif(mm==2'b10)outclk=out3;elseoutclk=out4;endendmodule二、按键模块Key1到key7对应do到si七个音,用于模拟电子琴弹奏//digital_piano子模块moduledigital_piano(inclk,key1,key2,key3,key4,key5,key6,key7,beep2,num);inputinclk,key1,key2,key3,key4,key5,key6,key7;output[3:
0]num;outputbeep2;wire[6:
0]key_code;reg[3:
0]c;regclk_6M;regbeep_r;reg[3:
0]num;reg[15:
0]count;reg[15:
0]count_end;parameterDo=7'b***-*****,//状态机的7个编码,分别对应中音的7个音符re=7'b***-*****,mi=7'b***-*****,fa=7'b***-*****,so=7'b***-*****,la=7'b***-*****,si=7'b***-*****;assignkey_code={key7,key6,key5,key4,key3,key2,key1};assignbeep2=beep_r;//输出音乐always@(posedgeinclk)beginif(c4'd4)c=c+4'd1;elsebeginc=4'd0;clk_6M=~clk_6M;endendalways@(posedgeclk_6M)//分频模块,得出乐谱begincount=count+16'd1;//计数器加1if(count==count_end)begincount=16'd0;//计数器清零beep_r=!
beep_r;endendalways@(posedgeclk_6M)//状态机,根据按键状态,选择不同的音符输出begincase(key_code)Do:
count_end=16'd*****;re:
count_end=16'd*****;mi:
count_end=16'd09090;fa:
count_end=16'd08571;so:
count_end=16'd07802;la:
count_end=16'd06802;si:
count_end=16'd06060;default:
count_end=16'd0;endcaseendalways@(posedgeclk_6M)begincase(key_code)Do:
num=4'b0001;re:
num=4'b0010;mi:
num=4'b0011;fa:
num=4'b0100;so:
num=4'b0101;la:
num=4'b0110;si:
num=4'b0111;endcaseendendmodule二、曲目1模块//bell子模块《两只老虎》modulebell(inclk,beep1);inputinclk;//系统时钟outputbeep1;//蜂鸣器输出端reg[3:
0]high,med,low;reg[15:
0]origin;regbeep_r;//寄存器reg[7:
0]state;reg[15:
0]count;assignbeep1=beep_r;//输出音乐//时钟频率6MHzregclk_6MHz;reg[2:
0]cnt1;always@(posedgeinclk)beginif(cnt13'd4)cnt1=cnt1+3'b1;elsebegincnt1=3'b0;clk_6MHz=~clk_6MHz;endend//时钟频率4MHzregclk_4Hz;reg[24:
0]cnt2;always@(posedgeinclk)beginif(cnt225'd***-*****)cnt2=cnt2+25'b1;elsebegincnt2=25'b0;clk_4Hz=~clk_4Hz;endendalways@(posedgeclk_6MHz)begincount=count+1'b1;//计数器加1if(count==origin)begincount=16'h0;//计数器清零beep_r=!
beep_r;//输出取反endendalways@(posedgeclk_4Hz)begincase({high,med,low})12'b***-*****0000:
origin=*****;//mid112'b***-*****0000:
origin=*****;//mid212'b***-*****0000:
origin=9101;//mid312'b***-*****0000:
origin=8590;//mid412'b***-*****0000:
origin=7653;//mid512'b***-*****0000:
origin=6818;//mid612'b***-*****0101:
origin=*****;//low5endcaseendalways@(posedgeclk_4Hz)//歌曲twotigerbeginif(state==63)state=0;//计时,以实现循环演奏elsestate=state+1;case(state)0,1:
{high,med,low}=12'b***-*****0000;//mid12,3:
{high,med,low}=12'b***-*****0000;//mid24,5:
{high,med,low}=12'b***-*****0000;//mid36,7:
{high,med,low}=12'b***-*****0000;//mid18,9:
{high,med,low}=12'b***-*****0000;//mid110,11:
{high,med,low}=12'b***-*****0000;//mid212,13:
{high,med,low}=12'b***-*****0000;//mid314,15:
{high,med,low}=12'b***-*****0000;//mid116,17:
{high,med,low}=12'b***-*****0000;//mid318,19:
{high,med,low}=12'b***-*****0000;//mid420,21,22,23:
{high,med,low}=12'b***-*****0000;//mid524,25:
{high,med,low}=12'b***-*****0000;//mid326,27:
{high,med,low}=12'b***-*****0000;//mid428,29,30,31:
{high,med,low}=12'b***-*****0000;//mid532:
{high,med,low}=12'b***-*****0000;//mid533:
{high,med,low}=12'b***-*****0000;//mid634:
{high,med,low}=12'b***-*****0000;//mid535:
{high,med,low}=12'b***-*****0000;//mid436,37:
{high,med,low}=12'b***-*****0000;//mid338,39:
{high,med,low}=12'b***-*****0000;//mid140:
{high,med,low}=12'b***-*****0000;//mid541:
{high,med,low}=12'b***-*****0000;//mid642:
{high,med,low}=12'b***-*****0000;//mid543:
{high,med,low}=12'b***-*****0000;//mid444,45:
{high,med,low}=12'b***-*****0000;//mid346,47:
{high,med,low}=12'b***-*****0000;//mid148,49:
{high,med,low}=12'b***-*****0000;//mid250,51:
{high,med,low}=12'b***-*****0101;//low552,53,54,55:
{high,med,low}=12'b***-*****0000;//mid156,56:
{high,med,low}=12'b***-*****0000;//mid257,58:
{high,med,low}=12'b***-*****0101;//low559,60,61,62,63:
{high,med,low}=12'b***-*****0000;//mid1default:
{high,med,low}=12'bx;endcaseendendmodule三、曲目2模块//bell2子模块《康定情歌》modulebell2(inclk,beep3);inputinclk;//系统时钟outputbeep3;//蜂鸣器输出端reg[3:
0]high,med,low;reg[15:
0]origin;regbeep_r;//寄存器reg[7:
0]state;reg[15:
0]count;assignbeep3=beep_r;//输出音乐//时钟频率6MHzregclk_6MHz;reg[2:
0]cnt1;always@(posedgeinclk)beginif(cnt13'd4)cnt1=cnt1+3'b1;elsebegincnt1=3'b0;clk_6MHz=~clk_6MHz;endend//时钟频率4MHzregclk_4Hz;reg[24:
0]cnt2;always@(posedgeinclk)beginif(cnt225'd***-*****)cnt2=cnt2+25'b1;elsebegincnt2=25'b0;clk_4Hz=~clk_4Hz;endendalways@(posedgeclk_6MHz)begincount=count+1'b1;//计数器加1if(count==origin)begincount=16'h0;//计数器清零beep_r=!
beep_r;//输出取反endendalways@(posedgeclk_4Hz)begincase({high,med,low})'b***-*****0001:
origin=*****;//低1'b***-*****0010:
origin=*****;//低2'b***-*****0011:
origin=*****;//低3'b***-*****0101:
origin=*****;//低5'b***-*****0110:
origin=*****;//低6'b***-*****0111:
origin=*****;//中1'b***-*****0000:
origin=*****;//中2'b***-*****0000:
origin=9101;//中3'b***-*****0000:
origin=7653;//中5'b***-*****0000:
origin=6818;//中6'b***-*****0000:
origin=5733;//高1'b***-*****0000:
origin=5108;//高2'b***-*****0000:
origin=4551;//高3endcaseendalways@(posedgeclk_4Hz)beginif(state==103)state=0;elsestate=state+1;//《康定情歌》case(state)0,1:
{high,med,low}='b***-*****0000;//中32,3:
{high,med,low}='b***-*****0000;//中54,5:
{high,med,low}='b***-*****0000;//中66:
{high,med,low}='b***-*****0000;//中67:
{high,med,low}='b***-*****0000;//中58,9,10:
{high,med,low}='b***-*****0000;//中611:
{high,med,low}='b***-*****0000;//中312,13,14,15:
{high,med,low}='b***-*****0000;//中216,17:
{high,med,low}='b***-*****0000;//中318,19:
{high,med,low}='b***-*****0000;//中520,21:
{high,med,low}='b***-*****0000;//中622:
{high,med,low}='b***-*****0000;//中623:
{high,med,low}='b***-*****0000;//中524,25:
{high,med,low}='b***-*****0000;//中626,27,28,29,30,31:
{high,med,low}='b***-*****0000;//中332,33:
{high,med,low}='b***-*****0000;//中334,35:
{high,med,low}='b***-*****0000;//中536,37:
{high,med,low}='b***-*****0000;//中638:
{high,med,low}='b***-*****0000;//中639:
{high,med,low}='b***-*****0000;//中540,41,42:
{high,med,low}='b***-*****0000;//中643:
{high,med,low}='b***-*****0000;//中344,45,46,47:
{high,med,low}='b***-*****0000;//中248,49:
{high,med,low}='b***-*****0101;//中550,51:
{high,med,low}='b***-*****0000;//中352:
{high,med,low}='b***-*****0000;//中253:
{high,med,low}='b***-*****0000;//中354:
{high,med,low}='b***-*****0000;//中255:
{high,med,low}='b***-*****0111;//156,57:
{high,med,low}='b***-*****0000;//中258,59,60,61,62,63:
{high,med,low}='b***-*****0110;//低664,65:
{high,med,low}='b***-*****0000;//中666,67,68,69,70,71:
{high,med,low}='b***-*****0000;//中272,73:
{high,med,low}='b***-*****0101;//中574,75,76,77,78,79:
{high,med,low}='b***-*****0000;//中380:
{high,med,low}='b***-*****0000;//中281:
{high,med,low}='b***-*****0111;//182,83,84,85,86,87:
{high,med,low}='b***-*****0000;//中688,89:
{high,med,low}='b***-*****0101;//中590,91:
{high,med,low}='b***-*****0000;//中392:
{high,med,low}='b***-*****0000;//中293:
{high,med,low}='b***-*****0000;//中394:
{high,med,low}='b***-*****0000;//中295:
{high,med,low}='b***-*****0111;//196,97:
{high,med,low}='b***-*****0000;//中298,99,100,101,102,103:
{high,med,low}='b***-*****0000;//中6endcaseendendmodule四、曲目3模块//bell3子模块《天空之城》modulebell3(inclk,beep4);inputinclk;//系统时钟outputbeep4;//蜂鸣器输出端reg[3:
0]high,med,low;reg[15:
0]origin;regbeep_r;//寄存器reg[7:
0]state;reg[15:
0]count;assignbeep4=beep_r;//输出音乐//时钟频率6MHzregclk_6MHz;reg[2:
0]cnt1;always@(posedgeinclk)beginif(cnt13'd4)cnt1=cnt1+3'b1;elsebegincnt1=3'b0;clk_6MHz=~clk_6MHz;endend//时钟频率4MHzregclk_4Hz;reg[24:
0]cnt2;always@(posedgeinclk)beginif(cnt225'd***-*****)cnt2=cnt2+25'b1;elsebegincnt2=25'b0;clk_4Hz=~clk_4Hz;endendalways@(posedgeclk_6MHz)begincount=count+1'b1;//计数器加1if(count==origin)begincount=16'h0;//计数器清零beep_r=!
beep_r;//输出取反endendalways@(posedgeclk_4Hz)begincase({high,med,low})'b***-*****0001:
origin=*****;//低1'b***-*****0010:
origin=*****;//低2'b***-*****0011:
origin=*****;//低3'b***-*****0100:
origin=*****;//低4'b***-*****0101:
origin=*****;//低5'b***-*****0110:
origin=*****;//低6'b***-*****0111:
origin=*****;//低7'b***-*****0111:
origin=*****;//中1'b***-*****0000:
origin=*****;//中2'b***-*****0000:
origin