FPGA硬件电子琴电路设计实验报告
- 格式:doc
- 大小:150.00 KB
- 文档页数:5
FPGA实验报告
题目:硬件电子琴电路设计
一.实验目的:学习利用数控分频器设计硬件电子琴实验。
二.实验原理及内容:主系统由3个模块组成,顶层设计文件中包含三个功能模块,和,。
模块ToneTaba是音阶发生器,当8位发声控制输入Index中某一位为高电平时,则对应某一音阶的数值将从端口Tone输出,作为获得该音阶的分频预置值;同时由Code 输出对应该音阶简谱的显示数码,如‘5’,并由High输出指示音阶高8度显示。
模块Speakera中的主要电路是一个数控分频器,它由一个初值可预置的加法计数器构成,当模块Speakera由端口Tone获得一个2进制数后,将以此值为计数器的预置数,对端口Clk12MHZ输入的频率进行分频,之后由Spkout向扬声器输出发声。
增加一个NoteTabs模块用于产生节拍控制(Index数据存留时间)和音阶选择信号,即在NoteTabs模块放置一个乐曲曲谱真值表,由一个计数器的计数值来控制此真值表的输出,而由此计数器的计数时钟信号作为乐曲节拍控制信号,从而可以设计出一个纯硬件的乐曲自动演奏电路。
图1 硬件电子琴电路结构
三.实验步骤.
1.在QUARTUSII软件下创建一工程,工程名为songer,芯片名为EP2C35F672C6;
2.输入数控分频器程序并命名为,保存与工程相同的文件夹中。
其功能仿真波形和时序仿真波形分别如下:
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=0; reg High=0; reg[10:0] Tone=0;
always begin
case(Index)
4'b0000 :begin Tone<=11'b;
Code<=4'b0000;High<=1'b0;end//2047 4'b0001 :begin Tone<=11'b001;
Code<=4'b0001;High<=1'b0;end//773 4'b0010 :begin Tone<=11'b000;
Code<=4'b0010;High<=1'b0;end//912
其功能仿真波形和时序仿真波形分别如下:
4.输入27分频程序并命名为,保存与工程相同的文件夹中。
5.module div_27(Clk2,Q2);
input Clk2;
output Q2;
reg Q2;
reg[32:0] count;
always@(posedge Clk2)
begin if(count==3374999)
begin count<=0;Q2=~Q2; end
else count<=count+1; end
endmodule
module div_50(Clk1,Q1);
input Clk1;
output Q1;
reg Q1;
reg[32:0] count;
always@(posedge Clk1)
begin if(count==1)
begin
count<=0;Q1=~Q1;end
else
count<=count+1;end
endmodule
其功能仿真波形和时序仿真波形分别如下:
6.建立梁祝乐曲演奏数据的MIF 文件。
WIDTH = 4 ; 入程序并命名为,保存与工程相同的文件夹中。
8.输入硬件演奏电路顶层设计文件并命名为,保存与工程相同的文件夹中。
module NoteTabs(reset,Clk,ToneIndex);
input Clk,reset; output[3:0] ToneIndex; reg[7:0] Counter; always@(posedge Clk or negedge reset)
begin
if(!reset) Counter <= 8'b00000000; else if(Counter>=138) Counter<=8'b00000000; else Counter<=Counter+8'b1;end Music u5( .address(Counter), .clock(Clk), .q(ToneIndex) ); endmodule module songer(Clk1,Clk2,Code1, High1,Spkout,reset); input Clk1,Clk2,reset; output[3:0] Code1; output High1,Spkout; wire[10:0] Tone; wire[3:0] ToneIndex; wire Q1,Q2; NoteTabs u0( .Clk(Q2),
.reset(reset),
.ToneIndex(ToneIndex) ); ToneTaba u1( .Index(ToneIndex),
.Code(Code1), .High(High1), .Tone(Tone) ); Speakera u2( .Clk(Q1), .Tone(Tone), .SpkS(Spkout) ); div_50 u3( .Clk1(Clk1),
.Q1(Q1) ); div_27 u4( .Clk2(Clk2),
.Q2(Q2) ); endmodule