基于 FPGA 的 DDS 设计
【摘要】本文主要讨论了Verilog语言的基于DDS的波形发生器的设计。从设计要
求入手,本文给出了DDS的详细设计过程,包括各个模块的设计思想,电路图,
Verilog语言程序代码。其大致思想为通过频率控制字和相位控制字去控制正弦
函数的ROM存储表的地址并对应着得到其幅度值,最终达到输出需要波形的目的。
【关键词】FPGA
DDS
Verilog 波形发生器 Quartus II
1.设计要求
(1)设计并实现一个可产生正弦波、方波波形发生器;
(2)波形发生器的输出频率是在 10M—100M 之间,步进频率是 500HZ;
2.设计原理及分析
2.1DDS 基本原理
DDS 的基本原理是利用采样定量,通过查表法产生波形。DDS 的结构有很多
种,其基本的电路原理可用图 2-1 来表示。
图 2-1 DDS 基本电路原理图
其中,相位累加器由 N 位加法器与 N 位累加寄存器级联构成如图 2-2:
图 2-2 相频累加器
每来一个时钟脉冲 cf ,加法器将控制字 k 与累加寄存器输出的累加相位数据
相加,把相加后的结果送到累加寄存器的数据输入端,以使加法器在下一个时钟
1
脉冲的作用下继续与频率控制字相加。这样相位累加器在时钟作用下,不断对频
率控制字进行线性相位加累加。
由此可以看出,相位累加器在每一个时钟输入时,把频率控制字累加一次,
相位累加器输出的数据就是合成信号的相位,相位累加器的输出频率就是 DDS
输出的信号频率。
接着,把相位累加器输出的数据作为波形存储器(ROM)的相位取样地址。
这样就可把存储在波形存储器内的波形抽样值(二进制编码)经查找表查出(可
以看成是一种映射),完成相位到相应幅值转换。
2.2 频率选择
基于 DDS 的波形发生器,其输出波形的频率由两方面决定。一方面是由频率
控制字,即波形输出的步长决定;另一方面是由波形点输出的固有频率决定。
DDS 输出信号的频率与基准时钟频率的关系由下式给定:
其中 cf 为基准时钟频率,2N 为波形存储器的字数,N 为相位累加器的位数,
k 为频率控制字。一般的 k 小于 N 。假设基准时钟频率为 200MHz,累加器为 12 位,
k=500,则 f out 的输出刚好可也满足为 11.2MHZ-96MHZ。
2.3 波形选择
本设计要实现三角波和正弦波这两种波形的输出。所以,在整个模块设定了
一个输入控制断。通过查询这个输入控制端的电平的高低来确定输出正弦波还是
输出三角波。其实质还是利用了 rom 表完成了对相同相位的不同幅度的输出。
3.各模块代码及电路原理图
3.1.频率控制字
/* 该文件主要用来实现频率控制字作用下的频率输出的功能,其中 sel 是用来
选择频率输出的,f_out 是用来输出频率的*/
module f_ctr(sel,f_out);
input [2:0]sel;
output [24:0]f_out;
reg [24:0]f_out;
always @(*)
begin
2
case(sel)
3'b001:f_out<= 25'b0100110001001011010000000;
3'b010:f_out<= 25'b111001001110000111000000;
3'b011:f_out<= 25'b1001100010010110100000000;
3'b100:f_out<= 25'b1011111010111100001000000;
3'b101:f_out<= 25'b1110010011100001110000000;
endcase
end
endmodule
图 3-1 频率控制输出
3.2 相频累加器/相位控制字
/*实现累加器的功能,其中有个反馈输入,用中间寄存器来实现缓存*/
module full_adder(a,clk,y,rstn);
parameter m = 25;
parameter n = 12;
input [m-1:0]a;
input clk,rstn;
output [n-1:0]y;
reg [n-1:0]y;
reg [n-1:0]b;
always@(posedge clk or negedge rstn)
begin
if(!rstn)
begin
y<=12'b0;
b<=12'b0;
end
else
begin
y<=a[24:13]+b;
b<=b;
end
end
endmodule
3
图 3-2 输出地址波形
3.3 相/幅转换(rom 查询)和波形选择
WIDTH=12;
DEPTH=4096;
ADDRESS_RADIX=UNS;
DATA_RADIX=UNS;
CONTENT BEGIN
[0..2047]
:
[2048..4095]
END;
4095;
:
0;
depth=4096;
widths=12;
N=0:1: 4096;
s=3*sin(pi*N/2048);
fidc=fopen('D:/quarteus
3.3.2 原理图模块
II/FPGhomework/sin.mif','wt');
fprintf(fidc,'depth=%d;\n',dept
h);
fprintf(fidc,'width=%d;\n',widt
hs);
fprintf(fidc,'address_radix=dec
;\n');
fprintf(fidc,'data_radix =
dec;\n');
fprintf(fidc,'Content Begin\n');
for(x=1:depth)
fprintf(fidc,'%d:%d;\n',x-1,
round(2047*sin(pi*(x-1)/
2048)+2048));
end
fprintf(fidc,'end;');
fclose(fidc);
正弦波 rom 生成代码
方波 mif 生成代码
4
3.4 顶层例化电路原理图
图 3-3 波形选择原理图
引脚功能说明:
1) 输入引脚
图 3-4 顶层原理图
clk:时序同步时钟。该时钟主要用于相位累加器和 rom 表查询的同
时序。它决定了相位累加的速度,也决定了幅度点输出的速度。
f_ctr:频率选择控制字。控制频率的输出。
rstn:电路工作复位端,低电平有效。
boxing_ctr:波形选择控制位。为高电平时输出正弦波,为低电平时
输出三角波。
2) 输出引脚
boxing_out:波形输出端。该端口为 12 位输出端口。幅度值从-2048
到+2047.
4 各模块仿真
4.1 频率控制字
图 4-1 频率控制字的频率输出
5
4.2 相频累加器/相位控制字
图 4-1 查询地址的波形输出
4.4 最终仿真图
4.4.1 正弦波的波形
4.4.2 方波的波形
图 4-1 正弦波的波形输出
5 结论
图 4-2 方波的波形
与传统的频率合成方法相比,DDS 合成信号具有频率切换时间短、频率分辨
率高、相位变化连续等诸多优点。使用单片机灵活的控制能力与 FPGA 器件的高
性能、高集成度相结合,可以克服传统 DDS 设计中的不足,从而设计开发出性能
优良的 DDS 系统。
6