北邮数电实验电子琴
北邮,单片机,实验报告,电子琴

北邮,单片机,实验报告,电子琴北邮单片机实验报告简易电子琴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)//延迟函数单位为毫秒,用于在按键按下后提供延迟响应滤除误按的影响。
数电课设之简易电子琴

课程设计任务书学生姓名:辛威专业班级:电子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 .单片机被称为单片微电脑或单片微型计算机。
数字电子技术综合实验报告——简易电子琴

数字电子技术综合实验报告——简易电子琴(总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功率放大电路对音乐信号进行放大,最后通过扬声器产生音符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 ”七个音符。