北邮数电实验电子琴
- 格式:docx
- 大小:648.26 KB
- 文档页数:46
北邮,单片机,实验报告,电子琴北邮单片机实验报告简易电子琴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液晶显示屏同时播放声音及显示文字,从而实现各种复杂音乐播放器的功能。
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)//延迟函数单位为毫秒,用于在按键按下后提供延迟响应滤除误按的影响。
课程设计任务书学生姓名:辛威专业班级:电子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的初始状态。
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 .单片机被称为单片微电脑或单片微型计算机。
数字电子技术综合实验报告——简易电子琴(总42页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--数字电子技术综合实验报告2012--2013学年第二学期姓名:学号:班级:实验时间:实验指导老师:目录一、设计任务 (2)二、设计方案 (2)三、系统框图 (3)四、方案实现 (3)1.乐曲演奏的原理 (3)2.总体方案 (4)五、实验结果 (6)六、方案优化 (7)七、心得体会 (7)附录 (7)1.VHDL源程序 (7)2.各层次原理图 (35)3.编译报告 (40)题目: 简易电子琴设计摘要电子琴的设计大规模可编程逻辑器件(FPGA)作为系统的核心控制部分通过软件的设计编写然后进行软硬件的调试运行最终达到设计电路的乐器演奏、选歌及显示功能。
设计中采用计数原理控制演奏器发声,对音乐发生所必须确定的音符和节拍分别用程序语言实现。
可以用它来弹奏和播放乐曲。
特点是设计思路简单、清晰。
关键字:电子琴 CPLD一、设计任务1.基本要求(1)具有一般弹奏功能;(2)自动播放功能;(3)数码显示音符功能。
2.发挥部分(1)能通过选择键在多首歌曲中选择播放;(2)输出增加功率放大电路,增加歌曲容量;(3)增加音效或节拍可调;(4)无线弹奏。
二、设计方案采用大规模可编程逻辑器件(FPGA),利用quartusII,通过verilog代码实现简易电子琴演奏电路。
三、系统框图四、方案实现1.乐曲演奏的原理:乐曲演奏的原理:组成乐曲的每个音符的频率值(音调)以及持续时间(音长)是乐曲能持续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号的频率的高低和持续的时间,就可以使扬声器发出持续的乐曲声。
音调的控制频率的高低决定了音调的高低。
音乐的十二平均率规定:每两个八度音(如简谱中的中音1与高音1)之间的频率相差一倍。
在两个八度音之间,又可分为十二个半音,每半个音的频率比为。
北京邮电大学课程设计报告目录实验一:交通灯控制器设计............................................................................. 实验二:电子钟设计 ........................................................................................ 实验三:药片装瓶系统设计............................................................................. 附:数字逻辑课程设计调试日志及个人心得体会...........................................数字逻辑课程设计实验一:交通灯控制器设计一、实验目的①学习采用状态机方法设计时序逻辑电路。
②掌握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)如果发生紧急事件,例如救护车,警车通过,则按下单脉冲按钮,使得东,南,西,北四个方向红灯亮。
紧急事件结束后,松开单脉冲按钮,将恢复到被打断的状态继续运行。
电子测量与电子电路实验课程设计题目: 简易电子琴的设计和制作姓名孙尚威学院电子工程学院专业电子信息科学与技术班级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个音调。
并且,可以演奏一首乐曲,可以有三个八度的音域。
数电实验简易电子琴的设计报告简易电子琴的设计姓名:班级:学号:一、项目概况选题目的,为了进一步巩固之前学到的知识,将课本的知识结合趣味性,让自己得到更好的提高。
项目构思,模型要做一个能成功实现的简易电子琴,包括按键按下后蜂鸣器会根据相应的频率准确发出相应音阶的声音,7段数码管会显示出按键的简谱,输出端H能够表示音的高低。
要用到计数器,触发器分频器,7段数码显示器等元件。
二、方案设计系统框图为:系统简介如下:1.系统框图2.系统端口(2个输入口 3个输出口)(1)CLK,频率1MHz。
用于提供时钟脉冲信号。
(2)DIN[7..0]。
琴键输入的8个音符,8位中只有一位是低电平即每次只能按一个键。
(3)SPK。
用于驱动蜂鸣器,输出频率fB与蜂鸣器发出的音调与电子琴各音阶基频有对应关系。
(4)LED。
接数码管,用于显示对应的简谱码,H显示音调高低。
3.工作原理(1)编码器CODE3。
将输入的8位琴键信号进行编码,输出一个4位码,最多能对应16个音符(若有16个键)。
按下的琴键的电平为低。
例:8’b11111110 : KEY<=4’b0001输入第一位琴键“哆”此时编译成4位二进制数 2^0=1 传入译码器INX2CODE。
(2)译码器INX2CODE。
将键盘输入的编码信号译码成数控分频器SPK0输出信号的频率控制字。
例:1 : F_CODE <= 11’H305刚才编码器编码传入的琴键“哆”的 1此时被译码为数控分频器SPK0的输出信号的频率控制字305H。
(3)SPK0。
计数器CNT11B是一个LPM宏模块,利用同步加载控制sload避免来自进位信号cout中可能的毛刺影响,反相器和D触发器使得进位信号延迟半个时钟周期,过滤掉可能的毛刺,使得加载更加可靠。
例:经过编译的305H被置入模块SPK0的11位可预置计数器中计数器不断以此值为计数起始值,直至全为1。
以305H计数起始,计数器成为一个模为1270(7FFH-305H=4F6H=1270)的计数器。
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个音符。
小学期单片机实验报告姓名:班级:学号:同组姓名: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;}}有关发声的基础知识声波是振动产生的。
数电课程设计--简易电子琴目录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处于何电平,时基电路输出为“0”,该端不用时应接高电平。
小学期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之间为半音,其余为全音。
VHDL 硬件描述语言程序设计简易电子琴演奏器姓名:chi目录设计课题的任务要求 (4)系统设计 (5)三、仿真波形及波形分析.................................................. 1..0四、源程序.............................................................. 1.3.五、功能说明............................................................ 3.7.六、元器件清单及资源利用情况 (37)七、故障及问题分析 (39)八、总结和结论.......................................................... 4.0设计课题的任务要求基本要求:1、用8 X8点阵显示“ 1 2 3 4 5 6 7 ”七个音符构成的电子琴键盘。
其中点阵的第一列用一个LED点亮表示音符“ 1 ”,第二列用二个LED点亮表示音符“ 2”,依此类推, 如下图所示。
ooo o ooo O oooeeee* ooooatae oooooeee ooooooee ooooooo*图1点阵显示的电子琴键盘2、用BTN1〜BTN7七个按键模拟电子琴手动演奏时的“ 1 2 3 4 5 6 7 ”七个音符。
当某个按键按下时,数码管显示相应的音符,点阵上与之对应的音符显示列全灭,同时蜂鸣器演奏相应的声音;当按键弹开时数码管显示的音符灭掉,点阵显示恢复,蜂鸣器停止声音的输出。
下图所示为按下BTN3按键时点阵的显示情况。
图2 按键按下后的点阵显示3、由拨码开关切换选择高、中、低音,并用数码管进行相应的显示。
4、通过按键BTNO进行复位,控制点阵显示图1的初始状态。
提高要求:1、可通过一个拨码开关进行手动/自动演奏的切换,并与点阵显示配合增加自动演奏乐曲的功能。
2、增加手动演奏的音符存储、播放功能。
二、系统设计1.设计思路简易电子琴的制作主要是利用不同频率的波来驱动蜂鸣器发出声响。
通过输入不同的音符来设置不同的分频系数,使得50MHz的主频分频出不同频率的波。
同时,演奏的音符还可以通过数码管和8*8点阵来动态显示。
根据系统设计要求,该电子琴设计采用自顶向下的设计方法。
整体的功能通过不同的底层模块配合来完成电子琴的功能。
底层模块主要包括乐曲自动演奏模块、分频预置值产生模块和数控分频模块,数码管显示模块,8*8点阵显示模块五部分组成。
用这种设计思路把整个系统分为了若干个模块,然后再在顶层文件中将各个模块组合在一起,从而体现出超、高速硬件描述语言VHDL的优势,关于提高要求中通过一个拨码开关进行手动/自动演奏的切换,并与点阵显示配合增加自动演奏乐曲的功能,我打算将一首曲子的音符储存在自动播放的数组里面,然后通过计数器来顺序播放储存的音符。
关于提高要求中的手动演奏的音符存储、播放功能,我打算通过编程实现类似数据结构中队列的模块,来储存手动输入的音符,然后在要播放的时候,队列里面的音符依次出队,从而实现音符储存播放的功能。
2.总体框图图3 简易电子琴总体结构框图图4 简易电子琴逻辑流程图std_logic_vector(7 dow nto 0) 禾口cat : out std_logic_vector(5 downto 0) 来控制数码管图5 简易电子琴VHDL电路原理图3. 分块设计(1)分频模块divO由于实验电路板的主频是50Mhz,为了数码管和点阵的刷新显示,我们必须将50Mhz的频率进行分频。
分频的程序来自电路中心的网站上面。
在这个模块里,我设置分频系数为cnt=2499 。
从实验结果看,这个分频对数码管和点阵的显示有很好的效果(2)数码管显示模块shuma我使用了2个数码管,第一个数码管显示1~7的音符,第二个数码管显示相关的信息,比如高音用H表示,低音用L表示,自动播放用A表示。
两个数码管分别刷新,但由于刷新频率太快,人眼不能察觉,以为是两个数码管是同时亮的。
在程序中我们通过duan : out的显示。
当输入不同的音符和不同的控制信息时,duan和cat向量都有不同的值与之对应。
(3)8*8点阵显示模块dianzhen8*8点阵的显示和数码管的显示运用了同样的原理,在程序中我们通过row : outstd_logic_vector(7 downto 0) 和col : out std」ogic_vector(7 downto 0) 这两个向量来控制点阵的显示。
当输入不同的音符时,点阵显示相应的形状。
(4)音符产生模块auto。
这个模块的功能是,选择的不同模式来产生不同的音符。
当选择自动播放模式时,随着计数器count的值增加,即地址值递增时,程序自动读取出事先储存的音符,并把这个音符输出。
当选择手动演奏模式时,直接将通过BTN1~BTN7输入的向量当做音符输出yin :out std_logic_vector(6 dow nto 0); 。
(5)分频预置值产生模块该模块的功能是通过音符以及高低音选项来查表找到对应的频率值。
在程序中设置了全部音符对应的分频预置数。
通过判断音符产生模块输出的音符yin :in std」ogic_vector(6 down to 0),以及拨码开关的高低音highlow :in std」o gic_vector(1 dow nto 0) 控制键,来查找出该音符的频率值,然后将该频率赋值给tone :out in teger range 0 to 2000000);。
(6)数控分频发声模块std_logic_vector(7 dow nto 0) 禾口cat : out std_logic_vector(5 downto 0) 来控制数码管从实验板上面输入的时钟是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.分频预置值产生模块仿真波形模块的分频预置值四、源程序1.分频模块源程序library ieee;use ieee.std 」o gic_1164.all; use ieee.std_logic_ un sig ned.all;en tity div0 isport(clk_ in :in std_logic; clk_tmp :out std_logic);end;architecture b of div0 issig nal clk : std_logic;Mascer irre Bar: 1 SI 7E ns,Porker17.5- us Inter /a:17.4S s Start:波形分析:输入不同的高低音 highlow,和音符yin ,输出不同的tone 。
而tone 将作为发声--输入时钟 --输出时钟beginpO:process(clk_ in)variable ent : in teger range 0 to 2499; beginif (clk_i n'event and clk_in='1') the n if cn t=2499 the ncnt:=0;clk<= not clk;elsecn t:=c nt+1;来时cnt加1end if;end if;end process p0;clk_tmp<=clk;end b ;2. 数码管显示源程序library ieee;use ieee.std」o gic_1164.all;use ieee.std_logic_ un sig ned.all; --分频系数为2499--每个输入时钟上升沿到en tity shuma isport(clk_ in : in std_logic; --以分频的时钟输入yin : in std_logic_vector(6 dow nto 0); --输入音符highlow :in std_logic_vector(1 dow nto 0); --输入高低音auto in std_logic; --自动播放auto1 :in std」o gic; --自动播放1dua n : out std_logic_vector(7 dow nto 0);cat : out std_logic_vector(5 dow nto 0));en d;architecture b of shuma issig nal dua nt : std_logic_vector(7 dow nto 0);sig nal catt : std_logic_vector(5 dow nto 0);beginp1: process(clk_i n,yin ,highlow,auto,auto1)beginif auto ='1' then--显示“ 8”表示自catt<="111101";dua nt<="00111111";动播放elsif autol ='1' thencatt<="111101";duant<="01111111"; --显示“ 0 ” 表示试音elsif auto ='0' the nif(clk_in ='0') the ncase yin iswhen "0000001" => catt<="111110";duant<="00000110";--显示“1 ”when "0000010" => catt<="111110";duant<="01011011";--显示“ 2 ”whe n "0000100" => catt<="111110";dua nt<="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') the ncase highlow iswhen "10" => catt<="111101";duant<="01110100";--显示when "01" => catt<="111101";duant<="00111000";“H ”when others=> catt<="111111";duant<="00000000";end case;end if;end if;end process p1;cat<= catt;dua n<= dua nt;end b;3. 点阵显示源程序library ieee;use ieee.std」o gic_1164.all;use ieee.std_logic_ un sig ned.all;en tity dia nzhe n isport(clk_ in : in std_logic;yin : in std_logic_vector(6 dow nto 0);row : out std_logic_vector(7 dow nto0); --点阵行向--显示--时钟输入--输入音符col : out std_logic_vector(7 dow nto 0) --点阵列向量);en d;architecture b of dia nzhe n issig nal count : in teger range 0 to 6;sig nal rowt : std_logic_vector(7 dow nto 0);sig nal colt : std_logic_vector(7 dow nto 0);beginp1:process(clk_ in)beginif (clk_i n'event and clk_in='1') the nif count = 6 the ncoun t<=0;elsecount<=count+1; --用count 来记数end if;end if;elsif (yin = "0000010") the nend process p1;p2: process(co un t,y in) beginif (yin = "0000001") thencase count is--点阵显示,表示" 1 ”音符when 0=> rowt<="11111110";colt<="01111110"; when 1=> rowt<="11111101";colt<="01111110"; when 2=> rowt<="11111011";colt<="01111100"; when 3=> rowt<="11110111";colt<="01111000"; when 4=> rowt<="11101111";colt<="01110000"; when 5=> rowt<="11011111";colt<="01100000"; when 6=> rowt<="10111111";colt<="01000000"; when others=> rowt<="11111111";colt<="00000000"; end case;--点阵显示,表示"2 ”音case count iswhen 0=> rowt<="11111110";colt<="01111101";when 1=> rowt<="11111101";colt<="01111100";when 2=> rowt<="11111011";colt<="01111100";when 3=> rowt<="11110111";colt<="01111000";when 4=> rowt<="11101111";colt<="01110000";when 5=> rowt<="11011111";colt<="01100000";when 6=> rowt<="10111111";colt<="01000000";when others=> rowt<="11111111";colt<="00000000";end case;elsif (yin = "0000100") thencase count is --点阵显示,表示" 3”音符when 0=> rowt<="11111110";colt<="01111011";when 1=> rowt<="11111101";colt<="01111010";when 2=> rowt<="11111011";colt<="01111000";when 3=> rowt<="11110111";colt<="01111000";when 4=> rowt<="11101111";colt<="01110000";when 5=> rowt<="11011111";colt<="01100000";when 6=> rowt<="10111111";colt<="01000000";when others=> rowt<="11111111";colt<="00000000";end case;elsif (yin = "0001000") thencase count is --点阵显示,表示" 4”音符when 0=> rowt<="11111110";colt<="01110111";when 1=> rowt<="11111101";colt<="01110110";when 2=> rowt<="11111011";colt<="01110100";when 3=> rowt<="11110111";colt<="01110000";when 4=> rowt<="11101111";colt<="01110000";when 5=> rowt<="11011111";colt<="01100000";when 6=> rowt<="10111111";colt<="01000000";when others=> rowt<="11111111";colt<="00000000";end case;elsif (yin = "0010000") the ncase count is --点阵显示,表示" 5”音符when 0=> rowt<="11111110";colt<="01101111";when 1=> rowt<="11111101";colt<="01101110";when 2=> rowt<="11111011";colt<="01101100";when 3=> rowt<="11110111";colt<="01101000";when 4=> rowt<="11101111";colt<="01100000";when 5=> rowt<="11011111";colt<="01100000";when 6=> rowt<="10111111";colt<="01000000"; --点阵显示,表示"7 ”音when 0=> rowt<="11111110";colt<="00111111"; when others=> rowt<="11111111";colt<="00000000"; end case;elsif (yin = "0100000") the ncase count is--点阵显示,表示" 6”音符when 0=> rowt<="11111110";colt<="01011111"; when 1=> rowt<="11111101";colt<="01011110"; when 2=> rowt<="11111011";colt<="01011100"; when 3=> rowt<="11110111";colt<="01011000"; when 4=> rowt<="11101111";colt<="01010000"; when 5=> rowt<="11011111";colt<="01000000"; when 6=> rowt<="10111111";colt<="01000000"; when others=> rowt<="11111111";colt<="00000000"; end case;elsif (yin = "1000000") thencase count is符when 1=> rowt<="11111101";colt<="00111110";when 2=> rowt<="11111011";colt<="00111100";when 3=> rowt<="11110111";colt<="00111000";when 4=> rowt<="11101111";colt<="00110000";when 5=> rowt<="11011111";colt<="00100000";when 6=> rowt<="10111111";colt<="00000000";when others=> rowt<="11111111";colt<="00000000";end case;elsecase count is --点阵显示,表示不输入音符when 0=> rowt<="11111110";colt<="01111111";when 1=> rowt<="11111101";colt<="01111110";when 2=> rowt<="11111011";colt<="01111100";when 3=> rowt<="11110111";colt<="01111000";when 4=> rowt<="11101111";colt<="01110000";when 5=> rowt<="11011111";colt<="01100000";when 6=> rowt<="10111111";colt<="01000000";when others=> rowt<="11111111";colt<="00000000";end case;end if;end process p2;row<= rowt;col<= colt;end b;4. 选择音符及自动播放源程序library ieee;use ieee.std」o gic_1164.all;use ieee.std_logic_ un sig ned.all;en tity auto isport( clk_in :in std_logic; --输入时钟auto :in std_logic; --自动播放auto1 :in std_logic; --试音播放clear :in std_logic; --复位yin」n :in std」o gic_vector(6 dow nto 0); --输入音符yin _out :out std」o gic_vector(6 dow nto 0)); --输出音符end auto;architecture a of auto issig nal count : in teger range 0 to 35;sig nal n: in teger range 0 to 6;n <=n+1;end if;sig nal yin : std_logic_vector(6 dow nto 0); beginp1:process(clk_i n, clear):integer range 0 to 63000000;beginif clear ='1' the ncoun t<=0;elsif (clk_i n'eve nt and clk_i n='1') the n if (i=20000000) theni:=0; if count =15the n--自动播放cou nt 记数elseelsecount <=count+1; end if; if n =6the nn <=0; else--试音播放n 记数variable i count <=0;i:=i+1;end if;end if;end process p1;p2:process(co un t,auto, yin_in, clear)beginif clear='1' the nyin<="0000000"; --音符清零elseif auto ='1' then --自动播放歌曲case count iswhe n 1 => yi*="0000100"; --3when 2 => yin<="1000000"; --7when 3 => yi*="0000100"; --3when 4 => yi*="0100000"; --6when 5 => yi*="0010000"; --5when 6=> yin<="0100000"; --6when 7 => yi*="0000001"; --1when 8 => yi*="0000100"; --3when 9 => yi*="0010000"; --5when 10 => yi*="0000100"; --3end if;whe n 11 => yi n<="0000100"; --3 when 12 => yi*="0001000"; --4 whe n 13 => yi n<="0000100"; --2 when 14 => yi*="0001000"; --4 whe n others => yi*="0000000";end case;elsif auto1 ='1' the ncase n is --试音播放when 0 => yi*="0000001"; --1whe n 1 => yi*="0000010"; --2when 2 => yi*="0000100"; --3when 3 => yi*="0001000"; --4when 4 => yi*="0010000"; --5when 5 => yi*="0100000"; --6when 6 => yin<="1000000"; --7whe n others => yi*="0000000";end case;elseyin<=yi n_in; --动手演奏end if;end process p2;yin _out<=yin;end a;5. 预置分频系数模块源代码library ieee;use ieee.std _lo gic_1164.all; use ieee.std_logic_ un sig ned.all;en tity selet one is:in std_logic_vector(1 dow nto 0); yin:in std_logic_vector(6 dow nto 0);tone :out in teger range 0 to 2000000);end selet one;architecture a of selet one issignal tone0 :integer range 0 to 2000000; begin process(highlow, yin) beginif highlow ="00" thenport( highlow--高低音 --要演奏的音符--预置分频系数end case;when "0000001"=〉tone0<=523; whe n "0000010"=〉ton e0<=587; whe n "0000100"=〉ton e0<=659; when "0001000"=〉ton e0<=698; when "0010000"=> ton e0<=784; when "0100000"=> ton e0<=880; when "1000000"=> ton e0<=988; when others => ton e0<=2000000;end case;elsif highlow ="10" the ncase yin iswhen "0000001"=> ton e0<=1045; when "0000010"=> ton e0<=1174; when "0000100"=> ton e0<=1318; when "0001000"=> ton e0<=1396; when "0010000"=> ton e0<=1568; when "0100000"=> ton e0<=1760; whe n "1000000"=> ton e0<=1975; when others => ton e0<=2000000;case yin is--中音部分--高音部分elsif highlow ="01" then--低音部分case yin iswhen "0000001"=〉tone0<=261;when "0000010"=〉ton e0<=293;when "0000100"=〉ton e0<=329;when "0001000"=〉ton e0<=349;whe n "0010000"=> ton e0<=392;when "0100000"=> ton e0<=440;when "1000000"=> ton e0<=494;when others =〉tone0<=2000000; end case;end if;end process ;tone <=t on e0;end a;6. 分频发音模块源代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_ un sig ned.all;en tity divisport(clk_i n : in std」ogic;--输入时钟tone : in in teger range 0 to 2000000; --预置频率clk_out : out std_logic); --输出时钟end div;architecture a of div issig nal clk_tmp0 : std_logic;sig nal clk_tmp1: std_logic;beginp0:process(clk_ in, tone)variable cnt : integer range 0 to 49999999;beginif (clk_ in'event and clk_in='1') thenif cnt <12999999/t onethen--分频系数else cn t:=cnt+1;clk_tmp0<='1'; cnt:=0;clk_tmpO<='O:end if;end if;end process p0;p1:process(clk_tmp0)variable count :std_logic;beginif(clk_tmpO'eve nt and clk_tmp0='1') then coun t:=not count;if count ='1' the n--输出平稳的波形clk_tmp1 <='1';elseclk_tmp1 <='0';end if;end if;end process p1;clk_out<=clk_tmp1;end a;7. 电子琴顶层设计library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_ un sig ned.all;en tity dia nzq isport(clk in std_logic; --时钟输入yin : in std_logic_vector(6 dow nto 0); --音符输入highlow: in std_logic_vector(1 dow nto 0); --高低音输入auto_i n: in std_logic; --自动播放auto1 in std_logic; --试音播放clear : in std_logic; --复位clk_out: out std_logic; --输出时钟row : out std_logic_vector(7 dow nto 0); --点阵显示col : out std_logic_vector(7 dow nto 0); --点阵显示dua n out std_logic_vector(7 dow nto 0); --数码管显示cat : out std_logic_vector(5 dow nto 0)); --数码管显示end dia nzq;architecture a of dia nzq iscomp onent div0 is --分频模块port(clk_i n : in std_logic;clk_tmp : out std_logic);end comp onent;comp onent dia nzhe n is --点阵显示模块port(clk_i n in std_logic;yin : in std_logic_vector(6 dow nto 0);row : out std_logic_vector(7 dow nto 0);col :);out std_logic_vector(7 dow nto 0)丿;end comp onent;comp onent shuma is块port(clk_i n in std_logic;yin : in std_logic_vector(6 dow nto 0);highlow : in std_logic_vector(1 dow nto 0);auto:in std_logic;auto1 in std_logic;dua nout std_logic_vector(7 dow nto 0);cat : out std_logic_vector(5 dow nto 0));--数码管显示模end comp onent;end comp onent;comp onent selet one is 模块port( highlow:in std 」o gic_vector(1 dow nto 0);yin : in std_logic_vector(6 dow nto 0); tone : out in tegerrange 0 to 2000000); end comp onent;comp onent div isport(clk_i n:in std_logic;tone : in in teger range 0 to 2000000; clk_out :out std_logic);comp onent auto isport( clk_in :in std_logic;auto in std_logic; auto1 in std_logic;yin 」n : in std_logic_vector(6 dow nto 0); clear in std_logic;yin _outout std_logic_vector(6 dow nto0))--自动播放模块--预置分频系数--分频发音模块end comp onent;sig nal yin_tmp std_logic_vector(6 dow nto0);sig nal ton e_tmp : in teger range 0 to 2000000;clk_tmpstd_logic;sig nal:beginu1: auto port map(clk_ in=>clk,auto=>auto_ in,yin_in=>yin,yin _out=> yin _tmp,clear=>clear,auto1=>auto1);u2: selet one port map(highlow=>highlow, yin=>yin _tmp,t on e=>t on e_tmp);u3: shuma port map(dua n=>dua n,cat=>cat,y in=>yin _tmp,clk_ in=>clk_tmp,highlow=>highlow,aut o=>auto_ in ,auto1=>auto1);u4: dia nzhe n port map(row=>row,col=>col,y in=>yin _tmp,clk_ in=>clk_tmp);u5: div port map (clk_i n=>clk,t on e=>t on e_tmp,clk_out=>clk_out);u6: div0 port map (clk_ in=>clk,clk_tmp=>clk_tmp);end a;五、功能说明初始状态,8 X8点阵显示“ 1 2 3 4 5 6 7 ”七个音符构成的电子琴键盘,其中点阵的第一列用一个LED点亮表示音符“ 1 ”,第二列用二个LED点亮表示音符“ 2 ”,依此类推,用BTN1〜BTN7七个按键模拟电子琴手动演奏时的“ 1 2 3 4 5 6 7 ”七个音符。