您的当前位置:首页2021年度基于FPGA的电子琴设计FPGA实训

2021年度基于FPGA的电子琴设计FPGA实训

来源:小侦探旅游网



第一章 绪论

1.1引言

伴随子技术飞,
子技术进步关在大模集成路加工技即半体工术发展上,使得表征半体工水平线宽达成了60nm,并在不停地,
面在硅片位面,集成了更多晶体管。

集成设计正在不停地向超大,极低功耗和超高速方向,品功效越来越,越来越小,功耗越来越低。

,利用可逻辑器件和EDA使设计方法生了

把以前“电路设计+硬件搭试+调试焊接”转化为“功效设计+软件模拟+仿真下载”

这种新基于芯片设计方法能够使设计者有更多机会充足发挥发明性思维,

实现多个复数字逻辑功效,
将原来由路板设计完成工作放到芯片设计,降低了连线和体,提升了集成度,降低了干,大大减设计PCB设计工作量和,设计灵活性,有效地提升了工作效率,增加了系可靠性和定性,提升了技

这些技术使得多种电子产品快速进入了我们生活,
我们处于一个被电子产品深度包围时代,在一个一般老百姓家里,衣食住行, 每一个产品诞生全部离不开EDA技术,从彩色电视机, 到智能冰箱,



到全自洗衣机,电饭煲,到微波炉,磁炉,子琴,再到个人随身用手机,MP3播放器全部需要EDA提供支持。

本文VHDL硬件描述,设计一个曲硬件演奏,
它能将一首置存放好曲自播放出来,除此之外,
也能够经过方法入音符,使其含有子琴功效。经过研究,深切体会利用EDA工具开发优越性,在此基,
对乐曲硬件演奏路功效行丰富,具体一定社会用性。

下面对乐曲演奏设计实现中包含EDA,EDA中常器件CPLDFPGA逻辑器件,发语VHDL和开发软QuartusⅡ简单

1.2 EDA介绍

20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、

算机测试CAT)和算机助工程(CAE)概念展而来。

EDA就是以算机工具,设计者在EDA件平台上,
用硬件描述HDL完成设计文件,然后由算机自地完成逻辑编译、化、分割、合、化、布局、布线和仿真,直至于特定目芯片适配编译逻辑映射和程下等工作。EDA,
极大地提升了设计效率和可操作性,设计劳动强度。

1.3 FPGA介绍





FPGA是英文FieldProgrammable Gate Array,现场门阵,它是在PALGALEPLD等可程器件基上深入物。

它是作为专用集成路(ASIC域中一个半定制路而出,
理了定制路不足,又克服了原有可程器件门电路数有限缺点。

FPGA采取了逻辑单LCALogicCell Array么一个新概念,内部包含可配置逻辑CLBConfigurableLogic Block)、
入模IOBInputOutput Block)和内部连线Interconnect)三个部分。

FPGA特点关
1)采取FPGA设计ASIC,不需要投片生,就能得到适用芯片。

2FPGA可做其它全定制或半定制ASIC路中试样片。

3FPGA内部有丰富触发器和IO引脚。
能够说,FPGA芯片是小批量系统提升系统集成度、可靠性最好选择之一。

FPGA品种很多,XILINXXC系列、TITPC系列、ALTERAFIEX系列等。

FPGA是由存放在片内RAM中程序来设置其工作状态,所以,
工作时需要对片内RAM进行编程。用户能够依据不一样配置模式,
采取不一样编程方法。加电时,
FPGA芯片将EPROM中数据读入片内编程RAM,配置完成后,
FPGA进入工作状态。掉电后,FPGA恢复成白片, 内部逻辑关系消失,所以, FPGA能够反复使用。FPGA编程无须专用FPGA编程器,只须用通用EPROM



PROM程器即可。当需要修改FPGA功效,只需一片EPROM即可。,同一片FPGA,不一样编程数据,够产生不一样电路功效。所以,
FPGA使用很灵活。

FPGA有多个配置模式:并行主模式一片FPGA加一片EPROM方法;主从模式能支持一片PROM程多片FPGA;
串行模式能采取串行PROMFPGA;
模式能FPGA理器外,由微理器程。

1.4VHDL语言介绍

VHDL英文全名是VHSICHardware Description

Circuit缩写,20世纪80年代在美国国防部资助下始创,
Language(VHSIC硬件描述语言)VHSICVery High SpeedIntegrated

VHDL关键用于描述数字系统结构,行为, 功效和接口。

除了含有很多含有硬件特征句外,
VHDL言形式和描述格和句法是十分似于通常算机高级语言。VHDL程序构特点是将一工程设计,或称设计实体(能是一个元件,一个路模或一个系)分成外部(或称可部分,
及端口)和内部(或称不可部分),既包含体内部功效和算法完成部分。

一个设计实体定了外部界面后,一旦其内部开完成后,

其它设计就能直接体。



这种将设计实体分成内外部分概念是VHDL系统设计基础点



1.5Quartus II介绍

Quartus

II

XP

Linux

Unix

使

,

除了能够使用Tcl脚本完成设计步骤外,提供了完善用户图形界面设计方法。含有运行速度快,界面统一,功效集中,易学易用等特点。

QuartusII支持AlteraIP,包含了LPM/MegaFunction宏功效模块库,使用充足利用成熟模,化了设计性、加设计速度。第三方EDA工具良好支持也使用设计各个段使用熟悉第三方EDA工具。

另外, Quartus II 经过和DSPBuilder工具和Matlab/Simulink相结合,能够方便地实现多种DSP应用系统;支持Altera片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一个综合性开发平台。

因为其出色易用性而得到了广泛应用。现在Altera已经停止了对MaxplusII

更新支持,Quartus II 和之相比不仅仅是支持器件型丰富和形界面改AlteraQuartusII 中包含了很多SignalTapIIChipEditorRTLViewer设计辅助工具,集成了SOPCHardCopy设计,而且承了MaxplusII 友好形界面及便使用方法。

AlteraQuartus II 一个可逻辑设计环,
设计能力和直易用接口,越来越受到数字系统设计迎。





第二章 总体设计

2.1方案设计和比较

2.1.1设计内容

FPGA器件驱动器演奏片段,一首曲包含三个要素:曲声音,时间长,顿时间。根据1乐谱,
设计对应电路控制speaker信号方波,某一连续时间长,间间隔大小,就能器演奏曲。

2.1.2 设计方案比较

经过按键状态来检测乐曲演奏状态,中央处理器由AT89S52单片机来完成,
乐曲演奏状态由七段数码管来模拟。这种方案结构简单,比较易掌握,
各部分电路实现起来野很轻易,在传统乐曲演奏设计中应用也较为广泛。
其原理框图图2



1 单片机乐曲演奏原理图




方案二:基于现场逻辑门阵FPGA,经过EDA,
采取VerilogHDL硬件描述实现乐曲演奏设计。程序设计思想:1、用频电生不一样频率方波;2、利用数器实现speaker信号选择,某一连续时间长,间间隔大小。其框图图2

2乐曲演奏电路原理框图

2.1.3方案论证和选择
而采取FPGA芯片实现该电路,在整体性上较方案一好,
在信号处理和整个系统控制中,方案二也能大大缩减电路体积,提升电路稳定性而
且系统调试周期也能大大缩短。因为它们完全不一样工作原理,通常来讲,
一样逻辑,基于FPGA设计比基于单片机设计快很多。单片机是基于指令工作,
单片机时钟驱动着程序一步步实施。

而基于FPGA是把对应逻辑临时固化硬件,
以后不响速度就是信号从一个管脚到另一个管脚传输速度,

时电信号也要在芯片内行部分栅电容充放电动,



但这些动作全部是很很快。



EDA来看,其特点是用广泛、使用普及、件功效大。

ASICPLD器件方面,向高密度、超高速、低电压、低功耗方向展。

当今社会大家低故障、高实时、高可靠、高定性能愈加青,
合本设计要求和以上比情况,们选择基于FPGA曲演奏设计方案。

2.2硬件设计

2.2.1稳压电源电路

该稳压电路作用是当电网电压波动、负载和温度改变时,
维持输出直流电压稳定。该电路可为晶振电路和扬声器提供+3.3V稳定电压,
驱动器件工作。其原理图图3所表示。


3系统稳压电源电路

2.2.2有源晶振电路

采取有源晶振作为时钟信号源, 它是一个完整振,



其内部除了石英晶体外还有阻容软件和晶体管, 有源晶振信号质量好, 比较稳定,



而且接方法比较简单。关是作为电,
通常使用一个容和PI波网,
出端使用一个小阻值电过滤信号。串阻可减小反射波,避免反射波叠加引发过,降低波和阻抗匹配,
减小回波干及造成信号冲。其原理图图4所表示。


依据蜂鸣器输入信号频率不一样决定了其发声不一样原理,
来设计一个由数控分频器控制BUZZER发声简单试验。

数控分曲音调值来决定,从而接地控制BUZZER率。

其原理图图5所表示。





5蜂鸣器电路

2.3.4七段数码显示电路

七段数管和一般光二极管光原理一,
行直观显示而将一般光二极管封装在一起,够进16制数字;有共阳极和共阴极之分,该设计采取共阴极接方法,
在控制端入高点平,入低候就不光。

其原理电路图图6所表示。


6 七段数码管显示电路

2.3软件设计

经过至顶向下(TOP--DOWN)设计方法,我们对电路设计要求作了分析,

路要实现功效着手, 分析设计,




再具体到各个模块设计实现和各模块实现方案选择

2.3.1音乐节拍和音调发生器模块

NoteTabs

clk ToneIndex[3..0]

SEL

RST

inst

7音乐节拍和音调发生器模块(1)乐节拍和音调发生器模RTL

RST comb~[7..0]

Add0 comb~[15..8]

SEL music:u1

DATAA SELCounter[7..0]

A[7..0] OUT0 clock

OUT[7..0] PRE q[3..0] ToneIndex[3..0]

SEL

ADDER

MUX21 8' h01 --B[7..0] DATAB address[7..0]

(2) 地址发生器模块
地址发生器模块设置了一个8位二进制计数器(计数最大值为256),
作为音符数据ROM地址发生器。每来一个时钟脉冲信号(Clk),
8位二进制计数器就计数一次,ROM文件中地址也就伴随递增,
音符数据ROM中音符也就一个接一个连续取出来了。

在地址发生器VHDL设计中,这个计数器计数频率选为4Hz,
即每一计数值停留时间为0.25,恰为当全音符设为1,
四四拍4分音符连续时间。比如,地址发生器在以下VHDL逻辑描述中,“梁祝”乐曲第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,1秒时间。



那么对应伴随程序[4]数器按4Hz时钟频率作加法,即随地址,将从音符数据ROM中将连续取出4个音符3”经过toneindex[3..0]端口向分频预置数模

么梁祝曲中音符就一个接一个经过toneindex[3..0]端口向分频预置数模

2.3.2音乐谱对应分频预置数查表电路模块

(1)乐谱频预置数模
ToneTaba

Index[3..0]CODE[3..0]

HIGH

Tone[10..0]


inst

它提供了每个音符所对应分频预置数,即给数控分频模块提供计数初值,
这里以“梁祝”乐曲为例,列出了在这个乐曲中所用到13个音符分频预置数。

个模VHDL逻辑描述中置了四四拍曲中全部音符所对应频预置数,13,
每一音符停留时间由音乐节拍和地址生器模块时钟Clk率决定,在此4Hz13值输出由程序[3]4index[3..0]确定。

向程序[4]index[3..0]又由地址生器模块输toneindex[3..0]

续时间决定。



模块功效是输出各个音符所对应分频预置数, 即当index是“0000”,



tone2047,即休止符分频预置数;index0101”,tone1197即低音5频预置数;index1111”,tone1728即高音1频预置数等等其它状态时,
tone别输对应音符分频预置数。

2.3.3音乐谱对应分频预置数查表电路模块

(1)符数控11频电路模

Speakera

clkSpkS

Tone[10..0]

inst

Count11~[10..0]
\DelaySpkS:Count2 SpkS~reg0

SpkS

11' h001 --

A[10..0]

OUT[10..0]

DATAA

SEL

OUT0

\GenSpkS:Count11[10..0]
1' h0 --
PRE

A[11..0]

OUT

FullSpkS

PRE

Q

PRE

Q

PRE

D

D

B[10..0]

DATAB

D

Q

B[11..0]

D

Q

ENA

ENA

12' h7FF --

4' h1 --

ADDER

MUX21

]
4' hB --

LessThan0

ENA

EQUAL

ENA

CLR

CLR

Add0

A[3..0]
B[3..0]

OUT

CLR

CLR

\DivideCLK:Count4[3..0]

PRE

D

Q

A[3..0] B[3..0]

OUT[3..0]

ENA

LESS_THAN

CLR

ADDER

clk

Tone[10..0]

11音乐符数控11分频电路模块RTL电路图
(3) 音乐符数控11分频模块电路VHDL程序设计
音符频率由数控分频模块取得,这是一个数控分频电路。它是由一个初值可变加法计数器组成。该计数器模为2047,当计数器记满时,



数器生一个溢出信号FULL,此溢出信号就是用作率信号。

数器入端定不一,而此置数就是表1数初,
就可得到不一音符率信号。它计满时所需要数初可由下式来表示。

数初Tone=2047-系数
而分系数又可有下式来求:
系数=基准/音符
低音Tone,系数大,溢出信号周期,声器出声音低,Tone随音乐乐谱,控制分,实现了数控分,
生信号率和音Tone成正比。就是利用数控分器自演奏音原理。

时钟(Clk)端输入是在十六进制模块里对12MHz信号进行16分频得到750KH
z, 750KHz信号依据分频预置数模块中所提供计数初值,
为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,
这时频率就变为原来1/2,刚好就是对应音符频率。

数控分Clk入信号分比由11置数tone[10..0]决定。

Fout率将决定每一个音符音,,
频计数器tone[10..0]Fout率就有了对应关系。

比如在分频预置数模中若取tone[10..0]=1036,出音符3”音信号率。

2.3.4乐曲演奏音符数据文件

WIDTH = 4 ;--曲演奏数据





DEPTH= 256 ;

Address_radix= dec;

Data_radix= dec;

CONTENTBEGIN

33 3 3 5 5 5 6

88 8 9 6 8 5 5

12 12 12 15 13 12 10 12

99 9 9 9 9 9 0

99 9 10 7 7 6 6

55 5 6 8 8 9 9

33 8 8 6 5 6 8

55 5 5 5 5 5 5

10

68
10

5
10

5
12

55 5 5


88 8 9 12 12 12 10

99 10 9 8 8 6 5

33 3 3 8 8 8 8

68 6 5 3 5 6 8

55 5 5 5 5 5 5

00 0 0 0 0 0 0

05 1 3 5 1 7 3

50 5 0 6 7 1 6

65 5 0 0 3 2 1

1 1 3 2 1 1 1 2

3 2 1 1 6 2 3 2



1 6

2

3

2

0

0

0

5 2

6

7

1

2

1

0

0 3

5

3

2

1

5

7

0 0

6

7

1

1

1

2

3 2

0

0

0

5

1

3

5 1

7

3

5

5

6

7

1 6

6

5

5

0

3

2

1 1

1

3

2

1

1

1

2 3

0

2

6

7

1

2

其中WIDTH=4,表示数据为宽为4;DEPTH=256,
表示共有2564位数据点;ADDRESS-RADIX=DEC,表示地址信号用十;

形成ROM中配置数据(初始化数据)文件方法以下:DATA-RADIX=DEC, 表示输出数据是十进制数。

文件中关键词WIDTH设置ROM数据宽度;DEPTH设置ROM数据深度,
4位数据数量,文件中设置256等效于8位地址线宽度;ADDRESS-
RADIX=DECDATA-
RADIX=DEC表示设置地址和数据表示式格式全部是十进制;
地址/数据表以CONTENTBEGIN开始, END结束;
其中地址/数据表示方法是冒号左边写ROM地址值,
冒号右边写对应此地址放置十进制数据,46: 9, 表示46为地址,
9为该地址中数据。这么每读到一个地址,即可输出其对应数据。文件编辑好后,

保留时取文件名为“singer.mif”,存盘路径为“g:\music \singer”




2.2.5定制音符数据ROM文件

1.定制基以下:
(1)QUARTUS||,TOOL->megawizardplug-in manager, 选择creata new…”, 然后按next”,选择LPM-ROM;
browse入路径和出文件名,注意后vhd小写。

(2)单击next”,, 选择ROM数据位4,地址线宽为256,置此ROM能存放4位二制数据共256个。

(3)经过browse”,找到ROM中加文件路径和文件名:注意ROM元件inclock是地址时钟

进行测试仿真波形, (4)打开已定制ROM文件,将它设置为工程,并确定目标器件,












第三章系统软硬件调试

3.1NoteTabs音乐节拍和音调发生器模块仿真

将所写音乐节拍和音NoteTabs程序设为工程,
选择AlteraCyclone系列中EPIC12Q240C8芯片行仿真。

仿真果以下:



12音乐节拍和音调模块NoteTabs波形仿真

3.2ToneTaba分频预置数查表模块仿真

3.2.1波形仿真

将所写分频预置数表模ToneTaba程序设为工程,
选择AlteraCyclone系列中EPIC12Q240C8芯片行仿真。

仿真果以下:





13分频预置数查表模块ToneTaba波形仿真
由上面仿真波形图可看到若当index是“0000”,tone输出为2047,
即休止符分频预置数;index是“0101”,tone输出为1197即低音5分频预置数;
index是“1111”, tone输出为1728即高音1分频预置数等等其它状态时,
tone分别输出对应音符分频预置数,仿真波形图证实了程序实现了模块功效。

3.3Speakera音乐符数控分频模块仿真

3.3.1波形仿真

将所写音符数控分Speakera程序设为工程,




选择AlteraCyclone系列中EPIC12Q240C8芯片行仿真。 仿真果以下:


3.3.2 模块功效分析和调试

Speakera符数控分此模功效是依据初始Tone,
对输时钟信号Clk行分,
得到想要音符率其时钟Clk)端入是在十六制模12MHz信号16得到750KHz,750KHz信号依据分频预置数模中所提供数初,得出对应音符率两倍

此时从数控分频器中出来输出信号是脉宽极窄脉冲式信号,
为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,

这时频率就变为原来1/2, 好就是对应音符率。




clk入一含有率信号(里是12MHz)信号,经过后由cout出。

里是12MHz信号16得到750KHz信号。

750KHz时钟脉冲信号是数控分提供时钟信号。

数控分Clk入信号分比由11置数tone[10..0]决定。

spkout率将决定每一个音符音,,
频计数器tone[10..0]Fout率就有了对应关系。

若在分频预置数模中若取 tone[10..0]=1036,
出音符3”音信号率。在个仿真波形,
Tone设为6c0(即高音1频预置数1728,Clk750KHz,
spkout出脉冲信号周期849.9291us(即1176.568Hz,靠近高音1率。

由表中可知高音1分频系数为319,
3.4 扩大此音乐硬件演奏电路通用性

前面所设计电路只能演奏梁祝曲子,
实际应用中,若能将用于多种曲子演奏,
用性和用范就会大很多。里关键经过修改分频预置数模程序,使其用于多种曲子演奏。另外要使更改曲方便,
键经过重新置音符数据文件,LPM-ROM定制。

在前面VHDL设计中,
我们只能经过程序输出“梁祝”曲子中13个音符分频预置数(即计数初值),



在其它曲中可能会用到另外那些音符,所以程序行修改完善它功效,

使其能出另外那些音符分频预置数。

把修改程序替原来此模程序顶层文件后,

要使所设计硬件演奏路可随意更改曲子,只要修改音符数据文件,

在那些连续地址上存放曲子中对应音符,音符数据文件ROM定制,

终连接到整个路中即可实现

程序修改以下:
Libraryieee;
Useieee.std_logic_1164.all;
Entitytonetaba is

code : out std_logic_vector(4 downto 0);
Port( index : instd_logic_vector(4 downto 0);--5位预制数查表码

End;
Architecture one of tonetaba is
Begin
Search : process(index)
Begin
Case index is
When "00000"=>tone<="";code<="00000";high<='0';--2047,休止符
When "00001"=>tone<="";code<="00001";high<='0';--773,低音1
When "00010"=>tone<="";code<="00010";high<='0';--912,低音2
When "00011"=>tone<="";code<="00011";high<='0';--1036,低音3
When "00100"=>tone<="";code<="00100";high<='0';--1077,低音4



When "00101"=>tone<="";code<="00101";high<='0';--1197,低音5
When "00110"=>tone<="";code<="00110";high<='0';--1290,低音6
When "00111"=>tone<="";code<="00111";high<='0';--1372,低音7
When "01000"=>tone<="";code<="01000";high<='1';--1410,中音1
When "01001"=>tone<="";code<="01001";high<='1';--1480,中音2
When "01010"=>tone<="";code<="01010";high<='1';--1542,中音3
When "01011"=>tone<="";code<="01011";high<='1';--1576,中音4
When "01100"=>tone<="";code<="01100";high<='1';--1622,中音5
When "01101"=>tone<="";code<="01101";high<='1';--1668,中音6
When "01110"=>tone<="";code<="01110";high<='1';--1717,中音7
When "01111"=>tone<="";code<="10001";high<='1';--1728,高音1
When "10000"=>tone<="";code<="10010";high<='1';--1770,高音2
When "10001"=>tone<="";code<="10011";high<='1';--1799,高音3 When "10010"=>tone<="";code<="10100";high<='1';--1814,高音4
When "10101"=>tone<="";code<="10111";high<='1';--1882,高音7
When others => null;
End case;
End process;
End;





总结

本设计程序部分由陈领负责,汇报撰写由刘嘉颖负责,

多种资料查找由李滢负责。

经过此次设计,EDA技术、对电子技术、对quartusII、对verilog语言,

,

并从实践中感受到了EDA技术给我们设计者带来方便。回顾此次课程设计,

从不停寻求书籍,网络上查找到设计电路,从制订好题目到完成整个设计,

,

西

此次设计让我明白了理论和实际相结合是很关键,

仅有所学理论知识是远远不够, 我们应该把所学理论知识和实践相结合起来,
从理论中得出结论, 才能真正提升自己实际动手能力和独立思索能力。
而且在实践中我们能够在查找资料过程中学到很多以前在书本和课堂上所无法





致谢

首先要感栋严格指切关心,从一开始选题方向指,VHDL程序上帮助,又提供了试验么好良好设计环境和条件,
才使我能够顺利完成标设计,兢兢业业工作精神、
诚处度也我受益匪浅。此成文之,我向老表示衷心感

也感同学和我们专业其它同学,
此次设计顺利完成少不了你毫无保留帮助和尽全力支持,在此我衷心感

本身水平有限,设计免存在部分不足之,指正。







参考文件

[1]
,.子技数字部分(第四版)[M].高等教育出版社,1987:45-59.

[2]潘松.EDA术实用教程[M].北京:科学教育出版社,:2-38.

[3].VHDL和数字设计[M].北京.科技大学出版,:38-40.

[4]
侯佰亨,.VHDL硬件描述言和实际应[M].西安.西安子科社,:269-

280.

[5]自美.线设计(第二版)[M].中科技大学出版社,:130-135.

[6] 王金明.数字系统设计和verilogHDL(第四版) [M].电子工业出版社,:264-
270.





附录

1.音乐节拍和音调发生器模VHDL程序设计

LIBRARYIEEE;--乐节拍和音调发生器模

USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYNoteTabs IS

PORT( clk : IN STD_LOGIC;--乐节时钟4HZ

SEL: IN STD_LOGIC;--乐选择键

RST: IN STD_LOGIC;--复位

ToneIndex : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );
PORT( address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
clock : INSTD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0));
ENDCOMPONENT;
SIGNAL Counter : STD_LOGIC_VECTOR (7 DOWNTO 0);--

8位二数器

BEGIN
CNT8 : PROCESS(clk, Counter,sel,rst)
BEGIN IF((clk'EVENT AND clk = '1') and (Counter=256 or rst='0')) then Counter <=



"00000000";Counter<=Counter+1;
end if;
IF ((clk'EVENT AND clk = '1') and (sel='0')) THEN Counter
<="10010000";Counter<=Counter+1;
end if;
ENDPROCESS;
u1: MUSIC PORT MAP(address=>Counter , q=>ToneIndex,clock=>clk); END;

2.分频预置数模VHDL设计程序以下:

LIBRARYIEEE;--乐谱对应频预制数路模

USEIEEE.STD_LOGIC_1164.ALL;

PORT ( Index : IN STD_LOGIC_VECTOR (3 DOWNTO 0) ;--4位预制数查表
ENTITYToneTaba IS

Tone : OUT STD_LOGIC_VECTOR (10 DOWNTO 0) );--

对应11

END;
ARCHITECTUREone OF ToneTaba IS
BEGIN
Search: PROCESS(Index)
BEGIN

CASEIndex IS -- 译码电,表方法,控制音调预置数13组频

WHEN "0000" => Tone<="" ; CODE<="0000";HIGH <='0';-- 2047
WHEN "0001" => Tone<=""; CODE<="0001"; HIGH <='0';-- 773;



WHEN "0010" => Tone<="" ; CODE<="0010";HIGH <='0';-- 912;
WHEN "0011" => Tone<=""; CODE<="0011"; HIGH <='0';--1036;
WHEN "0101"=> Tone<="" ; CODE<="0101"; HIGH<='0';--1197;
WHEN "0110" => Tone<=""; CODE<="0110"; HIGH <='0';--1290;
WHEN "0111"=> Tone<="" ; CODE<="0111"; HIGH<='0';--1372;
WHEN "1000" => Tone<=""; CODE<="0001"; HIGH <='1';--1410;
WHEN "1001"=> Tone<="" ; CODE<="0010"; HIGH<='1';--1480;
WHEN "1010" => Tone<=""; CODE<="0011"; HIGH <='1';--1542;
WHEN "1100"=> Tone<="" ; CODE<="0101"; HIGH<='1';--1622;
WHEN "1101" => Tone<=""; CODE<="0110"; HIGH <='1';--1668;
WHEN "1111"=> Tone<="" ; CODE<="0001"; HIGH<='1';--1728;
WHEN OTHERS => NULL;
ENDCASE;
3.音符频率由数控分频模块VHDL程序以下:
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY Speakera IS

PORT( clk : IN STD_LOGIC;--调频率信号12MHZ

Tone: IN STD_LOGIC_VECTOR (10 DOWNTO 0);--

对应11

SpkS: OUT STD_LOGIC );--声音

END;

ARCHITECTURE one OF Speakera IS
SIGNAL PreCLK, FullSpkS : STD_LOGIC; BEGIN




DivideCLK: PROCESS(clk)
VARIABLE Count4 : STD_LOGIC_VECTOR (3 DOWNTO 0) ; BEGIN

PreCLK<= '0'; -- CLK16,PreCLKCLK16

IFCount4>11 THEN PreCLK <= '1'; Count4 := "0000";
ELSIF clk'EVENT AND clk = '1' THEN Count4 := Count4 + 1; END IF;
ENDPROCESS;

GenSpkS: PROCESS(PreCLK, Tone)-- 11位可数器

VARIABLECount11 : STD_LOGIC_VECTOR (10 DOWNTO 0); BEGIN

IF Count11 = 16#7FF# THEN Count11 := Tone ; FullSpkS <= '1';
IF PreCLK'EVENT AND PreCLK = '1' THEN

END PROCESS;

DelaySpkS: PROCESS(FullSpkS)--出再2,脉冲,

使声器有足功率

VARIABLECount2 : STD_LOGIC;
BEGIN
IF FullSpkS'EVENT AND FullSpkS = '1' THEN Count2 := NOT Count2; IFCount2 = '1' THEN SpkS <= '1';
ELSE SpkS <= '0'; END IF;
END IF;

END PROCESS;



END;



4曲演奏程序

WIDTH= 4 ;--曲演奏数据

DEPTH= 256 ;

Address_radix= dec;

Data_radix= dec;

CONTENTBEGIN

33 3 3 5 5 5 6

88 8 9 6 8 5 5

12 12 12 15 13 12 10 12

99 9 9 9 9 9 0

99 9 10 7 7 6 6

3 3 8 8 65 5 5 6 8

6 8 5 5 5 5 5 5

35 03 3 5 6 7 9

66 6 6 6 6 5 6

88 8 9 12 12 12 10

99 10 9 8 8 6 5

33 3 3 8 8 8 8

68 6 5 3 5 6 8

55 5 5 5 5 5 5

00 0 0 0 0 0 0

0 5 1 3 5 1 7 3

50 5 0 6 7 1 6




65 5 0 0 3 2 1

11 3 2 1 1 1 2

32 1 1 6 2 3 2

16 2 3 2 0 0 0

52 6 7 1 2 1 0

03 5 3 2 1 5 7

00 6 7 1 1 1 2

32 0 0 0 5 1 3

51 7 3 5 5 6 7

16 6 5 5 0 3 2

11 1 3 2 1 1 1

23 0 2 6 7 1 2

5.定制好ROM文件VHDL程序以下:

LIBRARY ieee;


PORT

(

address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);

inclock : IN STD_LOGIC ;

q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0));

ENDmusic;

ARCHITECTURESYN OF music IS

SIGNALsub_wire0 : STD_LOGIC_VECTOR (3 DOWNTO 0);

COMPONENT lpm_rom
GENERIC (
lpm_width : NATURAL;





lpm_widthad : NATURAL;
lpm_address_control :STRING;
lpm_outdata : STRING;
lpm_file : STRING);
PORT (
address : INSTD_LOGIC_VECTOR (7 DOWNTO 0);
inclock : IN STD_LOGIC;
q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0));
END COMPONENT;
BEGIN
q <= sub_wire0(3 DOWNTO0);
lpm_rom_component : lpm_rom
GENERIC MAP ( LPM_WIDTH => 4,
LPM_OUTDATA => "UNREGISTERED",
LPM_FILE => "G:/MUSIC/SINGER/SINGER.mif")
PORTMAP (
address => address,
inclock =>inclock,
q => sub_wire0);
END SYN;



显示全文