社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 精华区
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
搜索
查看: 804|回复: 2

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

[复制链接]

139

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-2-21 11:46:04 | 显示全部楼层 |阅读模式
信号发生器之自定义帧
由前面的实验目的可知,要实现利用串口来控制波形的参数。一般来讲当然可以通过一次发送一个数据来进行控制,但是由于这里需要的数据量太多因而这不是一个很好的解决办法。
在通信行业,存在各种符合一定标准的通信协议,里面会定义数据传输的帧格式以及时许要求。有时候也会有自己定义的一些数据帧格式。
这里采用自定义帧的方式来进行数据传输。其中串口发送数据的格式如表5所示。其中一帧数据为8个字节,整体数据由帧头+地址+数据+帧尾的格式组成。这样就可以实现对固定的寄存器地址写入不同的数据。
图片33.jpg
表5 自定义帧数据格式
不同的寄存器地址对应不同通道的不同的被控制数。系统设计了12个实体寄存器分别存储每个通道的相关控制参数。12个寄存器分为4组,分别对应了4个通道。每组包含3个寄存器,频率控制字寄存器,相位控制字寄存器以及幅度控制字寄存器。具体的各实体控制寄存器地址与对应功能如表6所示。当想控制某个通道的信号参数时,直接写实体寄存器,数据就会立即更新的控制参数到对应通道上
图片34.jpg
表6 实体寄存器地址与功能对应表
现在举例说明如何使用实体寄存器控制对应控制字。
1.使用实体寄存器控制某通道信号频率:
例如:设置通道0的频率为100Hz
地址:0x10
控制字: 图片35.jpg
8590换算成16进制就是0x218E。因此数据段为8E 21 00 00
这样最终发送的指令为: 图片36.jpg
2.使用实体寄存器控制某通道信号相位:
例如:设置通道1的相位为90度
地址:0x15
控制字: 图片37.jpg
1024换算成16进制就是0x400。因此数据段为00 04 00 00
这样最终发送的指令为: 图片38.jpg
3.使用实体寄存器控制某通道信号幅度:
系统设置支持8级信号幅度调节,此8级幅度的信号控制字与满幅的对应关系如下表7所示。
图片39.jpg
表7 控制字与幅度关系
需要注意的是,虽然系统设计支持8级调幅,然而缩减越大,则信号失真越严重,实际有效的缩减建议不超过1/8。
例如:设置通道2的幅度为半幅
地址:0x1a
控制字:01 因此数据段为01 00 00 00
这样最终发送的指令为 图片40.jpg
另外,为了实现同时控制所有通道同时更新,特为以上所有实体寄存器设置了影子寄存器。当需要设置某通道的数据,但并不立即执行时,可使用影子寄存器功能。影子寄存器会预先存储所有的设置数据,但并不立即更新到每个模块,而是在发出更新指令后,系统同时更新所有的通道。在操作时只需要先将要更新的数据逐次写入每个通道需要更新的寄存器中的影子寄存器中,然后发出更新指令,则系统会自动将影子寄存器中的数据同时更到实体寄存器。更新指令由更新寄存器完成,更新寄存器是一个特殊的寄存器,占一个地址,对该地址写任意数据都能执行更新影子寄存器中的数据到对应实体寄存器中。影子寄存器地址、名称与功能对应表如表8所示。
图片41.jpg
表8 影子寄存器名称与功能对应表
更新寄存器以及通道控制地址与功能对应关系,如表9所示
图片42.jpg
表9 更新寄存器以及通道控制地址与功能对应表

在使用影子寄存器更新多个通道多个寄存器的操作顺序如下:
1. 写一个或多个通道中一个或多个影子寄存器的值
2. 发出更新指令
例如,需要设置通道0的频率为100Hz,相位为90度,幅度为满幅、设置通道1的频率为100Hz,相位为180度,幅度为半幅。则可按照如下指令顺序进行发送:
1. AA 03 00 8E 21 00 00 88 (设置通道0的频率为100Hz)
2. AA 03 04 00 04 00 00 88 (设置通道0的相位为90度)
3. AA 03 08 00 00 00 00 88 (设置通道0的幅度为满幅)
4. AA 03 01 8E 21 00 00 88 (设置通道1的频率为100Hz)
5. AA 03 05 00 08 00 00 88 (设置通道1的相位为180度)
6. AA 03 09 01 00 00 00 88 (设置通道1的幅度为半幅)
7. AA 03 0d 00 00 00 00 88 (更新所有影子寄存器中的数据到实体寄存器)
地址0c为控制4个通道的运行和停止的寄存器。该寄存器占4位,每一位对应一个通道的开关。当需要同步某几个通道时,也可使用这个寄存器来实现,实现方式为首先设置这几个通道的寄存器对应的控制位为0,然后重新设置这几个通道的寄存器位为1,即可实现同步。
串口数据帧接收
使用前面定义的数据帧格式,就需要一次发送多个字节的数据,这样就不排除多个字节发送错误或者多发、少发。因此就需要除了判断每一帧中的数据个数以及帧头、帧尾与定义一致以外还需检查每一字节数据间隔,是否间隔太久,如果间隔太久就说明这帧数据结束。
这里新建uart_rx_frameend.v,来进行帧格式判断。其模块接口示意图如图12所示。

图片43.jpg
图12 帧判断模块接口示意图
帧判断模块的接口功能描述如表10所示。
图片44.jpg
表10 帧判断模块接口功能描述
为了实现对一帧数据的判断,首先产生内部参考时钟。这里为了扩展模块的使用范围,增加了mode信号来选择参考时钟是内部产生的1K频率还是其他频率。此处的频率需要根据数据的传输速率进行相对应设置。
图片45-1.jpg
图片45-2.jpg


串口数据标志接收部分,每当接收到一字节的数据后均会产生一个时钟周期的高电平标志信号。此处以cnt_state为标志来定义状态进而使能计数器。每当接收到1字节数据即开始计数,当帧超时则停止计数。
图片46.jpg
计数器使能时每当到来一个参考时钟就将计数器加一。当接收到新的字节数据时或者当达到预设的帧结束判定时间就将计数器清零。且当到达帧结束判定时间时产生一帧数据接收完成标志信号。
图片47.jpg
为了简化测试激励,这里先使用外部时钟进行功能仿真。因此在激励文件中例化待测试文件如下所示。
图片48.jpg
激励文件中除产生正常的系统时钟50MHz以外,还产生了4.5MHz的外部时钟。
图片49.jpg
循环产生接收到的数据标志信号36次,且最后一个个延迟足够长的时间。这里也就是用时钟clk_cnt_base计数20以上即可(大约5000ns)。
图片50-1.jpg
图片50-2.jpg


设置好仿真脚本以后,开始运行,大致在图13-1可以看出Rx_int信号产生正常,且计数使能信号正常,在一次帧数据传输结束后经过一定时间后frameend有一个标志信号。现在放大部分数据,在图13-2查看此时的cnt信号可以看出 19时产生信号,符合预期设计。
图片51.jpg
图13-1 帧判断模块功能仿真波形
图片52.jpg
图13-2 帧判断模块部分波形
串口数据解析
由上面自定义了数据格式,总共为8个8位数据,因此先用移位寄存器把八个数据移入进来。串口数据解析模块接口示意图如图14所示。
图片53.jpg
图14 CMD模块接口示意图
因此其端口名称及功能描述如表11所示。
图片54.jpg
表9 模块接口及功能描述
首先利用移位寄存器将接收到的数据放到一个寄存器中。这里定义了一个清零端,其作用是在一帧数据接收完成后将计数器以及移位寄存器数据清零。
图片55.jpg
对接收到的数据个数进行计数,直到产生清零信号。
图片56.jpg
进行数据接收解析,即把对应位送给对应的控制字。
图片57.jpg
每当frameend变为高电平,即代表一次数据传输结束。注意此处一次数据传输结束,可能是正常的一帧数据,也可能是不正常的数据接收。这样就需要对此次接受的数据进行判断是否为正常的一帧数据。这里定义的正常一帧数据如表5所示,数据个数为8且帧头为’haa、’h03,帧尾分别为’h88。这样判断正确后才认为是正常的数据,这样即可以根据寄存器地址来进行相对应的操作。一次传输结束后就将计数器清零等待下一次传输。
图片58-1.jpg 图片58-2.jpg 图片58-3.jpg
在调用写好的一次数据传输结束模块时,使用内部的1K时钟,且将帧结束判定时间设置为9。这里的时钟速度选择以及判定时间设置需根据不同的情况采用不同的设置。
图片59.jpg
由待测试文件可以看出如果产生帧结束标志信号会至少经过9/1000s,这里激励文件发送一次正常的数据为AA 03 10 8E 21 00 00 88然后延时0.01s,这样0.01s大于0.009s,再发送83 00数据后再延迟0.01s。具体实现如下所示。这里也故意使每一次数据持续时间不同。
图片60-1.jpg
图片60-2.jpg
图片60-3.jpg
图片60-4.jpg


编译无误后设置好仿真脚本,可以看到如图15所示的现象,每当接收一个字节数据时Rx_Int信号均会有一个系统周期的高电平,且数据计数器cnt能够正常的自加及清零。8byte数据接收过程中移位寄存器shift_data工作正常,且当完成后会控制字Fword0操作正常。当一帧数据接收完成后,再次发送一字节数据时cnt又开始重新计数。
图片61.jpg
图15 串口接收即命令解析模块功能仿真波形
如果想看到一次数据发送中data_cnt以及shift_data细节,则可以增加base_clk频率以及修改计数器,可以看到如图16的结果,可以自行分析。这里修改频率的同时也修改了计数器值,从仿真波形中看出同样可以进行帧结束位的判定。
图片62.jpg
图16 模块部分仿真波形
信号发生器顶层设计
综合以上的分析,可以得出其中模块顶层如下图17所示。将内部信号全部定义为wire即可,其接口功能描述如表10所示。
图片63.jpg
图18 顶层模块接口示意图
图片64.jpg
表10 顶层模块接口及功能描述
其输入输出端口定义如下所示。
图片65.jpg
将DA通道全部选通,并进行幅度调制的运算。
图片66.jpg
根据实际使用情况将各个模块例化进来,例化后的顶层应为如图19所示。

图片67.jpg
图19 顶层文件RTL Viewer视图
如有更多问题,欢迎加入芯航线 FPGA 技术支持群交流学习:472607506
小梅哥
芯航线电子工作室
关于学习资料,小梅哥系列所有能够开放的资料和更新(包括视频教程,程序代码,教程文档,工具软件,开发板资料)都会发布在我的云分享。(记得订阅)链接:http://yun.baidu.com/share/home? ... are#category/type=0
赠送芯航线AC6102型开发板配套资料预览版下载链接:链接:http://pan.baidu.com/s/1slW2Ojj 密码:9fn3
赠送SOPC公开课链接和FPGA进阶视频教程。链接:http://pan.baidu.com/s/1bEzaFW 密码:rsyh


此内容由EEWORLD论坛网友芯航线跑堂原创,如需转载或用于商业用途需征得作者同意并注明出处

此帖出自FPGA/CPLD论坛

第十一章_四通道幅频相可调DDS信号发生器.pdf

1.71 MB, 下载次数: 25

评分

1

查看全部评分


回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-2-28 16:22:21 | 显示全部楼层
不错不错,值得大家学习

回复

使用道具 举报

6

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-7-5 14:32:58 | 显示全部楼层
谢谢分享,学习了!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-9-24 11:20 , Processed in 0.260457 second(s), 17 queries , Redis On.

快速回复 返回顶部 返回列表