EDA简易乐器演奏器Word文档格式.docx
《EDA简易乐器演奏器Word文档格式.docx》由会员分享,可在线阅读,更多相关《EDA简易乐器演奏器Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
在用VHDL语言来设计电路时,主要的过程是这样的:
(1)使用文本编辑器输入设计源文件。
(2)使用编译工具编译源文件。
VHDL的编译器有很多,ACTIVE公司,MODELSIM公司,SYNPLICITY公司,SYNOPSYS公司,VERIBEST公司等都有自己的编译器。
(3)功能仿真。
对于某些人而言,仿真这一步似乎是可有可无的。
但是对于一个可靠的设计而言,任何设计最好都进行仿真,以保证设计的可靠性。
另外,对于作为一个独立的设计项目而言,仿真文件的提供足可以证明你设计的完整性。
(4)综合。
综合的目的是在于将设计的源文件由语言转换为实际的电路。
这一部分的最终目的是生成门电路级的网表(Netlist)。
(5)布局、布线。
这一步的目的是生成用于烧写的编程文件。
在这一步,将用到第(4)步生成的网表并根据CPLD/FPG厂商的器件容量,结构等进行布局、布线。
这就好像在设计PCB时的布局布线一样。
先将各个设计中的门根据网表的内容和器件的结构放在器件的特定部位。
然后,在根据网表中提供的各门的连接,把各个门的输入输出连接起来。
(6)最后仿真。
这一步主要是为了确定设计在经过布局布线之后,是不是还满足原本的设计要求。
3简易电子琴设计过程
3.1简易电子琴的工作原理
音乐产生原理及硬件设计由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
该电子琴可以实现两个功能,用按键CS来选择不同功能,第一种功能是用手动即通过按键的形式输入不同音名,第二种功能是音乐发生器,可以自动重复播放儿童歌曲“种太阳”音乐。
当CS为高电平1时,选择功能二,当CS为低电平0时,选择功能一。
3.2简易电子琴的工作流程图
3.3简易电子琴中各模块的设计
系统内部结构图如图3.1所示
图3.1
3.3.1分频器fpq1模块
1.分频器1的程序
libraryieee;
useieee.std_logic_1164.all;
entityfpq1is
port(clk12:
instd_logic;
clk1:
bufferstd_logic);
endfpq1;
architecturebhvoffpq1is
begin
process(clk12)
variablecount:
integerrange0to1200;
ifclk12'
eventandclk12='
1'
then
count:
=count+1;
ifcount=1200then
clk1<
=notclk1;
=0;
endif;
endprocess;
endbhv;
2.分频器1的仿真图
3.3.2分频器fpq2模块程序
1.分频器2的程序
entityfpq2is
port(clk1:
clk2:
endfpq2;
architecturebhvoffpq2is
process(clk1)
integerrange0to500;
ifclk1'
eventandclk1='
ifcount=500then
clk2<
=notclk2;
2.分频器2的仿真图
3.3.3琴/乐功能选择器bmux模块程序
1.功能选择器的程序
entitybmuxisport(
index1:
instd_logic_vector(3downto0);
index2:
cs:
toneindex:
outstd_logic_vector(3downto0));
end;
architecturebhvofbmuxis
process(cs)
casecsis
when'
0'
=>
toneindex<
=index1;
=index2;
whenothers=>
=null;
endcase;
3.3.2乐曲自动演奏notetabs模块程序
entitynotetabsis
port(clk:
toneindex2:
endnotetabs;
architectureoneofnotetabsis
signalcounter:
integerrange0to138;
process(clk)
ifcounter=138then
counter<
elsifclk'
eventandclk='
then
=counter+1;
process(counter)
casecounteris
when00=>
toneindex2<
="
0101"
;
when01=>
0110"
when02=>
when03=>
when04=>
1011"
when05=>
when06=>
1001"
when07=>
when08=>
when09=>
when10=>
when11=>
when12=>
when13=>
when14=>
when15=>
when16=>
0011"
when17=>
0100"
when18=>
when19=>
when20=>
when21=>
when22=>
when23=>
when24=>
when25=>
when26=>
0111"
when27=>
when28=>
when29=>
when30=>
0000"
when31=>
when32=>
when33=>
when34=>
1010"
when35=>
when36=>
when37=>
when38=>
0010"
when39=>
when40=>
when41=>
when42=>
when43=>
when44=>
when45=>
when46=>
when47=>
when48=>
when49=>
when50=>
when51=>
when52=>
when53=>
when54=>
when55=>
when56=>
when57=>
when58=>
when59=>
when60=>
when61=>
when62=>
when63=>
when64=>
when65=>
when66=>
when67=>
when68=>
when69=>
when70=>
when71=>
when72=>
when73=>
when74=>
when75=>
when76=>
when77=>
when78=>
when79=>
when80=>
when81=>
when82=>
when83=>
when84=>
when85=>
when86=>
when87=>
when88=>
1100"
when89=>
when90=>
when91=>
when92=>
when93=>
when94=>
when95=>
when96=>
when97=>
when98=>
when99=>
when100=>
when101=>
when102=>
when103=>
when104=>
when105=>
when106=>
when107=>
when108=>
when109=>
when110=>
when111=>
when112=>
when113=>
when114=>
when115=>
when116=>
when117=>
when118=>
when119=>
when120=>
when121=>
when122=>
when123=>
when124=>
when125=>
when126=>
when127=>
when128=>
when129=>
when130=>
when131=>
when132=>
when133=>
when134=>
when135=>
when136=>
when137=>
when138=>
null;
endone;
3.3.3按键tone模块程序
entitytoneis
port(key:
instd_logic_vector(6downto0);
toneindex1:
architectureoneoftoneis
search:
process(key)
begin
casekeyis
when"
0000001"
toneindex1<
0001"
0000010"
0000100"
0001000"
0010000"
0100000"
1000000"
3.3.4tonetaba模块程序
entitytonetabais
port(index:
instd_logic_vector(3downto0);
code:
outstd_logic_vector(3downto0);
high:
outstd_logic;
tone:
outstd_logic_vector(10downto0));
architectureoneoftonetabais
process(index)
begin
caseindexis--译码电路,查表方式,控制音调的预置数
when"
=>
tone<
11111111111"
;
code<
high<
='
--2047
01100000101"
high<
--773;
01110010000"
--912;
10000001100"
--1036;
10001011100"
--1116;
10010101101"
--1197;
10100001010"
--1290;
10101011100"
--1372;
1000"
10110000010"
--1410;
10111001000"
--1480;
11000000