基于Verilog实现的DDS任意波形发生器 下载本文

内容发布更新时间 : 2024/5/9 23:50:10星期一 下面是文章的全部内容请认真阅读。

集成电路课程设计

第二节 直接数字频率合成技术简介

频率控制是现代通信技术中很重要的一环,能够获得宽带(频率控制范围宽)、快速(转换时间快)、精细(分辨率高)、杂散小(频谱纯)的频率控制信号一直是通信领域中的一个重要研究内容,。直接数字频率合成(DDS)技术是从相位概念出发直接合成所需波形的一种新的频率合成技术,具有频率分辨率高、频率变换速度快、相位可连续线性变化等优点,在基于数字信号处理的现代通信频率控制中已被广泛采用。

一、 总体方案实现及系统框图

根据以上分析,可以得出本组的系统框图如下所示:

在该DDS电路组成上,包括基准时钟、频率累加器、相位累加器、幅度/相位转换电路。频率累加器对输入信号进行累加运算,产生频率控制数据,相位累加器对代表频率的M位二进制码进行累加运算,产生后面波形存储器所需的查表地址,幅度/相位转换电路实际上就是一个波形存储器,供查表使用,读出数据送人D/A转换器和低通滤波器。但是本次课程设计中我们只做前端设计,最后经D/A转换器和低通滤波器将波形数据转换成所需要的模拟波形不实现。

系统设计原理框图如下:

相位 累加器 频率 控制字M 时钟fc + 相位 寄存器 相位地址 正弦 查询表 fout

图1.1 系统设计原理框图

二、直接数字频率合成技术原理

- 6 -

集成电路课程设计

相位累加器由N位全加器和N位累加寄存器级联而成,可对频率控制字的二进制码进行累加运算,是典型的反馈电路。正弦查找表的数据存放在ROM中,内部存有一个时钟脉冲,相位寄存器以步长M递增。相位寄存器的输出结果的高位部分作为正(余)弦查找表的一个周期的正弦波信号的数字幅度信息,每个查找表的地址对应于正弦波中0°~360°范围内的一个相位点。查找表把输入的址信息映射成正(余)弦波的数字幅度信号,输出周期性离散正弦信号。

DDS 具体工作过程如下:每来一个时钟脉冲clk,N 位全加器将频率控制数据M 与累加寄存器输出的累加相位数据N 相加,把相加后的结果送至累加寄存器的输入端。累加寄存器一方面将上一时钟周期作用后所产生的新的数据反馈到加法器的输入端,以使加法器在下一时钟的作用下继续与频率控制数据M 相加;另一方面将这个值作为取样地址值送入幅度/相位转换电路,此电路根据取样地址输出相应的波形数据。

假设有一个频率为 f 的余弦信号进行采样,得到离散序列为:

其中

,现以采样频率对该信号

为采样周期。上式对应的相位序列为:

该相位序列的显著特性就是线性,即相邻样值之间的相位增量是一常数,且仅与信号频率 f 有关。由采样定理可以知道输出波形的频率和输入波形的频率必须满以下关系:

,为输出信号的频率,为采样信号频率。其中K和M为

两个正数,在下面将会讲到。

由上式可以知道如果将

的相位等分为M份,则频率为

的余弦

信号以频率采样后,其量化序列的样本之间的量化相位增量为一个可调的值

,通过改变K的值可以实现相位以不同的步长值增长。将

代入可以得到

,这就是还原出来的信号函数表达

- 7 -

集成电路课程设计

式它的频率为DDS中一般取

这就是直接数字频率合成(DDS)的方程。在实际的 ,N为正整数,表示相位累加器的位数。则DDS方程变为:

本设计所基于的理论技术就是这些,事实上,现在的DDS普遍都是采用这样的方法来实现的。我们小组查阅了很多相关的文档,其中无一不是采用了类似的查找表的方式实现,所以本小组也采用了该方法。但是在设计时应注意的问题是,根据信号采样的原理可知,输入信号和输出信号的频率必须满足如下关系才能保证采样可恢复:

因此,如果相位累器的地址范围为N位(

),即采样点为每周期

个采样点。则输入的频

率控制字最大值为此时输出最大频率为 当K=1时,输出频率为

这就是DDS合成的频率范围。

三、系统组成模块简介

1、顶层模块

顶层模块是系统程序的主模块,它负责将fom查找表、相位累加等模块组装在一起,通过调用的关系使它们组合成为一个有机的整体。在顶层模块中,定义了参考时钟的输入,复位端口,波形输出、频率控制字等。

2、相位累加器模块

相位累加器是决定系统性能的关键部分,主要是利用频率控制字和相位控制字来累加出寻址地址。相位累加器在基准频率信号clk的控制下以频率控制字data为步长进行累加运算,产生需要的频率控制数据,在时钟的控制下把累加的结果作为波形存储器ROM的地址,实现对波形存储器ROM的寻址。由于相位

- 8 -

集成电路课程设计

累加模块通过C语言实现比较容易,故我们没有单独成立一个模块,而是将它集成到了顶层模块的一个always语句块中: case(choose_wave) 2'b00:begin

sin_ena <= 1'b1; cos_ena <= 1'b0; sawtooth_ena <= 1'b0; triangle_ena <= 1'b0;

if(ADD_B > 256) ADD_B <= 0; //关键代码,实现相位累加的功能 else ADD_B <= ADD_A + ADD_B; end 2'b01:begin

cos_ena <= 1'b1; sin_ena <= 1'b0; sawtooth_ena <= 1'b0; triangle_ena <= 1'b0;

if(ADD_B > 256) ADD_B <= 0; //关键代码,实现相位累加的功能 else ADD_B <= ADD_A + ADD_B; end 2'b10:begin

sin_ena <= 1'b0; cos_ena <= 1'b0; sawtooth_ena <= 1'b1; triangle_ena <= 1'b0;

if(ADD_B > 256) ADD_B <= 0; //关键代码,实现相位累加的功能 else ADD_B <= ADD_A + ADD_B; end 2'b11:begin

sin_ena <= 1'b0; cos_ena <= 1'b0;

- 9 -

集成电路课程设计

sawtooth_ena <= 1'b0; triangle_ena <= 1'b1;

if(ADD_B > 256) ADD_B <= 0; //关键代码,实现相位累加的功能 else ADD_B <= ADD_A + ADD_B; end

default:begin

ADD_B <= 9'b0; sin_ena <= 1'b0; cos_ena <= 1'b0; sawtooth_ena <= 1'b0; triangle_ena <= 1'b0; end endcase

在程序中还出现了一个变量(wave_choose)这是一个用来选择所要输出波形的一个变量,通过它可以控制输出的波形种类(正弦波,余弦波,三角波,锯齿波)。但是由于在设计的时候没有考虑到存在负值的影响,导致最后综合的结果不正确,经过询问老师知道修改方法是将rom查找表中所有采样点的电压负值全部抬高,消除负值,但是由于时间的原因没有来得及修改,也不知道方案修改的结果。

3、查找表

本模块实现的是一个rom存贮器,用于存储采样的波形数据,并提供地址查找的功能。具体实现的过程:

1) 首先使用数学工具计算得到波形采样点,生成mif文件

2) 导入数据采样点,给每一个采样点分配地址,并提供外部寻址的接口,此过程可以通过Quartas Ⅱ来辅助完成

由于我们组的设计时在modelsim下进行的,modelsim面向的是仿真,它不会产生所谓的“rom”这种实际的电路,所以我们没有采用这样的方法,而是简单的使用case语句来实现。虽然这样也能得到预期的效果,但是它却没有真正的生成一个“rom”,根据我组的综合结果来看,使用case语句生成的是一个与输入相关的复杂的逻辑网络,而不是rom那样有一定规则的电路结构。一下是我们使用C语言产生采样点的程序:

- 10 -