正交信号发生器.docx
《正交信号发生器.docx》由会员分享,可在线阅读,更多相关《正交信号发生器.docx(20页珍藏版)》请在冰豆网上搜索。
正交信号发生器
湖南人文科技学院
课程设计报告
课程名称:
EDA技术与VHDL
设计题目:
正交信号发生器
系别:
通信与控制工程系
专业:
电子信息
组别:
电信本二班22组
学生姓名:
雷海军、杨辉
学号:
08409203、08409239
起止日期:
2011年6月13日~2011年6月27日
指导教师:
姚毅
教研室主任:
田汉平
指导教师评语:
指导教师签名:
年月日
成绩评定
项目
权重
成绩
1、设计过程中出勤、学习态度等方面
0.2
2、课程设计质量与答辩
0.5
3、设计报告书写及图纸规范程度
0.3
总成绩
教研室审核意见:
教研室主任签字:
年月日
教学院(系)审核意见:
主任签字:
年月日
前言
VHDL简介
硬件描述语言是EDA技术的重要组成部分,VHDL是电子设计的主流硬件描述语言。
VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年。
1987年底, VHDL被IEEE ( TheInstituteofElectricalandElectronicsEngineers)和美国国防部确认为标准硬件描述语言。
自IEEE公布了VHDL的标准版本(IEEE-1076)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。
此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准硬件描述语言。
1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本。
现在,VHDL作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。
VHDL的优点
VHDL主要用于描述数字系统的结构、行为、功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项设计实体(可以是一个元件、一个电路模块或一个系统)分成外部和内部两个基本点部分,其中外部为可见部分,即系统的端口,而内部则是不可视部分,即设计实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
应用VHDL进行工程设计的优点是多方面的,具体如下:
1)设计技术齐全、方法灵活、支持广泛。
VHDL语言可以支持自上至下和基于库的设计法,而且还支持同步电路、异步电路及其他随机电路的设计。
目前大多数EDA工具都支持VHDL语言。
2)VHDL具有更强的系统硬件描述能力,VHDL具有多层次描述系统硬件功能的能力,其描述对象可从系统的数学模型直到门级电路。
3)VHDL语言可以与工艺无关编程。
在用VHDL语言设计系统硬件时,没有嵌入与工艺有关的信息。
当门级或门级以上层次的描述通过仿真检验以后,再用相应的工具将设计映射成不同的工艺。
这样,在工艺更新时,就无须修改原设计程序,只要改变相应的映射工具。
4)VHDL语言标准、规范,易于共享和复用。
设计要求
基于MATLAB和DSPBuilder的EDA开发技术在很多方面都优于其他方面,和传统的模拟信号发生器相比,由此设计信号发生器频率精度高、相位精确可控、硬件简单。
因此在许多对信号频率稳定性和分辨率要求较高的场合得到广泛的应用。
所以本次设计的正交信号发生主要采用这种方法,已达到设计简单、调整方便、功能完备。
此设计采用FPGA/CCPLD,能通过按键进行幅度增减控制,使输出信号的频率在10Hz~10KHz之间扫频输出,还可以停在某一频率上保持不变,且输出波形最大峰-峰值大于3V,并不失真等功能。
PLD实现了从多需要大量逻辑器件实现的功能,方便而且稳定。
输出采用了高速D/A(DAC0809)和高速运放,输出正交波形稳定清晰。
一、论证与比较
1.常见信号源制作
方案一:
采用模拟分立元件或单片压控函数发生器MAX038,可产生正交的波,通过整体外部元件可改变输出频率,但采用模拟器件由于元件分散太大,即使使用单片函数发生器,参数也与外部元件有关,外接的电阻电容对参数影响很大,因而产生的频率稳定度较精度低,抗干扰能力低,成本也高;而且灵活性较差,不能实现波形频率及其幅度等智能化的功能。
方案二:
采用说锁相式频率合成方案。
锁相式频率合成是将一个高精度和高稳定的标准频率经过加减乘除的运算生成同样稳定度和精确度的大量离散频率的技术,它在一定程度上解决了既要频率稳定改变、又要频率在10HZ-100KHZ可变的矛盾。
但频率受VCO可变频率范围的影响,高低频率比不可能做得很高,而且只能产生方波或正弦波的正交信号,不能满足其要求。
方案三:
采用DDS,即直接数字频率合成方案。
这是实际应用上能满足所有要求并最简单的方案。
2.方案论证
DDS的工作原理
DDS的结构原理图如图1.1所示,DDS以数控振荡器的方式,产生频率、相位和幅度可控的正交波。
电路包括了相位累加器、相位调制器、正弦ROM查找表、余弦ROM查找、表基准时钟源、D/A转换器等组成。
其中前四者是DDS结构中部分,具有数控频率合成的功能。
图1.1DDS原理图框图
DDS系统的核心是相位累加器,完成相位累加过程。
在基准时钟的控制下,频率控制字由累加器累加,以得到相应的相位数据,相位调制器接收相位累加器的相位输出,主要用于信号的相位调制,其输出的数据作为取样地址来寻址正弦ROM查找表、余弦ROM查找,完成相位-幅度变换,输出不同的幅度编码;再经过D/A转换器得到相应的阶梯波;最后经低通滤波器对阶梯进行平滑处理,即可得到由频率控制字决定的连续变换输出的正交波。
二、总体设计
1.1.系统框图
正交信号的VHDL设计原理图如图2.1所示:
正交信号发生器主要由Matlab/Simulink转化而成的zheng1模块、10位/32位的加减计数器cnt10、cnt32组成。
zheng1模块主要用于正交波形的生成;10位加减计数器cnt10用来实现幅度变化,以达到幅度在3v以上;32位加减计数器cnt32用来实现频率变化,使频率变化范围在10HZ-10KHZ。
图2.1正交信号原理图
各模块设计及其参数计算
2.zheng1模块说明
DSS的zheng1模块原理图如图3.1所示:
图3.1DDS的zheng1模块原理图
由于不需要相位调制,DSS的zheng1模块的16位相位输入端口用常数项接入,而幅度、频率要按要求有变化,所以10位的幅度输入端口、32位的频率输入端口接入相应的10/32的加减计数器,以达到幅度、频率能增减。
但用MATLAB中的示波器观测时,频率输入端口、幅度输入端口常接入常数模块。
基于DSPBuilder的DDS的zheng1系统如图3.1和图3.3所示,DDS子系统Sub1(如图3.3)有3个输入,分别为Freqword(32位频率控制字)、Phaseword(16位相位控制字)、Amp(10位幅度控制字);二个输出,即10位sin-Out、、cos-Out输出。
2个ParallelAdderSubtractor分别为相位累加器和相位调制器,LUT为正弦ROM查找表、余弦ROM查找表。
设置Simulink的仿真停止时间stoptime为5,仿真步进FixedStepSize为le-3。
图3.1对应频率、相位和幅度控制字分别为9000000,0和200(参数1)时DDS的zheng1系统的输出波形,用示波器观测的波形如图3.2所示。
图3.2正交信号输出波形
其Sub1子系统如图3.3所示
图3.3Sub1系统
3.DSS的zheng1模块参数计算
对于一个正交信号发生器,它的输出可以用下式来描述:
公式(3-1)
公式(3-2)
其中
是指该信号发生器的输出信号波形,
指输出信号对应的频率。
上式表明信号对于时间是连续的,为了用数字逻辑实现该表达式,必须进行离散化处理,用基准时钟clk进行抽样,令正余弦信号的相位:
公式(3-3)
在一个clk周期
,相位
的变化量为:
公式(3-4)
其中
是指clk的频率对于
可以理解成“满”相位,为了对
进行数字量化,把
切割成
份,由此每个clk周期的相位增量
用量化值
来表达:
,且
为整数,与式3-4联立,可得:
,
公式(3-5)
显然,信号发生器的输出可描述为:
公式(3-6)
公式(3-7)
其中
指前一个clk周期的相位值,得出:
公式(3-8)
由上面的推导可知,只要对相位的量化值进行简单的累加运算,就可得到正弦信号的当前相位值,而用于累加的相位增量量化值
决定了信号的输出频率
,并呈线性关系。
直接数字频率合成器就是根据上述基本原理而设计的数字控制频率合成器。
如图1.1所示为基本DDS结构,由相位累加器、相位调制器、正弦ROM查找表、余弦ROM查找表、D/A构成。
相位累加器是整个DDS的核心,完成相位累加运算。
相位累加器的输入是相位增量
,又由于
与输出频率
呈线性关系:
因此相位累加器的输入又可称为频率字输入。
相位调制器接收相位累加器的相位输出,加上一个相位偏移量,用于信号的相位调制,不用时可以去掉,或者加一固定值。
正弦ROM查找表完成
的查表转换,余弦ROM查找表完成
的查表转换,也就是相位到幅度的转换,它的输入是相位调制器的输出,事实上就是ROM的地址。
3.10/32计数器模块说明
计数器的步长是指计数器每次的改变量,比如上一个计数器每次改变的时候要么加1,要么减1,因此我们说该计数器的步长为1。
在很多应用场合,都希望计数器的步长可变。
所谓步长可变,也就是计数器的步长是一个不定值,具体是多少是要靠外部干预的,比如外部给定其步长为5,那么该计数器每次要么增加5,要么减少5,也就是说计数器每次改变量是5
三、硬件测试及实现法案
1.FPGA介绍
本设计方案采用的FPGA芯片是ALTERA公司的Cyclone系列芯片EP1C6Q240C8,,其容量6000个逻辑宏单元,等效于标准15万逻辑门电路,速度为-8,完成可通过单片芯片电路实现DDS,相位累加和相位调制器均为32位,正弦ROM查找表存储1024×10b波形数据,系统时钟为55.6MHz,利用FPGA可以根据需要方便地实现各种比较复杂的调频,调相和调幅功能,具有浪费的实时性。
2.硬件下载
用Matlab/Simulink对已经设计好的DDS的zheng1模块系统进行编译,通过调用DSPBuilder的SignalCompiler工具可直接生成QuartusⅡ工程文件,其次在QuartusⅡ转化成zheng1原理图,再次在QuartusⅡ中设计如图2.1的bdf原理图,最后引脚下载和调用QuartusⅡ完成综合,选择模式1,直至完成FPGA的配置下载过程。
3.硬件实现
在FPJA的实验箱上,en1锁定键1,en2锁定键8,rst1锁定键2,rst2锁定键7,当要改变幅度时,可以按下键1;当要改变频率时,可以按下键8;以达到设计要求的幅度、频率变化。
键2、键7是使10/32计数器清零的信号,使设计能更加完善。
4.测试中出现的问题
1.在Matlab/Simulink对已经设计好的DDS的zheng1模块系统进行编译生成QuartusⅡ工程文件,无法转化,最后发现是Matlab/Simulink、QartusⅡ没有授权。
于是,右键单击[我的电脑],选择[属性],在出现的对话框中找到[高级],选择[环境变量],加入授权文件即可。
2.
四、总结与思考及致谢
二周的电子课程设计与学习,让我加深了对EDA课本知识的理论基础的理解,初步掌握了一些关于设计的基础知识,做到理论与实践相结合。
其次还培养了独立思维能力,开拓了知识面,锻炼了动手操作与解决困难的能力。
这次设计也暴露了许多的缺点,如一些具体的基本操作能力不很熟练,相关的知识也不够全面,在这些方面需要不断的磨练。
这次课程设计还让我们体会到扎实的基础理论知识和严谨认真的态度,加上熟练的操作动手能力是设计好一个题目必不可少的条件。
在以后的阶段必须在此方面下一番苦功夫为以后的毕业设计论文打下扎实的基础。
以及在学习生活中要树立端正的学习态度,多多加强理论知识的学习不懂的问题要向老师多多请教。
同时在这次课程设计中也离不开老师同学各方面的支持与帮助。
在此特别感谢陈新师、杨玲老师、田汉平老师,老师们为本设计提供一些重要的参考意见和耐心的指导,也要感谢本班同学给予的帮助,便以此向他们表示诚挚的感谢。
五、参考文献
1)EDA技术与VHDL(第二版).潘松,黄继业编著.清华大学出版社
2)VHDL设计实例与仿真姜雪松王鹰等编著.机械工业出版社
六、附录
1.VHDL设计
cnt10设计程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt10is
port(clk,rst,en:
instd_logic;
cq:
outstd_logic_vector(9downto0));
endcnt10;
architecturebehavofcnt10is
begin
process(clk,rst,en)
variablecqi:
std_logic_vector(9downto0);
begin
ifrst='1'thencqi:
=(others=>'0');
elsifclk'eventandclk='1'then
ifen='1'then
cqi:
=cqi+1;
endif;
ifen='0'then
cqi:
=cqi-1;
endif;
endif;
cq<=cqi;
endprocess;
endbehav;
libraryieee;
cnt32设计程序
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt32is
port(clk,rst,en:
instd_logic;
cq:
outstd_logic_vector(31downto0));
endcnt32;
architecturebehavofcnt32is
begin
process(clk,rst,en)
variablecqi:
std_logic_vector(31downto0);
begin
ifrst='1'thencqi:
=(others=>'0');
elsifclk'eventandclk='1'then
ifen='1'then
cqi:
=cqi+1;
endif;
ifen='0'then
cqi:
=cqi-1;
endif;
endif;
cq<=cqi;
endprocess;
endbehav;
正交信号的DDS设计程序
--------------------------------------------------------------------------------------------
--DSPBuilder(Version2.1.3Build31)
--QuartusIIdevelopmenttoolandMATLAB/SimulinkInterface
--Copyright?
2001-2003AlteraCorporation.Allrightsreserved.
--TheDSPBuildersoftware,including,withoutlimitation,theclock-cyclelimited
--versionsoftheMegaCore?
LogicFunctionsincludedtherein,mayonlybeusedto
--developdesignsforprogrammablelogicdevicesmanufacturedbyAlteraCorporation
--andsoldbyAlteraCorporationanditsauthorizeddistributors.INNOEVENTMAY
--SUCHSOFTWAREANDFUNCTIONSBEUSEDTOPROGRAMANYPROGRAMMABLELOGICDEVICES,FIELD
--PROGRAMMABLEGATEARRAYS,ASICS,STANDARDPRODUCTS,ORANYOTHERSEMICONDUCTOR
--DEVICEMANUFACTUREDBYANYCOMPANYORENTITYOTHERTHANALTERA.Forthecomplete
--termsandconditionsapplicabletoyouruseofthesoftwareandfunctions,please
--refertotheAlteraProgramLicensedirectory
----------------------------------------------------------------------------------------------
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_signed.all;
librarydspbuilder;
usedspbuilder.dspbuilderblock.all;
librarylpm;
uselpm.lpm_components.all;
Entityzheng1is
Port(
clock:
instd_logic;
sclrp:
instd_logic:
='0';
iam1s:
instd_logic_vector(9downto0);
ifw1s:
instd_logic_vector(31downto0);
ocosouts:
outstd_logic_vector(9downto0);
osinouts:
outstd_logic_vector(9downto0));
endzheng1;
architectureaDspBuilderofzheng1is
signalSAcosoutO:
std_logic_vector(9downto0);
signalSAsinoutO:
std_logic_vector(9downto0);
signalsclr:
std_logic:
='0';
signalA0W:
std_logic_vector(16downto0);
signalA1W:
std_logic_vector(10downto0);
signalA2W:
std_logic_vector(32downto0);
signalA3W:
std_logic_vector(10downto0);
signalA4W:
std_logic_vector(10downto0);
--SubSystemHierarchy-SimulinkBlock"zhengjiaoxinhao"
componentzhengjiaoxinhao
port(
clock:
instd_logic;
sclr:
instd_logic;
iphasewords:
instd_logic_vector(15downto0);
ifreqwords:
instd_logic_vector(31downto0);
iamps:
instd_logic_vector(9downto0);
oOutputs:
outstd_logic_vector(9downto0);
oOutput1s:
outstd_logic_vector(9downto0)
);
endcomponent;
Begin
assert(1<0)reportaltversionseverityNote;
ocosouts<=SAcosoutO;
osinouts<=SAsinoutO;
sclr<=sclrp;
--Input-I/OassignmentfromSimulinkBlock"iam1s"
A1W(9downto0)<=iam1s;
A1W(10)<='0';
--Input-I/OassignmentfromSimulinkBlock"ifw1s"
A2W(31downto0)<=ifw1s;
A2W(32)<='0';
--Constantassignment-SimulinkBlock"Constant"
A0W(16)<='0';
A0W(15downto0)<="0000000000000000";
--UnsignedtoSignedtypeextensionmsb<='0'
A3W(10)<='0';
--UnsignedtoSignedtypeextensionmsb<='0'
A4W(10)<='0';
--Output-I/OassignmentfromSimulinkBlock"cosout"
cosouti:
SBFgenericmap(
width_inl=>11,
width_inr=>0,
width_outl=>10,
width_outr=>0,
lpm_signed=>BusIsUnsigned,
round=>0,
satur=>0)
portmap(
xin=>A4W,
yout=>SAcosoutO);
--Output-I/OassignmentfromSimulinkBlock"sinout"
sinouti:
SBFgenericmap(