实验四
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四硬件电子琴电路设计
一、实验目的:
学习利用数控分频器设计硬件电子琴实验。
二、原理说明:
主系统由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模块放置一个乐曲曲谱真值表,由一个计数器的计数值来控制此真值表的输出,而由此计数器的计数时钟信号作为乐曲节拍控制信号,从而可以设计出一个纯硬件的乐曲自动演奏电路。
图1 硬件电子琴电路结构
源程序如下:
【例1】
module songer(clk_50M,reset,Code1,High1,Spkout);
input clk_50M;//CLK=50MHZ
input reset;
output[3:0] Code1;
output High1,Spkout;
wire[10:0] Tone;
wire[3:0] ToneIndex;
wire clk_4HZ,clk_12M;
NoteTabs u0( .Clk(clk_4HZ),
.ToneIndex(ToneIndex) );
ToneTaba u1( .Index(ToneIndex),
.Code(Code1),
.High(High1),
.Tone(Tone) );
Speakera u2( .Clk(clk_12M),
.Tone(Tone),
.SpkS(Spkout) );
div_50_12M u3(clk_50M,clk_12M,reset);
div_50_4HZ u4(clk_50M,clk_4HZ,reset);
endmodule
【例2】
module NoteTabs(Clk,ToneIndex);
input Clk;
output[3:0] ToneIndex;
reg[7:0] Counter;
always@(posedge Clk ) begin
if(Counter>=138) Counter<=8'b00000000;
else Counter<=Counter+1'b1;
end
Music u5( .addr(Counter),
.clk(Clk),
.dout(ToneIndex) );
endmodule
【例3】
module ToneTaba (Index,Code,High,Tone); input[3:0] Index;
output[3:0] Code;
output High;
output[10:0] Tone;
reg[3:0] Code;
reg High;
reg[10:0] Tone;
always @ (Index)
begin
case(Index)
4'b0000 :begin Tone<=11'b11111111111;Code<=4'b0000;High<=1'b0;end//2047 4'b0001 :begin Tone<=11'b01100000101;Code<=4'b0001;High<=1'b0;end//773 4'b0010 :begin Tone<=11'b01110010000;Code<=4'b0010;High<=1'b0;end//912 4'b0011 :begin Tone<=11'b10000001100;Code<=4'b0011;High<=1'b0;end//1036 4'b0101 :begin Tone<=11'b10010101101;Code<=4'b0101;High<=1'b0;end//1197 4'b0110 :begin Tone<=11'b10100001010;Code<=4'b0110;High<=1'b0;end//1290 4'b0111 :begin Tone<=11'b10101011100;Code<=4'b0111;High<=1'b0;end//1372;
4'b1000 :begin Tone<=11'b10110000010;Code<=4'b0001;High<=1'b1;end//1410;
4'b1001 :begin Tone<=11'b10111001000;Code<=4'b0010;High<=1'b1;end//1480;
4'b1010 :begin Tone<=11'b11000000110;Code<=4'b0011;High<=1'b1;end//1542;
4'b1100 :begin Tone<=11'b11001010110;Code<=4'b0101;High<=1'b1;end//1622;
4'b1101 :begin Tone<=11'b11010000100;Code<=4'b0110;High<=1'b1;end//1668;
4'b1111 :begin Tone<=11'b11011000000;Code<=4'b0001;High<=1'b1;end//1728;
default :begin Tone<=11'b11111111111;Code<=4'b0000;High<=1'b0;end//2047 endcase
end
endmodule
【例4】
module Speakera(Clk,Tone,SpkS);
input Clk;
input[10:0] Tone;
output SpkS;
reg PreClk;
reg FullSpkS;
reg[3:0] Count4;
reg[10:0]Count11;
reg Count2;
reg SpkS;
always@(posedge Clk)
begin
if(Count4>11)begin
PreClk<=1'b1;
Count4<=1;
end
else begin
Count4<=Count4+1'b1;
end
end
always@(posedge PreClk)begin
if(Count11>=11'h7FF) begin
Count11<=Tone;
FullSpkS<=1'b1;
end
else begin
Count11<=Count11+1'b1;
FullSpkS<=0;
end
end
always@(posedge FullSpkS)begin
Count2<=~Count2;
if(Count2==1'b1) SpkS<=1'b1;
else SpkS<=1'b0;
end
endmodule
【例5】50MHz变频为4HZ
module div_50_4HZ(clk_50M,clk_4HZ,reset); input clk_50M;
input reset;
output clk_4HZ;
reg [23:0] counter;
reg clk_4HZ;
always @ (posedge clk_50M or negedge reset) if(!reset)
counter <= 24'b00;
else
if(counter == 12499999)
counter <= 24'b0;
else
counter <= counter + 1'b1;
always @ (posedge clk_50M or negedge reset) if(!reset)
else
begin
if(counter ==24'd12_499_999)
clk_4HZ <= 1'b1;
else
clk_4HZ <= 1'b0;
end
endmodule
【例6】梁祝音乐音符数据(例)
MEMORY_INITIALIZATION_RADIX = 10;
MEMORY_INITIALIZATION_VECTOR=
3 , 3 , 3 , 3, 5, 5, 5,6, 8, 8,
8 , 9 , 6 , 8, 5, 5, 12,12,12, 15,
13 , 12 , 10 , 12, 9, 9, 9, 9, 9, 9,
9 , 0 , 9 , 9, 9, 10, 7, 7, 6, 6,
5 , 5 , 5 , 6, 8, 8, 9, 9, 3, 3,
8 , 8 , 6 , 5, 6, 8, 5, 5, 5, 5,
5 , 5 , 5 , 5, 10, 10, 10, 12, 7, 7,
9 , 9 , 6 , 8, 5, 5, 5, 5, 5, 5,
3 , 5 , 3 , 3, 5, 6, 7, 9, 6, 6,
6 , 6 , 6 , 6, 5, 6, 8, 8, 8, 9,
12 ,12 ,12 ,10, 9, 9,10, 9,8, 8,
6 , 5 , 3 , 3, 3, 3, 8,8, 8,8,
6 , 8 ,6 , 5, 3, 5, 6,8, 5,5,
5 ,5 , 5 ,5, 5,5,0, 0, 0;
三、实验内容:
1.自己编写12.5MHZ的分频程序div_50_12M。
用CLOCK=50MHZ(P80)的输入频率接入并进行分频得12.5MHz,此信号作为Speakera模块的输入频率;用CLOCK=50MHZ的输入频率接入并进行分频得4Hz,此信号作为NoteTabs模块的输入频率,根据下载板的情况,设reset=0时,系统复位。
2.Music模块用ROM的IP CORE存放“梁祝”乐曲或其他乐曲的演奏数据,编写并加载.COE文件放置乐曲演奏数据。
3.编译适配以上文件,给出仿真波形,最后进行下载和硬件测试实验。
4.选择LD5~LD2发光管显示Code[3]~Code[0]表示琴音简谱码,发光管LD7显示高8度,SPEAKOUT接蜂鸣器接口的P119端口。
四、思考题:
1、电路上应该满足哪些条件,才能用数字器件直接输出的方波驱动扬声器发声?
2、如果演奏其他乐曲,程序应做哪些方面的改动?
五、实验报告:
用仿真波形和电路原理图,详细叙述硬件电子琴的工作原理及其3个Verilog HDL文件中相关语句的功能,叙述硬件实验情况,说明硬件乐曲演奏电路的设计和实验方案。