电子技术课程设计
报告
课题:简易电子音乐设计
一、设计任务
1、设计一个具有 16 音的电子音乐播放器,对应低音 4→7,中
音 1→7,高音 1→5,按下任意一个键就发出对应的音。
2、具有自动播放的功能:预先存入一些曲谱,电路在 8Hz 的时
钟控制下自动播放,可通过修改存入的曲谱来改变音乐。
3、具有音符显示功能:显示当前所按下键(或自动播放)所对
应的音符,用 L 代表低音,中音不显示,H 代表高音。
二、设计要求
1、分析设计任务,拟定多种设计方案,根据实际情况选择最佳方
案绘制系统框图和设计流程。
2、设计各部分单元电路。
3、对电路进行仿真,生成仿真波形。
4、将所设计的电路下载到 Nanoboard 板上,在电路板上进行操
作,以检验设计设计的完整性和准确性。
5、总结设计各环节的资料,整理打印出设计报告(含原理电路、
仿真波形)。交验并演示设计制作的电路装置。
三、设计思路:
本简易电子音乐 16 个音,有简单的节拍,单纯用器件库里的元
件实现比较复杂,不便于仿真。本方案采用可编程逻辑器件实现,一
系列功能只要用硬件描述语言 VHDL 编写出程序,输出到开发软件
平台上自动生成需要的电路,所用时钟主频为 32MHZ。
按照自顶向下划分模块的设计思路,将电子音乐系统粗略地分
为以下五个模块:
1. 键盘处理电路:包括键盘扫描电路、键盘消抖电路和键盘译码模
块。键盘编码模块的主要功能是把键盘输入的 16 个键转换为相应的
音符信号(用 8 位二进制表示)。
2.自动演奏模块:通过控制端来选择演奏所存入的曲谱或从键盘输
入的曲谱,输出对应的音符。
3.音阶处理模块:音符的持续时间须根据乐曲的速度及每个音符的
节拍数决定,音阶处理模块是把输入的音符信号译码为相应的分频预
置值(以下称分频系数)送到数控分频电路处理,同时把对应的音符
送到显示端。
4.数控分频模块:功能是把输入的 clk(这里为 100KHZ) 时钟脉冲
进行相应的分频(每个分频系数对应一个频率,也即音符对应相应频
率)。
5.音阶显示模块:把音阶转换为相应的 ASCII 码,并且进行移位处理,
使得正在播放的音阶始终在同一位置显示,已显示的向左顺序移位
(设置 4 位)。
四.系统实现及描述
1.其硬件组成框图:
自动演奏模块
音阶处理处理
数控分频模块
音阶显示模块
键盘处理模块
硬件电子琴的基本组成框图如上图所示。它由音调发生器和数
控分频器组成。音调发生器实际上是一个音符查表电路,它的输入端
接琴键,内部电路是用VHDL中的CASE 语句(查表法) 设计的译码器。
当某个琴键按下时,译码器将其译码并输出与某音调对应的二进制数
据信号,此信号作为数控分频器的预置数据,将对输入时钟信号按要求
进行分频,使分频器输出的信频率与音调成正比,实现音乐的演奏。
2.系统下载总图
3.各部分功能的实现
(1).键盘扫描模块
COL_IN[3..0] 为 键 盘 扫 描 码 的 输 入 端 , 扫 描 码 为
1110->1101->1011->0111->1110 如此循环扫描
当无按键按下时,ROW_OUT[3..0]输出为 1111
当扫描码为 1110 时
按下键值“1”,ROW_OUT[3..0]输出为 1110;反过来,输出 1110 则表示
按下键值 1;
按下键值“2”,ROW_OUT[3..0]输出为 1101;反过来,输出 1110 则表示
按下键值 2;
按下键值“3”,ROW_OUT[3..0]输出为 1011;反过来,输出 1110 则表示
按下键值 3;
按下键值“C”,ROW_OUT[3..0]]输出为 0111;反过来,输出 1110 则表
示按下键值 C;
按下其他键时,ROW_OUT[3..0]]输出为 1111;
当扫描 1101->1011->0111->1110 时同理。
我们按下键总会停留超过 20ms 的时间,所以键盘扫描码的周期应该小于 20ms,
即当我们按下键的时候,能够扫描到按键。因此在此建议用 1000Hz 的扫描频率。
CLK:键盘扫描时钟;
COL_IN 和 ROW_OUT 为键盘行列;
KEY_NUM 为键盘输出值。
VHDL程序描述:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity KEY_SCAN is
Port ( CLK : in STD_LOGIC;
COL_IN : in STD_LOGIC_VECTOR(3 DOWNTO 0);
ROW_OUT : out STD_LOGIC_VECTOR(3 DOWNTO 0);
KEY_NUM:out STD_LOGIC_VECTOR(3 DOWNTO 0));
end KEY_SCAN;
architecture Behavioral of KEY_SCAN is
SIGNAL ROW_TEMP:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL KEY_NUM_TEMP:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL SCAN_SIGNAL:STD_LOGIC_VECTOR(7 DOWNTO 0);
评论0