FPGA实战(34):DAC扫频频率控制模块设计与实现
一、引言
在通信测试、雷达信号模拟、频率响应测量等场景中,扫频信号源是不可或缺的仪器。扫频功能要求信号源在指定频率范围内按固定步进和速率连续变化。本文介绍一个用Verilog实现的DAC扫频频率控制模块——dac_sweep_freq,它通过有限状态机(FSM)精确控制频率输出的变化节奏,为DAC提供扫频所需的频率控制字。
二、模块功能概述
dac_sweep_freq模块的核心功能是:在SweepMode使能后,从StartFreq开始,每隔TimeDelay个时钟周期,将当前频率累加一个StepFreq步长,直到达到或超过StopFreq,然后复位到起始频率重新开始扫描。
端口定义如下:
| 端口名 | 方向 | 位宽 | 说明 |
|---|---|---|---|
| clk | input | 1 | 系统时钟 |
| rst_n | input | 1 | 异步复位(低有效) |
| SweepMode | input | 1 | 扫频模式使能 |
| StartFreq | input | 48 | 起始频率 |
| StopFreq | input | 48 | 终止频率 |
| StepFreq | input | 48 | 步进频率 |
| TimeDelay | input | 32 | 延时周期数 |
| DACFreq | output | 48 | 当前输出频率 |
三、设计创新点
3.1 五状态精细控制架构
本模块采用5个状态构成的有限状态机来控制扫频流程:IDLE(空闲)→ LOAD(加载)→ DELY(延时)→ STEP(步进)→ HOLD(保持)。这种精细的状态划分使得频率更新的时序控制非常精确,每个环节的职责清晰,便于后期维护和功能扩展。IDLE态负责复位和初始化,LOAD态根据TimeDelay值决策下一跳转,DELY态执行频率保持延时,STEP态执行频率累加,HOLD态则专门服务TimeDelay=0的特殊场景。
3.2 参数变化的实时响应机制
模块通过两级寄存器(ri_*和ri_*_dly0)实现了输入参数的边沿检测。当用户修改任意参数(起始频率、终止频率、步进或延时),w_change信号会立即置位,状态机将跳回IDLE状态并重新加载新参数。这一机制实现了运行时动态重配置,无需复位模块即可更新扫频策略。
3.3 延时参数的精细控制
TimeDelay参数支持三种不同的行为模式。当TimeDelay=0时,频率锁定在StartFreq,相当于单频输出模式;当TimeDelay=1时,每个时钟周期步进一次,达到硬件极限扫频速度;当TimeDelay≥2时,实际延时为TimeDelay-1个时钟周期。模块内部通过w_TimeDelay = (ri_TimeDelay < 'd2) ? 'd0 : (ri_TimeDelay - 'd2)将用户输入映射为计数器目标值,逻辑清晰且资源开销小。
3.4 参数变化即退出的安全机制
所有状态在跳转条件中都包含了ri_SweepMode == 'd0 || w_change的判断。关闭SweepMode时模块立即退出扫频状态;任何参数变化时模块立即回到IDLE状态重新初始化。这种设计保证了模块在任何异常或配置变更场景下都能快速响应,避免产生错误的频率输出。
四、核心功能点
4.1 可编程扫频参数
模块支持四个核心扫频参数的外部配置:StartFreq(起始频率)、StopFreq(终止频率)、StepFreq(步进频率)、TimeDelay(延时周期)。所有频率参数均为48位宽,可支持极高的频率分辨率。
4.2 自动循环扫频
当频率累加达到或超过StopFreq时,模块自动将ro_DACFreq复位到StartFreq,开始新一轮扫频,实现连续循环输出。
4.3 单次扫频模式
当SweepMode为低电平时,模块保持在IDLE状态,DACFreq固定输出StartFreq,可作为定频信号源使用。
4.4 Xilinx IP核加速累加
模块例化了Xilinx的c_add加法器IP核来
