北邮数电实验电子琴
北邮,单片机,实验报告,电子琴
北邮,单片机,实验报告,电子琴北邮单片机实验报告简易电子琴2014年小学期单片机设计实验报告题目:基于单片机的电子音乐发生器班级:班内序号:实验组号:学生姓名:指导教师:基于单片机的电子音乐发生器实验摘要此次本组制作的基于PIC单片机的电子音乐发生器是具有LCD显示屏提示的音乐简单演奏、播放、存储等功能的演示作品,拥有以下4种功能:1.按键演奏:即“电子琴”功能,可以用键盘上的“1”到“A”键演奏从低音sol到高音do等11个音;2.点歌功能:即按动“B”“C”键分别演奏两首乐曲(可以表现准确的音高和音长)。
3.存储音乐功能:即按右下角“F存储”键,然后按键演奏并存储,随后按“E”键结束,之后按“D键”就可以播放存储的乐曲了;4.液晶显示功能:即在开始时显示“hello!”,在点播时分别显示“song b”、“song c”,在存储时显示“saving”。
电子音乐发生器采用以Microchip公司的PIC16F877芯片为核心的简单控制系统,外部电路连接有喇叭、键盘、LCD液晶显示屏以及其他必要系统调节元件。
软件设计中涉及PORTB\PORTC\PORTD\PORTE用作普通数字I/O脚功能。
本实验用单片机PORTB\D接收来自键盘输入的指令信息,由此确定LCD液晶屏幕显示以及喇叭播放内容,再通过PORTC\D\E输出声音或字幕信息。
关键字单片机——microcontroller芯片——CMOS chip音乐发生器——music generator 分频——fractional frequency 一、实验论证与比较本设计的核心器件是单片机芯片和音频功放芯片。
单片机采用以Microchip公司的PIC16F87X系列中的PIC16F877芯片为核心构建简单控制系统,它完全可以满足本设计功能的需要。
此音乐发生器设计利用单片机的输入输出功能,当按下播放功能键时,单片机的输出功能使外部电路连接的喇叭和LCD液晶显示屏同时播放声音及显示文字,从而实现各种复杂音乐播放器的功能。
电路综合实验实验报告 基于Amage16 电子琴 北邮
2013-2014学年小学期电路综合实验实验报告基于单片机ATmega16电子琴的设计与实现姓名:班级:学号:班内序号:同组:EMAIL :组号:北京邮电大学时间:2013年09月12日目录1.实验概要1.1摘要1.2关键词1.3实验目的2.前期基础实验3.原理图和流程图.及效果图4.程序分析5.调试排错过程6.心得体会7.小组分工8.参考文献1 实验概要1.1 摘要本实验是基于单片机A Tmega16制作的建议电子琴。
通过键盘的控制可以播放预置歌曲以及自行弹奏音符这两个主要功能以及变速,录放音,变调等其他的次要功能,通过数码管和二极管的发光来显示音调和当前模式。
1.2 关键词avr单片机电子琴弹奏存储播放1.3 实验目的(1)对单片机有初步的了解,了解ATmega16单片机的各个端口管脚以及其逻辑功能。
(2)熟悉A VR studio,GCC等软件的编译环境,进行软件仿真。
(3)了解各个模块的作用以及用法,如4*4键盘,喇叭等。
(4)通过对于上述的了解,设计出简易电子琴并实现若干功能。
2 前期基础实验代码:#include<avr/io.h>int main(void){char temp;unsigned int i,j;DDRD = 0xff;PORTD = 0b11100110;while(1){temp = PORTD;PORTD = PORTD << 1;if(temp & 0b10000000)PORTD |= 0b00000001;for(i=0;i<500;i++)for(j=0;j<1000;j++);}}#include<avr/io.h>#include<avr/interrupt.h>char shuma[10]={~0b10111011,~0b10100000,~0b01101011,~0b11101010,~0b11110000,~0b11011010,~0b11011011,~0b10101000,~0b11111011,~0b11111010,};volatile unsigned int cnt=0,i=0,j=0,m=0,p=0;int main(void){DDRD = 0xff;DDRB = 0xff;MCUCR = 0;MCUCR |=(1<<ISC10) | (1<<ISC00)| (1<<ISC01);GICR |= (1<<INT0) | (1<<INT1);sei();TCNT0 = 5;TCCR0 |=(1<<CS01);while(1);}SIGNAL(SIG_INTERRUPT0){i=0;j=0;m=0;p=0;TIMSK |= (1<<TOIE0);}SIGNAL(SIG_INTERRUPT1){TIMSK &= ~(1<<TOIE0);PORTD = 0b10000000;PORTB = shuma[i];for(int n=0;n<500;n++);PORTD = 0b01000000;PORTB = shuma[j];for(int n=0;n<500;n++);PORTD = 0b00100000;PORTB = shuma[m]&(~(1<<2));for(int n=0;n<500;n++);PORTD = 0b00010000;PORTB = shuma[p];for(int n=0;n<500;n++);}SIGNAL(SIG_OVERFLOW0){TCNT0 = 5;cnt++;if(cnt>60){cnt=0;PORTD = 0b10000000;PORTB = shuma[i];for(int n=0;n<500;n++);PORTD = 0b01000000;PORTB = shuma[j];for(int n=0;n<500;n++);PORTD = 0b00100000;PORTB = shuma[m]&(~(1<<2));for(int n=0;n<500;n++);PORTD = 0b00010000;PORTB = shuma[p];for(int n=0;n<500;n++);i++;if(i==10){i=0;j++;}if(j==10){j=0;m++;}if(m==10){m=0;p++;}if(p==6)p=0;}}3 原理图及实物图4 程序分析#include<avr/io.h>#include<avr/interrupt.h>#include<avr/iom16.h>unsigned char anjian = 0;//获取按键的int speed=20;//控制播放速度unsigned int music_L[7]={262,294,330,349,392,440,494};//存放低八度音阶频率unsigned int music_C[7]={524,588,660,698,784,880,988};//存放正常C大调音阶频率unsigned int music_H[7]={1047,1175,1319,1397,1568,1760,1976};//存放高八度音阶频率unsigned int music[7]={524,588,660,698,784,880,988};//存放正常C大调音阶频率并且在变调时将其他调的频率写入该数组unsigned int musicmem[100]={}; //储存弹奏的音乐频率unsigned int tune[100]={}; //储存弹奏的音乐的某个音符音长int flag=0; //音长char display[11]={0,0b00000110, //数码管显示10b01011011, //数码管显示20b01001111, //数码管显示30b01100110, //数码管显示40b01101101, //数码管显示50b01111101, //数码管显示60b00000111, //数码管显示70b01111111, //数码管显示80b01101111, //数码管显示90b00111111, //数码管显示0};//控制8段数码管显示void init()//初始化{DDRD |=0x30;//发声DDRA = 0xf0;//按键DDRB = 0xff;//8段数码管DDRC = 0xff;//8段数码管speed = 20;//播放速度}void delay(int ms)//延迟函数单位为毫秒,用于在按键按下后提供延迟响应滤除误按的影响。
数电课程设计--简易电子琴
目录1 设计任务 (1)1.1 基本任务 (1)1.2 扩展任务 (1)2 设计方案原理 (1)3 单元电路的设计 (2)3.1 多谐振荡器 (2)3.2 琴键开关 (3)3.3 扩音器(喇叭) (4)3.4 器件选择 (4)4 电路图的绘制 (5)5 电路的仿真及调试 (6)6 体会 (6)参考文献 (8)1设计任务电子琴是一种很简单的电子产品,目前市场上所售的电子琴多为基于单片机所设计的。
本次课设要求利用数电知识,设计一个能奏出八个音阶的电子琴。
虽然没有基于单片机的电子琴那么多的功能,但是电子琴的基本功能是可以满足的。
本次设计的主要内容为:根据数电课程所学内容,结合其他相关课程知识,设计一个简易电子琴,以加深对单片机知识的理解,锻炼实践动手能力。
本次设计的任务为:1.1基本任务①具备8个按键,能够分别较准确地弹奏出1〜1八个音符。
②选择电路方案,完成对确定方案电路的设计。
计算电路元件参数与元件选择、并画出总体电路原理图,阐述基本原理。
用Proteus或MULTISIM软件完成仿真,并按规定格式写出课程设计报告书。
1.2扩展任务①能够弹奏出至少21个音符(三个音阶)。
②能够较便捷地完成音阶的升降。
(按一个开关实现升8度,按另一个开关实现降8度)2设计方案原理本方案为利用555多谐振荡器能输出脉冲信号的特性,通过改变振荡器外接电阻的阻值来改变振荡器输出脉冲的频率,驱动喇叭发出各种音阶。
电子琴所用琴键即为改变电阻阻值的开关,通过改变阻值使输出与琴键音阶相对应。
原理框图如下:图1原理框图3单元电路的设计3.1多谐振荡器利用多谐振荡器产生周期脉冲电路图如下图所示图2 多谐振荡器电路实现图中引脚功能:1脚:GND或Vss)外接电源负端VSS或接地,一般情况下接地。
2脚:TR低触发端。
3脚:OUT(或Vo)输出端。
4脚:Rd是直接清零端。
当R端接低电平,则时基电路不工作,此时不论TR、TH 处于何电平,时基电路输出为“ o”,该端不用时应接高电平。
数电课设之简易电子琴
课程设计任务书学生姓名:辛威专业班级:电子1002班指导教师:韩屏工作单位:信息工程学院题目: 简易电子琴设计(数字)初始条件:可选元件:集成运算放大器LM324、电阻、电位器、电容若干,直流电源Vcc= +12V,或自备元器件。
可用仪器:示波器,万用表,直流稳压源,函数发生器要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)设计任务根据已知条件,完成对简易电子琴电路的设计、装配与调试。
(2)设计要求①设计一简易电子琴电路,按下不同琴键即改变RC值,能发出C调的八个基本音阶,采用运算放大器构成振荡电路,用集成功放电路输出。
已知八个基本音阶在C调时所对应的频率如下表所列C调 1 2 3 4 5 6 7 if / Hz 264 297 330 352 396 440 495 528②选择电路方案,完成对确定方案电路的设计。
计算电路元件参数并画出总体电路原理图,阐述基本原理。
(选做:用PSPICE或EWB软件完成仿真。
)③安装调试并按规定格式写出课程设计报告书。
时间安排:1. 2012 年12月31日分班集中,布置课程设计任务、选题;讲解课设具体实施计划与课程设计报格式的要求,课设答疑事项。
2. 2011 年12月31日至2012年1月4日完成资料查阅、设计、制作与调试。
3. 2012年1月4日至2012年1月5日完成课程设计报告撰写。
4. 2012 年7月5日提交课程设计报告,进行课程设计验收和答辩。
指导教师签名:年月日系主任(或责任教师)签名:年月日目录1 总体设计 (3)1.1 设计背景 (3)1.2设计任务和要求 (3)1.2.1设计任务 (3)1.2.2设计要求 (3)1.3设计思路 (4)2 原理与器件选择 (7)2.1 电路图 (7)2.1.1主板电路 (7)2.1.2键盘电路 (7)2.1.3扩展电路 (7)2.2 原理简述 (7)2.3 器件的选择 (8)2.3.1 主板部分 (8)2.3.2 键盘部分. (8)2.3.3 扩展部分 (8)3 实物制作与输出波形 (9)4 调试与影响因素分析 (14)5 总结与体会 (15)参考文献 (16)附录1 (17)附录2 (18)1总体设计1.1设计背景电子琴是很好的娱乐工具,大人小孩都爱玩,甚至一玩就是几个小时“简易电子琴”使用了一个集成电路振荡器,一些按键和一个音频输出连接到功率放大电路。
北邮大三数电实验电子琴
数字电路与逻辑设计实验报告实验名称: 基于VHDL的电子琴演奏器实现学院: 信息与通信工程学院班级:姓名:学号:任课老师:日期:2012年11月目录一.任务要求 (2)1、基本要求 (2)2、提高要求 (2)二、原理概述 (2)三、系统设计 (3)1、基础功能 (3)2、拓展功能1——自动播放 (6)3、拓展功能2——储存音符并可自动播放所存字符 (8)4、全部功能实现 (8)四、波形仿真及波形分析 (11)五、源程序 (15)1、FENPINXISHU (15)2、FENPIN (16)3、BEEP (16)4、OUTPUT (17)5、YINFUFENPIN (21)6、JISHU (21)7、JIANPU (22)8、MIAOFENPIN (24)9、JILU (25)10、SHUJUXUANZEQI (26)11、TP (27)六、功能说明 (30)七、元器件清单及资源利用情况 (30)八、故障及问题分析 (31)九、总结和结论 (31)一.任务要求设计制作一个简易电子琴演奏器。
1、基本要求(1) 用8×8点阵显示“1 2 3 4 5 6 7”七个音符构成的电子琴键盘。
其中点阵的第一列用一个LED点亮表示音符“1”,第二列用二个LED点亮表示音符“2”,依此类推,如下图所示。
1 2 3 4 5 6 7图1 点阵显示的电子琴键盘(2) 用BTN1~BTN7七个按键模拟电子琴手动演奏时的“1 2 3 4 5 6 7”七个音符。
当某个按键按下时,数码管显示相应的音符,点阵上与之对应的音符显示列全灭,同时蜂鸣器演奏相应的声音;当按键弹开时数码管显示的音符灭掉,点阵显示恢复,蜂鸣器停止声音的输出。
下图所示为按下BTN3按键时点阵的显示情况。
1 2 3 4 5 6 7图2 按键按下后的点阵显示a、由拨码开关切换选择高、中、低音,并用数码管进行相应的显示。
b、通过按键BTN0进行复位,控制点阵显示图1的初始状态。
北邮小学期PIC单片机-蓝牙电子琴-实验报告
2013年小学期PIC单片机实验报告题目:蓝牙电子琴组号:班级:学号:姓名:老师:目录一摘要二论证与比较三原理1 蓝牙控制原理…………………………………………………..2 发音原理………………………………………………………3 中断控制………………………………………………………四硬件1 框图…………………………………………………………………………………2 原理图…………………………………………………………………………………五软件1 流程图………………………………………………………………………………2 程序…………………………………………………………………………………六实验总结七参考文献一摘要Microcontroller is known as the single chip microcomputer and single chip microcomputer. It is the central processing unit (CPU), random access memory (RAM), read-only memory (ROM), input/output port (I/O), etc. The main function of computer components are integrated on a chip microcomputer. Experiments using PIC16F877 single-chip microcomputer with a serial communication port (USART port), through the USART port with bluetooth module connection, you can through the mobile phone bluetooth bluetooth device to control the single-chip computer, also can realize the serial communication with other modules. PIC16F877 single chip microcomputer to control the corresponding port produce a certain frequency of square wave, amplification and then sent to the speakers can emit a certain frequency of sound. Interrupt to use bluetooth to real-time control MCU, thus realize the electric .单片机被称为单片微电脑或单片微型计算机。
北邮 数字逻辑实验报告
北京邮电大学课程设计报告目录实验一:交通灯控制器设计............................................................................. 实验二:电子钟设计 ........................................................................................ 实验三:药片装瓶系统设计............................................................................. 附:数字逻辑课程设计调试日志及个人心得体会...........................................数字逻辑课程设计实验一:交通灯控制器设计一、实验目的①学习采用状态机方法设计时序逻辑电路。
②掌握ispLEVER软件的使用方法。
③掌握用VHDL语言设计数字逻辑电路。
④掌握ISP器件的使用。
二、实验所用器件和设备在系统可编程逻辑器件ISP1032 一片示波器一台万用表或逻辑笔一只TEC-5实验系统,或TDS-2B数字电路实验系统一台三、实验内容以实验台上的4个红色电平指示灯,4个绿色电平指示灯模仿路口的东南西北4个方向的红,绿,黄交通灯。
控制这些交通灯,使它们按下列规律亮,灭。
(1)初始状态为4个方向的红灯全亮,时间1s。
(2)东,西方向绿灯亮,南,北方向红灯亮。
东,西方向通车,时间5s。
(3)东,西方向黄灯闪烁,南,北方向红灯,时间2s。
(4)东,西方向红灯亮,南,北方向绿灯亮。
南,北方向通车,时间5s。
(5)东,西方向红灯闪烁,南,北方向黄灯闪烁,时间2s。
(6)返回(2),继续运行。
(7)如果发生紧急事件,例如救护车,警车通过,则按下单脉冲按钮,使得东,南,西,北四个方向红灯亮。
紧急事件结束后,松开单脉冲按钮,将恢复到被打断的状态继续运行。
数字电子技术综合实验报告——简易电子琴
数字电子技术综合实验报告2012--2013学年第二学期姓名:学号:班级:实验时间:实验指导老师:目录一、设计任务 (2)二、设计方案 (2)三、系统框图 (3)四、方案实现 (3)1.乐曲演奏的原理 (3)2.总体方案 (4)五、实验结果 (6)六、方案优化 (7)七、心得体会 (7)附录 (7)1.VHDL源程序 (7)2.各层次原理图 (35)3.编译报告 (40)1题目: 简易电子琴设计摘要电子琴的设计大规模可编程逻辑器件(FPGA )作为系统的核心控制部分通过软件的设计编写然后进行软硬件的调试运行最终达到设计电路的乐器演奏、选歌及显示功能。
设计中采用计数原理控制演奏器发声,对音乐发生所必须确定的音符和节拍分别用程序语言实现。
可以用它来弹奏和播放乐曲。
特点是设计思路简单、清晰。
关键字:电子琴 CPLD一、设计任务1.基本要求(1)具有一般弹奏功能;(2)自动播放功能;(3)数码显示音符功能。
2.发挥部分(1)能通过选择键在多首歌曲中选择播放;(2)输出增加功率放大电路,增加歌曲容量;(3)增加音效或节拍可调;(4)无线弹奏。
二、设计方案采用大规模可编程逻辑器件(FPGA),利用quartusII,通过verilog代码实现简易电子琴演奏电路。
2三、系统框图四、方案实现1.乐曲演奏的原理:乐曲演奏的原理:组成乐曲的每个音符的频率值(音调)以及持续时间(音长)是乐曲能持续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号的频率的高低和持续的时间,就可以使扬声器发出持续的乐曲声。
音调的控制频率的高低决定了音调的高低。
音乐的十二平均率规定:每两个八度音(如简谱中的中音1与高音1)之间的频率相差一倍。
在两个八度音之间,又可分为十二个半音,每半个音的频率比为。
另外,音名A(简谱中的低音6)的频率为440HZ,音名B到C之间,E到F之间为半音,其余为全音。
由此可以计算出简谱中从低音1至高音1之间的每个音名对应的频率如图所示:3所有不同频率均从同一基准频率分频得到。
北邮模电综合实验-简易电子琴的设计与实现
电子测量与电子电路实验课程设计题目: 简易电子琴的设计和制作姓名孙尚威学院电子工程学院专业电子信息科学与技术班级2013211202学号2013210849班内序号04指导教师陈凌霄2015年4 月目录一、设计任务与要求 (3)1.1 设计任务与要求 (3)1.2 选题目的与意义 (3)二、系统设计分析 (3)2.1系统总体设计 (3)2.2 系统单元电路设计 (4)2.2.1 音频信号产生模块 (4)2.2.2 功率放大电路 (7)2.2.3 开关键入端(琴键) (8)三、理论值计算 (9)3.1 音阶频率对应表 (9)3.2 键入电路电阻计算 (9)四、电路设计与仿真 (10)4.1 电路设计 (10)4.2 Multisim仿真 (11)五、实际电路焊接 (11)六、系统调试 (13)6.1 系统测试方案 (13)6.2 运行结果分析 (14)七、设计体会与实验总结 (15)一、设计任务与要求1.1 设计任务与要求了解由555定时器构成简易电子琴的电路及原理。
设计并利用NE555集成运算电路以及外加电阻,电容在第一级产生不同频率的音乐,再利用LM386功率放大电路对音乐信号进行放大,最后通过扬声器产生21个音符。
1.2 选题目的与意义(1)培养理论联系实际的正确设计思想,训练综合运用已经学过的理论和生产实际知识去分析和解决工程问题的能力。
(2)学习较复杂的电子系统设计的一般方法,了解和掌握模拟,数字电路等知识解决电子信息方面常见实际问题的能力。
(3)学习调试电子电路的方法,提高实际动手能力。
了解由555定时器构成简易电子琴的电路及原理。
二、系统设计分析2.1系统总体设计由555电路组成的多谐振荡器,它的振荡频率可以通过改变振荡电路中的RC元件的数值进行改变。
根据这一原理,通过设定一些不同的RC数值并通过控制电路,按照一定的规律依次将不同值的RC组件接入振荡电路,就可以使振荡电路按照设定的需求,有节奏的发出已设定的音频信号,再利用LM386功率放大电路对音乐信号进行放大,最后通过扬声器产生音符。
北邮简易电子琴制作
简易电子琴的制作学院:信息与通信工程班级:16班学号:2012210453姓名:魏嘉毅一、摘要及关键词本课程设计以制作一个简易电子琴为最终结果,主要以硬件测试为主。
首先进行电路分析,设计电路图,然后通过555的特点计算不同频率按键所对应的不同阻值,其次考虑所有可能出现的问题,完善电路图,再选择合适的器件,最后按照电路图线路搭试,调试测试,直至达到理想的目标,最后测量各个参数并记录。
关键词:电子琴振荡电路放大器二、设计任务及要求设计任务:1.学习调试电子电路的方法,提高实际动手能力。
2.了解由555定时器构成简易电子琴的电路及原理。
设计要求:设计一个简易电子琴,按下不同琴键时改变 RC值,能八个不同基本音调,用运算放大器构成振荡电路,用集成功放电路输出;选择方案,完成对确定方案电路的设计,并按照方案画出总体电路原理图,计算出元件参数,仿真实现后选购元件,并完成电子琴的制作。
三、设计思路555定时器是一种中规模集成电路,外形为双列直插8脚结构,体积小,使用起来方便。
只要在外部配上几个适当的阻容元件,就可以构成施密特触发器、单稳态触发器及多谐振荡器等脉冲信号产生与变换电路。
它在波形的产生与变换、测量与控制、定时电路、家用电器、电子玩具、电子乐器等方面有广泛的应用。
由555定时器电路组成的多谐振荡器,它的振荡频率可以通过改变振荡电路中的RC原件的数值进行改变。
根据这一原理,通过设定一些不同的RC数值并通过控制电路,按照一定的速度依次将不同的RC组件接入振荡电路,就可以使振荡电路按照设定的要求,有节奏的发射已设定的音频信号与音乐。
四、总体结构框图五、分块电路及总体电路的设计分块电路:开关输入端:555电路:386电路:总体电路:六、所实现功能的说明可以演奏低中高三个音阶的八个音. 当按下按键开关后,能够按照实验者的设计发出“哆”, “来”, “咪”, “发”,“嗦”,“啦”, “西”, 7个音调。
并且,可以演奏一首乐曲,可以有三个八度的音域。
北邮数电实验电子琴
VHDL硬件描述语言程序设计简易电子琴演奏器姓名:chi目录一、设计课题的任务要求 (3)二、系统设计 (4)三、仿真波形及波形分析 (7)四、源程序 (9)五、功能说明 (20)六、元器件清单及资源利用情况 (21)七、故障及问题分析 (22)八、总结和结论 (23)一、设计课题的任务要求基本要求:1、用8×8点阵显示“1 2 3 4 5 6 7”七个音符构成的电子琴键盘。
其中点阵的第一列用一个LED点亮表示音符“1”,第二列用二个LED点亮表示音符“2”,依此类推,如下图所示。
图1 点阵显示的电子琴键盘2、用BTN1~BTN7七个按键模拟电子琴手动演奏时的“1 2 3 4 5 6 7”七个音符。
当某个按键按下时,数码管显示相应的音符,点阵上与之对应的音符显示列全灭,同时蜂鸣器演奏相应的声音;当按键弹开时数码管显示的音符灭掉,点阵显示恢复,蜂鸣器停止声音的输出。
下图所示为按下BTN3按键时点阵的显示情况。
图2 按键按下后的点阵显示3、由拨码开关切换选择高、中、低音,并用数码管进行相应的显示。
4、通过按键BTN0进行复位,控制点阵显示图1的初始状态。
提高要求:1、可通过一个拨码开关进行手动/自动演奏的切换,并与点阵显示配合增加自动演奏乐曲的功能。
2、增加手动演奏的音符存储、播放功能。
二、系统设计1.设计思路简易电子琴的制作主要是利用不同频率的波来驱动蜂鸣器发出声响。
通过输入不同的音符来设置不同的分频系数,使得50MHz的主频分频出不同频率的波。
同时,演奏的音符还可以通过数码管和8*8点阵来动态显示。
根据系统设计要求,该电子琴设计采用自顶向下的设计方法。
整体的功能通过不同的底层模块配合来完成电子琴的功能。
底层模块主要包括乐曲自动演奏模块、分频预置值产生模块和数控分频模块,数码管显示模块,8*8点阵显示模块五部分组成。
用这种设计思路把整个系统分为了若干个模块,然后再在顶层文件中将各个模块组合在一起,从而体现出超、高速硬件描述语言VHDL的优势,关于提高要求中通过一个拨码开关进行手动/自动演奏的切换,并与点阵显示配合增加自动演奏乐曲的功能,我打算将一首曲子的音符储存在自动播放的数组里面,然后通过计数器来顺序播放储存的音符。
院校资料-北邮数字逻辑课程设计_简易电子琴
北邮数字逻辑课程设计_简易电子琴简易电子琴实验报告综合设计:程序编写:实验报告撰写:北京邮电大学计算机学院某人一.实验目的1.掌握较复杂逻辑的设计和调试。
2.掌握用VHDL语言设计数字逻辑电路。
3.掌握ispLEVER软件的使用方法。
4.掌握ISP器件的使用。
5.用途: 有电子琴的基本功能,可弹奏出简单的乐曲。
二.实验器材1.在系统可编程逻辑器件1032E2.示波器3.逻辑测试笔4.TEC-5实验系统三.实验容设计一个简易电子琴,有两种模式,既可以音阶弹奏,也可以自动播放乐曲。
要求音阶弹奏的时候,可以弹奏高音低音一共14个不同音符,自动播放乐曲的时候,要求可以按一定节奏自动播放一首预存在系统中的乐曲。
四.实验设计原理从试验系统外部接入一个时钟信号,对时钟信号进行分频,可以得到不同分频的脉冲信号。
当这个分频值设定为一定的数值时,就可以使试验系统的喇叭发出不同的音符,从而完成音阶演奏。
自动演奏时,除了对外部时钟进行分频得到不同的音符外,还需要通过时钟信号对节拍进行控制,设置该音乐最短的音符为基本单位,一步一步往后执行,根据某个音符的节拍数来确定执行时间,从而可以按照节奏将一段音乐自动演奏出来。
五.设计方案1.一共有14个琴键,表示中音的1-7到低音的1-7,按照电子琴的排列布局来安排琴键位置。
2.根据不同音符的频率,用多模计数器对时钟信号进行分频,得到特定的脉冲信号,为了使信号稳定,需要对其进行翻转得到2分频信号再输出。
3.综合原理图4.外部输入50kHz的时钟信号,根据下表用多模计数器对时钟信号进行分频,得到分频系数。
六.程序实现*********************************实体部分************************************* library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity Orgen isport(moderm:in std_logic;--模式选择,0为音阶自演奏模式,1为自动播放模式clk:in std_logic;--时钟信号Index:in std_logic_vector(13 downto 0);--琴键选择信号,1表示选择摸个琴键,共有14个琴键,可以选择14个音,分别是低音1-7和中音1-7 Code:out std_logic_vector(6 downto 0);--七段发光二极管编码,用于显示弹奏的音符high:out std_logic;--如果是中音,小灯亮,反之不亮tone0:inout integer range 0 to 2047;--分频系数result:inout std_logic--输出音频信号);end Orgen;*******************************结构体部分************************************architecture Orgen_Player of Orgen is--程序使用的是50kHz的时钟信号beginSearch:process(Index,clk,moderm)--Search进程,根据琴键选择信号得到不同的分variable step:integer range 0 to 2000;variable count2:integer range 0 to 2000;begin***************************音阶演奏模式部分********************************** if Moderm='0' then--手动音阶演奏模式case Index iswhen "00000000000001"=> tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0键信号,分配了不同的分频系数,为不同音名的发光二极管编码,同时调整高低音显示信号end case;end if;******************************自动演奏部分************************************ if (moderm='1') and (clk'event and clk='1') then--自动演奏模式--tone0防止影响if count2count2:=count2+1;--1秒输出1拍elsecount2:=0;case step iswhen 0=>tone0step:=step+1;when 1=>tone0step:=step+1;when 2=>tone0step:=step+1;when 3=>tone0step:=step+1;tone0step:=step+1;when 5=>tone0step:=step+1;when 6=>tone0step:=step+1;when 7=>tone0step:=step+1;when 8=>tone0step:=step+1;when 9=>tone0step:=step+1;when 10=>tone0step:=step+1;when 11=>tone0step:=step+1;when 12=>tone0step:=step+1;when 13=>tone0step:=step+1;when 14=>tone0step:=step+1;when 15=>tone0step:=step+1;--step不同,表示乐曲演奏到不同的位置,赋予不同的分频系数,然后step+1end case;end if;end if;end process;**************************发生进程,控制喇叭发声****************************** Made_Code:process(clk)--发声进程,发出不同的音频variable count1:integer range 0 to 2000;beginif clk'event and clk='1' thenif count1count1:=count1+1;--事先查好每个音名的频率,根据音频系数进行分频,得到是正确频率两倍的音elsecount1:=0;result音频信号end if;end if;end process;end Orgen_Player;七.基于QuartusII9.0的仿真实现1.仿真电路图2.仿真波形图八.基于TEC-5试验系统的实现效果1.音阶模式下,可以根据琴键的输入演奏低音1-7和中音1-7一共14个音符。
北邮小学期基于AVR单片机的电子琴制作实验报告
小学期单片机实验报告姓名:班级:学号:同组姓名:EMAIL:时间:2013/9/16-2013/9/27基于AVR单片机的电子琴制作目录基于AVR单片机的电子琴制作 (2)简介 (3)1.1课题名称 (3)1.2摘要 (3)前期准备 (3)2.1流水灯 (3)2.1.1 功能 (3)2.1.2 程序代码 (3)2.2蜂鸣器/按键蜂鸣器 (4)2.2.1 功能 (4)2.2.2 程序代码 (4)2.3 秒表计时器 (6)2.3.1 功能 (6)2.3.2 程序代码 (6)有关发声的基础知识 (8)设计过程 (8)4.1设计流程 (8)4.2 实验元器件 (9)4.3实验程序主要流程图 (9)4.4实验原理及原理图 (10)4.4.1实验原理 (10)4.4.2 原理图 (10)4.4.3各模块的设计与详解: (11)程序源代码及程序分析 (13)实验结果 (32)6.1 操作过程 (32)6.2 实验结果 (33)排错过程 (33)心得体会 (34)参考文献 (35)意见与建议 (35)简介1.1课题名称简易电子琴1.2摘要本实验设计制作一个基于单片机Atmega16的模拟电子琴。
能够通过键盘控制实现播放预存检测音乐,弹奏音符,储存弹奏音乐并播放,暂停及停止播放,上一曲下一曲等功能。
关键词:单片机,按键检测,预存播放,弹奏,储存,播放控制,可视化操作界面,电子琴前期准备在之前的学习中我们从未学习单片机,所以在确定选题前需要一定的学习和练习。
我们小组一共练习了3个工程:流水灯、按键蜂鸣器和秒表计时器,学会了使用AVR studio工作环境和WINAVR(GCC)编译器。
并且学会了下载程序到板上。
学会了I/O端口初始化、输入输出操作,通过端口控制LED序列、8段数码管、蜂鸣器,中断和定时的使用。
2.1流水灯2.1.1 功能学会I/O端口的初始化及通过端口控制LED,使得LED呈现流水灯效果,我们小组用的PB端口作为控制LED的端口,并且由于人眼频率和单片机频率的关系加了延迟函数,使得流水灯每个为1s2.1.2 程序代码int main(void){char temp; //用来存储当前A端口的输出unsigned int i,k; //循环变量DDRA=0xff; //将A端口设为输出PORTA=0b00000001; //初始化A端口,最开始第一个灯亮while(1) //主循环{temp = PORTA;PORTA=PORTA<<1;if(temp&0b10000000) //这段代码使得,最后一个等亮起后,又从第一个亮起{PORTA=PORTA | 0b00000001;}for(i=0;i<50;i++) //延时,约1秒钟{for(k=0;k<1000;k++);}}}2.2蜂鸣器/按键蜂鸣器2.2.1 功能按键蜂鸣器主要为了了解按键的使用,并且学会中断的应用2.2.2 程序代码蜂鸣器:#include <avr/io.h>int main(void){unsigned int i,k; //循环变量DDRB|=(1<<3); //对B端口的设置,使得pd3设置为输出PORTB &=~(1<<3); //初始时蜂鸣器不响while(1){PORTB ^=(1<<3); //设置蜂鸣器每隔一秒响一次for(i=0;i<50;i++){for(k=0;k<1000;k++);}}}按键蜂鸣器:#include<avr/io.h>int main(void){DDRA &=~(1<<6); //按钮6的设置PORTA |=(1<<6);DDRA &=~(1<<7); //按钮7的设置PORTA |=(1<<7);DDRA &=~(1<<2); //按钮2的设置PORTA |=(1<<2);DDRA &=~(1<<3); //按钮3的设置PORTA |=(1<<3);DDRB |=(1<<3);//蜂鸣器输出PORTB &=~(1<<3);DDRD =0xff;//灯的输出while(1){switch(PINA &0b11001100){case 0b11001100: //K1被按下{PORTD|=(1<<0); //LED0发光break;}case 0b11000000: //K2被按下{PORTD|=(1<<1); //LED1发光break;}case 0b10001000: //K3被按下{PORTD|=(1<<2); //LED2发光break;}case 0b01001000: //K4被按下{PORTB |=(1<<3); //蜂鸣器鸣响break;}default:{PORTB &=~(1<<3); //关蜂鸣器PORTD=0; //关灯break;}}}}2.3秒表计时器2.3.1 功能利用两位数码管,实现秒表计时的功能2.3.2 程序代码#include <avr/io.h>#include <avr/interrupt.h>int scandata[10]= //显示0—9个数的数组{0b01111111,0b00011001,0b10111110,0b10111011,0b11011001,0b11101011,0b11101111,0b00111001,0b11111111,0b11111011,};int main(void){DDRA=0xff;DDRB=0xff;DDRD=0b11110111;PORTA=0b00000001;PORTD=(1<<3);PORTB=0b00001000;MCUCR|=(1 << ISC11); //设置INT1中断GICR|=(1 << INT1);sei();unsigned int i,j,k,x,y,tmp;TCCR0|=(1<<CS01);while(1){for(i=0;i<60;i++){x=i/10,y=i%10; //用取商和取余来显示计数的数字PORTD=scandata[x];PORTB=scandata[y];tmp=PORTA; //流水灯的显示PORTA=PORTA << 1;if(tmp & (1<<7)){PORTA|=1;}TCNT0=55;for(k=0;k<3;k++) //一秒的延时for(j=0;j<10000;j++){while(!(TIFR & (1<<TOV0)));TCNT0=55;}}}}int cnt1,cnt2;SIGNAL(SIG_INTERRUPT1) //中断服务程序{while(1){for(cnt2=0;cnt2<100;cnt2++)for(cnt1=0;cnt1<20000;cnt1++);if(!(PIND & (1<<3)))//第二次按下按钮break;}}有关发声的基础知识声波是振动产生的。
北邮小学期AVR单片机电子琴实验报告
小学期AVR单片机实验报告实验题目:基于ATmega16L单片机的电子琴设计学生姓名:学渣班级:2012XXXXXX班内序号:XX学号:2012XXXXXX日期:2014年9月30日同组同学:学渣目录:一、实验介绍 (3)1.1实验课题名称 (3)1.2实验平台 (3)1.3实验课题关键字..............................31.4实验摘要 (3)二、小组分工 (3)三、基本题目训练——流水灯与数码管秒表计时器 (3)3.1实现功能 (3)3.2程序代码分析 (4)3.3实验结果图片 (7)四、有关发声的基础知识 (7)五、电子琴的设计与测试 (9)5.1设计过程 (9)5.2实验所需元器件 (9)5.3实验程序主要流程图 (10)5.4实验原理及原理图 (10)5.4.1实验原理 (10)5.4.2原理图 (11)5.5各个模块的设计与讲解 (11)5.6程序源代码及程序分析 (14)5.7实验结果..................................... ..24六、排错过程............................ . (26)七、心得体会 (29)八、参考文献 (32)九、意见与建议 (33)一、实验介绍:1.1实验课题名称:基于ATmega16L单片机的电子琴设计1.2实验平台:本实验所用平台为AVR Studio 41.3实验课题关键字:ATmega16L型单片机电子琴键盘按键 LCD液晶显示屏1.4实验摘要:本实验设计的电子琴拥有可视化操作界面,能实现即时弹奏音乐、音乐播放、音乐变速、音乐变调,并可以进行任意长度录音(通过按键记录音阶)等功能二、小组分工:●XXX负责电路硬件的连接和报告的撰写●XXX负责程序代码的编写●XXX负责资料的收集整理和查阅三、基本题目训练——流水灯与数码管秒表计时器3.1功能:八盏LED二极管按顺序依次循环点亮,实现流水灯的效果,同时两只数码管分别代表秒和十分之一秒,进行秒表计时,配有两个按键,实现计时过程中的暂停和继续,同时在按下暂停键的时候蜂鸣器会响一声。
北邮数电综合实验-简易钢琴游戏实验报告
北京邮电大学数电综合实验报告实验名称:简易钢琴游戏学院:信息与通信工程姓名:班级:学号:班内序号:目录:一:设计课题的任务要求 (1)二:系统设计 (2)2.1 设计思路 (2)2.2 总体框图 (3)2.3 分块设计 (3)三:仿真波形及波形分析 (4)3.1 分频模块仿真 (4)3.2 点阵仿真 (5)3.3 数码管仿真 (7)3.4 总体仿真及分析 (8)四:源程序(略) (9)五:功能说明及资源利用情况 (9)5.1 时钟功能 (9)5.2 点阵及LED指示灯 (9)5.3 数码管 (9)5.4 总体功能及资源利用情况 (9)六:故障及问题分析 (10)七:总结和结论 (10)一:设计课题的任务要求任务:设计制作一个简易钢琴游戏机1、用8×8 点阵进行游戏显示2、BTN1~BTN7 七个按键模拟钢琴演奏时的“1 2 3 4 5 6 7”七个音符。
点阵的第一列对应音符“1”,第二列对应音符“2”,依此类推,低中高音自定。
3、光点在点阵第一行随机出现,逐点下落,下落速度为0.2 秒/行,如图1 所示。
图1 光点下落示意图4、在光点下落到点阵最后一行之前的过程中,如果按下与该列点阵相应的音符键,该光点消失,蜂鸣器演奏相应的音符声音,计分器加1。
如果在光点下落到最后一行依然没有进行相应的按键操作,该光点消失,计分器不加分。
计分器由数码管显示。
5、每隔1 秒在点阵的不同列的第一行出现一个光点,如图2 所示。
图2 点阵随机光点示意图6、游戏时间为30 秒,数码管倒计时显示。
提高要求:1、光点在点阵某行随机出现,然后逐点下落。
2、下落速度随机变化。
3、光点按照存储的乐曲顺序和速度的出现。
4、自拟其它功能。
提示:根据声乐知识,产生音乐的两个因素是音乐频率的持续时间,音乐的十二平均率规定,每两个八音度之间的频率相差一倍,在两个八音度之间,又可分为12个半音。
每两个半音的频率比为4。
另外,音名A(乐谱中的低音6)的频率为440HZ,音名B到C之间,E到F之间为半音,其余为全音。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VHDL硬件描述语言程序设计简易电子琴演奏器姓名:chi目录一、设计课题的任务要求 ............................................................. 错误!未定义书签。
二、系统设计................................................................................. 错误!未定义书签。
三、仿真波形及波形分析 ............................................................. 错误!未定义书签。
四、源程序..................................................................................... 错误!未定义书签。
五、功能说明................................................................................. 错误!未定义书签。
六、元器件清单及资源利用情况 ................................................. 错误!未定义书签。
七、故障及问题分析 ..................................................................... 错误!未定义书签。
八、总结和结论 ............................................................................. 错误!未定义书签。
一、设计课题的任务要求基本要求:1、用8×8点阵显示“1 2 3 4 5 6 7”七个音符构成的电子琴键盘。
其中点阵的第一列用一个LED点亮表示音符“1”,第二列用二个LED点亮表示音符“2”,依此类推,如下图所示。
图1 点阵显示的电子琴键盘2、用BTN1~BTN7七个按键模拟电子琴手动演奏时的“1 2 3 4 5 6 7”七个音符。
当某个按键按下时,数码管显示相应的音符,点阵上与之对应的音符显示列全灭,同时蜂鸣器演奏相应的声音;当按键弹开时数码管显示的音符灭掉,点阵显示恢复,蜂鸣器停止声音的输出。
下图所示为按下BTN3按键时点阵的显示情况。
图2 按键按下后的点阵显示3、由拨码开关切换选择高、中、低音,并用数码管进行相应的显示。
4、通过按键BTN0进行复位,控制点阵显示图1的初始状态。
提高要求:1、可通过一个拨码开关进行手动/自动演奏的切换,并与点阵显示配合增加自动演奏乐曲的功能。
2、增加手动演奏的音符存储、播放功能。
二、系统设计1.设计思路简易电子琴的制作主要是利用不同频率的波来驱动蜂鸣器发出声响。
通过输入不同的音符来设置不同的分频系数,使得50MHz的主频分频出不同频率的波。
同时,演奏的音符还可以通过数码管和8*8点阵来动态显示。
根据系统设计要求,该电子琴设计采用自顶向下的设计方法。
整体的功能通过不同的底层模块配合来完成电子琴的功能。
底层模块主要包括乐曲自动演奏模块、分频预置值产生模块和数控分频模块,数码管显示模块,8*8点阵显示模块五部分组成。
用这种设计思路把整个系统分为了若干个模块,然后再在顶层文件中将各个模块组合在一起,从而体现出超、高速硬件描述语言VHDL的优势,关于提高要求中通过一个拨码开关进行手动/自动演奏的切换,并与点阵显示配合增加自动演奏乐曲的功能,我打算将一首曲子的音符储存在自动播放的数组里面,然后通过计数器来顺序播放储存的音符。
关于提高要求中的手动演奏的音符存储、播放功能,我打算通过编程实现类似数据结构中队列的模块,来储存手动输入的音符,然后在要播放的时候,队列里面的音符依次出队,从而实现音符储存播放的功能。
2.总体框图图3 简易电子琴总体结构框图图4 简易电子琴逻辑流程图图5 简易电子琴VHDL电路原理图3.分块设计(1)分频模块div0由于实验电路板的主频是50Mhz,为了数码管和点阵的刷新显示,我们必须将50Mhz的频率进行分频。
分频的程序来自电路中心的网站上面。
在这个模块里,我设置分频系数为cnt=2499。
从实验结果看,这个分频对数码管和点阵的显示有很好的效果(2)数码管显示模块shuma我使用了2个数码管,第一个数码管显示1~7的音符,第二个数码管显示相关的信息,比如高音用H表示,低音用L表示,自动播放用A表示。
两个数码管分别刷新,但由于刷新频率太快,人眼不能察觉,以为是两个数码管是同时亮的。
在程序中我们通过duan : out std_logic_vector(7 downto 0)和cat : out std_logic_vector(5 downto 0)来控制数码管的显示。
当输入不同的音符和不同的控制信息时,duan和cat向量都有不同的值与之对应。
(3)8*8点阵显示模块dianzhen8*8点阵的显示和数码管的显示运用了同样的原理,在程序中我们通过row : outstd_logic_vector(7 downto 0)和col : out std_logic_vector(7 downto 0)这两个向量来控制点阵的显示。
当输入不同的音符时,点阵显示相应的形状。
(4)音符产生模块auto。
这个模块的功能是,选择的不同模式来产生不同的音符。
当选择自动播放模式时,随着计数器count的值增加,即地址值递增时,程序自动读取出事先储存的音符,并把这个音符输出。
当选择手动演奏模式时,直接将通过BTN1~BTN7输入的向量当做音符输出yin :out std_logic_vector(6 downto 0);。
(5)分频预置值产生模块该模块的功能是通过音符以及高低音选项来查表找到对应的频率值。
在程序中设置了全部音符对应的分频预置数。
通过判断音符产生模块输出的音符yin :in std_logic_vector(6 downto 0),以及拨码开关的高低音highlow :in std_logic_vector(1 downto 0)控制键,来查找出该音符的频率值,然后将该频率赋值给tone :out integer range 0 to 2000000);。
(6)数控分频发声模块从实验板上面输入的时钟是50MHz的,必须经过分频后由clk_out输出,驱动蜂鸣器发声。
Clk_out的输出频率就对应着音符的音调。
分频系数由来自分频预置值模块的tone :out integer range 0 to 2000000)。
由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号。
为了利用驱动蜂鸣器,需要再增加一个进程,多波形进行整理,均衡占空比三、仿真波形及波形分析1.数码管显示模块仿真波形波形分析:不同的yin,和highlow组合,数码管显示不同的字符。
duan[0]~duan[7]对应着数码管的a段到h段,cat[0]~cat[5]控制不同的数码管2.点阵显示模块仿真波形波形分析:不同的yin输入,点阵的col和row会有不同的波形,利用clk_in的上升沿来动态扫描点阵。
从而得显示出指定的图形。
3.自动播放模块仿真波形波形分析:当auto 置1,clear置0,yin_out输出储存在程序里面的曲子音符,这时候相当于自动播放。
当auto置0,clear置0,yin_out输出从BTN1~BTN7读取的手动输入的信号,这时候相当于手动演奏。
4.分频预置值产生模块仿真波形波形分析:输入不同的高低音highlow,和音符yin,输出不同的tone。
而tone将作为发声模块的分频预置值四、源程序1.分频模块源程序library ieee;use div0 isport(clk_in : in std_logic; --输入时钟clk_tmp : out std_logic); --输出时钟end;architecture b of div0 issignal clk : std_logic;beginp0:process(clk_in)variable cnt : integer range 0 to 2499;beginif (clk_in'event and clk_in='1') thenif cnt=2499 then --分频系数为2499cnt:=0;clk<= not clk;elsecnt:=cnt+1; --每个输入时钟上升沿到来时cnt加1end if;end if;end process p0;clk_tmp<=clk;end b ;2.数码管显示源程序library ieee;use shuma isport(clk_in : in std_logic; --以分频的时钟输入yin : in std_logic_vector(6 downto 0); --输入音符highlow : in std_logic_vector(1 downto 0); --输入高低音auto : in std_logic; --自动播放auto1 : in std_logic; --自动播放1duan : out std_logic_vector(7 downto 0);cat : out std_logic_vector(5 downto 0));end;architecture b of shuma issignal duant : std_logic_vector(7 downto 0);signal catt : std_logic_vector(5 downto 0);beginp1: process(clk_in,yin,highlow,auto,auto1)beginif auto ='1' thencatt<="111101";duant<="00111111"; --显示“8”表示自动播放elsif auto1 ='1' thencatt<="111101";duant<="01111111"; --显示“0”表示试音elsif auto ='0' thenif(clk_in ='0') thencase yin iswhen "0000001" => catt<="111110";duant<="00000110"; --显示“1”when "0000010" => catt<="111110";duant<="01011011";--显示“2”when "0000100" => catt<="111110";duant<="01001111";--显示“3”when "0001000" => catt<="111110";duant<="01100110";--显示“4”when "0010000" => catt<="111110";duant<="01101101";--显示“5”when "0100000" => catt<="111110";duant<="01111101";--显示“6”when "1000000" => catt<="111110";duant<="00000111";--显示“7”when others=> catt<="111111";duant<="00000000";end case;elsif (clk_in ='1') thencase highlow iswhen "10" => catt<="111101";duant<="01110100"; --显示“L”when "01" => catt<="111101";duant<="00111000"; --显示“H”when others=> catt<="111111";duant<="00000000";end case;end if;end if;end process p1;cat<= catt;duan<= duant;end b;3.点阵显示源程序library ieee;use dianzhen isport(clk_in : i n std_logic; --时钟输入yin : in std_logic_vector(6 downto 0); --输入音符row : out std_logic_vector(7 downto 0); --点阵行向量col : out std_logic_vector(7 downto 0) --点阵列向量);end;architecture b of dianzhen issignal count : integer range 0 to 6;signal rowt : std_logic_vector(7 downto 0);signal colt : std_logic_vector(7 downto 0);beginp1:process(clk_in)beginif (clk_in'event and clk_in='1') thenif count = 6 thencount<=0;elsecount<=count+1; --用count来记数end if;end if;end process p1;p2: process(count,yin)beginif (yin = "0000001") thencase count is --点阵显示,表示“1”音符when 0=> rowt<="";colt<="01111110";when 1=> rowt<="";colt<="01111110";when 2=> rowt<="";colt<="01111100";when 3=> rowt<="";colt<="01111000";when 4=> rowt<="";colt<="01110000";when 5=> rowt<="";colt<="01100000";when 6=> rowt<="";colt<="01000000";when others=> rowt<="";colt<="00000000";end case;elsif (yin = "0000010") thencase count is --点阵显示,表示“2”音符when 0=> rowt<="";colt<="01111101";when 1=> rowt<="";colt<="01111100";when 2=> rowt<="";colt<="01111100";when 3=> rowt<="";colt<="01111000";when 4=> rowt<="";colt<="01110000";when 5=> rowt<="";colt<="01100000";when 6=> rowt<="";colt<="01000000";when others=> rowt<="";colt<="00000000";end case;elsif (yin = "0000100") thencase count is --点阵显示,表示“3”音符when 0=> rowt<="";colt<="01111011";when 1=> rowt<="";colt<="01111010";when 2=> rowt<="";colt<="01111000";when 3=> rowt<="";colt<="01111000";when 4=> rowt<="";colt<="01110000";when 5=> rowt<="";colt<="01100000";when 6=> rowt<="";colt<="01000000";when others=> rowt<="";colt<="00000000";end case;elsif (yin = "0001000") thencase count is --点阵显示,表示“4”音符when 0=> rowt<="";colt<="01110111";when 1=> rowt<="";colt<="01110110";when 2=> rowt<="";colt<="01110100";when 3=> rowt<="";colt<="01110000";when 4=> rowt<="";colt<="01110000";when 5=> rowt<="";colt<="01100000";when 6=> rowt<="";colt<="01000000";when others=> rowt<="";colt<="00000000";end case;elsif (yin = "0010000") thencase count is --点阵显示,表示“5”音符when 0=> rowt<="";colt<="01101111";when 1=> rowt<="";colt<="01101110";when 2=> rowt<="";colt<="01101100";when 3=> rowt<="";colt<="01101000";when 4=> rowt<="";colt<="01100000";when 5=> rowt<="";colt<="01100000";when 6=> rowt<="";colt<="01000000";when others=> rowt<="";colt<="00000000";end case;elsif (yin = "0100000") thencase count is --点阵显示,表示“6”音符when 0=> rowt<="";colt<="01011111";when 1=> rowt<="";colt<="01011110";when 2=> rowt<="";colt<="01011100";when 3=> rowt<="";colt<="01011000";when 4=> rowt<="";colt<="01010000";when 5=> rowt<="";colt<="01000000";when 6=> rowt<="";colt<="01000000";when others=> rowt<="";colt<="00000000";end case;elsif (yin = "1000000") thencase count is --点阵显示,表示“7”音符when 0=> rowt<="";colt<="00111111";when 1=> rowt<="";colt<="00111110";when 2=> rowt<="";colt<="00111100";when 3=> rowt<="";colt<="00111000";when 4=> rowt<="";colt<="00110000";when 5=> rowt<="";colt<="00100000";when 6=> rowt<="";colt<="00000000";when others=> rowt<="";colt<="00000000";end case;elsecase count is --点阵显示,表示不输入音符when 0=> rowt<="";colt<="01111111";when 1=> rowt<="";colt<="01111110";when 2=> rowt<="";colt<="01111100";when 3=> rowt<="";colt<="01111000";when 4=> rowt<="";colt<="01110000";when 5=> rowt<="";colt<="01100000";when 6=> rowt<="";colt<="01000000";when others=> rowt<="";colt<="00000000";end case;end if;end process p2;row<= rowt;col<= colt;end b;4.选择音符及自动播放源程序library ieee;use auto isport( clk_in :in std_logic; --输入时钟auto :in std_logic; --自动播放auto1 :in std_logic; --试音播放clear :in std_logic; --复位yin_in :in std_logic_vector(6 downto 0); --输入音符yin_out :out std_logic_vector(6 downto 0)); --输出音符end auto;architecture a of auto issignal count : integer range 0 to 35;signal n: integer range 0 to 6;signal yin : std_logic_vector(6 downto 0);beginp1:process(clk_in,clear)variable i : integer range 0 to ;beginif clear ='1' thencount<=0;elsif (clk_in'event and clk_in='1') thenif (i=) theni:=0;if count =15 thencount <=0; --自动播放count记数elsecount <=count+1;end if;if n =6 thenn <=0; --试音播放n记数elsen <=n+1;end if;elsei:=i+1;end if;end if;end process p1;p2:process(count,auto,yin_in,clear)beginif clear='1' thenyin<="0000000"; --音符清零elseif auto ='1' then --自动播放歌曲case count iswhen 1 => yin<="0000100"; --3when 2 => yin<="1000000"; --7when 3 => yin<="0000100"; --3when 4 => yin<="0100000"; --6when 5 => yin<="0010000"; --5when 6=> yin<="0100000"; --6when 7 => yin<="0000001"; --1when 8 => yin<="0000100"; --3when 9 => yin<="0010000"; --5when 10 => yin<="0000100"; --3when 11 => yin<="0000100"; --3when 12 => yin<="0001000"; --4when 13 => yin<="0000100"; --2when 14 => yin<="0001000"; --4when others => yin<="0000000";end case;elsif auto1 ='1' thencase n is --试音播放when 0 => yin<="0000001"; --1when 1 => yin<="0000010"; --2when 2 => yin<="0000100"; --3when 3 => yin<="0001000"; --4when 4 => yin<="0010000"; --5when 5 => yin<="0100000"; --6when 6 => yin<="1000000"; --7when others => yin<="0000000";end case;elseyin<=yin_in; --动手演奏end if;end if;end process p2;yin_out<=yin;end a;5.预置分频系数模块源代码library ieee;use seletone isport( highlow :in std_logic_vector(1 downto 0); --高低音yin :in std_logic_vector(6 downto 0); --要演奏的音符tone :out integer range 0 to 2000000); --预置分频系数end seletone;architecture a of seletone issignal tone0 :integer range 0 to 2000000;beginprocess(highlow,yin)beginif highlow ="00" thencase yin is --中音部分when "0000001"=> tone0<=523;when "0000010"=> tone0<=587;when "0000100"=> tone0<=659;when "0001000"=> tone0<=698;when "0010000"=> tone0<=784;when "0100000"=> tone0<=880;when "1000000"=> tone0<=988;when others => tone0<=2000000;end case;elsif highlow ="10" then --高音部分case yin iswhen "0000001"=> tone0<=1045;when "0000010"=> tone0<=1174;when "0000100"=> tone0<=1318;when "0001000"=> tone0<=1396;when "0010000"=> tone0<=1568;when "0100000"=> tone0<=1760;when "1000000"=> tone0<=1975;when others => tone0<=2000000;end case;elsif highlow ="01" then --低音部分case yin iswhen "0000001"=> tone0<=261;when "0000010"=> tone0<=293;when "0000100"=> tone0<=329;when "0001000"=> tone0<=349;when "0010000"=> tone0<=392;when "0100000"=> tone0<=440;when "1000000"=> tone0<=494;when others => tone0<=2000000;end case;end if;end process ;tone <=tone0;end a;6.分频发音模块源代码library ieee;use div isport(clk_in : in std_logic; --输入时钟tone : in integer range 0 to 2000000; --预置频率clk_out : out std_logic); --输出时钟end div;architecture a of div issignal clk_tmp0 : std_logic;signal clk_tmp1: std_logic;beginp0:process(clk_in, tone)variable cnt : integer range 0 to ;beginif (clk_in'event and clk_in='1') thenif cnt </tone then --分频系数cnt:=cnt+1;clk_tmp0<='1';elsecnt:=0;clk_tmp0<='0';end if;end if;end process p0;p1:process(clk_tmp0)variable count :std_logic;beginif(clk_tmp0'event and clk_tmp0='1') thencount:=not count;if count ='1' thenclk_tmp1 <='1'; --输出平稳的波形elseclk_tmp1 <='0';end if;end if;end process p1;clk_out<=clk_tmp1;end a;7.电子琴顶层设计library ieee;use dianzq isport(clk : in std_logic; --时钟输入yin : in std_logic_vector(6 downto 0); --音符输入highlow: in std_logic_vector(1 downto 0); --高低音输入auto_in: in std_logic; --自动播放auto1 : in std_logic; --试音播放clear : in std_logic; --复位clk_out: out std_logic; --输出时钟row : out std_logic_vector(7 downto 0); --点阵显示col : out std_logic_vector(7 downto 0); --点阵显示duan : out std_logic_vector(7 downto 0); --数码管显示cat : out std_logic_vector(5 downto 0)); --数码管显示end dianzq;architecture a of dianzq iscomponent div0 is --分频模块port(clk_in : in std_logic;clk_tmp : out std_logic);end component;component dianzhen is --点阵显示模块port(clk_in : in std_logic;yin : in std_logic_vector(6 downto 0);row : out std_logic_vector(7 downto 0);col : out std_logic_vector(7 downto 0));end component;component shuma is --数码管显示模块port(clk_in : in std_logic;yin : in std_logic_vector(6 downto 0);highlow : in std_logic_vector(1 downto 0);auto : in std_logic;auto1 : in std_logic;duan : out std_logic_vector(7 downto 0);cat : out std_logic_vector(5 downto 0));end component;component auto is --自动播放模块port( clk_in : in std_logic;auto : in std_logic;auto1 : in std_logic;yin_in :in std_logic_vector(6 downto 0);clear : in std_logic;yin_out: out std_logic_vector(6 downto 0));end component;component seletone is --预置分频系数模块port( highlow: in std_logic_vector(1 downto 0);yin : in std_logic_vector(6 downto 0);tone : out integer range 0 to 2000000);end component;component div is --分频发音模块port(clk_in : in std_logic;tone : in integer range 0 to 2000000;clk_out : out std_logic);end component;signal yin_tmp : std_logic_vector(6 downto 0);signal tone_tmp : integer range 0 to 2000000;signal clk_tmp : std_logic;beginu1: auto port map(clk_in=>clk,auto=>auto_in,yin_in=>yin,yin_out=>yin_tmp,clear=>clear,auto1=>auto1);u2: seletone port map (highlow=>highlow,yin=>yin_tmp,tone=>tone_tmp);u3: shuma port map(duan=>duan,cat=>cat,yin=>yin_tmp,clk_in=>clk_tmp,highlow=>highlow,auto=>auto_in,aut o1=>auto1);u4: dianzhen port map (row=>row,col=>col,yin=>yin_tmp,clk_in=>clk_tmp);u5: div port map (clk_in=>clk,tone=>tone_tmp,clk_out=>clk_out);u6: div0 port map (clk_in=>clk,clk_tmp=>clk_tmp);end a;五、功能说明初始状态,8×8点阵显示“1 2 3 4 5 6 7”七个音符构成的电子琴键盘,其中点阵的第一列用一个LED点亮表示音符“1”,第二列用二个LED点亮表示音符“2”,依此类推,用BTN1~BTN7七个按键模拟电子琴手动演奏时的“1 2 3 4 5 6 7”七个音符。