资源描述
课程设计任务书
2012~2013学年第1学期
一、课程设计题目:基于FPGA的DDS信号发生器设计
二、课程设计内容(含技术指标)
① 利用DDS技术产生稳定的正弦波、方波和三角波,输出频率为1Hz~200KHz,且频率可调,步进为1Hz、100Hz、1KHz和10KHz,峰值为0~5V;
② 显示电路用来显示输出信号的参数;
③ 4×4键盘用来设定频率、步进、清零、确认等功能;
④用Verilog HDL进行建模和模拟仿真,再利用FPGA进行实现。
三、进度安排
序号
名 称
时 间
1
掌握相关FPGA最小系统的知识
一 天
2
掌握用于设计DDS信号发生器的Verilog HDL编程知识
一 天
3
掌握矩阵键盘、DA芯片、功率放大电路和滤波电路的设计
一天
4
根据DDS信号发生器的工作原理设计电路图
一 天
5
学会借用电子线路CAD正确绘制电路图;
一 天
6
掌握电子器件的安装工艺及焊接技术
半 天
7
掌握DDS信号发生器的软件下载与调试
一 天
8
了解电子电路板的制作过程
半 天
9
学习电路原理图及印制电路板图的读图方法
一 天
10
掌握DDS信号发生器的测试
一 天
11
书写电子技术课程设计报告
一 天
四、基本要求
1.基本功能:利用DDS技术产生稳定的正弦波、方波和三角波,用数码管显示频率。
2.扩展功能:能产生ASK、FSK和PSK等调制信号,输出用12864液晶显示信号的波形、频率和幅度。
3.写出设计报告:不少于5000字,统一复印封面并用A4纸写出报告。
封面、课程设计任务书
摘要,关键词(中英文)
方案选择,方案论证
系统功能及原理。(系统组成框图、电路原理图)
各模块的功能,原理,器件选择
结果分析
设计小结
附录---参考文献
2012年9 月1日
摘 要
波形发生器己成为现代测试领域应用最为广泛的通用仪器之一,代表了波形发生器的发展方向。随着科技的发展,对波形发生器各方面的要求越来越高。近年来,直接数字频率合成器(DDS)由于其具有频率分辨率高、频率变换速度快、相位可连续变化等特点,在数字通信系统中已被广泛采用而成为现代频率合成技术中的佼佼者。
本次设计的是多功能信号发生器,它能够产生方波,三角波,锯齿波和正弦波四种基本波形。结合DDS技术,通过对FPGA的编程实现产生多种波,本电路是通过键盘扫描判断,进入相应的功能程序,然后实现频率调节,波形转换,幅度控制的。本次设计中我负责的是波形输出模块,通过调节要输出方波,三角波,锯齿波和正弦波四种基本波形。
关键字:波形发生器,直接数字频率合成器, 现场可编程门阵列
ABSTRACT
Waveform generator has become one of the most popular instruments in a modern testing field, representing the development direction of waveform generator.With the development of science and technology, the waveform generator for various aspects of increasingly high demand.In recent years, direct digital frequency synthesizer ( DDS ) since it has high frequency resolution, frequency conversion speed, phase can be changed continuously wait for a characteristic, in a digital communication system has been widely used and become the leader in the modern synthesis technology.
This design is a multifunctional signal generator, which can produce square wave, triangle wave, sawtooth wave and sine wave four basic waveforms. Combined with the technology of DDS, through the FPGA programming to generate multiple waves, this circuit is through the keyboard scan, the entry corresponding to the function of the procedure, and then realizing frequency modulation, a waveform conversion, amplitude control.
Keywords:Waveform generator,DDS,FPGA
1.方案选择与方案论证
数据输入:
方案一:4x4矩阵键盘
优点:由8个I\O口检测16个按键,可以大大节省I\O口资源。
缺点:控制时序较复杂,增加编程和调试的难度。
方案二:独立按键
优点:控制时序较简单,较易于编程与调试。
缺点:比较浪费I\O口资源。
方案三:拨码开关
优点:控制时序简单,易于编程和调试。
缺点:比较浪费I\O口资源。
通过比较各种因素,我选择方案一,
波形输出:
方案一:存储波形数据的ROM/RAM + DAC0832
优点:
1. 可以显示复杂波形
2. 可以有效控制输出波形的频率,幅度及相位
3. 节省FPGA内部的逻辑资源
4. 可以简单的切换波形
5. 使波形输出方式单一化,降低了编程难度
缺点:要消耗一定的ROM/RAM资源
方案二:存储波形数据的ROM/RAM + 分频器输出矩形波 + DAC0832
优点:
1.可以显示复杂波形
2.可以有效控制输出波形的频率,幅度及相位
3.节省FPGA内部的逻辑资源
4.可以较简单的切换波形
缺点:矩形波的频率,幅度和相位的调节需要另设相位累加电路,消耗一定的逻辑资源
方案三:case语句 + 分频器输出矩形波 + DAC0832
优点:在数据传输的反应速度上,在所需速度很快时占优势
缺点:
1. 大量浪费FPGA内部的逻辑资源
2. 波形数据较大时,会给代码的调试和维护带来不便。
方案四:存储波形数据的ROM/RAM + 分频器输出矩形波 + 计数器输出锯齿波和三角波 + DAC0832
优点:
1.可以显示复杂波形
2.可以有效控制输出波形的频率,幅度及相位
缺点:每种波形都需要另设相位累加电路来控制其频率,相位和幅度,消耗较多的逻辑资源
方案五:case语句 + 分频器输出矩形波 + 计数器输出锯齿波和三角波 + DAC0832。
优点:在数据传输的反应速度上,在所需速度很快时占优势。
缺点:
1.大量浪费FPGA内部的逻辑资源。
2.波形数据较大时,会给代码的调试和维护带来不便。
为了减小设计周期,减小编程难度,便于后期的调试工作,而且能方便的对幅度和频率进行调节,我选择方案一。
综上几种方案,我们组采用了数据输入的方案一,4x4矩阵键盘,由8个I\O口检测16个按键,可以大大节省I\O口资源。
波形输出的方案二,存储波形数据的ROM/RAM + 分频器输出矩形波 + DAC0832 可以显示复杂波形,有效控制输出波形的频率,幅度及相位,容易达到我们需要的效果,可以较简单的切换波形,而且节省了FPGA内部的逻辑资源。
2.系统功能与原理
2.1 DDS的基本原理
DDS技术是一种把一系列数字量形式的信号通过DAC转换成模拟量形式的信号的合成技术,它是将输出波形的一个完整的周期、幅度值都顺序地存放在波形存储器中,通过控制相位增量产生频率、相位可控制的波形。DDS电路一般包括基准时钟、相位增量寄存器、相位累加器、波形存储器、D/A转换器和低通滤波器(LPF)等模块,如图1.1所示。
相位增量寄存器寄存频率控制数据,相位累加器完成相位累加的功能,波形存储器存储波形数据的单周期幅值数据,D/A转换器将数字量形式的波形幅值数据转化为所要求合成频率的模拟量形式信号,低通滤波器滤除谐波分量。
整个系统在统一的时钟下工作,从而保证所合成信号的精确。每来一个时钟脉冲,相位增量寄存器频率控制数据与累加寄存器的累加相位数据相加,把相加后的结果送至累加寄存器的数据输出端。这样,相位累加器在参考时钟的作用下,进行线性相位累加,当相位累加器累加满量时就会产生一次溢出,完成一个周期性的动作,这个周期就是DDS合成信号的一个频率周期,累加器的溢出频率就是DDS输出的信号频率。
相位累加器输出的数据的高位地址作为波形存储器的地址,从而进行相位到幅值的转换,即可在给定的时间上确定输出的波形幅值。
图1 DDS原理图
波形存储器产生的所需波形的幅值的数字数据通过D/A转换器转换成模拟信号,经过低通滤波器滤除不需要的分量以便输出频谱纯净的所需信号。信号发生器的输出频率fo可表示为:
( 1.1)
式中为系统时钟,为系统分辨率,N为相位累加器位数,M为相位累加器的增量。
参数确定及误差分析.
2.2 参数确定
首先确定系统的分辨率,最高频率,及最高频率下的最少采样点数 根据需要产生的最高频率以及该频率下的最少采样点数,由公式
(1.2)
确定系统时钟的下限值。同时又要满足分辨率计算公式
(1.3)
综合考虑决定的值。
选定了的值后,则由公式(1.3)可 得=,据此可确定相位累加器位数N。
然后由最高输出频率
(1.4)
推出M=,得出相位增量寄存器为S位。
确定波形存储器的地址位数W,本系统中决定寄存个数据值,因此RAM地址为Z位。
一般选用FPGA/CPLD器件作为DDS的实现器件,对于D/A转换器的选择,首先要考虑到D/A转换器的转换速率。要实现所需的频率,D/A的转换速度要大于,然后根据D/A转换器字长所带来的误差,决定D/A的位数。由此选择D/A转换器的型号。
3.硬件电路设计
3.1 分频器、
信号发生器产生、控制和显示的总体结构图如图所示
示波器
时钟频率
频率控制单元
D/A
四种波形
选择单 元
图2 总体结构图
外部输入一个50MHZ的时钟频率,经过频率控制单元控制其频率在要求的范围内,由4选1数据选择器实现对输出波形的选择,再通过D/A转换模块,将数字信号转换成模拟信号在示波器上显示出来。
3.2 总体原理图
基于VHDL语言设计一个简易多功能信号发生器,通过选入输入信号,可以输出正弦波、三角波、方波和锯齿波四种波形信号。信号发生器的控制模块可以用数据选择器实现,四种信号的信号选择可以用4选1数据选择器实现。同时本设计使用原理图的方法,对正弦波、三角波、方波和锯齿波和4选1数据选择器元件进行调用。
简易多功能信号发生器的原理图如下:
图3 总体原理图
3.3 DDS的FPGA实现
相位累加器与相位寄存器的设计
相位累加器与相位寄存器主要完成累加,实现输出波形频率可调功能。利用Quartus II可编程逻辑器件系统开发工具进行设计。首先,打开Quartus II软件,新建一个工程管理文件,然后在此工程管理文件中新建一个Verilog HDL源程序文件,并用硬件描述语言Verilog HDL编写程序实现其功能。在设计过程中,可在一个模块中描述。
4.D/A转换电路
图4 D/A转换电路
数据转换器输出的数据是数字形式的电压值,为实现数字电压值与模拟电压值之间的转换,系统还专门设计D/A转换电路,其D/A转换电路原理图如图3所示。
4.软件设计
4.1 VHDL程序设计
系统软件的主要任务是:将送入的频率,相位差控制字,控制输出波形种类进处理得到三种不同的波形,频率和相位差。
首先是对DDS子程序进行设计,利用类属语句对输入频率字,相位字,累加器,正弦ROM表的地址位宽和数据进行说明,软件的主要任务是在累加器中按输入的频率字进行循环累加,将截断的数据与输入的相位字进行累加。
4.2总程序流程设计图
图5 总程序流程图
4.3子程序流程图
图6 子程序流程图
5.结果分析:
5.1 波形仿真
图7 正弦波仿真图
图8 方波仿真图
图9 三角波仿真图
5.2.输出波形:
正弦波 三角波
矩形波
6.设计小结:
本次设计以直接数字频率合成技术(DDS)为基础的波形信号发生器工作原理和设计过程,并在FPGA实验平台上设计实现了满足各功能指标的信号发生器。系统硬件除需外加滤波整形电路外,其余部分均可在FPGA开发实验系统KH-310上集成开发,系统软件可在Quartus下编写代码,实现数据信息处理和控制操作等功能。整体开发环境成熟,应用工具齐全,随着FPGA性价比的不断提高,基于FPGA平台开发信号发生器将逐步走向标准化、规模化和产品化。
在这次课程设计中,我的工作主要是相位累加器的底层模块的代码编写和调试和ROM定制,负责波形输出模块,能够完成顺利的完成对波形类型的输出,如:三角波、方波、正弦波。虽然在设计过程中遇到很多困难 ,不过在老师和同学的帮助得到了解决,通过这次设计也使我的动手能力得到加强,学会发现问题并通过查阅资料,与同学讨论请教老师,来解决问题。总之,我在这次设计实践中受益匪浅,积累了经验。
参考文献:
【1】 姜雪松、张海风,可编程逻辑器件和EDA设计技术,北京:机械工业出版社,2004
【2】潘松,黄继业主编,EDA技术实用教程【J】,科学出版社2002:321—346.
【3】彭文标,黄悦华.基于DDS技术的信号源设计与实现[J].微计算机信息,2007(20):271-272.
附录1:
信号发生器原理图
附录2:
信号发生器PCB图
附录3:
波形输出
module ROM_READ(CLK50M,F,MOD,V,ROM_DATA);
input CLK50M; //clock source 50Mhz -- 20ns
input [15:0]F; //1~1,000,000Hz
input [1:0]MOD; //tri,sin,01
input [7:0]V; //voltage 0~50
output reg [7:0]ROM_DATA;
wire DIV_CLK;
wire [15:0]DIVP;
wire [0:7]tri_data;
wire [0:7]sin_data;
wire [0:7]toc_data;
wire [0:7]mtx_data;
reg [6:0]address;
assign DIVP = 50000000 / (256*F);
DivClk rom_clk(CLK50M,DIVP,DIV_CLK);
TAG tri_rom(address,CLK50M,tri_data);
SIN sin_rom(address,CLK50M,sin_data);
TOC toc_rom(address,CLK50M,toc_data);
MTX mtx_rom(address,CLK50M,mtx_data);
always@(posedge DIV_CLK)begin
if(address <= 7'b1111110)
address <= address + 1;
else
address <= 7'h00;
end
always@(posedge DIV_CLK)begin//根据选取方案不同,删除对应语句
case(MOD)
2'b00:ROM_DATA <= (tri_data * V)/50;//三角波
2'b01:ROM_DATA <= (sin_data * V)/50;//正弦波
2'b10:ROM_DATA <= (toc_data * V)/50;//锯齿波
2'b11:ROM_DATA <= (mtx_data * V)/50;//矩形波
endcase
endendmodule
展开阅读全文