北邮数电实验电子琴

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

. .. .

VHDL硬件描述语言程序设计简易电子琴演奏器

:chi

目录

一、设计课题的任务要求 (3)

二、系统设计 (4)

三、仿真波形及波形分析 (7)

四、源程序 (9)

五、功能说明 (20)

六、元器件清单及资源利用情况 (21)

七、故障及问题分析 (23)

八、总结和结论 (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的优势,

关于提高要求过一个拨码开关进行手动/自动演奏的切换,并与点阵显示配合增加自动演奏乐曲的功能,我打算将一首曲子的音符储存在自动播放的数组里面,然后通过计数器来顺序播放储存的音符。

关于提高要求中的手动演奏的音符存储、播放功能,我打算通过编程实现类似数据结构中队列的模块,来储存手动输入的音符,然后在要播放的时候,队列里面的音符依次出队,从而实现音符储存播放的功能。

2.总体框图

图3 简易电子琴总体结构框图

图4 简易电子琴逻辑流程图

图5 简易电子琴VHDL电路原理图

3.分块设计

(1)分频模块div0

由于实验电路板的主频是50Mhz,为了数码管和点阵的刷新显示,我们必须将50Mhz 的频率进行分频。分频的程序来自电路中心的上面。在这个模块里,我设置分频系数为

cnt=2499。从实验结果看,这个分频对数码管和点阵的显示有很好的效果

(2)数码管显示模块shuma

我使用了2个数码管,第一个数码管显示1~7的音符,第二个数码管显示相关的信息,比如高音用H表示,低音用L表示,自动播放用A表示。两个数码管分别刷新,但由于刷新频率太快,人眼不能察觉,以为是两个数码管是同时亮的。在程序中我们通过duan : out std_logic_vector(7 downto 0)和cat : out std_logic_vector(5 downto 0)来控制数码管的显示。当输入不同的音符和不同的控制信息时,duan和cat向量都有不同的值与之对应。

(3)8*8点阵显示模块dianzhen

8*8点阵的显示和数码管的显示运用了同样的原理,在程序中我们通过row : out

std_logic_vector(7 downto 0)和col : out std_logic_vector(7 downto 0)这两个向量来控制

点阵的显示。当输入不同的音符时,点阵显示相应的形状。

(4)音符产生模块auto。

这个模块的功能是,选择的不同模式来产生不同的音符。当选择自动播放模式时,随着计数器count的值增加,即地址值递增时,程序自动读取出事先储存的音符,并把这个音符输出。当选择手动演奏模式时,直接将通过BTN1~BTN7输入的向量当做音符输出yin :out

std_logic_vector(6 downto 0);。

(5)分频预置值产生模块

该模块的功能是通过音符以及高低音选项来查表找到对应的频率值。在程序中设置了全部音符对应的分频预置数。通过判断音符产生模块输出的音符yin :in std_logic_vector(6 downto 0),以及拨码开关的高低音highlow :in std_logic_vector(1 downto 0)控制键,来查找出该音符的频率值,然后将该频率赋值给tone :out integer range 0 to 2000000);。

(6)数控分频发声模块

从实验板上面输入的时钟是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]控制不同的数码管

相关文档
最新文档