正交信号发生器课程设计.docx

上传人:b****2 文档编号:17573211 上传时间:2023-07-26 格式:DOCX 页数:25 大小:186.77KB
下载 相关 举报
正交信号发生器课程设计.docx_第1页
第1页 / 共25页
正交信号发生器课程设计.docx_第2页
第2页 / 共25页
正交信号发生器课程设计.docx_第3页
第3页 / 共25页
正交信号发生器课程设计.docx_第4页
第4页 / 共25页
正交信号发生器课程设计.docx_第5页
第5页 / 共25页
正交信号发生器课程设计.docx_第6页
第6页 / 共25页
正交信号发生器课程设计.docx_第7页
第7页 / 共25页
正交信号发生器课程设计.docx_第8页
第8页 / 共25页
正交信号发生器课程设计.docx_第9页
第9页 / 共25页
正交信号发生器课程设计.docx_第10页
第10页 / 共25页
正交信号发生器课程设计.docx_第11页
第11页 / 共25页
正交信号发生器课程设计.docx_第12页
第12页 / 共25页
正交信号发生器课程设计.docx_第13页
第13页 / 共25页
正交信号发生器课程设计.docx_第14页
第14页 / 共25页
正交信号发生器课程设计.docx_第15页
第15页 / 共25页
正交信号发生器课程设计.docx_第16页
第16页 / 共25页
正交信号发生器课程设计.docx_第17页
第17页 / 共25页
正交信号发生器课程设计.docx_第18页
第18页 / 共25页
正交信号发生器课程设计.docx_第19页
第19页 / 共25页
正交信号发生器课程设计.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

正交信号发生器课程设计.docx

《正交信号发生器课程设计.docx》由会员分享,可在线阅读,更多相关《正交信号发生器课程设计.docx(25页珍藏版)》请在冰点文库上搜索。

正交信号发生器课程设计.docx

正交信号发生器课程设计

湖南人文科技学院

课程设计报告

课程名称:

VHDL语言与EDA课程设计

 

设计题目:

正交信号发生器

系别:

通信与控制工程系

专业:

电子信息工程

班级:

10级电子信息工程3班

学生姓名:

学号:

起止日期:

2013年6月8日~2012年6月18日

指导教师:

教研室主任:

摘要

EDA技术是指以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计。

本文详细介绍了基于FPGA的DSP开发技术,提供了一种设计正交信号发生器的方案。

在信号检测和信号处理中经常需要正交信号。

由于正交方波信号较易得到,所以工程人员进行相关检测时所采用的正交信号源通常为方波信号。

但通过对方波信号作傅立叶分析可知,这种信号含有丰富的谐波分量,严重影响相关检测中的接收精度及检测灵敏度。

采用可控的正、余弦波作正交信号,就可以有效地避免谐波问题。

本文采用Matlab/DSPBuilder建立模型来实现正交信号发生器,使用自顶向下的设计方法,设计简单,能够提高设计效率。

利用DSPBuilder建立起数学模型,实现了模块化的设计变得直观。

在Simulink中进行仿真验证,通过SignalCompiler将模型转换成硬件描述语言,经过QuartusⅡ仿真正确后,下载到FPGA里,输出的正交信号能灵活的调频,调相,调幅,实现全数字化设计。

该方案简化了硬件设计的难度。

对各个模块的参数进行简单的设置就能完成复杂的电子设计系统设计。

关键词:

EDA技术;DSPBuilder;正交信号发生器;SignalCompiler

 

正交信号发生器

设计要求

能通过按键进行幅度控制,输出信号的频率在10—50kHZ,或者固定在某一频率上,要求峰-峰值大于3V,且输出波形不失真。

1、方案论证与对比

1.1方案一

该方案根据矩阵式键盘输入给FPGA送出频率控制字与相位控制字,用于设定输出正弦波的频率与相位。

高速D/A转换器用于正弦波的DA转换。

FPGA构成DDS的核心部分,用于接收送来的频率字与相位字,同时给DA转换器输出正弦波数据。

采用字符型液晶显示屏实时显示输出的频率与相位。

该方案需借助QuartusⅡ来完成。

 

1.2方案二

该方案是基于DSPBuilder与DDS并借助于MATLAB进行设计的。

首先在Matlab中DSPBuild的Simulink中进行建模,系统仿真通过SignalCompiler将模型设计文件转换成相应的硬件描述语言(VHDL),在QuartusⅡ平台上进行综合生成网表文件,并适配下载至FPGA。

在这个方案中,有两路正弦信号,一路为参考信号,另一路是可数控的移动信号,并且这两路可同步进行幅度和频率数控,即对于这两路输出的正弦信号,在相位、频率和幅度3个参数上都能完成等步长数控步进,而且还能对指定的参数进行设定。

1.3方案选择

方案一是基于QuartusⅡ,在设计的过程中,利用VHDL完成电路设计,必须借助于EDA工具中的综合器、适配器、时序仿真器和编程器等工具进行相应的处理,才能使此项设计在FPGA上完成硬件实现并得到硬件测试,在进行HDL文本输入设计流程中比较繁琐,而且容易出错。

而方案二是基于DSPBuilder进行手动流程设计,在设计过程中,DSPBuilder会自动完成VHDL的转换、综合、适配,而不像方案一那样要进行HDL文本输入,这样的话就能避免文本输入过程中的绝大多数错误。

因而我们选择方案二。

2、系统总体方案设计及实现

2.1正交信号发生器设计

2.1.1DDS原理及设计

直接数字频率合成技术(DirectDigitalSynthesis,DDS)是一种从相位概念出发直接合成所需要的波形的新的全数字频率合成技术,该技术具有频率分辨率高、频率变化速度快、相位可连续性变化等特点,在数字通信系统中被广泛采用,是信号生成的最佳选择。

DDS主要由相位累加器、相位调制器、正弦ROM查找表、D/A转换器等组成。

系统时钟clk由一个稳定的晶体振荡器产生,用来同步整个合成器的各组成部分。

同步寄存器的使用是为了当输入的频率字改变时不会干扰相位累加器的正常工作。

相位累加器是整个DDS的核心,它由N位加法器和N位相位寄存器级联构成,类似一个简单的加法器,完成上面推导中的相位累加功能。

每来一个时钟脉冲,加法器就将输入的N位频率字与相位寄存器输出的累加相位数据相加,然后将相加后的结果送至相位累加器的输入端,相位寄存器就将在上一个时钟作用后产生的新相位数据反馈到加法器的输入端,以使加法器在下一个时钟的作用下继续将相位数据与输入的频率字相加。

当相位累加器累加满量(2π)时,就会产生一次溢出,完成一个周期性的动作,这个周期就是合成信号的一个周期,累加器的溢出频率就是DDS的合成信号频率。

相位调制器接收相位累加器的相位输出,并与一个相位偏移值相加,主要用于信号的相位调制,如PSK(相移键控)等。

在不使用时可去掉该部分,或加一个固定的相位字输入。

注意相位字输入也要用同步寄存器保持同步,但相位字输入的宽度M与频率字输入N往往是不相等的,一般M

正弦ROM查找表的作用是完成查表转换,或理解为相位到幅度的转换。

将相位累加器或相位调制器输出的相位数据作为取样地址,来寻找正弦ROM表进行相位到幅度的变换,输出不同的幅度编码。

经D/A转换器得到相应的阶梯波,最后经过低通滤波器对阶梯波进行平滑处理,得到由输入的频率字决定的连续变化的输出正弦波。

下面的即为基本DDS结构的常用参数计算公式:

输出频率:

频率字:

其中

是频率控制字,

为系统基准时钟的频率值,N为相位累加器的数据位宽,也是频率控制字的数据位宽。

下图为DDS基本结构原理图,仔细观察。

频率控制字的可调整性使得系统输出频率非常容易调整。

输出正弦波频率f=fclk*frequword/2^20,系统时钟,频率控制字DDS系统时钟12MHz,异步于CPU时钟20bit频率控制字,8bit相位控制字,8bit数据输出每波形抽样256个点。

相位累加器

相位累加器结构如图(4)所示。

假设系统时钟为Fc,输出频率为Fout。

每次转动一个角度360°/2N,则可以产生一个频率为Fc/2N的正弦波的相位递增量。

那么只要选择恰当的频率控制字M,使得Fout/Fc=M/2N,就可以得到所需要的输出频率Fout,Fout=Fc*M/2N,相位幅度转换通过相位累加器,我们已经得到了合成Fout频率所对应的相位信息,然后相位幅度转换器把0°~360°的相位转换成相应相位的幅度值。

(1)相位累加器结构如图(4)所示。

图4相位累加器

(2)如图5所示,该部分是频率字输入,不同的频率字输入会使得信号输出波形的频率不同。

图5频率字输入

(3)如图6所示,该部分是输入地址为6位,输出值位宽为8的正弦查找表模块,且输入地址总线为无符号整数。

图6LUT模块

高速D/A模块

GW_ADDA板含两片10位超高速DAC(转换速率最高150MHz),D/A全部处于使能状态,除了数据线外,任一器件的控制信号线只有时钟线,这有利于高速控制和直接利用MATLAB/DSPBuilder工具的设计。

GW_ADDA板上工作时钟必须由FPGA的I/O口提供,优点是时钟频率容易变化,且可通过Cyclone中的PLL的到几乎任何时钟频率。

由此即可测试DAC的最高转换频率。

两个电位器可分别调协两个D/A输出的幅度(输出幅度峰峰值不可大于5V,否则波形失真);模拟信号从接插口的2针“AIN”输入,J1和J2分别是模拟信号输出的PA、PB口,也可在两挂钩处输出,分别是两个10位DA5651输出口。

电路原理图如图7所示。

相位累加器结构如图(4)所示。

假设系统时钟为Fc,输出频率为Fout。

每次转动一个角度360°/2N,则可以产生一个频率为Fc/2N的正弦波的相位递增量。

下图为高速DA模块电路原理图,认真理解并运用:

 

图7高速DA模块电路原理图

2.1.2频率字输入的计算

由DDS的频率输入字公式:

计算,式中N为相位累加器的数据位宽,也是频率输入字的数据位宽,fclk是系统基准时钟的频率值。

本设计中N=20,fclk=12MHZ,fout=50KHZ根据计算得出频率输入字为4369。

2.1.3输出波形峰峰值的计算

本设计中正弦查找模块输入地址为8位,输出位宽为10位,且输入地址总线为无符号整数,可设置起始值为0、结束值为2π、步进值为2π/26。

为了得到完整满度的波形输出,计算式可写成:

511*sin[0:

2*pi/2^8]:

2*pi]+512

2.1.4相位差的计算

本设计用8bit相位控制字,8bit数据输出每波形抽样2^8=256个点,所以每按一键增加或减小相位差为3600/256=1.400符合设计要求。

2.1.5正交信号发生器电路模型图

两个电位器可分别调协两个D/A输出的幅度,使用时一定要调节好,使之能调幅。

基于DDS的正交信号发生器是整个系统的设计核心部分,其电路模型图如图8所示。

图8基于DDS的正交信号发生器MDL模型

DDS用来产生频率、相位和幅度可变的正弦波。

DDS的工作原理是利用正弦信号的相位与时间呈线性关系的特性”1,采用相位累加方法作为地址,读出相应ROM中的值,得到正弦信号的瞬时幅值,实现频率合成。

DDS包括频率控制字、相位控制字、同步寄存器、相位累加器、波形存储器、数模转换器、低通滤波器。

在系统时钟的控制下.相位累加器对频率控制字K进行累加,得到相位码,相位码寻址ROM得到幅值码,经过数模转换后得到相应的阶梯波,再经过低通滤波得到连续平滑的、由频率控制字K决定的模拟输出波形。

DDS可以用来产生多种波形,只要改变ROM中的数据.预先设置成正弦波、余弦波等,根据查表就可以实现不同的波形。

利用DSP

Builder设计DDS。

然后转换成VHDL。

DDS的分辨率在相位累加器的位数^,足够大时,理论上可以获得相应的分辨精度。

DDS是一个全数字结构的开环系统,无反馈环节,速度非常快。

DDS的相位误差主要依赖于时钟的相位特性,相位误差小,相位是连续变化的,形成的信号具有良好的频谱。

这是传统的直接频率合成方法无法实现的。

相位字输入的数据宽度M往往小于相位寄存器字长,实际的DDS结构中Ⅳ很大。

其中Subsystem的原理图如图9

图9Subsystem的原理图

2.1.6Simulink模型的仿真

在Sinout模型编辑窗口中,选择Slimulation→Start命令,开始仿真,等待仿真结束后,双击Scope模块,打开Scope观察窗口。

其仿真波形如图10

图10simulink模型仿真图

2.2SignalCompiler的使用

2.2.1分析当前的模块

双击Sinout模型中的SignalCompiler模块,之后单击Analyze按钮后,SignalCompiler就会对Sinout模型进行分析,检查模型有无错误,并在MATLAB主窗口中弹出对话框,并给出相关信息。

2.2.2设置SignalCompiler

SignalCompiler窗口中大致分为3个功能部分:

项目设置选项

硬件编译流程

信息框

2.2.3把模型文件MDL转换成VHDL

当设置好Device和Synthesis后,右侧的硬件编译部分就会列出一个操作:

(1)ConvertMDLtoVHDL

(2)Synthesis

(3)QuartusⅡ

2.2.4综合

单击步骤

(2)的图标,完成综合过程。

2.2.5QuartusⅡ试配

单击步骤(3)的图标,调用QuartusⅡ完成编译试配过程,生成编译文件。

编译文件可以直接用于FPGA的编译配置。

打开QuartusⅡ后,需在VHDL文件程序中实体说明中添加:

CLK:

outstd_logic;

在结构体最后加入:

CLK<=CLOCK;

2.3嵌入式锁相环的设计

当输出波形频率较高时,由于采样一个完整周期的波形数据点数减少,势必引起波形失真,要消除波形失真,一是可以增加采样波形数据的点数,二是提高系统的主工作时钟频率。

若不增加外配ROM的情况下,可以使用后一种方法。

本系统设计时在充分利用FPGA的存储空间的情况下,为了提高波形的输出频率(在不失真的条件下),还使用了Cyclone器件中的嵌入式锁相环,提高系统的主工作时钟频率,在实际工作时的主时钟频率达12MHz。

2.4引脚的锁定

设计中各引脚的锁定如图11所示。

本设计选择工作模式1,通过键盘控制波形输出的幅度。

图11各引脚的锁定

3、设计结果与结论

(1)嵌入式逻辑分析仪输出波形如图12

图12嵌入式逻辑分析仪输出波形

(2)波形失真度与储存波形ROM的位数及主工作时钟频率有关。

(3)1.,2,3键控制幅度,其中1是微调,2,3粗调。

由于我们频率设定在一个固定值,在10HZ到50KHZ之间,能够实现在峰峰值大于3V波形不失真。

且波形较稳定。

4、结束语及致谢

在本文的撰写过程中,老师作为我们的指导老师,他们治学严谨,学识渊博,视野广阔,为我营造了一种良好的学术氛围。

置身其间,耳濡目染,潜移默化,使我不仅接受了全新的思想观念,树立了明确的学术目标,领会了基本的思考方式,掌握了通用的研究方法,而且还明白了许多待人接物与为人处世的道理。

其严以律己、宽以待人的崇高风范,朴实无华、平易近人的人格魅力,与无微不至、感人至深的人文关怀,令人如沐春风,倍感温馨。

这段时间的学习,使我们了解到了理论和实际之间的差别,第一次真正接触到了实际中的问题,并通过和老师、同学交流,加强了自身的分析问题、解决问题的能力。

同时,我们也发现了自己在某些方面的不足,这是我们以后要加以改进的方面。

对于如何运用MATLAB与DSPbuilder有了更好的运用,使我们对硬件课程的学习有了更浓的兴趣,使我们对我们所学的这个方向服了更浓的兴趣。

虽然在做课设的过程中遇到过许多困难,尤其是思路一开始不正确的时候也产生过放弃的念头,但最终还是坚持了下来,终于把这个课设完整圆满的做完了。

在此特向老师致以衷心的谢意!

向他们无可挑剔的敬业精神、严谨认真的治学态度、深厚的专业修养和平易近人的待人方式表示深深的敬意!

5、元器件及仪器设备明细表

设备与器件名

数量

备注

计算机

1台

MATLAB软件

1套

MATLAB7.0

DSPBuilder软件

1套

DSPBuilder6.0

Quartus开发软件

1套

QuartusII6.0

EDA实验箱

1个

GW48-PK2

数字示波器

1台

ADS7022S

6、参考文献

[1].边计年,薛宏熙译.用VHDL设计电子线路.北京:

清华大学出版社,2000.

[2].黄正谨,徐坚等.CPLD系统设计技术入门与应用.北京:

电子工业出版社,2002.

[3].蒋璇,蔵春华.数学系统设计与PLD应用技术.北京:

电子工业出版社,2001..

[4].李宗伯,王蓉晖译.VHDL设计表示和综合.北京:

机械工业出版社,2002.

[5].潘松,黄继业,王国栋.现代DSP技术.西安:

西安电子科技大学出版社,2003.

[6].王金明,杨吉斌.数字系统设计与VerilogHDL.北京:

电子工业出版社,2002.

[7].王锁萍.电子设计自动化(EDA)教程.成都:

电子科技大学出版社,2000.

[8].徐志军,徐光辉.CPLD/FPGA开发与应用.北京:

电子工业出版社,2002.

[9].AlteraCorporation.AlteraDigitalLibrary.Altera,2002.

[10].XilinxInc.DataBook2001.Xilinx,2000.

 

7、程序清单

usedspbuilder.dspbuilderblock.all;

librarylpm;

uselpm.lpm_components.all;libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_signed.all;

librarydspbuilder;

Entitybiaozhun1is

Port(clk:

outstd_logic;

clock:

instd_logic;

sclrp:

instd_logic:

='0';

Input:

instd_logic_vector(7downto0);

Input1:

instd_logic_vector(31downto0);

Input2:

instd_logic_vector(7downto0);

Input3:

instd_logic_vector(7downto0);

Output:

outstd_logic_vector(9downto0);

Output1:

outstd_logic_vector(9downto0)

);

endbiaozhun1;

architectureaDspBuilderofbiaozhun1is

signalSAOutputO:

std_logic_vector(9downto0);

signalSAOutput1O:

std_logic_vector(9downto0);

signalsclr:

std_logic:

='0';

signalA0W:

std_logic_vector(32downto0);

signalA1W:

std_logic_vector(9downto0);

signalA2W:

std_logic_vector(15downto0);

signalA3W:

std_logic_vector(8downto0);

signalA4W:

std_logic_vector(32downto0);

signalA5W:

std_logic_vector(8downto0);

signalA6W:

std_logic_vector(8downto0);

signalA7W:

std_logic_vector(33downto0);

signalA8W:

std_logic_vector(23downto0);

signalA9W:

std_logic_vector(32downto0);

signalA10W:

std_logic_vector(19downto0);

signalA11W:

std_logic_vector(19downto0);

signalA12W:

std_logic_vector(33downto0);

signalA13W:

std_logic_vector(34downto0);

signalA14W:

std_logic_vector(10downto0);

signalA15W:

std_logic_vector(10downto0);

signalA16W:

std_logic_vector(10downto0);

signalA17W:

std_logic_vector(10downto0);

signalA18W:

std_logic_vector(10downto0);

Begin

assert(1<0)reportaltversionseverityNote;

Output<=SAOutputO;

Output1<=SAOutput1O;

--Globalresetcircuitryfortheinputglobalresetsclrp

sclr<=sclrp;

--Input-I/OassignmentfromSimulinkBlock"Input"

A3W(7downto0)<=Input;

A3W(8)<='0';

--Input-I/OassignmentfromSimulinkBlock"Input1"

A4W(31downto0)<=Input1;

A4W(32)<='0';

--Input-I/OassignmentfromSimulinkBlock"Input2"

A5W(7downto0)<=Input2;

A5W(8)<='0';

--Input-I/OassignmentfromSimulinkBlock"Input3"

A6W(7downto0)<=Input3;

A6W(8)<='0';

A0W(32)<='0';

--Constantassignment-SimulinkBlock"Constant0"

A1W(9)<='0';

A1W(8downto0)<="000000000";

--Constantassignment-SimulinkBlock"Constant1"

A2W(15)<='0';

A2W(14downto0)<="000000000000000";

--ConcatenationOperation-SimulinkBlock"BusConcatenation"

A8W(22downto0)<=A3W(7downto0)&A2W(14downto0);

A8W(23)<='0';

--ConcatenationOperation-SimulinkBlock"BusConcatenation1"

A9W(31downto0)<=A1W(8downto0)&A8W(22downto0);

A9W(32)<='0';

A16W(10)<='0';

A17W(10)<='0';

A18W(10)<='0';

--Output-I/OassignmentfromSimulinkBlock"Output"

Outputi:

SBFgenericmap(

width_inl=>11,

width_inr=>0,

width_outl=>10,

width_outr=>0,

lpm_signed=>BusIsUnsigned,

round=>0,

satur=>0)

portmap(

xin=>A17W,

yout=>SAOutputO);

--Output-I/OassignmentfromSimulinkBlock"Output1"

Output1i:

SBFgenericmap(

width_inl=>11,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2