DDS直接数字合成信号源

DDS直接数字合成信号源
DDS直接数字合成信号源

目录

1 前言 (1)

2 总体方案比较与论证 (2)

3 系统工作原理 (3)

3.1 频率合成技术 (3)

3.2 DDS工作原理 (3)

3.2.1相位累加器 (4)

3.2.2波形存储器 (4)

4 单元模块设计与仿真 (5)

4.1累加器模块 (6)

4.2波形存储器模块 (7)

4.3相位调制模块 (8)

4.4滤波电路模块 (9)

5 芯片介绍 (10)

5.1FLEX6016结构及作用 (10)

6 总结与体会 (11)

7 致谢 (12)

8 参考文献 (13)

9 附录 (14)

附录一、Quartus II仿真原理图 (14)

附录二、单元模块Verilog HDL代码 (15)

1 前言

DDS技术是一种把一系列数字量形式的信号通过DAC转换成模拟量形式的信号的合成技术,它是将输出波形的一个完整的周期、幅度值都顺序地存放在波形存储器中,通过控制相位增量产生频率、相位可控制的波形。DDS电路一般包括基准时钟、相位增量寄存器、相位累加器、波形存储器、D/A转换器和低通滤波器(LPF)等模块。

相位增量寄存器寄存频率控制数据,相位累加器完成相位累加的功能,波形存储器存储波形数据的单周期幅值数据,D/A转换器将数字量形式的波形幅值数据转化为所要求合成频率的模拟量形式信号,低通滤波器滤除谐波分量。

整个系统在统一的时钟下工作,从而保证所合成信号的精确。每来一个时钟脉冲,相位增量寄存器频率控制数据与累加寄存器的累加相位数据相加,把相加后的结果送至累加寄存器的数据输出端。这样,相位累加器在参考时钟的作用下,进行线性相位累加,当相位累加器累加满量时就会产生一次溢出,完成一个周期性的动作,这个周期就是DDS合成信号的一个频率周期,累加器的溢出频率就是DDS输出的信号频率。

DDS有如下优点:

频率分辨率高,输出频点多,可达N个频点(N为相位累加器位数);

频率切换速度快,可达us量级;

频率切换时相位连续;

可以输出宽带正交信号;

输出相位噪声低,对参考频率源的相位噪声有改善作用;

可以产生任意波形;

全数字化实现,便于集成,体积小,重量轻。

在各行各业的测试应用中,信号源扮演着极为重要的作用。但信号源具有许多不同的类型,不同类型的信号源在功能和特性上各不相同,分别适用于许多不同的应用。目前,最常见的信号源类型包括任意波形发生器,函数发生器,RF信号源,以及基本的模拟输出模块。信号源中采用DDS技术在当前的测试测量行业已经逐渐称为一种主流的做法。

2 总体方案比较与论证

方案一:采用函数发生器(如ICL8038)产生频率可变的正弦波,方波,三角波三种周期性波形。

此方案实现电路复杂,难于调试,且要保证技术要求的指标困难,故方案不理想。

方案二:采用单片机控制合成各种波形。

波形的选择,生成及频率控制均由单片机编程实现。此方案产生的频率范围,步进值取决于所采用的每个周期的输出点数及单片机执行指令的时间。此方案的优点是硬件电路简单,所用器件少,且实现各种波形相对容易,在低频区基本能实现要求的功能;缺点是精度不易满足,产生波形频率范围小,特别难以生成高频波形。

方案三:采用DDS技术,将所需生成的波形写入ROM中,按照相位累加原理合成任意波形。

直接数字频率合成技术(DDS)完全不同于我们已经熟悉的直接频率合成技术和锁相环频率合成技术,它的基本原理是利用采样定理,通过查表法产生波形。随着大规模集成电路技术的飞速发展,DDS技术的优越性已逐步显现出来。它是建立在采样定理基础上的,首先对需要产生的波形进行采样,将采样值数字化后存入存储器作为查找表,然后再通过查表将数据读出,经过D/A转换器转换成模拟量,把存入的波形重新合成出来。

此方案得到的波形稳定,精度高,产生波形频率范围大,容易产生高频。在相对带宽、频率转换时间、高分辨力、相位连续性、正交输出以及集成化等一系列性能指标方面远远超过了传统频率合成技术所能达到的水平,为系统提供了优于模拟信号源的性能。

比较以上三种方案的优缺点,方案三简洁、灵活、可扩展性好,能完全达到设计要求,故采用第三种方案。

3 系统工作原理

3.1 频率合成技术

频率合成是指以一个或多个参考频率源为基准,在某一频段内,综合产生并输出多个工作频率点的过程。基于此原理制成的频率源为频率合成器,简称频综。频率合成技术是现代通讯电子系统实现高性能指标的关键技术之一,很多电子设备的功能实现都依赖于所用频率合成器的性能,因此人们常将频率合成器喻为众多电子系统的“心脏”,而频率合成理论也因此在20世纪得到了飞跃的发展。

3.2 DDS工作原理

DDS是一种全数字化的频率合成器,其主要组成为:相位累加器、波形存储ROM、D/A转换器和低通滤波器(LPF)。其基本结构如图3-1所示。

图3-1.DDS的原理框图

DDS的基本原理是利用采样定理,通过查表法产生波形。每来一个时钟脉,加法器将频率控制字K与累加寄存器输出的累加相位数据相加,把相加后的结果送至累加寄存器的数据输入端。累加寄存器将加法器在上一个时钟脉冲作用后所产生的新相位数据反馈到加法器的输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字K相加。这样,相位累加器在时钟作用下,不断对频率控制字进行线性相位累加。由此可以看出,相位累加器在每一个时钟脉冲输入时,把频率控制字累加一次,相位累加器输出的数据就是合成信号的相位,

相位累加器的溢出频率就是DDS输出的信号频率。用相位累加器输出的数据作为波形存储器(ROM)的相位取样地址,这样就可把存储在波形存储器内的波形抽样值(二进制编码)经查找表查出,完成相位到幅值转换。波形存储器的输出送到D/A转换器,D/A转换器将数字量形式的波形幅值转换成所要求合成频率的模拟信号。低通滤波器用于滤除不需要的取样分量,以便输出频谱纯净的信号。

3.2.1相位累加器

相位累加器由32位加法器与32位累加寄存器级联构成,其原理框图如图3-2-1所示。

图3-2-1.相位累加器原理框图

由此可以看出,相位累加器在每一个时钟脉冲输入时,把频率控制字累加一次,相位累加器输出的数据就是合成信号的相位。当相位累加器加满量时就会产生一次溢出,溢出频率就是DDS输出的信号频率。

3.2.2波形存储器

因为本设计是采用FPGA实现DDS的功能,所以使用FPGA作为数据转换的桥梁,将波形数据存储到其内部的ROM中,并由DDS系统产生波形输出。需存储在ROM中的波形数据是由单片机采集外部数据,对ROM中存储的标准波形进行各种相应的运算而得到。波形表存储器ROM有三种方法实现。

方法一:外接ROM用单片机来完成。可采用并行两片32K的EEPROM存储器AT28C256,共16位位宽,可以实现12位波形表存储,150ns读取速度完全满足20KHZ的工作频率。实现方案:将归一化的正弦波存储在32KEEPROM 中,波形存储64个点。然后由单片机根据键盘输入的不同要求,对各点数据乘相应系数并叠加,再将所得到的新数据存储在RAM中,此时便得到了所需要

的波形数据表。

方法二:由逻辑方式在FPGA中实现。

方法三:利用Altera公司的含于EAB器件中的兆功能模块LPM_ROM,通过Verilog HDL语言编程来实现。

第一种方法容量最大,但速度最慢,且编程比较麻烦;第二种方法速度最快,但容量非常小;第三种方法兼顾了两者的优点,克服了其缺点。在选用FPGA 芯片时,本设计选用的是Altera公司的FLEX6000系列芯片FLEX6016,有LPM_ROM模块,因此ROM选用第三种方法。

图3-2-2.波形存储器框图

波形存储器中存储的是所要输出波形的一个周期的波形幅度值,它主要完φ到幅度序列S(n)的转化。从理论上讲,波形存储器可以成信号的相位序列()n

存储具有周期性的任意波形。

4 单元模块设计与仿真

本设计是在EDA设计平台上实现系统的仿真,所以需要的装置主要有PC 机和Altera公司的Quartus II软件。Quartus II 是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。此外,Quartus II 通过和DSP Builder 工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统。

4.1累加器模块

本次设计用到的累加器由32位加法器与32位累加寄存器级联构成,其仿真程序由Verilog HDL语言编写,将程序在Quartus II中编译并仿真后结果如下图所示:

图4-1-1.32位加法器模块

图4-1-2.加法器波形仿真图

累加寄存器AC通常简称为累加器,它是一个通用寄存器。其功能是:当运算器的算术逻辑单元ALU执行算术或逻辑运算时,为ALU提供一个工作区。累加寄存器暂时存放ALU运算的结果信息。显然,运算器中至少要有一个累加寄存器。

图4-1-3.32位寄存器模块

图4-1-4是相位增量分段寄存器仿真图,从图中可以看出,在时钟的激励下,寄存器的仿真结果是正确的。

图4-1-4.寄存器波形仿真图

4.2波形存储器模块

波形存储器实际上就是一个ROM,波形存储器存储的是所生成波形一周期采样256点的数据值,通过地址的改变,所输出的值就会变化,因为,地址不一定是连续变化的,所以所输出的值也不是连续的,在同样的时钟周期下,地址间隔的变化也就造成了生成波形的频率的变化。地址值每溢出一次,便完成了一个周期的输出。

图4-2-1. ROM模块

ROM的设计直接调用LPM中的库生成,端口分别为:时钟输入端clock,输出数据总线q[9:0],输入数据总线address[9:0]。

地址总线address[9:0]是相位累加器输出高10位的数据.输出数据总线q[9:0]连接输出缓冲通过FPGA的I/O口输出,作为D/A转换器的输入。

当改变波形存储器中波形数据时,也就改变了输出波形。

图4-2-2. 正弦查找表ROM仿真结果

4.3相位调制模块

这个模块的功能是接收从单片中传来的数据,即给相位增量寄存器的控制字。这个模块的底层文件是基于Verilog语言描述的,在顶层上生成相应的功能模块.其生成的原理图如图4-3-1所示:

图4-3-1.相位调制器原理图

图4-3-2.相位调制器仿真图

图4-3-2是相位调制器的波形仿真不,如图所示,在时钟的激励下,相位调制器的的仿真结果是正确的。

4.4滤波电路模块

低通滤波器是直接数字频率合成DDS的重要组成部分,其性能的好坏直接影响整个DDS的特性。常用的滤波器的频率响应有三种:巴特沃斯型(Butterworth),切比雪夫型(Chebyshev)和椭圆型(Cauer)。其中巴特沃斯滤波器通带最平坦,它的通带内没有纹波,在靠近零频处,有最平坦通带,趋向阻带时衰减单调增大,缺点是从通带到阻带的过渡带最宽,对于带外干扰信号的衰减作用最弱,过渡带不够陡峭,因此它适用于对通带要求较高,而去除的频率离通带较远的情况;切比雪夫滤波器在通带内衰减在零值和一个上限值之间做等起伏变化,阻带内衰减单调增大,带内有起伏,但过渡带比较陡峭,也有起伏,而且过渡带陡峭。比较起来椭圆滤波器不仅通带内有起伏,阻带内椭圆滤波器性能更好,所以本设计中采用的是椭圆滤波器。

图4-4-1.椭圆滤波器电路

5 芯片介绍

5.1FLEX6016结构及作用

FLEX6000系列中的FLEX6016芯片结构图如图5-1所示,它以其极高的性价比,得到了广泛的应用。该芯片可用门数达到1.6万门,对于144引脚的封装,最多可以有117个可编程I/O引脚。

图5-1.FLEX6016芯片的结构

在DDS系统中,CPLD芯片的主要作用是:保存频率字;构成相位累加器,产生ROM 的地址;产生与51单片机的接口电路,即能够使51单片机通过FLEX6016芯片将波形数据写入ROM中。因为如果利用单片机直接将波形数据写入ROM中,那就将不得不增加一些不必要的硬件(如锁存器等),这不仅增加系统的成本,而且还会降低整个系统的稳定性和工作速度。考虑到FLEX6016芯片的I/O引脚是可以任意指定的,所以尽量将整个系统的数字部分全部集成到该芯片中,利用它来进行内部连线,从而最大限度地增加系统的灵活性和稳定性。

6 总结与体会

通过这次关于DDS直接数字合成信号源的设计,使我更深入地学习了相关专业知识,并能够熟练的操作Protel 99及QuartusⅡ软件。通过对单片机、FPGA芯片的使用及对Verilog HDL硬件描述语言学习,让我感到了Verilog HDL 硬件描述语言及单片机的方便性和灵活性,可以使编程技能快速提高,并且认识到很多新的设计思想。这给即将走向工作岗位的我带来了很大的帮助及深远的影响,使我受益无穷。

设计以FPGA为核心,详细阐述了FPGA内部实现的功能及Verilog HDL程序设计仿真,但由于软件版本的限制,部分模块无法实现仿真。而单片机的设计仅属于本设计的辅助控制部分,且单片机的资料很多,所以在此对单片机的程序不作详细说明。设计采用直接数字频率合成技术设计了信号发生器,经系统仿真表明,本设计可达到预定要求,应用方便灵活。

本课题的研究虽然取得了一定的收获,但在很多方面还有待于进一步的改进和完善。特别是在信息技术飞速发展的今天,各种电子产品层出不穷,各种技术与方法也在不断地改善,因此对电子技术知识的学习也应不断地充实和更新,以适应工作与社会的需要。

7 致谢

本次关于DDS直接数字合成信号源的设计是在贺德全老师的悉心指导下完成的。他在学业上给了我精心的指导,而且他渊博的知识也让我深深敬佩。贺老师严谨的治学态度、实事求是的进取精神和认真勤勉的工作作风对我起到了表率的作用,这些言传身教必定会对我今后的工作和学习产生深远的影响。谨在此向贺老师表示由衷的感谢!

另外,感谢校方给予我这样一次机会,能够独立地完成一个课程设计,并在这个过程当中,为我们提供大量资料,给予我们各种方便,使我们在这学期快要结课的时候,能够将学到的知识应用到实践中,增强了我们实践操作和动手应用能力,提高了独立思考的能力。

最后,感谢在这次设计过程中给予我帮助的老师和同学,正是有了他们的帮助,我才能顺利完成此次设计,在此向他们表示我由衷的谢意!

8 参考文献

[1] 郑凤涛,陈金佳.基于CPLD的数控正弦波的信号源的设计.黎明职业大学学

报,2003,38(1):25~30

[2] 徐志军,徐光辉. CPLD/FPGA的开发与应用.北京:电子工业出版社,2002: 192~272

[3] 黄正谨,徐坚,章小丽等.CPLD系统设计技术入门与应用.北京:电子工业出版社,

2002:93~209

[4] 韩素敏,郑征.基于VHDL的正弦波发生器设计.陕西工学院学报,2003,19(4):8~10

[5] 陈新原,龙世瑜.DDS芯片AD9850的EEP接口设计.微型机与应用,2005,(2):24~26

[6] 毕红军,张永瑞.利用单片机与CPLD实现直接数字频率合成器(DDS).现代电子技

术,2002,(11):91~93

[7] 姜萍,王建新,吉训生.FPGA实现的直接数字频率合成器.电子工程

师.2002,28(5):43~47

[8] 邵正途,高玉良.DDS/FPGA在信号产生系统中的应用.电子技术,2005,(1): 82~84

[9]谭建军,杨庆.EWB与电子技术基础课程设计.北京:中央民族大学出版社,

2002:228~236

[10周正干,李和平,李然.超低频移相信号发生器的设计.仪表技术,2000(1):9~11 [11]周峻峰,陈涛.基于FPGA的直接数字频率合成器的设计与实现.国外电子元器

件,2003,(1):4~6

9 附录

附录一、Quartus II仿真原理图

系统仿真结果

附录二、单元模块Verilog HDL代码

32位累加器:

module adds32(result,a,b);

output[31:0]result;

input[31:0]a,b;

reg[31:0]result;

reg[31:0]m,n,carry;

integer i;

always@(a or b)

begin

m=a^b;

n=a&b;

carry[0]=n[0]|m[0];

result[0]=m[0];

for(i=1;i<32;i=i+1)

begin

carry[i]=n[i]|(m[i]&carry[i-1]);

result[i]=m[i]^carry[i-1];

end

end

endmodule

32位寄存器:

module reg32(clr,clk,a,q);

input clr,clk;

input[31:0]a;

output[31:0]q;

reg[31:0]q;

always @(posedge clk or posedge clr)

begin

if(clr)

q=0;

else

begin

q<=a;

end

end

endmodule

相位调制器(12位):

module adds12(clk,A,B,result);

input clk;

input[12:0]A,B;

output[12:0]result;

reg[12:0]result;

reg[12:0]q;

always@(posedge clk )

begin

q=A+q;

result=q+B;

end

end

endmodule

MATLAB生成的sin.mif

fid=fopen('d:\altera\DDS\sin.mif','w');

fprintf(fid,'WIDTH=10;\n');

fprintf(fid,'DEPTH=2048;\n\n');

fprintf(fid,'ADDRESS_RADIX=UNS;\n');

fprintf(fid,'DATA_RADIX=UNS;\n\n');

fprintf(fid,'CONTENT BENGIN\n');

for i=0:2047

fprintf(fid,'%d:%d\n',i,floor((0.5+0.5*sin(2*pi*i/2047))*1024)); fclose(fid);

最终生成的ROM文件为sin_rom.v

module sin_rom(address,clock,q);

input[9:0]address;

input clock;

output[9:0]q;

wire[9:0]sub_wire0;

wire[9:0]q=sub_wire0[9:0];

altsyncram altsyncram_component(

.clock0(clock),

.address_a(address),

.q_a(sub_wire0),

.aclr0(1'b0),

.aclr1(1'b0),

.address_b(1'b1),

.addressstall_a(1'b0),

.addressstall_b(1'b0),

.byteena_a(1'b1),

.byteena_b(1'b1),

.clock1(1'b1),

.clocken0(1'b1),

.clocken1(1'b1),

.data_a({10{1'b1}}),

.data_b(1'b1),

.q_b(),

.rden_b(1'b1),

.wren_a(1'b0),

.wren_b(1'b0));

defparam

altsyncram_component.address_aclr_a="NONE",

altsyncram_component.init_file="D:/altera/DDS/sin.mif",

altsyncram_component.intended_device_family="Cyclone",

altsyncram_component.lpm_hint="ENABLE_RUNTIME_MOD=NO", altsyncram_component.lpm_type="altsyncram",

altsyncram_component.numwords_a=2048,

altsyncram_component.operation_mode="ROM",

altsyncram_component.outdata_aclr_a="NONE",

altsyncram_component.outdata_reg_a="CLOCK0",

altsyncram_component.widthad_a=11,

altsyncram_component.width_a=10,

altsyncram_component.width_byteena_a=1;

endmodule

相关主题
相关文档
最新文档