数电实验报告.docx
- 文档编号:14314857
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:18
- 大小:93.92KB
数电实验报告.docx
《数电实验报告.docx》由会员分享,可在线阅读,更多相关《数电实验报告.docx(18页珍藏版)》请在冰点文库上搜索。
数电实验报告
北京邮电大学
数字电路与逻辑设计实验
简易电子琴演奏器
班级:
学号:
姓名:
一.设计课题的任务要求
题目五简易电子琴演奏器
原理概述:
根据声乐知识,产生音乐的两个因素是音乐频率的持续时间,音乐的十二平均率规定,每两个八音度之间的频率相差一倍,在两个八音度之间,又可分为12个半音。
每两个半音的频率比为4。
另外,音名A(乐谱中的低音6)的频率为440HZ,音名B到C之间,E到F之间为半音,其余为全音。
由此可以计算出乐谱中从低音1到高音1之间每个音名的频率如下表所示。
表1简谱中的音名与频率的关系
音名
频率(Hz)
音名
频率(Hz)
音名
频率(Hz)
低音1
261.63
中音1
523.25
高音1
1046.50
低音2
293.67
中音2
587.33
高音2
1174.66
低音3
329.63
中音3
659.25
高音3
1381.51
低音4
349.23
中音4
698.46
高音4
1396.92
低音5
391.99
中音5
783.99
高音5
1567.98
低音6
440
中音6
880
高音6
1760
低音7
439.88
中音7
987.76
高音7
1975.52
基本要求:
1、用8×8点阵显示“1234567”七个音符构成的电子琴键盘。
其中点阵的第一列用一个LED点亮表示音符“1”,第二列用二个LED点亮表示音符“2”,依此类推,如下图所示。
图1点阵显示的电子琴键盘
2、用BTN1~BTN7七个按键模拟电子琴手动演奏时的“1234567”七个音符。
当某个按键按下时,数码管显示相应的音符,点阵上与之对应的音符显示列全灭,同时蜂鸣器演奏相应的声音;当按键弹开时数码管显示的音符灭掉,点阵显示恢复,蜂鸣器停止声音的输出。
下图所示为按下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’。
列显示基本正常。
数码管情况类似。
四、源程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYmusicIS
PORT(
CAT:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);--六个数码管
DIGITAL:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);--七小段数码管
CLK:
INSTD_LOGIC;
BTN:
INSTD_LOGIC_VECTOR(7DOWNTO0);--8个按键
LED_R:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);--点阵横着的8个管教
LED_C:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);--点阵竖着的8个管脚
BEEP:
OUTSTD_LOGIC;--蜂鸣器
KEY_SW:
INSTD_LOGIC_VECTOR(1DOWNTO0);--选择低、中、高音
AUTO_SW:
INSTD_LOGIC--自动播放开关
);
ENDmusic;
ARCHITECTUREmusic_bodyOFmusicIS
SIGNALTEMP_CAT:
STD_LOGIC_VECTOR(5DOWNTO0);--六个数码管
SIGNALTEMP_DIGITAL:
STD_LOGIC_VECTOR(6DOWNTO0);--七小段数码管
SIGNALTEMP_R:
STD_LOGIC_VECTOR(7DOWNTO0);--点阵横列
SIGNALTEMP_C:
STD_LOGIC_VECTOR(7DOWNTO0);--点阵数列
SIGNALLED_CLK:
STD_LOGIC;
SIGNALLED_COUNT:
INTEGERRANGE0TO100;--点阵分频时用来计数
SIGNALMUSIC_COUNT:
INTEGERRANGE0TO200000;--音符分频时用来计数
SIGNALMUSIC_FRE:
INTEGERRANGE0TO200000;--音符分频比
SIGNALAUTO_COUNT1:
INTEGERRANGE0TO12500000;--50M除以12500000就等于4HZ
SIGNALAUTO_COUNT2:
INTEGERRANGE0TO100;--AUTO_COUNT1加到12500000AUTO_COUNT2就加1,相当于一个AUTO_COUNT2就等于0.25s
SIGNALTEMP_KEY_SW:
STD_LOGIC_VECTOR(1DOWNTO0);--自动播放开关的临时变量
SIGNALTEMP_KEY_AUTO:
STD_LOGIC_VECTOR(7DOWNTO0);--按键临时变量,用于自动播放
SIGNALTEMP_KEY:
STD_LOGIC_VECTOR(7DOWNTO0);--按键临时变量,用于手动播放,即BTN的输入
BEGIN
P1:
PROCESS(BTN,KEY_SW)--一直把BTN的值付给临时变量TEAM_KEY
BEGIN
TEMP_KEY<=BTN;
TEMP_KEY_SW<=KEY_SW;
ENDPROCESSP1;
P2:
PROCESS(CLK,MUSIC_FRE)--对应音符分频
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFMUSIC_COUNT=MUSIC_FRETHEN--对于每个音符对应不同的分频比MUSIC_FRE
MUSIC_COUNT<=0;
ELSE
MUSIC_COUNT<=MUSIC_COUNT+1;
ENDIF;
ENDIF;
ENDPROCESSP2;
P3:
PROCESS(MUSIC_COUNT,MUSIC_FRE)--经测试需要再把频率二分频一下,实验书上的频率不准,当达到此频率时蜂鸣器响
BEGIN
IFMUSIC_COUNT<=MUSIC_FRE/2THEN
BEEP<='0';
ELSE
BEEP<='1';
ENDIF;
ENDPROCESSP3;
P4:
PROCESS(CLK)--点阵分频进程,点阵扫描频率为250000HZ
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
IFLED_COUNT=100THEN
LED_COUNT<=0;
LED_CLK<=NOTLED_CLK;
ELSE
LED_COUNT<=LED_COUNT+1;
ENDIF;
ENDIF;
ENDPROCESSP4;
P5:
PROCESS(LED_CLK)--点阵循环扫描
BEGIN
IFLED_CLK'EVENTANDLED_CLK='1'THEN
CASETEMP_CIS
WHEN"00000001"=>TEMP_C<="00000010";
WHEN"00000010"=>TEMP_C<="00000100";
WHEN"00000100"=>TEMP_C<="00001000";
WHEN"00001000"=>TEMP_C<="00010000";
WHEN"00010000"=>TEMP_C<="00100000";
WHEN"00100000"=>TEMP_C<="01000000";
WHENOTHERS=>TEMP_C<="00000001";
ENDCASE;
ENDIF;
ENDPROCESSP5;
P6:
PROCESS(TEMP_C,TEMP_KEY,TEMP_KEY_AUTO,TEMP_KEY_SW)--对不同按键及高低音的不同的反应
VARIABLETEMP_FRE:
INTEGERRANGE0TO200000;
BEGIN
CASETEMP_KEY_SWIS--切换低、中、高音
WHEN"00"=>MUSIC_FRE<=TEMP_FRE*2;--低
WHEN"10"=>MUSIC_FRE<=TEMP_FRE/2;--高
WHENOTHERS=>MUSIC_FRE<=TEMP_FRE;--中
ENDCASE;
CASETEMP_CIS
WHEN"00000001"=>TEMP_R<="11111110";--点阵第一列亮
WHEN"00000010"=>TEMP_R<="11111100";--点阵第二列亮
WHEN"00000100"=>TEMP_R<="11111000";--点阵第三列亮
WHEN"00001000"=>TEMP_R<="11110000";--点阵第四列亮
WHEN"00010000"=>TEMP_R<="11100000";--点阵第五列亮
WHEN"00100000"=>TEMP_R<="11000000";--点阵第六列亮
WHENOTHERS=>TEMP_R<="10000000";--点阵第七列亮
ENDCASE;
IF(AUTO_SW='1')THEN--这个if语句块和下面一个语句块,一个用于自动播放,一个用于手动
CASETEMP_KEY_AUTOIS
WHEN"00000010"=>TEMP_FRE:
=95557;IFTEMP_C="00000001"THENTEMP_R<="11111111";ENDIF;
WHEN"00000100"=>TEMP_FRE:
=85131;IFTEMP_C="00000010"THENTEMP_R<="11111111";ENDIF;
WHEN"00001000"=>TEMP_FRE:
=75844;IFTEMP_C="00000100"THENTEMP_R<="11111111";ENDIF;
WHEN"00010000"=>TEMP_FRE:
=71586;IFTEMP_C="00001000"THENTEMP_R<="11111111";ENDIF;
WHEN"00100000"=>TEMP_FRE:
=63776;IFTEMP_C="00010000"THENTEMP_R<="11111111";ENDIF;
WHEN"01000000"=>TEMP_FRE:
=56818;IFTEMP_C="00100000"THENTEMP_R<="11111111";ENDIF;
WHEN"10000000"=>TEMP_FRE:
=50620;IFTEMP_C="01000000"THENTEMP_R<="11111111";ENDIF;
WHENOTHERS=>TEMP_FRE:
=0;
ENDCASE;
ENDIF;
IF(AUTO_SW='0')THEN
CASETEMP_KEYIS
WHEN"00000010"=>TEMP_FRE:
=95557;IFTEMP_C="00000001"THENTEMP_R<="11111111";ENDIF;--当按BTN1时跳过第一列,及第一列不亮
WHEN"00000100"=>TEMP_FRE:
=85131;IFTEMP_C="00000010"THENTEMP_R<="11111111";ENDIF;--当按BTN1时跳过第二列,及第二列不亮
WHEN"00001000"=>TEMP_FRE:
=75844;IFTEMP_C="00000100"THENTEMP_R<="11111111";ENDIF;--当按BTN1时跳过第三列,及第三列不亮
WHEN"00010000"=>TEMP_FRE:
=71586;IFTEMP_C="00001000"THENTEMP_R<="11111111";ENDIF;--当按BTN1时跳过第四列,及第四列不亮
WHEN"00100000"=>TEMP_FRE:
=63776;IFTEMP_C="00010000"THENTEMP_R<="11111111";ENDIF;--当按BTN1时跳过第五列,及第五列不亮
WHEN"01000000"=>TEMP_FRE:
=56818;IFTEMP_C="00100000"THENTEMP_R<="11111111";ENDIF;--当按BTN1时跳过第六列,及第六列不亮
WHEN"10000000"=>TEMP_FRE:
=50620;IFTEMP_C="01000000"THENTEMP_R<="11111111";ENDIF;--当按BTN1时跳过第七列,及第七列不亮
WHENOTHERS=>TEMP_FRE:
=0;--当没按键时全部都不亮
ENDCASE;
ENDIF;
ENDPROCESSP6;
P7:
PROCESS(TEMP_KEY,KEY_SW)--数码管显示进程
BEGIN
CASETEMP_KEY_SWIS
WHEN"00"=>TEMP_CAT<="111110";--低音CAT0接通
WHEN"10"=>TEMP_CAT<="111000";--高音CAT0,CAT1,CAT2都接通
WHENOTHERS=>TEMP_CAT<="111100";--中音CAT0,CAT1接通
ENDCASE;
CASETEMP_KEYIS
WHEN"00000000"=>TEMP_DIGITAL<="0000000";--不按键不显示
WHEN"00000001"=>TEMP_DIGITAL<="0000000";
WHEN"00000010"=>TEMP_DIGITAL<="0110000";--按BTN1键显示1
WHEN"00000100"=>TEMP_DIGITAL<="1101101";--按BTN2键显示2
WHEN"00001000"=>TEMP_DIGITAL<="1111001";--按BTN3键显示3
WHEN"00010000"=>TEMP_DIGITAL<="0110011";--按BTN4键显示4
WHEN"00100000"=>TEMP_DIGITAL<="1011011";--按BTN5键显示5
WHEN"01000000"=>TEMP_DIGITAL<="1011111";--按BTN6键显示6
WHENOTHERS=>TEMP_DIGITAL<="1110000";--按BTN7键显示7
ENDCASE;
ENDPROCESSP7;
P8:
PROCESS(CLK,AUTO_SW)--自动播放分频
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
IFAUTO_COUNT1=12500000THEN
AUTO_COUNT1<=0;
AUTO_COUNT2<=AUTO_COUNT2+1;
ELSE
AUTO_COUNT1<=AUTO_COUNT1+1;
ENDIF;
IFAUTO_COUNT2=60THEN
AUTO_COUNT2<=0;
ENDIF;
ENDIF;
IF(AUTO_SW='0')THEN--只要是手动播放就把AUTO_COUNT2赋为0
AUTO_COUNT2<=0;
ENDIF;
ENDPROCESSP8;
P9:
PROCESS(AUTO_SW,AUTO_COUNT2)
BEGIN
IF(AUTO_SW='1')THEN
CASEAUTO_COUNT2IS
WHEN1=>TEMP_KEY_AUTO<="00000010";--yinfu1
WHEN2=>TEMP_KEY_AUTO<="00000010";--yinfu1
WHEN3=>TEMP_KEY_AUTO<="00000100";--yinfu2
WHEN4=>TEMP_KEY_AUTO<="00000100";--yinfu2
WHEN5=>TEMP_KEY_AUTO<="00001000";--yinfu3
WHEN6=>TEMP_KEY_AUTO<="00001000";--yinfu3
WHEN7=>TEMP_KEY_AUTO<="00000010";--yinfu1
WHEN8=>TEMP_KEY_AUTO<="00000010";--yinfu1
WHEN9=>TEMP_KEY_AUTO<="00000010";--yinfu1
WHEN10=>TEMP_KEY_AUTO<="00000010";--yinfu1
WHEN11=>TEMP_KEY_AUTO<="00000100";--yinfu2
WHEN12=>TEMP_KEY_AUTO<="00000100";--yinfu2
WHEN13=>TEMP_KEY_AUTO<="00001000";--yinfu3
WHEN14=>TEMP_KEY_AUTO<="00001000";--yinfu3
WHEN15=>TEMP_KEY_AUTO<="00000010";--yinfu1
WHEN16=>TEMP_KEY_AUTO<="00000010";--yinfu1
WHEN17=>TEMP_KEY_AUTO<="00001000";--yinfu3
WHEN18=>TEMP_KEY_AUTO<="00001000";--yinfu3
WHEN19=>TEMP_KEY_AUTO<="00010000";--yinfu4
WHEN20=>TEMP_KEY_AUTO<="00010000";--yinfu4
WHEN21=>TEMP_KEY_AUTO<="00100000";--yinfu5
WHEN22=>TEMP_KEY_AUTO<="00100000";--yinfu5
WHEN23=>TEMP_KEY_AUTO<="00001000";--yinfu3
WHEN24=>TEMP_KEY_AUTO<="00001000";--yinfu3
WHEN25=>TEMP_KEY_AUTO<="00010000";--yinfu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告