EDA课程设计乐曲硬件演奏电路资料Word格式.docx

上传人:b****1 文档编号:15365847 上传时间:2022-10-29 格式:DOCX 页数:12 大小:111.18KB
下载 相关 举报
EDA课程设计乐曲硬件演奏电路资料Word格式.docx_第1页
第1页 / 共12页
EDA课程设计乐曲硬件演奏电路资料Word格式.docx_第2页
第2页 / 共12页
EDA课程设计乐曲硬件演奏电路资料Word格式.docx_第3页
第3页 / 共12页
EDA课程设计乐曲硬件演奏电路资料Word格式.docx_第4页
第4页 / 共12页
EDA课程设计乐曲硬件演奏电路资料Word格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

EDA课程设计乐曲硬件演奏电路资料Word格式.docx

《EDA课程设计乐曲硬件演奏电路资料Word格式.docx》由会员分享,可在线阅读,更多相关《EDA课程设计乐曲硬件演奏电路资料Word格式.docx(12页珍藏版)》请在冰豆网上搜索。

EDA课程设计乐曲硬件演奏电路资料Word格式.docx

音名

频率/Hz

低音1

261.6

中音1

523.3

高音1

1045.5

低音2

293.7

中音2

587.3

高音2

1174.7

低音3

329.6

中音3

659.3

高音3

1318.5

低音4

349.2

中音4

698.5

高音4

1396.9

低音5

392

中音5

784

高音5

1568

低音6

440

中音6

880

高音6

1760

低音7

493.9

中音7

987.8

高音7

1975.5

(2)时长

这次设计中所演奏的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s的话,那么一拍所应该持续的时间为0.25秒,则只需要再提供一个4Hz的时钟频率即可产生四分音符的时长。

系统工作时就按4Hz的频率依次读取简谱,当系统读到某个音符的简谱时就对应发这个音符的音调,持续时间为0.25秒,如果在曲谱文件中某个音符为三拍音长,只要将该音符连续书写三遍,系统读乐曲文件的时候就会连续读到三次,也就会发三个0.25秒的音长,这时我们听上去就会持续了三拍的时间,这样就可以控制音乐的音长了。

二、设计方案

1.顶层实体描述

音乐播放器,是能够演奏一曲完整的乐曲,在外部时钟的作用下,产生相应频率的方波信号,即在乐曲中对应相应的音符。

并且信号要持续一定的时间,即对应乐曲中的节拍。

得到了音调和节拍后,就可以组成相应的乐曲了。

2.模块划分

采用“自顶向下”的设计方法,将音乐播放器模块主要划分为地址发生模块、数控分频模块、music模块和预置数模块。

(1)地址发生模块:

增地址计数器,用于产生地址数。

(2)music模块:

用于存储乐曲,本次设计,将《梁祝》的一段乐曲存储在rom中;

(3)预置数模块:

给分频器提供预置数,需要计算分频预置数;

(4)数控分频模块:

为了提供乐曲发音所需要的发音频率,编写数控分频器程序,对一输入高频信号,进行分频,生成每个音符发音的相应频率;

图1模块划分图

3.模块描述

(1)地址发生器

图2CNT138实体

地址发生器,即是一个计数器,由于存储了《梁祝》138个音符,所以此计数器的最大值为138。

(2)Music模块

Music模块存放乐曲的音符数据。

由地址发生器为music模块提供地址,每来一个时钟脉冲信号,8位二进制计数器就计数一次,ROM文件中的地址就随着递增,音符数据ROM中的音符也就一个接着一个连续的取出了。

图3rom实体

此计数器时钟频率为4Hz,每读一个数据,音符持续时间为0.25秒,恰为当全音符为1s,四四拍的四分音符持续的时间。

若需持续较长的时间,需要在ROM中连续写入相应的音符。

例如音符数据中的中音3为一拍,持续时间1秒,所以,音符数据ROM中需要连续写入四次音符3,随着4Hz时钟速率读取地址递增,音符数据ROM中的音符数据输出给分频预置数模块。

将从音符数据ROM中取出的值,通过q[3..0]端口输向分频预置数模块。

这样乐曲中的音符就可以连续的取出了。

(2)分频预置数模块

分频预置数模块是乐曲简谱码对应的分频预置数查表电路,提供了《梁祝》乐曲全部音符对应的分频预置数,即给数控分频器提供计数初值。

图4F_code实体

《梁祝》乐曲全部音符对应的分频预置数,共13个,此数在TN输入口停留时间即为此音符的节拍值。

这13个值的输出由对应于F_code的4位输入值INX[3..0]确定,而INX[3..0]最多有16种选择。

输向F_code中INX[3..0]的值在speaker中对应的输出频率值与持续时间由模块music决定。

(3)数控分频模块

音符的频率由数控分频模块获得,该计数器的模为2047,当计数器计满时,计数器产生溢出信号FOUT,此溢出信号就是作为发音的频率信号。

由分频预置数模块,提供的计数初值,可以产生对应的信号频率。

图5数控分频模块实体

其时钟输入信号为1MHz,模块对CLK输入信号的分频比由11位预置数TN[10..0]决定,FOUT的输出频率将决定每一个音符的音调,这样,分频计数器的预置值与输出频率就有了对应关系。

4.顶层电路图

图6顶层RTL电路图

图为顶层实体生成的RTL电路。

外部时钟信号由两路组成,一路为4Hz,接CNT138和rom模块,即在时钟信号作用下,存储在rom中的音乐被相应的取出给F_code模块,F_code模块经音符查找表,得到相应音符的分频预置数;

另一路时钟信号为1MHz,提供给speaker模块,用作分频时钟,由F_code得到的分频预置数,经数控分频后,输出相应频率的信号给蜂鸣器,便可连续播放音乐了。

三、方案实现

1.各模块仿真及描述

由图可以看出,地址数在4Hz时钟作用下进行累加。

(2)music模块

设置WIDTH=4,表示数据输出宽为4;

DEPTH=256,表示共有256个4位数据点。

在ROM中配置数据文件,编辑.mif文件。

初始化数据如下:

图8music存储文件

由地址发生器传入相应的地址,对应ROM中相应的音符数据,将音符连续地输出。

仿真时序如下:

从图中可以看出,随着地址的增加,ROM中存储的音符数据被连续地取出。

(3)分频预置数模块

从music模块传来相应音符的代码,对应本模块中的分频预置数。

(4)数控分频模块

若取出的音符为1,对应的分频预置数位773,输出FOUT的频率为,近似和表1中的值相等。

2.顶层电路仿真及描述

从图中可以看出,在rom中的音符,在4Hz的时钟频率下被连续地取出来,对应的数控分频模块,在1MHz的时钟频率下,输出对应音符的频率值。

四、硬件测试及说明

(1)引脚锁定

编译仿真无误后,进行硬件测试,首先进行引脚锁定及程序下载,引脚对应如下表:

(2)功能描述

enable是使能键,enable按下后,开始播放一段《梁祝》音乐,若按下reset键,则复位,音乐从新播放。

在播放音乐的同时,数码管会显示此时播放音乐对应的音符,若为高音,则在数码管上方红灯会亮,若为中音,则不亮。

若enable键未按下,则不能播放音乐。

五、结论

经过时序仿真,可以看出,在外部输入的两路时钟信号作用下,音符被相应的取出,对应的频率被数控分频器输出给蜂鸣器。

并进行硬件验证,可以较为完整地演奏《梁祝》乐曲。

六、课程总结

本次的课程设计基于FPGA的乐曲硬件演奏电路的设计,通过本次设计,我更加深入地了解了VHDL语言的应用。

在EDA“自顶向下”总的设计思想的指导下,将整个设计划分为3个主体模块,主要通过数控分频和定制LPM—ROM来完成相应的功能。

在这次课程设计中,主要通过查阅《EDA技术实用教程》教材,并通过在网上查阅相关的资料,逐步了解整个设计的过程,然后逐个完成划分的层次,最终完成了总体的设计。

期间,也遇到了一些问题,对数控分频,由于不能理解和音符频率的对应关系,所以对后续设计有所耽误。

不过后来通过查阅资料,结合相应的仿真,逐步了解了其原理。

在设计中,也逐渐熟悉了VHDL语言的编程方法。

七、附录

1.顶层实体模块

libraryieee;

useieee.std_logic_1164.all;

entityMusicMainis

port(clk1M,clk4H:

instd_logic;

reset:

enable:

CODE:

outstd_logic_vector(3downto0);

H:

outstd_logic;

spkout:

outstd_logic);

end;

architectureoneofMusicMainis

componentCNT138

port(clk:

address:

outstd_logic_vector(7downto0));

endcomponent;

componentromIS

PORT(address:

INSTD_LOGIC_VECTOR(7DOWNTO0);

clock:

INSTD_LOGIC:

='

1'

;

q:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDcomponent;

componentF_code

port(INX:

instd_logic_vector(3downto0);

CODE:

H:

TONE:

outstd_logic_vector(10downto0));

componentspeaker

PORT(CLK:

INSTD_LOGIC;

TN:

INSTD_LOGIC_VECTOR(10DOWNTO0);

FOUT:

OUTSTD_LOGIC);

signaladdressNum:

std_logic_vector(7downto0);

signaltone:

std_logic_vector(3downto0);

signaldivNum:

std_logic_vector(10downto0);

begin

u1:

CNT138portmap(clk=>

clk4H,address=>

addressNum,reset=>

reset,enable=>

enable);

u2:

romportmap(address=>

addressNum,clock=>

clk4H,q=>

tone);

u3:

F_codeportmap(INX=>

tone,TONE=>

divNum,CODE=>

CODE,H=>

H);

u4:

speakerportmap(clk=>

clk1M,TN=>

divNum,FOUT=>

spkout);

2.地址发生器

useieee.std_logic_unsigned.all;

entityCNT138is

instd_logi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1