数字电子技术综合实验报告2012--2013学年第二学期姓名:学号:班级:实验时间:实验指导老师:1目录一、设计任务·········································································2二、设计方案·········································································2三、系统框图·········································································3四、方案实现·········································································31.乐曲演奏的原理······································································32.总体方案·················································································4五、实验结果·········································································6六、方案优化·········································································7七、心得体会·········································································7附录·························································································71.VHDL源程序·····································································72.各层次原理图·································································353.编译报告··········································································402题目:简易电子琴设计摘要电子琴的设计大规模可编程逻辑器件(FPGA)奏、选歌及显示功能。设计中采用计数原理控制演奏器发声,对音乐发生所必须确定的音符和节拍分别用程序语言实现。可以用它来弹奏和播放乐曲。特点是设计思路简单、清晰。关键字:电子琴CPLD一、设计任务1.基本要求(1)具有一般弹奏功能;(2)自动播放功能;(3)数码显示音符功能。2.发挥部分(1)能通过选择键在多首歌曲中选择播放;(2)输出增加功率放大电路,增加歌曲容量;(3)增加音效或节拍可调;(4)无线弹奏。二、设计方案采用大规模可编程逻辑器件(FPGA),利用quartusII,通过verilog代码实现简易电子琴演奏电路。3三、系统框图四、方案实现1.乐曲演奏的原理:乐曲演奏的原理:组成乐曲的每个音符的频率值(音调)以及持续时间(音长)是乐曲能持续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号的频率的高低和持续的时间,就可以使扬声器发出持续的乐曲声。音调的控制频率的高低决定了音调的高低。音乐的十二平均率规定:每两个八度音(如简谱中的中音1与高音1)之间的频率相差一倍。在两个八度音之间,又可分为十二个半音,每半个音的频率比为。另外,音名A(简谱中的低音6)的频率为440HZ,音名B到C之间,E到F之间为半音,其余为全音。由此可以计算出简谱中从低音1至高音1之间的每个音名对应的频率如图所示:音名频率(HZ)音名频率(HZ)音名频率(HZ)低音1261.6中音1523.3高音11046.5低音2293.7中音2587.3高音21174.7低音3329.6中音3659.3高音31318.5低音4349.2中音4698.5高音41396.9低音5392中音5784高音51568低音6440中音6880高音61760低音7493.9中音7987.8高音71975.54所有不同频率均从同一基准频率分频得到。将分频数四舍五入进行取整,并尽量减小误差。在本设计中选取6MHZ作为基准频率。从下表中可以看出最大分频系数为11468,采用14位二进制计数器分频可满足要求。此外还应给出预置数,对应不同的预置数,只需加载不同的预置数即可。采用加载预置数实现分频的方法比采用反馈复零法节省资源,实现起来更加容易。音名分频比预置数音名分频比预置数音名分频比预置数低音1114684915中音1573610647高音1286713516低音2102156168中音2511111272高音2255413829低音391027281中音3455211831高音3227414109低音485917792中音4428912094高音4214814235低音576538730中音5382712556高音5191314470低音668189565中音6340912947高音6170514678低音7607310310中音7303713346高音7151914864音长的控制音符的持续时间须根据音乐的速度及每个音符的节拍数来确定。如果设定全音符的持续时间为1S的话,假设产生4分音符,则产生四分频即可实现四分音符的时长,并提供4HZ分频器。如图为乐曲演奏的原理图,其中,乐谱产生电路用来控制音乐的音调和时长。控制音调通过设置计数器的预置数来实现,预置不同的数值会可以使计数器产生不同频率的信号,从而产生不同的音调。控制音长是通过控制计数器预置数的停留时间来实现的,预置数的停留时间越长,则该音符的演奏时间越长,如2分音符,在记谱时将该音符记录两次即可。2.总体方案系统设计运用了自上而下的模块化设计思想,整个系统可分为分频,播放,弹奏,显示四个部分。1.分频部分分频部分为一个可预置数的加计数器、二分频器和预置数选择器。预置数选择器选择来自播放和弹奏部分的不同的预置数。从预置数起循环作加计数,计到16383时产生一个高电平,否则得到低电平,将信号再进行二分频便可得到方波信号。预制数不同,产生的方波信号频率也不同。因此,只要5改变加计数器的预置数,便可由6MHz的时钟信号分频得到不同频率的方波。将方波信号输出到扬声器,便可发出不同音调的声音。2.播放部分播放部分为一个节拍发生器、预置数获得器和一个存储器。节拍发生器将一个64Hz的时钟信号分为32Hz,16Hz,8Hz和4Hz的信号,以适应不同歌曲的播放速度。预置数获得器将音阶信号转换为对应的预置数。存储器将歌曲的预置数传送给分频器,实现曲目的不同音调和音长。3.弹奏部分弹奏部分有十四个按键,每个按键对应一个音阶,及对应一个预置数,将预置数传递给分频部分便可得到不同频率的方波,从而产生不同的音调。4.显示部分在进行音乐播放或弹奏时,将产生的预置数传递给此模块。根据不同的预置数,产生不同的信号,输出到数码管,便可显示出音阶数字。5.功能仿真(1)综合仿真结果:设置输入信号key1为高电平,此时设置key=8192,即key2=1,key3~key15=0。功能为播放第一首歌,在仿真结束后,如图示,fout为蜂鸣器的输出,led为数码管显示。如图示也正确,所以本设计经过仿真证明正确可行。6(2)总电路原理图(3)引脚分配输入信号:1个6MHz时钟信号,1个64Hz时钟信号,1个功能选择按键,14个弹奏(选择)按键;输出信号:3个数码管输出,一个蜂鸣器输出声音。五、实验结果在编译并仿真后下载,通过硬件测试,实验达到预期效果,当key1=0时,通过key2~key15这14个按键的键入蜂鸣器可以发出中音及高音的do~xi十四个音阶的音,即表示了电子琴的弹奏功能;当key1=1时,key2=1时播放了第一首7歌;key3=1时,播放了第二首歌;key4=1时,播放第三首歌;key5=1时,播放了第四首歌。发出声音的同时,数码管可以显示不同的代表音符的数字。通过硬件的测试,所有的设计目标均实现。六、方案优化若采用正弦波代替方波来驱动扬声器将会有更好的效果。七、心得体会本次设计要用quartusII软件,由于之前对此软件不是太熟悉所以导致了一些错误和问题的发生,所以这次课程设计中认真学习了quartusII软件的具体使用步骤和操作流程,对所有可能出现的问题进行逐一攻破。通过这次实验,我不但熟悉了quartusII软件,也了解了开发的最基本流程和方法,也进一步加深了对Verilog编程语言的理解,最重要的是锻炼了我独立思考和分析的逻辑能力,通过从顶向下的设计方法,一步步实现,然后将整个设计串套起来,是我对设计的流程以及编程有了很大的提高。附录:1.VHDL源程序modulechange_fenpinbi(clk_6m,prenum,tofout);//通过预置数改变分频比;inputclk_6m;input[13:0]prenum;outputtofout;wireclk_6m;reg[13:0]divider;regtofout;always@(posedgeclk_6m)beginif(divider==16383)begintofout=1'b1;divider=prenum;endelsebegintofout=1'b0;divider=divider+14'd1;endend8endmodulemoduleer_fen_pin(tofout,fout);//二分频模块;inputtofout;outputfout;regfout;always@(posedgetofout)beginfout=~fout;endendmodulemodulefenpin(clk_64,clk_16,clk_8,clk_4);//获得适应不同曲目不同的时钟信号;inputclk_64;outputclk_16,clk_8,clk_4;wireclk_64;regclk_32,clk_16,clk_8,clk_4;regcounter2;reg[1:0]counter4;always@(posedgeclk_64)beginclk_32=~clk_32;endalways@(posedgeclk_32)beginclk_16=~clk_16;if(counter2==1'b1)beginclk_8=~clk_8;counter2=1'b0;endelsecounter2=counter2+1'b1;if(counter4==2'd3)beginclk_4=~clk_4;counter4=2'd0;endelsecounter4=counter4+2'd1;endendmodulemoduleget_prenum(clk_sing,scale,prenum_s);//将音阶信号转换为预置数;inputclk_sing;input[4:0]scale;output[13:0]prenum_s;wireclk_sing;wire[4:0]scale;reg[13:0]prenum_s;always@(posedgeclk_sing)9begincase(scale)5'd0:prenum_s=14'd16383;5'd1:prenum_s=14'd4915;5'd2:prenum_s=14'd6168;5'd3:prenum_s=14'd7281;5'd4:prenum_s=14'd7792;5'd5:prenum_s=14'd8730;5'd6:prenum_s=14'd9565;5'd7:pren