您好、欢迎来到现金彩票网!
当前位置:秒速牛牛开奖 > 通道命令字 >

【小梅哥FPGA进阶教程】第十一章 四通道幅频相可调DDS信号发生器

发布时间:2019-06-12 00:45 来源:未知 编辑:admin

  实现基于FPGA的多通道可调信号发生器,其中频率、相位以及幅值均可通过PC端串口发送数据对应调节,并可实现4路信号的同步。

  经过前面小梅哥基础课程的学习,相信已经对FPGA的设计有了一定程度的了解,现在提出一个相对综合的工程应用来深入了解FPGA的设计思路以及工程思想等。

  针对以上预期实验现象可以分析出最少需要DDS模块、TLC5620控制模块、串口接收模块以及控制模块。

  DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有相对带宽大,频率转换时间短、分辨率高和相位连续性好等优点。较容易实现频率、相位以及幅度的数控调制,广泛应用于通信领域。

  由图1可以看出,DDS主要由相位累加器、相位调制器、波形数据表以及 D/A 转换器构成。

  其中相位累加器由 N位加法器与N位寄存器构成。每来一个时钟,加法器就将频率控制字与累加寄存器输出的相位数据相加,相加的结果又反馈至累加寄存器的数据输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字相加。这样,相位累加器在时钟作用下,不断对频率控制字进行线性相位累加。即在每一个时钟脉冲输入时,相位累加器便把频率控制字累加一次。

  相位累加器输出的数据就是合成信号的相位。相位累加器的溢出频率,就是 DDS输出的信号频率。用相位累加器输出的数据,作为波形存储器的相位采样地址,这样就可以把存储在波形存储器里的波形采样值经查表找出,完成相位到幅度的转换。波形存储器的输出送到 D/A 转换器,由 D/A 转换器将数字信号转换成模拟信号输出。

  这里相位累加器位数为N位(N的取值范围实际应用中一般为24~32),相当于把正弦信号在相位上的精度定义为N位,所以其分辨率为

  输出频率。且可得出频率分辨率由时钟频率和累加器的位数决定。当参考时钟频率越高,累加器位数越高,输出频率分辨率就越高。

  。其中B为频率字且只能取整数。为了合理控制ROM的容量此处选取ROM查询的地址时,可以采用截断式,即只取32位累加器的高M位。这里相位寄存器输出的位数一般取10~16位。

  频率为50 MHz,相位累加器位数N取32位,频率控制字位数M 取12位。

  新建DDS_Module.v保存至rtl文件夹下。从图3以及表1就得到了端口列表:

  查找表地址生成,此处即为12bit的加法器。这里直接截取32位累加器结果中的高12位作为ROM的查询地址,这样产生的误差会对频谱纯度有影响,但是对波形的精度的影响是可以忽略的。

  现在只需要例化存有波形文件的ROM即可。其中单端口的ROM主要配置数据如图4所示,其初始化文件选为已经生成的正弦mif文件。此处mif位宽为10,深度为4096。

  本模块编译无误后,点击RTL Viewer后可以看到如图5所示的模块逻辑电路图,可与DDS原理图对比。这里有两个选择器的原因是加了使能端的缘故,如果将使能端去掉即可看到如图6所示的电路图

  设置此文件为顶层进行功能仿真。激励文件中除了产生正常的时钟以及模块例化调用,还需使能模块以及设置自加字。此处简化将Fword设置为固定值d5000,。

  编译无误后设置好仿真脚本并进行仿线所示的功能仿真波形文件,可以看出波形数据正常。放大仿真开始位置,可以看出输出DA时钟使能设计也正常。初始值为d511也就是h1ff,与初始化mif文件一致。

  这样一个DDS模块即设计完成,这里可以自行修改Pword的值进行观察波形相位是否发生相应变化。

  在通信行业,存在各种符合一定标准的通信协议,里面会定义数据传输的帧格式以及时许要求。有时候也会有自己定义的一些数据帧格式。

  这里采用自定义帧的方式来进行数据传输。其中串口发送数据的格式如表5所示。其中一帧数据为8个字节,整体数据由帧头+地址+数据+帧尾的格式组成。这样就可以实现对固定的寄存器地址写入不同的数据。

  不同的寄存器地址对应不同通道的不同的被控制数。系统设计了12个实体寄存器分别存储每个通道的相关控制参数。12个寄存器分为4组,分别对应了4个通道。每组包含3个寄存器,频率控制字寄存器,相位控制字寄存器以及幅度控制字寄存器。具体的各实体控制寄存器地址与对应功能如表6所示。当想控制某个通道的信号参数时,直接写实体寄存器,数据就会立即更新的控制参数到对应通道上

  需要注意的是,虽然系统设计支持8级调幅,然而缩减越大,则信号失真越严重,实际有效的缩减建议不超过1/8。

  另外,为了实现同时控制所有通道同时更新,特为以上所有实体寄存器设置了影子寄存器。当需要设置某通道的数据,但并不立即执行时,可使用影子寄存器功能。影子寄存器会预先存储所有的设置数据,但并不立即更新到每个模块,而是在发出更新指令后,系统同时更新所有的通道。在操作时只需要先将要更新的数据逐次写入每个通道需要更新的寄存器中的影子寄存器中,然后发出更新指令,则系统会自动将影子寄存器中的数据同时更到实体寄存器。更新指令由更新寄存器完成,更新寄存器是一个特殊的寄存器,占一个地址,对该地址写任意数据都能执行更新影子寄存器中的数据到对应实体寄存器中。影子寄存器地址、名称与功能对应表如表8所示。

  为了实现对一帧数据的判断,首先产生内部参考时钟。这里为了扩展模块的使用范围,增加了mode信号来选择参考时钟是内部产生的1K频率还是其他频率。此处的频率需要根据数据的传输速率进行相对应设置。

  每当frameend变为高电平,即代表一次数据传输结束。注意此处一次数据传输结束,可能是正常的一帧数据,也可能是不正常的数据接收。这样就需要对此次接受的数据进行判断是否为正常的一帧数据。这里定义的正常一帧数据如表5所示,数据个数为8且帧头为haa、h03,帧尾分别为h88。这样判断正确后才认为是正常的数据,这样即可以根据寄存器地址来进行相对应的操作。一次传输结束后就将计数器清零等待下一次传输。

  由待测试文件可以看出如果产生帧结束标志信号会至少经过9/1000s,这里激励文件发送一次正常的数据为AA 03 10 8E 21 00 00 88然后延时0.01s,这样0.01s大于0.009s,再发送83 00数据后再延迟0.01s。具体实现如下所示。这里也故意使每一次数据持续时间不同。

  编译无误后设置好仿线所示的现象,每当接收一个字节数据时Rx_Int信号均会有一个系统周期的高电平,且数据计数器cnt能够正常的自加及清零。8byte数据接收过程中移位寄存器shift_data工作正常,且当完成后会控制字Fword0操作正常。当一帧数据接收完成后,再次发送一字节数据时cnt又开始重新计数。

  如果想看到一次数据发送中data_cnt以及shift_data细节,则可以增加base_clk频率以及修改计数器,可以看到如图16的结果,可以自行分析。这里修改频率的同时也修改了计数器值,从仿真波形中看出同样可以进行帧结束位的判定。

  关于学习资料,小梅哥系列所有能够开放的资料和更新(包括视频教程,程序代码,教程文档,工具软件,开发板资料)都会发布在我的云分享。(记得订阅)链接:

http://4kci.com/tongdaominglingzi/190.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有