当前位置:文档之家› FPGA课程设计报告

FPGA课程设计报告

2014年FPGA课程设计课程设计报告课程名称:FPGA课程设计实验名称:直接数字合成器设计姓名:李思彧学号: 20114690 班级:电子科11-1 班指导教师:倪伟合肥工业大学电子科学与应用物理学院制一、实验原理直接数字式频率合成器(DDS)是将先进的数字处理理论与方法引入频率合成的一项新技术,DDS把一系列数字量形式的信号通过数/模转换器转换成模拟量形式的信号。

DDS的具体工作过程是由N位相位累加器、N位加法器和N位累加寄存器组成。

每来一个时钟脉冲,N位加法器将频率控制字K与N 位累加寄存器输出的累加相位数据相加,并把相加后的结果送至累加寄存器的输入端。

累加寄存器一方面将上一时钟周期作用后所产生的新的相位数据反馈到加法器的输入端,使加法器在下一时钟的作用下继续与频率控制字K相加;另一方面将这个值作为取样地址送入幅度/相位转换电路,幅度/相位转换电路根据这个地址输出相应的波形数据。

最后经D/A转换器和LPF将波形数据转换成所需要的模拟波形。

图1.直接数字式频率合成的基本框图1 DDS的设计原理DDS的原理图如图1所示。

DDS实现频率合成主要是通过查表的方式进行的。

正弦查询表是一个只读存储器(ROM),以相位为地址,存有1个或多个按0°~360°相位划分幅值的正弦波幅度信息。

相位累加器对频率控制字进行累加运算,若需要还可以加入相位控制字,得到的结果作为正弦波查询表的地址。

正弦查询表的输出为数字化正弦幅度值,通过D/A转换器转化为近似正弦波的阶梯波,再通过低通滤波器滤除高频成分和噪声最终得到一个纯正度很高的正弦波。

1.1 建模正弦波y=sin(2πx),若以f量化的量化频率对其幅度值进行量化,一个周期可以得到M=f量化个幅度值。

将这些幅度值按顺序存入到ROM。

相位累加器在参考时钟的驱动下,每来1个脉冲,输出就会增加1个步长相位增量X,输出数据作为地址送入ROM中,读出对应的幅度值形成相应的波形。

1.2 参数设定DDS输出信号频率:其中,X为频率累加器设定值;N为相位累加器位数;fc为参考时钟频率。

例如,假定基准时钟为200 MHz,累加器的位数为32,频率控制字X 为:0x08000000H,即为227,则:再设定频率控制字X为0x80000000H,即为231,则:可见,理论上通过设定DDS相位累加器位数N、频率控制字X和基准fc的值,就可以得到任一频率的输出。

频率分辨率为:fres=fc/2N,由参考时钟和累加器的位数决定,当参考时钟的频率越高,相位累加器的位数越高,所得到的频率分辨率就越高。

1.3 方案的选择在利用FPGA制作DDS时,相位累加器是决定DDS性能的一个关键部分。

一方面可以利用进位链来实现快速、高效的电路结构,同时长的进位链会减少其他逻辑的布线资源,限制整个系统速度的提高;另一方面可以利用流水线技术提高工作频率,但系统频率转换速度会相对降低。

在选择累加器实现方案时需要综合考虑。

正弦波查询表ROM也是制作的重点。

在FPGA中ROM表的尺寸随着地址位数或数据位数的增加呈指数递增,如何在满足性能的前提下节省资源开销。

一方面通过相位累加器的输出截断方式,例如从32位的相位累加器结果中提取高16位作为ROM的查询地址,由此而产生的误差会对频谱纯度有影响,但是对波形的精度的影响是可以忽略的;另一方面可以根据信号周期对称性来压缩ROM的尺寸,这时系统硬件设计复杂度会有所增加。

因此,需要选取合适的参数和ROM 压缩技术,在满足系统性能的前提下使得系统尽量优化。

二、实验步骤2.Verilog HDL实现DDS模块2.1累加器模块累加器模块实现将相位控制字以及频率控制字累加,并生成地址输出,利用该地址可以对ROM寻址。

累加器模块的verilog程序如下:module acc(clk,clr,dataa,datab,addr);input[11:0] dataa,datab;input clk,clr;output[11:0] addr;wire[11:0] addr;//reg[15:0] daraa_reg,datab_reg;reg[11:0] A,addr_reg;always@(posedge clk or posedge clr)beginif(clr)beginaddr_reg=16'h0000;A=16'h0000;endelsebeginA=A+dataa;addr_reg=datab+A;endendassign addr=addr_reg;endmodule2.2ROM的生成制作DDS的过程中,我们需要正弦函数上各个点的具体数值,以便我们输出正弦波形,这些正弦波的数值需要存入一个只读寄存器(ROM)中。

在ise中可以通过添加ip核来生成ROM。

制作完成后可以在工程中看到生成的ROM如图2:图2.由于ROM数据较多我们需要利用matlab来完成COE文件的生成,生成COE的程序如下:t=0:2*pi/2^12:2*piy=0.5*sin(t)+0.5;r=ceil(y*(2^8-1)); %将小数转换为整数,ceil是向上取整。

fid = fopen('sin.coe','w'); %写到sin.coe文件,用来初始化sin_romfprintf(fid,'MEMORY_INITIALIZATION_RADIX=10;\n');fprintf(fid,'MEMORY_INITIALIZATION_VECTOR=\n');for i = 1:1:2^12fprintf(fid,'%d',r(i));if i==2^12fprintf(fid,';');elsefprintf(fid,',');endif i%15==0fprintf(fid,'\n');endendfclose(fid);2.3顶层模块设计:顶层模块完成累加器的调用,以及ROM的调用,输出我们所需要的数据顶层模块的程序如下:module topmodel(clk,clr,ena,dataa,datab,dds_data);input clk,clr,ena;input[11:0] dataa,datab;output[15:0] dds_data;//reg[15:0] result_reg;wire[11:0] result_wire;//reg[12:0] addr_reg;//wire[12:0] addr_wire;acc accu(.clk(clk),.clr(clr),.dataa(dataa),.datab(datab),.addr(result_wire));sinrom wave(.clka(clk), // input clka.ena(ena), // input ena.addra(result_wire), // input [12 : 0] addra.douta(dds_data) // output [15 : 0] douta);endmodule2.4测试文件的编写以及仿真在完成程序的编写之后,需要添加测试文件以及激励信号,实现在电脑上仿真。

测试程序如下:module testtop;// Inputsreg clk;reg clr;reg ena;reg [11:0] dataa;reg [11:0] datab;// Outputswire [15:0] dds_data;// Instantiate the Unit Under Test (UUT)topmodel uut (.clk(clk),.clr(clr),.ena(ena),.dataa(dataa),.datab(datab),.dds_data(dds_data));initial begin// Initialize Inputsclk = 0;clr = 1;ena = 0;dataa = 0;datab = 0;// Wait 100 ns for global reset to finish#6 clr=0;#5 dataa=12'h0003;#1 datab=12'h0003;#10 ena=1;//#2 ena=0;// Add stimulus hereendalways #5 clk=~clk;always@(posedge clk)begin$display("%d",dds_data);endendmodule2.5程序下载实现硬件仿真实现程序的下载首先需要先设置cdc图3.cdc设置图4.cdc关联引脚完成cdc设置之后需要进行ucf引脚约束文件的编写:ucf文件内容如下:NET "clk" LOC =AH15;NET "ena" LOC =AC24;NET "clr" LOC =AC25;NET "dataa[0]" LOC=AE26;NET "dataa[1]" LOC=AE27;NET "dataa[2]" LOC=AF26;NET "dataa[3]" LOC=AF25;NET "dataa[4]" LOC=AG27;NET "dataa[5]" LOC=U25;之后便可以下载仿真三、实验结果及分析3.1仿真波形在电脑上的仿真波形如图:图5.仿真波形将输出数据打印出来并用excel生成曲线图:图5.打印出的数据图6.EXCEL画出的正弦波通过EXCEL画出的曲线图我们可以清楚看到我们的输出数据完美的画出了正弦波,其中系列1为1.5625Mhz,系列2为12.5Mhz,这证明了我们输出是正确的,所以程序也是正确的。

3.2下载到实验板的仿真波形:通过CDC软件我们可以看到硬件仿真的结果,结果符合我们预期图7.cdc仿真结果四、体会在完成这次课程设计的过程中,我们不仅增长了自己的知识,同时也锻炼了自己的能力。

首先,这次课程设计让我们了解到了一种通过数字电路控制生成特定频率波形的方式,这是我们在日常的学习中没有接触过的。

DDS即直接数字合成器,我们向DDS中输入频率控制字,相位控制字,便可以在DDS的输出端得到一系列的数字,通过AD转换以及低通滤波便可以得到完美的正弦波信号。

另外,我们学习到了ise的使用,以及下载程序的方法。

其次,这次课程设计锻炼了我们解决问题的能力,我们拿到的题目只有要求而没有具体的实现方法,所以从方案的设计到程序的设计,直至最后结果的呈现完全依靠自己的摸索,在摸索中,我们初步了解了科研工作的基本工作步骤,例如如何查找文献,设计科研方案,解决在科研过程中出现的种种问题。

相关主题