本文档主要介绍了基于直接数字合成技术 (DDS) 的高适应性信号生成解决方案 IP 核的结构、参数、接口定义和寄存器配置方法。
如图 1所示,ADDS IP 模块主要由三大板块构成,分别为工作区(主时钟域)、配置寄存器区和仿真验证区,三大板块分处两个不同的时钟域,其时钟可以独立工作。使用 crossClockDomain
来区分跨时钟域信号:
CfgClockDomain
:输入配置域的时钟比主时钟域慢,应该与主时钟域信号生成的高速时钟域分离
axiArea
:逻辑域,用于 AXI-Lite 配置接口SimClockDomain
:为仿真提供独立时钟域,便于调试信号输出,不影响主时钟域模块工作。相位到幅度的转换,可配置分辨率:
def sinTable = for(sampleIndex <- 0 until sampleCount) yield {
val sinValue = Math.sin(2 * Math.PI * sampleIndex / sampleCount);
S((sinValue * ((1 << resolutionBit) / 2 - 1)).toInt, resolutionBit bits);
}
val sinROM = Mem(SInt(resolutionBit bits), initialContent = sinTable);
本模块支持多相位输出通道,实现相位差精确可调的并行信号输出。输出信号经并串转换可以做到采样率翻倍。
系统采用 phaseCh
个独立的相位累加器 phaseWork[i]
,在初始化阶段通过相位梯度算法建立通道间的相位关系:第0通道使用初始相位 phase
,后续通道累加频率控制字 phaseWork[i] = phaseWork[i-1] + dphaseWork[i]
。
运行时各通道同步更新相位 phaseWork[i] += dphaseWork[i] * phaseCh
,并通过共享的正弦ROM查找表 sinROM.readSync(phaseWork[i])
生成对应的正弦波输出。
此设计确保了多通道间相位差的精确控制,同时支持双端口输出(I/Q正交信号),为多天线阵列、相位分集等应用提供了灵活的相位控制能力。
相位频率控制是 ADDS 实现的主要部分,模块采用影子寄存器方案解决配置域与工作域间的跨时钟域同步问题,确保参数更新的可靠性。核心控制逻辑基于状态机架构,针对 TONE、LFM、SFM、FMCW 四种工作模式实施差异化的频率调制策略。
相位频率控制支持以下四种模式,他们的特点如下:
模式 | 初始化操作 | 运行操作 | 重载条件 | 通道间关系 |
---|---|---|---|---|
TONE | 全通道同频 | 频率保持不变 | 配置更改触发 + reload 延迟重载 |
同频不同相位 |
LFM | 线性频率梯度 | 线性增减频率 | 配置更改触发 + 阈值触发 + reload 延迟重载 |
频率线性分布 |
SFM | 全通道同频 | 步进增减频率 | 配置更改触发 + 阈值触发 + reload 延迟重载 |
同步跳频 |
FMCW | 线性频率梯度 | 连续线性调频 | 配置更改触发 + 阈值触发 + 立即重载 | 频率线性分布 |
共同工作原理:
所有模式下,各通道相位更新方法一致:
phaseWork(i) := phaseWork(i) + (dphaseWork(i) * phaseCh).trim((log2Up(phaseCh) + 1) bits)
其中,phaseWork(i)
为第 i 通道的相位值,通过正弦ROM查找表 sinROM.readSync(phaseWork[i])
生成波形输出。
TONE 是单音模式,生成固定频率的正弦波信号:
其中,dphase
是32位的频率控制字,其值来自配置寄存器, 是系统主时钟频率。
工作特点:
dphaseWork
)在所有通道中保持一致ddphaseWork
)置为0,频率不变reload
延迟重载//初始化阶段
when(modeWork === Mode.TONE) {
ddphaseWork := 0;
for(i <- 0 until phaseCh)
{
dphaseWork(i) := dphase;
}
}
//工作阶段
when(modeWork === Mode.TONE) {
ddphaseWork := 0;
for(i <- 0 until phaseCh)
{
dphaseWork(i) := dphase;
}
}
LFM(Linear Frequency Modulation)是一种线性频率调制技术,频率随时间线性变化,广泛应用于脉冲压缩雷达和通信系统。
FMCW (Frequency Modulated Continuous Wave) 是连续工作的线性调频技术,通过频率的周期性变化实现距离和速度测量,是现代雷达的核心技术。
这两种实现方式的区别在于重载方式不同。
这两种模式生成线性调频扫频信号(Chirp 调频信号),在每个扫频周期内频率线性变化:
其中:
扫频频率阈值:
多通道频率分布:
工作特点:
dphaseWork
)从dphase
开始,随时间线性变化。ddphaseWork
)设置为配置寄存器的恒定值 ddphase
,表示频率随时间线性变化。reload
个周期重载//初始化阶段
elsewhen(modeWork === Mode.LFM || modeWork === Mode.FMCW) {
ddphaseWork := ddphase;
dphaseWork(0) := dphase;
for(i <- 1 until phaseCh)
{
dphaseWork(i) := (dphaseWork(i - 1).asSInt + ddphaseWork).asUInt;
}
}
//工作阶段
elsewhen(modeWork === Mode.LFM || modeWork === Mode.FMCW) {
ddphaseWork := ddphase;
for(i <- 0 until phaseCh) {
dphaseWork(i) := (dphaseWork(i).asSInt + (ddphaseWork * phaseCh)).asUInt;
}
// 阈值监控
when((!ddphase.sign && dphaseWork(phaseCh - 1) > threshold) ||
(ddphase.sign && dphaseWork(phaseCh - 1) < threshold)) {
triggerReload := True;
}
}
SFM(Stepped Frequency Modulation)是离散步进式频率调制,按固定间隔进行频率跳变,每个步进周期内频率恒定。
生成按周期步进跳变的信号:
其中:
步进控制机制:
stephold
个时钟周期cntStep === stephold
时,执行频率跳变cntStep
控制每个频率步进的保持时间步进频率阈值:
工作特点:
reload
个周期后重新开始步进序列// 初始化阶段
elsewhen(modeWork === Mode.SFM) {
ddphaseWork := ddphase;
for(i <- 0 until phaseCh)
{
dphaseWork(i) := dphase;
}
}
// 运行阶段
elsewhen(modeWork === Mode.SFM) {
when(cntStep < stephold) {
cntStep.increment();
} elsewhen(cntStep === stephold) {
cntStep.increment();
for(i <- 0 until phaseCh)
{
dphaseWork(i) := (dphaseWork(i).asSInt + ddphaseWork + (ddphaseWork * S(i).resize(log2Up(phaseCh) + 1)).trim((log2Up(phaseCh) + 1) bits)).asUInt;
}
} otherwise {
for(i <- 0 until phaseCh)
{
dphaseWork(i) := (dphaseWork(i).asSInt + (ddphaseWork * S(phaseCh - i -1).resize(log2Up(phaseCh) + 1)).trim((log2Up(phaseCh) + 1) bits)).asUInt;
}
cntStep.clear();
}
ddphaseWork := ddphase;
when((!ddphase.sign && dphaseWork(phaseCh - 1) > threshold) ||
(ddphase.sign && dphaseWork(phaseCh - 1) < threshold)) {
triggerReload := True;
}
}
使用 Adds.scala
生成 HDL 代码时可以配置的参数:
名称 | 类型 | 描述 |
---|---|---|
phaseCh | Int | 多相位通道数 |
portBit | Int | 输出信号位长度 |
resolutionBit | Int | 分辨率位长度 |
sampleBit | Int | 采样位长度,例:sampleBit=10,点数为1024 |
dualport | Boolean | 是否开启双端口 IQ 信号输出 |
simulation | Boolean | 是否开启仿真 |
名称 | 方向 | 类型 | 描述 |
---|---|---|---|
AddsOut | master | Axi4Stream | 自适应合成信号的 I 路输出 |
AddsOutQ | master | Axi4Stream | 自适应合成信号的 Q 路输出 |
Cfg | slave | AxiLite4 | 自适应信号合成器配置 |
Sim | out | Bits (portBit) | 自适应合成信号 I 路输出,仿真专用 |
SimQ | out | Bits (portBit) | 自适应合成信号 Q 路输出,仿真专用 |
寄存器名称 | 地址 | 偏移位 | 数据类型 | 功能描述 |
---|---|---|---|---|
resetSoftCfg | 0x00 | 0 | Bool | 控制软复位,置位时清零所有配置寄存器 |
enSoftCfg | 0x00 | 1 | Bool | 控制模块使能,置位时进入工作状态(初始化或运行) |
modeWorkCfg | 0x00 | [9:8] | Enum | 工作模式:0 = TONE 单音;1 = LFM 线性调频; 2 = SFM 步进调频;3 = FMCW 频率调制连续波 |
phaseCfg | 0x04 | [31:0] | UInt(32) | 相位控制字,公式:(相位角度/360°) |
dphaseCfg | 0x08 | [31:0] | UInt(32) | 频率控制字,公式:dphase = (目标频率/系统时钟频率) \times 2^ |
ddphaseCfg | 0x0C | [31:0] | SInt(32) | 频率变化率控制字,小于零频率下降,大于零频率增加, 公式:ddphase = (频率变化率/系统时钟频率) \times 2^ |
reloadCfg | 0x10 | [31:0] | UInt(32) | 重载延迟周期数,公式:延迟时间(s) 系统时钟频率(Hz) |
thresholdCfg | 0x14 | [31:0] | UInt(32) | LFM/FMCW 模式频率扫描阈值, 公式:(阈值频率/系统时钟频率) $× 2³² $ |
stepholdCfg | 0x18 | [31:0] | UInt(32) | SFM 模式步进保持周期, 公式:保持时间(s) 系统时钟频率(Hz) |