第一章 绪论
1.1引言
伴随电子技术飞速发展,
微电子技术进步关键表现在大规模集成电路加工技术即半导体工艺技术发展上,使得表征半导体工艺水平线宽已经达成了60nm,并在不停地缩小,
面在硅片单位面积上,集成了更多晶体管。
集成电路设计正在不停地向超大规模,极低功耗和超高速方向发展,电子产品功效越来越强大,体积越来越小,功耗越来越低。
同时,利用可编程逻辑器件和EDA技术使设计方法发生了质改变。
把以前“电路设计+硬件搭试+调试焊接”转化为“功效设计+软件模拟+仿真下载”
这种新基于芯片设计方法能够使设计者有更多机会充足发挥发明性思维,
实现多个复杂数字逻辑系统功效,
将原来由电路板设计完成工作放到芯片设计中进行,降低了连线和体积,提升了集成度,降低了干扰,大大减轻了电路设计和PCB设计工作量和难度,增强了设计灵活性,有效地提升了工作效率,增加了系统可靠性和稳定性,提升了技术指标。
这些技术使得多种电子产品快速进入了我们生活,
我们处于一个被电子产品深度包围时代,在一个一般老百姓家里,衣食住行, 每一个产品诞生全部离不开EDA技术,从彩色电视机, 到智能冰箱,
到全自动洗衣机,电饭煲,到微波炉,电磁炉,电子琴,再到个人随身用手机,MP3音乐播放器全部需要EDA技术提供支持。
本文应用VHDL硬件描述语言,设计一个乐曲硬件演奏电路,
它能将一首预先设置存放好乐曲自动播放出来,除此之外,
也能够经过按键方法输入音符,使其含有简易电子琴功效。经过此项研究,能够深切体会利用EDA工具开发优越性,在此基础上,
对乐曲硬件演奏电路功效进行丰富,具体一定社会实用性。
下面对乐曲演奏电路设计和实现中包含EDA技术,和EDA技术中常见开发器件CPLD/FPGA可编程逻辑器件,开发语言VHDL和开发软件QuartusⅡ作简单介绍。
1.2 EDA介绍
在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、
计算机辅助测试(CAT)和计算机辅助工程(CAE)概念发展而来。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,
用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片适配编译、逻辑映射和编程下载等工作。EDA技术出现,
极大地提升了电路设计效率和可操作性,减轻了设计者劳动强度。
1.3 FPGA介绍
FPGA是英文FieldProgrammable Gate Array缩写,即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件基础上深入发展产物。
它是作为专用集成电路(ASIC)领域中一个半定制电路而出现,
既处理了定制电路不足,又克服了原有可编程器件门电路数有限缺点。
FPGA采取了逻辑单元阵列LCA(LogicCell Array)这么一个新概念,内部包含可配置逻辑模块CLB(ConfigurableLogic Block)、
输出输入模块IOB(InputOutput Block)和内部连线(Interconnect)三个部分。
FPGA基础特点关键有
1)采取FPGA设计ASIC电路,用户不需要投片生产,就能得到适用芯片。
2)FPGA可做其它全定制或半定制ASIC电路中试样片。
3)FPGA内部有丰富触发器和I/O引脚。
能够说,FPGA芯片是小批量系统提升系统集成度、可靠性最好选择之一。
现在FPGA品种很多,有XILINXXC系列、TI企业TPC系列、ALTERA企业FIEX系列等。
FPGA是由存放在片内RAM中程序来设置其工作状态,所以,
工作时需要对片内RAM进行编程。用户能够依据不一样配置模式,
采取不一样编程方法。加电时,
FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,
FPGA进入工作状态。掉电后,FPGA恢复成白片, 内部逻辑关系消失,所以, FPGA能够反复使用。FPGA编程无须专用FPGA编程器,只须用通用EPROM、
PROM编程器即可。当需要修改FPGA功效时,只需换一片EPROM即可。这么,同一片FPGA,不一样编程数据,能够产生不一样电路功效。所以,
FPGA使用很灵活。
FPGA有多个配置模式:并行主模式为一片FPGA加一片EPROM方法;主从模式能够支持一片PROM编程多片FPGA;
串行模式能够采取串行PROM编程FPGA;
外设模式能够将FPGA作为微处理器外设,由微处理器对其编程。
1.4VHDL语言介绍
VHDL英文全名是VHSICHardware Description
Circuit缩写,是20世纪80年代在美国国防部资助下始创,
Language(VHSIC硬件描述语言)。VHSIC是Very 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 和之相比不仅仅是支持器件类型丰富和图形界面改变。Altera在QuartusII 中包含了很多诸如SignalTapII、ChipEditor和RTLViewer设计辅助工具,集成了SOPC和HardCopy设计步骤,而且继承了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技术来看,其特点是应用广泛、使用普及、软件功效强大。
在ASIC和PLD器件方面,向高密度、超高速、低电压、低功耗方向发展。
当今社会大家对低故障、高实时、高可靠、高稳定性能愈加青睐,
综合本设计要求和以上比较情况,我们选择基于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)输入频率决定,在此为4Hz。这13个值输出由程序[3]4位输入值index[3..0]确定。
输向程序[4]中index[3..0]值又由地址发生器模块输出toneindex[3..0]输出值和连
续时间决定。
模块功效是输出各个音符所对应分频预置数, 即当index是“0000”,
tone输出为2047,即休止符分频预置数;当index是“0101”时,tone输出为1197即低音5分频预置数;当index是“1111”时,tone输出为1728即高音1分频预置数等等其它状态时,
tone分别输出对应音符分频预置数。
2.3.3音乐谱对应分频预置数查表电路模块
(1)音乐符数控11分频电路模块
Speakera
clkSpkS
Tone[10..0]
inst | SpkS | |||||||||||||||||||
11' h001 -- | A[10..0] | OUT[10..0] | DATAA | SEL | OUT0 | \GenSpkS:Count11[10..0] | 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 | ] | LessThan0 | ENA | EQUAL | ENA | CLR | CLR | |||||||||||
Add0 | A[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,
表示共有256个4位数据点;ADDRESS-RADIX=DEC,表示地址信号用十进制;
形成ROM中配置数据(初始化数据)文件方法以下:DATA-RADIX=DEC, 表示输出数据是十进制数。
文件中关键词WIDTH设置ROM数据宽度;DEPTH设置ROM数据深度,
即4位数据数量,文件中设置256等效于8位地址线宽度;ADDRESS-
RADIX=DEC和DATA-
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程序设为工程,
选择Altera企业Cyclone系列中EPIC12Q240C8为目标芯片进行仿真。
仿真结果以下图:
图12音乐节拍和音调模块NoteTabs波形仿真
3.2ToneTaba分频预置数查表模块仿真
3.2.1波形仿真
将所编写分频预置数查表模块ToneTaba程序设为工程,
选择Altera企业Cyclone系列中EPIC12Q240C8为目标芯片进行仿真。
仿真结果以下图:
图13分频预置数查表模块ToneTaba波形仿真
由上面仿真波形图可看到若当index是“0000”,tone输出为2047,
即休止符分频预置数;当index是“0101”时,tone输出为1197即低音5分频预置数;
当index是“1111”时, tone输出为1728即高音1分频预置数等等其它状态时,
tone分别输出对应音符分频预置数,仿真波形图证实了程序实现了模块功效。
3.3Speakera音乐符数控分频模块仿真
3.3.1波形仿真
将所编写音乐符数控分频模块Speakera程序设为工程,
选择Altera企业Cyclone系列中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),Clk频率为750KHz,
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'; -- 将CLK进行16分频,PreCLK为CLK16分频
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;