乐曲硬件演奏电路.docx

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

乐曲硬件演奏电路.docx

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

乐曲硬件演奏电路.docx

乐曲硬件演奏电路

 

目录

一、设计任务与要求……………………………3

二、总框体图   ……………………………3

三、选择器件    ……………………………4

四、功能模块   ……………………………4

1、音乐数据模块……………………………4

2、音符控制输出模块 ……………………………7

3、音符译码模块 ……………………………8

4、数控分频器模块……………………………11

5、分频器模块……………………………12

6、译码模块…………………………14

五、总体设计电路图 ……………………………15

1、总体电路原理图……………………………15

2、管脚分配图……………………………15

3、电路仿真结果……………………………16

4、硬件验证……………………………16

六、设计心得  ……………………………17

七、附录  ……………………………20

 

乐曲硬件演奏电路设计

一、设计任务与要求:

1、实验内容

利用可编程逻辑器件FPGA,设计乐曲硬件演奏电路,可自动演奏乐曲。

2、实验要求

(1)利用数控分频器设计硬件乐曲演奏电路。

(2)利用给定的音符数据定制ROM“music”。

(3)设计乘法器逻辑框图,并在QuartusII上完成全部设计。

(4)将音乐通过实验箱上的喇叭播放出来。

(5)与演奏发音相对应的简谱码输出在数码管上显示。

二、总体框图

设计思路:

C调音阶频率表:

音阶

频率Hz

音阶

频率Hz

音阶

频率Hz

1661.22

7

830.61

7

415.31

1479.98

6

739.99

6

370

1318.52

5

659.33

5

329.63

1174.66

4

587.33

4

293.67

1108.73

3

554.37

3

277.19

987.76

2

493.88

2

246.94

880

1

440

1

220

在《EDA技术实用教程》课程中,已经学习过数控分频器设计,即输入不同的预置数即可发出不同频率的声音。

由此,可以以此为设计基础。

设计一功能模块,能够将乐曲中的音符逐一以对应的频率以预置数的形式置入数控分频计中,即可利用该数控分频计产生不同的声音,演奏出设定好的音乐。

ROM中的音乐数据文件刚可由编辑好的音符填入MIF文件中再定制LPM_ROM将音符数据加载入ROM中,并设计程序在运行时自动读取ROM中的文件并置入数控分频器中。

当采用四四拍曲子时,每节拍持续时间为0.5秒。

置入数控分频器的速度也应与此同步或一致,避免音乐过快或过快慢而失真。

由已知的C调音阶频率表,各频率对应的预置数就与数控分频推动蜂鸣器发出声音的频率对应。

在编写数控分频器时,不仅要考虑预置数的输入方式,还要考虑输入的速度,以及驱动蜂鸣器发声的频率。

为了显示高音音调,可在音符预置数的译码过程中,同时译出高音音阶的信号,并利用LED灯输出信号。

同时,也可利用该译码模块,将当前演奏的音符简谱表达出来。

总体框图

三、选择器件

1.EP1C12Q240C8芯片及相应的连接设备

EP1C12Q240C8开发板是基于FPGA的硬件描述语言EDA和软内核嵌入式系统的SOPC开发平台。

系统采用多层PCB板设计,完善的电源和时钟设计,性能稳定可靠、结构紧凑美观。

系统采用主流FPGA构建平台,片内资源丰富,板载器件多、周边接口多、可扩展性强。

优化设计使系统调试方便,配置容易。

配备丰富的例程有利于FPGA和SOPC的学习、快速入门与提高。

FPGA/SOPC开发平台是电子、信息类专业学生学习FPGA和SOPC的理想良师益友,是各大专院校教学科研的良好工具,也可用于科研机构研发特色新产品。

2.外置扬声器

3.7段数码管

4.LED灯一个

5.计算机

四、功能模块

1、音乐数据ROM模块:

该模块为音乐曲谱的存放文件。

其利用LPM_ROM宏模块将共设定512个音符,每个音符宽度为5位,可存放高、中、低三阶21个音符的数据。

文件名为music.mif.

其中[0..127]存放第一首歌《挥着翅膀的女孩》,

[127..255]存放第二首歌《菊花台》,

[256..383]存放第三首歌《两只老虎》,

[384..512]存放第四首歌《世上只有妈妈好》,

在该数据中,每个字符持续时间为0.25秒(由音符控制输出模块的时钟源4HZ信号确定),故在根据乐谱中音符的实际持续时间进行编写。

如四四拍的则每拍时间为0.5秒,则此处对应数据应该持续两个字符。

MIF文件内容如下:

WIDTH=5;DEPTH=512;

 

 

 

音乐数据ROM模块不生成模块,通过定制LPM_ROM,以备下一个模块的使用。

2、音符控制输出模块NOTETABS:

该模块利用已定制完成的music.mif文件,通过给出LPM_ROM的数据地址,使LPM_ROM输出对应的音符,再送入音符译码电路,最终演奏出编好的音乐。

VHDL语句描述如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitynotetabsis

port(clk1:

instd_logic;

toneindex:

outstd_logic_vector(4downto0));

end;

architectureoneofnotetabsis

componentmusic

port(address:

instd_logic_vector(8downto0);

clock:

instd_logic;

q:

outstd_logic_vector(4downto0));

endcomponent;

signalcounter:

std_logic_vector(8downto0);

begin

cnt8:

process(clk1,counter)

begin

ifcounter=512thencounter<="000000000";

elsif(clk1'eventandclk1='1')then

counter<=counter+1;

endif;

endprocess;

u1:

music

portmap(address=>counter,q=>toneindex,clock=>clk1);

end;

◆其生成项目符号为:

该模块时序仿真图如下:

时序仿真说明:

根据时序图可看出,当输入clock1时,toneindex也相应的改变,即完成在同一ROM内存放多首歌曲。

3、音符译码电路TONETABS模块:

该模块将NOTETABS模块输出的音符译成输出电路的数控分频所需要预置数,并将对应的简谱数字用数码管显示出来,同时根据输出的音符,判断其高、中、低特性,并通过一个LED灯将高音显示出来。

其所输出的预置数由最后一级的数控频器所决定,参考值如下表:

音阶

频率

频率设定数

预置数

分频数

低7

415

2891

101101001011

00111

低6

370

2745

101010111000

00110

低5

329

2576

101000010000

00101

低4

293

2390

100101010101

00100

低3

277

2291

100011110010

00011

低2

246

2063

100000001111

00010

低1

220

1823

011100011111

00001

中7

830

3494

110110100101

01110

中6

740

3420

110101011100

01101

中5

659

3337

110100001001

01100

中4

587

3244

110010101100

01011

中3

554

3193

110001111001

01010

中2

493

3082

110000001001

01001

中1

440

2960

101110001111

01000

高7

1661

3795

111011010010

10101

高6

1479

3758

111010101101

10100

高5

1318

3717

111010000100

10011

高4

1174

3670

111001010110

10010

高3

1108

3645

111000111100

10001

高2

987

3589

111000000101

10000

高1

880

3528

110111000111

01111

0音

0

4095

111111111111

00000

其计算公式如下:

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

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

其中

为音阶对应的频率。

模块VHDL语句描述如下:

libraryieee;

useieee.std_logic_1164.all;

entityToneTabais

port(Index:

instd_logic_vector(4downto0);

CODE:

outstd_logic_vector(3downto0);

HIGH:

outstd_logic;

Tone:

outstd_logic_vector(11downto0));

end;

architectureoneofToneTabais

begin

Search:

process(Index)

begin

caseIndexis

When"00000"=>tone<="111111111111";code<="0000";high<='0';--4095

When"00001"=>tone<="011000001000";code<="0001";high<='0';--1544

When"00010"=>tone<="011100011110";code<="0010";high<='0';--1822

When"00011"=>tone<="100000010110";code<="0011";high<='0';--2070

When"00100"=>tone<="100010001000";code<="0100";high<='0';--2184

When"00101"=>tone<="100101011001";code<="0101";high<='0';--2393

When"00110"=>tone<="101000010010";code<="0110";high<='0';--2578

When"00111"=>tone<="101001100111";code<="0111";high<='0';--2663

When"01000"=>tone<="101100000100";code<="0001";high<='1';--2820

When"01001"=>tone<="101110001111";code<="0010";high<='1';--2959

When"01010"=>tone<="110000001001";code<="0011";high<='1';--3081

When"01011"=>tone<="110001000100";code<="0100";high<='1';--3140

When"01100"=>tone<="110010101100";code<="0101";high<='1';--3244

When"01101"=>tone<="110100001001";code<="0110";high<='1';--3337

When"01110"=>tone<="110100110011";code<="0001";high<='1';--3379

When"01111"=>tone<="110110000001";code<="0010";high<='1';--3457

When"10000"=>tone<="110111000111";code<="0010";high<='1';--3527

When"10001"=>tone<="111000000101";code<="0010";high<='1';--3589

When"10010"=>tone<="111000100001";code<="0010";high<='1';--3617

When"10011"=>tone<="111001010101";code<="0010";high<='1';--3669

When"10100"=>tone<="111010000100";code<="0010";high<='1';--3716

When"10101"=>tone<="111010011001";code<="0010";high<='1';--3737

When"10110"=>tone<="111011000000";code<="0010";high<='1';--3776

When"10111"=>tone<="111011100011";code<="0010";high<='1';--3811

When"11000"=>tone<="111100000010";code<="0010";high<='1';--3842

When"11001"=>tone<="111100010000";code<="0010";high<='1';--3856

When"11010"=>tone<="111100101010";code<="0010";high<='1';--3882

When"11011"=>tone<="111101000001";code<="0010";high<='1';--3905

When"11100"=>tone<="111101001100";code<="0010";high<='1';--3916

Whenothers=>null;

endcase;

endprocess;

end;

◆其生成项目符号为:

该模块时序仿真图如下:

时序仿真说明:

将NOTETABS模块输出的音符译成输出电路的数控分频所需要预置数,并将高音输出。

4、数控分频器计输出模块SPEAKERA:

该模块主体为一个12位的可预置数计数器。

其通过NOTETABS得到预置数,并对些进行计数。

当计满时便给出一个溢出信号。

再对此溢出信号进行二分频得到能驱动蜂鸣器且频率符合C大调的21个音阶的频率。

由此发出不同信号。

其VHDL语言描述如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityspeakerais

port(clk:

instd_logic;

tone:

instd_logic_vector(11downto0);

spks:

outstd_logic);

end;

architectureoneofspeakerais

signalpreclk,fullspks:

std_logic;

begin

divideclk:

process(clk)--对12MHZ时钟源进行12分频,输出1MHZ的脉冲信号。

variablecount4:

std_logic_vector(3downto0);

begin

preclk<='0';

ifcount4>11thenpreclk<='1';count4:

="0000";

elsifclk'eventandclk='1'thencount4:

=count4+1;

endif;

endprocess;

genspks:

process(preclk,tone)--12位预置数数控分频器

variablecount11:

std_logic_vector(11downto0);

begin

ifpreclk'eventandpreclk='1'then

ifcount11="111111111111"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;

◆其生成项目符号为:

该模块时序仿真图如下:

时序仿真说明:

根据预置数的不同,其输出的频率也有规律性的变化。

5、分频器模块div_clk:

该模块主要是把从实验箱接入的50MHZ的频率进行分频,得到12MHZ的脉冲,以备后面的模块使用

模块VHDL语句描述如下:

LIBRARYieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

ENTITYdiv_clkIS

PORT(clk_in:

INstd_logic;

div_out:

OUTstd_logic);

ENDdiv_clk;

ARCHITECTUREaOFdiv_clkIS

SIGNALfre_N:

integerrange0to2;

SIGNALclk_tmp:

std_logic;

BEGIN

div_out<=clk_tmp;

process(clk_in)

begin

iffalling_edge(clk_in)then

iffre_N>=1then

fre_N<=0;

clk_tmp<=notclk_tmp;

else

fre_N<=fre_N+1;

endif;

endif;

endprocess;

ENDa;

◆其生成项目符号为:

该模块时序仿真图如下:

时序仿真说明:

将50MHZ分成12MHZ的脉冲

6、译码模块deled

该模块将歌曲对应的简谱通过七段数码管显示。

模块VHDL语句描述如下:

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;

◆其生成项目符号为:

该模块时序仿真图如下:

时序仿真说明:

对应的简谱变化时,数码管显示相应的发生变化,显示相应的简谱。

五、总体设计电路图:

1、总体电路原理图

2、管脚分配图

3、电路仿真结果

时序仿真说明:

当输入clk信号后,程序运行,数码管显示相应的简谱,扬声器播放歌曲,当输出为高音时,LED灯亮。

4、硬件验证

【1】IO3接in_clock

【2】IO5接扬声器

【3】IO9接LED灯

下载完成后,扬声器即发出声音,演奏出乐曲,同时数码管显示相应的简谱,当输出为高音是,IO9连接的LED灯亮。

六、设计心得

通过两周的努力,终于完成了此次课程设计。

此次课程设计主要参考了教材中基于FPGA的硬件演奏电路的设计,并根据课题要求,对其进行加工与改进,并最达到课题的要求,使其在QUARTUSП上选用目标芯片仿真实现了音乐硬件演奏电路的功能。

实践证明:

采用FPGA设计实现音乐硬件演奏电路的可行性和可靠性,而且更改乐曲容易,可根据需要修改ROM中的音符数据文件,从而使电路实现任一曲子的播放。

这种基于FPGA的音乐硬件演奏电路的设计与实现,不仅通过VHDL层次化和模块化设计方法,同时采用数控分频和定制LPM-ROM的设计思想,更好的优化了乐曲演奏数字电路的设计,在此基础上不必变化顶层文件架构可随意变更乐曲,有效缩短了产品开发周期、减少了设计芯片的数量、降低了功耗、提高了设计的灵活性、可靠性和可扩展性。

在课程设计开始之前,我就广泛查找关于此类的文档或者其他相关的资料,一

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

当前位置:首页 > 表格模板 > 书信模板

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

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