数电实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京邮电大学
数字电路与逻辑设计实验简易电子琴演奏器
班级:
学号:
姓名:
一.设计课题的任务要求
题目五简易电子琴演奏器
原理概述:
根据声乐知识,产生音乐的两个因素是音乐频率的持续时间,音乐的十二平均率规定,每两个八音度之间的频率相差一倍,在两个八音度之间,又可分为12个半音。每两个半音的频率比为4。另外,音名A(乐谱中的低音6)的频率为440HZ,音名B到C之间,E到F之间为半音,其余为全音。由此可以计算出乐谱中从低音1到高音1之间每个音名的频率如下表所示。
基本要求:
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、增加手动演奏的音符存储、播放功能。
二、系统设计(包括设计思路、总体框图、分块设计)
设计思路
电子琴的设计主要包括了显示与发声部分,发声部分主要分为三个不同的音阶,每个音阶包括了七个音,发生部分可以通过对50M晶振的分频,通过改变分频系数,得到响应频率的时钟脉冲,以这个脉冲控制蜂鸣器发出声音;显示部分则包括了数码管的音阶显示与点阵的琴键显示。数码管可以动态显示出音阶与当前音符,点阵则模拟显示琴键,动态显示实现了一个三角阵,并对应到音符琴键,这两个显示模块可以通过动态显示来实现显示显示不同的内容,配合按键可以实现基本功能。不同的音阶可以通过相应拨码开关的选择来调节,至于显示的复位,则不需要专门设置键位来完成,因为每个转台结束后就会自动转入等待状态。对于音调,乐曲的12平均率规定:每2个八度音之间的频率相差1倍。在2个八度音之间,又可分为12个半音,每2个半音的频率比为12√2。另外,音符A 的频率为440Hz,音符B到C之间、E到F之间为半音,其余为全音。由此可以计算出简谱中从低音1到高音1之间每个音符的频率。而对于节拍,如果将一拍的长度定为1秒,则1/4拍的时间为1/4秒,为其提供一个4Hz的时钟频率即可产生出1/4拍的效果了。若需要半拍,只需将该音符记录两次就可以了。
总体框图
3、分块设计
程序使用了分块思想,一共两个文件,包括发声与显示部分以及自动播放程序。发声部分:
【分频器】由50M晶振,通过事先得知的频率,得到分频系数,可以控制系数得到不同的发音。由于存在三个音阶,所以设置了三组分频系数。
【蜂鸣器】由分频后的时钟频率控制,在触发按键后由蜂鸣器发出声音。
【音阶选择】设置三个不同的拨码开关,分别控制高中低音的选择,拨动相应开关,进入相应的状态。
显示部分:
【扫描分频】用一个较高频率的时钟控制对数码管选通的扫描以及对于点阵的行扫描。
【译码器】同多一个八位的二进制数,完成对数字音符及字幕音阶的编码,点阵的编码较为简单,在行扫描的状态下,控制每列显示的内容。
【点阵】动态扫描显示出基本要求中的状态,从左至右分别在每一列点亮一个,两个至多个。
【数码管】使用了两个数码管,动态扫描显示出了音符与音阶。
输入部分:
【键盘】键盘在两部分中都有涉及,控制相应点阵灭掉以及蜂鸣器发声。
自动播放部分
主要涉及一个音符存储的文件,但在这部分由于我使用了一个整数数组对音符编码。所以又在发声与显示部分重复了部分代码。
三、仿真波形及波形分析
仿真波形存在一定问题,首先是毛刺,不同进程间最容易出现类似问题,对于琴键的输入控制的不是很好,因为程序设定为在同一时刻只能有一个音符有效,如果在同一个上升沿到来时,存在多个琴键输入,那么就不存在有效输出,所以蜂鸣器的电平存在大段为零的情况,点阵输入采用了行扫描的情况,所以行的显示是分段出现低电平,且一段时间内只选通一位,所以为7个‘1’,1个‘0’。列显示基本正常。数码管情况类似。
四、源程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY music IS
PORT (
CAT: OUT STD_LOGIC_VECTOR(5 DOWNTO 0); --六个数码管
DIGITAL:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --七小段数码管
CLK: IN STD_LOGIC;
BTN: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --8个按键
LED_R: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --点阵横着的8个管教
LED_C: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --点阵竖着的8个管脚
BEEP: OUT STD_LOGIC; --蜂鸣器
KEY_SW:IN STD_LOGIC_VECTOR(1 DOWNTO 0); --选择低、中、高音
AUTO_SW: IN STD_LOGIC --自动播放开关
);
END music;
ARCHITECTURE music_body OF music IS
SIGNAL TEMP_CAT: STD_LOGIC_VECTOR(5 DOWNTO 0); --六个数码管
SIGNAL TEMP_DIGITAL:STD_LOGIC_VECTOR(6 DOWNTO 0); --七小段数码管
SIGNAL TEMP_R: STD_LOGIC_VECTOR(7 DOWNTO 0); --点阵横列
SIGNAL TEMP_C:STD_LOGIC_VECTOR(7 DOWNTO 0); --点阵数列
SIGNAL LED_CLK:STD_LOGIC;
SIGNAL LED_COUNT:INTEGER RANGE 0 TO 100; --点阵分频时用来计数SIGNAL MUSIC_COUNT:INTEGER RANGE 0 TO 200000; --音符分频时用来计数SIGNAL MUSIC_FRE:INTEGER RANGE 0 TO 200000; --音符分频比
SIGNAL AUTO_COUNT1:INTEGER RANGE 0 TO 12500000; --50M除以12500000就等于4HZ
SIGNAL AUTO_COUNT2:INTEGER RANGE 0 TO 100; --AUTO_COUNT1加到12500000 AUTO_COUNT2就加1,相当于一个AUTO_COUNT2就等于0.25s
SIGNAL TEMP_KEY_SW:STD_LOGIC_VECTOR(1 DOWNTO 0); --自动播放开关的临时变量
SIGNAL TEMP_KEY_AUTO: STD_LOGIC_VECTOR(7 DOWNTO 0); --按键临时变量,用于自动播放
SIGNAL TEMP_KEY: STD_LOGIC_VECTOR(7 DOWNTO 0); --按键临时变量,用于手动播放,即BTN的输入
BEGIN
P1:PROCESS(BTN,KEY_SW) --一直把BTN的值付给临时变量TEAM_KEY
BEGIN
TEMP_KEY <=BTN;
TEMP_KEY_SW <=KEY_SW;
END PROCESS P1;
P2:PROCESS(CLK,MUSIC_FRE) --对应音符分频
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF MUSIC_COUNT=MUSIC_FRE THEN --对于每个音符对应不同的分频比MUSIC_FRE