DDS(直接数字频率合成器)在信号源、测量和通信中有着非常广泛的应用,也是硬件设计方法学最喜欢用来演示的例子。
浮点设计
使用MBD(基于模型设计)方法来设计DDS是非常简单的,从模型库中拽出三个模型:一个加法器,一个延时单元,一个Matlab的自定义函数,连接好连线。
编辑Matlab自定义函数为计算正弦值
设置一个频率输入值,输出连接到示波器,运行仿真,查看波形正确。
这里体现了MBD方法学的一个价值:Continuous Test and Verification。 在早期就能做仿真验证,尽可能早地发现错误。测试和验证将贯穿设计的全过程,不将错误留到最后阶段才处理。越是早期的错误越到后期就越难定位解决。
在做定点设计之前,先将DDS创建为子系统(Sub System),这样顶层就是DDS的仿真验证平台,子系统是DDS设计,做到层次分明。
定点设计
首先是输入信号的定点化,这里使用了输入端口模型,它除了定点化处理功能外,还为RTL代码生成指明端口名称为FREQ。定点属性设置为’<24,0,u>’,表示总位宽为24比特,整数位宽为0比特,无符号位。定点化处理后面再专题讲解,这里略过。
相位累积的加法器之后使用定点化处理模型,这里的定点属性设置为与FREQ端口相同。上溢出设置为wrap方式,将相位限制在归一化的[0.0,1.0)范围内。
正弦波计算在硬件中用查找表(LUT)来实现,正弦波计算模型的之前和之后各使用一个专门的模型。前置模型只是RTL代码生成的需要,对数据来说是直通的;后置模型会对数据进行定点化处理。
LUT之前使用定点化处理模型,以限定LUT的地址位宽。
最后是输出端口模型,输出端口前放置一个寄存器(单位延迟器),是RTL编码规范的常规要求。
做完定点设计后再做仿真,这时不仅要看输出波形,还需要对DDS输出做频谱分析,评估谐波性能和信噪比性能。方法是用“To Workspace”模型将DDS的输出导入到Matlab的Workspace中,用m语言编程做频谱分析。
DDS的电路规模主要由LUT的容量决定,简单的计算公式是:
Size=(2^ADDR_BW)*DATA_BW
ADDR_BW是地址位宽,直接影响DDS输出的谐波性能; DATA_BW是数据位宽,直接影响DDS输出的噪声基底。电路规模和性能是相互矛盾的,需要妥协和折衷。
可以很容易修改设计中LUT的输入信号的定点属性和输出信号的定点属性,通过仿真获得不同ADDR_BW和DATA_BW设置下的DDS输出频谱性能。
模型设计环境中的调试手段远比RTL仿真调试丰富,更容易分析排查错误:
- 浮点波形显示
- 与Matlab直接连结,可m语言编程做更复杂的分析处理,例如频谱分析
- 可单步仿真,查看每个信号节点上的数值变化
这里展现的MBD方法学价值:Design with Simulation。 设计过程中的仿真,探索各种可能性,找到电路规模与性能的最佳平衡。