实验报告册课程名称:Verilog HDL数字系统设计实验项目名称:频率可变的任意波形发生器学院:电子科学与技术专业:微电子班级:二班报告人:黄日才学号:2008160120指导教师:刘春平老师实验时间:2010.12.06 —2011.01.06提交时间:2011.01.06实验结论:经过不断的试验,最终完成了该实验设计的基本要求,输出四种不同的波形实现信号频率可调,并且在这基础上调用了FPGA芯片集成锁相环,增加了输出信号幅度可调。
经过测试显示输出波形信号稳定。
一、实验目的利用DE2实验板和DVCC试验箱的DA转换器设计出可出任意波形且频率可调的信号发生器,也就是基于FPGA的用Verilog描述的直接数字频率合成器(DDS)。
二、设计方案及其原理说明:DDS是一种把数字信号通过数/模转换器转换成模拟信号的合成技术。
它由相位累加器、相幅转换函数表、D/A转换器以及内部时序控制产生器等电路组成。
参考频率f_clk为整个合成器的工作频率,输入的频率字保存在频率寄存器中,经N位相位累加器,累加一次,相位步进增加,经过内部ROM波形表得到相应的幅度值,经过D/A转换和低通滤波器得到合成的波形。
△P为频率字,即相位增量;参考频率为f_clk;相位累加器的长度为N位,输出频率f_out为:F_out——输出信号的频率;N————相位累加器的位数;△P———频率控制字(步长);F_clk——基准时钟频率。
1、系统总体设计方案框架图:FPGA图1-1 系统总体设计方案2、四种波形单周期的取样示意图:3、本实验采用每个周期取样16次,以便产生的波形更加的平滑。
函数查找表的设计:(十进制)地址(8位二进制)rom的值0 1201 1652 2043 2304 2405 2306 2047 1658 1209 7410 3511 912 013 914 3515 744、程序思路1)分频器控制读取rom的步长,通过输入变量改变分频器计数器的计数总量,控制分频实验频率可调。
2)制作rom,通过一个函数实现,给函数输入一个地址,通过case语句输出一个值。
3)波形选择,同个if语句选择地址计数器输出的值,从而输出四种不同的波形4)锁相环(附加),调用FPGA芯片集成的锁相环模块,让输出的相位更加的稳定。
5)调幅(附加),通过在rom的值除以不同的值来控制改变输出信号的幅度。
三、程序及具体方法注释module dds_ver(clk_50MHz,fout,change,freq,key0);input clk_50MHz; //输入50MHz的全局时钟input[1:0] change; //定义输入变量,用来切换输出波形,一共4个档位input [2:0] freq; //定义输入变量,用来改变输出信号的频率,一共8个档位output [7:0] fout; //输出8为rom的值,用来驱动DA转化芯片,输出波形input key0; //定义输入变量,用来改变幅值计数器的值,从而改变幅值//调用FPGA芯片集成的锁相环模块,让输出的波形相位更稳定pll pll_inst (.inclk0 ( clk_50MHz ),.c0 ( clk_pll ));wire [7:0] fout;//分频功能,根据输入变量的不同实现不同的分频,用于读取rom的步长reg clk;reg [15:0] cnt;always @(posedge clk_pll) //利用计数器实现任意分频beginif(cnt==(50*(freq+1))) //设定频率控制字节begincnt=0;clk=~clk;endelsecnt=cnt+1;end//调幅功能,输入key0更变计数器cntvol的值,从而更变输出信号的幅度reg [2:0] cntvol;always@(negedge key0)beginif (cntvol>=1&&cntvol<7)cntvol<=cntvol+1'd1;else cntvol<=1'b1;end//地址累加器,实现地址的分段累加,从而实现四种不同波形的切换输出reg [5:0] addr;always @(posedge clk)beginbeginif(change==0)beginif(addr>=0&&addr<15) //切换正弦波addr=addr+1;elseaddr=0;endelse if(change==1)beginif(addr>=16&&addr<31) //切换方波addr=addr+1;elseaddr=16;endelse if(change==2)beginif(addr>=32&&addr<47) //切换正三角波addr=addr+1;elseaddr=32;endelse if(change==3)beginif(addr>=48&&addr<63) //切换反三角波addr=addr+1;elseaddr=48;endendend//制作rom的函数function [7:0] rom;input [63:0] address;case(address)0:rom=120/cntvol; //正弦波的rom值1:rom=165/cntvol;2:rom=204/cntvol;3:rom=230/cntvol;4:rom=240/cntvol;5:rom=230/cntvol;6:rom=204/cntvol;7:rom=165/cntvol;8:rom=120/cntvol;9:rom=74/cntvol;10:rom=35/cntvol;11:rom=9/cntvol;12:rom=0/cntvol;13:rom=9/cntvol;14:rom=35/cntvol;16:rom=10/cntvol; //方波的rom值17:rom=10/cntvol;18:rom=10/cntvol;19:rom=10/cntvol;20:rom=10/cntvol;21:rom=10/cntvol;22:rom=10/cntvol;23:rom=10/cntvol;24:rom=250/cntvol;25:rom=250/cntvol;26:rom=250/cntvol;27:rom=250/cntvol;28:rom=250/cntvol;29:rom=250/cntvol;30:rom=250/cntvol;31:rom=250/cntvol;32:rom=30/cntvol; //正三角波的rom值33:rom=60/cntvol;34:rom=90/cntvol;35:rom=120/cntvol;36:rom=150/cntvol;37:rom=180/cntvol;38:rom=210/cntvol;39:rom=240/cntvol;40:rom=210/cntvol;41:rom=180/cntvol;42:rom=150/cntvol;43:rom=120/cntvol;44:rom=90/cntvol;45:rom=60/cntvol;46:rom=30/cntvol;47:rom=0/cntvol;48:rom=240/cntvol; //反弦波的rom值49:rom=210/cntvol;50:rom=180/cntvol;51:rom=150/cntvol;52:rom=120/cntvol;53:rom=90/cntvol;54:rom=60/cntvol;55:rom=30/cntvol;56:rom=0/cntvol;57:rom=30/cntvol;58:rom=60/cntvol;60:rom=120/cntvol;61:rom=150/cntvol;62:rom=180/cntvol;63:rom=210/cntvol;endcaseendfunctionassign fout=rom(addr);// //把读到的rom的值赋给输出端口,输出驱动DA转换芯片endmodule四、实验结果及分析1、QuartusII仿真结果2、下载到DE2实验板连接到DVCC试验箱用示波器显示输出的各种波形图1)输出正弦波2)输出正弦波频率调节3)输出正弦波幅值调节4)输出方波3、结果分析通过仿真和搭建实验平台。
成功完成了实验设计的要求输出波形有很严重的锯齿现象,但是基本上显示出了完整的波形,实现了设计的波形切换输出、频率可调和幅值可调,前后比较了没有加入锁相环和加入锁相环模块输出波形的质量,加入锁相环值之后波形稳定很多。
输出波形的质量只要取决于信号周期取样的频率,取样点越多输出波形的失真越小,当然跟取样点的准确性也有很大关系,但是rom的值是通过MATLAB 产生的,准确性很高。
为了验证这个结论,决定每个信号周期取256个点(8为DA转换最大取样点256个)再进行实验,观察实验结果。
输出波形质量明显提高。
实验结果波形图如下:1)正弦波2)方波3)三角波4)锯齿波说明:由于觉得正三角波和反三角波只是相位上相差180度,显示出来的波形没有区别,这是由于采用取值法决定的,取值是包括了DA输出负值的点,所以没有正三角波和负三角波在显示上占有180度相位差的区别。
所以把反三角波改成输出锯齿波。
(这只是取样点不同,没有本质其别)当然,这些输出信号也是可以调节频率和幅度的。
五、实验结论:经过不断的试验,最终完成了该实验设计的基本要求,输出四种不同的波形实现信号频率可调,并且在此基础上调用了锁相环技术,增加了输出信号幅度可调。
经过测量显示输出波形信号稳定。
通过该信号发生器的设计,学习和掌握了DA转换,更加熟练地使用Verilog 语言描述硬件电路和信号的输出,也更加熟练地掌语言编写过程中的握数据的控制、运用quartusII仿真和调用modelsim仿真。
熟悉软件在编译过程中出现的错误和排除这些错误。
在搭建实验平台的过程中,由于没有使用过DVCC实验箱,所以遇到麻烦,开始没有使DE2板和DVCC试验箱共地,所以输不出波形,但是有些同学没有共地也能输出波形,而我试验之后发现我的实验平台只有共地才能输出完整波形,理论上也是需要所有的实验系统共地才不会影响信号完整性输出的。
编写代码时应该细分代码实现的功能,从很小的一个功能部分开始编写,不能全部一起编写,要先编写一小部分进行仿真。
测试成功之后再编写下一个功能模块,最好能使用模块化设计,以功能分开编写,分别测试。