任意波形发生器.docx
《任意波形发生器.docx》由会员分享,可在线阅读,更多相关《任意波形发生器.docx(19页珍藏版)》请在冰点文库上搜索。
![任意波形发生器.docx](https://file1.bingdoc.com/fileroot1/2023-5/30/c892b4f7-08f8-4be2-9136-1e1153771816/c892b4f7-08f8-4be2-9136-1e11537718161.gif)
任意波形发生器
湖北轻工职业技术学院
电子设计自动化
实训报告
题目基于CPLD的任意波形发生器
系部信息工程系
专业电子信息工程技术
班级09电信
姓名朱丽丝
学号0903021141
指导教师赵欣
2011年06月25日
引言
任意波形发生器(AWG)是信号源的一种,它具有信号源所有的特点和要领。
我们传统都认为信号源主要给被测电路提供所需的被测信号(各种波形),然后用其他仪表测量感兴趣的参数。
可见信号源在电子实验和测试处理中,并不测量任何参数,而是根据使用者的要求,仿真各种测试信号,提供给被测电路,已达到测试的需要。
任意波形发生器是一种特殊的信号源,具有综合其他信号源波形生成能力,因而适合各种仿真实验的需要。
为近一步了解波形信号发生器的工作原理,我们设计了一种较简单任意波形发生器。
要求电路至少可以产生正弦波、三角波、方波,并通过键盘切换三种波形的输出。
电路设计中充分利用EDA-V硬件平台实现该波形发生器,并使用示波器测量输出结果。
第一章 概述
硬件描述语言HDL是EDA技术中的重要组成部分,VHDL是当前最流行的硬件描述语言之一,此语言具有良好的可靠性、可移植性等特点。
本设计主要是利用VHDL语言设计一个多功能信号发生器,根据输入信号的选择可以输出正弦波、三角波、方波3种信号,主要使用了Altera公司的MAX+plusII软件。
本设计利用VHDL语言使用文本输入法,新建工程,通过设计输入、编译、仿真完成各种信号的设计,然后生成元器件,再使用原理图输入法完成各部分的整合,从而形成一个完整的多波形信号发生器,而后经过锁定引进下载数模转换可以在示波器观察到波形。
第二章 设计说明
2.1设计要求
要求电路至少可以产生正弦波、三角波、方波,并通过键盘切换三种波形的输出。
电路设计中充分利用EDA-V硬件平台实现该波形发生器,并使用示波器测量输出结果。
至少产生的如下波形
2.2设计思路
任意波形发生器是随着不断进步的计算机技术和微电子技术在测量仪器中的应用而形成和发展起来的一类新型信号源。
基于EDA-V硬件平台的任意波形发生器具有输出频率稳定、准确,波形质量好和输出频率范围宽等一系列独特的优点,是任意波形发生器研究的一个重要方向。
设计将三种波形合并,使它们按操作输出所需波形,波形选择及控制功能由时钟脉冲输入选择模块完成。
当选择一种波形时,对应的波形模块输入时钟脉冲,并输出波形数据,其他波形模块的输入则始终0,不能输出波形。
但是,其它波形模块始终有0信号输入,也能产生数据,会对输出的波形产生干扰。
因此,需要输出波形选择模块来选择有用的波形,隔离干扰数据。
为了同时实现时钟脉冲选择及输出波形选择,同时也为了消除延迟,在输出波形选择模块及时钟脉冲选择脉冲中采用同一组控制开关。
这样当输入一种控制数据时,输出的波形也就是所需的波形。
第三章 波形发生器的硬件结构
AWG的工作过程是,首先接收上位机送来的波形数字信号存储到SRAM,然后启动控制电路从SRAM取出数据送DAC进行数摸转换,转换后的模拟信号送低通滤波器形成波形。
如果DAC工作在150MSPS的速度下,可以以150MHz的频率送数据到DAC进行转换,微控制器的晶振输入一般工作在40MHz以下,没有这么高的速度送出数据到DAC,所以考虑采用CPLD构建硬件控制电路。
数据首先传送到SRAM,然后在CPLD硬件控制电路的控制下,以150MHz的频率从SRAM中取数送DAC转换。
其体系结构如图1所示。
如果要形成正弦周期信号,每周期4个点就可以合成一个波形,此时可以输出约38MHz的高频信号。
CPLD(复杂可编程逻辑器件)是在传统的PAL、GAL基础上发展而来的,具有多种工作方式和高集成、高速、高可靠性等明显的特点,在超高速领域和实时测控方面有非常广泛的应用。
及FPGA相比,CPLD比较适合计算机总线控制、地址译码、复杂状态机、定时/计数器、存储控制器等I/O密集型应用,且无须外部配置ROM、时延可预测等。
目前的CPLD普遍基于E2PROM和Flash电可擦技术,可实现循环擦写。
Altera公司的MAX7000CPLD配置有JTAG口,支持ISP编程。
用VHDL或VerilogHDL设计的程序,借助EDA工具经过行为仿真、功能仿真和时序仿真后,通过综合工具产生网表,下载到目标器件,从而生成硬件电路。
波形发生器的结构框图:
第四章 系统设计
本设计要求电路可以产生正弦波、三角波、方波三种波形,在具体的设计过程中,首先将此三种波形设计出来,并在示波器测量输出波形的正确性。
然后设计一个选择器,用来选择输出波形。
最后将选择器和三种波形联系起来,以实现通过键盘切换三种波形的输出。
4.1正弦波发生器的设计
4.1.1产生原理
正弦波可用两种方法,即计算法和查表法产生。
计算法要用浮点运算,复杂且耗时太长,一般不采用。
查表法是事先将正弦波的数据计算出来,列表放在程序中,运行时直接调取数据。
用公式y=127.5+127.5sin(360n/m)可计算出正弦波的输出值,公式中的m为输出点数,n=1,2,…m。
m值取小一些可以提高波形频率,但波形畸变会增大,增加输出点虽然可以改善波形,但输出频率会降低,实践表明,m取64时,可以得到很好的正弦波。
4.1.2原理图
4.2三角波发生器的设计
4.2.1产生原理
三角波的产生较为简单,因为它的上升沿遵循数据加8的规律。
下降沿则按数据减8的规律产生。
所以在波形的上升沿只要判断上一次的数据是否为最大值FFH,如果不是最大值,将原数据加8输出;而在波形的下降沿只要判断上一次数据是否为0,如果不是0,则将原数据减8即可,当数据为FFH或0时,应当及时调整升降标志,以便下一次能输出正确的数据。
4.2.2原理图
4.3方波发生器的设计
4.3.1产生原理
方波只有两个值,可以采用两个极端值0和FFH,这样只要将缓冲区中的数取出求反后输出即可。
设计者可据此直接写出方波程序。
4.3.2原理图
4.4波形选择器的设计
本设计出于提高人机交互的考虑,设计了3位独立键盘,分别控制波形输出类型,其原理图如下:
sel:
波形选择位,Q0:
正弦波,Q1:
三角波,Q2:
方波,qout:
波形输出
4.5D/A转换器
在整体系统中,波形的幅度值被量化成数字值存储在ROM中,通过一组数据线输出代表二进制编码的电平信号,为了将数字信号装换成模拟信号,需要用到数-模转换器,简称DAC(Digital-AnalogConverter)。
为了数据处理的准确性,DAC转换器必须有足够的转换精度。
同时为了能够在较高频率下工作,它必须有足够快的转换速度。
因此,转换精度和转换速度是衡量DAC转换器性能优劣的主要指标。
本设计中采用完整8位DAC转换器AD558,它的输入为8位二进制数。
DB0-DB7对应ROM的8位输出,CS、CE端直接接地,外接的参考电压Vref必须要有足够的稳定度,才能确保应有的转换精度。
第五章 设计结果
5.1软件仿真结果
5.1.1正弦波仿真结果
5.1.2三角波仿真结果
5.1.3方波仿真结果
5.1.4波形分析
在对系统进行波形仿真时可以在示波器上观察到三角波、正弦波和方波的波形。
其中三角波以及正弦波的输出有一定误差,方波波形较为理想。
这一方面及电路设置的参数有关,另一方面也及使用的仿真软件有关。
对于上述问题的解决办法是:
改变仿真电路的参数或着换用版本较高的仿真软件。
当然一般产生这种情况的原因多由于电路的参数设计不合理所制。
但从仿真波形上可以看出输出波形的频率大致及程序中的设置吻合。
波形的幅度及程序设置的最大值有关,而频率受机器周期的控制。
当仿真时,由于存在一定的系统误差,波形效果不是很好。
5.2硬件测试结果
定义好管脚,下载程序到硬件上,编译调试,控制sel的值,在示波器上看到产生的波形图如下:
当SEL=001时,产生正弦波:
当SEL=010时,产生三角波:
当SEL=100时,产生方波:
在示波器上观察到的三种波形如上所示,读出的频率f=3.1KHZ,幅度A=0.6V。
而理论上,系统外接频率是200KHZ,经计数器64分频后,得到的波形频率是3.125KHZ,及读出的频率3.1KHZ相近。
幅值由于没有校准,读出的0.6V是错误的,校准后正确的值为1.25V。
第六章 总结
本周为EDA课程实训周,在这一周的实训中,我学到了很多平时学不到的东西。
首先,通过这次实训,使我得到了一次全面的运用所学的知识分析和解决问题。
在这个过程中,刚开始我们是迷茫的,不知从何做起,通脱老师的指导,同学间的互相学习帮助,逐渐有了清晰的概念,也对自己的课题有了全面系统的了解。
逐渐由被动转为主动,能够自己去实现一些局部功能,到完成整个课题的设计。
也使我们再课堂学习到的模糊的概念也转化为清晰的认识。
例如:
刚开始的时候,我想着弄方波和三角波就改表就行,可老师说不许这样,于是我们都束手无策了。
但当我们静下心来时,就觉得试着写程序看看,后来发现我们是能写成功的。
才明白,原来很多时候是我们自己太不自信了,以为自己写不出来,但当自己真正去尝试的时候才发现一切并没有自己想象中的那么难,才对自己有了一个更加清楚的认识。
其次,我明白了谨慎小心对于实验来讲是必不可少的。
由于我们在对示波器进行校准时,只对其频率进行了校准,而没有对幅度进行校准,所以在最后进行读数的时候,其频率读的是对的,而幅度值去错的很离谱,就是因为校准的问题,让结果错了很远。
最后,我明白了团结合作的重要性。
如果这次没有我的队员的帮助,我想我不会这么顺利的完成这次的实训设计。
课程设计虽然结束了,但是我们还有很多的事情要做,对仍然不熟悉或不了解的知识点我们要尽快的去学习了解,对课程设计中出现的问题我们还要去认真的分析研究。
还有我们还需要去增强自己的动手能力,去不断的锻炼,只有这样该课程设计才能发挥最大的作用
以上便是我在此次实训中总结及体会。
第七章致谢
在这次的实训过程中,我要感谢很多人和单位,他们都对我提供了很大的帮助。
首先,我要感谢我们学校为我们提供了此次实训的设备资源和场所。
由于,这次的实训需要运用的知识有:
数字电子技术、数字电路EDA技术、C语言等。
而我们的赵欣老师就交了我们其中的2种知识,而且在这次实训中,在我们遇到一些问题时,老师都有指导我们怎样解决。
并且在平时的EDA实验中,都对我们耐心的指导,让我们积累了一定的经验,才能使我们在这次实训过程中能顺利的完成任务。
而且,赵欣老师在平时的授课过程中,讲课很有重点、不枯燥,这才使我们为这次实训打下了坚实的理论基础。
所以,在这里我们要特别感谢我们赵欣老师,谢谢!
其次,我还要感谢XX文库为我提供了一个大的资源共享场所,让我能在其中找到我所想要的一些资料,使我能很好的做好有关实训的一些基础工作。
然后,我还要感谢教我们《C语言》的肖丽娜老师。
肖丽娜老师讲课很有方法,让我们在轻松愉快的气氛中学到C语言的重要知识。
而且,她特别有责任心,不会因为要赶课而放弃教课的质量,仍然十分有耐心的教导我们,知道我们掌握了其知识。
正因为肖丽娜老师这样的精神,让我们能够更好的学习EDA的VHDL编程语言,才能在这次的是实训中,编写好各种波形的程序,进而使这次实训顺利的完成。
最后,我还要感谢所有在这次实训过程中帮助过我们的同学,特别是我的合作伙伴——朱丽丝同学。
是她的耐心和信心感染了了我,让我们能在不断地失败中总结经验,最终取得成功。
还有,也是她让我明白了团结合作的重要性及必要性。
在这里,我要再次感谢以上我提到的所有人和单位!
谢谢你们!
第八章 参考文献
(1)作者:
顾斌赵明忠姜志鹏马才根.
《数字电路EDA设计》.
西安:
西安电子科技出版社
2012.06.24访问
(2)作者:
shang_chris.
基于CPLD的任意波形发生器.
2011.06.24访问
(3)作者:
zhouqihong66.
简易波形发生器设计.
2011.06.24访问
(4)作者:
20087304114.
EDA课程设计6231.
2011.06.24访问
第九章 附录
7.1 相关芯片资料
7.1.1AD558D概述
AD558DACPORT®是一款完整的电压输出8位数模转换器,它将输出放大器、完全微处理器接口以及精密基准电压源集成在单芯片上。
无需外部元件或调整,就能以全精度将8位数据总线及模拟系统进行接口。
这款DACPORT器件的性能和多功能特性体现了近期开发的多项单芯片双极性技术成果。
完整微处理器接口及控制逻辑利用集成注入逻辑(I2L实现,集成注入逻辑是一种极高密度的低功耗逻辑结构,及线性双极性制造工艺兼容。
内部精密基准电压源是一种取得专利的低压带隙电路,采用+5V单电源时可实现全精度性能。
薄膜硅铬电阻提供在整个工作温度范围内保证单调性工作所需的稳定性(所有等级器件),对这些薄膜电阻运用最新激光晶圆调整技术则可实现出厂绝对校准,误差在±1LSB以内,因此不需要用户进行增益或失调电压调整。
新电路设计可以使电压在800ns内达到±1/2LSB精度(满量程步进)。
AD558提供四种性能等级产品。
AD558J和AD558K的工作温度范围为0°C至+70°C,AD558S和AD558T则为-55°C至+125°C。
J级和K级可采用16引脚塑料(N)或密封陶瓷(D)DIPS封装,也可采用20引脚JEDEC标准PLCC封装。
S级和T级均采用16引脚密封陶瓷DIP封装。
7.1.2AD558特点
∙完整8位DAC
∙电压输出:
两种校准范围
∙内部精密带隙基准电压源
∙单电源供电:
+5V至+15V
∙完全微处理器接口
∙快速建立时间:
1±s内电压达到±1/2LSB精度
∙低功耗:
75mW
∙无需用户调整
∙在工作温度范围内保证单调性
∙规定了Tmin至Tmax的所有误差
∙小型16引脚DIP和20引脚PLCC封装
∙激光晶圆调整单芯片供混合使用
7.1.3AD558封装图
7.2 相关程序;
计数器cnt的程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycntis
port(clk:
instd_logic;
q:
outstd_logic_vector(5downto0));
end;
architectureoneofcntis
signalq1:
std_logic_vector(5downto0);
begin
process(clk)
begin
ifclk'eventandclk='1'then
q1<=q1+1;
endif;
endprocess;
q<=q1;
endone;
正弦波程序:
libraryieee;--正弦波
useieee.std_logic_1164.all;
entityzhengxianis
port
(
address:
instd_logic_vector(5downto0);
inclock:
instd_logic;
outclock:
instd_logic;
q:
outstd_logic_vector(7downto0)
);
endzhengxian;
architecturesnyofzhengxianis
signalsub_wire0:
std_logic_vector(7downto0);
componentlpm_rom
generic(
lpm_width:
natural;
lpm_widthad:
natural;
lpm_address_control:
string;
lpm_outdata:
string;
lpm_file:
string
);
port(
outclock:
instd_logic;
address:
instd_logic_vector(5downto0);
inclock:
instd_logic;
q:
OUTstd_logic_vector(7downto0)
);
endcomponent;
begin
q<=sub_wire0(7downto0);
lpm_rom_component:
lpm_rom
genericmap(
lpm_width=>8,
lpm_widthad=>6,
lpm_address_control=>"registered",
lpm_outdata=>
"registered",
lpm_file=>"E:
/shixun/sin.mif"
)
protmap(
outclock=>outclock,
address=>address,
inclock=>inclock,
q=>sub_wire0
);
endsyn;
三角波程序:
libraryieee;--三角波
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitysanjiaois
port(clk:
instd_logic;
qin:
instd_logic_vector(5downto0);
q:
std_logic_vector(7downto0));
endsanjiao;
architecturebehaveofsanjiaois
signalqin1:
std_logic_vector(7downto0);
begin
process(clk)
begin
IFclk'eventandclk='1'then
if(qin="000000")then
qin1<="00000000";
elsIF(qin<"100000")then
qin1<=qin1+8;
elsif(qin="100000")then
qin1<="11111111";
else
qin1<=qin1-8;
endif;
endif;
endprocess;
q<=qin1;
endbehave;
方波程序:
libraryieee;--方波
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityFangboIS
port(clk:
instd_logic;
qin:
instd_logic_vector(5downto0);
q:
outstd_logic_vector(7downto0)
);
endentityfangbo;
architecturebehaveoffangbois
begin
process(clk)
begin
ifclk'eventandclk='1'then
if(qin<"100000")then
q<="11111111";
else
q<="00000000";
endif;
endif;
endprocess;
endbehave;
选择器程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityxzq1is
port(
sel:
instd_logic_vector(2downto0);
q0,q1,q2:
instd_logic_vector(7downto0);
qout:
outstd_logic_vector(7downto0)
);
endxzq1;
architectureoneofxzq1is
begin
process
begin
if(sel="001")then
qout<=q0;
elsif(sel="010")then
qout<=q1;
elsif(sel="100")then
qout<=q2;
elseqout<="00000000";
endif;
endprocess;
endon