阅读文档请保持critical thinking,以下列出参考文献以备有疑问时查询出处:本文第二章以斩波稳定放大器的噪声仿真为例,详细解释了每一个pss/pnoise设置选项。参考的文献主要是Cadence SpectreRF的用户文档,以及“Ken Kundert, Simulating Switched-Capacitor Filters with SpectreRF”。第三章从RC采样电路出发解释了噪声频谱的基本原理。主要参考了离散信号分析的教科书以及“BorIs Murmann, NoIse Analysis in Switched-Capacitor Circuits”
Understanding SDM的作者在“Design-Oriented Estimation of Thermal Noise in Switched-Capacitor Circuits”利用Z变换和symbolic solve工具Maple分析了积分器的噪声,其计算结果与仿真结果一致。受此鼓舞,我曾试图列出系统的完整差分方程,利用Z变换去计算噪声在复杂斩波稳定放大器的输出噪声但尚未成功。本文也或多或少有一些利用数学工具进行分析的内容。
离散噪声的仿真方法同样可以用于比较器噪声分析,Cadence在“Keeping Things Quiet: A New Methodology for Dynamic Comparator Noise Analysis”文档中对比了transient noise与pnoise的仿真结果与效率。更多的应用可能还是需要先从Cadence SpectreRF的用户文档出发,所用到的基础知识主要是复变函数、离散信号分析,以及RF中的幅频调制。
一个斩波稳定放大器可以简化为下图1所示模型。
图1斩波放大器与仿真环境
图2 等效噪声源模型
(1)利用普通的Noise分析VOP/VON节点,放大器的输出噪声见图3:
图3斩波放大器noise仿真结果
我们可以很轻易的列出Laplace变换形式下的OTA的冲击响应:
噪声源,如果仅考虑电阻的热噪声,则有:
接着计算噪声传递到输出,首先反馈会影响整体的传递函数,其次需要注意的是,噪声是以功率的方式的进行计算的:
通过KCL列方程求解时,通常会假设一个,我们可能已经忘记了这里的其实是复频域下的形式,真正的输入信号的时域表达式为:
所以我们求出的是冲击响应,求冲击响应的好处在于,一个信号经过一个系统时,时域上为卷积,频域表现为乘积,乘积比卷积的计算要容易的多。
其实这些都不重要,重要的是,我们在分析连续时间系统时,总是利用Laplace变换去得到复频域下的形式。我们需要知道从复频域变换到频域的转换关系,以及复频域到时域的变换方法,幅值以及平方如何计算,总结如下:
图1的电路是周期稳态的,我简单的理解是,周期稳态电路的所有节点都在呈现周期变化,一个周期之后,电路所有节点的电压都与此前一个周期保持一致。如果一个电路工作存在这样的稳定周期,那就可以用PSS来仿真。
相比Transient仿真后再作FFT分析频谱,PSS仿真速度很快,也可以直接得出你关心的频域特性参数。缺点是复杂的电路有时很难收敛,难以让所有节点都呈现周期变化。原因可能是电路中有积分信号,信号在积分就意味着信号在持续累积,节点电压就不会维持周期变化。(如果令积分器的积分结果为零或者呈现周期变化,积分器同样可以用PSS仿真。)D触发器的分频电路同样可能导致PSS不收敛,分频意味着与周期加倍(人为地将PSS Fundamental Frequency减半后也能进行仿真)。不幸的是,我们的电路总会存在电容和非线性,这就意味着我们的实际电路总会或多或少表现出“累积”的效果,而且这个“累积”的增加/减少在非线性的作用下,变得不那么周期,让PSS难以收敛。
PSS的设置如图4所示,红线框出的是我们会用到的设置选项:
图4 pss设置界面
(1)Beat Frequency/Period
Beat Frequency/Period就是电路的稳态周期。注意这个一定要满足所有节点都呈现周期变化。设置中最好勾选Auto Calculate,它是通过所有信号源(如vdc,vsine,vsource)周期的最小公倍数确定的,但是它不会计算分频电路导致的周期加倍。
(2)Number of Harmonics
N次谐波直观的含义是,如果我们设置Fundamental Frequency=1MHz,Number of Harmonics=5,那通过PSS绘制的频谱图,只会存在1MHz/2MHz/3MHz/4MHz/5MH这5个点(line type = points)。
进一步的解释前,先简单回忆下三角级数。通过从三角级数到傅里叶级数的推导,我们可以明白为什么一个信号经过傅里叶变换后有正有负,为什么幅值是偶对称而相位是中心对称,傅里叶变换后的频率分量与正弦波到底是什么关系。
Frequency:,即
Ampliture:
Phase:e^
现在接着解释Number of Harmonics。我们遇到的信号总能由频率为 的正弦信号叠加出来,一个 的信号经过线性系统时,虽然这个信号的幅值和相位上会有改变,但是其输出信号只会存在 的成分。但是如果这个系统有非线性的特性,那输出信号的频率就不仅仅只有了 ,还会产生其它频率成分。在傅里叶的这套分析框架下,会产生无穷多个与 成整数倍的频率成分,设置的Fundamental Frequency正是这个 ,而Number of Harmonics正是级数表达式中求和符号上限 。幸运的是,我们并不需要分析无穷多阶的谐波,因为我们的电路总有RC响应,高阶的谐波会被有限的带宽抑制,不会体现到输出响应上,因此电路的带宽是设置这个Number of Harmonics很好的参考标准。
(3)Accuracy Default
和transient中的误差设置一样,Transient Aided Options中,建议将Run transient?设置为Decide automatically,这样仿真器会先运行transient仿真,寻找达到稳态周期的时刻。比如Switched-Capacitor总有复位,电路正常工作前是需要先复位的,之后才能进入稳态周期。这里的tstab正是这个值,设置为Decide automatically后,可能仿真器会>20?个Fundamental period去寻找这个稳态周期,如果提前找到会自动退出,如果找不到,会在log里有显示,此时再去人为地增加tstab的时间(通常如果Decide automatically下没收敛,那大概率是Fundamental Frequency设置错了)。
(4)Engine
请选择Shooting。Shooting是基于时域的仿真方法,Harmonic Balance(HB)是基于频域的仿真方法,如果设置妥当,两者得出的结果应该是一致的。Shooting更适合Switched-Capacitor电路的仿真分析。Switched-Capacitor中存在很多的“跳变”,时域上的“窄”意味着频域上的“宽”,基于Fundamental Frequency的HB,你很难确定Number of Harmonics设置为多大,才能在仿真结果中体现出这个“窄”的时域特征。而基于transient的Shooting仿真下,仿真器仿真的时间步长是随着电路状态改变的,陡峭变化时的仿真步长是远小于平稳变化时的仿真步长的(这一点可以通过将transient信号波形的line type改为points观察到)。因此Shooting更适合Switched-Capacitor电路的仿真分析。
图5是PSS Plot出的CK的时域和频率的波形,该电路的工作周期正是chopping周期。方波的频谱是由基频和基频的奇次谐波构成的,频谱的间隔是1MHz,1M正是Fundamental Frequency,频谱分析到100 x 1MHz,100正是Number of Harmonics。
图5斩波放大器PSS仿真结果
当电路成功完成了PSS仿真,就可以用PAC/PNOISE/PSP…继续进行仿真分析了。PSS处理的是大信号,而PAC/PNOISE/PSP…处理的是小信号。因为小信号分析是需要静态工作点的,只不过对于周期电路,静态工作点变成了周期稳态的工作点。
PNOISE的设置如图6所示,以下是我们会用到的设置选项:
(1)Sweeptype
选择default,也就是absolute,选择的范围就是你所要分析的频率范围。比如我们的运放带宽是16M,那[1,100M]的分析范围是OK的。Add Specific Points需要看情况添加,或者改用Linear因为log扫描到高频间距越大。通常我们不选择relative,relative是在输入信号与想要的输出信号不在同一个频段上时用的,relative的设置逻辑是:
(2)Sidebands
强烈建议选择fullspectrum。虽然从Plot看到的噪声的波形上只有[1,100M],但考虑到采样混叠/非线性交调等原因,[1,100M]范围内的噪声不仅仅是噪声源的[1,100M]直接传递过来的,还有从噪声源与系统的N阶谐波混频(mixing)后混叠(aliasing)到[1,100M]范围内来的。
如果设置default,需要填写Maximum sideband,比如20,那仿真器只会计算到噪声源与系统响应的20阶谐波调制导致的混叠。但是如果使用fullspectrum,你可以不用填写Maximum sideband(当然你也可以填写),此时仿真器会计算它所有能计算到的谐波混叠噪声。至于能计算到多少,与PSS的仿真步长相关,步长的倒数就是频率,这个频率甚至超过了PSS的最高阶谐波,因为在Shooting仿真模式下,仿真步长是会随电路状态调整的,让其始终能够跟踪电路的“陡峭”变化。除了精确这个优点外,仿真速度也快。缺点是不能使用“noise contribution”的分析?
图6 pnoise设置界面
(3)Output
Output同样选择voltage,因为我们分析的电路通常只考虑电压传输,不是特别考虑下一级电路的输入阻抗(电阻),因为我们是CMOS电路,输入阻抗只有电容,电阻是无穷大的,不太需要考虑功率损失/阻抗匹配的问题,如果所作电路需要考虑这些问题,那输出端应该选择port(有电阻)。
(4)NoiseFigure
如果勾选NoiseFigure,需要设置Input Source=voltage,这样可以计算input referred noise。通常我们不选Input Source=port,这里的port通常是带电阻的电压源,是用于计算NF (Noise Figure)的。NF计算噪声时会考虑信号源内阻的热噪声,它适用于功率传输电路的噪声分析,如PA/LNA等。
仿真器在计算input referred noise/NF时,需要输出的噪声除以输入的噪声,或者把输出折算到输入上去。输出的噪声的频率范围由Sweeptype里的Start-Stop确定,在混频器电路中,输出的频率与输入的频率并不相同,需要设置输入参考频率段。最直观的办法是选择Select From Filed,设置完范围和order后,直接从列表里选择输出频段。列表的第一列是上/下边带,第二列是参考输入的频率范围(实际绝对频率),第三列是Index。下面举例说明:
斩波稳定放大器中,sweeptype = absolute,start-stop = 1-100M, Input Source=voltage, reference sidebands=0 (即Index=0, Range=1-100M)。
(5)Noise Type
在选Noise Type之前,需要简单说明一下连续与离散的关系。模拟信号是连续的,出现在电路中的电压电流信号,都是连续信号。Laplace变换是针对连续时间系统的分析方法, Z变换是针对离散时间系统的分析方法。Switched-Capacitor电路两者都涉及到,这里简单梳理一下其中的关系,解释一下什么是trace/sample/hold:
1)开关闭合,在跟踪trace阶段,输出信号是连续的,这个阶段的响应是可以用S变换分析的。
2)开关在断开的瞬间,在采样sample阶段,电容上的信号定格在了闭合一瞬间时的状态,这是采样的过程。闭合一瞬间时的状态的电压值,通常需要通过求S反变换得到(注意这里的*是卷积,计算是基于零状态响应,即电容上的初始电压为零):
例如,当 是DC信号 时,通过上面的表达式就得到了我们熟悉的结论:
但是当输入信号是噪声信号时,我们是难以得到输入信号的 的表达式的,这时需要用到维纳-欣钦Wiener-Khintchine theorem、帕塞瓦尔定理Parseval's theorem。简单说,直接在噪声频谱上积分求和就是功率,开方就是噪声电压的统计均方根。
如果开关是以 的频率重复这一采样动作,采样后得到的离散值可以表示为连续信号乘以狄拉克梳状函数 , 的时域其实就是宽度无限小,高度为1的矩形脉冲序列。
狄拉克梳状函数频域是时域形式上是非常相似
:
时域上的乘积,频域上的卷积,这个卷积正是采样混叠的原由,也是频谱周期的原由。
3)可是电路中的电压,不是离散的点,而是实实在在的连续信号。开关断开后,电压保持hold不变,从离散的点到连续保持的过程,是零阶保持插值,时域卷积,频域乘积。原来的离散采样导致的周期频谱,零阶保持后会失去周期性。
现在回归正题,Noise Type中其实有两大类,一类是timeaverage,一类是jitter(sampled),顾名思义,timeaverage仿真得到的是连续噪声信号的频谱,jitter(sampled)得到的是离散采样噪声的频谱。
我们电路中实际的电压电流信号,即使是采样保持电路,本质都是连续信号,分析其波形时应该用timeaverage进行仿真。SpectreRF在计算叠加时噪声时并不会简单假设所有噪声都是非相关的,叠加时会考虑相关系数的影响,同时考虑非线性导致的谐波失真和谐波调制导致的混叠。
由于AD过程和数字滤波器的存在,我们的应用是有连续到离散的采样过程的,数字滤波器滤波的是离散信号不是连续信号,最终的噪声特性也是离散信号处理的结果。因此,采样导致的混叠噪声不得不考虑,而jitter(sampled)正是用于计算离散噪声的。
(6)timeaverage
选择USB,所谓USB就是上边带的意思。USB/AM/PM/LSB都是基于幅度/频率调制时的考虑,暂时不需要去关注。timeaverage的仿真结果如图(7)所示,热噪声高度不变,1/f噪声恰好被调制到1M、3M、5M…上。原因也很简单,chopping本质是信号与一个方波相乘的过程,时域相乘,频域卷积,方波的频谱正是由基频和基频的奇次谐波构成的,见图5(为了让波形便于说明,pnosie output range实际设置为start-stop=20~100.1M, linear step size=0.1M)。
图7斩波放大器timeaverage pnoise仿真结果( fs=2fchp)
(7)Sampled (jitter)
在Spectre19.1中的PNOISE设置界面如图8所示,使用Spectre19.1的方法是,在Linux用户的根目录下,编辑.bashrc文件,步骤(9)适用于MMSIM151版本的仿真器。
cd ~/
vi .bashrc
# module load cadence/mmsim151
module load cadence/spectre191
1)type=sampled(jitter),Timing Event=Sampled Phase
2)Sample Ratio=2,默认采样频率是Fundamental Frequency,但是这个chop的 1MHz正是Fundamental Frequency,根据奈奎斯特采样定理,无失真还原这个信号至少需要2倍的信号频率,因此采样频率要高于Fundamental Frequency,需要设置Sample Ratio>2。采样频率等于Fundamental Frequency乘以Sample Ratio
3)Measurement填写的是要观察的输出,这里选择voltage,并选择对应的节点。
4)Samples Per Period,这个并不是设置采样频率(采样频率由Sample Ratio设置),而是用于设置不同采样位置的个数的,用来观察在同一采样频率下,不同采样位置的sampled noise表现。如果设置2,那么将会得到2个噪声计算波形。
5)Initial Sampled Phase (Degree),意思是选择第一个点的采样位置(时刻),填写范围是 。我们知道离散信号傅里叶变换(DTFT)中的积分上下限是 ,对应的就是一个完整的周期 。这里要填写的不是 ,而是 。至于这个 其实就是PSS仿真Plot出的时域波形(图5),我们可以通过这个时域波形来确定采样位置。
6)Add Specific Points,通常情况下我们是明确知道采样位置的,所以Samples Per Period填写0,用Add Specific Points确定准确的采样位置,单位是秒,这个位置同样可以用PSS仿真Plot出的时域波形(图5)去确定。
图8 pnoise-sampled(jitter)设置(spectre191)
通过sampled(jitter) plot的频谱如图9所示,我们可以观察到低频噪声由于混叠的作用,从之前的178.4nV/sqrt(Hz)增加到了893.9nV/sqrt(Hz)。同时也观察了“时域离散,频域周期”的特性,通常离散噪声分析到fs/2就足够了。现在,我们通过噪声折叠系数去计算看这个结果是否符合认知:
计算结果与仿真结果几乎相等。如果仿真结果偏小通常是因为sidebands/harmonics设置不合适,而偏大很可能是我们选择的采样位置有误或者是有什么不理解的事情发生了。
图9 斩波放大器sampled pnoise仿真结果( fs=2fchp) (此图有误,峰值应该在1MHz,以2M为周期)
(9)timedomain
在MMSIM15.1中的PNOISE设置界面如图10所示,这里仅对区别的地方予以说明。
1)Noise Type选择timedomain,其实这个timedomain就等同于Timing Event=Sampled Phase。因为jitter的仿真本质也是离散噪声分析,所以spectreRF在后续版本中将其合并了。
2)Number of Points设置的内容与sample per period是一样的,同样这并不代表采样率。
3)Noise Skip Count是另外一种设置Number of Points的逻辑,这个设置不太适合应用在SC电路中。Noise Skip Count的逻辑是,如果设置Noise Skip Count=10,在PSS时域波形(按下Q然后选择line type=points),第一个分析的采样点是0时刻,跳过10个步长点,再分析下一个,以此类推。这个是比较坑的,这个points很多,pnoise仿真会运行total points除以skip count这么多遍。在shooting模式下这个时域(time)的步长是变化的,但是在harmonic balance下这个时域(ifft)的步长是确定的。
4)MMSIM15.1的UI界面中没有sampleratio设置框,因此需要通过option在addtionalParams里写下这个设置,sampleratio=2,或者也可以写其它值。
图10 pnoise-timedomain设置(mmsim151)
“Ken Kundert, Simulating Switched-Capacitor Filters with SpectreRF”,作者Ken Kundert曾是spectreRF的算法开发者之一,他创办的Designer Guide论坛有一些面向IC工程师的易读的仿真应用文档。Ken Kunder的文档形象说明了连续离散的关系,以及混叠与混叠系数的直观理解和计算,本文档上一章中的分析其实或多或少都有原文的影子。本章通过一个特殊的例子引出另外一个问题,分析这个问题可能会对噪声频谱的来源有一些新的理解。
一个RC采样电路如图11所示,RC构成的带宽为15.9KHz,开关的占空比是0.5,采样频率是2MHz。如果认为是2MHz的采样频率去采样一个15.9kHz的带限信号,那这个采样可以无失真的还原原始信号(无混叠)。对比仿真结果,普通的noise仿真结果是噪声40.7nV/sqrt(Hz)、15.9KHz的带宽,但是经过高速率采样后,噪声变成了57.6 nV/sqrt(Hz)、7.95KHz的带宽。
在这种情况下,采样频率远高于信号频率,应该不发生混叠,但是57.6 nV/sqrt(Hz)> 40.7nV/sqrt(Hz)?2MHz 的采样结果似乎并没能够真实的还原这个仅有15.9KHz的信号。
图11 欠采样的RC采样电路
图12静态noise仿真结果(上)与采样pnoise仿真结果(下)
在解释这个矛盾前,我们先看下噪声的频谱是怎么来的。噪声是随机信号,是能量无限功率有限的信号,意味着我们不能在无限长的时间段进行积分变换(FT/DTFT);同时噪声不具备周期性,加窗后进行周期傅里叶变换也是不行的(FS/DTFS)。对噪声的频谱分析,并不是直接对噪声信号进行傅里叶变换,而是对其自相关函数做傅里叶变换。噪声的自相关函数仅在 时存在非零值,这个值正是噪声的统计方差,也就是功率 。这样噪声的时域形式变成了绝对可积的形式,也就可以进行傅里叶变换分析频谱了。
我们计算噪声时总是认为噪声是不相关的,这个非相关意味着不同的噪声源在同一时刻产生的噪声不相关,满足“功率叠加/平方求和”的关系;通过自相关函数仅在 时存在非零值知道,同一噪声源在不同时刻产生的噪声也不相关,满足“功率叠加/平方求和”的关系。噪声的时域表现形式(自相关函数)仅在 处有值意味着时域无限窄,也就解释了热噪声频域无限宽的原因。
这个可以通过matlab做一个简单的定性验证。图13中,利用randn()函数产生方差为9的数列,对这个数列求自相关xcorr()可以看到在0时刻的值为9,在其它时刻为近似为0(毕竟我们不能真正对无限长的随机信号求自相关)。图14中,对仅在0时刻有值的信号做傅里叶变换,得到频谱高度一致(白噪声),且验证了帕塞瓦尔定理Parseval's theorem,即频域积分后就是噪声的功率/方差。毕竟计算机做不了连续傅里叶变换,只能在特定采样频率下作离散傅里叶变换,因此频谱不是无限长。
图13 时域下噪声的真实值与其自相关函数
图14 噪声的自相关函数与频谱
现在回到采样后57.6 nV/sqrt(Hz)> 40.7nV/sqrt(Hz)这个问题上来。噪声的频谱不是其时域的傅里叶变换,而是其时域自相关函数的傅里叶变换。因此我们在计算噪声频谱时,严格推导应该从自相关上来。
Boris Murmann在讲义 “NoIse Analysis in Switched-Capacitor Circuits”中对采样噪声的分析解释这一现象,这里再现这一过程,求解利用Matlab/Mathmatica完成:
(1)噪声信号的频谱是,双边带:
(2)噪声的时域自相关函数是:
(3)系统的传递函数是:
(4)系统的时域冲击响应是:
(5)信号经过一个系统,时域卷积=频域乘积,我们可以先计算乘积,再计算反傅里叶变换
(6)我们的电路(图11),仅在开关闭合时电阻的噪声在向电容传递,而在断开时电容上的电压保持不变,所以时域冲击响应的时间是实际的一半
(7)考虑采样周期为 ,将其离散化,得到
(8)对 作离散傅里叶变化,其实是级数求和的过程
(9)Boris Murmann讲义中给出的结果是和直接离散傅里叶给出的结果差了一个分母上的 ,
其实 求出的功率,为了求功率谱密度需要除以 ,所以有
(10)代入对应的参数,绘制波形(图15),首先观察到了采样导致的重复,也看到了相关导致的低频噪声的增加。这个计算结果与仿真结果是一致的。
图15 RC采样噪声计算分析频谱