DDS发生器的频率控制字原理和基本结构(二)
DDS发生器的频率控制字原理和基本结构(二)
在正弦波发生器的verilog实现(一)中已经实现了最基本的功能,这篇文章将主要讲解DDS发生器的频率控制字原理和基本结构。
在这里先给出DDS发生器的结构框图:
下面对结构框图的各部分进行解释:
- RAM部分:在正弦波发生器的verilog实现(一)部分,我们使用matlab产生了一个周期的正弦波信号,并且在一个周期中采集了256个样点,然后通过导入
.coe
文件,将这256个样点保存到RAM中,即:RAM中存放的是离散的正弦波信号(一个周期,256个样点),RAM使用的规格是256*8bit; - fc采样时钟:在FPGA中使用的是一个50MHZ的采样时钟,也就是在仿真时,每隔20ns,从RAM中读出一个采样值。
- 相位累加寄存器:相位累加器是整个DDS系统的核心,在这里完成相位累加功能。假设使用的是一个N为的寄存器(当我们采集的样点为256个,则可以使用一个8位的寄存器)。每来一个时钟脉冲fc,加法器(位于频率控制字和相位累加器寄存器之间)将频率控制字K和相位累加寄存器输出的结果相加,把相加后的结果送到相位累加寄存器中。相位累加器输出的数据就是合成信号的相位,相位累加器的溢出频率就是DDS输出的信号频率。对应到我的上一个文章,相位累计寄存器中的值就相当于RAM的地址(addr),通过该地址就可以找到波形的抽样值。
- 频率控制字M:频率控制字控制着DDS 所输出的正弦波的频率。为了便于理解,还是对应到前一篇文章,频率控制字就相当于
ex_dds
模块中给addr所加的步长值,比如我们定义的是addr <= addr + 1'b1
,其中,后面的1'b1
就可以理解为频率控制字M。
为了便于理解,我们从FPGA的角度说明。假设使用的FPGA的时钟频率是fc=50MHZ
,则每隔20ns从RAM中读出一个采样,而我们在RAM中从放的是离散的正弦波信号,存放了一个周期,一共256个样点。所以,在读取RAM时,读完256个样点所用的时间是固定的(所用时间是256*20ns = 5120ns,单位就不换算了,影响不大),当频率控制字M=1
时,即:addr <= addr + 1'b1
,则在5120ns
内,我们可以输出一个周期的正弦波信号;但是当我们改变频率控制字M=2
时,即:addr <= addr + 2'd2
,则同样在5120ns
内,我们可以输出两个周期的正弦波信号(因为此时addr的变化值是:0,2,4,…,254,当addr第一次到达254时,输出了一个周期的正弦波信号,用时2560ns
;接着addr因为溢出,所以又从0开始变化,当第二次到达254时,输出了一个周期的正弦波信号,用时2560ns
,所以在5120ns
内一共输出了两个周期的正弦波信号);所以通过改变频率控制字M的值,就可以改变DDS输出的正弦波的频率。
M=1时的仿真结果:可以看到5120ns内输出了一个周期
M=2时的仿真结果:可以看到5120ns内输出了两个周期
目标频率 f0
下面我们推倒DDS 输出的正弦波的频率公式:
假设采样时钟的频率为fc
,频率控制字为M
,相位累加寄存器的位宽为n
,则相位累加器中的最大值为2^n-1
,当超过该值时,相位累加寄存器中的值就会溢出,然后从0开始计数。
因为采样时钟的频率为fc,频率控制字为M,则每隔1/fc
,相位累计寄存器中的值就增加M,所以,在1s内,相位累加寄存器中的值增加的大小为(1/(1/fc))*M = fc * M
,又因为寄存器中最大表示的值为2^n-1
,所以可以计算出1s内溢出的次数为fc * M / 2^n
,因为寄存器中的值从0增加到2^n-1,刚好输出一个周期的正弦波信号。所以,寄存器溢出的次数就是输出正弦波的周期数。
1s内输出正弦波的周期数就为DDS输出的正弦波的频率,也就是我们的目标频率 f0 = fc * M / 2^n
。
比如我们上一篇中,fc = 50Mhz,M = 1,n = 8
,所以可以计算出目标频率f0 = 195Mhz
;当M = 2
时,f0 = 390Mhz
;M = 2
刚好是M = 1
时目标频率的2倍,
当已知目标频率,求频率控制字M时,M = f0 * 2^n / fc
。
下一篇将介绍DDS发生器的verilog实现
DDS发生器的频率控制字原理和基本结构(二)相关推荐
- 浅谈DDS IP核之频率控制字与相位控制字
1.概述 本文是用于记录vivado中DDS IP核输出任意频率,与任意相位的关键点,即频率控制字与相位控制字的设置. 2.参考文档 <pg141-dds-compiler> <基于 ...
- DDS发生器的verilog实现(三)
DDS发生器的verilog实现(三) 前面讲解了正弦波发生器和DDS基础知识,这篇文章主要讲解如何在fpga上实现DDS发生器,同时对上一篇的文章进行补充. 确定频率控制字的DDS发生器 首先对初始 ...
- Socket 套接字原理详解
Socket 套接字原理详解 socket 编程介绍 Socket编程封装了常见的TCP.UDP操作,可以实现非常方便的网络编程. socket() 函数介绍 # socket.socket(fami ...
- Cocos2d-x中图字原理之深入分析
[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地QQ群:249941957 加 ...
- 深入理解Socket套接字原理
Socket套接字原理 1.什么是Socket 在计算机领域,套接字Socket作为计算机之间进行通信的固定的约定方式之一存在.这种太抽象了,我举个例子,我们要是用笔记本电脑前需要先对电脑供电,那供电 ...
- Taro多端开发实现原理与项目实战(二)
Taro多端开发实现原理与项目实战(二) 多端电商平台项目概述及开发准备 学习了前面的基础知识和进阶后是否跃跃欲试?我们准备了一个电商平台的项目来和大家一起实践使用 Taro 开发电商平台. 项目概述 ...
- ASP.NET页面与IIS底层交互和工作原理详解 (二)
第三回: 引言 Http 请求处理流程 和 Http Handler 介绍 这两篇文章里,我们首先了解了Http请求在服务器端的处理流程,随后我们知道Http请求最终会由实现了IHttpHandler ...
- 3.1.9 OS之二级页表的原理和地址结构
文章目录 0.思维导图 1.为什么引入二级页表? 2.二级页表的原理和地址结构 3.如何实现二级页表的地址变换? 4.几个小细节 0.思维导图 1.为什么引入二级页表? 因为单级页表存在一些问题,所以 ...
- 数据库原理—数据库基础(二)
数据库原理-数据库基础(二) 一.数据和信息 (一).信息 信息是客观存在的,是关于现实世界事物的存在方式或运动状态反映的综合 信息与材料和能源一个层次,是人类社会赖以生存和发展的三大资源之一 (二) ...
最新文章
- PanoNet3D:一种3D目标检测方法
- linux 扩展zhu分区,Linux分区调整(LVM和非LVM环境中扩容和缩小)
- 原始dao和Mapper动态代理的开放方式---Mybatis学习笔记(六)
- Android Studio 错误集
- 5G的7大用途,你知道几个?
- python 定义变量_python-003-变量
- How can I force Python's file.write() to use the same newline format in Windows as in Linux (“\r\n”
- 精通Android开发 0
- iOS:xxx referenced from
- cfa三级真题和mock_cfa三级要看哪些书?
- 华为路由器配置NAT
- 单相全桥逆变电路工作过程
- Linux重置root 密码
- 自动化测试工具 Selenium WebDriver 入门教程
- 电子商务网站设计的艺术
- 汇编指令: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL、JNL、JNG、JG、JCXZ、JECXZ、JMP、JMP...
- 微信小程序轮播图(焦点图)-swiper 横向轮播、纵向轮播
- 【愚公系列】2022年09月 微信小程序-WebGL纹理材质的使用
- 深圳住房公积金制度即将施行 非深户也可缴存
- opencv opencv contrib
热门文章
- 用python整个活(4)——哥德巴赫猜想
- 【组合逻辑电路】如何从真值表中求解逻辑函数?
- wps office 2010 Wps文字文档保存及自动保存方法介绍
- 4G无线遥控器RC遥控器方案【免费开源】DIY
- 中年人学C语言Windows程序设计,9 窗口绘图:直线的画法
- 【算法思考】三维视觉常见问题
- 苹果系统tft选哪个服务器不卡,tft和ips选哪个 tft和ips区别介绍【图文】
- toad for oracle如何执行sql文件,toad执行sql语句
- CCF-GAIR 2020 源创专场 | 免费领取学术票
- 服务器系统部署方案,服务器 部署方案