电子课程设计
——乐曲硬件演奏电路设计
学院 太原科技大学华科学院
专业、班级 电子信息工程 姓名
学号 指导教师 2011年12月
-1
- 好好学习,天天向上
目录
一、设计任务与要求 3
二、总框体图 3
三、选择器件 四、功能模块 一、音乐数据模块 4
二、音符控制输出模块 7
3、音符译码模块 4、数控分频器模块 五、分频器模块 12
六、译码模块 五、整体设计电路图 一、整体电路原理图 -2
……………………………
……………………………
…………………………… 4 …………………………… 4
……………………………
……………………………
…………………………… 8 ……………………………11 ……………………………
………………………… 13
……………………………15
……………………………
- 好好学习,天天向上
15
二、管脚分派图 ……………………………
15
3、电路仿真结果 ……………………………15 4、硬件验证 ……………………………16
六、设计心得 ……………………………17 七、附录 ……………………………19
乐曲硬件演奏电路设计
一、 设计任务与要求:
一、实验内容
利用可编程逻辑器件FPGA,设计乐曲硬件演奏电路,可自动演奏乐曲。 二、实验要求
(1)利用数控分频器设计硬件乐曲演奏电路。 (2)利用给定的音符数据定制ROM“music”。
(3)设计乘法器逻辑框图,并在QuartusII上完成全部设计。 (4)将音乐通过实验箱上的喇叭播放出来。
(5)与演奏发音相对应的简谱码输出在数码管上显示。
二、 整体框图
设计思路:
C调音阶频率表: 音阶 .频率Hz 音阶 7 6 5 频率Hz 音阶 7 .6 .5 .频率Hz 370 7 6 5 -3
.. - 好好学习,天天向上
4 3 .. 880 4 3 2 1 440 4 .3 .2 .1 . 220 2 1 ..在《EDA技术实用教程》课程中,已经学习过数控分频器设计,即输入不同的预置数即可发出不同频率的声音。由此,可以以此为设计基础。设计一功能模块,能够将乐曲中的音符一一以对应的频率以预置数的形式置入数控分频计中,即可利用该数控分频计产生不同的声音,演奏出设定好的音乐。
ROM中的音乐数据文件刚可由编辑好的音符填入MIF文件中再定制LPM_ROM将音符数据加载入ROM中,并设计程序在运行时自动读取ROM中的文件并置入数控分频器中。
当采用四四拍曲子时,每节拍持续时间为秒。置入数控分频器的速度也应与此同步或一致,避免音乐过快或过快慢而失真。
由已知的C调音阶频率表,各频率对应的预置数就与数控分频推动蜂鸣器发作声音的频率对应。在编写数控分频器时,不仅要考虑预置数的输入方式,还要考虑输入的速度,和驱动蜂鸣器发声的频率。
为了显示高音音调,可在音符预置数的译码进程中,同时译出高音音阶的信号,并利用LED灯输出信号。同时,也可利用该译码模块,将当前演奏的音符简谱表达出来。 整体框图
三、 选择器件
芯片及相应的连接设备 2.外置扬声器 段数码管
-4
- 好好学习,天天向上
灯一个 5.计算机
四、 功能模块
一、音乐数据ROM模块:
该模块为音乐乐谱的寄存文件。其利用LPM_ROM宏模块将共设定512个音符,每一个音符宽度为5位,可寄存高、中、低三阶21个音符的数据。文件名为.
其中[0..127]寄存第一首歌《挥着翅膀的女孩》, [127..255]寄存第二首歌《菊花台》, [256..383]寄存第三首歌《两只老虎》,
[384..512]寄存第四首歌《世上只有妈妈好》,
在该数据中,每一个字符持续时间为秒(由音符控制输出模块的时钟源4HZ信号肯定),故在按照乐谱中音符的实际持续时间进行编写。如四四拍的则每拍时间为秒,则此处对应数据应该持续两个字符。 MIF文件内容如下:
WIDTH=5; DEPTH=512;
-5
- 好好学习,天天向上
-6
- 好好学习,天天向上
音乐数据ROM模块不生成模块,通过定制LPM_ROM,以备下一个模块的利用。
二、音符控制输出模块NOTETABS:
该模块利用已定制完成的文件,通过给出LPM_ROM的数据地址,使LPM_ROM输出对应的音符,再送入音符译码电路,最终演奏出编好的音乐。
VHDL语句描述如下: library ieee;
use notetabs is
port(clk1:in std_logic;
toneindex:out std_logic_vector(4 downto 0)); end;
architecture one of notetabs is component music
port(address:in std_logic_vector(8 downto 0); clock:in std_logic;
q:out std_logic_vector(4 downto 0)); end component;
signal counter:std_logic_vector(8 downto 0); begin
cnt8:process(clk1,counter) begin
-7
- 好好学习,天天向上
if counter=512then counter<=\"000000000\"; elsif(clk1'event and clk1='1')then counter<=counter+1; end if; end process; u1:music
port map(address=>counter,q=>toneindex,clock=>clk1); end;
其生成项目符号为:
该模块时序仿真图如下:
时序仿真说明:按照时序图可看出,当输入clock1时,toneindex也相应的改变,即完成在同一ROM内寄存多首歌曲。
3、音符译码电路TONETABS模块:
该模块将NOTETABS模块输出的音符译成输出电路的数控分频所需要预置数,并将对应的简谱数字用数码管显示出来,同时按照输出的音符,判断其高、中、低特性,并通过一个LED灯将高音显示出来。其所输出的预置数由最后一级的数控频器所决定,参考值如下表:
分频音阶 频率 频率设定数 预置数 数 低7 415 21 00111 低6 370 2745 00110 低5 329 2576 00101 -8
- 好好学习,天天向上
低4 低3 低2 低1 中7 中6 中5 中4 中3 中2 中1 高7 高6 高5 高4 高3 高2 高1 0音 293 277 246 220 830 740 659 587 5 493 440 1661 1479 1318 1174 1108 987 880 0 2390 2291 2063 1823 3494 3420 3337 3244 3193 3082 2960 3795 3758 3717 3670 35 35 3528 4095 00100 00011 00010 0 00001 01110 01101 01100 01011 01010 01001 01000 10101 10100 10011 10010 10001 10000 01111 00000 其计算公式如下:由于所设计的数控分频计采用12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数转变的脉冲信号。由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声,故最终输出信号的频率与预置数的关系如下:
10x4096()fm2其中f
6m为音阶对应的频率。
模块VHDL语句描述如下: library ieee;
use ToneTaba is
port( Index : in std_logic_vector(4 downto 0);
CODE : out std_logic_vector(3 downto 0); HIGH : out std_logic;
Tone : out std_logic_vector(11 downto 0)); end;
architecture one of ToneTaba is begin
Search: process(Index)
-9
- 好好学习,天天向上
begin
case Index is
When \"00000\"=>tone<=\"\";code<=\"0000\";high<='0';--4095 When \"00001\"=>tone<=\"0\";code<=\"0001\";high<='0';--14 When \"00010\"=>tone<=\"0\";code<=\"0010\";high<='0';--1822 When \"00011\"=>tone<=\"\";code<=\"0011\";high<='0';--2070 When \"00100\"=>tone<=\"\";code<=\"0100\";high<='0';--2184 When \"00101\"=>tone<=\"\";code<=\"0101\";high<='0';--2393 When \"00110\"=>tone<=\"\";code<=\"0110\";high<='0';--2578 When \"00111\"=>tone<=\"\";code<=\"0111\";high<='0';--2663 When \"01000\"=>tone<=\"\";code<=\"0001\";high<='1';--2820 When \"01001\"=>tone<=\"\";code<=\"0010\";high<='1';--2959 When \"01010\"=>tone<=\"\";code<=\"0011\";high<='1';--3081 When \"01011\"=>tone<=\"\";code<=\"0100\";high<='1';--3140 When \"01100\"=>tone<=\"\";code<=\"0101\";high<='1';--3244 When \"01101\"=>tone<=\"\";code<=\"0110\";high<='1';--3337 When \"01110\"=>tone<=\"\";code<=\"0001\";high<='1';--3379 When \"01111\"=>tone<=\"\";code<=\"0010\";high<='1';--3457 When \"10000\"=>tone<=\"\";code<=\"0010\";high<='1';--3527 When \"10001\"=>tone<=\"\";code<=\"0010\";high<='1';--35 When \"10010\"=>tone<=\"\";code<=\"0010\";high<='1';--3617 When \"10011\"=>tone<=\"\";code<=\"0010\";high<='1';--3669 When \"10100\"=>tone<=\"\";code<=\"0010\";high<='1';--3716 When \"10101\"=>tone<=\"\";code<=\"0010\";high<='1';--3737 When \"10110\"=>tone<=\"\";code<=\"0010\";high<='1';--3776 When \"10111\"=>tone<=\"\";code<=\"0010\";high<='1';--3811 When \"11000\"=>tone<=\"\";code<=\"0010\";high<='1';--3842 When \"11001\"=>tone<=\"\";code<=\"0010\";high<='1';--3856 When \"11010\"=>tone<=\"\";code<=\"0010\";high<='1';--3882 When \"11011\"=>tone<=\"\";code<=\"0010\";high<='1';--3905 When \"11100\"=>tone<=\"\";code<=\"0010\";high<='1';--3916 When others => null; end case; end process; end;
其生成项目符号为:
-10
- 好好学习,天天向上
该模块时序仿真图如下:
时序仿真说明:将NOTETABS模块输出的音符译成输出电路的数控分频所需要预置数,并将高音输出。
4、数控分频器计输出模块SPEAKERA:
该模块主体为一个12位的可预置数计数器。其通过NOTETABS取得预置数,并对些进行计数。当计满时便给出一个溢出信号。再对此溢出信号进行二分频取得能驱动蜂鸣器且频率符合C大调的21个音阶的频率。由此发出不同信号。
其VHDL语言描述如下: library ieee;
use speakera is port(clk:in std_logic;
tone:in std_logic_vector(11 downto 0); spks:out std_logic); end;
architecture one of speakera is
signal preclk,fullspks:std_logic; begin
divideclk:process(clk)--对12MHZ时钟源进行12分频,输出1MHZ的脉冲信号。 variable count4:std_logic_vector(3 downto 0); begin
preclk<='0';
if count4>11 then preclk<='1';count4:=\"0000\"; elsif clk'event and clk='1' then count4:=count4+1; end if;
end process;
genspks:process(preclk,tone)--12位预置数数控分频器
-11
- 好好学习,天天向上
variable count11:std_logic_vector(11 downto 0); begin
if preclk'event and preclk='1' then
if count11=\"\"then count11:=tone; fullspks<='1'; else count11:=count11+1;fullspks<='0';end if; end if; end process;
delayspks:process(fullspks)--2分频,蜂鸣器推动电路。 variable count2 :std_logic; begin
if fullspks'event and fullspks ='1' then count2:=not count2; if count2='1' then spks<='1'; else spks<='0';end if; end if; end process; end;
其生成项目符号为:
该模块时序仿真图如下:
时序仿真说明:按照预置数的不同,其输出的频率也有规律性的转变。 五、分频器模块div_clk:
该模块主如果把从实验箱接入的50MHZ的频率进行分频,取得12MHZ的脉冲,以备后面的模块利用
模块VHDL语句描述如下:
-12
- 好好学习,天天向上
LIBRARY ieee; use div_clk IS
PORT(clk_in : IN std_logic; div_out: OUT std_logic); END div_clk;
ARCHITECTURE a OF div_clk IS SIGNAL fre_N : integer range 0 to 2; SIGNAL clk_tmp: std_logic; BEGIN
div_out <= clk_tmp; process(clk_in) begin
if falling_edge(clk_in) then if fre_N >= 1 then fre_N <= 0; clk_tmp <= not clk_tmp; else fre_N <= fre_N + 1; end if; end if; end process; END a;
其生成项目符号为:
该模块时序仿真图如下:
时序仿真说明:将50MHZ分成12MHZ的脉冲
-13
- 好好学习,天天向上
六、译码模块deled
该模块将歌曲对应的简谱通过七段数码管显示。 模块VHDL语句描述如下: library ieee;
use deled is
port(num:in std_logic_vector(3 downto 0); led:out std_logic_vector(6 downto 0)); end deled;
architecture fun of deled is
--signal count:std_logic_vector(2 downto 0); begin
led<=\"1111110\" when num=\"0000\" else \"0110000\" when num=\"0001\" else \"1101101\" when num=\"0010\" else \"1111001\" when num=\"0011\" else \"0110011\" when num=\"0100\" else \"1011011\" when num=\"0101\" else \"1011111\" when num=\"0110\" else \"1110000\" when num=\"0111\" else \"1111111\" when num=\"1000\" else \"1111011\" when num=\"1001\" else \"1110111\" when num=\"1010\" else \"0011111\" when num=\"1011\" else \"1001110\" when num=\"1100\" else \"0111101\" when num=\"1101\" else \"1001111\" when num=\"1110\" else \"1000111\" when num=\"1111\" ; end fun;
其生成项目符号为:
该模块时序仿真图如下:
-14
- 好好学习,天天向上
时序仿真说明:对应的简谱转变时,数码管显示相应的发生转变,显示相应的简谱。
五、 整体设计电路图:
一、整体电路原理图
2、管脚分派图
-15
- 好好学习,天天向上
3、电路仿真结果
时序仿真说明:当输入clk信号后,程序运行,数码管显示相应的简谱,扬声器播放歌曲,当输出为高音时,LED灯亮。
4、硬件验证
【1】IO3接in_clock 【2】IO5接扬声器 【3】IO9接LED灯
-16
- 好好学习,天天向上
下载完成后,扬声器即发作声音,演奏出乐曲,同时数码管显示相应的简谱,当输出为高音是,IO9连接的LED灯亮。
六、设计心得
通过两周的尽力,终于完成了这次课程设计。这次课程设计主要参考了教材中基于FPGA的硬件演奏电路的设计,并按照课题要求,对其进行加工与改良,并最达到课题的要求,使其在QUARTUSП上选用目标芯片仿真实现了音乐硬件演奏电路的功能。实践证明:采用FPGA设计实现音乐硬件演奏电路的可行性和靠得住性,而且更改乐曲容易,可按照需要修改ROM中的音符数据文件,从而使电路实现任一曲子的播放。
这种基于FPGA的音乐硬件演奏电路的设计与实现,不仅通过VHDL层次化和模块化设计方式,同时采用数控分频和定制LPM-ROM的设计思想,更好的优化了乐曲演奏数字电路的设计,在此基础上没必要转变顶层文件架构可随意变更乐曲,有效缩短了产品开发周期、减少了设计芯片的数量、降低了功耗、提高了设计的灵活性、靠得住性和可扩展性。
-17
- 好好学习,天天向上
在课程设计开始之前,我就普遍查找关于此类的文档或其他相关的资料,一开始的时候当查找到这些相关的资料以后就以为万事大吉了,只有将相关的程序复制下,再以前做实验那样,保留、成立项目工程、运行程序、成立顶层模块等等类型的就好了,感觉很简单。
可是当真的操作起来就发现碰到了许多的困难,首先填写MUSIC文件表格里的512个数字就很累,不过这只是体力活,不是很伤脑筋,可是那个刚弄完了以后我却又碰到了问题,不能不求助老师。在做课程设计的时候发现很多看似很简单的事情,只要错了一点点这个程序也无法运行,但当做出来了功效,看到了顶层模块的仿真图形以后我一种无法形容的喜悦,增强了自己做好它的自信心。
通过这次实验,我也学习到了如何利用可编程逻辑设计器件进行设计,并学习了宏模块的设计与应用的基础。并能够在LPM_ROM中写入自己需要的数据。得用该ROM模块,还可进行函数信号发生器等电路功能的实现。
在计算C大调频率对应的预置数进程,应用了单片机按时器的相关知识进行理解并加以计算,并得出了可直接计算的功能。但这些计算也需要对应正确的电路,才可最终例蜂鸣器发出正确的频率。在设计选择歌曲的功能时,考虑到需要面一块ROM中写入多首歌的数据,则在选择时,即应给出每首歌正确的地址。由此想到了在微机芯片中,RAM的数据采用段基址加变址的实现方式。由此设计出在同一ROM中,同时寄存多首歌。
在分频计的设计进程中,由于经验不足,未意识到,分频计在溢出后输出的仅为一单脉冲波,该脉冲波不足以驱动蜂鸣器,故需要再加一分频电路,拓宽信号的脉冲,使其拥有驱动蜂鸣器的能力
在向ROM中填写音乐文件数据时,应当首选了解乐谱中每一个音符的持续时间。再按照程序中设定好的节拍速度,适当修改乐谱,使音乐的演奏能够连贯,并非失真。
这次的课程设计不单是做出一个硬件演奏乐曲电路出来,更重要的是锻炼自己学习的能力。回顾这次课程设计,从书籍,网络不断的寻觅到设计电路,从拿到题目到完成整个设计,从理论到实践,可以学到很多很多的的东西。对讲义知识的进一步加深的同时学到了很多在书本上没有学到过的知识。能够自
-18
- 好好学习,天天向上
己学习QUARTUSⅡ的新功能,或结合其他电路仿真设计电路一同设计。。同时,可以利用网上的资源,查找相关资料,以帮忙自己完成电路的设计。
通过这次课程设计使我知道了理论与实际相结合是很重要的,只有理论知识是远远不够的。把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和思考的能力。在设计的进程不免会碰到过各类各样的问题,同时在设计的进程中发现了自己的不足的地方,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计以后,必然把以前所学过的知识从头温故。
七、附录
歌曲简谱图
-19
- 好好学习,天天向上
-20
- 好好学习,天天向上
-21
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务