乐曲自动演奏器
- 格式:doc
- 大小:100.50 KB
- 文档页数:12
stm32f103通用定时器pwm应用例程--蜂鸣器演奏乐曲STM32F103通用定时器PWM应用例程:蜂鸣器演奏乐曲一(说明:本例程是将流明LM3SLib_Timer.pdf文档中的例程9及例程10(PWM应用:蜂鸣器演奏乐曲),移植到STM32F103上。
二(流明LM3SLib_Timer.pdf例程9及例程10的拷贝:例程9( Timer PWM应用:蜂鸣器发声如图1.1所示,为EasyARM1138开发板上的蜂鸣器驱动电路。
蜂鸣器类型是交流蜂鸣器,也称无源蜂鸣器,需要输入一列方波才能鸣响,发声频率等于驱动方波的频率。
图1.1 蜂鸣器驱动电路程序清单1.9是Timer模块16位PWM模式的一个应用,可以驱动交流蜂鸣器发声,运行后蜂鸣器以不同的频率叫两声。
其中"buzzer.h"和"buzzer.c"是蜂鸣器的驱动程序,仅有3个驱动函数,用起来很简捷。
程序清单1.9 Timer PWM应用:蜂鸣器发声文件:main.c#include "systemInit.h"#include "buzzer.h"// 主函数(程序入口)int main(void) {jtagWait(); // 防止JTAG失效,重要~clockInit(); // 时钟初始化:晶振,6MHzbuzzerInit(); // 蜂鸣器初始化buzzerSound(1500); // 蜂鸣器发出1500Hz声音SysCtlDelay(400* (TheSysClock / 3000)); // 延时约400ms buzzerSound(2000); // 蜂鸣器发出2000Hz声音SysCtlDelay(800* (TheSysClock / 3000)); // 延时约800ms buzzerQuiet( ); // 蜂鸣器静音for (;;) {}}文件:buzzer.h#ifndef __BUZZER_H__#define __BUZZER_H__// 蜂鸣器初始化extern void buzzerInit(void);// 蜂鸣器发出指定频率的声音extern void buzzerSound(unsigned short usFreq); // 蜂鸣器停止发声extern void buzzerQuiet(void);1#endif // __BUZZER_H__文件:buzzer.c#include "buzzer.h"#include <hw_types.h>#include <hw_memmap.h> #include <sysctl.h>#include <gpio.h>#include <timer.h>#define PART_LM3S1138#include <pin_map.h> #define SysCtlPeriEnable SysCtlPeripheralEnable #define GPIOPinTypeOut GPIOPinTypeGPIOOutput// 声明全局的系统时钟变量extern unsigned long TheSysClock;// 蜂鸣器初始化void buzzerInit(void){SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1); // 使能TIMER1模块SysCtlPeriEnable(CCP3_PERIPH); // 使能CCP3所在的GPIO端口GPIOPinTypeTimer(CCP3_PORT, CCP3_PIN); // 设置相关管脚为Timer功能TimerConfigure(TIMER1_BASE, TIMER_CFG_16_BIT_PAIR | // 配置TimerB为16位PWM TIMER_CFG_B_PWM); }// 蜂鸣器发出指定频率的声音// usFreq是发声频率,取值 (系统时钟/65536)+1 , 20000,单位:Hz void buzzerSound(unsigned short usFreq) {unsigned long ulVal;if ((usFreq <= TheSysClock / 65536UL) || (usFreq > 20000)) {buzzerQuiet( );}else {GPIOPinTypeTimer(CCP3_PORT, CCP3_PIN); // 设置相关管脚为Timer功能ulVal = TheSysClock / usFreq;TimerLoadSet(TIMER1_BASE, TIMER_B, ulVal); // 设置TimerB初值TimerMatchSet(TIMER1_BASE, TIMER_B, ulVal / 2); // 设置TimerB匹配值TimerEnable(TIMER1_BASE, TIMER_B); // 使能TimerB计数 }}// 蜂鸣器停止发声void buzzerQuiet(void){TimerDisable(TIMER1_BASE, TIMER_B); // 禁止TimerB计数GPIOPinTypeOut(CCP3_PORT, CCP3_PIN); // 配置CCP3管脚为GPIO输出GPIOPinWrite(CCP3_PORT, CCP3_PIN, 0x00); // 使CCP3管脚输出低电平 } 例程10(Timer PWM应用:蜂鸣器演奏乐曲程序清单1.10是Timer模块16位PWM模式的一个应用,能驱动交流蜂鸣器演奏一首动听的乐曲《化蝶》(乐谱参见图1.2)。
电子课程设计——乐曲硬件演奏电路设计学院太原科技大学华科学院专业、班级电子信息工程姓名学号指导教师2011年12月目录一、设计任务与要求 (3)二、总框体图 (3)三、选择器件 (4)四、功能模块 (4)一、音乐数据模块 (4)二、音符控制输出模块 (7)3、音符译码模块 (8)4、数控分频器模块 (11)五、分频器模块 (12)六、译码模块 (13)五、整体设计电路图 (15)一、整体电路原理图……………………………15二、管脚分派图……………………………153、电路仿真结果 (15)4、硬件验证 (16)六、设计心得 (17)七、附录 (19)乐曲硬件演奏电路设计一、设计任务与要求:一、实验内容利用可编程逻辑器件FPGA,设计乐曲硬件演奏电路,可自动演奏乐曲。
二、实验要求(1)利用数控分频器设计硬件乐曲演奏电路。
(2)利用给定的音符数据定制ROM“music”。
(3)设计乘法器逻辑框图,并在QuartusII上完成全部设计。
(4)将音乐通过实验箱上的喇叭播放出来。
(5)与演奏发音相对应的简谱码输出在数码管上显示。
二、整体框图设计思路:C调音阶频率表:同的预置数即可发出不同频率的声音。
由此,可以以此为设计基础。
设计一功能模块,能够将乐曲中的音符一一以对应的频率以预置数的形式置入数控分频计中,即可利用该数控分频计产生不同的声音,演奏出设定好的音乐。
ROM 中的音乐数据文件刚可由编辑好的音符填入MIF 文件中再定制LPM_ROM 将音符数据加载入ROM 中,并设计程序在运行时自动读取ROM 中的文件并置入数控分频器中。
当采用四四拍曲子时,每节拍持续时间为秒。
置入数控分频器的速度也应与此同步或一致,避免音乐过快或过快慢而失真。
由已知的C 调音阶频率表,各频率对应的预置数就与数控分频推动蜂鸣器发作声音的频率对应。
在编写数控分频器时,不仅要考虑预置数的输入方式,还要考虑输入的速度,和驱动蜂鸣器发声的频率。
EDA课程设计题目:乐曲硬件演奏电路的VHDL设计专业:通信工程班级:通信082姓名:***学号:**********一、 设计题目:乐曲硬件演奏电路的VHDL 设计二、 设计目标:1)能够播放“梁祝”乐曲。
2)能够通过LED 显示音阶。
3)具有“播放/停止”功能,并在此基础上实现“按键演奏”的电子琴功能。
三、 设计原理:1. 音乐基础知识一段简单乐谱由音调和节拍组成,音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。
音符的节拍我们可以举例来说明。
在一张乐谱中,我们经常会看到这样的表达式,如1=C 44、1=G 43…… 等等。
以43为例加以说明,它表示乐谱中以四分音符为节拍,每一小结有三拍。
比如:图1其中1 、2 为一拍,3、4、5为一拍,6为一拍共三拍。
1 、2的时长为四分音符的一半,即为八分音符长,3、4的时长为八分音符的一半,即为十六分音符长,5的时长为四分音符的一半,即为八分音符长,6的时长为四分音符长。
那么一拍到底该唱多长呢?一般说来,如果乐曲没有特殊说明,一拍的时长大约为400—500ms 。
我们以一拍的时长为400ms为例,则当以四分音符为节拍时,四分音符的时长就为400ms,八分音符的时长就为200ms,十六分音符的时长就为100ms。
2.原理图框图:图2.框图3.原理图说明音乐播放原理说明音符的频率由数控分频器模块Speakera产生。
ToneTaba模块从NoteTabs模块中输入的音符数据,将对应的分频预置数据传送给Speakera模块,并将音符数据送到LED模块显示音阶。
NoteTabs模块中包含有一个音符数据ROM,里面存有歌曲“梁祝”的全部音调,在此模块中设置了一个8位二进制计数器,作为音符数据ROM的地址发生器。
这个计数器的计数频率为4Hz,即每一个数值的停留时间为0.25秒。
例如:“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒钟时间,所对应的“3”音符分频预置数为1036,在Speakera的输入端停留了1秒。
验十硬件乐曲自动演奏电路设计1、实验目地:学习利用数控分频器设计硬件电子琴实验.实验仪器:PC机,操作系统为Windows2000/xp,Quartus II 5.1 设计平台,GW48系列SOPE/EDA实验开发系统.3、实验原理:本设计乐曲选取《梁祝》中化蝶部分,其简谱如图1所示.图1 《梁祝》中化蝶部分简谱组成乐曲地每个音符地发音频率值及其持续地时间是乐曲能连续演奏所需地2个基本要素,首先让我们来了解音符与频率地关系.乐曲地12平均率规定:每2个八度音(如简谱中地中音1与高音1)之间地频率相差1倍.在2个八度音之间,又可分为12个半音,每2个半音地频率比为.另外,音符A(简谱中地低音6)地频率为440Hz,音符B到C之间、E到F之间为半音,其余为全音.由此可以计算出简谱中从低音1至高音1之间每个音符地频率,如表1所示.表1 简谱中音符与频率地关系主系统由4个模块组成;例1-1是顶层设计文件,其内部有三个功能模块(如图2所示):Tone.VHD(例1-2)和Speaker.VHD(例1-3)及Notetabs.VHD(例1-4).模块TONE是音阶发生器,当4位发声控制输入INDEX中某一位为高电平时,则对应某一音阶地数值将从端口TONE输出,作为获得该音阶地分频预置值;同时由CODE输出对应该音阶简谱地显示数码,如‘5’,并由HIGH输出指示音阶高8度显示.由例6-28可见,其语句结构只是类似与真值表地纯组合电路描述,其中地音阶分频预置值,如Tone <= 1290是根据产生该音阶频率所对应地分频比获得地.图2 硬件电子琴电路结构模块SPEAKER中地主要电路是一个数控分频器,它由一个初值可预置地加法计数器构成,当模块SPEAKER由端口TONE获得一个2进制数后,将以此值为计数器地预置数,对端口CLK12MHZ输入地频率进行分频,之后由SPKOUT向扬声器输出发声.模块NOTETABS,用于产生节拍控制(INDEX数据存留时间)和音阶选择信号,即在NOTETABS模块放置一个乐曲曲谱真值表,由一个计数器地计数值来控制此真值表地输出,而由此计数器地计数时钟信号作为乐曲节拍控制信号,从而可以设计出一个纯硬件地乐曲自动演奏电路.试完成此项设计,并在EDA实验系统上地FPGA目标器件中实现之.5、实验内容:编译适配以上4个示例文件,给出仿真波形,最后进行下载和硬件测试实验.建议使用实验电路模式“3”(附图2-5),用短路帽选择“CLOCK9”地输入频率选择12MHz,此信号作为系统输入信号CLK12MHZ;CLK8HZ与clock2相接,接受4Hz频率;键8至键1 作为INDEX输入信号控制各音阶;选择数码管1显示琴音简谱码,发光管D1显示高8度.6、思考题1:例1-3中地进程DelaySpkS对扬声器发声有什么影响?7、思考题2:电路上应该满足哪些条件,才能用数字器件直接输出地方波驱动扬声器发声?8、实验报告:用仿真波形和电路原理图,详细叙述硬件电子琴地工作原理及其4个VHDL 文件中相关语句地功能,叙述硬件实验情况..附录;【例10-1】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY TOP IS -- 顶层设计PORT ( CLK12MHZ : IN STD_LOGIC;CLK8HZ : IN STD_LOGIC;CODE1 : OUTINTEGERRANGE 0 TO 15;HIGH1,SPKOUT : OUT STD_LOGIC);END;ARCHITECTURE one OF TOP ISCOMPONENT TonePORT ( Index : IN INTEGERRANGE 0 TO 15;CODE : OUTINTEGERRANGE 0 TO 15;HIGH : OUT STD_LOGIC;Tone : OUT INTEGER RANGE 0 TO 16#7FF# ); --11位2进制数 END COMPONENT;COMPONENT SpeakerPORT ( clk : IN STD_LOGIC;Tone1 : IN INTEGER RANGE 0 TO 16#7FF#; --11位2进制数 SpkS : OUT STD_LOGIC );END COMPONENT;component NotetabsPort ( clk :in std_logic;index0 : out INTEGERRANGE 0 TO 15);end component;SIGNAL Tone2 : INTEGERRANGE0 TO 16#7FF#;SIGNAL Indx: INTEGERRANGE 0 TO 15;BEGIN -- 安装U1, U2, U3u1 : Tone PORT MAP (Index=>Indx, Tone=>Tone2,CODE=>CODE1,HIGH=>HIGH1); u2 : Speaker PORT MAP (clk=>CLK12MHZ,Tone1=>Tone2, SpkS=>SPKOUT );u3 : Notetabs PORT MAP(clk=>CLK8HZ,Index0=>Indx);END;【例10-2】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY Tone ISPORT ( Index : IN INTEGERRANGE 0 TO 15;CODE : OUTINTEGERRANGE 0 TO 15;HIGH : OUT STD_LOGIC;Tone : OUTINTEGERRANGE0 TO 16#7FF# );END;ARCHITECTURE one OF Tone ISBEGINSearch : PROCESS(Index)BEGINCASE Index IS -- 译码电路,查表方式,控制音调地预置数 WHEN 0=>Tone <= 2047; CODE <= 0; HIGH <= '0';WHEN 1=>Tone <= 773; CODE <= 1; HIGH <= '0';WHEN 2=>Tone <= 912; CODE <= 2; HIGH <= '0';WHEN 3=>Tone <= 1036; CODE <= 3; HIGH <= '0';WHEN 5=>Tone <= 1197; CODE <= 5; HIGH <= '0';WHEN 6=>Tone <= 1290; CODE <= 6; HIGH <= '0';WHEN 7=>Tone <= 1372; CODE <= 7; HIGH <= '0';WHEN 8=>Tone <= 1410; CODE <= 1; HIGH <= '1';WHEN 9=>Tone <= 1480; CODE <= 2; HIGH <= '1';WHEN 10=>Tone <= 1542; CODE <= 3; HIGH <= '1';WHEN 12=>Tone <= 1622; CODE <= 5; HIGH <= '1';WHEN 13=>Tone <=1668; CODE <= 6; HIGH <= '1';WHEN 15=>Tone <= 1728; CODE <= 1; HIGH <= '1';WHEN OTHERS =>NULL;END CASE;END PROCESS;END;【例10-3】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY Speaker ISPORT ( clk : IN STD_LOGIC;Tone1 : IN INTEGER RANGE 0 TO 16#7FF#;SpkS : OUT STD_LOGIC );END;ARCHITECTURE one OF Speaker ISSIGNAL PreCLK , FullSpkS : STD_LOGIC;BEGINDivideCLK : PROCESS(clk) -- 将CLK进 11分频,PreCLK为C L 11K 6分频VARIABLE Count4 : INTEGERRANGE 0 TO 15;BEGINPreCLK <= '0';IF Count4 > 11 THEN PreCLK <= '1'; Count4 := 0;ELSIF clk'EVENT AND clk='1' THEN Count4 := Count4 + 1;END IF;END PROCESS;GenSpkS : PROCESS(PreCLK, Tone1)VARIABLE Count11 : INTEGERRANGE0 TO 16#7FF#;BEGIN -- 11位可预置计数器IF PreCLK'EVENT AND PreCLK = '1' THENIF Count11=16#7FF# THEN Count11 := Tone1; FullSpkS <= '1'; ELSE Count11:=Count11 + 1; FullSpkS <= '0';END IF;END IF;END PROCESS;DelaySpkS : PROCESS(FullSpkS)VARIABLE Count2 : STD_LOGIC;BEGINIF 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;【例10-4】library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity Notetabs isPort ( clk: in std_logic; --系统时钟;键盘输入/自动演奏 index0 : out INTEGER RANGE 0 TO 15); --音符信号输出end NOTETABS;architecture Behavioral of Notetabs issignal count0:integer range 0 to 138;--changebeginmusic:process(clk) --此进程完成自动演奏部分曲地地址累加beginif clk'event and clk='1' thenif count0=138 then count0<=0;else count0<=count0+1;end if;end if;end process;com1:process(count0)begincase count0 is --此case语句:存储自动演奏部分地曲when 00 =>index0<=3;when 01 =>index0<=3;when 02 =>index0<=3;when 03 =>index0<=3;when 04 =>index0<=5;when 05 =>index0<=5;when 06 =>index0<=3;when 07 =>index0<=6;when 08 =>index0<=8;when 09 =>index0<=8;when 10 =>index0<=8;when 11 =>index0<=9;when 12 =>index0<=6;when 13 =>index0<=8;when 14 =>index0<=5;when 15 =>index0<=5;when 16 =>index0<=12;when 17 =>index0<=12;when 18 =>index0<=12;when 19 =>index0<=15;when 20 =>index0<=13;when 21 =>index0<=12;when 22 =>index0<=10;when 23 =>index0<=12;when 25 =>index0<=9; when 26 =>index0<=9; when 27 =>index0<=9; when 28 =>index0<=9; when 29 =>index0<=9; when 30 =>index0<=9; when 31 =>index0<=0; when 32 =>index0<=9; when 33 =>index0<=9; when 34 =>index0<=9; when 35 =>index0<=10; when 36 =>index0<=7; when 37 =>index0<=7; when 38 =>index0<=6; when 39 =>index0<=6; when 40 =>index0<=5; when 41 =>index0<=5; when 42 =>index0<=5; when 43 =>index0<=6; when 44 =>index0<=8; when 45 =>index0<=8; when 46 =>index0<=9; when 47 =>index0<=9; when 48 =>index0<=3; when 49 =>index0<=3; when 50 =>index0<=8; when 51 =>index0<=8; when 52 =>index0<=6; when 53 =>index0<=5; when 54 =>index0<=6; when 55 =>index0<=8; when 56 =>index0<=5; when 57 =>index0<=5; when 58 =>index0<=5; when 59 =>index0<=5; when 60 =>index0<=5; when 61 =>index0<=5; when 62 =>index0<=5; when 63 =>index0<=5; when 64 =>index0<=10; when 65 =>index0<=10; when 66 =>index0<=10; when 67 =>index0<=12;when 69 =>index0<=7; when 70 =>index0<=9; when 71 =>index0<=9; when 72 =>index0<=6; when 73 =>index0<=8; when 74 =>index0<=5; when 75 =>index0<=5; when 76 =>index0<=5; when 77 =>index0<=5; when 78 =>index0<=5; when 79 =>index0<=5; when 80 =>index0<=3; when 81 =>index0<=5; when 82 =>index0<=3; when 83 =>index0<=3; when 84 =>index0<=5; when 85 =>index0<=6; when 86 =>index0<=7; when 87 =>index0<=9; when 88 =>index0<=6; when 89 =>index0<=6; when 90 =>index0<=6; when 91 =>index0<=6; when 92 =>index0<=6; when 93 =>index0<=6; when 94 =>index0<=5; when 95 =>index0<=6; when 96 =>index0<=8; when 97 =>index0<=8; when 98 =>index0<=8; when 99 =>index0<=9; when 100=>index0<=12; when 101=>index0<=12; when 102=>index0<=12; when 103=>index0<=10; when 104=>index0<=9; when 105=>index0<=9; when 106=>index0<=10; when 107=>index0<=9; when 108=>index0<=8; when 109=>index0<=8; when 110=>index0<=6; when 111=>index0<=5;when 113=>index0<=3;when 114=>index0<=3;when 115=>index0<=3;when 116=>index0<=8;when 117=>index0<=8;when 118=>index0<=8;when 119=>index0<=8;when 120=>index0<=6;when 121=>index0<=8;when 122=>index0<=6;when 123=>index0<=5;when 124=>index0<=3;when 125=>index0<=5;when 126=>index0<=6;when 127=>index0<=8;when 128=>index0<=5;when 129=>index0<=5;when 130=>index0<=5;when 131=>index0<=5;when 132=>index0<=5;when 133=>index0<=5;when 134=>index0<=5;when 135=>index0<=5;when 136=>index0<=0;when 137=>index0<=0;when 138=>index0<=0;when others => null;end case;end process;end Behavioral;版权申明本文部分内容,包括文字、图片、以及设计等在网上搜集整理.版权为个人所有This article includes some parts, including text, pictures, and design. Copyright is personal ownership.Zzz6Z。
BAND-IN-A-BOX0教程BAND-IN-A-BOX是一个老牌的自动配器软件,自从它出世以来,就给许多专业和业余的音乐人们带来了电脑智能配器的希望,虽然说它到现在为止还是有点死板,但相对于许多没有学过电声配器的爱好者的水平来说,它还是很完备很正规的。
这一版本比前作增加了一个更强大的功能,就是“独奏音乐家”的功能(SOLOIST),它可以自动生成一些不同风格的独奏旋律,尤其在爵士乐风格方面更为优秀。
它的基本使用方法就是由用户输入和弦,选择伴奏风格,然后PLAY,就这么简单,你就可以得到一首歌曲的完整编曲,我敢说比一些庸人做的卡拉OK伴奏要强得多。
不过,同样是做这些事,如果你能更多的掌握一些这个软件的用法,更多地发挥一些自己的创意,你可能做出来的音乐会听不出是自动配器软件做的,这就要你能在这个软件中多做一些变数,因为没有一个编曲家会反复使用一个单调的节奏型的。
使用这个软件的系统要求:Windows 95/98/NT/3.1, 16 mb memory, 386DX (or better)MIDI系统(MIDI接口/MIDI键盘/MIDI音源或声卡)第一步,我们要在BAND-IN-A-BOX(以下简称“BB”)中设定MIDI驱动器和各个输入输出接口,也就是设定用来发声的音源和用于输入的键盘。
如果没有键盘你就要去下载一个叫VPIANO的软件,这个软件可以用电脑键盘来虚拟MIDI键盘,就是没有力度感。
这个软件也可以在CAKEWALK8.0中找到。
在OPT菜单下选择第一项MIDI DRIVER SETUP,MIDI INPUT DRIVER中选择你的输入设备,比如MIDI接口的第一路输入端口,在MIDI OUTPUT DRIVER中选择你的输出设备也就是音源,比如你的声卡MPU-401,在SYNTHESIZER/SOUND CARD中选择你的音源的音色排序,一般最好是GM音源,如SC155等,因为GM乐器的音色排序是相同的,而基本上来自网上的MIDI文件都是GM文件,音色排序不一定和你的音源声卡名称一样,只要音色排列一样就可以用了,比如你的声卡是波表声卡,在音色排序中选择SC-155和SOUND BLASTER PRO是一样的,它们都是GM乐器。
郑州航空工业管理学院《EDA技术及应用》课程设计报告届通信工程专业班级题目:电子琴与自动演奏学号:姓名:同组人:指导老师:2013年07月07日1 课程设计要求硬件电子琴设计设计要求:(1)按下KEY1~KEY7 分别表示中音的DO、 RE 、 ME、 FA、 SOL、 LA、 SI.(2)按住KEY8同时按KEY1~KEY7 分别表示高音的DO、 RE 、 ME、 FA、SOL、 LA、 SI;(3)按下相应的键有对应LED灯指示;其他要求:(1)晶振为12 MHz.,采用CPLD 器件为ALTERA 的EPM7064AEL144-7N。
乐曲自动演奏机设计要求:(1)可以在电路上能自动演奏乐曲,在这里我们采用的是贝多芬的《欢乐颂》;(2)有相应的LED灯指示高低音;其他要求:(1)晶振为12 MHz;(2)采用CPLD 器件,为ALTERA 的EPM7064AEL144-7N。
硬件电子琴设计+乐曲自动演奏机最初我们选择的设计是电子琴,但是由于电子琴的设计较为基础,因此我们对电子琴的设计进行了改进,将其与乐曲自动演奏相结合,要求如下:设计要求:(1)按下KEY1—KEY7 分别表示中音的DO、 RE 、 ME、 FA、 SOL、 LA、SI;(2)对于电子琴,按下相应的键有对应LED灯指示;(3)可以在电路上能自动演奏乐曲,在这里我们采用的是贝多芬的《欢乐颂》,且有相应的LED灯指示高低音;(4)能实现电子琴和乐曲自动演奏功能的切换。
其他要求:(1)晶振为12 MHz;(2)采用CPLD 器件为ALTERA 的EPM7064AEL144-7N。
2 整体规划设计分析根据设计要求,由于乐曲自动演奏机和硬件电子琴的设计已经存在,我们对已有的设计进行修改,形成两个不同功能的模块,然后采用元件例化,拼接两个模块,同时附加一个选择功能模块,以实现乐曲自动演机和硬件电子琴两个功能。
硬件电子琴分析对于硬件电子琴,参考了实验时使用的程序,已经达到的要求有:(1)按下key1~key7 分别表示中音的DO、 RE 、 ME、 FA、 SOL、 LA、 S;(2)按下相应的键有对应LED灯指示。
北华航天工业学院课程设计报告(论文)设计课题:乐曲演奏电路的设计专业班级:学生姓名:指导教师:设计时间:北华航天工业学院电子工程系乐曲演奏电路的设计课程设计任务书指导教师:胡辉内容摘要本实验的设计原理是不同的音名对应不同的频率,设计的难点是准确的产生各音名对应的频率。
简谱音名与频率的关系各音名所对应的频率可由一频率较高的基准频率进行整数分频得到,所以实际中产生各音名频率为近似的整数值。
基准频率越高,近似程度越好,音准也越好,但同时分频系数会很大,耗费芯片资源也越多。
本实验选取fo=1MHZ的信号作为基准频率。
分频系数A及n的公式如下:分频系数A=fo÷音名频率分频系数n=分频系数A÷2分频系数n=fo÷音名频率÷2以中音1为例来说明:由fo=1MHZ产生中音1的523.25Hz,其中分频系数A=1000000÷523.25≈1911.13,取整数值为A=1911,此分频系数可由计数器实现。
但若不加处理语句,其分频后的523Hz信号不是对称方波,而占空比很小的方波将很难使扬声器有效的发出声音。
为了得到对称方波,可将分频系数A分解为:分频系数A=分频系数n×2。
即先进行分频系数n的分频,得到不对称方波,再2分频得到对称方波。
以A=1911分解为例,A=1911≈956×2。
即先对fo=1MHZ进行956分频,得到956×2Hz的不对称方波,然后再2分频得到523Hz的对称方波,送至扬声器可听到中音1的声音。
最后对各个模块嵌入VHDL语言,编译、调试即可。
索引关键词:音名与频率的关系可变分频器选择器编码器目录一概述 (1)二方案设计与论证 (2)三单元电路设计与参数计算 (2)四总原理图 (2)五安装与调试 (3)六性能测试与分析 (3)七结论 (3)八心得体会 (3)九参考文献 (4)一、概述(一)本实验的设计原理是不同的音名对应不同的频率,设计的难点是准确的产生各音名对应的频率。
乐曲自动演奏器
一、功能介绍
使用FPGA设计一个乐曲自动演奏控制器,将源程序下载至FPGA器件中,实现乐曲自动演奏。
(本设计的乐曲是《友谊天长地久》的部分音乐)
乐曲演奏的原理是:由于组成乐曲的每个音符的频率值(音调)及其持续时间(音长)是乐曲演奏的2个基本数据,因此需要控制输出到扬声器的激励信号的频率高低和该频率信号持续的时间。
频率的高低决定了音调的高低,而乐曲的简谱与各音名的频率之间也有固定的对应关系。
所有不同频率的信号都是从同一基准频率分频而得来的,由于音阶频率多为非整数,而分频系数又不能为小数,故必须将计算的到的分频数进行四舍五入取整,基准频率和分频系数应综合考虑加以选择,从而保证音乐不会走调。
如在4MHz时钟下,中音1(对
应的频率值为523.3Hz)的分频系数应该为:4000000/(2*523.3)=0xd3821,这样只需对系统时钟进行3821次分频即可得到所要的中音1。
至于其他音符,同样可求出对应的分频系数,这样利用程序可以很轻松地得到对应的乐声。
此外,在程序中设置了一个状态机,每250ms改变一个状态(即一个节拍),组成乐曲的每个音符的频率值(音调)相对应于状态机的每一个状态。
只要让状态机的状态按顺序转换,就可以自动播放音乐了。
《友谊天长地久》乐谱见下表(注:N一拍;N两拍;N﹒四拍;N﹒八拍;N为乐谱。
由于芯片存储容量太小,源程序只加入乐谱的一部分音符)
《友谊天长地久》乐谱
0 5. | 1. 1 1 3 | 2. 1 2 3 | 1. 1 3 5 | 6. 6 | 5. 3 3 1 | 2. 1 2
3 | 1. 6. 6 5
.. | 1. 6 | 5. 3 3 1 | 2. 1 2 6 | 5 . 3 3 5 | 6. 1 | 5.
3 3 1 | 2. 1 2 3 | 1. 6. 6 5
.. | 1. 0 ¶
简谱中的音名与频率的关系
二、硬件设计(电路图、原器件清单)
实物元件清单:
印刷电路板一个;
电阻(10KΩ的10个,200Ω的8个,1KΩ的14个,50Ω的1个);三极管3个;
发光二极管(红黄绿各三个);
蜂鸣器1个;
8段显示器2个;
按键4个;
4M晶振1个;
电容(104的6个,10μ的1个);电源线1个;
芯片底座1个;
电路图:
功率放大显示部分:
核心控制部分:
三、软件设计(流程图、源程序)
流程图
一个完整的EDA设计流程既是自顶向下设计方法的具体实施途径,也是EDA工具软件本身的组成结构。
其大致的设计流程包括:设计输入、综合、适配、时序仿真和功能仿真、编程下载、硬件测试的步骤。
对于目前流行的EDA工具软件,图1-1的设计流程具有一
般性[3]。
图1-1 应用FPGA/CPLD的EDA开发设计流程框图
各部分源程序及说明
module song(clk,beep); //模块名称song
//I/O口说明
input clk; //系统时钟4MHz
output beep; //蜂鸣器输出端
//内部寄存器
reg beep_r; //寄存器
reg[3:0] state; //乐谱状态机
reg[15:0]count,count_end;
reg[17:0]count1;
//参数--分频系数
parameter L_5=16'd5102, //低音5
L_6=16'd4545, //低音6
M_1=16'd3821, //中音1
M_2=16'd3405, //中音2
M_3=16'd3033, //中音3
M_5=16'd2551, //中音5
M_6=16'd2273, //中音6
H_1=16 'h1913; //高音6
parameter TIME=1000000; //控制每个音的长短(250ms)assign beep= beep_r; //输出音乐
//上升沿脉冲计数
always@(posedge clk)
begin
count<=count+1'b1; //计数器加1
if(count==count_end)
begin
count<=16'h0; //计数器取0
beep_r<=! beep_r; //输出取反end
end
//上升沿脉冲计数
always@(posedge clk)
begin
if(count1<TIME)
count1= count1+1'b1;
else
begin
count1=18'd0;
if(state==4'd15)
state= 4'd0;
else
state= state+1'b1;
case(state)
4'd0, 4'd1: count_end=L_5;
4'd2, 4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8 : count_end=M_1;
4'd9, 4'd10: count_end=M_3;
4'd11, 4'd12, 4'd13, 4'd14: count_end=M_2;
4'd15: count_end=M_1;
default:count_end=16'hffff;
endcase
end
end
Endmodule
引脚锁定方法
四、设计总结
经过我们一组人的共同努力,我们的课程设计完成。
在此期间,我们收获颇丰。
首先这是既制作收音机后的又一次焊接印刷电路板的机会,利于提高我们的对器件的辨别、理解能力,还有自己的动手能力。
焊好电路板后,我觉得挺麻烦的就是程序的调试。
刚开始的调试是在实验室的试验箱上,一切运行正常,但转到我们需要用的芯片上就不能出现我们想要的结果。
后来又查资料,了解到芯片的时钟的频率不同,然
后我们就开始转换频率再计算,同时把原来的程序根据要求的频率进行修改,但还是不能显示出流畅的音乐。
最后,当我们想放弃这个设计换其他程序设计的时候,我们想起可能是蜂鸣器本身的问题。
然后,我们找到以前制作收音机的喇叭,接上后效果还是挺明显的,听到音乐的那一刻确实挺有成功感。
其次,也是对EDA这门课的深入理解与应用。
如果说刚开始我还不知道EDA是干嘛的,但现在我可以说写一下简单的程序,看懂一些复杂的程序,然后就是提高了对QuartusⅡ操作能力。
当然,通过这次课程设计,还是发现自己的很多不足。
由于当初EDA课程学得不是太好,导致刚开始操作时经常会遇到或大或小的问题,而且这次做的设计我觉得是老师要求里的比较简单的一个,还花费了这么长时间,也说明自己的能力不是太好。
事实证明:要想真正掌握这门课还需要再花费一些精力。