叨叨游戏网
您的当前位置:首页DDS信号源的设计

DDS信号源的设计

来源:叨叨游戏网
 1 / 19

EDA技术与实践教程

课题:DDS信号源的设计

姓名:

班级:

DDS信号源的设计

一. DDS的概述

DDS是一种以全数字技术从相位概念出发直接合成所需波形的一种频率合成技术。目前使用最广泛的方式是利用高速存储器查找表,然后通过高速DAC输出已经用数字形式存入的正弦波。DDS

技术一般都是以数字控制振荡器

NCO

(Numerically Controlled Oscillator)为核心,来产生频率可调的sin正弦波的波形的数字量表示的幅值。这些数字量表示的波形幅值再通过一个DAC(Digital-Analog Converter),得到正弦波的模拟量波形。它是在时域中进行频率合成,从而能够对输出频率进行快速而且精确的控制,并且这种控制全部都是数字控制,因此可以提供非常高的频率精度。

二. DDS工作原理

DDS的基本原理是利用采样定理,通过查表法产生波形。DDS的结构有很多种,其基本的电路原理可用下图1 来表示:

1

2 / 19

相位累加器由N位加法器与N位累加寄存器级联构成。每来一个时钟脉冲FS,加法器将频率控制字K与累加寄存器输出的累加相位数据相加,把相加后的结果送至累加寄存器的数据输入端。累加寄存器将加法器在上一个时钟脉冲作用后所产生的新相位数据反馈到加法器的输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字相加。这样,相位累加器在时钟作用下,不断对频率控制字进行线性相位累加。由此可以看出,相位累加器在每一个时钟脉冲输入时,把频率控制字累加一次,相位累加器输出的数据就是合成信号的相位,相位累加器的溢出频率就是DDS输出的信号频率。 用相位累加器输出的数据作为波形存储器(ROM)的相位取样地址,这样就可把存储在波形存储器内的波形抽样值(二进制编码)经查找表查出,完成相位到幅值转换。波形存储器的输出送到D/A转换器,D/A转换器将数字量形式的波形幅值转换成所要求合成频率的模拟量形式信号。低通滤波器用于滤除不需要的取样分量,以便输出频谱纯净的正弦波信号。 DDS在相对带宽、频率转换时间、高分辨力、相位连续性、正交输出以及集成化等一系列性能指标方面远远超过了传统频率合成技术所能达到的水平,为系统提供了优于模拟信号源的性能。

三. 实验过程

1. 实验目的

2

3 / 19

1) 学习掌握DDS信号源的设计方法。

2) 学习较复杂的数字系统设计方法。

2. 实验内容

总体设计框图如下图所示:

总体框图中包含dds_sin,dds_rom,dds_fen三个模块。dds_fen根据需要生成的信号频率值,产生对应的时钟信号;dds_sin实现正弦波地址数据输出;dds_rom用来保存正弦波形数据。

(1) 端口说明

Clk:系统时钟

Clr:清零信号

Datain[19..0]:设定频率值

Dataout[7..0]:频率输出

3

4 / 19

(2)dds_ fen模块

根据需要生成的信号频率值,产生对应的时钟信号,是DDS设计的核心部分。Clk为系统时钟,clr为清零信号, datain为所需频率值。产生对应的后续模块的时钟模块。在后续正弦波产生模块中需要提供的时钟信号为所需频率值的倍,通过相位累加即可的得所需频率。

dds_fen模块的VHDL源代码如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY dds_fen IS

GENERIC(WIDTH:INTEGER:=20;

clk_k:INTEGER:=10000000);

PORT(clk,clr:IN STD_LOGIC;

datain:IN STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0);

4

5 / 19

clk_out:OUT STD_LOGIC);

END;

ARCHITECTURE one OF dds_fen IS SIGNAL INTEGER RANGE 0 TO clk_k;

SIGNAL data_c:STD_LOGIC_VECTOR((WIDTH-1+6) DOWNTO 0);

SIGNAL clk_out_c:STD_LOGIC;

BEGIN

data_c<=datain&”000000”;

PROCESS(clk,clr,datain)

BEGIN

IF clr=’1’THEN q<=0;

ELSIF clk’EVENT AND clk=’1’THEN

IF q5

6 / 19

clk_out_c<=’1’;

END IF; END IF;

END PROCESS; clk-out<=clk_out_c; END;

(3) DDS_SIN模块实现正弦波地址数据输出

DDS_SIN的VHDL源代码如下。

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY dds_sin IS

GENERIC(WIDTH:INTEGER:=6;

depth:INTEGER:=);

PORT(clk,clr:IN STD_LOGIC;

6

7 / 19

q:OUT STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0));

END;

ARCHITECTURE one OF dds_sin IS

SIGNAL q1:INTEGER RANGE 0 TO (depth-1); BEGIN

PROCESS(clk,clr) BEGIN

IF clr=’1’THEN q1<=0;

ELSIF clk’EVENT AND clk=’1’THEN

IF q1<(depth-1) THEN q1<=q1+1;

ELSE q1<=0; END IF; END IF;

END PROCESS;

q<=CONV_STD_LOGIC_VECTOR(q1,WIDTH);

END;

(4) dds_rom模块用来保存正弦波波形数据

7

8 / 19

Dds_rom模块的VHDL源代码如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY dds_rom IS

GENERIC(addr:INTEGER:=6;

width:INTEGER:=8);

PORT( clk:IN STD_LOGIC;

address:IN STD_LOGIC_VECTOR(addr-1 DOWNTO 0);

dataout:OUT STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0));

END;

ARCHITECTURE one OF dds_rom IS SIGNAL q:INTEGER RANGE 0 TO 63;

SIGNAL d:INTEGER RANGE 0 TO 255;

8

9 / 19

BEGIN

q<=CONV_INTEGER(address); PROCESS(clk)

BEGIN

CASE q IS

WHEN 00=>d<=255;

WHEN 01=>d<=254;

WHEN 02=>d<=252;

WHEN 03=>d<=249;

WHEN 04=>d<=245;

WHEN 05=>d<=239;

WHEN 06=>d<=233;

WHEN 07=>d<=225;

WHEN 08=>d<=217;

9

10 / 19

WHEN 09=>d<=207;

WHEN 10=>d<=197;

WHEN 11=>d<=186;

WHEN 12=>d<=174;

WHEN 13=>d<=162;

WHEN 14=>d<=150;

WHEN 15=>d<=137;

WHEN 16=>d<=124;

WHEN 17=>d<=112;

WHEN 18=>d<=99;

WHEN 19=>d<=87;

WHEN 20=>d<=75,

WHEN 21=>d<=;

10

11 / 19

WHEN 22=>d<=53;

WHEN 23=>d<=43;

WHEN 24=>d<=34;

WHEN 25=>d<=26;

WHEN 26=>d<=19;

WHEN 27=>d<=13;

WHEN 28=>d<=8;

WHEN 29=>d<=4;

WHEN 30=>d<=1;

WHEN 31=>d<=0;

WHEN 32=>d<=0;

WHEN 33=>d<=1;

WHEN 34=>d<=4;

11

12 / 19

WHEN 35=>d<=8;

WHEN 36=>d<=13;

WHEN 37=>d<=19;

WHEN 38=>d<=26;

WHEN 39=>d<=34;

WHEN 40=>d<=43;

WHEN 41=>d<=53;

WHEN 42=>d<=;

WHEN 43=>d<=75;

WHEN 44=>d<=87;

WHEN 45=>d<=99;

WHEN 46=>d<=112;

WHEN 47=>d<=124;

12

13 / 19

WHEN 48=>d<=137;

WHEN 49=>d<=150;

WHEN 50=>d<=162;

WHEN 51=>d<=174;

WHEN 52=>d<=186;

WHEN 53=>d<=197;

WHEN 54=>d<=207;

WHEN 55=>d<=217;

WHEN 56=>d<=225;

WHEN 57=>d<=233;

WHEN 58=>d<=239;

WHEN 59=>d<=245;

WHEN 60=>d<=249;

13

14 / 19

WHEN 61=>d<=252;

WHEN 62=>d<=254;

WHEN 63=>d<=255;

WHEN OTHERS=>NULL;

END CASE; END PROCESS;

dataout<=CONV_STD_LOGIC_VECTOR(d,WIDTH);

END;

(5) 三个元件如下所示:

dds_rom

dds_sin

14

15 / 19

dds_fen

15

16 / 19

(6)锁引脚,如下图:

16

17 / 19

(7)锁好引脚,编译成功后,下载到DE2板,扩展端口GPIO_0[7]~GPIO_0[0]外接D/A变换后送示波器观察波形。嵌入式逻辑分析仪SignalTapⅡ,可以方便把实际检测的信号通过JTAG口回送到计计算机进行分析。如下图所示,为最后输出波形。

17

18 / 19

四.实验收获

经过本次实验,我学到了很多东西。首先以前我对DDS的原理一无所知因为本次实验要用这个原理我就到图书馆去借有关的书籍、在网上查阅各种与DDS相关的资料,然后开始慢慢解了DDS原理,虽然我们只是做的比较简单的DDS信号源的设计,但这次试验,对我们来讲都是受益匪浅的一次经历。

还有以前我对QuartusII原理图的方式不是很熟悉,每次做老师布置的作业都会出现一些问题,不是代码容易写错就是引脚没有锁。但因为这次我们是小组合作的方式,我们三个齐头并进,刚开始都一起做,然后大家分工利用VHDL写出源代码,这也让我告诉自己不能够有错误,不然大家做的都会前功尽弃,于是我认真的输入代码,并编译成功后,给其他组员提供。在后面的工作中,我们又遇到了很多问题,例如由于某些数据提前没有改好,所以出来的波形不对,后来通过修改,以及在其他做出来的小组的帮助下,我18

19 / 19

们调试了DE2板的频率,出来了我们想要的波形。 此外团队合作在我们这次实验中也得到了充分的体现,大家都很想出色的完成此次实验,都很认真,很努力的完成。但对于我们来说本次实验中也是有一些遗憾的,例如我们的选题过于简单,单一,基本上全班都是一样的选题。对于我们小组来说,我们没有做出此次实验的拓展,没能够做出三角波 、方波和其他波形的产生。这是我们欠缺的地方。实践是检验真理的唯一标准。这次试验,让我学到了,求真、务实才是硬道理。

19

因篇幅问题不能全部显示,请点此查看更多更全内容