前言
DDS(Direct Digital Synthesis,直接数字综合器)是一种正弦波发生器,在Quartus中它被称为NCO(Numerically Controlled Oscillator,数控振荡器),两者是对同一功能IP核的不同称呼。
因篇幅关系,此IP解析分为两篇文章:
-
Xilinx IP解析之DDS Compiler v6.0(1)—— 基础概念
主要说明DDS的一些基础概念,只有了解清楚基础概念,才能理解IP的运行原理和各个输入输出信号的含义,以便在使用此IP时心中有数。
-
Xilinx IP解析之DDS Compiler v6.0(2)—— IP信号接口、配置与仿真
主要说明IP各个信号的含义,如何配置IP,最后仿真试验了IP的基础功能。
此为第一篇。
一. IP 概述 与 产品手册
IP官网页面:DDS Compiler (xilinx.com)
IP产品手册:pg141-dds-compiler
二. IP基础概念
2.1 正弦波相关概念
DDS的原理并不复杂,但其中涉及一些正弦波的基础概念的理解。下面对这些概念进行梳理。
一个通用的正弦波函数如下所示:
f
(
t
)
=
sin
(
θ
)
=
sin
(
ω
⋅
t
+
φ
)
=
sin
(
2
π
f
⋅
t
+
φ
)
f\left( t \right) =\sin \left( \theta \right) =\sin \left( \omega \cdot t+\varphi \right) =\sin \left( 2\pi f\cdot t+\varphi \right)
f(t)=sin(θ)=sin(ω⋅t+φ)=sin(2πf⋅t+φ)
其中,
θ \theta θ为正弦波相位,单位为rad,有 θ = ω ⋅ t + φ 0 \theta =\omega \cdot t+\varphi _0 θ=ω⋅t+φ0。要注意, sin ( θ ) \sin \left( \theta \right) sin(θ)是周期为2π的周期函数,因此通常说的相位取值范围为[0, 2π),注意这是左闭右开区间,sin(0)=sin(2π)。
ω \omega ω为角频率,单位为rad/s,它表示相位变化的快慢。 ω = 2 π f \omega =2\pi f ω=2πf,f为正弦波频率,单位为Hz。
φ \varphi φ为初始相位,即t=0时的相位。
注:余弦波与正弦波仅相差π/2的相位,两者的波形性质是完全一样的,所以本博文在描述时没有说正弦或余弦,也不说类正弦,只说正弦波。
2.2 IP配置选项与正弦波概念的关联
DDS IP有三种配置:
2.2.1 SIN_COS_LUT_only
SIN_COS_LUT_only,仅正余弦查找表,IP只有查找表功能,此时需要输入相位,IP输出对应的正余弦值。
输入相位是一个二进制数,用
B
(
θ
)
B\left( \theta \right)
B(θ)表示,此时实际正弦波相位
θ
\theta
θ与
B
(
θ
)
B\left( \theta \right)
B(θ)满足以下关系:
θ
=
B
(
θ
)
2
N
2
π
\theta =\frac{B\left( \theta \right)}{2^N}2\pi
θ=2NB(θ)2π
其中,N为输入相位位宽,此IP允许的N的范围为3 ~ 16,N决定了相位分辨率,有:
相位分辨率
=
2
π
2
N
\text{相位分辨率}=\frac{2\pi}{2^N}
相位分辨率=2N2π
用
B
(
sin
(
θ
)
)
B\left( \sin \left( \theta \right) \right)
B(sin(θ))表示正弦波瞬时值的二进制表示,有:
sin
(
θ
)
=
B
(
sin
(
θ
)
)
2
M
\sin \left( \theta \right) =\frac{B\left( \sin \left( \theta \right) \right)}{2^M}
sin(θ)=2MB(sin(θ))
其中,M为输出正弦值位宽,此IP允许的M的范围为3 ~ 26。M决定了幅值分辨率,有:
幅值分辨率
=
1
2
M
\text{幅值分辨率}=\frac{1}{2^M}
幅值分辨率=2M1
2.2.2 Phase Generator
Phase Generator,相位生成,IP只有生成相位的功能,不涉及相位到正余弦值的转换。
此时IP输入为相位增量和相位偏移,IP根据输入的增量和偏移随时间不停地累加,得到对应的相位输出。此模式下IP仅仅是一个累加器或者称为积分器。
此IP文档中相位增量用PINC(Phase Increment)来表示,它是一个二进制数。这里用符号
Δ
θ
\varDelta \theta
Δθ表示实际正弦波的相位增量,用
B
(
Δ
θ
)
B\left( \varDelta \theta \right)
B(Δθ)表示
Δ
θ
\varDelta \theta
Δθ的二进制表示,有:
P
I
N
C
=
B
(
Δ
θ
)
Δ
θ
=
B
(
Δ
θ
)
2
N
⋅
2
π
,
N
为
B
(
Δ
θ
)
的位宽
PINC=B\left( \varDelta \theta \right) \\ \varDelta \theta =\frac{B\left( \varDelta \theta \right)}{2^N}\cdot 2\pi \text{,}N\text{为}B\left( \varDelta \theta \right) \text{的位宽}
PINC=B(Δθ)Δθ=2NB(Δθ)⋅2π,N为B(Δθ)的位宽
Δ
θ
\varDelta \theta
Δθ与正弦波的角频率
ω
\omega
ω是同量纲的,但两者并不相等, 角频率
ω
\omega
ω表示的是单位时间(1s)内相位的增量,而
Δ
θ
\varDelta \theta
Δθ表示的是单个clk周期(
T
c
l
k
T_{clk}
Tclk)内相位的增量(每个clk周期加一次),有:
ω
=
2
π
f
o
u
t
=
Δ
θ
⋅
f
c
l
k
f
o
u
t
=
Δ
θ
⋅
f
c
l
k
2
π
=
B
(
Δ
θ
)
2
N
⋅
2
π
⋅
f
c
l
k
2
π
=
B
(
Δ
θ
)
2
N
f
c
l
k
输出频率分辨率
Δ
f
o
u
t
=
f
c
l
k
2
N
\omega =2\pi f_{out}=\varDelta \theta \cdot f_{clk} \\ f_{out}=\frac{\varDelta \theta \cdot f_{clk}}{2\pi}=\frac{\frac{B\left( \varDelta \theta \right)}{2^N}\cdot 2\pi \cdot f_{clk}}{2\pi}=\frac{B\left( \varDelta \theta \right)}{2^N}f_{clk} \\ \text{输出频率分辨率}\varDelta f_{out}=\frac{f_{clk}}{2^N}
ω=2πfout=Δθ⋅fclkfout=2πΔθ⋅fclk=2π2NB(Δθ)⋅2π⋅fclk=2NB(Δθ)fclk输出频率分辨率Δfout=2Nfclk
其中,
f
c
l
k
f_{clk}
fclk是IP核的工作时钟频率,
f
o
u
t
f_{out}
fout是输出正弦波相位对应的频率。
此IP文档中相位偏移用POFF(Phase Offset)来表示,它是一个二进制数,这里用符号$\varphi
表示实际正弦波的相位偏移,用
表示实际正弦波的相位偏移,用
表示实际正弦波的相位偏移,用B\left( \varphi \right)
表示
表示
表示\varphi
$的二进制表示,有:
P
O
F
F
=
B
(
φ
)
φ
=
B
(
φ
)
2
N
⋅
2
π
,
N
为
B
(
φ
)
的位宽,与
B
(
Δ
θ
)
位宽总是相等
POFF=B\left( \varphi \right) \\ \varphi =\frac{B\left( \varphi \right)}{2^N}\cdot 2\pi \text{,}N\text{为}B\left( \varphi \right) \text{的位宽,与}B\left( \varDelta \theta \right) \text{位宽总是相等}
POFF=B(φ)φ=2NB(φ)⋅2π,N为B(φ)的位宽,与B(Δθ)位宽总是相等
在使用Phase Generator模式时,如果POFF定义为0或者固定值时,输入就仅为PINC,此时会发现输入相位增量config_tdata的位宽与输出相位phase_tdata的位宽始终是一样的,如下图所示。
这一点可能是令人费解的,至少最开始我就很费解,输出相位是输入相位增量的累加,为什么累加不增加位宽呢?这不会丢失信息吗?为此我进行了详细的数学推导,帮助自己理解为什么这两者位宽一样而不丢失任何信息。为保证行文连贯,详细证明见三. DDS配置中相位累加器为何不增加位宽。
2.2.3 Phase Generator and SIN_COS_LUT
Phase Generator and SIN_COS_LUT,相位生成和正余弦查找表,从名字也可以看出来,相位生成在前,正余弦查找表在后,此模式相当于两者级联。所以,输入是相位增量和相位偏移,输出是累加得到相位后再查表输出。此模式名字太长,可简称为DDS模式。DDS模式的工作原理如下图所示。
前面两个框,第一个是D触发器,第二个是累加器。输入通道的tvalid有效时,D触发器就将输入数据输出给累加器。累加器由一个加法器和一个D触发器组成,实现累加功能。这一级整体就是一个相位生成器。
最后一个框T1,这一级就是一个正余弦查找表。
中间一个框Q1,IP文档中称为量化器,名称很具有误导性,容易让人误以为这是什么模拟量转成数字量需要量化,其实跟量化毫无关系,我认为应称为位宽截断器。它的功能就是将累加器输出相位的低位截掉,只保留高位,使得查找表的输入数据个数与表中数据能做到一一对应。
相位截断是必须的,举例说明。前文已经说明,累加器的输出位宽等于输入相位增量位宽,最大取值48,那么它能表示的数的范围为[0, 248),对应相位[0, 2π),这时如果累加出来直接去查表的话,那么表中就需要248个数据才能每个相位有一个对应值,这需要多大的ROM呢?计算一下。
输出位宽取值范围是3 ~ 26,这里假设为8,那么一个数据就对应一个字节B。有:
1
T
B
=
2
10
G
B
=
2
20
M
B
=
2
30
B
2
48
B
=
2
18
T
B
1TB=2^{10}GB=2^{20}MB=2^{30}B \\ 2^{48}B=2^{18}TB
1TB=210GB=220MB=230B248B=218TB
显然,FPGA无法负担这么大的查找表,所以截断是必须的。注意:
频率分辨率
=
1
2
N
,
N
为输入相位增量位宽
查找表的深度或者称为大小
T
a
b
l
e
_
D
e
p
t
h
=
2
Q
Q
为截断后保留的高位位宽
幅值分辨率
=
1
2
M
,
M
为输出正余弦值的位宽
\text{频率分辨率}=\frac{1}{2^N}\text{,}N\text{为输入相位增量位宽} \\ \text{查找表的深度或者称为大小}Table\_Depth\,\,=\,\,2^Q \\ Q\text{为截断后保留的高位位宽} \\ \text{幅值分辨率}=\frac{1}{2^M}\text{,}M\text{为输出正余弦值的位宽}
频率分辨率=2N1,N为输入相位增量位宽查找表的深度或者称为大小Table_Depth=2QQ为截断后保留的高位位宽幅值分辨率=2M1,M为输出正余弦值的位宽
此时自然又想到几个问题,我们分别分析:
- 既然累加器输出要被截断,那么输入的低位还有意义吗?
当然有意义,输入低位会因为累加进位从而影响高位的值,从而输入低位的影响在经过Q1截断后被保留了下来。
- 频率分辨率为什么由输入位宽决定,而不是用保留的高位位宽来算?
输入低位影响了相位累加的结果,所以用输入位宽来算频率分辨率。
[!NOTE]
好吧,这里我也不是很理解,但算频率分辨率确实是用输入位宽来算。
理解更深刻的同学可以评论或私信告知!
- Q取多大?
首先Q的取值,需要考虑使用的存储器资源数,从SIN_COS_LUT_only模式中,我们发现输入位宽范围是3 ~ 16,此时输入相位和查找表中的数据是一一对应的,所以Q得取值范围同样是3 ~ 16,对应查找表的深度为 8 ~ 65536。
也就是说当输入位宽≤16时,相位无需截断,查找表深度足够。当输入位宽>16时,相位就需要截断了。
下图直观的表示了DDS模式的工作过程:
红色部分为标准正弦曲线,蓝色部分是查找表所表示的正弦曲线,它只能取有限个值,相位被均分为2Q等分,根据截断后的相位得到横坐标值,由此得到的纵坐标值就是输出正弦值了。
2.3 利用正弦波的对称性缩短查找表
正弦波的对称性可以描述为:
对
θ
∈
[
0
,
π
2
)
,有:
sin
θ
=
sin
(
π
2
−
θ
)
=
−
sin
(
π
+
θ
)
=
−
sin
(
2
π
−
θ
)
\text{对}\theta \in \left[ 0,\left. \frac{\pi}{2} \right) \right. \text{,有:} \\ \sin \theta =\sin \left( \frac{\pi}{2}-\theta \right) =-\sin \left( \pi +\theta \right) =-\sin \left( 2\pi -\theta \right)
对θ∈[0,2π),有:sinθ=sin(2π−θ)=−sin(π+θ)=−sin(2π−θ)
此IP文档中此特性被称为正弦波的1/4对称性,利用此特性,查找表可以只存储1/4个正弦波形的数据点,通过变换相位的方式就能映射到整个[0, 2π)周期了。
当然变换相位也需要消耗一定资源,所以,对于输入相位点数较少的情况,查找表则会存储1/2个波形的数据点,此时变换相位的资源消耗更少一点,总体资源消耗更少。
IP核会自行决定如何实现全周期的查找表,用户了解原理即可。
2.4 标准模式与栅格模式
根据前面的描述,IP的输入有三种类型,相位、相位增量、相位偏移,此IP对这三种输入类型的二进制编码方式给出了两种模式。
-
标准模式(Standard)
此时需要定义输入位宽,假设位宽为N,则用**[0, 2N)表示[0, 2π)。N的取值范围是[3, 16]**。
-
栅格模式(Rasterized)
此时需要定义模数(Modulus)大小,假设模数M,则用**[0, M)表示[0, 2π)**。
M的取值范围是**[9, 16384]**,因为最大值的限制,当使用栅格模式时,无需相位截断,因为此时查找表的深度可以支持每个相位都有对应的正弦值。
栅格模式提供了对相位更灵活的划分方式,标准模式对2π的划分必须是2N,而栅格模式可以是9、10、11、388、12111这种,只要在M的取值范围内即可。
栅格模式什么时候用呢?当你需要对相位进行不规则划分的时候。
栅格模式确定M之后,输入位宽也固定了,此时要注意不要输入超过M-1的无效数据。举个例子:
M = 12,M-1 = 11为输入的最大值,输入位宽为4,那么输入可以表示的数的范围是[0, 15],而12、13、 14、15是超过M-1的,对栅格模式输入来说是无效的,会被忽略。
如果无效输入是相位增量或偏移(对应IP为相位生成功能和DDS功能),那么IP会使用最近一次的有效输入继续产生相位和正弦值;如果无效输入是相位(对应IP为仅查找表功能),那么IP就无法找到对应的正弦值输出,IP输出会堵塞,即没有输出(tdata_valid为低)。
栅格模式相关计算公式:
相位输入时:
θ
=
B
(
θ
)
M
2
π
⇒
B
(
θ
)
=
θ
2
π
M
相位增量输入时:
f
o
u
t
=
Δ
θ
M
f
c
l
k
⇒
Δ
θ
=
f
o
u
t
f
c
l
k
M
\text{相位输入时:}\theta =\frac{B\left( \theta \right)}{M}2\pi \Rightarrow B\left( \theta \right) =\frac{\theta}{2\pi}M \\ \text{相位增量输入时:}f_{\mathrm{out}}=\frac{\Delta \theta}{M}f_{clk}\Rightarrow \Delta \theta =\frac{f_{\mathrm{out}}}{f_{clk}}M
相位输入时:θ=MB(θ)2π⇒B(θ)=2πθM相位增量输入时:fout=MΔθfclk⇒Δθ=fclkfoutM
三. DDS配置中相位累加器为何不增加位宽
令 Δ θ ( n ) \varDelta \theta \left( n \right) Δθ(n)表示第n个输入相位增量, B ( Δ θ ( n ) ) B\left( \varDelta \theta \left( n \right) \right) B(Δθ(n))为其二进制表示,位宽为N。
θ ( n ) \theta \left( n \right) θ(n)为前n个输入累加得到的输出相位, B ( θ ( n ) ) B\left( \theta \left( n \right) \right) B(θ(n))为其二进制表示,位宽也为N。
引入一个额外的变量,累加器的实际值
θ
∞
(
n
)
\theta _{\infty}\left( n \right)
θ∞(n),它具有无限位宽,
B
(
θ
∞
(
n
)
)
B\left( \theta {\infty}\left( n \right) \right)
B(θ∞(n))为其二进制表示。有:
B
(
θ
∞
(
n
)
)
=
B
(
Δ
θ
(
1
)
)
+
B
(
Δ
θ
(
2
)
)
+
.
.
.
+
B
(
Δ
θ
(
n
)
)
=
∑
i
=
1
n
B
(
Δ
θ
(
i
)
)
显然
B
(
θ
(
n
)
)
=
B
(
θ
∞
(
n
)
)
[
N
−
1
:
0
]
,表示取
B
(
θ
∞
(
n
)
)
的低
N
位
B\left( \theta _{\infty}\left( n \right) \right) =B\left( \varDelta \theta \left( 1 \right) \right) +B\left( \varDelta \theta \left( 2 \right) \right) +...+B\left( \varDelta \theta \left( n \right) \right) =\sum_{i=1}^n{B\left( \varDelta \theta \left( i \right) \right)} \\ \text{显然}B\left( \theta \left( n \right) \right) =B\left( \theta _{\infty}\left( n \right) \right) \left[ N-1:0 \right] \text{,表示取}B\left( \theta _{\infty}\left( n \right) \right) \text{的低}N\text{位}
B(θ∞(n))=B(Δθ(1))+B(Δθ(2))+...+B(Δθ(n))=i=1∑nB(Δθ(i))显然B(θ(n))=B(θ∞(n))[N−1:0],表示取B(θ∞(n))的低N位
如果累加器的进位值为1,有:
数字上
B
(
θ
∞
(
n
)
)
=
{
1
,
B
(
θ
(
n
)
)
}
,数值上
B
(
θ
∞
(
n
)
)
=
2
N
+
B
(
θ
(
n
)
)
\text{数字上}B\left( \theta _{\infty}\left( n \right) \right) =\left\{ 1, B\left( \theta \left( n \right) \right) \right\} \text{,数值上}B\left( \theta _{\infty}\left( n \right) \right) =2^N+B\left( \theta \left( n \right) \right)
数字上B(θ∞(n))={1,B(θ(n))},数值上B(θ∞(n))=2N+B(θ(n))
如果累加器的进位值为2,有:
数字上
B
(
θ
∞
(
n
)
)
=
{
10
,
B
(
θ
(
n
)
)
}
,数值上
B
(
θ
∞
(
n
)
)
=
2
N
+
1
+
B
(
θ
(
n
)
)
\text{数字上}B\left( \theta _{\infty}\left( n \right) \right) =\left\{ 10, B\left( \theta \left( n \right) \right) \right\} \text{,数值上}B\left( \theta _{\infty}\left( n \right) \right) =2^{N+1}+B\left( \theta \left( n \right) \right)
数字上B(θ∞(n))={10,B(θ(n))},数值上B(θ∞(n))=2N+1+B(θ(n))
更普遍的,如果累加器的进位值k,k为自然数,
B
(
k
)
B\left( k \right)
B(k)为其二进制表示,有:
数字上
B
(
θ
∞
(
n
)
)
=
{
B
(
k
)
,
B
(
θ
(
n
)
)
}
,数值上
B
(
θ
∞
(
n
)
)
=
2
N
+
k
+
B
(
θ
(
n
)
)
\text{数字上}B\left( \theta _{\infty}\left( n \right) \right) =\left\{ B\left( k \right) , B\left( \theta \left( n \right) \right) \right\} \text{,数值上}B\left( \theta _{\infty}\left( n \right) \right) =2^{N+k}+B\left( \theta \left( n \right) \right)
数字上B(θ∞(n))={B(k),B(θ(n))},数值上B(θ∞(n))=2N+k+B(θ(n))
这里需要用到一个隐含的条件,输入相位增量或输出相位数值上的[0, 2N)表示的实际相位为[0, 2π),有:
θ
(
n
)
=
B
(
θ
(
n
)
)
2
N
2
π
θ
∞
(
n
)
=
B
(
θ
∞
(
n
)
)
2
N
2
π
=
2
N
+
k
+
B
(
θ
(
n
)
)
2
N
2
π
=
2
k
⋅
2
π
+
θ
(
n
)
\theta \left( n \right) =\frac{B\left( \theta \left( n \right) \right)}{2^N}2\pi \\ \theta _{\infty}\left( n \right) =\frac{B\left( \theta _{\infty}\left( n \right) \right)}{2^N}2\pi =\frac{2^{N+k}+B\left( \theta \left( n \right) \right)}{2^N}2\pi =2^k\cdot 2\pi +\theta \left( n \right)
θ(n)=2NB(θ(n))2πθ∞(n)=2NB(θ∞(n))2π=2N2N+k+B(θ(n))2π=2k⋅2π+θ(n)
这时你会发现:
sin
[
θ
∞
(
n
)
]
=
sin
[
2
k
⋅
2
π
+
θ
(
n
)
]
=
sin
(
θ
(
n
)
)
\sin \left[ \theta _{\infty}\left( n \right) \right] =\sin \left[ 2^k\cdot 2\pi +\theta \left( n \right) \right] =\sin \left( \theta \left( n \right) \right)
sin[θ∞(n)]=sin[2k⋅2π+θ(n)]=sin(θ(n))
当数值上的[0, 2N)表示的实际相位为[0, 2π)成立时,
θ
∞
(
n
)
\theta _{\infty}\left( n \right)
θ∞(n)与
θ
(
n
)
\theta \left( n \right)
θ(n)等价,注意不是相等,是等价,两者作为正弦波的相位对应的是同一个值,也就是
B
(
θ
∞
(
n
)
)
B\left( \theta _{\infty}\left( n \right) \right)
B(θ∞(n))与
B
(
θ
(
n
)
)
B\left( \theta \left( n \right) \right)
B(θ(n))等价。
这说明,累加器无需保留进位,用低N位作为输出相位与保留所有进位的实际累加相位等价。
直观的理解是,累加器进位表示的数值总是2N的倍数,而2N对应实际相位2π,对于正弦波来说,舍掉2π,相位不变。
这就证明了当输入相位增量位宽为N时,输出相位的位宽也定为N,结果未丢失任何信息。
那么输入位宽为N,输出位宽为N-1行不行?显然不行,累加器无法缩减位宽,必然造成错误。
另一个可能,输入位宽为N,输出位宽为N+1行不行?这要分两种情况:
-
还是用数值[0, 2N)对应相位[0, 2π),那么输出数值[0, 2N+1)就对应相位[0, 4π),当然这种对应关系在数学上是正确的,但是没有必要,凭白增加输出位宽但没有增加任何有效信息。
-
用数值[0, 2N+1)对应[0, 2π),那么输出数值还是对应[0, 2π),但输入数值为[0, 2N)对应相位[0, π),此时最大输出频率就只能取到fclk/2而取不到fclk了,可以是可以,但这时IP就变得混乱难用了,还是没有必要。
所以,综上所述,Xilinx在设置DDS IP时就保持了输出相位位宽=输入相位增量位宽=输入相位偏移位宽,三者位宽相等,且表示的实际相位为[0, 2π),这种设计就很清晰。
四. 频谱纯度考虑因素(
Spectral Purity Considerations)
DDS的累加、截断和查表其实很简单,如何使用较少资源来抑制杂散才是设计DDS的关键,但对于IP使用者来说,了解即可。
4.1 什么是杂散
信号生成设备在内部器件非线性或者外部干扰的影响下产生了目标频率之外的频率,这些不需要的频率统称为杂散。杂散越多越大则频谱纯度越低,反之,杂散越少越小则频谱纯度越高。
无杂散动态范围(Spurious-Free Dynamic Range,简称SFDR)通常定义为基频信号(通常是感兴趣的纯净信号的最大成分,在通信中称为载波信号)的有效值(RMS)与下一个最大的非谐波杂散信号的有效值之间的比率,计算结果用分贝(dB)表示:
S
F
D
R
d
B
c
=
10
log
10
(
P
c
a
r
r
i
e
r
P
s
p
u
r
i
o
u
s
)
SFDR_{dBc}=10\log _{10}\left( \frac{P_{\mathrm{carrier}}}{P_{\mathrm{spurious}}} \right)
SFDRdBc=10log10(PspuriousPcarrier)
其中,
P
c
a
r
r
i
e
r
P_{\mathrm{carrier}}
Pcarrier为基频信号功率;
P
s
p
u
r
i
o
u
s
P_{\mathrm{spurious}}
Pspurious为最大非谐波杂散信号功率。
SFDR越大,说明杂散越小,频谱纯度越高。
为了得到DDS产生信号的SFDR,可以将输出信号用FFT分析得到输出频谱,进而得到基频功率与最大非谐波杂散功率,从而得到SFDR的值。如下图所示就是FFT得到的以基频为0dB的输出频谱。这里的SFDR为48dB。
4.2 DDS为什么会产生杂散
各种论文中,DDS的杂散来源于三个方面:1.相位截断误差;2.幅值量化误差;3.DAC非理想性误差。
在这里,不涉及DAC,所以,FPGA中的DDS杂散来源于前两个误差。
4.2.1 相位截断误差
一般 DDS 具有很高的分辨率,这就要求其相位累加器的位数 N 取值都比较大、比如 32、48。但是 ROM 表的存储量过大会引起很多问题,因此一般截取相位累加器输出的 N 位中的高 A 位作为 ROM 表寻址地址,而B = N - A 位舍弃,这样就引入了所谓的相位截断误差。
2.2.3节中已经说明,此IP中B最大值为16,即ROM寻址位宽最大为16。
4.2.2 幅值量化误差
对正弦信号一个周期内进行 2N 次采样后,得到的幅度序列后,必须进行有限位的量化才能作为 ROM 表的存储数据,因为 ROM 表的存储字长是有限。所以,这就造成了所谓的幅度量化误差,这是 DDS 的第二个主要杂散来源,由于量化位数 L 一般取 12、14 位,所以量化噪声的功率还是比较小的,通常量化噪声被称为背景噪声。
4.3 标准模式和栅格模式的杂散
标准模式当输入相位位宽较大(超过16)时,存在两个杂散来源,相位截断误差与幅值量化误差。
栅格模式不存在相位截断,所以总是只有幅值量化误差,此模式下,SFDR = 输出位宽 × 6。
4.4 如何减小杂散
减小杂散即增大SFDR,可以从杂散的两个来源上入手,1.减小相位截断误差;2.减小幅值量化误差
减小幅值量化误差很简单,增大量化位宽即可,一般来说,量化位宽每增大1,SFDR增大6dB。
减小相位截断误差,此IP使用了以下两种方法:
4.4.1 相位抖动DDS(Phase Dithered DDS)
相位抖动的基本概念是将误差频谱分散分布到整个频谱范围内,使杂散的尖峰减低。类似于降低EMI中的随机PWM技术。
IP手册中说明,相位抖动DDS能使SFDR增大12dB。
4.4.2 泰勒级数矫正DDS(Taylor Series Corrected DDS)
相位抖动DDS以及相位截断DDS都包含一个量化器Q1,它的作用是通过丢弃高精度相位的分数部分来降低输出的精度。进行这一量化步骤的原因是为了保持查找表内存大小在一个合理的范围内。这里的权衡在于信号的频谱纯度。随着FPGA中DSP切片的可用,现在可以实际利用之前被丢弃的小数部分位来计算修正值,并将这些修正值添加到查找表的值中,以产生非常高的SFDR输出。
泰勒级数矫正能用较少的资源实现较大的SFDR提升。
4.5 本章参考
对杂散产生与抑制的数学原理感兴趣的同学可以参考以下两篇文章,其中有较详细的数学推导。
[1]黄仙兵.基于FPGA的低杂散DDS的技术研究[D].电子科技大学,2010.
[2]吴昆伦.低杂散DDS的FPGA设计研究[D].电子科技大学,2018.
五. 总结与分享
DDS即是一个正弦波发生器,其核心在于精确控制正弦波的相位和频率,同时通过合理设计保持输出的频谱纯度。
通过本文,用户应能熟悉DDS中的几个关键问题:
-
DDS实现原理,输入相位直接查表,或是输入角频率,累加后得到相位再查表。
-
为什么需要相位截断?资源限制,查找表深度有限,无法做到累加器输出一个相位就查一个值,所以需要截断,只取高位。
-
什么是频率分辨率?输入最小能表示的频率,即输入二进制1‘b1表示的频率。
-
什么是幅值分辨率?输出最小能表示的幅值,即输出二进制1‘b1表示的幅值。
-
可利用正弦波的1/4对称性减小查找表。
-
什么是栅格模式?将2π划分为M等份,输入1表示2π/M,输入最大为M-1,0 ~ M-1表示一个2π周期,超出此范围,输入无效。M最大取值16384,查找表深度可覆盖此值,故栅格模式无需相位截断。
-
为什么相位累加器输出位宽等于输入相位增量的位宽?因为IP规定了2N代表2π,累加器进位都是2π的整数倍,故累加输出相位省掉若干个2π,等效相位不变。
-
什么是杂散?输出波形中目标频率外的波形成分就是杂散,SFDR(无杂散动态范围)表示杂散大小。
-
相位截断误差和幅值量化误差是杂散的两个来源。
幅值量化误差无可避免,仅能通过增加输出量化位宽改善,但此误差通常不是杂散的主要来源。
相位截断误差可通过相位抖动与泰勒级数矫正改善,抖动能抑制尖峰,但会增加背景噪声,效果大约增加12dB的SFDR;泰勒级数矫正是用截断去掉的低位去计算正弦偏差,再加到查表的结果上,效果更好,可增加20dB以上的SFDR;
分享,本文的参考资料、IP参数计算书与IP仿真工程(Vivado 2023.2)。
(此IP解析的两篇博客分享相同,各位同学获取一次即可)
欢迎大家关注我的公众号:徐晓康的博客,回复以下四位数字获取。
7412
建议复制过去不会码错字!
徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识,软件,工具等内容,欢迎大家关注。