北邮数字电路实验报告-电子琴
北京邮电大学
数字电路实验报告简易电子琴的设计与实现
班级:2010211204
姓名:罗润文
学号:10210993
班内序号:13
2012.11.10
目录
一.实验介绍 (2)
1.实验目的 (2)
2.实验所用仪器及元器件 (2)
3.实验内容 (2)
基本内容 (2)
提高要求 (3)
4.实验原理 (3)
二.实验设计与实现 (4)
1.实验思路 (4)
2.程序设计 (5)
顶层实体代码: (6)
音调模块主要代码: (7)
点阵显示模块主要代码: (8)
分频模块主要代码: (9)
3.仿真波形及分析 (9)
数码管显示波形图: (10)
点阵显示波形图: (11)
清零信号显示波形图: (12)
输出频率spkout的波形图: (13)
三.故障及问题分析 (13)
四.实验总结 (14)
一.实验介绍
1.实验目的
(1)进一步掌握VHDL和Quartus II软件的使用;
(2)理解状态机的工作原理和设计方法;
(3)掌握利用EDA工具进行自顶向下的电子系统设计方法。
2.实验所用仪器及元器件
(1)计算机;
(2)EDA开发板及相应元器件。
3.实验内容
基本内容
1.用8×8点阵显示“1 2 3 4 5 6 7”七个音符构成的电子琴键盘。其中点阵的第一列用一个LED点亮表示音符“1”,第二列用二个LED点亮表示音符“2”,依此类推,如下图所示:
2.用BTN1~BTN7七个按键模拟电子琴手动演奏时的“1 2 3 4 5 6 7”七个音符。当某个按键按下时,数码管显示相应的音符,点阵上与之对应的音符显示列全灭,同时蜂鸣器演奏相应的声音;当按键弹开时数码管显示的音符灭掉,点阵显示恢复,蜂鸣器停止声音的输出。下图所示为按下BTN3按键时点阵的显示情况:
3. 由拨码开关切换选择高、中、低音,并用数码管进行相应的显示。
4.通过按键BTN0进行复位,控制点阵显示图1的初始状态。
提高要求
1.可通过一个拨码开关进行手动/自动演奏的切换,并与点阵显示配合增加自动演奏乐曲的功能。
2.增加手动演奏的音符存储、播放功能。
4.实验原理
根据声乐知识,产生音乐的两个因素是音乐频率的持续时间,音乐的十二平均率规定,每两个八音度之间的频率相差一倍,在两个八音度之间,又可分为12个半音。每两个半音的频率比为4。另外,音名A(乐谱中的低音6)的频率为440HZ,音名B到C之间,E到F 之间为半音,其余为全音。由此可以计算出乐谱中从低音1到高音1之间每个音名的频率如
实验板原始时钟信号为50MHZ,可通过程序中不同的分频系数使
率的输出,输出由多模计数器产生。
多模计数器:M(模)=50000/f,其中f为各个音阶的频率。
将分频后的频率对应实验板上的蜂鸣器接口,就能触发蜂鸣器发出对应音阶的
频率。
二.实验设计与实现
1.实验思路
根据实验要求画出逻辑流程图如下:
简要设计思路及实现过程:
通过按下BTN1-BTN7七个按钮,结合拨码开关状态(高中低),将实验板上的原始时钟信号50MHZ进行21种不同的分频。分频系数M=50M/f,其中f为各个音阶的频率。然后此分频系数作为计数器的模输入到分频模块中,分频模块以50MHZ作为输入频率,M作为分频系数,则输出频率f o=50M/M=f,即可输出相应的音阶频率使扬声器发生对应频率的声音。其中每次分频后的信号要进行一次翻转使得输出占空比为50%。至此主要的音调产生模块应经完成,剩下的诸如点阵显示、数码管显示模块、拨码开关控制模块等只需逐一完善即可。
根据设计思路画出模块框图:
2.程序设计
根据以上模块框图,按照自顶向下的电子系统设计方法,进行分模块程序设计。
顶层实体代码:
定义顶层实体名为piano,顶层实体输入包括50MHZ原始时钟信号clk50m、7个按键输入index、控制档位的三个拨码开关switch0、点阵清零输入clr,顶层输出包括输给蜂鸣器的频率spkout、点阵显示的行列端口a和b、控制数码管的数码管选通信号cat及sege1。3个子模块各自的端口详见上一页的模块框图。最后将个端口连接起来即完成顶层实体的设计。
音调模块主要代码:
音调模块的端口tin与按键输入index相连,switch1为开关控制,tout为输入给分频模块的
分频系数,先判断档位,然后根据tout=50M/f得到对应频率的分频系数。
点阵显示模块主要代码:
先将50MHZ信号十分频,然后用一个000到110逐一变化的计数变量控制7个按键按下对应的点阵显示情况。
分频模块主要代码:
spkin与音调模块的tout相连,即spkin=tout,然后将50MHZ时钟信号按分频系数等于spkin 进行分频,得输出频率f o=50M/spkin=50M/tout=50M/(50M/f)=f,即可输出对应音调频率。
3.仿真波形及分析
由于有七个按键输入,再加上3个档位,如果全部21种状态全部放在一张仿真图中分析会很麻烦,因此选择单一状态进行逐一分析。这里选择高档位且按下最高音符按键的状态进行仿真,输出频率为高音7的频率1975.52HZ。以下截图均为该状态下的波形图。
(从上至下依次为a[0]~a[7]、b[0]~b[7]、cat[0]~cat[5]、cl50m、clr、index[0]~index[6]、sige[0]~sige[6]、spkout、switch0[0]~switch0[2])可以看出数码管选通控制信号cat为111110,sige信号为1111001,即表示在最右边的数码管显示“3”。
(从上至下依次为a[0]~a[7]、b[0]~b[7]、cat[0]~cat[5]、cl50m、clr、index[0]~index[6]、sige[0]~sige[6]、spkout、switch0[0]~switch0[2])a[0]~a[7]对应实验板上点阵的8列,b[0]~b[7]对应实验板上的8行。由波形图可分析出点阵从左至右6列依次显示1至6个点,最右边两列不显示。符合按下按键7(最高音符)时的要求。
清零信号显示波形图:
(从上至下依次为a[0]~a[7]、b[0]~b[7]、cat[0]~cat[5]、cl50m、clr、index[0]~index[6]、sige[0]~sige[6]、spkout、switch0[0]~switch0[2])从clr的波形可看出当clr=1是有点阵显示,当clr=0是点阵无显示。
输出频率spkout的波形图:
(从上至下依次为a[0]~a[7]、b[0]~b[7]、cat[0]~cat[5]、cl50m、clr、index[0]~index[6]、sige[0]~sige[6]、spkout、switch0[0]~switch0[2])这里选择输入时钟clk50m的周期为100ns,即频率为107HZ,由于高音8的频率为1975.52HZ,则理论上得到spkout的波形图上的频率f s/1975.52=107/(50X106),算出理论上spkout在波形图上的频率为f s=39.5104,即在波形图上的周期T s=2.531ms。读出波形图上输出信号spkout的信号周期为2.53ms,此周期与计算的周期相吻合。
三.故障及问题分析
(1)由于较长时间没有接触过VHDL,程序编译时总是编译不过去,在细心研究了报错及向同学请教后,终于将程序按照框图编写完成并顺利通过编译。
(2)一开始以为要将原始50MHZ先分频再做,因此在代码加了1000分频模块,出来50KHZ 的信号。但这种情况下每次得到的多模计数器的模比较小(小于100),导致音节之间的对应模的间隔很小,只相差3左右,几乎不能分辨出来。导致最后输出的频率与要求的音阶频
率相差较大,只能发出噪音。
(3)按下按键能够发出对应的音符,但是没按下时也会发出不明的噪音。分析得出可能是板子的问题,换了几块都还是这样,最后将输出的高低电平互换就解决问题了。
(4)点阵总是无法按要求显示出来,请教了同学都一致认为代码是没有错误的。再仔细分析了管脚设置以及程序上的代码后才解决了问题。
(5)还有其他诸如仿真结果不正确、程序下载不成功等问题也是经过了自己耐心细致的分析并一次次尝试着解决,并且多多和同学讨论,多跟老师沟通,总是能解决问题的。(6)至于提高要求部分,由于时间及精力有限,就没有加自动播放模块进去。
四.实验总结
本次数电综合实验要求对VHDL语言、QuartusII软件以及对EDA工具的掌握较熟练,对于综合素质要求较高,必须要有充足的知识储备和清晰的EDA设计思路。
因此一开始接触到题目的时候感觉无从下手,但在老师的细致讲解后先画出了逻辑设计流程图、状态转移图、模块划分框图等。这样就有了头绪,并且积极上图书馆查阅资料以及上网搜索设计方法,和做同一题目的同学进行讨论,逐渐将设计思路呈现出来并画出了设计框图。有了关键的设计框图剩下就是一步步地编写代码实现了。
虽然实现过程充满了曲折,遇到故障也是常有的,难免会有灰心丧气的时候。但是只要保持清晰的思路、自信的心态、积极的态度,就能够将这些问题都迎刃而解。
通过这次实验我也领悟到了科学道路上向来不是一帆风顺的,通往理想和光明的过程充满了荆棘,所要做的是运用最有用的工具——大脑披荆斩棘,开辟出前行的道路,并且要借助一定的同伴及前辈的力量,所谓站在巨人的肩膀上才能看得更远。