您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 西南科技大学FPGA实验报告四2015
西南科技大学实验报告课程名称:FPGA实验名称:硬件电子琴电路设计姓名:学号:2012班级:电子12指导教师:西南科技大学信息工程学院制实验题目1、实验原理主系统由3个模块组成,例1是顶层设计文件,其内部有三个功能模块(如图1所示):Speakera.v(例4)和ToneTaba.v(例3),NoteTabs.v(例2)。模块ToneTaba是音阶发生器,当8位发声控制输入Index中某一位为高电平时,则对应某一音阶的数值将从端口Tone输出,作为获得该音阶的分频预置值;同时由Code输出对应该音阶简谱的显示数码,如‘5’,并由High输出指示音阶高8度显示。模块Speakera中的主要电路是一个数控分频器,它由一个初值可预置的加法计数器构成,当模块Speakera由端口Tone获得一个2进制数后,将以此值为计数器的预置数,对端口Clk12MHZ输入的频率进行分频,之后由Spkout向扬声器输出发声。增加一个NoteTabs模块用于产生节拍控制(Index数据存留时间)和音阶选择信号,即在NoteTabs模块放置一个乐曲曲谱真值表,由一个计数器的计数值来控制此真值表的输出,而由此计数器的计数时钟信号作为乐曲节拍控制信号,从而可以设计出一个纯硬件的乐曲自动演奏电路。2、实验步骤分四步1、将待播放的《梁祝》音乐音符存入ROM:建立一个.txt的文本文件,将梁祝的音乐音乐音符数据写入,再将后缀名改为.coe文件。建立一个IPcore,名为MUSIC.将MUSIC.core添加到IPcore中。2、建立一个NoteTabs.V文件,从Music.v的ROM(只读存储器)读取数据,进行节拍控制,和音阶选择。经过仿真无误后进行下一步。3、建立div_50_12module,将50MHZ的时钟频率转化成12.5MHZ近似为12MHZ。4、建立div_50_4module,对50MHZ的时钟频率分频成4HZ。5、建立ToneTabamodule,获得该音阶的分频预置值,音阶简谱的显示数码,音阶高8度显示。6、建立Speakeramodule,获得分频预置值,对端口Clk12MHZ输入的频率进行分频,之后由Spkout向扬声器输出发声。3、实验结果及分析50MHZ分为12MHZ的代码:modulediv_50_12(clk_50M,clk_12MHZ,reset);inputclk_50M;inputreset;outputclk_12MHZ;reg[1:0]counter;regclk_12MHZ;always@(posedgeclk_50Mornegedgereset)if(!reset)counter=2'b000;elseif(counter==4)//分频预置数4,实际上的频率是12.5MHZcounter=2'b00;elsecounter=counter+1'b1;always@(posedgeclk_50Mornegedgereset)if(!reset)clk_12MHZ=1'b0;elsebeginif(counter==2'b11)clk_12MHZ=1'b1;elseclk_12MHZ=1'b0;endEndmodule仿真波形:分析:频率近似为12分频,因为在always中同一个变量counter的指不能被赋值两次,否则容易引起竞争冒险等问题。2、NoteTabs模块的测试,仿真波形如图所示:分析:因为梁祝音乐中写入的开头有1拍的‘3’,又因为是以1/4拍的形式存放在ROM里的,所以NoteTabs是4个1/4拍的’3’。3/4拍的’5’。附:仿真的testfixture文件moduletest_NoteTabs;regClk;wire[3:0]ToneIndex;NoteTabsuut(.Clk(Clk),.ToneIndex(ToneIndex));initialbeginClk=0;forever#10Clk=~Clk;//因为时钟是50MHZ,所以1/2T=10nsendinitial#1000$stop;endmodule3、ToneTaba模块的仿真与测试仿真波形为:分析:可知当index=0001时,tone=1403d=01100000101b,符合要求,正确测试代码:moduleTestToneTaba;reg[3:0]Index;wire[3:0]Code;wireHigh;wire[10:0]Tone;ToneTabauut(.Index(Index),.Code(Code),.High(High),.Tone(Tone));initialbeginIndex=0;#50;Index=1;#30;Index=2;#20;Index=3;#100;endendmodule4、顶层模块的例化,然后进行综合,布局布线,生成课执行文件.bit文件,下载到板子上去。顶层模块代码:modulesonger(clk_50M,reset,Code1,High1,Spkout);inputclk_50M;//CLK=50MHZinputreset;output[3:0]Code1;outputHigh1,Spkout;wire[10:0]Tone;wire[3:0]ToneIndex;wireclk_4HZ,clk_12M;NoteTabsu0(.Clk(clk_4HZ),.ToneIndex(ToneIndex));ToneTabau1(.Index(ToneIndex),.Code(Code1),.High(High1),.Tone(Tone));Speakerau2(.Clk(clk_12M),.Tone(Tone),.SpkS(Spkout));div_50_12u3(clk_50M,clk_12M,reset);div_50_4HZu4(clk_50M,clk_4HZ,reset);endmodule4、实验思考题解答(实验指导书要求的思考题)1、答:输出的频率要在扬声器的工作频率范围内,输出的电流要能够直接驱动扬声器的正常工作2、答:将存储音符的ROM里面的内容改变,将notetabs里面的读取乐符数改变5、体会这是我第一次的实验成功,主要归结于自己平时下课后不停的摸索,预习。学会了自己编写激励文件,改变了原始的画波形方式。对于实验的波形观察也有了深刻的理解,但是我们所有的模块都是用的always语句,可以尝试一下用其他的语句实现同样的功能,增加我们对于语言使用的灵活性。
本文标题:西南科技大学FPGA实验报告四2015
链接地址:https://www.777doc.com/doc-5047177 .html