DDS设计报告带程序.docx
《DDS设计报告带程序.docx》由会员分享,可在线阅读,更多相关《DDS设计报告带程序.docx(23页珍藏版)》请在冰豆网上搜索。
DDS设计报告带程序
电子线路课程设计
直接数字频率合成计
院系:
学号:
912000720
姓名:
同组人:
指导老师:
时间:
2014年11月
摘要
本实验通过使用QuartusⅡ7.1软件,并结合verilog语言的知识设计直接频率合成器,简称DDS。
DDS中的正余弦波形存储器模块用
类型的芯片实现,基准频率为1MHz,利用实验箱上的D/A转换器件将ROM输出的数字信号转换为模拟信号,能够通过示波器观察到正、余弦两路波形。
除此之外,本实验还实现了多种波形任意切换,0-200kHz频率任意可调,并在数码管上显示生成的波形频率等附加功能。
关键词
QuartusII,直接数字频率合成计(DDS),VerilogHDL,状态机
Abstract
Inthisstudy,byusingQuartusⅡ7.1software,combinedwiththeknowledgeofverilog-language,wedesignedthedirectfrequencysynthesizer,alsocalledDDS.ThetypeofsineandcosinewaveformmemorymoduleinDDSis
.Andthereferencefrequencyis1MHz.PassingthroughtheD/Aexperimentalbox,thedigitalsignalconversiondeviceconvertstheoutputoftheROMtoananalogsignal.Wecanobservetwowaveformonthescreenofoscilloscope.Inaddition,thisexperimentalsoimplementsanarbitrarywaveformswitching,a0-200kHzarbitraryfrequencyswitching,andtheresultingwaveformfrequencydisplaying.
Keywords
QuartusⅡ,Directfrequencysynthesizer,VerilogHDL,Statemachine
一、设计要求……………………………………………………………………...........................3
二、分层设计及其分工……………………………………………………………………...........3
3、直接数字频率合成计顶层设计…………………………....………………...........................4
四、各子模块设计原理及程序…………………………………………...................................…5
4.1分频电路…………………………………………………..............................................……5
4.2相位累加器和数据锁存器器电路....……………....……………..........................................6
4.3波形存储器ROM的生成...……………………......................................……………………6
4.4三角波及方波输出电路..........................................................................................................7
4.5波形的综合输出电路…………………………………...........................................…………8
4.6状态机控制电路.......................................................................................................................8
4.7状态机专用消颤电路.............................................................................................................10
4.8LED频率显示电路……………………………………………....................……………….11
五、程序下载、仿真与调试……………………………………….............................….....……13
5.1管脚设定…………………………………………….......................................………….…13
5.2修改Device&PinsOptions及重新编译…………………........................................……..14
5.3程序下载及运行结果………………………………………………………............……….15
六、实验中遇到的问题及其应对方案……………………………………….............…………..15
七、实验总结与感想…………………………………………………..............................………..15
八、参考文献…………………………………………………………….............................……..16
1、设计要求
1.1设计基本部分要求
①利用QuartusII软件和SmartSOPC试验箱实现DDS的设计;
②DDS中的波形存储器模块用Altera公司的CycloneIII系列FPGA芯片中的ROM实现,ROM结构配置成
类型;
③具体参数要求:
频率控制字K取4位;基准频率
,由实验板上的系统时钟分频得到;
④系统具有使能功能;
⑤利用实验箱上的D/A转换器件将ROM输出的数字信号转换为模拟信号,能够通过示波器观察到正、余弦两路波形;
⑥通过开关输入DDS的频率和相位控制字,并能用示波器观察加以验证;
1.2设计提高部分要求
①通过按键(实验箱上的Si)输入DDS的频率和相位控制字,以扩大频率控制和相位控制的范围;(注意:
按键后有消颤电路)
②在数码管上显示生成的波形频率;
③设计能输出多种波形(三角波、锯齿波、方波等)的多功能波形发生器;
④充分考虑ROM结构及正弦函数的特点,进行合理的配置,提高计算精度;
⑤基于DDS的AM调制器的设计;
⑥自己添加其他功能。
二、分层设计及其分工
2.1分层设计
为了实现直接数字频率合成计,我们采用了Verilog语言描述其功能,如图2.1所示,为本实验的层次分析设计结构图。
图2.1直接数字频率合成计的层次模型
①原始分频电路将系统提供的48MHz晶振频率分为1MHz的基础频率,是所有子模块中clk的基础。
②状态机可以实现复位、波形切换、0-200kHz频率任意可调的功能。
③LED电路通过对频率与相位控制字的相对数量计算,实现了显示频率的功能
2.2分工情况
整个直接数字频率合成器设计由郑蕤荻和我(徐洁)共同完成,既有明确的分工以提高效率,也有互相帮助,互相指出错误的合作过程,以下为我们两个人明确分工的情况:
***:
DDS频率发生器顶层设计、状态机控制电路、LED显示电路;
**:
三种波形的生成、状态机专用消颤电路、相位累加器及锁存器、分频电路。
.
三、直接数字频率合成计顶层设计
DDS为整个直接数字频率合成计的顶层设计,它直接或间接的调用了所有的子程序,实现了将整个底层程序贯穿联接的功能,规定了直接数字频率合成计的输入和输出。
输入有:
EP3C25F324C8的自带晶振频率48MHz,键入值;输出有:
波形数据,LED管的位码和段码,接地信号。
verilog语言程序如下:
moduledds(_48MHz,keyin,wavevalue,wavevalue2,Segout,SG1,SG2,SG3,SG4,SG5,SG6,SG7,SG8,GND,GND2,clk);
input_48MHz;
outputclk;
outputGND,GND2;
input[3:
0]keyin;
output[9:
0]wavevalue,wavevalue2;
output[6:
0]Segout;
outputSG1,SG2,SG3,SG4,SG5,SG6,SG7,SG8;//selectLED
wire[11:
0]address;
wire[1:
0]wavemode;
wire[23:
0]length;
wire[9:
0]wavevalue,wavevalue2;
wire[3:
0]keyOUT;
wire_48MHz,clk;
supply0GND,GND2;
keyS0(clk,keyin,keyOUT);
Original_FrequencyS1(_48MHz,clk);
controlS2(clk,keyOUT,wavemode,length);
counterS3(clk,length,address);
selectionS4(clk,address,wavemode,wavevalue);
cos_romS5(address,clk,wavevalue2);
shumaguanS6(clk,length,Segout,SG1,SG2,SG3,SG4,SG5,SG6,SG7,SG8);
endmodule
四、各子模块设计原理及程序
4.1分频电路
分频模块是为了实现EP3C25F324C8的自带晶振频率48MHz,往1MHz的分频,主体思想是使用一个模48计数器直接取其最高位,下面是该电路的verilog程序:
//Original_Frequency.v
moduleOriginal_Frequency(_48MHz,_1MHz);
input_48MHz;
output_1MHz;
reg[3:
0]CntH,CntL;
wire_1MHz;
always@(posedge_48MHz)
begin
if((CntH>4)||(CntL>9)||(CntH==4)&&(CntL>=7))
{CntH,CntL}<=8'h00;
elseif((CntH==4)&&(CntL<7))
beginCntH<=CntH;CntL<=CntL+1'b1;end
elseif(CntL==9)
beginCntH<=CntH+1'b1;CntL<=4'b0000;end
else
beginCntH<=CntH;CntL<=CntL+1'b1;end
end
assign_1MHz=CntH[2];
endmodule
分频电路的仿真波形图如下:
4.2相位累加器和数据锁存器器电路
相位累加器是DDS系统设计的核心,它决定着频率的范围和分辨率。
本设计中采用的是24位的二进制累加器和寄存器,其中累加器与寄存器在同一个模块中,并取锁存数据的高十位作为查表的地址值。
Verilog程序如下:
//counter.v
modulecounter(clk,fre_word,address);
inputclk;
input[23:
0]fre_word;
outputreg[11:
0]address;
reg[23:
0]phaseadder;
always@(posedgeclk)
begin
phaseadder=phaseadder+fre_word;
address=phaseadder[23:
12];
end
endmodule
4.3波形存储器ROM的生成
在我们的程序中,波形存储器ROM是由VC++程序生成的,以*.mif文件的格式存放在电脑中,并可以被QuartusII调用。
程序及其原理简介如下:
#include
#include"math.h"
voidmain()
{ints;
inti;
FILE*fp;
fp=fopen("4096.mif","w+");//新建4096.mif文件,只写模式
fprintf(fp,"--MAX+plus-generatedMemoryInitializationFile\n");
fprintf(fp,"--ByDiandJie\n\n\n\n\n");//作者
fprintf(fp,"WIDTH=10;\n\n");//定义字宽
fprintf(fp,"DEPTH=4096;\n\n");//定义内存容量
fprintf(fp,"ADDRESS_RADIX=HEX;\n\n");//定义地址进制
fprintf(fp,"DATA_RADIX=HEX;\n\n");//定义内容进制
fprintf(fp,"CONTENTBEGIN\n");//内存开始
for(i=0;i<4096;i++)
{s=512+511*sin(i*atan(1.0)*8/4096);//512和511是为了最大的利用sinx小数点后面的有效内容,并将其调节为x轴上方的无符号数,4*atan(1.0)为π,再乘以2i除以4096是将sin的一个周期分为4096个值。
fprintf(fp,"%x\t:
\t%x;\n",i,s);}//Quartus调用*.mif文件时所需满足的格式
fprintf(fp,"END;\n");//内存结束
fclose(fp);
}
余弦波文件的生成与正弦波文件的生成是一样的,只是将公式改为{s=512+511*sin(i*atan(1.0)*8/4096+2*atan(1.0));当然,这样做只是为了简便编程者的操作,我们也可以将address的值加上4096/4之后进行寻址,便可以减少内存的使用。
4.4三角波及方波输出电路
由于方波只有高、低电平两种状态,因此只需要在一个周期时间的中间位置翻转电平就可以形成方波。
程序及其原理简介如下:
//fangbo.v
modulefangbo(clk,enable,address,qsquare);
inputclk;
inputenable;
input[11:
0]address;
outputreg[9:
0]qsquare;
always@(posedgeclk)
if(!
enable)qsquare=10'b00_0000_0000;
elsebegin
if(address<=12'b0111_1111_1111)
qsquare[9:
0]=10'b11_1111_1111;//利用address在中间位置实现翻转
elseqsquare[9:
0]=10'b00_0000_0000;
end
endmodule
三角波则是先判断出address的中间状态,然后将address或address的非赋给相应的输出,即可得到我们所需的三角波。
其verilog语言及原理简介如下:
//sanjiao.v
modulesanjiao(clk,enable,address,qtriangle);
inputclk,enable;
input[11:
0]address;
output[9:
0]qtriangle;
reg[9:
0]qtriangle;
always@(posedgeclk)
if(!
enable)qtriangle=10'b00_0000_0000;
elsebegin
if(address<=12'b0111_1111_1111)
qtriangle[9:
0]=address[10:
1];
elseqtriangle[9:
0]=~address[10:
1];//address的非与address一个递减一个递增,正好形成了三角波的一个周期。
end
endmodule
4.5波形的综合输出电路
有了三种波形,就要在特定时刻进行选择,在每一个时刻只能有一种波输出,在示波器上显示,所以用case语句写了一个选择性输出,程序如下:
//selection.v
moduleselection(clk,address,wavemode,wavevalue);
inputclk;
input[1:
0]wavemode;
input[11:
0]address;
output[9:
0]wavevalue;
reg[9:
0]wavevalue;
wire[9:
0]wavevalue1,wavevalue2,wavevalue3;
wire[9:
0]q;
supply1Vdd;
fangboU0(clk,Vdd,address,wavevalue2);
sanjiaoU1(clk,Vdd,address,wavevalue3);
sin_romU2(address,clk,q);
assignwavevalue1=q;
always@(posedgeclk)
case(wavemode)
2'b01:
wavevalue=wavevalue1;
2'b10:
wavevalue=wavevalue2;
2'b11:
wavevalue=wavevalue3;
endcase
endmodule
4.6状态机控制电路
状态机控制电路主要包括按键模块和工作模块两个部分,由于按键的有限性,状态机的利用大大的提高开关的利用率,使得我们0-200kHz频率任意切换的功能得以实现。
其verilog程序如下,思路清晰,使用简便,将在实验结果中具体介绍,也是本实验的亮点所在。
//control.v
modulecontrol(clk,keyin,wavemode,length);
input[3:
0]keyin;
inputclk;
outputreg[1:
0]wavemode;
outputreg[23:
0]length;
reg[23:
0]fredata;
reg[3:
0]key;
integersingle_state=1,single_frc=1;
always@(posedgeclk)
begin
key=keyin;
case(key)
4'b0001:
beginwavemode=2'b01;length=24'd17;end//key1-reset
4'b0010:
begincase(single_state)//key2-wavemode
1:
wavemode=2'b01;//sin
2:
wavemode=2'b10;//fangbo
3:
wavemode=2'b11;//sanjiao
default:
beginwavemode=2'b01;single_state=0;end
endcase
single_state=single_state+1;
end
4'b0100:
begincase(single_frc)//key3-frequencydangwei
1:
length=24'd17;//1Hz~100Hz
2:
length=24'd1678;//100Hz~500Hz
3:
length=24'd8389;//500Hz~1kHz
4:
length=24'd16777;//1kHz~5kHz
5:
length=42'd83886;//5kHz~10kHz
6:
length=24'd167772;//10kHz~50kHz
7:
length=24'd838861;//50kHz~200kHz
default:
beginlength=24'd671088;single_frc=0;end
endcase
single_frc=single_frc+1;
end
4'b1000:
begincase(single_frc)//key4-frequencybujin
1:
length=length+24'd16777;//1kHz
2:
length=length+24'd17;//1Hz
3:
length=length+24'd168;//10Hz
4:
length=length+24'd839;//50Hz
5:
length=length+24'd1678;//100Hz
6:
length=length+24'd8389;//500Hz
7:
length=length+24'd16777;//1kHz
8:
length=length+24'd83886;//5kHz
default:
length=length+24'd0;//0
endcase
end
endcase
end
endmodule
4.7状态机专用消颤电路
消颤电路时经常用到的一种电路,普通消颤电路以D触发器锁存并在时钟上升沿赋值为基础,原理简便,但并不适用于状态机电路。
状态机电路会在每一个时钟上升沿检测开关的0、1状态,如果高电平时间长(大于1us),将会导致其测试出无数个高电平而使得输出只能是循环的任意状态,或累加的最高状态。
状态机专用消颤电路,既继承了普通消颤电路忽略开关的颤的的功能,又使得开关按下后每0.5s才产生一个1us的微小脉冲,相当于状态机切换一个状态,使得状态机的功能得以全部实现。
以下为状态机专用消颤电路的verilog程序及原理简介:
//key.v
modulekey(clk,keyIN,keyOUT);
inputclk;
input[3:
0]keyIN;
output[3:
0]keyOUT;
reg[3:
0]keyOUT;
reg[19:
0]scan;
wire[3:
0]keyIN;
always@(posedgeclk)
if(scan==20'h7A120)//每50000个系统脉冲(合为0.5s)的持续1可输出一个1us的脉冲
beginkeyOUT<=keyIN;scan<=scan+1;end
elseif(scan==20'h7A121)
beginkeyOUT<=0;scan<=0;end
else