本科时期的一个课设,现在将他分享出来,写了很详细的文章,可以直接拿去使用:设计采用波形查找表和相位累加器的方法实现DDS,查找表的数据位宽为8位,采样点数为4096。波形产生范围是100Hz-20MHz,最小频率间隔为1Hz,用8个数码管显示频率,可产生正弦波、方波、三角波,波形用两个led显示,select信号控制,全灭为正弦波,一亮一灭为方波,全亮为锯齿波。为了使频率和相位便于调节,用3个拨码开关控制步进,用8个led显示状态。
基于FPGA的函数信号发生器设计
目录
摘要:本设计以EGO1开发板为核心部件,基于Xilinx Vivado平台,运用Verilog语言,采用波形查找表和相位累加器的方法实现了信号发生器的设计,总结概括了DDS(直接数字频率合成器)的原理、详细设计、仿真分析以及实验总结。DDS通过相位累加和波形数据查询实现信号合成,涉及奈奎斯特采样定理和调频原理。设计中考虑了频率与相位步进精度,利用高位相位累加器和正弦波采样点数实现高精度输出。仿真验证了设计的正确性,实验表明该DDS设计性能良好。
关键字:Vivado;Verilog;函数信号发生器;波形查找表;相位累加器
1 原理分析
DDS信号发生器采用直接数字频率合成(Direct Digital Synthesis,简称DDS)技术,把信号发生器的频率稳定度、准确度提高到与基准频率相同的水平,并且可以在很宽的频率范围内进行精细的频率调节。采用这种方法设计的信号源可工作于调制状态,可对输出电平进行调节,也可输出各种波形。DDS的设计思想完全是基于数值计算信号波形的抽样值来实现频率合成的。
DDS的工作原理是基于相位和幅度的对应关系,通过改变频率控制字来改变相位累加器的累加速度,然后在固定时钟的控制下取样,取样得到的相位值通过相位幅度转换得到与相位值对应的幅度序列,幅度序列通过数模转换得到模拟形式量化的正弦波输出。
1.1 DDS框图
DDS的结构主要由相位累加器、波形存储器、数模(D/A)转换器和低通滤波器等四个大的结构组成。其结构框图如下:

图1-1 DDS结构图
图中,相位累加器是由N位加法器与N位累加寄存器构成,它是DDS模块中一个极其重要的部分。在参考频率时钟的驱动下,DDS模块开始工作;当每来一个参考时钟时,累加器就把频率控制字FW与寄存器输出的值进行累加,将相加后的结果再输入到寄存器中,而累加寄存器就将在上一个参考时钟作用时产生的数据通过反馈的方式输送到累加器中。这样,在时钟的作用下,就可以不停的对频率控制字进行累加。此时,用相位累加器输出的数据作为地址在波形存储器中通过查找地址所对应的幅值表,就可以完成其从相位到幅值之间的转化。
1.2 DDS原理
1.2.1 DDS的工作原理
DDS技术是根据奈奎斯特取样定律,从连续信号的相位出发,将正弦信号取样,编码,量化,形成一个正弦函数表,储存在EPROM中,合成时,通过改变相位累加器的频率字来改变相位增量,也就是步长。相位增量的不同导致一个周期内取样点的不同,在时钟频率即采样频率不变的情况下,通过相位的改变来改变频率。
1.2.2 奈奎斯特采样定理
奈奎斯特采样定理讨论了对于频谱在信号的采样频率限制,所以也称为低通采样定理。假设存在一个最高频率为的带限信号,如果以不小于二倍于的采样频率对信号进行采样,即,得到,则原信号可以被采样数据串无失真的还原出来。
1.2.3 合成
合成,简单来说就是将我们的采样数据还原成模拟信号。还原的方式为:以一定的频率将采样数据依次输出。就可以还原波形。
假设,以100M的频率输出我们的1024个抽样数据,则将会得到一个频率为:
的正弦波。这就达到了最初的信号输出。
1.2.4 调频
调频的方案有两种:一种是改变时钟频率,将读取采样数据的速度变快或者变慢,这样就可以改变频率。这种方法对于当下很多开发板固定的晶振频率来说比较难以实现。
另一种方案就是减少输出的采样数据,输出的采样数据越少,频率便会越高。 在DDS模块中,输出频率的公式为:
输出信号的频率分辨率为:
从上两式可以看出,在参考信号与加法器或寄存器的位数给定时,信号最终的输出频率主要由频率控制字决定。故当频率控制字变化时,输出频率也跟着变化,从而可以实现调频的基本功能。
2 详细设计

图2-1 RTL视图
RTL视图如上所示,本设计采用波形查找表和相位累加器的方法实现DDS,查找表的数据位宽为8位,采样点数为4096。波形产生范围是100Hz-20MHz,最小频率间隔为1Hz,用8个数码管显示频率,可产生正弦波、方波、三角波,波形用两个led显示,select信号控制,全灭为正弦波,一亮一灭为方波,全亮为锯齿波。 为了使频率和相位便于调节,用3个拨码开关控制步进,用8个led显示状态。对应关系如下表:
| sw[2:0] | 频率步进 | 相位步进 | led[7:0] |
|---|---|---|---|
| 000 | 1Hz | 1度 | 0000_0001 |
| 001 | 10Hz | 5度 | 0000_0010 |
| 010 | 100Hz | 10度 | 0000_0100 |
| 011 | 1KHz | 30度 | 0000_1000 |
| 100 | 10KHz | 50度 | 0001_0000 |
| 101 | 100KHz | 90度 | 0010_0000 |
| 110 | 1MHz | 100度 | 0100_0000 |
| 111 | 10MHz | 180度 | 1000_0000 |
2.1 频率与相位步进设计
参数文件如下,其中包括计算相位控制字和频率控制字的公式。
//频率步进(下面是以时钟频率100M,相位控制字12位,频率控制字32位计算所得)
`define Fword_step0 32'd43 //频率步进1HZ
`define Fword_step1 32'd430 //频率步进10HZ
`define Fword_step2 32'd4_295 //频率步进100HZ
`define Fword_step3 32'd42_950 //频率步进1KHZ
`define Fword_step4 32'd429_497 //频率步进10KHZ
`define Fword_step5 32'd4_294_967 //频率步进100KHZ
`define Fword_step6 32'd42_949_673 //频率步进1MHZ
`define Fword_step7 32'd429_496_730 //频率步进10MHZ
//相位步进
`define Pword_step0 12'd11 //相位步进1度
`define Pword_step1 12'd57 //相位步进5度
`define Pword_step2 12'd114 //相位步进10度
`define Pword_step3 12'd341 //相位步进30度
`define Pword_step4 12'd569 //相位步进50度
`define Pword_step5 12'd1024 //相位步进90度
`define


2万+

被折叠的 条评论
为什么被折叠?



