乐曲硬件演奏电路设计.docx

上传人:b****1 文档编号:2062914 上传时间:2023-05-02 格式:DOCX 页数:23 大小:310.99KB
下载 相关 举报
乐曲硬件演奏电路设计.docx_第1页
第1页 / 共23页
乐曲硬件演奏电路设计.docx_第2页
第2页 / 共23页
乐曲硬件演奏电路设计.docx_第3页
第3页 / 共23页
乐曲硬件演奏电路设计.docx_第4页
第4页 / 共23页
乐曲硬件演奏电路设计.docx_第5页
第5页 / 共23页
乐曲硬件演奏电路设计.docx_第6页
第6页 / 共23页
乐曲硬件演奏电路设计.docx_第7页
第7页 / 共23页
乐曲硬件演奏电路设计.docx_第8页
第8页 / 共23页
乐曲硬件演奏电路设计.docx_第9页
第9页 / 共23页
乐曲硬件演奏电路设计.docx_第10页
第10页 / 共23页
乐曲硬件演奏电路设计.docx_第11页
第11页 / 共23页
乐曲硬件演奏电路设计.docx_第12页
第12页 / 共23页
乐曲硬件演奏电路设计.docx_第13页
第13页 / 共23页
乐曲硬件演奏电路设计.docx_第14页
第14页 / 共23页
乐曲硬件演奏电路设计.docx_第15页
第15页 / 共23页
乐曲硬件演奏电路设计.docx_第16页
第16页 / 共23页
乐曲硬件演奏电路设计.docx_第17页
第17页 / 共23页
乐曲硬件演奏电路设计.docx_第18页
第18页 / 共23页
乐曲硬件演奏电路设计.docx_第19页
第19页 / 共23页
乐曲硬件演奏电路设计.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

乐曲硬件演奏电路设计.docx

《乐曲硬件演奏电路设计.docx》由会员分享,可在线阅读,更多相关《乐曲硬件演奏电路设计.docx(23页珍藏版)》请在冰点文库上搜索。

乐曲硬件演奏电路设计.docx

乐曲硬件演奏电路设计

EDA技术与VHDL语言课程大作业

 

设计题目:

乐曲硬件演奏电路设计

姓  名:

       

班  级:

 

学  号:

     

 

目录

一.设计背景……………………………………………1

二.设计原理……………………………………………1

1.乐曲硬件演奏电路基本原理……………………1

2.计时模块系统模块组成……………………….2

3.设计框图及仪器……………………………….3

三.设计内容……………………………………………3

1.分频器(div)…………………………………4

2.计数器(notetabs)…………………………5

3.选择模块(choice)…………………………5

4.数据翻译模块(tontaba)……………………7

5.译码器模块(deled)…………………………8

6.数控分频器模块(speakera)………………9

7.乐谱数据(ROM)……………………………10

四.硬件连线…………………………………………12

五.源程序总体描述…………………………………13

六.总结………………………………………………14

七.参考文献……………………………………………14

一、设计背景

乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智能仪器仪表设备。

实现方法有许多种,在众多的实现方法中,以纯硬件完成乐曲演奏,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。

如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。

使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。

FPGA预装了很多已构造好的参数化库单元LPM器件。

通过引入支持LPM的EDA软件工具,可以设计出结构独立而且硅片的使用效率非常高的产品。

本文分析了乐曲演奏设计中音符、频率、节拍与编码的相互关系,并在EDA开发工具MAX-plusII平台上,采用VHDL语言及原理图的设计方法,实现了基于FPGA片上系统动态显示可选择多首乐曲的乐曲演奏器的设计,使乐曲演奏数字电路的设计得到了更好的优化,提高了设计的灵活性。

二、实验原理

1、音乐硬件演奏电路基本原理

1)硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。

乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。

乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。

而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。

2)音符频率的获得

多个不同频率的信号可通过对某个基准频率进行分频器获得。

由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。

若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。

若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。

实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。

本设计中选取1MHz的基准频率。

数控分频器采用12位二进制计数器,乐曲中的休止符,只要将分频系数设为0,即初始值=4095,此时扬声器不会发声。

根据分频系数,可计算数控分频器得到的初始值。

(语言已经无法描述其中的原理了,程序可以说明此问题,关于初始值的解释,请看下文给出的程序)

初始值的计算公式如下:

由于所设计的数控分频计采用12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数变化的脉冲信号。

由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声,故最终输出信号的频率与预置数的关系如下:

其中

为音阶对应的频率。

 

表1简谱中的音名与频率的关系

音名

频率/Hz

音名

频率/Hz

音名

频率/Hz

低音1

261.63

中音1

532.25

高音1

1046.50

低音2

293.67

中音2

587.33

高音2

1174.66

低音3

329.63

中音3

659.25

高音3

1318.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

493.88

中音7

987.76

高音7

1975.52

表2各音阶频率对应的分频值

音名

分频系数

初始值

音名

分频系数

初始值

音名

分频系数

初始值

低音1

7644

547

中音1

3822

4369

高音1

1911

6280

低音2

6810

1381

中音2

3405

4786

高音2

1270

6921

低音3

6067

2124

中音3

3034

5157

高音3

1517

6674

低音4

5727

2464

中音4

2864

5327

高音4

1432

6759

低音5

5102

3089

中音5

2551

5640

高音5

1256

6935

低音6

4545

3646

中音6

2273

5918

高音6

1137

7054

低音7

4050

4141

中音7

2025

6166

高音7

1013

7178

3)乐曲节奏的控制

一般乐曲最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要输出4Hz的1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。

计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低,由于最后的蜂鸣器前需加一个二分频的程序,因此计数器的时钟信号应为4Hz的2倍,即8Hz。

4)乐谱的发生

本设计将乐谱中的音符数据存储在LPM-ROM中,若某音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,该音符就要在LPM-ROM中连续的四个地址上都存储。

当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。

5)选择模块

选择模块将用一个4位数的控制信号控制乐谱模块数据的选择性,用vhdl语言描述比较简单,不在此详述。

6)译码器等其他模块

译码器等模块在以前做实验的时候做过,且原理比较简单易懂,不再这里阐述。

2、模块组成—7个:

1)分频器div的功能是将芯片上提供的50MHz的时钟分频为12MHz和8Hz的时钟,分别供计数器与分频驱动器(数控分频器)使用。

2)计数器NOTETABS完成计数功能,每个时钟沿加一。

3)选择器choice完成选择歌曲的功能。

4)数据翻译模块tontaba将选择器所选择的歌曲rom里的地址的数据翻译成分频驱动器(数控分频器)分频所需的控制数据、3个led灯数据(高中低音)、以及译码器所需的数据。

5)译码器deled将乐谱数据在led数码管上显示。

6)数控分频器speakera,完成分频的功能,并驱动蜂鸣器。

7)四个音乐模块ROM。

根据上一模块计数器所计的数读取相应地址里的数据传递给下一模块。

3、设计框图及仪器

1)设计框图

2)仪器:

PC机一台;开发软件:

QuartusII;实验设备:

GW48-CKEDA实验开发系统;选用芯片:

ACEX1K系列EP1K30TC144-3

三、实验内容与步骤 

    1.分频器(div)

将芯片上提供的50MHz的时钟分频为12MHz和8Hz的时钟,分别供计数器与分频驱动器(数控分频器)使用。

(1)模块图形:

(2)程序如下:

LIBRARYieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

ENTITYdivIS

PORT(

clk:

INSTD_LOGIC;

CLK12MHz,CLK8Hz:

OUTstd_logic);

ENDdiv;

ARCHITECTUREoneofdivis

begin

nana:

process(clk)

variablecnt:

integerrange0to2;

variabletmp:

std_logic;

begin

if(clk'eventandclk='1')then

ifcnt>=1then

cnt:

=0;

tmp:

=nottmp;

else

cnt:

=cnt+1;

endif;

endif;

CLK12MHz<=tmp;

endprocessnana;

nbnb:

process(clk)

variablecnt:

integerrange0to3125000;

variabletmp:

std_logic;

begin

if(clk'eventandclk='1')then

ifcnt>=3124999then

cnt:

=0;

tmp:

=nottmp;

else

cnt:

=cnt+1;

endif;

endif;

CLK8Hz<=tmp;

endprocessnbnb;

endone;

(3)仿真波形:

 

2.计数器(notetabs)

(1)模块图像:

(2)程序如下:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYNOTETABSIS

PORT(CLK:

INSTD_LOGIC;

COUNTER1:

inoutSTD_LOGIC_vector(7downto0));

ENDNOTETABS;

ARCHITECTUREaOFNOTeTABsIS

BEGIN

P1:

PROCESS(CLK,COUNTER1)

BEGIN

IFCOUNTER1=183THEN

COUNTER1<="00000000";

ELSIFCLK'EVENTANDCLK='1'THEN

COUNTER1<=COUNTER1+1;

ENDIF;

ENDPROCESS;

ENDa;

(3)

仿真波形:

3.选择模块(choice)

选择器完成选择歌曲的功能。

当a的信号为0001时将Q1的信号输出

为0011时将Q2的信号输出

为0010时将Q3的信号输出

为0110时将Q4的信号输出

(1)

模块图像:

(2)程序如下:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYchoiceIS

PORT(a:

INSTD_LOGIC_vector(3downto0);

b:

outSTD_LOGIC_vector(3downto0);

INDEX:

OUTSTD_LOGIC_vector(4downto0);

Q1:

INSTD_LOGIC_vector(4downto0);

Q2:

INSTD_LOGIC_vector(4downto0);

Q3:

INSTD_LOGIC_vector(4downto0);

Q4:

INSTD_LOGIC_vector(4downto0));

ENDchoice;

ARCHITECTUREaOFchoiceIS

BEGIN

PROCESS(a,Q1,Q2,Q3,Q4)

BEGIN

CASEaIS

WHEN"0001"=>

b<="0001";

INDEX<=Q1;

WHEN"0011"=>

b<="0010";

INDEX<=Q2;

WHEN"0010"=>

b<="0011";

INDEX<=Q3;

WHEN"0110"=>

b<="0100";

INDEX<=Q4;

WHENOTHERS=>

null;

ENDCASE;

ENDPROCESS;

ENDa;

(3)

仿真波形:

4.数据翻译模块(tontaba):

(1)

模块图像:

(2)程序如下:

libraryieee;

useieee.std_logic_1164.all;

entitytonetabais

port(index:

instd_logic_vector(4downto0);

code:

outstd_logic_vector(3downto0);

high0:

outstd_logic_vector(2downto0);

tone:

outstd_logic_vector(11downto0));

end;

architectureoneoftonetabais

begin

search:

process(index)

begin

caseindexis

when"00000"=>tone<="111111111111";code<="0000";high0<="000";--0/4095

when"00001"=>tone<="011100011111";code<="0001";high0<="001";--L1/1823

when"00010"=>tone<="100000001111";code<="0010";high0<="001";--L2/2063

when"00011"=>tone<="100011110010";code<="0011";high0<="001";--L3/2291

when"00100"=>tone<="100101010101";code<="0100";high0<="001";--L4/2390

when"00101"=>tone<="101000010000";code<="0101";high0<="001";--L5/2576

when"00110"=>tone<="101010111000";code<="0110";high0<="001";--L6/2745

when"00111"=>tone<="101101001011";code<="0111";high0<="001";--L7/2891

when"01000"=>tone<="101110001111";code<="0001";high0<="010";--M1/2960

when"01001"=>tone<="110000001001";code<="0010";high0<="010";--M2/3082

when"01010"=>tone<="110001111001";code<="0011";high0<="010";--M3/3193

when"01011"=>tone<="110010101100";code<="0100";high0<="010";--M4/3244

when"01100"=>tone<="110100001001";code<="0101";high0<="010";--M5/3337

when"01101"=>tone<="110101011100";code<="0110";high0<="010";--M6/3420

when"01110"=>tone<="110110100101";code<="0111";high0<="010";--M7/3494

when"01111"=>tone<="110111000111";code<="0001";high0<="100";--H1/3528

when"10000"=>tone<="111000000101";code<="0010";high0<="100";--H2/3589

when"10001"=>tone<="111000111100";code<="0011";high0<="100";--H3/3645

when"10010"=>tone<="111001010110";code<="0100";high0<="100";--H4/3670

when"10011"=>tone<="111010000100";code<="0101";high0<="100";--H5/3717

when"10100"=>tone<="111010101101";code<="0110";high0<="100";--H6/3758

when"10101"=>tone<="111011010010";code<="0111";high0<="100";--H7/3795

whenothers=>null;

endcase;

endprocess;

end;

(3)仿真波形:

5.译码器模块(deled)

程序如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

useieee.std_logic_arith.all;

entitydeledis

port(

num:

instd_logic_vector(3downto0);

led:

outstd_logic_vector(6downto0));

enddeled;

architecturefunofdeledis

--signalcount:

std_logic_vector(2downto0);

begin

led<="1111110"whennum="0000"else

"0110000"whennum="0001"else

"1101101"whennum="0010"else

"1111001"whennum="0011"else

"0110011"whennum="0100"else

"1011011"whennum="0101"else

"1011111"whennum="0110"else

"1110000"whennum="0111"else

"1111111"whennum="1000"else

"1111011"whennum="1001"else

"1110111"whennum="1010"else

"0011111"whennum="1011"else

"1001110"whennum="1100"else

"0111101"whennum="1101"else

"1001111"whennum="1110"else

"1000111"whennum="1111";

endfun;

6.数控分频器模块(speakera)

(1)模块图像:

(2)程序如下:

LIBRARYIEEE;--音乐符数控分频电路模块

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYSpeakeraIS

PORT(clk:

INSTD_LOGIC;--音调频率信号12MHZ

Tone:

INSTD_LOGIC_VECTOR(10DOWNTO0);--音乐符对应分频11位

SpkS:

OUTSTD_LOGIC);--声音输出

END;

ARCHITECTUREoneOFSpeakeraIS

SIGNALPreCLK,FullSpkS:

STD_LOGIC;

BEGIN

DivideCLK:

PROCESS(clk)

VARIABLECount8:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

--将CLK进行16分频,PreCLK为CLK的16分频

IFclk'EVENTANDclk='1'then

ifCount8>7THENPreCLK<=notPreCLK;Count8:

="0000";

elseCount8:

=Count8+1;

endif;

endif;

ENDPROCESS;

GenSpkS:

PROCESS(PreCLK,Tone)--11位可预置计数器

VARIABLECount11:

STD_LOGIC_VECTOR(10DOWNTO0);

BEGIN

IFPreCLK'EVENTANDPreCLK='1'THEN

IFCount11=16#7FF#THENCount11:

=Tone;FullSpkS<='1';

ELSECount11:

=Count11+1;FullSpkS<='0';ENDIF;

ENDIF;

ENDPROCESS;

DelaySpkS:

PROCESS(FullSpkS)--将输出再2分频,展宽脉冲,使扬声器有足够功率发音

VARIABLECount2:

STD_LOGIC;

BEGIN

IFFullSpkS'EVENTANDFullSpkS='1'THENCount2:

=NOTCount2;

IFCount2='1'THENSpkS<='1';

ELSESpkS<='0';ENDIF;

ENDIF;

ENDPROCESS;

END;

(3)仿真波形:

7.乐谱数据(ROM)

(1)菊花台程序:

WIDTH=5;

DEPTH=256;

ADDRESS_RADIX=UNS;

DATA_RADIX=UNS;

CONTENTBEGIN

[0..2]:

10;

3:

9;

[4..5]:

10;

[6..7]:

0;

8:

10;

9:

12;

10:

10;

11:

9;

[12..15]:

10;

[16..18]:

8;

19:

9;

20:

10;

21:

12;

[22..23]:

10;

[24..26]:

9;

27

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

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2