学会System Generator(15)三种数控振荡器设计方法

本文介绍了在FPGA中利用SystemGenerator实现数字控制振荡器(NCO)的方法,包括基于IIR滤波器、DDS原理及DDSCompiler IP核三种方案,并进行了仿真验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是该系列的第15篇。数字控制振荡器(NCO)是FPGA中常用的一个模块,在《FPGA数字信号处理系列》第一篇就对其做了相关介绍。System Generator中的block大致可以分为两类:高层次封装(面向系统级,如第2篇设计中用到的Digital FIR Filter)和低层次封装(面向底层,与FPGA资源的联系更直接)。

本文将采用IIR滤波器、DDS、DDS Compile IP核3种设计原理在System Generator中实现NCO。前两种采样低层次封装block,后一种采用高层次封装block,体会其中的差别。


基于IIR滤波器的NCO实现

1.搭建模型

使用一个二阶IIR滤波器对单位脉冲信号滤波,只要保证系统的极点位于S域的单位圆上,即可得到正弦波输出。在Simulink中添加block按下图连接:
这里写图片描述
ulse Generator输出单位脉冲信号,采用延迟器(Delay)、乘法器(Mult)、加法器(AddSub)和存储IIR系数的Constant模块(分子为1,分母为b=1.75)。

2.原理分析

使用信号与系统理论知识简单分析上述系统:
这里写图片描述
本设计采样100MHz系统采样率,b取1.75,代入上式计算可得IIR滤波器输出的正弦波频率为8.0431MHz。在采样率确定的情况下,改变系数b即可改变输出振荡信号的频率。

3.仿真验证

在运行前要确保两点:

  • 数据格式选择合理;IIR为反馈系统,要根据输入信号的幅度(此处设置为1)设置加法器、乘法器输出数据的格式,否则会超出System Generator可以表示的范围(定点数最大只能是4096Bits)。
  • Latency设置正确;Latency表示流水线的级数,也表示数据会经过多少个采样周期后输出。本设计需要将加法器、乘法器的Latency设置为0,以保证各block之间的计算数据可以同步。

运行仿真,Scope中观察到的信号波形如下:
这里写图片描述
在脉冲信号输入以后,IIR滤波器的输出开始正弦振荡。频谱图如下:
这里写图片描述

谱峰值在8MHz附近,验证结果正确。


基于DDS原理的NCO实现

1.搭建模型

DDS原理是使用相位累加器器+查找表,完成信号相位到幅度的转换。在《FPGA综合系统设计系列》第4篇中讨论了其原理及列出了相关参考文献。在Simulink中添加block按下图连接:
这里写图片描述
Constant模块从外部输入频率控制字,地址位宽8Bits,相位累加器由一个加法器(AddSub)和寄存器(Register)构成。ROM作为查找表(LUT)存储正弦波波形数据,设置如下:
这里写图片描述
深度Depth为256,与地址位宽相对应;Initial value vector中存储一个周期的正弦波数据,即相当于把2π的相位平分为256份。通过ROM,可以完成从相位到幅度的转换。

2.仿真验证

系统采样率设置为100MHz,频率控制字设置为1(最小频率分辨率)。运行仿真,Scope中观察波形如下:
这里写图片描述
图中1和2两根标签表示了一个信号周期,可以清楚地看到信号相位与幅度之间的关系。


基于DDS Compiler的NCO实现

1.搭建模型

在《FPGA数字信号处理系列》第一篇中介绍了Vivado DDS Compiler IP核的用法,该IP核采样的原理与上一小节相同。上一节中我们搭建了DDS的每一个实现细节,本设计将直接采用高层次封装的block实现NCO功能。添加block按下图连接:
这里写图片描述
data_tready接口赋1,永远保持有效。使用Scope观察DDS Compiler输出的正弦波和余弦波。此外还有一个输出有效信号data_tvalid,在设计中不需要,为其连接一个Terminator,这样在运行时不会因为管脚没有连接而报错。

2.仿真验证

系统采样率设置为100MHz。DDS Compiler的SFDR设置为95dB(对应数据输出位宽为16Bits),频率分辨率0.4Hz。设置输出信号频率为10Mhz。输出信号的频谱即波形如下所示:
这里写图片描述
主要频率成分为10Mhz,验证结果正确。


Simulink仿真技巧

这里列出本文在仿真过程中用到的一些基本设置方法:

  • 旋转/翻转block:从库中添加到Simulink的block图标方向是固定的,如果为了方便连线,对block右键->Rotate&flip,可以调整图标;
  • 查看信号类型:在Simulink的工具栏->Display->Signals&Ports->Port Data Type,选中即可在模型中显示出信号的数据类型。设计如有修改,点击工具栏->Simulation->Update Diagram即可刷新显示;
  • 获取Scope数据:在Scope窗口工具栏中点击最后的小图标“Cursor Measurements”,在波形窗口会出现刻度尺,移动刻度尺观察详细数据信息。该图标的下拉菜单下还包括4中不同的快速测量方法。

不同层次封装block对比

在上面第一个和第二个设计中采用了低层次封装的block,最后一个设计采用了高层次封装,主要区别如下:

  • 高层次封装的block用于设计时可以无需考虑设计细节,只需要从系统级设计的角度出发考虑设计的功能实现。
  • 低层次封装的block与FPGA硬件中的资源联系更紧密,有直接的对应关系,用户在设计时实际上是在考虑调用各种资源组合来实现系统功能。
### MATLAB中实现通用变频器仿真的方法 在MATLAB中进行通用变频器的仿真可以通过Simulink工具箱来构建模型。以下是关于如何使用MATLAB实现通用变频器仿真的详细介绍。 #### 构建PWM逆变器模型 为了模拟实际中的脉宽调制(PWM)逆变器行为,在Simulink环境中可以创建一个简单的PWM逆变器模块。此模块的作用是对输入信号进行调制并生成相应的开关状态输出,从而驱动后续连接的负载设备如电机等[^1]。 ```matlab % 创建一个新的Simulink模型文件 new_system('GenericInverterModel'); open_system('GenericInverterModel'); % 添加必要的组件到模型中 add_block('simulink/Sources/Pulse Generator','GenericInverterModel/PulseGen'); set_param('GenericInverterModel/PulseGen','Period','0.02'); % 设置周期为20ms (50Hz) add_block('simulink/Discrete/Zero-Order Hold','GenericInverterModel/ZOH'); set_param('GenericInverterModel/ZOH','SampleTime','0.0001'); % 设定采样时间为100us add_line('GenericInverterModel', 'PulseGen/1', 'ZOH/1'); save_system; close_system('GenericInverterModel', 0); ``` 以上脚本用于初始化一个基础框架,其中包含了脉冲发生器以及零阶保持(ZOH),这些都构成了基本PWM功能的一部分[^2]。 #### 整合电力电子器件与控制系统逻辑 进一步扩展该模型时,则需加入更多细节比如IGBT或者MOSFET这类半导体开关元件的具体参数设置及其控制策略设计——这通常涉及到复杂算法例如SVPWM(Space Vector Pulse Width Modulation)[^3] 。对于三相交流感应马达而言,还需要考虑采用磁场定向控制(Field-Oriented Control , FOC ) 或者直接转矩控制(Direct Torque Control , DTC )[^2] 来提升性能表现。 另外值得注意的是,在搭建整个系统之前最好先单独测试各个子部分的功能是否正常运作再逐步集成起来形成最终版本。 #### 数字下变频处理单元 如果项目还涉及射频接收端的数据采集分析工作的话那么可能需要用到DDC(digital down converter)即数字降频转换技术。它主要包括数控振荡源(NCO), 混频级还有低通滤波加抽头操作几个阶段共同协作完成任务目标—即将高频载波上的信息搬移到接近直流位置以便于后期数字化存储传输等等用途[^3]。 通过上述介绍可以看出,在MatLab平台上开展针对不同类型应用场景下的变流装置虚拟实验具有高度灵活性同时也非常实用价值高!
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值