FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(二)

news2024/11/25 13:23:25

     通过上面的介绍相信大家对数字变频已经有了一个较为整体性的认识,下面笔者来对照XILINX的DDS IP核对数字变频技术展开更进一步的说明,做到了理论和实践很好地结合,这样大家再带入Modelsim进行仿真测试就不仅掌握了数字变频的理论知识,也明白了其IP核的使用方法。

       查阅XILINX的DDS IP核官方手册pg141-dds-compiler,如图1所示是DDS IP核的简化图,大家可以看到这里和前面数字变频理论基础介绍大同小异,XILINX的DDS IP核内部由累加器、寄存器、查找表等组成。

图1 DDS IP核的简化图

      如图2所示是DDS IP核的频率控制字计算说明,这里XILINX也举实例说明频率控制字的计算方法,接着再归纳推导出一般性公式,大家可以看到例子当中fclk是120Mhz的 时钟频率即FPGA内部时钟,相位位宽Bθ(n)是10即正弦查找表是2的10次方,Δθ是十进制的12即每个时钟周期累加器在做12的递增操作。

      整个操作合起来看就是FPGA内部以120Mhz的时钟频率,对一个累加器进行每个周期12的自加操作,同时每个周期再把累加器值映射到一张2的10次方正弦查找表中,取出表中的对应数值送到外部DAC中,外部DAC再通过硬件上的运放调理,输出给定幅值的特定频率正弦波,那么问题来了即经过这样一番操作后,输出正弦波的频率到底是多少赫兹呢?这里XILINX官方手册也给出了计算结果:fout=fclk*Δθ/2^Bθ(n)即fout=120*10^6*12/2^10=1.406250Mhz,当然对一般应用场景来说都是已知FPGA内部时钟频率fclk、DDS期望输出频率fout以及正弦查找表的位宽去求频率控制字Δθ,所以变换整理公式即可以得到:Δθ= fout*2^Bθ(n)/ fclk。

图2 DDS IP核的频率控制字计算说明

      搞明白DDS IP核频率控制字的计算方法,相信细心的同学在思考过后肯定会抱有一些疑惑其中最典型的应该就是fclk是FPGA内部时钟频率这点好理解,fout是DDS期望输出频率也同样直观易懂,但是公式中的Bθ(n)正弦查找表位宽要怎么去选定呢,这个值的选取有没有什么特定的含义呢?

      其实笔者刚接触到DDS IP核的时候在看完XILINX官方手册给出的频率控制字计算公式后同样抱有这样的困惑,当时也在网络上搜索了很多博客资料等,但遗憾的是很少看到真正有价值的文章,如图3所示是Bθ(n)正弦查找表位宽选取的计算说明,这个值的选取将会直接影响到DDS IP核输出的频率分辨率。

      如下图所示,这里XILINX官方手册同样也人性化地举了一个例子进行说明,对于fclk为100Mhz的时钟频率系统,要想得到最小输出精度为1hz的正弦波波形,则要对应的正弦查找表是2的27次方位宽,可以看到XILINX官方给出的计算公式是fclk/Δf的比值再以2为底数向下取对数,在这里猛地一看感觉非常绕脑,但是仔细分析就不难发现其中的含义:对于给定fclk的时钟频率系统,每个时钟周期都会进行频率控制字的自加操作,显然在这里累加值至少为1,那么当累加器为1时则对应了系统的最小分辨率即fclk/2^Bθ(n),这个值代表了DDS IP核可以设定的最小频率精度。

图3 DDS IP核的频率分辨率的计算说明

      在结合XILINX的DDS IP核手册对数字变频参数进行说明后,我们再来看一看IP核的具体设置和各个信号量所代表的含义,以方便后续对其进行仿真测试,搞明白整个IP核的行为特征,细心的同学不难发现在XILINX的VIVADO环境下支持旗下所有7系列的芯片,而相比于ISE环境,大部分XILINX的官方IP核都支持AXI总线协议,AXI总线协议引入了握手机制等,当然在这里篇幅原因笔者就不展开叙述了,感兴趣的同学可以查阅XILINX的官方手册。

       如图4所示是DDS IP核CONFIG输入通道的数据格式,顾名思义地用户通过这个输入通道就可以初始化DDS IP核,以输出给定频率和相位的正弦波波形,可以看到XILINX的官方手册对DDS IP核的组包格式进行了详细说明,同时注意到s_axis_config_tdata信号在s_axis_config_tvalid信号为高时有效,且s_axis_config_tdata信号是由PINC和POFF两者共同拼接而成的。

      这里XILINX官方也举例进行说明方便用户理解,如下图所示当相位phase位宽是11位时即相位累加器总位宽是11位,则相位控制字POFF和频率控制字PINC位宽都是11位,那么对于总位宽是32的s_axis_config_tdata的0-10位是PINC的输入值,16-26位是POFF的输入值。

      频率控制字PINC即每个fclk时钟周期内DDS IP核内部自加值,相位控制字POFF即在相位累加器中频率控制字自加的基础上再增加的一个固定值,这样即可实现改变频率相位的效果,当然具体的细节会笔者会在后面仿真DDS IP核中做进一步说明。

图4 DDS IP核CONFIG输入通道的数据格式

      如下图5所示是DDS IP核DATA输出通道的数据格式,在IP核中默认选择Sine和Cosine都输出的情况下,m_axis_data_tdata也是由SINE和COSINE共同组成,在这里XILINX官方手册同样举例做了说明,对于总位宽是32的m_axis_data_tdata的0-10位是COSINE的输出值,16-26位是SINE的输出值。

      如图6所示是DDS IP核复位信号的说明,大家可以清楚地看到XILINX的DDS IP核支持了两种接口方式,一种是不含TREADY握手信号的而另一种是含TREADY握手信号的,官方手册中指出aresetn信号默认为高当其为低时则表示对DDS IP核的复位,同时该信号作为复位信号时需要至少2个时钟周期持续为低才生效。

      注意到m_axis_data_tvalid在复位起效果后会被拉低若干个时钟周期,而当其作为输出信号重新再被DDS IP核置高后,此时m_axis_data_tdata输出数据才是用户所期望的正弦波波形数据,对照XILINX的官方手册简单地总结几点也为后续仿真DDS IP核提供依据:

  1. s_axis_config_tdata信号在s_axis_config_tvalid信号为高时有效,且s_axis_config_tdata信号是由PINC和POFF两者共同拼接而成的;
  2. m_axis_data_tdata信号在m_axis_data_tvalid信号为高时有效,且m_axis_data_tvalid信号在默认SINE和COSINE输出状态下也是由Sine和Cosine两者共同拼接而成的;
  3. aresetn信号低时则表示对DDS IP核的复位至少拉低2个时钟周期DDS IP核才可实现内部复位,复位完成后波形输出信号m_axis_data_tdata在m_axis_data_tvalid为高时有效,相似的相位输出信号m_axis_phase_tdata在m_axis_phase_tvalid为高时有效;

 图5 DDS IP核DATA输出通道的数据格式

图6 DDS IP核复位信号的说明

        最后想补充说明一点如图7所示是DDS IP核对SFDR无杂散动态范围的说明,其实说真这个名词也很少听过,但在XILINX的DDS IP核初始化中需要去单独配置,所以至少我们需要搞清楚这个值的设定取决哪些因素,XILINX官方手册同样很贴心地给出了计算公式,即DDS IP核的最终输出位宽在None and Dithering模式下是SFDR/6的向下去余,在Taylor模式下是SFDR/6的向下去余后再加1,再去结合原理图我们选取的DAC芯片型号是AD9708,其对应的位宽是8位,所以在None and Dithering和Auto模式下我们需要配置SFDR的值是48,当然感兴趣的同学可以再对照手册理解下SFDR的具体含义。

图7 DDS IP核对SFDR无杂散动态范围的说明

       通过以上对数字变频理论分析和对XILINX的DDS IP核手册信息提取为后期的程序设计提供了有力支撑,下面笔者就通过配置和仿真IP核等具体操作,带着大家实际观察波形去验证前面的知识点,大家打开Vivado在IP核的搜索栏中输入关键字DDS,如图8所示选中DDS IP核即可,如图9到11所示是该IP核的具体配置,笔者在这里不想再像写说明书一样每个选项都逐一赘述列举,具体的细节完全可以去查阅XILINX的DDS IP核官方手册pg141-dds-compiler。

       对于DDS IP核的配置说明几点核心问题,首先我们选择了0.5Mhz作为fclk即系统时钟,然后把分辨率设置为高精度的0.01hz,根据上面的公式大家可以计算得出需要累加器位宽是26(500000/2^26=0.00745<0.01),其次在SFDR中选择48对应了硬件上AD9708的8位输出位宽,再次把PINC和POFF都设置为支持用户设定和DDS IP核输出Sine和Cosine模式,最后选择自动分配延迟周期节约IP核底层硬件资源,并引出aresetn复位信号。

图8 Vivado的搜索栏中搜索DDS IP核

图9 DDS IP核的Configuration界面

图10 DDS IP核的Implementation界面

图11 DDS IP核的Detailed Implementation界面

       在配置完DDS IP核,我们就要开始写对应的Testbench带入Modelsim进行仿真验证帮助朋友们进一步理解整个IP核的行为特征,在写激励之前不妨问自己几个问题即想验证哪些功能。

       在这个例程中我们希望用DDS IP核输出可设定频率和偏移的正弦波,那么对于fclk是0.5Mhz,正弦波形查找表位宽Bθ(n)是26位且最小分辨率是0.01hz,DDS正弦波输出位宽为8位的情况下,fout正弦波输出频率即为fout=fclk*Δθ/2^Bθ(n)=500000*Δθ/2^26。

      显然在这里输出正弦波频率fout是已知的,而频率控制字Δθ是未知的,那么对fout是1hz时,Δθ=fout*2^Bθ(n)/fclk=1*2^26/500000=134.217728,2hz时Δθ=134.217728*2=268.435456,即通俗易懂的Δθ=134*fout,这也非常好理解当PINC频率控制字Δθ越大,那么遍历完整个正弦波形查找表的速度也就越快,反应出来的直观结果就是频率越来越大其周期越来越小。

        同时我们也想在这个Testbench中验证DDS IP核的相位控制字和复位功能,那么我们还需要计算出POFF相位控制字的值,通过前面的分析可知fclk是0.5Mhz,正弦波形查找表位宽Bθ(n)是26位,那么按照数学上对于正弦波的定义,一个完整的正弦波周期是360deg折合成一张总地址是2^26的查找表,相对应的偏移90deg则POFF相位控制字是2^25,偏移180deg则POFF相位控制字是2^26,所以激励中我们可以设计每次在拉低aresetn两个周期后,通过拉高s_axis_config_tvalid信号再向s_axis_config_tdata写入POFF和PINC,观察m_axis_data_tvalid和m_axis_data_tdata、m_axis_phase_tvalid和m_axis_phase_tdata是否符合我们的设计预期。

       也需要注意到一点细节在DDS IP核的极性配置中我们没有勾选负半轴的Sine和Cosine,所以在这里需要简单地做一下波形拼接成一个完全周期的正弦波,具体细节大家可以参考如图12所示的DDS IP核的输入信号激励设计。

  图12 DDS IP核的输入信号激励设计

       大家带入到Modelsim里仿真即可观察到如图13所示DDS IP核的仿真结果,注意到在Testbench激励中,我们开始第一次输入的s_axis_config_tdata值是64'd134即对应为1hz频率的正弦波;而第二次输入的s_axis_config_tdata值是{6'd0,1'd1,25'd0,32'd1340}即对应为10hz频率偏移180deg的正弦波;第三次输入的s_axis_config_tdata值是{6'd0,2'd1,24'd0}即对应为10hz频率偏移90deg的正弦波,每次在拉低aresetn两个时钟周期后,再对应地拉高s_axis_config_tvalid,通过s_axis_config_tdata信号写入PINC和POFF的值,大家可以带入Modelsim中观察其仿真结果完全符合预期设计。

图13 DDS IP核的仿真结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/403399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】网络原理

本篇博客让我们一起来了解一下网络的基本原理 1.网络发展背景 关于网络发展的历史背景这种东西就不多bb了&#xff0c;网上很容易就能找到参考资料&#xff0c;我的专业性欠缺&#xff0c;文章参考意义也不大。这里只做简单说明。 网络发展经过了如下几个模式 独立模式&…

创建线程的三种方法

文章目录1、创建一个类实现Runnable接口&#xff0c;并重写run方法。2、创建一个类继承Thread类&#xff0c;并重写run方法。3、实现Callable接口&#xff0c;重写call()方法&#xff0c;这种方式可以通过FutureTask获取任务执行的返回值。4、run()方法和start()方法有什么区别…

14 Day:同步锁与操作系统输入输出

前言&#xff1a;在上一期的线程章节中&#xff0c;我们的线程输出貌似有大问题&#xff0c;今天我们便要来学习同步锁来解决这个问题&#xff0c;同时再次基础上拿下键盘输入&#xff0c;实现操作系统的输入和输出。从今天开始我们的操作系统不在是一块“看板”了&#xff01;…

Python|数学|贪心|数组|动态规划|单选记录:实现保留3位有效数字(四舍六入五成双规则)|用Python来创造一个提示用户输入数字的乘法表|最小路径和

1、实现保留3位有效数字&#xff08;四舍六入五成双规则&#xff09;&#xff08;数学&#xff0c;算法&#xff09; 贡献者&#xff1a;weixin_45782673 输入&#xff1a;1234 输出&#xff1a;1234 12 12.0 4 4.00 0.2 0.200 0.32 0.320 1.3 1.30 1.235 1.24 1.245 1.24 1.…

Docker 入门建议收藏 第一部分

一、Docker 是什么&#xff1f; Docker&#xff0c;翻译过来就是码头工人 Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化。容器完全使用沙盒…

JVM概览:内存空间与数据存储

核心的五个部分虚拟机栈&#xff1a;局部变量中基础类型数据、对象的引用存储的位置&#xff0c;线程独立的。堆&#xff1a;大量运行时对象都在这个区域存储&#xff0c;线程共享的。方法区&#xff1a;存储运行时代码、类变量、常量池、构造器等信息&#xff0c;线程共享。程…

ClassMix: Segmentation-Based Data Augmentation for Semi-Supervised Learning学习笔记

ClassMix相关介绍主要思想方法Mean-Teacher损失函数交叉熵损失标签污染实验实验反思参考资料相关介绍 从DAFormer溯源到这篇文章&#xff0c;ClassMix主要是集合了伪标签和一致性正则化&#xff0c;思想来源于CutMix那条研究路线&#xff0c;但是优化了CutMix中的标签污染的情…

使用 HTML5 轻松验证表单插件

下载:https://download.csdn.net/download/mo3408/87559594 效果图: 当您通过表单从人们那里收集信息时,必须应用某种验证。如果不这样做,可能会导致客户流失、数据库中的垃圾数据甚至网站的安全漏洞。从历史上看,构建表单验证一直很痛苦。在服务器端,全栈框架会为您处理…

【AI绘图学习笔记】深度前馈网络(一)

有关深度前馈网络的部分知识&#xff0c;我们已经在吴恩达的机器学习课程中有过了解了&#xff0c;本章主要是对《深度学习》花书中第六章&#xff1a;深度前馈网络的总结笔记。我希望你在看到这一章的时候&#xff0c;能回忆起机器学习课程中的一些环节或者细节&#xff0c;这…

【现代机器人学】学习笔记十一:抓握与操作

本章是比较独特的一章&#xff0c;相对于前面的内容&#xff0c;内容较为独立&#xff0c;主要描述的是力学相关的一些理论。因此&#xff0c;读者也完全不必根据题目产生一些不必要的幻想&#xff0c;认为似乎看完这章我就可以学会机器人抓取。不过&#xff0c;我仍然认为这章…

新入职的项目经理,如何击破权力微薄的困境?

“从此找到了上班的意义”这个话题最近登上了热搜&#xff0c;在“铜三铁四”的招聘季&#xff0c;大家停止了内卷&#xff0c;给自己安排得明明白白&#xff0c;每天上班的动力就是&#xff1a;充电、蹭网、干饭、灌水、睡午觉、上厕所。但咱项目经理们却没办法Get这些动力&am…

【UEFI基础】HOB介绍

综述 HOB的全称是Hand-Off Block&#xff0c;从名字上也可以看出来&#xff0c;它表示的是一种用于交接的数据。按照HOB的使用情况&#xff0c;可以将BIOS的启动阶段分为两个部分&#xff1a; HOB生成阶段&#xff08;HOB producer phase&#xff09;&#xff0c;用来创建和修…

PMP项目管理项目质量管理

目录1 项目质量管理概述2 规划质量管理3 管理质量4 控制质量1 项目质量管理概述 项目质量管理包括把组织的质量政策应用于规则、管理、控制项目和产品质量要求&#xff0c;以满足相关方目标的各个过程。项目质量管理还将以组织的名义支持过程的持续改进活动。 核心概念 质量是…

Elasticsearch:集群管理

在今天的文章中&#xff0c;我们应该学习如何管理我们的集群。 备份和分片分配是我们应该能够执行的基本任务。 分片分配过滤 Elasticsearch 将索引配到一个或多个分片中&#xff0c;我们可以将这些分片保存在特定的集群节点中。 例如&#xff0c;假设你有多个数据集群节点&am…

感应电机数学模型(电机控制应用基础系列)

电机在工业控制中的地位不言而喻&#xff0c;所以对电机模型的了解是我们理解各种算法的基础。这篇博客帮大家整理总结。张力控制离不开电机控制&#xff0c;有关张力控制的详细内容请参看下面的文章链接&#xff1a; PLC张力控制&#xff08;开环闭环算法分析&#xff09;_张…

字符函数和字符串函数详解(1)

目录前言strlen函数strlensizeofstrcpy函数strcat函数strcmp函数总结前言 最近要调整状态&#xff0c;写的文章质量不佳让大家失望&#xff0c;我现在也在反思我在做什么&#xff0c;我会什么&#xff0c;我学了什么。等我想明白的那天&#xff0c;我一定能跟大家顶峰相见的&a…

身份推理桌游

目录 sha人游戏&#xff08;天黑请闭眼&#xff09; &#xff08;1&#xff09;入门版 &#xff08;2&#xff09;标准版 &#xff08;3&#xff09;延伸版——百度百科 待更新 &#xff08;4&#xff09;延伸版——推理学院 待更新 狼人杀 1&#xff0c;基本玩法 2&am…

Android 12.0 Launcher3 app图标长按去掉应用信息按钮

1.前言 在12.0的rom定制化开发中,在Launcher3定制化开发中,对Launcher3的定制化功能中,在Launcher3的app列表页会在长按时,弹出微件和应用信息两个按钮,点击对应的按钮跳转到相关的功能页面, 现在由于产品需求要求禁用应用信息,不让进入到应用信息页面所以要去掉应用信息…

QT入门基础(一)

文章目录零.Qt背景1.什么是Qt2.Qt的发展史3.Qt的优势4.Qt应用一.第一个Qt程序0.项目创建1.main函数文件2.类头文件3.pro文件4.qt命名规范二.Qt按钮1.按钮创建和父子关系2.按钮常用api3.Qt窗口坐标体系4.对象树模型零.Qt背景 1.什么是Qt Qt是一个跨平台的C图形用户界面应用程序…

快速排序/快速选择算法

一.快速排序 1.基本介绍 快速排序&#xff08;Quicksort〉是对冒泡排序的一种改进,都属于交换排序。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分(每次选择中轴值)&#xff0c;中轴值左边的元素小于中轴值,中轴值右边的元素全部大于中轴值(但不要求有序)&#x…