乐曲硬件演奏设计报告.docx
- 文档编号:10752453
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:16
- 大小:226.22KB
乐曲硬件演奏设计报告.docx
《乐曲硬件演奏设计报告.docx》由会员分享,可在线阅读,更多相关《乐曲硬件演奏设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
乐曲硬件演奏设计报告
《EDA技术》课程设计报告
班别:
姓名:
学号:
同组人姓名:
设计题目:
硬件乐曲演奏电路
任课教师:
2009年12月
一、设计课题
乐曲硬件演奏电路设计
功能要求:
仿照课本P263的实验9-1,设计一乐曲演奏电路,演奏的曲目不限,但起码要有两首歌曲,演奏的歌曲分手动选择和自动循环两种模式。
二、设计目的
学习利用实验6-3的数控分频器设计硬件乐曲演奏电路。
三、设计原理
主系统由三个模块组成,Songer是顶层设计文件,其内部有三个功能模块:
TONETABA.VHD、NOTETABS.VHD、SPEAKERA.VHD。
(NOTETABS类似于弹琴人的手指,TONETABA类似于琴键,SPEAKERA类似于琴弦或音调发声器)
与利用微处理器(CPU或MCU)来实现乐曲演奏相比,以纯硬件完成乐曲演奏电路的逻辑要复杂得多,如果不借助于功能强大的EDA工具和硬件描述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。
本实验设计项目作为“梁祝”乐曲演奏电路的实现。
我们知道,组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的2个基本要素,问题是如何来获取这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果。
1.音符的频率可以由SPEAKERA元件获得,这是一个数控分频器,由其CLK12MHz端输入12MHz脉冲信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,但这时的频率将是原来的1/2。
SPEAKERA对CLK输入信号的分频比由预置输入端Tone[10..0]决定。
SPKOUT的输出频率将决定每一音符的音调,这样,分频计数器的预置值Tone[10..0]与SPKOUT的输出频率就有了对应关系。
如在TONETABA模块中若取Tone[10..0]=1036,将发出音符为中音“3”的信号频率。
2.音符的持续时间需根据乐曲的速度及每个音符的节拍数来确定,TONETABA模块首先是为SPEAKERA模块提供决定所发音符的分频预置数,而此数停留的时间即为此音符的节拍值。
TONETABA模块是乐曲简谱码对应的分频预置数查表电路。
设计中所有预置数值的输出由对应于TONETABA的4位输入值Index[3..0]确定,而Index[3..0]的值即ToneIndex[3..0]的输出值与持续时间由模块NOTETABS决定。
3.在NOTETABS模块中设置了一个8位二进制计数器(计数最大值为256),作为音符数据ROM的地址发生器。
这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25s,恰为当全音符设为1s时,四四拍的4分音符持续时间。
例如,《梁祝》乐曲的第一个音符低音3(1拍),停留的时间需用4个计数时钟节拍,即1s。
相应地,所对应的"低音3"音符分频预置值为1036,其值在SPKS输出端停留了1s。
随着NONETABS模块中的计数器按4Hz的时钟速率作加法计数时,乐曲就开始连续自然地演奏起来了。
4.关于手动与自动选择歌曲,通过选择不同地址来实现。
设置Counter(自由播放的地址),Counter1(第一首歌的播放地址),Counter2(第二首歌的播放地址)。
用mux21a_1作为手动模式下歌曲的选择器,输入分别为Counter1和Counter2,用key1控制s1口,当key1=0,则播放第一首歌(y=Counter1),当key1=1,则播放第二首歌歌(y=Counter2);用mux21a作为模式选择器:
手动模式或者是自动播放模式,将mux21a_1的输出y1作为mux21a的一个输入,另一个输入为Counter,用key控制s口,当key=0,则属于手动模式,默认循环播放第一首歌,如果按下key1键则跳到第二首歌,当key=1,则属于自动模式,两首歌按顺序自动循环播放。
mux21a的输出赋值给MUSIC的address,选择地址,就可以进行播放了。
四、设计具体内容
1.源程序
--顶层文件
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;--指明所使用的库中的STD_LOGIC_1164程序包
ENTITYSongerIS--实体
PORT(CLK12MHZ:
INSTD_LOGIC;--音调频率信号
CLK8HZ:
INSTD_LOGIC;--节拍频率信号
key:
INSTD_LOGIC;--选择播放模式
key1:
INSTD_LOGIC;--手动模式下歌曲的选择
CODE1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--简谱码输出显示
HIGH1:
OUTSTD_LOGIC;--高8度指示
SPKOUT:
OUTSTD_LOGIC);--声音输出
END;
ARCHITECTUREoneOFSongerIS
COMPONENTNoteTabs--对调用的NoteTabs元件做声明
PORT(clk:
INSTD_LOGIC;
ToneIndex:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
key:
INSTD_LOGIC;
key1:
INSTD_LOGIC);
ENDCOMPONENT;
COMPONENTToneTaba--对调用的NoneTaba元件做声明
PORT(Index:
INSTD_LOGIC_VECTOR(3DOWNTO0);
CODE:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
HIGH:
OUTSTD_LOGIC;
Tone:
OUTSTD_LOGIC_VECTOR(10DOWNTO0));
ENDCOMPONENT;
COMPONENTSpeakera--对调用的Speakera元件做声明
PORT(clk:
INSTD_LOGIC;
Tone:
INSTD_LOGIC_VECTOR(10DOWNTO0);
SpkS:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTmux21a--对调用的mux21a元件做声明
PORT(a,b:
INSTD_LOGIC_VECTOR(7DOWNTO0);
s:
INSTD_LOGIC;
y:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENT;
COMPONENTmux21a_1--对调用的mux21a_1元件做声明
PORT(a1,b1:
INSTD_LOGIC_VECTOR(7DOWNTO0);
s1:
INSTD_LOGIC;
y1:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENT;
SIGNALTone:
STD_LOGIC_VECTOR(10DOWNTO0);--定义标准逻辑位矢数据类型
SIGNALToneIndex:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN--元件与实体中元件间及端口的连接说明
u1:
NoteTabsPORTMAP(clk=>CLK8HZ,ToneIndex=>ToneIndex,key=>key,key1=>key1);
u2:
ToneTabaPORTMAP(Index=>ToneIndex,Tone=>Tone,CODE=>CODE1,HIGH=>HIGH1);
u3:
SpeakeraPORTMAP(clk=>CLK12MHZ,Tone=>Tone,SpkS=>SPKOUT);
END;
--SPEAKERA模块
LIBRARYIEEE;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;--使用的库中的STD_LOGIC_1164程序包
USEIEEE.STD_LOGIC_UNSIGNED.ALL;--使用STD_LOGIC_UNSIGNED程序包
ENTITYSpeakeraIS--实体
PORT(clk:
INSTD_LOGIC;
Tone:
INSTD_LOGIC_VECTOR(10DOWNTO0);
SpkS:
OUTSTD_LOGIC);
END;
ARCHITECTUREoneOFSpeakeraIS--结构体
SIGNALPreCLK,FullSpkS:
STD_LOGIC;
BEGIN
DivideCLK:
PROCESS(clk)--以clk为输入信号的进程
VARIABLECount4:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PreCLK<='0';--将CLK进行16分频,PreCLK为CLK的16分频
IFCount4>11THENPreCLK<='1';Count4:
="0000";
ELSIFclk'EVENTANDclk='1'THENCount4:
=Count4+1;
ENDIF;
ENDPROCESS;--以PreCLK,Tone为输入信号的进程
GenSpkS:
PROCESS(PreCLK,Tone)--11位可预置计数器
VARIABLECount11:
STD_LOGIC_VECTOR(10DOWNTO0);
BEGIN
IFPreCLK'EVENTANDPreCLK='1'THEN
IFCount11=16#7FF#THENCount11:
=Tone;FullSpkS<='1';
ELSECount11:
=Count11+1;FullSpkS<='0';ENDIF;
ENDIF;
ENDPROCESS;--以FullSpkS为输入信号的进程
DelaySpkS:
PROCESS(FullSpkS)--将输出再2分频,展宽脉冲,使扬声器有足够功率发音
VARIABLECount2:
STD_LOGIC;
BEGIN
IFFullSpkS'EVENTANDFullSpkS='1'THENCount2:
=NOTCount2;
IFCount2='1'THENSpkS<='1';
ELSESpkS<='0';ENDIF;
ENDIF;
ENDPROCESS;
END;
--TONETABA模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;--使用的库中的STD_LOGIC_1164程序包
ENTITYToneTabaIS--实体
PORT(Index:
INSTD_LOGIC_VECTOR(3DOWNTO0);
CODE:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
HIGH:
OUTSTD_LOGIC;
Tone:
OUTSTD_LOGIC_VECTOR(10DOWNTO0));
END;
ARCHITECTUREoneOFToneTabaIS结构体
BEGIN
Search:
PROCESS(Index)--以Index为输入信号的进程
BEGIN
CASEIndexIS--译码电路,查表方式,控制音调的预置数
WHEN"0000"=>Tone<="11111111111";CODE<="0000";HIGH<='0';--2047
WHEN"0001"=>Tone<="01100000101";CODE<="0001";HIGH<='0';--773;
WHEN"0010"=>Tone<="01110010000";CODE<="0010";HIGH<='0';--912;
WHEN"0011"=>Tone<="10000001100";CODE<="0011";HIGH<='0';--1036;
WHEN"0101"=>Tone<="10010101101";CODE<="0101";HIGH<='0';--1197;
WHEN"0110"=>Tone<="10100001010";CODE<="0110";HIGH<='0';--1290;
WHEN"0111"=>Tone<="10101011100";CODE<="0111";HIGH<='0';--1372;
WHEN"1000"=>Tone<="10110000010";CODE<="0001";HIGH<='1';--1410;
WHEN"1001"=>Tone<="10111001000";CODE<="0010";HIGH<='1';--1480;
WHEN"1010"=>Tone<="11000000110";CODE<="0011";HIGH<='1';--1542;
WHEN"1011"=>Tone<="11000011111";CODE<="0100";HIGH<='1';--1567;
WHEN"1100"=>Tone<="11001010110";CODE<="0101";HIGH<='1';--1622;
WHEN"1101"=>Tone<="11010000100";CODE<="0110";HIGH<='1';--1668;
WHEN"1111"=>Tone<="11011000000";CODE<="0001";HIGH<='1';--1728;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
END;
--NOTETABS模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;--使用的库中的STD_LOGIC_1164程序包
USEIEEE.STD_LOGIC_UNSIGNED.ALL;--使用STD_LOGIC_UNSIGNED程序包
ENTITYNoteTabsIS--实体
PORT(clk:
INSTD_LOGIC;
ToneIndex:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
key:
INSTD_LOGIC;
key1:
INSTD_LOGIC);
END;
ARCHITECTUREoneOFNoteTabsIS--结构体
COMPONENTMUSIC--对音符数据ROM元件调用声明
PORT(address:
INSTD_LOGIC_VECTOR(7DOWNTO0);
inclock:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOMPONENT;
COMPONENTmux21a--对调用的mux21a元件做声明
PORT(a,b:
INSTD_LOGIC_VECTOR(7DOWNTO0);
s:
INSTD_LOGIC;
y:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENT;
COMPONENTmux21a_1--对调用的mux21a_1元件做声明
PORT(a1,b1:
INSTD_LOGIC_VECTOR(7DOWNTO0);
s1:
INSTD_LOGIC;
y1:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENT;
SIGNALCounter:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALCounter1:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALCounter2:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALyy:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALyy1:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
CNT8:
PROCESS(clk,Counter,Counter1,Counter2)
BEGIN
IFCounter=232THENCounter<="00000000";--自动循环播放
ELSIF(clk'EVENTANDclk='1')
THENCounter<=Counter+1;
ENDIF;
IFCounter1=138THENCounter1<="00000000";--第一首歌曲循环播放
ELSIF(clk'EVENTANDclk='1')
THENCounter1<=Counter1+1;
ENDIF;
IFCounter2=232THENCounter2<="00000000";--第二首歌曲循环播放
ELSIF(clk'EVENTANDclk='1')
THENCounter2<="10010000";
Counter2<=Counter2+1;
ENDIF;
ENDPROCESS;--元件与实体中元件间及端口的连接说明
U1:
mux21aPORTMAP(s=>key,a=>Counter,b=>yy1,y=>yy);
U2:
mux21a_1PORTMAP(s1=>key1,a1=>Counter1,b1=>Counter2,y1=>yy1);
U3:
MUSICPORTMAP(address=>yy,q=>ToneIndex,inclock=>clk);
END;
--mux21a
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;--使用的库中的STD_LOGIC_1164程序包
ENTITYmux21ais--实体
PORT(a,b:
INSTD_LOGIC_VECTOR(7DOWNTO0);
s:
INSTD_LOGIC;
y:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDENTITYmux21a;
ARCHITECTUREoneOFmux21aIS--结构体
BEGIN
y<=aWHENs='0'ELSEb;
ENDARCHITECTUREone;
--mux21a_1
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;--使用的库中的STD_LOGIC_1164程序包
ENTITYmux21a_1is--实体
PORT(a1,b1:
INSTD_LOGIC_VECTOR(7DOWNTO0);
s1:
INSTD_LOGIC;
y1:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDENTITYmux21a_1;
ARCHITECTUREoneOFmux21a_1IS--结构体
BEGIN
y1<=a1WHENs1='0'ELSEb1;
ENDARCHITECTUREone;
--音符数据ROM
LIBRARYieee;--打开ieee库
USEieee.std_logic_1164.all;--使用的库中的std_logic_1164程序包
LIBRARYlpm;--打开lpm库
USElpm.lpm_components.all;--使用的库中的lpm_components程序包
ENTITYMUSICIS--实体
PORT
(
address:
INSTD_LOGIC_VECTOR(7DOWNTO0);
inclock:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDMUSIC;
ARCHITECTURESYNOFmusicIS--结构体
SIGNALsub_wire0:
STD_LOGIC_VECTOR(3DOWNTO0);
COMPONENTlpm_rom--例化lpm_rom元件,调用了LPM模块lpm_rom
GENERIC(--参数传递语句
intended_device_family:
STRING;--类属参量数据类型定义
lpm_width:
NATURAL;
lpm_widthad:
NATURAL;
lpm_hint:
STRING;
lpm_address_control:
STRING;
lpm_outdata:
STRING;
lpm_file:
STRING;
lpm_type:
STRING
);
PORT(
address:
INSTD_LOGIC_VECTOR(7DOWNTO0);
inclock:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDCOMPONENT;
BEGIN
q<=sub_wire0(3DOWNTO0);
lpm_rom_component:
lpm_rom
GENERICMAP(
intended_device_family=>"ACEX1K",--参数传递映射
lpm_width=>4,--数据线宽度4
lpm_widthad=>8,--地址线宽度8
lpm_hint=>"MAXIMUM_DEPTH=256",--数据数量
lpm_address_control=>"REGISTERED",
lpm_file=>"E:
/切换电路/梁祝/notetabs/data1.mif",--ROM初始化数据文件
lpm_type=>"LPM_ROM"
)
PORTMAP(
address=>address,
inclock=>inclock,
q=>sub_wire0
);
ENDSYN;
附音乐数据表:
2.电路的原理图
(用Protel画出)
3.RTL结构图
4.时序仿真图
Notetabas
To
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 乐曲 硬件 演奏 设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)