1 DDS原理简介
数字频率合成器( Direct Digital Synthesizer
)是从相位概念出发直接
合成所需波形的一种频率合成技术。 一个直接数字频率合成器由相位累加器、 加
法器、波形存储 ROM、D/A 转换器和低通滤波器( LPF)构成。 DDS的原理框图如
图 1.2 所示:
N 位
S(n)
S(t)
累加器
加法器
加法器
ROM
D/A
LPF
频率控制
字 K
相位控制字 P
波形控制字 W
参考时钟 clkf
图 1.2 DDS 原理框图
其中 K 为频率控制字、 P为相位控制字、 W为波形控制字、 clkf 为参考时钟频
率, N为相位累加器的字长, D为 ROM数据位及 D/A 转换器的字长。相位累加器
在时钟 clkf 的控制下以步长 K 作累加,输出的 N位二进制码与相位控制字 P、波
形控制字 W相加后作为波形 ROM的地址,对波形 ROM进行寻址, 波形 ROM输出 D
位的幅度码 S(n) 经过 D/A 转换器变成阶梯波 S(t) ,再经过低通滤波器平滑后就
可以得到合成的信号波形。 合成的信号波形的形状取决于波形 ROM中存放的幅度
值,因此用 DDS可以产生任意波形。这里我们用 DDS实现正弦波的合成。
A) 频率预臵与调节电路
K被称为频率控制字 , 也叫相位增量 .DDS方程为:
f
out
fclk K
2N
, out
f 为输
clkf
出频率, clkf 为时钟频率。当 K=1时,DDS输出最低频率(也即频率分辨率) 为 2N
,
而 DDS的最大输出频率由 Nyquist 采样定理决定, 即
f
out
f
clk
2
,也就是说 K 最
大值为 2
1N 。因此,只要 N足够大,DDS可以得到很细的频率间隔。 要改变 DDS
的输出频率,只要改变频率控制字 K 即可。
B) 累加器
相位累加器由 N位加法器与 N位寄存器级联构成。每来一个时钟脉冲 clkf ,
加法器将频率控制字 K 与寄存器输出的累加相位数据相加, 再把相加后的结果送
至寄存器的数据输入端。 寄存器将加法器在上一个时钟作用后所产生的相位数据
反馈到加法器的输入端; 以使加法器在下一个时钟的作用下继续与频率控制字进
行相加。这样,相位累加器在时钟作用下, 进行相位累加。 当相位累加器累加满
量里就会产生一次溢出,完成一个周期性的动作。
C) 控制相位的累加器
通过改变相位控制字 P可以控制输出信号的相位参数。 令相位加法器的字长
为 N,当相位控制字由 0 跃变到 P(P 0)时,波形存储器的输入为相位累加器
的输出与相位控制字 P之和,因而其输出的幅度编码相位会增加
P
2 N
,从而使最
后输出的信号产生相移。
D) 控制波形的加法器
通过改变波形控制字 W可以控制输出信号的波形。 由于波形存储器中的不同
波形是分块存储的, 所以当波形控制字改变时, 波形存储器的输入为改变相位后
的地址与波形控制字 W(波形地址)之和,从而使最后输出的信号产生相移。
E)波形存储器
用相位累加器输出的数据作为波形存储器的取样地址,进行波形的相位—幅
值转换,即可以给定的时间上确定输出的波形的抽样幅值。 N位的寻址 ROM相当
于把 0°~ 360°的正弦信号离散成具有 2 N 个样值的序列,若波形 ROM有 D位数
据位,则 2N 个样值的幅值以 D位二进制数值固化在 ROM中,按照地址的不同可
以输出相应相位的正弦信号的幅值。
E) D/A 转换器
D/A 转换器的作用是把合成的正弦波数字量转换成模拟量。正弦幅度量化序
列 S(n) 经 D/A 转换后变成了包络为正弦波的阶梯波 S(t) 。需要注意的是,频率
合成器对 D/A 转换器的分辨率有一定的要求, D/A 转换器的分辨率越高, 合成的
正弦波 S(t) 台阶数就越多,输出波形的精度也就越高。
F) 低通滤波器
对 D/A 输出的阶梯波 S(t) 进行频谱分析,可以 S(t) 中除了主频 out
f 外,还
相存在分布在 out
f ,2 out
f ……两边正负 out
f 处的非谐波分量, 幅值包络为辛格函
数。因此,为了取出主频 out
f ,必须在 D/A 转换器的输出端接入截止频率为 out
f
/2
的低通滤波器。
2 FPGA 的 DDS载波实现方法
实现通信中不少信道都不能直接传送基带信号, 必须用基带信号对载波波形
的某些参量进行控制, 使载波的这些参量随基带信号的变化而变化, 即所谓正弦
载波调制。
从原理上来说, 受调载波的波形可以是任意的, 只要已调信号适合于信道传
输就可以了。但实际上,在大多数数字通信系统中,都选择正弦信号作为载波。
这是因为正弦信号形式简单,便于产生及接收。
方法一 : 用 ROM核来实现
说明:将载波一个周期的采样值直接写入 V代码中的,而不是用 ROM
核。(利用 ROM核需要将载波一个周期的采样值写入 COE文件中,插入 ROM核中)
优点: 用不同的初始值寻址可以输出不同频率和不同初始相位的载
波。
方法二: 用 DDS核来实现
优点: 频率和初始相位都可以任意设定。
缺点: 在使用时比较难控制
方法三: 用 Sine-Cosine Look-up Table 核来实现
代码: module sine__cosine(clk,reset,in_rdy,desine,decosine,out_rdy);
input clk,reset,in_rdy;
output [7:0] desine,decosine;
output out_rdy;
wire out_rdy;
wire RFD,RDY;
reg ND;
reg[3:0] THETA;
always @(posedge clk)
begin
if(reset) begin ND<=0;THETA<=0;end
else if(in_rdy)
begin THETA<=THETA+1;
ND<=in_rdy;
end
end 、
// 核例化
sinecosine sinecosine(
.THETA(THETA), // Bus [3 : 0]
.CLK(clk),
.SCLR(reset),
.ND(ND),
.RFD(RFD),
.RDY(out_rdy),
.SINE(desine), // Bus [7 : 0]
.COSINE(decosine)); // Bus [7 : 0]
endmodule
仿真图: 第一路为正弦波,第二路为余弦波
说明:可以对 THETA赋不同初始值即可以实现不同初始相位的载波。
此正弦波和余弦波一个周期是采样
16 个点,可以在 IP 核进行参数设臵修改
的。其频率为
clkf
/16
,输出位宽为 8 位宽。
优点: 载波频率是时钟频率的
1
2 N
其中 N 在 IP 核中可设臵,设臵很简单, 初始相位也可以通过修改
THETA参数来实现 ,实现起来很方便。也比较容易控制。
方法四: 将载波一个周期的采样点值写入代码中来实现。
代码: module sine(clk,reset,en,out_rdy,out);
input clk,reset,en;
output out_rdy;
output [7:0] out;
reg out_rdy;
reg [7:0] out;
reg[2:0] addr;
always @(posedge clk)
begin:initial_control
if(reset) begin
addr<=3'd0;
end
else if(en) begin
addr<=addr+1;
end
end
always @(posedge clk)
begin:Red_sig
if(en)
case(addr)
4'd0:begin out<=8'd45;out_rdy<=1; end
4'd1:begin out<=8'd64;out_rdy<=1; end
4'd2:begin out<=8'd45;out_rdy<=1; end
4'd3:begin out<=8'd0;out_rdy<=1; end
4'd4:begin out<=8'd211;out_rdy<=1;end
4'd5:begin out<=8'd192;out_rdy<=1; end
4'd6:begin out<=8'd211;out_rdy<=1; end
4'd7:begin out<=8'd0;out_rdy<=1; end
endcase
end
endmodule
仿真图:
说明:此正弦载波一个周期是采样
8 个点,即频率为
clkf
/ 8
其输出位宽为 8 位宽。
若想产生余弦载波的话,只需将
Red_sig 中 out 的值改变即可。
优点:与模块使能信号 en 同时输出,没有延时。在设计调制解调时,不用
设计基带信号与载波同步。 相对于用核产生要方便一些, 因为用核产生时, 因为
设臵了握手信号,载波较使能信号都有固定时间的延时,例如用
Sine-Cosine
Look-up Table 核来实现载波时,一般都有 2 或 3 个系统时钟的延时,致使载波
与基带信号不同步,需将基带信号延时以使两路信号同步。
缺点: 若载波的一个周期采样多个点的话,将采样值直接写入 V 代码中,
就有点麻烦了。