音乐播放器设计说明
- 格式:doc
- 大小:182.50 KB
- 文档页数:19
音乐播放器说明书音乐播放器设计说明1、设计目的充分利用EITS2003 多用途EDA 开发实验平台的设计资源,完成一个比较复杂的FPGA 设计方案,增强对FPGA 设计的更深理解,提高设计水平,为今后的更复杂的FPGA 设计实践打下坚实的基础。
2、设计概述EITS2003 多用途EDA 开发实验平台给我们提供了丰富的设计资源。
它的核心器件为Xilinx 公司的Spartan-IIE 系列的FPGA 芯片,且在FPGA 周围提供了丰富的资源:有串口、PS/2 接口、VGA 接口、LED 和七段数码管显示、拨码开关和按钮、AT89S52 单片机、SRAM、I2C、A/D D/A 转换、扬声器、电源、电源晶振等。
这就为我们的设计提供了丰富的选择。
考虑到以后实践的需要,且又要达到一定的难度,我们选择了把几种常用接口PS/2、LED 显示结合的一个电路。
虽然设计并不是很复杂,但其实践意义是很大的。
3、设计方案说明3.1 总体方案我们设计的总体思想是:利用EITS2003上的拨码开关选择不同的歌曲进行播放,并在相应的七段数码管及LED显示正在播放的音阶。
3.2 关键部分说明3.2.1 音乐电路音乐电路原理:组成乐曲的每个音符的频率值(音调)及持续时间(音长)是实际乐曲演奏的两个基本数据。
因此只要控制输出到扬声器的激励信号的频率和信号的持续时间就可以发出持续的乐曲声。
频率的高低决定了音调的高低。
音乐的十二平均率规定:每连个八度音(如简谱中的中音1与高音1)之间的频率相差一倍。
在两个八度音之间,又可以分为十二个半音,每两个半音的频率比为12sqr(2)。
另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间,E到F之间为半音,其余为全音。
由此简谱中从低音1到高音1之间的每个音名对应的频率如下表3所示:3.3 具体实现 3.3.1 顶层模块TOPswitch1,2,3resetl1,2,3,4,5,6,7dig1,2,3LEDspeaker clock顶层模块的输入输出如上图所示。
输入:clock 是电路板时钟的输入,50 兆赫兹; reset 用于系统的初始化;switch1、switch2、switch3是EITS2003的拨码开关输入,产生音乐选择信号。
输出:speaker 用于输出不同频率的时钟,使得蜂鸣器发出不同声音; LED 为七段数码管,用于显示高中低音音阶;dig1、dig2、dig3为三段数码管的控制信号,选择数码管的输出; l1、l2、l3、l4、l5、l6、l7为LED 显示,指示现输出音阶高低。
这些输入输出的对应管脚如下图所示:3.3.2 该工程模块结构ShowKeyHEX2LED Freqoriginsong1switch Freq_Div top工程模块层次结构图3.3.3 程序说明 3.3.3.1 Freq_Div 模块/*****************************************************************************/ Freq_Div.v模块名称: Freq_Div()模块功能: 按输入参数对输入时钟进行分频,输出 Clk_User <= Clk_Sys/Div输入输出: Clk_Sys 输入,输入时钟,一般为系统时钟,1 位 Div 输入,分频参数输入,26 位Clk_User 输出,分频后的时钟输出,1 位/*****************************************************************************/ module Freq_Div(Clk_Sys,Div,Clk_User,Reset);input Clk_Sys;input [25:0] Div;output Clk_User;input Reset;reg Clk_Usertemp;reg[25:0] cout;assign Clk_User=(Div>=2)?Clk_Usertemp:Clk_Sys; //若Div比2小,输出系统时钟always @(posedge Clk_Sys or negedge Reset) //等待系统时钟上升沿if(!Reset)begincout<=26'b0;Clk_Usertemp<=1'b0;endelsebeginif(Div>=26'h000_0002)beginif(cout>=Div-1) //输出达到一个周期,重新开始beginClk_Usertemp<=1'b0;cout<=26'h000_0000;endelse if(cout>=((Div>>1)-1))begincout<=cout+1;Clk_Usertemp<=1'b1;endelsebeginClk_Usertemp<=1'b0;cout<=cout+1;endendendendmodule3.3.3.2HEX2LED 模块/****************************************************************************/ HEX2LED.v/****************************************************************************///***************************************************************************** //HEX-to-seven-segment decoder// input [3:0] HEX;// output [6:0] LED;// reg [6:0] LED;//// segment encoding// 0// //-// 5 | | 1// //- <- 6// 4 | | 2// //-// 3//***************************************************************************** module HEX2LED(HEX,LED);//***************************************************************************** // HEX:输入十六进制信号// LED:输出显示信号//***************************************************************************** input [3:0] HEX;output [6:0] LED;reg [6:0] LED;always @(HEX)begincase (HEX)4'b0001 : LED <= 7'b0000110; //14'b0010 : LED <= 7'b1011011; //24'b0011 : LED <= 7'b1001111; //34'b0100 : LED <= 7'b1100110; //44'b0101 : LED <= 7'b1101101; //54'b0110 : LED <= 7'b1111101; //64'b0111 : LED <= 7'b0000111; //74'b1000 : LED <= 7'b1111111; //84'b1001 : LED <= 7'b1101111; //94'b1010 : LED <= 7'b1110111; //A4'b1011 : LED <= 7'b1111100; //b4'b1100 : LED <= 7'b0111001; //C4'b1101 : LED <= 7'b1011110; //d4'b1110 : LED <= 7'b1111001; //E4'b1111 : LED <= 7'b1110001; //Fdefault : LED <= 7'b0111111; //0endcaseendendmodule3.3.3.3 ShowKey模块/****************************************************************************/ ShowKey.v根据音阶高低,相应的LED发亮。
/****************************************************************************/ module ShowKey(selectLED,l1,l2,l3,l4,l5,l6,l7);input [3:0] selectLED;output l1;output l2;output l3;output l4;output l5;output l6;output l7;reg l1,l2,l3,l4,l5,l6,l7;always @(selectLED)begincase (selectLED)4'b0001: {l1,l2,l3,l4,l5,l6,l7}<=7'b0111111;4'b0010: {l1,l2,l3,l4,l5,l6,l7}<=7'b1011111;4'b0011: {l1,l2,l3,l4,l5,l6,l7}<=7'b1101111;4'b0100: {l1,l2,l3,l4,l5,l6,l7}<=7'b1110111;4'b0101: {l1,l2,l3,l4,l5,l6,l7}<=7'b1111011;4'b0110: {l1,l2,l3,l4,l5,l6,l7}<=7'b1111101;4'b0111: {l1,l2,l3,l4,l5,l6,l7}<=7'b1111110;default: {l1,l2,l3,l4,l5,l6,l7}<=7'b1111111;endcaseendendmodule3.3.3.4 switch模块/**************************************************************************/ switch.v根据三个拨码开关的情况,选择相应的歌曲输出/**************************************************************************/ module switch(clk_4,clk_6M,switchnum,selectLED,dig1,dig2,dig3,speaker);input [2:0] switchnum;input clk_4,clk_6M;output selectLED;output dig1,dig2,dig3;output speaker;wire clk_4,clk_6M;wire [3:0] high,med,low;reg [3:0] selectLED;reg dig1,dig2,dig3;song1 mysong (.clk_4Hz(clk_4),.clk_6MHz(clk_6M),.switchnum(switchnum),.speaker(speaker),.high(high),.med(med),.low(low));always @(high or med or low)beginif(high!=4'b0000)begindig1<=0;dig2<=1;dig3<=1;selectLED<=high;endif(med!=4'b0000)begindig1<=1;dig2<=0;dig3<=1;selectLED<=med;endif(low!=4'b0000)begindig1<=1;dig2<=1;dig3<=0;selectLED<=low;endendendmodule3.3.3.5 song1模块/****************************************************************************/ song1.v记录歌谱内容。