FPGA课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)
begin
if(clr)
begin
addr_reg=16'h0000;
A=16'h0000;
end
else
begin
A=A+dataa;
addr_reg=datab+A;
end
end
assign addr=addr_reg;
endmodule
2.2ROM的生成
制作DDS的过程中,我们需要正弦函数上各个点的具体数值,以便我们输出正弦波形,这些正弦波的数值需要存入一个只读寄存器(ROM)中。
在ise中可以通过添加ip核来生成ROM。
制作完成后可以在工程中看到生成的ROM如图2:
图2.
由于ROM数据较多我们需要利用matlab来完成COE文件的生成,生成COE的程序如下:
t=0:2*pi/2^12:2*pi
y=0.5*sin(t)+0.5;
r=ceil(y*(2^8-1)); %将小数转换为整数,ceil是向上取整。
fid = fopen('sin.coe','w'); %写到sin.coe文件,用来初始化sin_rom
fprintf(fid,'MEMORY_INITIALIZATION_RADIX=10;\n');
fprintf(fid,'MEMORY_INITIALIZATION_VECTOR=\n');
for i = 1:1:2^12
fprintf(fid,'%d',r(i));
if i==2^12
fprintf(fid,';');
else
fprintf(fid,',');
end
if i%15==0
fprintf(fid,'\n');