Verilog hdl简易电子琴设计.docx

上传人:b****1 文档编号:2099290 上传时间:2022-10-26 格式:DOCX 页数:11 大小:792.77KB
下载 相关 举报
Verilog hdl简易电子琴设计.docx_第1页
第1页 / 共11页
Verilog hdl简易电子琴设计.docx_第2页
第2页 / 共11页
Verilog hdl简易电子琴设计.docx_第3页
第3页 / 共11页
Verilog hdl简易电子琴设计.docx_第4页
第4页 / 共11页
Verilog hdl简易电子琴设计.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

Verilog hdl简易电子琴设计.docx

《Verilog hdl简易电子琴设计.docx》由会员分享,可在线阅读,更多相关《Verilog hdl简易电子琴设计.docx(11页珍藏版)》请在冰豆网上搜索。

Verilog hdl简易电子琴设计.docx

Veriloghdl简易电子琴设计

文理学院

 

简易电子琴设计

 

专业:

自动化

学号:

2012118064

一天虹影

 

实验目的

使用VerilogHDL语言进行前端设计,并使用Quaruts软件在GW48-PK2实验上实现仿真,实现硬件电子琴。

电子琴要求有8个音阶,使用外部时钟信号3MHz,能同步显示音阶。

设计要求

1、设计一个简易电子琴。

要求能演奏的音域为D调的do到E调do。

2、用GW48-PK2中的8个按键作为琴键。

3、GW48-PK2中有蜂鸣器。

4、可以使用GW48-PK2上的12MHz作为输入时钟信号

设计思路

通过可编程逻辑器件(PLD)和VHDL硬件描述语言来实现电子琴的基本要求。

设计的主体是数控分频器,对输入的频率按照与每个音阶对应的分频系数进行分频,得到各个音阶对应的频率分别在蜂鸣器和数码管上以声音和频率数值的形式作为输出。

设计组成与原理

下图为系统的工作原理框图。

模块设计

1.音名与频率的关系

音乐的12平均率规定:

每2个八度音(如简谱中的中音1与高音1)之间的频率相差1倍。

在2个八度音之间,又可分为12个半音。

灵位,音符A(简谱中的低音6)的频率为440HZ,音符B到C之间、E到F之间为半音,其余为全音。

由此可以计算出简谱中所有的音符的频率,在这我们只需计算出中音1到高音1的频率即可。

如下所示:

表一简谱音名与频率的对应关系

音名

中音1

中音2

中音3

中音4

中音4

中音6

中音

高音

频率/HZ

523.3

587.3

659.3

698.5

784

880

987.8

1046.5

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

若分频器时钟频率过低,则由于分频系数过小,四舍五入取整后的误差较大;若时钟频率过高,虽然误差变小,但分频数将变大。

实际的设计应综合考虑两方面的因素,在尽量减少频率误差的前提下取合适的时钟频率。

本实验要求用12MHZ的时钟脉冲信号,所以不必考虑这方面的因素。

实际上,只要各个音符间的相对频率关系不变,弹奏出来的音调听起来是不会走调的。

2.分频系数与初始值(预置数)

本例设计的音乐电子琴选取12MHZ的系统时钟频率。

在数控分频器模块中,由于数控分频器输出的波形是脉宽极窄的脉冲波,为了更好地驱动扬声器发生,减少输出的偶次谐波分量,在到达扬声器之前需要均衡占空比,从而生成各音符对应频率的对称方波输出。

这个过程实际上进行了一次二分频,频率变为原来的二分之一,即6MHZ。

因此,分频系数的计算可以按照下面的方法进行。

以中音1为例,对应的频率值为523.3HZ,它的分频系数应该为:

Divider=6MHz/523.3=6*106/523.3=11466

至于其他音符,同样由上式求出对应的分频系数,这样利用程序可以轻松地得到相应的乐声。

各音名对应的分频系数如下表:

表二各音名对应的分频系数

音名

中音1

中音2

中音3

中音4

中音5

中音6

中音7

高音1

分频系数(divider)

11466

10216

9101

8590

7653

6818

6074

5733

由于最大的分频系数为11466,故采用14位二进制计数器已能满足分频要求。

将分频系数设为0,其初始值为16383(214-1)即可,此时扬声器不会发声。

对于不同的分频系数,加载不同的初始值即可。

本实验参考王金明:

《VerilogHDL程序设计教程》,采用差值法进行分频。

把差值作为初始值,为不同音阶的发声的来源。

各音名对应的初始值如下表:

表三各音名对应的初始值

音名

中音1

中音2

中音3

中音4

中音5

中音6

中音7

高音1

初始值(origin)

4917

6167

7282

7793

8730

9565

10309

10650

3.数控分频器

数控分频器是对基准频率进行分频,得到与各个音阶对应的频率输出。

数控分频模块是由一个初始值可变的14位加法计数器构成,该计数器的模为214=16384,当计数器记满时,产生一个进位信号,该信号就是用作发音的频率信号。

其分为预分频和脉冲展宽两部分。

a)预分频

assignpreclk=(divider==16383)?

1:

0;

always(posedgeclk)

begin

if(preclk)

divider=origin;

else

divider=divider+1;

end

b)脉冲展宽(二分频)

always(posedgepreclk)

begin

speaker=~speaker;

目的是将预分频产生的占空比很小的波形进行拓宽,使得波形有足够长的高电平来驱动扬声器。

实验仿真

(一)测试使用的仪器与软件

仪器

康芯GW48系列EDA设备-----GW48-PK2

实验电路图和适用围:

本实验适用模式3,其结构图如下

1.Altera公司的Cyclone系列的EP2C5T144C8芯片

2.康芯教学实验箱

软件

QuartusII

QuartusII是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程

以下为使用QuartusII软件得到的RTL级视图

(二)测试方法

注:

选择模式3,此模式下按键为琴键式,适合本实验演奏。

1.打开QuartusⅡ软件,file-NewProjectWizard-选择程序e_piano2.

2.Assignment-Device-设置芯片为CycloneⅡ系列的EP2C5T144C8

3.定义管脚如下

clk

PIN_128

index[2]

PIN_3

code[0]

PIN_39

index[3]

PIN_4

code[1]

PIN_40

index[4]

PIN_5

code[2]

PIN_41

index[5]

PIN_6

code[3]

PIN_42

index[6]

PIN_7

d

PIN_47

index[7]

PIN_10

index[0]

PIN_1

spk

PIN_129

index[1]

PIN_2

下图为管脚定义界面

4.定义完成后再次编译,再执行Programmer,选中e_piano.sof,开始下载。

下图为编译下载界面

5.下载完成后控制按键,观察音调准确,声音清晰,数码管能够正常显示音调。

实验总结

根据老师的要求,我们先一起通过所学知识讨论了设计原理,不懂的问了下其他同学,最后定制出了大致计划。

在具体设计过程中,我们根据步骤逐次检验,查阅了有关资料,主要包括王金明:

《VerilogHDL程序设计教程》以及松,黄继业,明的《EDA技术实用教程》

在初次编写分频模块时候,使用的是比较基本的计数器分频法,编写程序后在modelsim软件中进行了仿真,发现无法观察到分频情况。

经过分析,原因是由于分频比过大,因此在波形图中很难观察到。

而且由于预分频的占空比很小,更难以观察到高电平。

在原因找到后,为了考察程序的性能,我们将输入频率减小。

同时适当缩小分频比,这样就得到了模块仿真中的分频波形。

通过此次实验,我们不仅学会了QuartusII软件的使用方法,还对集成电路设计有了更深的认识,对专业知识得到了加强。

同时认识到了自己的不足,比如有些知识已经模糊,所以有待于复习,所谓“温故而知新”,我们要学习的东西还很多。

这次的学习将对自己以后的研究生学习和将来的工作有很大的帮助,也是一次实践的锻炼!

 

参考文献

1.王金明:

《VerilogHDL程序设计教程》

2.松,黄继业,明《EDA技术实用教程》

3.其他网上资料

 

附录:

程序源代码

//信号定义与说明:

//clk:

用于产生各种音阶频率的基准频率;

//key:

电子琴音符输入端口;

//speaker:

用于激励扬声器的输出信号,本例中为方波信号;

//med,high:

分别用于显示中音,高音音符,各驱动一个数码显示管和LED来显示;

//origin:

为数控分频模块提供音符频率的初始值;

moduledianziqin(clk,key,speaker,med,high);

inputclk;//12MHZ

input[7:

0]key;

outputspeaker;

outputhigh;//高音显示

output[3:

0]med;//中音显示

reg[13:

0]divider;//分频系数和初始值

reg[13:

0]origin;

regspeaker;

reghigh;

reg[3:

0]med;

wirepreclk;

assignpreclk=(divider==16383)?

1:

0;//14位,对时钟频率进行预分频

always(posedgeclk)

begin

if(preclk)

divider=origin;

else

divider=divider+1;

end

always(posedgepreclk)

begin

speaker=~speaker;

//进行2分频,拓宽波形,产生方波信号

end

parameterdo=8'b00000001,

re=8'b00000010,

mi=8'b00000100,

fa=8'b00001000,

so=8'b00010000,

la=8'b00100000,

xi=8'b01000000,

do_=8'b10000000;//状态编码,采用独热码编码方式

always(key)//分频比预置

case(key)

do:

begin

origin=4917;

med=1;

high=0;

end

re:

begin

origin=6167;

med=2;

high=0;

end

mi:

begin

origin=7282;

med=3;

high=0;

end

fa:

begin

origin=7793;

med=4;

high=0;

end

so:

begin

origin=8730;

med=5;

high=0;

end

la:

begin

origin=9565;

med=6;

high=0;

end

xi:

begin

origin=10309;

med=7;

high=0;

end

do_:

begin

origin=10650;

med=1;

high=1;

end

default:

begin

origin=16383;

high=0;

end

endcase

endmodule

 

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

当前位置:首页 > 自然科学 > 数学

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

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