1西南科技大学实验报告课程名称:FPGA上机实验实验名称:硬件电子琴电路设计姓名:杨传坤学号:20115486班级:通信1101指导教师:侯宝林西南科技大学信息工程学院制2实验四硬件电子琴电路设计一:实验目的:习利用数控分频器设计硬件电子琴实验。二:实验原理:主系统由3个模块组成,例1是顶层设计文件,其内部有三个功能模块(如图1所示):Speakera.v和ToneTaba.v,NoteTabs.v。模块ToneTaba是音阶发生器,当8位发声控制输入Index中某一位为高电平时,则对应某一音阶的数值将从端口Tone输出,作为获得该音阶的分频预置值;同时由Code输出对应该音阶简谱的显示数码,如‘5’,并由High输出指示音阶高8度显示。模块Speakera中的主要电路是一个数控分频器,它由一个初值可预置的加法计数器构成,当模块Speakera由端口Tone获得一个2进制数后,将以此值为计数器的预置数,对端口Clk12MHZ输入的频率进行分频,之后由Spkout向扬声器输出发声。增加一个NoteTabs模块用于产生节拍控制(Index数据存留时间)和音阶选择信号,即在NoteTabs模块放置一个乐曲曲谱真值表,由一个计数器的计数值来控制此真值表的输出,而由此计数器的计数时钟信号作为乐曲节拍控制信号,从而可以设计出一个纯硬件的乐曲自动演奏电路。三:实验步骤(流程图):开始NoteTabs从rom中读取音符ToneTaba将音符转化为计数值Speakera分频得到音符频率Music.coe存储相应的音符3四:对模块功能的分析:1):将50Mclk分频为12.5M电路:div_50_12M(clk_50,clk,reset)1:说明和分析:由52M转化为12.5M电路的基本方法在于:50M为12.5M的4倍,即当50M完成4个周期时,12.5M完成一个周期,所以在50M完成2个周期时12.5M的信号上升为高电平,50M完成4个周期时12.5M的信号从高电平变化为低电平。由50M两个周期开始12.5M信号翻转一次就可完成50M到12.5M的分频电路。2:div_50_12M的综合图形:2):将50Mclk分频为4hz电路:div_50_4HZ(clk_50,clk,reset)1:说明和分析:有50M转化为4Hz的方法同上50M转化为12.5M的方法相同。只是如果直接由50M转化为4HZ的话计数的数值太大,可由50M转化为12.5M,12.5M转化为1M,再由1M转化为4Hz。2:div_50_4HZ的综合图形3):将音符从rom里面读取出来:NoteTabs(clk_4hz,ToneIndex)41:说明和分析:此电路的功能在于以4Hz的速度将存在于ROM里面的音符按顺序读出来,赋值给ToneIndex输出。2:NoteTabs的综合图形:4):将音符转化为相应的频率计数值:ToneTaba(Index,Code,High,Tone)1:说明和分析:此电路功能在于将读到的音符转化为相应的计数初值,输出给下一个电路分频作为分频初值,Code和High表示音阶和高低音。Index为相应的音符;Code为表示音阶;High表示高低音;Tone表示音阶频率计数值。2:ToneTaba的综合图形:5):根据计数值将12.5M分频计数为音符频率Speakera(clk_12M,Tone,speak_clk)1:说明和分析:根据上一电路的计数初值,分频得到相应的音符频率。clk_12M为12.5M的频率;Tone为ToneTaba产生的计数值;Speak_clk为音符的频率。2:Speakera的综合图形:56):顶层文件:top_speaker(clk_50M,reset,code,high,speak_out)1:top_speaker综合图形:五:实验结果分析:1):实验结果的说明:本次实验结果相对较满意,顺利生成.bit文件,在硬件测试的时候扬声器能够唱出悦耳的曲子。2):但是在对NoteTabs和ToneTaba文件仿真的时候,ToneTaba能够正确的仿真,但是NoteTabs仿真时出现错误,不能完成仿真—对此错误结果,和调试得出结果:是由于NoteTabs文件里面调用了IP核文件Music,仿真时无法对其编译,故产生错误。对此问题,目前尚未解决,正在探索中。3):对ToneTaba的仿真:<1>:激励文件:moduletest_ToneTaba;reg[3:0]Index;wire[3:0]Code;wireHigh;wire[10:0]Tone;ToneTabauut(.Index(Index),.Code(Code),.High(High),.Tone(Tone));6initialbeginIndex=0;#100;#100Index=0;#100Index=1;#100Index=2;#100Index=3;#100Index=5;#100Index=6;#100Index=7;#100Index=8;#100Index=9;#100Index=10;#100Index=12;#100Index=13;#100Index=15;endendmodule<2>:仿真波形:说明:由于是在实验室调用Modelsim仿真的,在我自己的笔记本上没有Modelsim软件,故用的是ISE自带的仿真软件。六:实验思考题解答1:电路上应该满足哪些条件,才能用数字器件直接输出的方波驱动扬声器发声?答:1):输出的频率要在扬声器的工作频率范围;2):输出的电流要能驱动扬声器的正常工作。2:如果演奏其他乐曲,程序应做哪些方面的改动?答:1):将存储音符的ROM里面得内容改变;2):将NoteTabs里面得读取数目改变。程序附件:modulediv_50_12M(clk_50,clk,reset);inputclk_50;inputreset;7outputclk;reg[1:0]counter;regclk;always@(posedgeclk_50orposedgereset)if(reset)counter=2'b00;elsecounter=counter+1'b1;always@(posedgeclk_50orposedgereset)if(reset)clk=1'b0;elseif((counter==2'b00)||(counter==2'b10))clk=~clk;Endmodulemodulediv_50_4HZ(clk_50,clk,reset);inputclk_50;inputreset;outputclk;regclk;reg[23:0]counter;always@(posedgeclk_50orposedgereset)if(reset)counter=24'b0;elseif(counter24'h0bebc20)counter=1'b1+counter;elsecounter=24'b0;always@(posedgeclk_50orposedgereset)if(reset)clk=1'b0;elseif((counter==24'h5f5e10)||(counter==24'b0))clk=~clk;EndmodulemoduleNoteTabs(clk_4hz,ToneIndex);inputclk_4hz;output[3:0]ToneIndex;reg[7:0]counter;always@(posedgeclk_4hz)begin8if(counter=138)//一共139个音符counter=8'b00000000;elsecounter=counter+1'b1;endMusicu1(.addr(counter),.clk(clk_4hz),.dout(ToneIndex));endmodulemoduleToneTaba(Index,Code,High,Tone);input[3:0]Index;output[3:0]Code;outputHigh;output[10:0]Tone;reg[3:0]Code;regHigh;reg[10:0]Tone;always@(Index)begincase(Index)4'b0000:beginTone=11'b11111111111;Code=4'b0000;High=1'b0;end//20474'b0001:beginTone=11'b01100000101;Code=4'b0001;High=1'b0;end//7734'b0010:beginTone=11'b01110010000;Code=4'b0010;High=1'b0;end//9124'b0011:beginTone=11'b10000001100;Code=4'b0011;High=1'b0;end//10364'b0101:beginTone=11'b10010101101;Code=4'b0101;High=1'b0;end//11974'b0110:beginTone=11'b10100001010;Code=4'b0110;High=1'b0;end//12904'b0111:beginTone=11'b10101011100;Code=4'b0111;High=1'b0;end//13724'b1000:beginTone=11'b10110000010;Code=4'b0001;High=1'b1;end//14104'b1001:beginTone=11'b10111001000;Code=4'b0010;High=1'b1;end//1480;4'b1010:beginTone=11'b11000000110;Code=4'b0011;High=1'b1;end//1542;4'b1100:beginTone=11'b11001010110;Code=4'b0101;High=1'b1;end//1622;4'b1101:beginTone=11'b11010000100;Code=4'b0110;High=1'b1;end//1668;4'b1111:beginTone=11'b11011000000;Code=4'b0001;High=1'b1;end//1728;default:beginTone=11'b11111111111;Code=4'b0000;High=1'b0;end//2047endcaseendEndmodulemoduleSpeakera(clk_12M,Tone,speak_clk);9inputclk_12M;input[10:0]Tone;outputspeak_clk;regPreCLK;regFullSpks;reg[3:0]count4;reg[10:0]count11;regcount2;regspeak_clk;always@(posedgeclk_12M)beginif(count411)beginPreCLK=1'b1;count4=1;endelsebeginPreCLK=1'b0;count4=count4+1'b1;endendalways@(posedgePreCLK)beginif(count11=11'h7ff)begin//(2047-Tone)?count11=Tone;FullSpks=1'b1;endelsebegincount11=count11+1'b1;FullSpks=0;endendalways@(posedgeFullSpks)begincount2=~count2;if(count2==1'b1)speak_clk=1'b1;elsespeak_clk=1'b0;endendmodulemodu