SOPC EDA综合课程设计乐曲硬件演奏.docx
《SOPC EDA综合课程设计乐曲硬件演奏.docx》由会员分享,可在线阅读,更多相关《SOPC EDA综合课程设计乐曲硬件演奏.docx(14页珍藏版)》请在冰豆网上搜索。
SOPCEDA综合课程设计乐曲硬件演奏
目录
第一章EDA技术综合应用设计的主要软件及设备-1-
1.1主要软件、设备及作用:
-1-
1.2实验电路结构图......-1-
第二章乐曲硬件演奏电路设计的原理-2-
第三章乐曲硬件演奏电路VHDL程序设计-4-
3.1音乐节拍和音调发生器模块PUTTAB-4-
3.1.1PUTTAB模块原理图-5-
3.1.2puttab模块时序仿真图-5-
3.2音乐谱对应分频预制数查表电路模块ONTAB-5-
3.2.1ONTAB模块原理图-7-
3.2.2ONTAB模块时序仿真图-7-
3.3音乐符数控11分频电路模块OUTSPEKER-8-
3.3.1OUTSPEAKER模块原理图-9-
3.3.2OUTSPEAKER模块时序仿真图-9-
3.4乐曲演奏音符数据文件(梁祝、自选曲)-10-
3.4引脚绑定-11-
第四章顶层程序的时序仿真图-13-
第五章课程设计心得体会-14-
参考文献.................................................-15-
第一章EDA技术综合应用设计的主要软件及设备
1.1主要软件、设备及作用:
EDA技术的综合应用设计与开发可能用到的主要开发设计软件、设备及其作用如下:
(1)EDA的工具软件:
目前比较流行的、主流厂家的EDA的软件工具有Altera的MAX+plusⅡ、QuartusⅡ,Lattice的ispDesignExpERT,Xilinx的FoundationSeries、ISE/ISE-WebPACKSeries。
(2)计算机辅助分析软件:
MATLAB用于复杂系统的系统级仿真,DSP的系统建模,有关数据的计算和分析等。
(3)印刷电路板PCB的设计软件:
主要有PROTEL、ORCAD等,用于设计系统的外围部件或外围电路的PCB图。
(4)EDA实验开发系统/片上系统(SOPC)/嵌入式系统:
用于EDA实验与开发的硬件的编程下载及硬件验证。
(5)单片机仿真器及仿真头:
用于单片机程序的调试与硬件的验证。
(6)印刷电路板PCB的制作设备:
用于系统外围部件或外围电路的PCB的制作。
(7)信号源、示波器、频率计、无线电综合测试仪等其它相关设备。
1.2实验电路结构图
图1-1实验电路结构图NO.1
第二章乐曲硬件演奏电路设计的原理
与利用微处理器来实现乐曲演奏相比,一纯硬件完成乐曲演奏电路的逻辑要复杂的多,如果不借助于功能强大的EDA工具和硬件描述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。
本文通过利用硬件乐曲演奏电路的设计实例,使读者初步了解VHDL硬件描述语言和QuartusII开发环境。
设计并调试好一个能产生梁祝曲子的音乐发生器,并利用EDA实验开发系统(本设计是在Altera的FPGA芯片CycloneEP1C6和杭州康芯电子有限公司生产的GW48系列EDA)的基础上完成硬件测试。
根据系统提供的时钟源引入一个12MHZ时钟的基准频率,对其进行各种分频系数的分频,产生符合某一音乐的频率,然后再引入8HZ的时钟为音乐的节拍控制,最后通过扬声器放出来。
图2-1音乐产生器原理框图
乐曲时由每个音符的发音频率值及其持续的时间是乐曲能连续演奏的两个基本要素,在下面的电路就是来获取这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值来实现所希望乐曲的演奏效果。
模块PUTTAB类似于弹琴人的手指;模块ONTAB类似于琴键;模块OUTSPEKER类似于琴弦或音调发生器。
乐曲硬件演奏电路设计的原理:
(1)音符的频率可以由图中的OUTSPEKER获得,这是一个数控分频器。
由其CLK端输入一具有较高频率(这里是12MHZ)的信号,通过OUTSPEKER分频后又SPKOUT输出,由于直接从数控分频器中出来的输出信号时脉宽及其狭窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器一均衡其占空比,但这是的频率将是原来的一半。
OUTSPEKER对CLK输入信号的分频比又11位的预置数TONE[10..0]决定。
SPKOUT的输出频率将决定每一音符的音调,这样,分频计数器的预置数TONE[10..0]与SPKOUT的输出频率就有了对应关系。
例如在ONTAB模块中若去TONE[10..0]=1036,将发音符为“3”音的信号频率。
(3)3.22音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定,图8-6中模块ONTAB的功能首先是为SPEAKRA提供决定所发音符的分频预置数,而此数在SPEAKRA输入口停留的时间即为此音符的节拍值。
模块ONTAB是乐曲简谱码对应的分频预置数查表电路,其中设置了“梁祝”乐曲全部音符所对应的分频预置数,共13个,每一音符的停留时间由音乐节拍和音调发生器模块PUTTAB的clk的输入频率决定,在此为4HZ。
这13个值的输出由对应于ONTAB的4位输入值Index【3..0】确定,而Index【3..0】最多有16种可选值。
输向ONTAB中Index【3..0】的值ToneIndex【3..0】的输出值与持续的时间由模块NOTERABS决定。
(3)3.23在PUTTAB中设置了一个8位二进制计数器(计数最大值为137),作为音符数据ROM的地址发生器。
这个计数器的计数频率选为4HZ,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒时,四四拍的4分音符持续时间。
例如,PUTTAB在以下的VHDL逻辑描述中,“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒时间,相应的,所对应的“3”音符分频预置值为1036,在OUTSPEKERA的输入端停留了1秒。
随着PUTTAB中的计数器按4HZ的时钟速率作加法计数时,即随地址值递增时,音符数据ROM中的音符数据将从ROM中通过ToneIndex【3..0】端口输向ONTAB模块,“梁祝”乐曲就开始连续自然的演奏起来了。
图2-2顶层模块设计原理图
第三章乐曲硬件演奏电路VHDL程序设计
根据顶层模块设计原理图,共分为music模块、地址发生器模块、分频预置数模块这3个模块。
music模块存放乐曲中的音符数据,地址发生器模块作为music模块中所定制的音符数据ROM的地址发生器,分频预置数模块提供分频预置数即给数控分频模块提供计数初值,十六进制模块对12MHz的时钟脉冲进行16分频,得到750KHz的频率,给数控分频模块提供时钟脉冲。
数控分频模块根据分频预置数输出各个音符所对应的频率。
3.1音乐节拍和音调发生器模块PUTTAB
乐曲演奏电路的VHDL逻辑描述如下:
libraryieee;--音乐节拍和音调发生器模块
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityPUTTABis
port(clk:
instd_logic;--时钟信号
SEL:
INSTD_LOGIC;--音乐选择键
RST:
INSTD_LOGIC;--复位键
toneindex:
outstd_logic_vector(3downto0));
end;
architectureoneofPUTTABis
componentMUSIC--音符数据
port(address:
instd_logic_vector(7downto0);
clock:
instd_logic;
q:
outstd_logic_vector(3downto0));
endcomponent;
signalcounter:
std_logic_vector(7downto0);--8位二进制计数器
begin
CNT8:
PROCESS(clk,Counter,sel,rst)
BEGIN
IF((clk'EVENTANDclk='1')and(Counter=256orrst='0'))thenCounter<="00000000";Counter<=Counter+1;
endif;
IF((clk'EVENTANDclk='1')and(sel='0'))THENCounter<="10010000";Counter<=Counter+1;
endif;
endprocess;
u1:
MUSICportmap(address=>counter,q=>toneindex,clock=>clk);
end;
3.1.1PUTTAB模块原理图
图3-1PUTTAB模块原理图
3.1.2puttab模块时序仿真图
将所编写的音乐节拍和音调模块PUTTAB的程序设为工程,选用Altera公司的Cyclone系列中的EP1C3TC144为目标芯片进行仿真。
图3-2puttab模块时序仿真图
由上图可以看出,该模块音乐节拍和音调发生器模块,当CLK给出上升沿输出时,给出音符节拍,当RST复位时音符从头给出358等音乐节拍,当SEL为低电平时,自动切换到下一首歌曲。
满足要求。
3.2音乐谱对应分频预制数查表电路模块ONTAB
libraryieee;
useieee.std_logic_1164.all;
entityONTABis
port(index:
instd_logic_vector(3downto0);
tone:
outstd_logic_vector(10downto0);
HIGH:
OUTstd_logic;
CODE:
outstd_logic_vector(3downto0));
end;
architectureoneofONTABis
begin
search:
process(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"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;
3.2.1ONTAB模块原理图
图3-3ONTAB模块原理图
3.2.2ONTAB模块时序仿真图
波形仿真
将所编写的分频预置数查表模块ONTAB的程序设为工程,选用Altera公司的Cyclone系列中的EP1C3TC1448为目标芯片进行仿真。
仿真结果如下图:
图3-4模块ONTAB的波形仿真
由上图可以看出,该模块为音乐谱对应分频预制数查表电路模块,当code为休止符0000时,输出端tone给出的分频预置数为2047,当code为0001时输出端tone给出的分频预置数为773,满足程序要求。
3.3音乐符数控11分频电路模块OUTSPEKER
音符的频率由数控分频模块获得,这是一个数控分频电路。
它是由一个初值可变的加法计数器构成。
该计数器的模为2047,当计数器记满时,计数器产生一个溢出信号FULL,此溢出信号就是用作发音的频率信号。
在计数器的输入端给定不同的初值,而此预置数就是表1中的计数初值,就可得到不同音符的发音频率信号。
它计满时所需要的计数初值可由下式来表示。
分频系数=基准频率/音符的发生频率
计数初值(Tone)=2047-分频系数
低音时Tone值小,分频系数大,溢出信号周期长,扬声器发出的声音低,Tone随音乐的乐谱变化大,自动控制分频比,实现了数控分频,发生信号的频率与音调Tone成正比。
这就是利用数控分频器自动演奏音乐的原理。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityOUTSPEKERis
port(clk:
instd_logic;
tone:
instd_logic_vector(10downto0);
spks:
outstd_logic);
endentityOUTSPEKER;
architectureoneofOUTSPEKERis
signalpreclk,fullspks:
std_logic;
begin
divideclk:
process(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;
endprocessdivideclk;
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;
delayspks:
process(fullspks)--将输出再2分频,展宽脉冲,使扬声器有足够功率发音
variablecount2:
std_logic;
begin
iffullspks'eventandfullspks='1'thencount2:
=notcount2;
ifcount2='1'thenspks<='1';
elsespks<='0';endif;
endif;
endprocess;
end;
3.3.1OUTSPEAKER模块原理图
图3-5OUTSPEAKER模块原理图
3.3.2OUTSPEAKER模块时序仿真图
波形仿真
将所编写的音乐符数控分频模块OUTSPEKER的程序设为工程,选用Altera公司的Cyclone系列中的EP1C3TC144为目标芯片进行仿真。
仿真结果如下图:
图3-6模块OUTSPEKER的波形仿真图
由上图可以看出,此图为音乐符数控11分频电路模块,tone为11001010110时,给出的分频预置数为1686,,这样,与SPKS的输出频率就有了对应关系。
满足程序要求。
3.4乐曲演奏音符数据文件(梁祝、自选曲)
WIDTH=4;--乐曲演奏数据
DEPTH=256;
Address_radix=dec;
Data_radix=dec;
CONTENTBEGIN
33335556
88896855
1212121513121012
99999990
999107766
55568899
33886568
55555555
101010127799
68555555
35335679
66666656
888912121210
991098865
33338888
68653568
55555555
00000000
12335567
76563211
12325678
98765232
33335555
00000000
其中WIDTH=4,表示数据输出为宽为4;DEPTH=256,表示共有256个4位数据点;ADDRESS-RADIX=DEC,表示地址信号用十进制;DATA-RADIX=DEC,表示输出数据是十进制数。
形成ROM中的配置数据(初始化数据)文件的方法如下:
在QUARTUS||中编辑.mif文件。
首先在File菜单下的New菜单上选择TextEditorFile命令,进入文本编辑器,然后输入以上格式的数据文件。
文件中的关键词WIDTH设置ROM的数据宽度;DEPTH设置ROM数据的深度,即4位数据的数量,文件中设置的256等效于8位地址线宽度;ADDRESS-RADIX=DEC和DATA-RADIX=DEC表示设置地址和数据的表达式格式都是十进制;地址/数据表以CONTENTBEGIN开始,以END结束;其中的地址/数据表达方式是冒号左边写ROM地址值,冒号右边写对应此地址放置的十进制数据.
3.4引脚绑定
为了能对此电路进行硬件测试,应将其输入信号锁定在芯片确定的引脚上,编译后下载。
当硬件测试完成后,还必须对配置芯片进行编程,完成FPGA的最终开发。
确定引脚分别为CLK8HZ接第128脚,CLK12MHZ接在第123引脚上,复位RST接在第106引脚上,选择键SEL接在第107引脚上;CODE【3..0】
分别接在第42到39引脚上,high接在第73引脚上,输出SPKOUT接在第129引脚上。
确定了锁定引脚编号后就可以完成以下引脚锁定操作了,选择ASSSIGNMENT-----PINS命令,将弹出目标器件的引脚编辑窗口,将信号名拖入引脚上,最后储存这些引脚锁定的信息后,再编译一次,才能将引脚锁定信息编译进编程下载文件中。
图3-7整个设计电路的引脚绑定图
第四章顶层程序的时序仿真图
图4-1顶层程序的时序仿真
已经实现乐曲的演奏。
SEL为低电平时切换第二首乐曲播放,RST为低电平时从第一首乐曲开始重新播放。
达到了设计要求
第五章课程设计心得体会
这次EDA课程设计历时两个星期,在整整两个星期的日子里,可以说是苦多于甜,但是可以学的到很多很多的东西,同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。
特别是当每一个子模块编写调试成功时,心里特别的开心。
但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。
在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示。
后来,在数十次的调试之后就可以观察到完整的仿真结果。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
总的来说,这次设计的乐曲硬件演奏电路还是比较成功的,在设计中遇到了很多问题,最后在老师的辛勤的指导下,终于游逆而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。
最后,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢
参考文献
1潘松黄继业编著。
EDA技术与VHDL(第二版)。
清华大学出版社。
2007
2刘江海EDA技术课程设计。
华中科技大学出版社。
2008
3潘松编著.EDA技术实用教程.北京:
科学教育出版社.2006
4Quartus Semiconductordatabooks.QuartusSemiconductor Corporation.2001
5杭州康芯电子有限公司GW48-PK3实验系统说明书.杭州康芯电子有限公司.2006