当前位置:文档之家› FPGA课程设计报告--简易电子琴的设计

FPGA课程设计报告--简易电子琴的设计

邮电大学FPGA课程设计报告题目:简易电子琴设计及FPGA功能验证院系:专业班级:学生:XX导师:XX起止时间:2012、6、18至2012、6、29一、课程设计任务:本设计一个简易电子琴,具体功能如下:1、具有手动弹奏和自动播放功能;2、以按键或开关作为电子琴的琴键,输出7个音节的音阶;3、可以自动播放曲目至少两首。

二、课程设计目的:1、培养综合运用知识和独立开展实践创新的能力;2、深入学习Verilog HDL,了解其编程环境;3、学会运用Modelsim和Quartus II等编程仿真软件;4、将硬件语言编程与硬件实物功能演示相结合,加深理解Verilog HDL的学习;三、使用环境:1、软件:Modelsim和Quartus II等编程仿真软件;2、硬件:FPGA开发板。

四、课程设计详细方案及功能验证:1、总体实现方案:1、简易电子琴的设计通过软硬件结合实现,硬件系统包括主控器芯片、9个按键、LED、蜂鸣器等,软件资源包括编写Verilog HDL程序的应用软件Modelsim和仿真软件Quartus II。

电子琴有按键代替琴键的弹奏功能和自动播放功能。

2、整个程序总共分5个模块:主模块,按键模块,曲目1模块,曲目2模块,曲目3模块。

整个方案总共用了9个按键(key1~key9),按键key1~key7作为琴键,通过这七个按键键入不同的音阶。

主模块中key8、key9两个按键用于选择是自动播放还是弹奏曲目,令mm=(key8、key9),用mm值的不同选择调用不同模块。

如果mm=00,则程序调用按键模块;如果mm=01,则调用曲目1模块,播放曲目1;如果mm=10,则调用曲目2模块,播放曲目2;如果mm11,则调用曲目3模块,播放曲目3。

本次设计的框图:2、输入输出信号描述:具体功能描述:3、顶层划分:主模 (outclk beep_r4、主要模块:主模块:功能描述:是四个子模块的核心,通过主模块分别调用四个不同的子模块。

管脚描述:按键模块:功能描述:通过按键key1~key7键入不同的7个音阶,频率不同则蜂鸣器发音就不同;通过mm=(key8、key9)的值选择调用不同曲目模块。

管脚描述:曲目模块:功能描述:不同的曲目模块输出不同的曲调,根据高低音对应的频率不同输出不同曲调的曲目。

在50MHZ的情况下对主时钟分频得到6MHZ的频率,得到在6MHZ下对应的音阶及其对应频率,以及分频数,通过计数分频数,来对不同频率的声音进行输出,实验箱原始时钟为50MHz,分频后变成不同的频率输出,通过蜂鸣器输出不同频率的声音。

音乐的节拍通过分频变为4Hz,作为1/4拍,即每个单位时长0.25s。

管脚描述:信号名称输入/ 输出源功能描述inclk Input Pin 系统时钟50MHzKey(8~9) Input Pin 选择曲目Beep3 Output Pin 输出曲目5、功能仿真:1、综合:2、总体电路图:3、所有输入输出信号:4、管脚分配:输入信号:一个时钟信号,9个按键;输出信号:一个数码管输出,一个蜂鸣器输出音调。

5、时序仿真:仿真结果;设置输入信号key1~key7为高电平,此时设置key8~key9=01,即mm=01,在数码管应该显示1,在仿真结束后,如图示数码管为11111001,即为1,outclk为蜂鸣器的输出,如图示也正确,所以本设计经过仿真证明正确可行。

6、硬件测试结果:在时序验证后下载,通过硬件测试,实验达到预期效果,当mm(key8~key9)=00时,通过key1~key7这7个按键的键入蜂鸣器可以发出do~xi的七个音阶的音,即表示了电子琴的弹奏功能;当mm=01时,播放了第一首歌;mm=10时,播放了第二首歌;mm=11时,播放第三首歌。

通过硬件的测试,所有的设计目标均实现。

7、对结果和结论的问题讨论:实验过程中,蜂鸣器发音时好时坏,有时比较低沉,有时却比较尖锐,这可能是对主系统分频不精确导致的结果,当对主系统时钟不同分频时,结果都不同,最终在多次试验下,得到在6M时钟频率下效果最为理想。

8、音阶及其对应频率(时钟频率为50MHz分为6MHz)五、心得体会:在这次课程设计之前,其实做过了单片机关于蜂鸣器方面的实验,上手起来还是很快的,开始时,先按照老师的要求,写规,确定实现方案,然后在逐一细化,一步一步按照要求去完成整个设计。

本次设计要用quartusII软件,由于之前对此软件不是太熟悉所以导致了一些错误和问题的发生,所以这次课程设计中认真学习了quartusII软件的具体使用步骤和操作流程,对所有可能出现的问题进行逐一攻破。

通过这次实验,我不但熟悉了quartusII软件,也了解了开发的最基本流程和方法,也进一步加深了对Verilog编程语言的理解,最重要的是锻炼了我独立思考和分析的逻辑能力,通过从顶向下的设计方法,一步步实现,然后将整个设计串套起来,是我对设计的流程以及编程有了很大的提高。

通过此次硬件课程设计,使我越来越认识到一点,编程对项目实现有着至关重要的作用,我们在硬件开发的过程中必须重视编程,将编程看作是完善开发的不可缺少的一部分。

在一次次的反复设计、论证和测试中,不仅提高了逻辑分析能力、全面分析问题的能力,还提升了发现问题、解决问题的能力。

虽然设计过程比较繁琐,大大小小也出现了许多问题,但这却磨练了我的意志。

通过各方面的学习,使我的知识面进一步拓宽了。

同时,通过本次课程设计,使我也发现了自己的不足,例如:逻辑分析能力不突出,编程能力不足,解决问题的能力不足,使我认识到在以后的学习中在这些方面要多努力,加以改进,提升自我能力。

我相信通过这次课程设计的学习,对我以后有着十分重要的影响和作用。

附代码:moduledianziqin(inclk,outclk,key1,key2,key3,key4,key5,key6,key7,key8,key9,num);input inclk;input key1,key2,key3,key4,key5,key6,key7,key8,key9;output outclk;output[7:0]num;reg [7:0] num;reg outclk,clk_6M;reg [3:0]c;wire out1,out2,out3,out4;wire[8:0] key;reg [1:0]mm;assign key = {key1,key2,key3,key4,key5,key6,key7,key8,key9}; //由按键拼键为变量key//调用子调块digital_piano m1(.inclk(inclk),.key1(key1),.key2(key2),.key3(key3),.key4(key4),.key5(key5),.key6(key6),.key7(key7),.beep4(out4));bell m2(.inclk(inclk),.beep1(out1));bell2 m3(.inclk(inclk),.beep2(out2));bell3 m4(.inclk(inclk),.beep3(out3));always(posedge inclk)beginif(c<4'd8)c<=c+4'd1;elsebeginc <= 4'd0;clk_6M <= ~clk_6M;endendalways (posedge clk_6M) //在时钟的上升沿检测是否有按键按下beginif(key == 9'b111111110)mm <= 2'b01;else if(key==9'b111111101)mm <= 2'b10;else if(key==9'b111111100)mm <= 2'b11;else mm <= 2'b00;endalways(mm)begincase(mm)2'b01:num<=8'b11111001;2'b10:num<=8'b10100100;2'b11:num<=8'b10110000;default:num<=8'b11000000;endcaseendalways (mm) //按键响应beginif(mm == 2'b01)outclk <= out1;else if(mm == 2'b10)outclk <= out2;else if(mm == 2'b11)outclk <= out3;else outclk <= out4;endendmodule//digital_piano子模块module digital_piano(inclk,key1,key2,key3,key4,key5,key6,key7,beep4); input inclk,key1,key2,key3,key4,key5,key6,key7;output beep4;wire [6:0] key_code;reg [3:0] c;reg clk_6M;reg beep_r;reg [15:0] count;reg [15:0] count_end;parameter Do = 7'b1111110,re = 7'b1111101,mi = 7'b1111011,fa = 7'b1110111,so = 7'b1101111,la = 7'b1011111,si = 7'b0111111;assign key_code = {key7,key6,key5,key4,key3,key2,key1}; assign beep4 = beep_r; //输出音乐always(posedge inclk)beginif(c<4'd8)c<=c+4'd1;elsebeginc <= 4'd0;clk_6M <= ~clk_6M;endendalways(posedge clk_6M) //分频模块,得出乐谱begincount <= count + 16'd1; //计数器加1if(count == count_end)begincount <=16'd0; //计数器清零beep_r <= !beep_r;endendalways(posedge clk_6M) //状态机,根据按键状态,选择不同的音符输出begincase(key_code)Do: count_end <= 16'd11450;re: count_end <= 16'd10204;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;endcaseendendmodule//bell子模块《两只老虎》module bell(inclk,beep1);input inclk; //系统时钟output beep1; //蜂鸣器输出端reg [3:0]high,med,low;reg [15:0]origin;reg beep_r; //寄存器reg [7:0]state;reg [15:0]count;assign beep1=beep_r; //输出音乐//时钟频率6MHzreg clk_6MHz;reg [2:0]t1;always(posedge inclk)beginif(cnt1<3'd8)cnt1<=cnt1+3'b1;elsebegincnt1<=3'b0;clk_6MHz<=~clk_6MHz;endend//时钟频率4MHzreg clk_4Hz;reg [24:0]t2;always(posedge inclk)beginif(cnt2<25'd1*******)//cnt2<=cnt2+25'b1;elsebegincnt2<=25'b0;clk_4Hz<=~clk_4Hz;endendalways (posedge clk_6MHz)begincount <= count + 1'b1; //计数器加1 if(count == origin)begincount <= 16'h0; //计数器清零beep_r <= !beep_r; //输出取反endendalways(posedge clk_4Hz)begincase({high,med,low})12'b000000010000:origin=11466;//mid112'b000000100000:origin=10216;//mid212'b000000110000:origin=9101; //mid312'b000001000000:origin=8590; //mid412'b000001010000:origin=7653; //mid512'b000001100000:origin=6818; //mid612'b000000000101:origin=14447;//low5endcaseendalways (posedge clk_4Hz) //歌曲<<two tiger>> beginif(state ==63) state = 0;//计时,以实现循环演奏elsestate = state + 1;case(state)0,1:{high,med,low}=12'b000000010000;//mid12,3:{high,med,low}=12'b000000100000;//mid24,5:{high,med,low}=12'b000000110000;//mid36,7:{high,med,low}=12'b000000010000;//mid18,9:{high,med,low}=12'b000000010000;//mid110,11:{high,med,low}=12'b000000100000;//mid212,13:{high,med,low}=12'b000000110000;//mid314,15:{high,med,low}=12'b000000010000;//mid116,17:{high,med,low}=12'b000000110000;//mid318,19:{high,med,low}=12'b000001000000;//mid420,21,22,23:{high,med,low}=12'b000001010000;//mid524,25:{high,med,low}=12'b000000110000;//mid326,27:{high,med,low}=12'b000001000000;//mid428,29,30,31:{high,med,low}=12'b000001010000;//mid532:{high,med,low}=12'b000001010000;//mid533:{high,med,low}=12'b000001100000;//mid634:{high,med,low}=12'b000001010000;//mid535:{high,med,low}=12'b000001000000;//mid436,37:{high,med,low}=12'b000000110000;//mid338,39:{high,med,low}=12'b000000010000;//mid140:{high,med,low}=12'b000001010000;//mid541:{high,med,low}=12'b000001100000;//mid642:{high,med,low}=12'b000001010000;//mid543:{high,med,low}=12'b000001000000;//mid444,45:{high,med,low}=12'b000000110000;//mid346,47:{high,med,low}=12'b000000010000;//mid148,49:{high,med,low}=12'b000000100000;//mid250,51:{high,med,low}=12'b000000000101;//low552,53,54,55:{high,med,low}=12'b000000010000;//mid156,56:{high,med,low}=12'b000000100000;//mid257,58:{high,med,low}=12'b000000000101;//low559,60,61,62,63:{high,med,low}=12'b000000010000;//mid1default : {high,med,low}=12'bx;endcaseendendmodule//bell2子模块《情歌》module bell2 (inclk,beep2);input inclk; //系统时钟output beep2; //蜂鸣器输出端reg [3:0]high,med,low;reg [15:0]origin;reg beep_r; //寄存器reg [7:0]state;reg [15:0]count;assign beep2=beep_r; //输出音乐//时钟频率6MHzreg clk_6MHz;reg [2:0]t1;always(posedge inclk)beginif(cnt1<3'd8) //8cnt1<=cnt1+3'b1;elsebegincnt1<=3'b0;clk_6MHz<=~clk_6MHz;endend//时钟频率4MHzreg clk_4Hz;reg [24:0]t2;always(posedge inclk)beginif(cnt2<25'd1*******)//13000000cnt2<=cnt2+25'b1;elsebegincnt2<=25'b0;clk_4Hz<=~clk_4Hz;endendalways (posedge clk_6MHz)begincount <= count + 1'b1; //计数器加1 if(count == origin)begincount <= 16'h0; //计数器清零beep_r <= !beep_r; //输出取反endendalways(posedge clk_4Hz)begincase({high,med,low})'b000000000001:origin=22900; //低1'b000000000010:origin=20408; //低2'b000000000011:origin=18181; //低3 'b000000000101:origin=15267; //低5'b000000000110:origin=13605; //低6 'b000000000111:origin=11472; //中1'b000000100000:origin=10216; //中2'b000000110000:origin=9101; //中3'b000001010000:origin=7653; //中5'b000001100000:origin=6818; //中6'b000100000000:origin=5733; //高1'b001000000000:origin=5108; //高2'b001100000000:origin=4551; //高3endcaseendalways (posedge clk_4Hz)beginif(state ==103)state = 0;elsestate = state + 1; //《情歌》case(state)0,1: {high,med,low}='b000000110000;//中32,3: {high,med,low}='b000001010000;//中54,5: {high,med,low}='b000001100000;//中66: {high,med,low}='b000001100000;//中67: {high,med,low}='b000001010000;//中58,9,10: {high,med,low}='b000001100000;//中611: {high,med,low}='b000000110000;//中312,13,14,15: {high,med,low}='b000000100000;//中216,17: {high,med,low}='b000000110000;//中318,19: {high,med,low}='b000001010000;//中520,21: {high,med,low}='b000001100000;//中622: {high,med,low}='b000001100000;//中623: {high,med,low}='b000001010000;//中524,25: {high,med,low}='b000001100000;//中626,27,28,29,30,31:{high,med,low}='b000000110000;//中332,33: {high,med,low}='b000000110000;//中334,35: {high,med,low}='b000001010000;//中538: {high,med,low}='b000001100000;//中6 39: {high,med,low}='b000001010000;//中5 40,41,42: {high,med,low}='b000001100000;//中6 43: {high,med,low}='b000000110000;//中3 44,45,46,47: {high,med,low}='b000000100000;//中2 48,49: {high,med,low}='b000000000101;//中5 50,51: {high,med,low}='b000000110000;//中3 52: {high,med,low}='b000000100000;//中2 53: {high,med,low}='b000000110000;//中3 54: {high,med,low}='b000000100000;//中2 55: {high,med,low}='b000000000111;//1 56,57: {high,med,low}='b000000100000;//中2 58,59,60,61,62,63:{high,med,low}='b000000000110;//低6 64,65: {high,med,low}='b000001100000;//中6 66,67,68,69,70,71:{high,med,low}='b000000100000;//中2 72,73: {high,med,low}='b000000000101;//中5 74,75,76,77,78,79:{high,med,low}='b000000110000;//中3 80: {high,med,low}='b000000100000;//中2 81: {high,med,low}='b000000000111;//1 82,83,84,85,86,87:{high,med,low}='b000001100000;//中6 88,89: {high,med,low}='b000000000101;//中592: {high,med,low}='b000000100000;//中293: {high,med,low}='b000000110000;//中394: {high,med,low}='b000000100000;//中295: {high,med,low}='b000000000111;//196,97: {high,med,low}='b000000100000;//中298,99,100,101,102,103:{high,med,low}='b000001100000;//中6 endcaseendendmodule//bell3子模块《天空之城》module bell3 (inclk,beep3);input inclk; //系统时钟output beep3; //蜂鸣器输出端reg [3:0]high,med,low;reg [15:0]origin;reg beep_r; //寄存器reg [7:0]state;reg [15:0]count;assign beep3=beep_r; //输出音乐//时钟频率6MHzreg clk_6MHz;reg [2:0]t1;always(posedge inclk)beginif(cnt1<3'd8)cnt1<=cnt1+3'b1;elsebegincnt1<=3'b0;clk_6MHz<=~clk_6MHz;endend//时钟频率4MHzreg clk_4Hz;reg [24:0]t2;always(posedge inclk)beginif(cnt2<25'd1*******)//cnt2<=cnt2+25'b1;elsebegincnt2<=25'b0;clk_4Hz<=~clk_4Hz;endendalways (posedge clk_6MHz)begincount <= count + 1'b1; //计数器加1if(count == origin)begincount <= 16'h0; //计数器清零beep_r <= !beep_r; //输出取反endendalways(posedge clk_4Hz)begincase({high,med,low})'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'b000000000111: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'b010*********:origin=3826; //高5'b011000000000:origin=3409; //高6'b010*********:origin=3050; //高7endcaseendalways (posedge clk_4Hz)beginif(state ==195)state = 0;elsestate = state + 1; //kang ding qing gecase(state)0: {high,med,low}='b000001100000;//中61: {high,med,low}='b000010000000;//中72,3,4: {high,med,low}='b000100000000;//高15: {high,med,low}='b000010000000;//中76,7: {high,med,low}='b000100000000;//高18,9: {high,med,low}='b001100000000;//高310,11,12,13,14,15:{high,med,low}='b000010000000;//中7 16,17: {high,med,low}='b000000110000;//中318,19,20: {high,med,low}='b000001100000;//中621: {high,med,low}='b000001010000;//中522,23: {high,med,low}='b000001100000;//中624,25: {high,med,low}='b000000000111;//中126,27,28,29,30,31:{high,med,low}='b000001010000;//中 5 32: {high,med,low}='b000000110000;//中333: {high,med,low}='b000000110000;//中334,35,36: {high,med,low}='b000000111000;//中437: {high,med,low}='b000000110000;//中3 38: {high,med,low}='b000000111000;//中4 39,40,41: {high,med,low}='b000100000000;//高142,43,44: {high,med,low}='b000000110000;//中345,46,47: {high,med,low}='b000100000000;//高148,49,50: {high,med,low}='b000010000000;//中751,52,53: {high,med,low}='b000000111000;//中454,55,56,57,58,59,60,61:{high,med,low}='b000010000000;//中7 62: {high,med,low}='b000001100000;//中663: {high,med,low}='b000010000000;//中764,65,66: {high,med,low}='b000100000000;//高167: {high,med,low}='b010*********;//高768,69: {high,med,low}='b000100000000;//高170,71: {high,med,low}='b001100000000;//高372,73,74: {high,med,low}='b000010000000;//中775,76: {high,med,low}='b000000110000;//中377,78,79: {high,med,low}='b000001100000;//中680: {high,med,low}='b000000000101;//中581,82: {high,med,low}='b000001100000;//中683,84: {high,med,low}='b000000000111;//中185,86,87,88,89,90:{high,med,low}='b000001010000;//中 591: {high,med,low}='b000000110000;//中392: {high,med,low}='b000000110000;//中393,94: {high,med,low}='b000000111000;//中495: {high,med,low}='b000100000000;//高196,97,98: {high,med,low}='b000010000000;//中799,100: {high,med,low}='b000100000000;//高1101,102: {high,med,low}='b001000000000;//高2103: {high,med,low}='b001100000000;//高3 104,105,106,107,108,109:{high,med,low}='b000100000000;//高1 110: {high,med,low}='b000010000000;//中7111,112: {high,med,low}='b000001100000;//中6113,114: {high,med,low}='b000010000000;//中7 115,116: {high,med,low}='b000001010000;//中5117,118,119,120,121,122:{high,med,low}='b000001100000;//中6 123,124: {high,med,low}='b000000000111;//中1 125: {high,med,low}='b001000000000;//高2126,127,128: {high,med,low}='b001100000000;//高3 129: {high,med,low}='b001000000000;//高2 130,131: {high,med,low}='b001100000000;//高3132,133: {high,med,low}='b010*********;//高5 134,135,136,137,138,139:{high,med,low}='b001000000000;//高2 140,141: {high,med,low}='b000001010000;//中5 142,143,144: {high,med,low}='b000100000000;//高1145: {high,med,low}='b000010000000;//中7 146,147: {high,med,low}='b000100000000;//高1 148,149,150,151,152,153,154,155:{high,med,low}='b001100000000;//高3156,157: {high,med,low}='b000001100000;//中6 158,159: {high,med,low}='b000010000000;//中7160,161,162,163:{high,med,low}='b000100000000;//高1 164,165: {high,med,low}='b000010000000;//中7166,167: {high,med,low}='b000100000000;//高1168,169: {high,med,low}='b001000000000;//高2170,171,172: {high,med,low}='b000100000000;//高1173,174,175,176,177,178:{high,med,low}='b000001010000;//中5 179,180: {high,med,low}='b001010000000;//高4181,182: {high,med,low}='b001100000000;//高3183,184,185: {high,med,low}='b001000000000;//高2186,187: {high,med,low}='b000100000000;//高1188,189,190,191,192,193,194,195:{high,med,low}='b001100000000;//高3endcaseendendmodule。

相关主题