基于vhdl的正弦波发生器.docx
《基于vhdl的正弦波发生器.docx》由会员分享,可在线阅读,更多相关《基于vhdl的正弦波发生器.docx(21页珍藏版)》请在冰豆网上搜索。
基于vhdl的正弦波发生器
装订线
2012--2013学年第1学期物理与电子工程学院
期末考试卷《EDA技术及应用》(课程论文等试卷样式)
学号:
姓名:
班级:
电子信息
(1)班
成绩:
评语:
(考试题目及要求)
3.利用VHDL语言设计一个正弦波信号发生器,采用AD0832芯片输出波形,要求具有至少100Hz、1KHz、10KHz三段频率设置功能和频率微调功能。
正弦波采样点不能低于10个,测试其输出信号波形不失真的最低频率和最高频率值。
1.引言1
2.EDA及系统硬件概述2
2.1VHDL语言2
2.2QuartusII软件3
2.3DAC0832的简要介绍:
3
3.总体设计思想及流程4
4.主要功能的实现模块如下:
5
4.1倍频器模块5
4.2主程序模块6
4.3波形显示模块6
4.4频率显示模块7
5.软件仿真7
6.硬件测试8
6.1编译8
6.2引脚的锁定9
6.3编程下载10
6.4硬件验证10
6.5波形显示10
7.总结与体会12
参考文献12
附录13
1.引言
信号发生器是一种能够产生多种波形,如三角波、方波、锯齿波、正弦波的仪器。
信号发生器在电路实验和设备检测以及通信、雷达、导航、宇航等领域有广泛的应用。
正因为其在生活中应用的重要性,人们它做了大量的研究,总结出了许多实现方式。
可以基于FPGA、VHDL、单片机、DOS技能、数字电路等多种方法实现。
正弦波信号发生器是信号发生器的一种。
可以实现信号发生器的一些基本功能。
在本次EDA课程设计中所要求的是采用VHDL来实现正弦波信号发生器。
设计的正弦波信号发生器所具有的功能如下:
(1)电路的外部频率为40MHz,自己所设计的正弦信号发生器可产生0-1KHz、1KHz~10KHz、10KHz~1MHz三档频率的信号;
(2)具有频率段选择的功能;
(3)在同一频率档内,可实现频率的加减;
(4)在显示波形的同时能够进行频率的调节;
(5)能够显示正弦波
(6)能够显示频率值;
(7)可用示波器进行波形的观测。
2.EDA及系统硬件概述
EDA技术是以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述的主要表达方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关开发软件,自动完成用软件的方式设计的电子系统到硬件系统实现,最终形成集成电子系统或专用集成芯片的一门新技术。
2.1VHDL语言
本次设计使用的是VHDL语言。
VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年。
1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。
VHDL作为一个规范语言和建模语言,随着它的标准化,出现了一些支持该语言的行为仿真器。
由于创建VHDL的最初目标是用于标准文档的建立和电路功能模拟,其基本想法是在高层次上描述系统和元件的行为。
但到了20世纪90年代初,人们发现,VHDL不仅可以作为系统模拟的建模工具,而且可以作为电路系统的设计工具:
可以利用软件工具将VHDL源码自动地转化为文本方式表达的基本逻辑元件连接图,即网表文件。
这种方法显然对于电路自动设计是一个极大的推进。
很快,电子设计领域出现了第一个软件设计工具,即VHDL逻辑综合器,它可以标准地将VHDL的部分语句描述转化为具体电路实现的网表文件。
VHDL语言具有很强的电路描述和建模能力,能从多个层次对数字系统进行建模和描述,从而大大简化了硬件设计任务,提高了设计效率和可靠性。
VHDL允许以下三种描述方式:
(1)结构描述:
描述该设计单元的硬件结构,即该硬件是如何构成的。
主要使用配置指定语句及元件例化语句描述元件的类型及元件的互连关系。
(2)行为描述:
描述该设计单元的功能,即该硬件能做些什么。
主要使用进程语句,以算法形式描述数据的变换和传送。
(3)数据流方式:
以类似于寄存器传输级的方式描述数据的传输和变换。
主要使用并行的信号赋值语句,既表示了设计单元的行为,又表示了设计单元的结构。
VHDL具有与具体硬件电路无关和与设计平台无关的特性,并具有良好的电路行为描述和系统描述能力,并在语言易读性和层次化结构化设计方面,表现了强大的生命力和应用潜力。
因此,VHDL在支持各种模式的设计方法、自项向下与自底向上或混合方法方面,在面对当今许多电子产品生命周期的缩短,需要多次重新设计以融入最新技术,改变工艺等方面都表现了良好的适应性。
用VHDL进行电子系统设计的一个很大的优点是设计者可以专心致力于其功能的实现,而不需要对不影响功能的工艺有关的因素花费过多的时间和精力。
此外,它支持大规模设计的分解和己有设计的再利用,一个大规模设计不可能一个人独立完成,它将由多个人甚至多个项目组共同完成。
VHDL中设计实体(designentity)的概念、程序包(package)的概念、设计库(library)的概念为设计的分解和设计的再利用提供了有力的支持[4]。
VHDL语言的特点是:
VHDL语言功能强大,设计方式多样;VHDL语言具有强大的硬件描述能力;VHDL语言具有很强的移植能力;VHDL语言的设计描述与器件无关;VHDL语言程序易于共享和复用。
2.2QuartusII软件
本设计中需要用到QuartusII9.0软件。
QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
AlteraQuartusII作为一种可编程逻辑的设计环境,由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。
2.3DAC0832的简要介绍:
DAC0832是8位分辨率的D/A转换集成芯片,转换周期为1μs,其参考电压与+5V工作电压相接(实用电路应接精密基准电压)。
与微处理器完全兼容,这个系列的芯片以其价格低廉、接口简单、转换控制容易等优点,单片机应用系统中得到了广泛的应用。
这类D/A转换器由8位输入锁存器,8位DAC寄存器,8位转换电路及转换控制电路构成。
DAC0832的使用,特将其应用特性总结如下;DAC0832是微处理器兼容型D/A转换器,可以充分利用微处理器的控制能力实现对D/A转换的控制这种芯片有许多控制引脚,可以和微处理器控制线相连,接受微处理器的控制,如ILE、/CS、/WR1/WR2、/XFER端。
DAC0832的引脚功能简述如下:
ILE:
数据锁存允许信号,高电平有效,系统上己经连接+5V上
WR:
写信号1,2,低电平有效。
CS:
片选信号输入线,低电平有效。
ILE:
数据传送控制信号,低电平有效。
XFER:
基准电压,可正,可负,-10~+10V。
Rfb:
反馈电阻端。
IoutI/Iout2CPIN11,PIN12)电流输出1和2。
D/A转换量是以电流形式输出的,所以必须将电流信号变为电压信号。
AGND/DGNDCPIN3,PIN10):
模拟地与数字地。
在高速情况下,此一地的连接线必须尽可能短,目系统的单点接地点必须在此连接线的某一点上。
3.总体设计思想及流程
在本次的设计中是按模块来实现的,根据梁老师所提出的要求,设计总共分为三大步骤完成:
(1)产生正弦波波形信号;
(2)频率的控制;
(3)显示频率值。
利用VHDL编程,依据基本数字电路模块原理进行整合。
系统各部分所需工作时钟信号由输入系统时钟信号经分频得到,系统时钟输入端应满足输入脉冲信号的要求。
频率控制模块可以实现频率的连续可调,最终送至脉冲发生模块输出脉冲信号,同时将信号的频率输出至数码管显示当前信号的频率值,达到设计所要求的输出波形频率可调功能。
如下图所示:
图3.1总体程序流程图
4.主要功能的实现模块如下:
4.1倍频器模块
由于要求简易正弦波信号发生器输出频率达到1MHZ,所以实验箱上的20MHZ的输出过低,无法达到要求。
此时可以采用一个倍频器将20MHZ的频率输出加倍成为128MHZ的频率输出。
具体通过QuartusII9.0软件所做的模块原理图如图4.1所示:
图4.1倍频器模块原理图
4.2主程序模块
主程序用来实现系统的主要功能,包括波形定义分频、频段选择、频率调节以及频率输出等。
主程序见附录1。
主程序原理图如图4.2所示:
图4.2主程序模块原理图
其中clk信号为20MHZ的信号经过加倍后的128MHZ的频率。
Key1、key2为频率调节按钮,key1接按键,当按动key1频率值加1或者减1;key2接拨码开关,用来加减选择,当key2=1时为加,当key2=0时为减。
sel_p[1..0]为频段选择信号,当sel_p[1..0]=00、01、10时,其频段分别为0HZ-1KHZ、1KHZ-10KHZ、10KHZ-1MHZ。
4.3波形显示模块
波形显示部分使用的是实验箱上的D/A转换器,将主程序模块的dout[7..0]八位二进制输出接D/A转换器的输入,从而转化为模拟信号,将D/A转换器的输出接示波器的输入,通过示波器显示观察。
4.4频率显示模块
频率显示部分使用了一个二进制——十六进制转化显示译码器,将主程序中输出的xianshi[19..0]这20位二进制段码输出转化为十六进制数显示在数码管上。
图4.4频率显示模块原理图
5.软件仿真
由于程序中计数值test比较大,无法在QuartusII9.0软件中显示完整,所以我们将程序中的test值改为1,这样可以得到完整的仿真图,而且不改变程序原理。
在实验时将,任意所取的频段如下所示,其中第一频段的初值设置为300HZ,第二频段的初值设置为3000HZ,第三频段的初值设置为30000HZ。
图5.1第一频段下的正弦波仿真图
图5.2第二频段下的正弦波仿真图
图5.3第三频段下的正弦波仿真图
6.硬件测试
6.1编译
(1)选择目标器件
Assign---Device---DeviceFamily---MAX7000S---EPM7128SLC84-6---OK
图6-1器件选择窗口
(2)启动编译器
Max+PlusII---Compiler---Start
将以上模块分别编译通过,并将它们全部保存到自己所建的工程文件夹:
axc_xh中。
6.2引脚的锁定
确定设计实体输入输出端口与目标芯片引脚的对应关系
图6-2引脚锁定界面
6.3编程下载
1.用下载电缆把计算机的并口与目标板(实验开发系统),连接好并打开电源。
2.将已经完成好的顶层原理图设一次当前工程,然后将其在Max+plusⅡ--Compiler下编译一次,将引脚锁定图在Max+plusⅡ--FloorplanEditor中打开,再编译一次管脚。
3.Max+plusⅡ--Programmer--Option--HardwareSetup---ByteBlaster(编程方式为)---Configute,双击Enter键,进行硬件验证。
6.4硬件验证
下载完成后,把示波器连接到实验箱上,并在实验箱上选择适当的时钟频率(以示波器上显示的波形清晰为标准)。
然后分别记录下各自频率值在示波器上所对应的波形。
图6-4实验箱上的连线图
6.5波形显示
本次EDA课程设计的输出是由DA0832将数字信号转化为模拟信号,再由示波器显示波形输出。
当引脚锁定完毕后,将程序下载到试验箱中,连好示波器,在输入端输入相应的值即可得到相应的输出波形。
具体的硬件仿真波形如下:
图6.1100HZ的正弦波硬件仿真结果
如上图所示,本次仿真采64个点所以有的波形不是很光滑,若需要更平滑的波形,可以增加采样点数;而且当频率较高时各种波形会出现失真,示波器上不显示稳定的波形;在硬件运行时产生的干扰,也会导致波形的混乱。
1K的正弦波硬件仿真结果
10K的正弦波硬件仿真结果
7.总结与体会
近两周的EDA技术课程设计就要结束了,通过这次课程设计,我学到的最重要的东西就是对于这种任务量比较大的程序,一定要认真理解老师所给出的题目要求。
刚开始的时候有的要求理解的不够透彻,结果导致不能达到老师的要求。
只是设计了进行粗略的调频,但对调频所要求的具有至少100Hz、1KHz、10KHz三段频率设置功能忽略了。
只是认为只要可以调频就行了,后来实验室的同学也做,问我后才觉得自己理解错了。
可想要修改程序却又觉得根本无从下手,最后还是又决定重新开始写,就尝试着设置了个sep_p[1..0]来进行选择频段。
此外,还要学会对系统进行分块化处理。
分块思想应在以后其它类似的设计中着重注意应用比如机器人的舵机、底盘程序等。
这次EDA技术的课程设计,运用了许多EDA技术的知识,通过这次设计,不仅对以前学过的许多理论知识进行了很全面的检验,明白了许多知识的具体应用,而且还学会了许多新知识,最起码熟悉了DAC0832的功能。
对EDA技术理解又有了一次的提升。
从本次设计中我还学到了以后的学习中要大胆尝试,小心求证。
一旦自己有了一种新的想法一定要非常小心的去检验,发现错误,改正错误,最终达到自己想要的结果。
在做实验时,用示波器显示波形时,却总是得不到稳定的波形,后来发现在输入控制中,仅需要3位二进制数即能完成简单的8进制计数,自己却习惯性的用了8位,这使得分频现象严重,更改后即得到了较稳定的输出波形,但是波形的下半部分却被消隐了,怀疑是基准电平的问题,对信号波形发生器进行了微调,如:
对于正弦波发生器,本来取值范围是从0-255,人为的提高了最低电平,采取了所有电平值除二加50的措施,最后果然波形输出稳定完好,试验成功。
还有就是在设计中我再一次体会到了VHDL的重要性,它是一门应用性、实践性质的课程,学会的东西不会是只在课本上能学到的,有很多东西,只有更多的去用它,不能仅靠理论,实践是非常必要的,理论与实践相结合,才能得到真正的提高。
我也希望在以后的学习过程中能够经常性的去运用它。
参考文献
[1]《EDA技术及应用》.西安:
电子电子科技大学出版社
[1]潘松,黄继业.《EDA技术实用教程》.北京:
科学出版社,2010.6
[2]刘江海.《EDA技术课程设计》.武汉:
华中科技大学出版社,2009.5
[3]姜雪松.《VHDL设计实例与仿真》.北京:
机械工业出版社,2007.1
[4]陈耀和.《VHDL语言设计技术》.北京:
电子工业出版社,2004.3
[5]谭会生,张昌凡.《EDA技术及应用》.西安:
西安电子科技大学出版社2004.4
[6]VolneiA.pedroni著,乔庐峰,王志功等译.《VHDL数字电路设计教程》.北京:
电子工业出版社2005.9
附录
主程序如下所示:
libraryieee;
useieee.std_logic_1164.all;
entitygeneratoris
port(clk:
instd_logic;
key1:
instd_logic;
key2:
instd_logic;
sel_p:
instd_logic_vector(1downto0);--频段选择
sel_b:
instd_logic_vector(1downto0);--波形选择
dout:
outintegerrange0to255;--波形数字量接dac0832示波器显示
xianshi:
outintegerrange0to1000000);--频率值
endentitygenerator;
architecturebhvofgeneratoris
signalnum:
integerrange0to1000000:
=3000;
signaltest:
integerrange0to1000000;
signalb:
std_logic;
signaladdr:
integerrange0to63;--采样点选择
typehuiisarray(0to63)ofintegerrange0to255;
--产生正弦波--
constantsina:
hui:
=(255,254,252,249,245,239,233,225,217,
207,197,186,174,162,150,137,124,112,
99,87,75,64,53,43,34,26,19,13,8,4,1,0,
0,1,4,8,13,19,26,34,43,53,64,75,87,99,
112,124,137,150,162,174,186,197,207,
217,225,233,239,245,249,252,254,255);
begin
process(clk)
variablecount:
integerrange0to1000000;
begin
if(clk'eventandclk='1')thencount:
=count+1;
if(count=test)thencount:
=0;
b<=notb;
endif;
endif;
--频率加减控制键--
endprocess;
process(key1,key2)
begin
if(key1'eventandkey1='1')then
if(key2='1')then
num<=num+1;
elsif(key2='0')then
num<=num-1;
endif;
endif;
endprocess;
--频段选择—
process(num,sel_p)
variabletemp:
integerrange0to1000000;
begin
temp:
=num;
casesel_pis
when"00"=>
if(temp>1000andtemp<=10000)then
temp:
=temp/10;
elsif(temp>100000andtemp<=1000000)then
temp:
=temp/1000;
endif;
if(temp>1000)thentemp:
=1000;
elsif(temp<1)thentemp:
=1;
endif;
xianshi<=temp;
test<=128000000/64/2/temp;
when"01"=>
if(temp>0andtemp<99)then
temp:
=temp*1000;
elsif(temp>=100andtemp<999)then
temp:
=temp*10;
elsif(temp>10000andtemp<=99999)then
temp:
=temp/10;
elsif(temp=1000000)then
temp:
=temp/100;
endif;
if(temp>10000)thentemp:
=10000;
elsif(temp<1000)thentemp:
=1000;
endif;
xianshi<=temp;
test<=128000000/64/2/temp;
when"10"=>--100001000000--
if(temp>0andtemp<=99)then
temp:
=temp*10000;
elsif(temp>=100andtemp<=10000)then
temp:
=temp*100;
endif;
if(temp>1000000)thentemp:
=1000000;
elsif(temp<10000)thentemp:
=10000;
endif;
xianshi<=temp;
test<=128000000/64/2/temp;
whenothers=>null;
endcase;
endprocess;
--采样点的控制--
process(b)
variablecount:
integerrange0to63;
begin
if(b'eventandb='1')then
count:
=count+1;
ifcount=64then
count:
=0;
endif;
endif;
addr<=count;
endprocess;