DDS频率发生器设计资料.docx
《DDS频率发生器设计资料.docx》由会员分享,可在线阅读,更多相关《DDS频率发生器设计资料.docx(13页珍藏版)》请在冰豆网上搜索。
DDS频率发生器设计资料
西南科技大学
FPGA课程设计报告
课程题目:
波形发生器.
指导老师:
刘桂华.
学生:
任健铭.
二0一二年五月三日
【摘要】本文主要讨论了Verilog语言的基于DDS的波形发生器的设计。
从设计要求入手,本文给出了DDS的详细设计过程,包括各个模块的设计思想,电路图,Verilog语言程序代码。
其大致思想为通过频率控制字和相位控制字去控制正弦函数的ROM存储表的地址并对应着得到其幅度值,最终达到输出需要波形的目的。
本设计除了完成指定的任务。
在此基础上,为了验证实验结果我们通过QuartusII的仿真工具对设计的DDS进行了仿真,并且还进行了理论分析,发现理论和实践结合的非常好。
【关键词】FPGADDSVerilog波形发生器QuartusII
1.设计要求
(1)设计并实现一个可产生正弦波、三角波波形发生器;
(2)其工作频率为50MHz,可产生1MHz、2MHz、3MHz、4MHz、5MHz的正弦波、三角波。
所产生波形的幅度、相位均可调整,输出数据的字长为12bit。
若波形的频率为nMHz,则相位的最小调幅为2π*n/60;
(3)要求进行4级幅度调整,即ROM中存储的数据字长为10bit,ROM输出的数据分别乘以001、010、011、和100。
2.设计原理及分析
本波形发生器的设计总共包含有频率选择、波形选择、相位选择和幅度选择四个大块。
其具体结构见图2-1.
图2-1整体设计方案
2.1DDS基本原理
DDS的基本原理是利用采样定量,通过查表法产生波形。
DDS的结构有很多种,其基本的电路原理可用图2-2来表示。
图2-2DDS基本电路原理图
其中,相位累加器由N位加法器与N位累加寄存器级联构成如图2-3:
图2-3相频累加器
每来一个时钟脉冲cf,加法器将控制字k与累加寄存器输出的累加相位数据相加,把相加后的结果送到累加寄存器的数据输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字相加。
这样,相位累加器在时钟作用下,不断对频率控制字进行线性相位加累加。
由此可以看出,相位累加器在每一个时钟输入时,把频率控制字累加一次,相位累加器输出的数据就是合成信号的相位,相位累加器的输出频率就是DDS输出的信号频率。
接着,把相位累加器输出的数据作为波形存储器(ROM)的相位取样地址。
这样就可把存储在波形存储器内的波形抽样值(二进制编码)经查找表查出(可以看成是一种映射),完成相位到相应幅值转换。
2.2频率选择
基于DDS的波形发生器,其输出波形的频率由两方面决定。
一方面是由频率控制字,即波形输出的步长决定;另一方面是由波形点输出的固有频率决定。
DDS输出信号的频率与基准时钟频率的关系由下式给定:
其中,cf为基准时钟频率,2N为波形存储器的字数,N为相位累加器的位数,k为频率控制字。
一般的,k小于N。
假设基准时钟频率为131kHz,累加器为8位,k=4,则fout=2048Hz。
2.3波形选择
本设计要实现三角波和正弦波这两种波形的输出。
所以,在整个模块设定了一个输入控制端。
通过查询这个输入控制端的电平的高低来确定输出正弦波还是输出三角波。
其实质还是利用了rom表完成了对相同相位的不同幅度的输出。
2.4初相位选择
本设计中,对于产生的波形的初相的控制我们同样设定了一个输入控制端。
通过控制端的不同状态给波形添加不同的初相。
其原理是对相频累加器的初次输出加上一个特定的值。
在本设计中无法实现初相的任意值设定。
本设计只是设定了几个特定的初相供选择已验证理论的正确性。
2.5幅度选择
按照设计要求,波形的最终输出幅度值是可调节的。
设计要求中规定幅度值是能够按照1到4倍的大小调节的。
故在本设计中,在最后输出前,我们增加了一个幅度按调节的部分。
将相位幅度转换成功后的值再乘上一个要求的调幅系数为最终的波形输出。
3.各模块代码及电路原理图
3.1.频率控制字
modulef_ctr(sel,f_out,en,reset);
input[2:
0]sel;
inputen,reset;
output[8:
0]f_out;
reg[8:
0]f_out;
always@(sel)
begin
if(!
reset)
f_out<=9'b000000000;
elseif(en)
begin
case(sel)
3'b001:
f_out<=9'b001010010;
3'b010:
f_out<=9'b010100100;
3'b011:
f_out<=9'b011110110;
3'b100:
f_out<=9'b101001000;
3'b101:
f_out<=9'b110011010;
default:
f_out<=9'b000000000;
endcase
end
end
endmodule
3.2相频累加器/相位控制字(溢出没看懂)
modulen_full_adder(a,b,clk,sel,y);//nweiquanjiaqi
parameterm=9;
parametern=12;
input[m-1:
0]a;//6weipinlvkongzhizi
input[n-1:
0]b;
output[n-1:
0]y;
input[1:
0]sel;
inputclk;
reg[n-1:
0]y;
reg[n-1:
0]c;
reg[n-1:
0]d;
always@(posedgeclk)
begin
case(sel)
2'b00:
c<=12'b000000000000;
2'b01:
c<=12'b001111111111;
2'b10:
c<=12'b011111111111;
2'b11:
c<=12'b101111111111;
endcase
end
always@(posedgeclk)
begin
d=b;
if(d==12'b0)
d=d+c;
else
y=a+d;
end
endmodule
3.3相/幅转换(rom查询)和波形选择
width=12;
depth=4096;
index=linspace(0,2*pi,depth);
y=sawtooth(index,0.5);
y1=fix(y*1023)+1024;
plot(y1);
adrs=0:
depth-1;
str_width=strcat('WIDTH=',num2str(width));
str_depth=strcat('DEPTH=',num2str(depth));
fid=fopen('D:
\MyDocuments\Desktop\boxing\triangular.mif','w');
fprintf(fid,str_width);
fprintf(fid,';\r\n\r\n');
fprintf(fid,str_depth);
fprintf(fid,';\r\n\n\r\n');
fprintf(fid,'ADDRESS_RADIX=HEX;\r\n\r\n');
fprintf(fid,'DATA_RADIX=HEX;\r\n\r\n\r\n');
fprintf(fid,'CONTENTBEGIN\r\n');
fprintf(fid,'\t%x:
%x;\r\n',[adrs;y1]);
fprintf(fid,'END;\r\n');
fclose(fid);
width=12;
depth=4096;
index=linspace(0,2*pi,depth);
y=sin(index);
y1=fix(y*1023)+1024;
plot(y1);
adrs=0:
depth-1;
str_width=strcat('WIDTH=',num2str(width));
str_depth=strcat('DEPTH=',num2str(depth));
fid=fopen('D:
\MyDocuments\Desktop\boxing\sin.mif','w');
fprintf(fid,str_width);
fprintf(fid,';\r\n\r\n');
fprintf(fid,str_depth);
fprintf(fid,';\r\n\n\r\n');
fprintf(fid,'ADDRESS_RADIX=HEX;\r\n\r\n');
fprintf(fid,'DATA_RADIX=HEX;\r\n\r\n\r\n');
fprintf(fid,'CONTENTBEGIN\r\n');
fprintf(fid,'\t%x:
%x;\r\n',[adrs;y1]);
fprintf(fid,'END;\r\n');
fclose(fid);
3.3.2原理图模块
正弦波rom生成代码三角波rom生成代码
波形选择电路原理图
3.4相位幅度转换
//romchaxundingcengwenjian
modulerom_search(clk,addr_in,dds_out,boxing_ctr);
parameterwidth=12;
input[width-1:
0]addr_in;//shuru12weidizhi
inputclk;
inputboxing_ctr;
output[width-2:
0]dds_out;//shuchu11weifuduzhi
reg[10:
0]dds_out;
wire[10:
0]Q1,Q2;
sinu0(.address(addr_in),
.clock(clk),
.q(Q1));
triangularU1(
.address(addr_in),
.clock(clk),
.q(Q2));
always@(boxing_ctr)
begin
case(boxing_ctr)
1'b1:
dds_out<=Q1;
1'b0:
dds_out<=Q2;
endcase
end
endmodule
3.5幅度调制
modulefd_choose(v_in,sel,v_out);
input[10:
0]v_in;
input[2:
0]sel;
output[12:
0]v_out;
reg[12:
0]v_out;
always@(v_inorsel)
begin
if(sel==3'b100)
v_out<=v_in*4;
elseif(sel==3'b011)
v_out<=v_in*3;
elseif(sel==3'b010)
v_out<=v_in*2;
elseif(sel==3'b001)
v_out<=v_in;
end
endmodule
3.6顶层例化电路原理图
引脚功能说明:
1)输入引脚
Øclk:
时序同步时钟。
该时钟主要用于相位累加器和rom表查询的同时序。
它决定了相位累加的速度,也决定了幅度点输出的速度。
Øf_ctr:
频率选择控制字。
该输入端有三位,即是:
000—111八个数值编码。
编码值从001到101分别对应了1到5Mhz的输出波形频率。
其他编码值未定义,默认为0。
Øen:
电路工作使能端,高电平有效。
Ørest:
电路工作复位端,低电平有效。
Øxiangwei_ctr:
初相位选择控制端。
该输入有两位,即是:
00—11四个数值编码。
编码值从00到11分别对应了0,Ω/2,Ω,3Ω/2四个初相位。
Øboxing_ctr:
波形选择控制位。
为高电平时输出正弦波,为低电平时输出三角波。
Øfdu_ctr:
幅度选择调制位。
该端为三位输入,即是:
000—111八个数值编码。
编码值从001到100分别对应了1到4倍幅度调制。
其他为未定义,默认为0。
2)输出引脚
Øboxing_out:
波形输出端。
该端口为13位输出端口。
幅度值从-4096到+4095.
4各模块仿真
4.1频率控制字
4.2相频累加器/相位控制字
4.3相位幅度转换
4.3幅度调制
4.4最终仿真图
图4-1三角波产生波形
图4-2正弦波产生波形
图4-3正弦波调频调幅波形
图4-4三角波调频调幅波形
图4-5波形切换波形
5结论
与传统的频率合成方法相比,DDS合成信号具有频率切换时间短、频率分辨率高、相位变化连续等诸多优点。
使用单片机灵活的控制能力与FPGA器件的高性能、高集成度相结合,可以克服传统DDS设计中的不足,从而设计开发出性能优良的DDS系统。
通过本次实验,我们验证了DDS设计理论的正确性。
在课余时间,结合了所学的FPGA课程的知识,自主完成了基于DDS的调频、调幅、调相的波形发生器的设计,拓宽了知识面,也增进了对FPGA及Verilog进行电路开发的理解。
总的来说这次实验时非常成功的,这让我从中受益匪浅。
5实验感想
通过本次实验,我进一步认识了通过FPGA进行硬件设计的基本思路,体会了如何把理论变为实物。
同时发现,有时一个好的想法要变成现实并不是一件容易的事情。
但是团队的力量却是可以把它解决的。
比方说,在写rom表查询的时候,在自学了相关知识以后我很快地把它编完并将其局部顶层例化。
但是,在顶层仿真的时候,怎么办输出都是零。
就在后来小组讨论的时候,其中一个小组成员只改了一个地方就让我的程序仿真正确了。
原来是一个循环条件设错了。
同时,通过这次设计,我将FPGA的只是和matlab的相关知识结合了起来。
感觉对知识的掌握有深了一步。
通过此次试验我锻炼了自己的动手能力,提高了自己对嵌入式的兴趣。
掌握了用硬件去实现调制电路的方法。
6可改进的地方
虽然本设计已经完成了设计要求,但是还有很多地方可以改进和完善。
主要需要完善的地方是一个数字低通滤波器、一个数模转换器、一个低通模拟滤波器。
在本设计中,我们只是完成了数字式特定波形的幅度周期性输出。
若是频率控制字很大,就会造成输出的幅度值点很少,进而产生波形的不平滑。
所以,不可能真正地实现任意频率的控制。
要解决这些问题,一方面可以结合系统时钟来控制输出波形的频率;另一方面,还可以把这些数字化的幅度值进行数模转换。
从模拟波形的角度去进行频率的控制。
另外,我们输出的波形并不是很平滑。
在零点附近还有许多非控制跳变。
这些可以通过添加低通滤波器来处理。
同时,本设计中rom表存储的是全周期的波形的幅度信息。
其实,可以运用压缩技术来释放部分存储空间。
例如,对于正弦函数sin(x),我们只需存储其四分之一周期的幅度值。
其余三个部分的幅度值,我们可以通过将幅度值取负或是将相位变成2n减去他本身就可以实现用四分之一周期的幅度值输出整个周期的完整幅度值。
最后,本设计成果可以结合通信原理中的调频和调幅只是做成与之相关的设计。
那样,设计题目会更加综合,理解也会更加深入。