基于FPGA(DDS)的正弦波发生器

本文介绍了如何使用FPGA通过DDS技术生成正弦波。DDS主要包括相位累加器、相位调制器、波形数据表、DAC和低通滤波器四部分。相位累加器通常为32位,ROM数据位宽取决于DAC,深度为2^地址位宽。DDS基本频率由ROM中的正弦波数据点数量和时钟频率决定,可通过改变相位累加器初值调整频率。
摘要由CSDN通过智能技术生成

记录背景:昨晚快下班时,与同事rk聊起怎么用FPGA实现正弦波的输出。我第一反应是利用高频的PWM波去滤波,但感觉这样的波形精度肯定很差;后来想起之前由看过怎么用FPGA产生正弦波的技术,但怎么都想不起来这个技术的名称是叫什么了。后来搜索后才知道就是DDS(Direct Digital Synthesizer),即:直接数字频率合成器。

最近(好吧,不是最近,是一直)发现自己记东西记不牢,究竟是自己老了,记忆力下退;还是自己不用心去记;还是因为看得少,缺少实践(毕竟纸上得来终觉浅、绝知此事要躬行)。

-----------------------------分割线-----------------------------------

以下内容主要转自:http://blog.chinaaet.com/lincoding/p/5100050592,如有侵权,请告知删除。抱歉!

DDS的主要组成部分:相位累加器、相位调制器、波形数据表、DAC和低通滤波器四大部分组成。如下图:

DDS的原理:

1、首先ROM中要存放好要显示的正弦波数据;

2、然后由相位累加器(其实就是个计数器)一直累加,这个累加器的值作为ROM的地址

3、DAC根据ROM输出的数据输出对应的电压值

4、由于上述输出的电压值是个离散值,无法构成平滑的正弦波,因此需要在后级增加一个低通滤波器才能输出完美的正弦波。

那么,怎么实现上述的功能呢?

首先,我们要考虑两个问题:

A、相位累加器(计数器)的位宽是多少?

B、ROM的数据位宽和深度(深度:2^地址位宽)是多少?

对于第一个问题:相位累加器的位宽一般是24~32bits,一般选32bits(因为这样的位宽能满足绝大部分的应用场合了);

对于第二个问题:

ROM的数据位宽选择要看DAC模块,比如我的DAC模块的数据输入数据范围是0~1023,那么ROM的数据位宽就要选择10位;

ROM的深度也要取决于你的DAC模块,因为ROM中只能存储整数。

相位累加器举例:

//-----------------------------------
//phase adder
reg    [10:0]    fre_cnt;
always @ ( posedge clk or negedge rst_n )
begin
    if ( ! rst_n )
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值