FPGA简易电子琴设计.docx

上传人:b****4 文档编号:24192770 上传时间:2023-05-25 格式:DOCX 页数:50 大小:174.26KB
下载 相关 举报
FPGA简易电子琴设计.docx_第1页
第1页 / 共50页
FPGA简易电子琴设计.docx_第2页
第2页 / 共50页
FPGA简易电子琴设计.docx_第3页
第3页 / 共50页
FPGA简易电子琴设计.docx_第4页
第4页 / 共50页
FPGA简易电子琴设计.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

FPGA简易电子琴设计.docx

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

FPGA简易电子琴设计.docx

FPGA简易电子琴设计

西安邮电大学

FPGA课程设计报告

 

题目:

简易电子琴设计及FPGA功能验证

院系:

电子工程学院

专业班级:

学生姓名:

导师姓名:

黄海生

起止时间:

2012-6-18至2012-6-29

 

2012年6月29日

 

 

4.1.3应用范围................................................................................................5

4.3.1按键输入控制模块方案设计及源程序.................................................7

4.3.2控制模块方案设计及源程序.................................................................8

4.3.3LCD驱动模块方案设计及源程序.......................................................11

1.任务:

a、设计一个简单电子琴。

(内置2~4首简单音调曲)

b、用FPGA开发板的按键可选择演奏内置曲调,用数码管显示当前演奏的哪个演奏曲目或停止。

c、要求电子琴具有自主选择,自动播放所选曲目或停止曲目。

2.目的:

a、在掌握计算机组成原理理论相关的基础上,了解EDA技术,掌握VerilogHDL硬件描述语言的设计方法和思想,通过学习的VerilogHDL语言结合电子电路的设计知识理论联系实际,掌握所学的课程知识;

b、深入学习VerilogHDL、FPGA,了解其编程环境;

c、学会运用Modelsim和QuartusII等编程仿真软件;

d、将硬件语言编程与硬件实物功能演示相结合,加深理解VerilogHDL、FPGA的学习;

3.使用环境(软件/硬件环境,设备等)

软硬件环境:

软件:

QuartusII7.2,Modelsim6.1;

硬件环境:

DEII开发板;

设备:

PC一台,USB下载线,FPGA开发板及电源。

在EDA软件平台上,根据硬件描述语言Verilog完成的设计文件,自动的完成逻辑编译、化简、分割、综合及优化、布局布线、仿真、目标芯片的适配编译、逻辑映射和编程下载等工作。

VerilogHDL语言,用Modelsim进行前仿真,以及代码的生成,验证程序验证,也可进行综合。

用QuartusII进行后仿真。

4.FPGA课程设计详细内容

4.1技术规范

4.1.1原理

简易电子琴的设计通过软硬件结合实现,硬件系统包括主控制器芯片、LED、蜂鸣器等,软件资源包括编写VerilogHDL程序的应用软件Modelsim和仿真软件QuartusII。

电子琴有自动播放功能。

播放功能中有三首曲子。

程序共有六个模块,分别为主模块、数码管显示模块、分频模块、计数器模块、存储器模块、音频输出模块。

硬件实现是用一个数码管显示当前播放的曲目,另外四个按键key1、key2用来选择曲目。

通过主模块调用各模块实现电子琴的功能。

乐曲演奏的原理:

乐曲演奏的原理:

组成乐曲的每个音符的频率值(音调)以及持续时间(音长)是乐曲能持续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号的频率的高低和持续的时间,就可以使扬声器发出持续的乐曲声。

●音调的控制

频率的高低决定了音调的高低。

音乐的十二平均率规定:

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

在两个八度音之间,又可分为十二个半音,每半个音的频率比为

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

由此可以计算出简谱中从低音1至高音1之间的每个音名对应的频率如图所示:

音名

频率(HZ)

音名

频率(HZ)

音名

频率(HZ)

低音1

261.6

中音1

523.3

高音1

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

所有不同频率均从同一基准频率分频得到。

将分频数四舍五入进行取整,并尽量减小误差。

在本设计中选取5MHZ作为基准频率。

从下表中可以看出最大分频系数为11468,采用14位二进制计数器分频可满足要求。

此外还应给出预置数,对应不同的预置数,只需加载不同的预置数即可。

采用加载预置数实现分频的方法比采用反馈复零法节省资源,实现起来更加容易。

音名

分频比

预置数

音名

分频比

预置数

音名

分频比

预置数

低音1

9557

6826

中音1

4777

11606

高音1

2389

13994

低音2

8512

7871

中音2

4257

12126

高音2

2128

14255

低音3

7585

8798

中音3

3792

12591

高音3

1896

14487

低音4

7159

9224

中音4

3579

12804

高音4

1790

14593

低音5

6378

10005

中音5

3189

13194

高音5

1594

14789

低音6

5682

10701

中音6

2841

13524

高音6

1420

14963

低音7

5062

11321

中音7

2531

13852

高音7

1266

15117

●音长的控制

音符的持续时间须根据音乐的速度及每个音符的节拍数来确定。

如果设定全音符的持续时间为1S的话,假设产生4分音符,则产生四分频即可实现四分音符的时长,并提供4HZ分频器。

如图为乐曲演奏的原理图,其中,乐谱产生电路用来控制音乐的音调和时长。

控制音调通过设置计数器的预置数来实现,预置不同的数值会可以使计数器产生不同频率的信号,从而产生不同的音调。

控制音长是通过控制计数器预置数的停留时间来实现的,预置数的停留时间越长,则该音符的演奏时间越长,如2分音符,在记谱时将该音符记录两次即可。

4.1.2总体方案

本次设计课程的目的是让我们在学习verilogHDL的基础上更加深入的了解硬件设计语言的功能、作用及其特征,并且将我们的动手能力与创新能力结合起来。

本次试验的总体框图为:

 

设计框图说明

 

4.1.3引脚描述

信号名

输入/输出

目标/源

功能描述

CLK

Input

Pin

主时钟频率,5MHZ,占空比为1:

1

DIR

Input

Pin

使能端,控制时钟产生,以及读写同步

OUT

Output

Pin

输出乐曲信号(方波形式)

SCREEN

Output

Pin

数码管显示信号

4.1.4顶层划分

顶层模块说明:

1.D触发器:

实现信号读取,产生内部使能端,控制分频器;

2.分频器:

实现与基准时钟同步操作,读取存储器数据进行分频操作,实现音调与音长的改变与输出;

3.节拍发生器:

根据使能端,产生对应的频率产生对应音符时长;

4.存储器:

实现将预置数传送给分频器,实现曲目的不停音调和音长;

5.2分频器:

将产生的信号再次进行2分频;

注:

音名显示控制

音名显示电路用来显示演奏乐曲时对应的音乐曲曲目名。

可以用三个数码管,

加以显示,本设计中使用HIGH[3:

0],MED[3;0],LOW[3;0]等信号加以显示,为了能使其循环显示,需要一时长计数器,等音乐演奏完成后,保证自动从头开始演奏。

4.1.5子模块描述

<1>按键接收器D触发器

1、功能描述

运用D触发器和数据锁存器实现数据线输出的使能端。

2、管脚描述

信号名称

输入/输出

目标

功能描述

DIR

输入

Pin

按键输入信号

DR

输出

Pin

使能端

 

3、实现说明:

●在按键信号产生后,进行信号的锁存和产生使能信号。

4、验证方案

●正常的信号锁存,和信号转换;

●是否实现正确使能输出;

<2>节拍发生器分频器

1、功能描述

根据信号的输入,对应产生对应曲目的节拍频率时钟用来读取存储器音调音长数据,产生不同的预置数

2、管脚描述

信号名称

输入/输出

目标

功能描述

DIR

输入

PIN

按键输入

CLK

输入

PIN

基准时钟频率

CK

输出

PIN

1位节拍频率时钟

3、实现说明

在CLK的上升沿,将锁存后的DIR信号输入到内部,并根据对应时钟节拍分频,产生对应节拍频率。

4、测试

略;

<3>分频器

1、功能描述

将基准时钟按照预置数的信息进行分频,且与时钟同步,并当使能端低电平时,停止输出,也可实现循环播放。

2、管脚描述

信号名称

输入/输出

目标

功能描述

DIR

输入

PIN

使能端

CK

输入

PIN

基准频率

VOICE

输入

PIN

预置数

SPEAK

输出

PIN

乐曲输出

3、实现说明

通过计数器、存储器、D触发器,实现分频。

当计数从预置数到初始值时Speaker翻转一次,即为分频。

4、测试

用modelsim仿真,观察波形是否为所需方波;

 

<4>存储器

1、功能描述

按照使能端的数据,选择对应的预置数据进行读操作,并且于时钟同步。

2、管脚描述

信号名称

输入/输出

目标

功能描述

DR

输入

PIN

使能端

CLK

输入

PIN

基准频率

VOICE

输出

PIN

读取的预置数

SCREEN

输出

PIN

数码管信号输出

3、实现说明

通过选择,在时钟的上升沿进行数据的读取,并将读出的数据同时传至数码管,与分频器。

4、测试

用modelsim仿真,观察预置数的值是否为对应曲目;

 

4.1.6验证方案:

正常情况下,输入一个DIR的值,查看波形输出是否正常。

改变DIR的值,再次查看波形输出是否正常,并且其频率是否满足上述的公式计算出的值。

4.1.7应用范围:

简易电子琴可以应用于简单的设计中,亦可应用于娱乐方面。

 

4.2设计方案

4.2.1顶层方案设计

顶层主要是对各个子模块进行调用与连接,顶层主要调用以下模块:

(1)按键驱动模块

该模块用于选择所要播放曲目。

(2)控制模块:

该模块用于处理比较所选择的功能。

(3)数码管显示模块:

该模块用于显示用户是否登陆成功,即LCD驱动。

4.2.2顶层模块程序

//信号定义与说明

//CLK_4HZ:

用于控制音长(节拍)的时钟频率

//clk_6MHZ:

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

//speak:

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

//high,med,low:

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

modulemusic(clk,key1,key0,speak,high,low,decodeout);//顶层模块:

inputclk,key1,key0;

outputspeak,high,low;

output[6:

0]decodeout;

wire[1:

0]dir;

wireclk,key1,key0;

wireclk_5MHZ,clk_4hz;

wirespeak;

wireck,dr;

wire[11:

0]voice;

wire[6:

0]decodeout;

wirehigh,low;

assignhigh=1;

assignlow=0;

assigndir={key1,key0};

clock5mhzmhz(.clk(clk),.dir(dir),.clk_5MHZ(clk_5MHZ));

clock4hzhz(.clk_5MHZ(clk_5MHZ),.dir(dir),.ck(ck),.clk_4HZ(clk_4HZ));

Dd1(.dir(dir),.dr(dr));

DDRddr1(.dir(dir),.ck(ck),.voice(voice));

mainm(.dr(dr),.clk_5MHZ(clk_5MHZ),.clk_4HZ(clk_4HZ),.voice(voice),.speak(speak));

decodedec(.dir(dir),.decodeout(decodeout));

endmodule

 

//信号定义与说明

//CLK_4HZ:

用于控制音长(节拍)的时钟频率

//clk_6MHZ:

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

//speak:

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

//high,med,low:

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

moduleDDR(dir,ck,voice);

input[1:

0]dir;

inputck;

output[11:

0]voice;

wire[1:

0]dir;

wireck;

wire[11:

0]voice;

reg[7:

0]counter;

reg[3:

0]high,med,low;

assignvoice={high,med,low};

always@(posedgeck)

if(dir==2'b00)

counter<=0;

elseif(dir==2'b01)//《梁祝》乐曲演奏电路

begin

if(counter==63)counter<=0;

elsecounter<=counter+1;

case(counter)

0:

{high,med,low}<='b000000000011;

1:

{high,med,low}<='b000000000011;

2:

{high,med,low}<='b000000000011;

3:

{high,med,low}<='b000000000011;

4:

{high,med,low}<='b000000000101;

5:

{high,med,low}<='b000000000101;

6:

{high,med,low}<='b000000000101;

7:

{high,med,low}<='b000000000110;

8:

{high,med,low}<='b000000010000;

9:

{high,med,low}<='b000000010000;

10:

{high,med,low}<='b000000010000;

11:

{high,med,low}<='b000000100000;

12:

{high,med,low}<='b000000000110;

13:

{high,med,low}<='b000000010000;

14:

{high,med,low}<='b000000000101;

15:

{high,med,low}<='b000000000101;

16:

{high,med,low}<='b000001010000;

17:

{high,med,low}<='b000001010000;

18:

{high,med,low}<='b000001010000;

19:

{high,med,low}<='b000100000000;

20:

{high,med,low}<='b000001100000;

21:

{high,med,low}<='b000001010000;

22:

{high,med,low}<='b000000110000;

23:

{high,med,low}<='b000001010000;

24:

{high,med,low}<='b000000100000;

25:

{high,med,low}<='b000000100000;

26:

{high,med,low}<='b000000100000;

27:

{high,med,low}<='b000000100000;

28:

{high,med,low}<='b000000100000;

29:

{high,med,low}<='b000000100000;

30:

{high,med,low}<='b000000100000;

31:

{high,med,low}<='b000000100000;

32:

{high,med,low}<='b000000100000;

33:

{high,med,low}<='b000000100000;

34:

{high,med,low}<='b000000100000;

35:

{high,med,low}<='b000000110000;

36:

{high,med,low}<='b000000000111;

37:

{high,med,low}<='b000000000111;

38:

{high,med,low}<='b000000000110;

39:

{high,med,low}<='b000000000110;

40:

{high,med,low}<='b000000000101;

41:

{high,med,low}<='b000000000101;

42:

{high,med,low}<='b000000000101;

43:

{high,med,low}<='b000000000110;

44:

{high,med,low}<='b000000010000;

45:

{high,med,low}<='b000000010000;

46:

{high,med,low}<='b000000100000;

47:

{high,med,low}<='b000000100000;

48:

{high,med,low}<='b000000000011;

49:

{high,med,low}<='b000000000011;

50:

{high,med,low}<='b000000010000;

51:

{high,med,low}<='b000000010000;

52:

{high,med,low}<='b000000000110;

53:

{high,med,low}<='b000000000101;

54:

{high,med,low}<='b000000000110;

55:

{high,med,low}<='b000000010000;

56:

{high,med,low}<='b000000000101;

57:

{high,med,low}<='b000000000101;

58:

{high,med,low}<='b000000000101;

59:

{high,med,low}<='b000000000101;

60:

{high,med,low}<='b000000000101;

61:

{high,med,low}<='b000000000101;

62:

{high,med,low}<='b000000000101;

63:

{high,med,low}<='b000000000101;

default:

{high,med,low}<='b000000000000;

endcase

end

elseif(dir==2'b10)//《天空之城》乐曲演奏电路

begin

if(counter==195)counter<=0;

elsecounter<=counter+1;

case(counter)

0:

{high,med,low}='b000001100000;//中6

1:

{high,med,low}='b000010000000;//中7

2:

{high,med,low}='b000100000000;//高1

3:

{high,med,low}='b000100000000;//高1

4:

{high,med,low}='b000100000000;//高1

5:

{high,med,low}='b000010000000;//中7

6:

{high,med,low}='b000100000000;//高1

7:

{high,med,low}='b000100000000;//高1

8:

{high,med,low}='b001100000000;//高3

9:

{high,med,low}='b001100000000;//高3

10:

{high,med,low}='b000010000000;//中7

11:

{high,med,low}='b000010000000;//中7

12:

{high,med,low}='b000010000000;//中7

13:

{high,med,low}='b000010000000;//中7

14:

{high,med,low}='b000010000000;//中7

15:

{high,med,low}='b000010000000;//中7

16:

{high,med,low}='b000000110000;//中3

17:

{high,med,low}='b000000110000;//中3

18:

{high,med,low}='b000001100000;//中6

19:

{high,med,low}='b000001100000;//中6

20:

{high,med,low}='b000001100000;//中6

21:

{high,med,low}='b000001010000;//中5

22:

{high,med,low}='b000001100000;//中6

23:

{high,med,low}='b000001100000;//中6

24:

{high,med,low}='b000000000111;//中1

25:

{high,med,low}='b000000000111;//中1

26:

{high,med,low}='b000001010000;//中5

27:

{high,med,low}='b000001010000;//中5

28:

{high,med,low}='b00

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

当前位置:首页 > 解决方案 > 学习计划

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

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