数字电子技术课程设计--简易电子琴设计专业班级:电子姓名:学号:日期:2015.6.5一、设计任务用VerilogHDL语言设计简易电子琴。(1)单独从左至右按下S1-S7每个按键后能够各自对应发出“哆来咪发唆啦西”的音乐声;(2)按下最右边按键(S8),同时再配合按下S1-S7键后,发高八度的对应音;(3)按键需要进行“消抖”处理;(4)外部输入脉冲信号频率为1mhz;(5)扩展要求:自主设计(增加低8度功能)。二、实验目的1、学习verilogHDL语言的基本运用,能够利用其进行简单编程;2、学习使用QuartusⅡ7.0的基本操作,能够利用其进行简单的设计;3、结合实践加深对理论知识的理解。三、设计原理1)喇叭的振动频率不同,导致产生不同的声音;振动频率越低,声音越低沉,振动频率越高,声音越尖锐。题目中音乐基本音的“哆”对应频率为523Hz、“来”对应频率为587Hz、“咪”对应频率为659Hz、“发”对应频率为698Hz、“唆”对应频率为784Hz、“啦”对应频率为880Hz、“西”对应频率为998Hz。低8度音:基本音频率/2,例如低音1的频率为523/2=261.5Hz。高8度音:基本音频率×2,例如高音1的频率为523×2=1046Hz.。不同的频率产生利用给定的时钟脉冲来进行分频实现。(2)消抖的原理:按键默认输入逻辑‘1’,当有按键按下时对应的输入为逻辑‘0’(但会存在抖动),当FPGA开始检测到该引脚从‘1’变为‘0’后开始定时(按键抖动时间大约10ms),定时时间结束后若该引脚仍然为‘0’则表示确实发生按键按下,否则视为抖动而不予以理会;按键松开过程的消抖处理和按下时原理一样。(3)原理框图四、程序设计消抖模块modulexiaodou(key_in,key_out,clk);inputkey_in;inputclk;outputkey_out;regkey_out;reg[2:0]presta;integerq;parameters0=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100,s5=3'b101,s6=3'b110,s7=3'b111;always@(posedgeclk)begincase(presta)s0:beginkey_out=0;q=0;if(key_in==1)presta=s0;elsepresta=s1;ends1:beginkey_out=0;if(q9999)presta=s2;elseq=q+1;ends2:beginkey_out=0;q=0;if(key_in==1)presta=s0;elsepresta=s3;ends3:beginkey_out=1;q=0;if(key_in==0)presta=s3;elsepresta=s4;ends4:beginkey_out=1;if(q44444)presta=s5;elseq=q+1;ends5:beginq=0;if(key_in==1)presta=s0;elsepresta=s3;ends6:beginpresta=s0;ends7:beginpresta=s0;endendcaseendendmodule按键模块moduleanjian(a,b,c,d,e,f,g,h,i,qout);inputa,b,c,d,e,f,g,h,i;output[10:0]qout;reg[8:0]q;reg[10:0]qout;always@(aorborcordoreorforgorhori)beginq[0]=i;q[1]=h;q[2]=g;q[3]=f;q[4]=e;q[5]=d;q[6]=c;q[7]=b;q[8]=a;endalways@(q)begincase(q)9'b100000000:qout=11'b01110111100;9'b010000000:qout=11'b01101010011;9'b001000000:qout=11'b01011110111;9'b000100000:qout=11'b01011001100;9'b000010000:qout=11'b01001111110;9'b000001000:qout=11'b01000111000;9'b000000100:qout=11'b00111110101;9'b100000010:qout=11'b00111011110;9'b010000010:qout=11'b00110101010;9'b001000010:qout=11'b00101111011;9'b000100010:qout=11'b00101100110;9'b000010010:qout=11'b00100111111;9'b000001010:qout=11'b00100011100;9'b000000110:qout=11'b00011111011;9'b100000001:qout=11'b11101111000;9'b010000001:qout=11'b11010100110;9'b001000001:qout=11'b10111101110;9'b000100001:qout=11'b10110011000;9'b000010001:qout=11'b10011111100;9'b000001001:qout=11'b10001110000;9'b000000101:qout=11'b01111101010;9'b000000011:qout=11'b00000000000;9'b000000001:qout=11'b00000000000;9'b000000000:qout=11'b00000000000;9'b000000010:qout=11'b00000000000;default:qout=qout;endcaseendendmodule分频模块modulefenpin(clk_1M,yuzhi,pl_out);inputclk_1M;input[10:0]yuzhi;reg[10:0]q;outputpl_out;regpl_out;always@(posedgeclk_1M)beginif(yuzhi0)beginif(qyuzhi)beginq=q+1;pl_out=0;endelsebeginq=11'b00000000000;pl_out=1;endendelsebeginq=11'b00000000000;pl_out=1;endendendmodule五、原理图及仿真波形图六、心得体会由于之前对本次设计所需知识了解较少,所以在实验过程中遇到了很多的困难,真的很难,但是同样在解决各种困难的过程中也有所收获。从书本上获得的知识跟实践之间具有很大的差距,这要求我们要加强锻炼自己的实际操作能力。首先,在课程设计之前,要先了解我们要完成什么功能,否则做的任何努力都是无用功。其次,,在编写程序过程中,要有耐心,端正态度,积极思考,认真对待。另外,遇到问题首先要自己思考,但是实在无法解决的时候一定要细心地向别人请教或是在网上查找资料。最后要对自己之前的操作和执行进行纠错和总结经验,提升自己。在以后的学习中要注意培养自主学习的能力和文献查阅的能力,以及很重要的动手能力。