FPGA硬件电子琴电路设计实验报告
- 格式:doc
- 大小:151.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.输入音阶发生器程序并命名为,保存与工程相同的文件夹中。
PreClk<=1'b0;
Count4<=Count4+4'b1; end end always@(posedge PreClk)begin if(Count11>=11'h7FF) begin
Count11<=Tone;
FullSpkS<=1'b1; end else begin PreClk<=1'b1;
Count4<=1;end
else begin
Count11<=Count11+11'b1; FullSpkS<=0; end end
always@(posedge FullSpkS)begin
Count2<=~Count2; if(Count2==1'b1) SpkS<=1'b1;
else SpkS<=1'b0; end
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.输入27分频程序并命名为,保存与工程相同的文件夹中。
4'b0011:beginTone<=11'b;
Code<=4'b0011;High<=1'b0;end//1036 4'b0101 :begin Tone<=11'b;
Code<=4'b0101;High<=1'b0;end//1
197
4'b0110 :begin Tone<=11'b;
Code<=4'b0110;High<=1'b0;end//1290
4'b0111 :begin Tone<=11'b;
Code<=4'b0111;High<=1'b0;end//1372;
4'b1000 :begin Tone<=11'b;
4'b1010 :begin Tone<=11'b; 4'b1010 :begin Tone<=11'b;
Code<=4'b0011;High<=1'b1;end//1542;
4'b1100 :begin Tone<=11'b;
Code<=4'b0101;High<=1'b1;end//1622;
4'b1101 :begin Tone<=11'b;
Code<=4'b0110;High<=1'b1;end//1668;
4'b1111 :begin Tone<=11'b;
Code<=4'b0001;High<=1'b1;end//172
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
else if(Counter>=138) Counter<=8'b00000000; else Counter<=Counter+8'b1;end Music u5( .address(Counter), .clock(Clk), .q(ToneIndex) );