两只老虎EDA课程设计详细.docx
《两只老虎EDA课程设计详细.docx》由会员分享,可在线阅读,更多相关《两只老虎EDA课程设计详细.docx(13页珍藏版)》请在冰豆网上搜索。
两只老虎EDA课程设计详细
课程设计
课程设计名称:
专业班级
学生姓名:
学号:
指导教师:
课程设计时间:
1设计任务及要求
设计任务:
乐曲自动播放器。
自行选择一首自己喜爱的经典乐曲,用FPGA设计实现一个该曲目的自动演奏电路。
要求:
(1)根据设计题目要求编写相应程序代码
(2)对编写的VHDL程序代码进行编译和仿真
(3)利用实验箱完成硬件验证
(4)总结设计内容,完成课程设计说明书
与利用微处理器,以纯硬件完成乐曲演奏电路的逻辑要复杂得多。
本实验设计项目作为“两只老虎”乐曲演奏电路的实现,组成每个乐曲的每个音符的发音频率值及持续的时间是乐曲能连续演奏所需要的两个基本要素。
(1)音乐硬件演奏电路基本原理
硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。
乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。
而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。
(2)音符频率的获得
多个不同频率的信号可通过对某个基准频率进行分频器获得。
由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。
若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。
若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。
实际上应
该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。
本设计中选取1MHz的基准频率。
数控分频器采用12位二进制计数器,乐曲中的休止符,只要将分频系数设为0,即初始值=4095,此时扬声器不会发声。
根据分频系数,可计算数控分频器得到的初始值。
初始值的计算公式如下:
由于所设计的数控分频计采用12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数变化的脉冲信号。
由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声,故最终输出信号的频率与预置数的关系如下:
其中九为音阶对应的频率。
表1简谱中的音名与频率的关系
音名
频率/Hz
音名
频率/Hz
音名
频率/Hz
]
低音1
中音1
高音1
低音2
■
•
中音2
高音2
低音3
中音3
高音3
低音4
中音4
高音4
低音5
中音5
高音5
低音6
440
中音6
880
高音6
1760
低音7
中音7
高音7
表2各音阶频率对应的分频值
音名
分频
系数
初始
值
音名
分频
系数
初始
值
音名
分频
系数
初始
值
低音1
7644
547
■
中音1
3822
4369
高音1
1911
6280
低音2
6810
)
1381
中音2
3405
4786
高音2
1270
6921
低音3
6067
2124
中音3
3034
5157
高音3
1517
6674
■
低音4
5727
2464
中音4
2864
5327
高音4
1432
6759
低音5
5102
3089
中音5
2551
5640
高音5
•
1256
6935
低音6
4545
3646
中音6
2273
5918
高音6
1137
7054
低音7
4050
4141
中音7
2025
6166
高音7
1013
7178
(3)乐曲节奏的控制
一般乐曲最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要输出
4Hz的1/4拍的时长(秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。
计数时钟信号作为输出音符快幔的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低,由于最后的蜂鸣器前需加一个二分频的程序,因此计数器的时钟信号应为4Hz的2倍,即
8Hzo
(4)乐谱的发生
本设计将乐谱中的音符数据存储在LPM-ROM中,若某音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,该音符就要在LPM-ROM中连续的四个地址上都存储。
当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。
(5)选择模块
选择模块将用一个4位数的控制信号控制乐谱模块数据的选择性,用vhdl语言描述。
两只老虎
1231
1231
345
346
两只老虎
两只老虎
龜待快
胞铸快
151弓
1515
1515
1616
法E艮歌
2设计原理及总体框图
SPEAKERA
J—
CL.K
■SPKS
—
TONECIO.
・O]
(1)音符的发音频率设定及实现
音符的频率可由一个数控分频器SPEAKERA获得,由其CLK端输入一个有较高频率的信号,通过SPEAKERA分频后由SPROUT输出。
由于直接从数控分频器中出来的输出信号是脉宽极窄的,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,但这时的频率将是原来的1/对elk输入信号的分频比由11位预置数Tone[10..0]决定。
SPROUT的辙出频率就有了对应关系。
例如,在TONETABA模块中若取Tone[10..0]=1036,将对应法音符为"3”音的信号频率。
TONETapa:
CODE[3..©□
IMDEX[3.・OJHIGH:
TOMEI:
JL0・•0丁
(2)音符的持续时间XO1
音符的持续时间需根据乐曲的速度及每个一怒的节拍数来确定,图中模块TONETAB/V的功能首先是为SPEAKERA提供决定所发音符的分频预置数,而此数在SPEAKER输入口停留的时间即为次音符的节拍值。
模块TONETABA是乐曲简谱码对应的分频预置数查表电路,其中设置“两只老虎”乐曲全部音符所对应的分频预置数,共M个,每一音符的停留时间由音乐节拍和音调发生器模块NOTETABS的elk输入频率决定,这11个值的输出由对应于TONETABA中Index[3..0]的值ToneIndex[3..0]的输出值与持续时间由模块NOTETABS决定。
在NOTETABS中设置了一个8位二进制计数器(计数最大值为138),这个计数器的技术频率选为4Hz,即每一个计数值停留时间为,恰为当全音符设为Is时,四四拍的4分音符持续时间。
例如,NOTETABS在以下的VHDL逻辑描述中,“两只老虎”乐曲的第一个音符为“5”,此音在逻辑中停留了1个时钟节拍,即时间,相应地,所对应的“”音符分频预置值为在SPEAKERA的输入端开始连续自然地演奏起来了。
设计的总体框图如下:
3程序设计
VHDL程序如下:
(1)是设计电路的顶层设计
LIBRARYIEEE;
USESongerIS
•••
PORT(CLK12MHZ:
INSTDLOGIC;
CLK8HZ:
INSTD_LOGIC;
CODEI:
OUTINTEGERRANGE0TO15;
HIGH1:
OUTSTD_LOGIC;
SPKOUT:
()UTSTDLOGIC):
END;
ARCHITECTUREoneOFSongerIS
COMPONENTNoteTabs
•••
PORT(elk:
INSTD_LOGIC;
ToneIndex:
OUTINTEGERRANGE0TO15);
ENDCOMPONENT;
COMPONENTToneTaba
ENDCOMPONENT;
COMPONENTSpeakera
PORT(elk:
INSTD_LOGIC;
Tone:
ININTEGERRANGE0TO16#7FF#;
SpkS:
OUTSTDLOGIC):
ENDCOMPONENT;
SIGNALTone:
INTEGERRANGE0TO16#7FF#;
SIGNALToneindex:
INTEGERRANGE0TO15;
BEGIN
ul:
NoteTabsPORTMAP(elk二〉clk8HZ,Toneindex二〉Toneindex);
PORT
u2:
ToneTaba
MAP(Index=>ToneIndex,Tone=>Tone,CODE=>C()DE1,HIGH=>HIGH1);
u3:
SpeakeraPORTMAP(c1k=>CLK12MHZ,Tone=>Tone,SpkS=>SPKOUT);END;
(2)是乐曲简谱码对应的分频预置数查表电路。
LIBRARYIEEE;
■
USEToneTabaIS
PORT(Index:
ININTEGERRANGE0TO15;
CODE:
OUTINTEGERRANGE0TO15;
HIGH:
OUTSTD_LOGIC;
Tone:
OUTINTEGERRANGE0TO16#7FF#);
END;
ARCHITECTUREoneOFToneTabaIS
BEGIN
(
Search:
PROCESS(Index)
BEGIN
CASEIndexIS
WHEN0=>Tone<=2047;CODE<=O:
HIGH<=101;
WHEN1=>Tone<=773;C0DE<=l;HIGH<=,0,:
WHEN2=>Tone<=912:
CODE<=2:
HIGH<='01;
WHEN3=>Tone<=1036;C0DE<=3;HIGH<=,0,;
WHEN4=>Tone<=l110;CODE<=4;HIGH<=,0r:
WHEN5=>Tone<=l197;C0DE<=5;HIGH<=r0r:
WHEN6=>Tone<=1290;C0DE<=6;HIGH<=,0,:
WHEN7=>Tone<=1372;CODE<=l;HIGH<=,11:
WHEN8=>Tone<=1410;C0DE<=2;HIGH<=r11:
WHEN9=>Tone<=1480;C0DE<=3;HIGH<=,11:
WHEN10=>Tone<=1542;CODE<=4;HIGH<=rI1;
WHENOTHERS二〉NULL;
ENDCASE;
)
ENDPROCESS;
END;
(3)是设计电路的数控分频器:
LIBRARYIEEE;
USESpeakeraIS
PORT(elk:
INSTD_LOGIC;
Tone:
ININTEGERRANGE0TO16#7FF#;
SpkS:
OUTSTD_LOGIC);
END;
ARCHITECTUREoneOFSpeakeraIS
SIGNALPreCLK:
STD_LOGIC;
SIGNALFullSpkS:
STDLOGIC;
BEGIN
DivideCLK:
PROCESS(elk)
VARIABLECount4:
INTEGERRANGE0TO15;
BEGIN
PreCLK<='0';
IFCount4>11THENPreCLK<=r11;Count4:
=0;
ELSIFelk1EVENTANDelk二iTHENCount4:
=Count4+l;
ENDIF;
ENDPROCESS;
GENSpkS:
PROCESS(PreCLK,Tone)
VARIABLECount11:
INTEGERRANGE0TO16#7FF#;
BEGIN
IFPreCLK*EVENTANDPreCLK二T'THEN
IFCount11=16#7FF#THEN
Countll:
=Tone;
FullSpkS<=,r;
ELSECount11:
=Count11+1;
FullSpkSU'O';
ENDIF;
ENDIF;
ENDPROCESS;
De1aySpkS:
PROCESS(FullSpkS)
VARIABLECount2:
STDLOGIC;
BEGIN
IFFullSpkS1EVENTANDFullSPKS二T'THEN
Count2:
=NOTCount2;
IFCount2二TTHENSpkSO'l';
ELSESpkS<=,0,;
ENDIF;
ENDIF;
ENDPROCESS;
END;
(4)NOTETABS模块决定音乐的输出值与持续时间:
LIBRARYIEEE;
c
USENoteTabsIS
PORT(elk:
INSTD丄OGIC;
Toneindex:
OUTINTEGERRANGE0TO15);
END;
ARCHITECTUREoneOFNoteTabsIS
SIGNALCounter:
INTEGERRANGE0TO35;
BEGIN
CNT8:
PROCESS(elk)
BEGIN
IFCounter=35THENCounter<=0;
ELSIF(elk1EVENTANDelk二'l')THEN
Counter<=Counter+l;
ENDIF;
ENDPROCESS;
Search:
PROCESS(Counter)
BEGIN
CASECounterIS
WHEN00=>ToneIndex<=l;
WHEN01=>ToneIndex<=2;
WHEN02=>ToneIndex<=3;
WHEN03=>ToneIndex<=l;
WHEN04=>ToneIndex<=l;
WHEN05=>ToneIndex<=2;
WHEN06=>ToneIndex<=3;
WHEN07=>ToneIndex<=l;
WHEN08=>ToneIndex<=3;
WHEN09=>ToneIndex<=4;
WHEN10=>ToneIndex<=5;
WHEN11=>ToneIndex<=5;
WHEN12=>ToneIndex<=3;
WHEN13=>ToneIndex<=4;
WHEN14=>ToneIndex<=5;
WHEN15=>ToneIndex<=5;
WHEN16=>ToneIndex<=5;
WHEN17=>ToneIndex<=6;
WHEN18=>ToneIndex<=5;
WHEN19=>ToneIndex<=4
WHEN20=>ToneIndex<=3;
WHEN
21
=>ToneIndex<=l;
WHEN
22
=>ToneIndex<=5;
WHEN
23
=>ToneIndex<=6;
WHEN
24
=>ToneIndex<=5;
WHEN
25
=>Tonelndex〈=4;
WHEN
26
=>ToneIndex<=3;
WHEN
27
=>ToneIndex<=l;
WHEN
28
=>ToneIndex<=l;
WHEN
29
=>ToneIndex<=5;
WHEN
30
=>Tonelndex〈=l;
WHEN
31
=>ToneIndex<=l;
WHEN
32
=>ToneIndex<=l;
WHEN
33
=>ToneIndex<=5;
WHEN
34
=>ToneIndex<=l;
WHEN
35
=>ToneIndex<=l;
WHENOTHERS二〉NULL;
ENDCASE;
ENDPROCESS;
END;
4编译及仿真
在这次EDA课程设计过程中,用的是MAX+plusII,它是一种集成的开发环境,提供了一种与结构无关的设计环境,设计者无需精通器件的内部结构,而只需要用自己熟悉的设计输入方式去表达设计内容,MAX+plusII便会自动把这些设计转换成最终结构,所需的格式。
并且MAX+plusII使用方便,具有强大的编程,设计,仿真功能。
顶层设计仿真波形图如下:
-mwpuiirt?
tunutwwuuramijhuiiix%upuur*miuMnap
Rtf.|149笳|亟Tire阴收Irttfrt伽
5硬件调试与结果分析
本实验器件选用EP1K30TC144-1,利用GW48-CK实验开发系统,并使用其中结构图•引脚排列如下:
Clk8hz>chip=zuhe;inputpin=54
Clkl2mhz>chip=zuhe;inputpin=126
CodelO>chip=zuhe;outputpin=33
CodelO>chip=zuhe;outputpin=32
CodelO>chip=zuhe;outputpin=31
CodelO>chip=zuhe;outputpin二30
Highl>chip=zuhe;outputpin=81
SPKOUT>chip=zuhe;outputpin=99
引脚锁定后再通过编译器对文件重新编译以便将引脚信息编入下载文件中。
然后再将文件下载到实验箱当中,观察实验结果,试验箱开始循环播放“两只老虎”乐曲O
心得体会
通过两周的课程设计,我对EDA的设计有了进一步的认识,对MAXPLUSII的设计步骤也有了更进一步的了解。
这种基于FPGA的音乐硬件演奏电路的设计与实现,不仅通过VHDL层次化和模块化设计方法,同时釆用数控分频和定制LPM-ROM的设计思想,更好的优化了乐曲演奏数字电路的设计,在此基础上不必变化顶层文件架构可随意变更乐曲,有效缩短了产品开发周期、减少了设计芯片的数量、降低了功耗、提高了设计的灵活性、可靠性和可扩展性通过课程设计,感觉还是学到了不少的实践动手能力。
本次课程设计使我对EDA设计的能力和兴趣有很大提髙,受益良多,对自己以后的发展也会起到一定的作用。