正弦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,