目录
1.I2S/PCM 信号间skew约束
2.I2S/PCM的板间latency
3.逻辑设计上的保证
4.音频传输错误检测
I2S/PCM是典型的低速串口,在两个方向上分别有两组信号,我们以soc为视角分为soc-adif和外设audio-codec。
adif输入:sclk_i, ws_i, sdi.【当然并不是三个输入信号同时有效,只有adif RX slave时,三个输入都会有效】
adif输出:sclk_o, ws_o, sdo.【也只有adif TX master时,三个输出才会有效】
怎样保证信号在片间传输时能够正确被采样?这个问题重点就是信号间的同步。I2S/PCM自带帧同步信号,对于I2S来说ws的下降沿就是帧起始;对于PCM来说fs的上升沿就是帧起始。那么如何保证bit同步呢?
首先应该看到在不同的音频传输模式下,adif与codec之间的信号同步的关注点不一样。
- 对于TX master和RX slave这种组合模式,片间同时传输sclk,ws/fs和sdata,理想情况下只要保证三个信号用相同时间达到RX端,那么RX一定可以正确的采样,但由于各自走线的不同,delay各不一样,为了能正确采样就要考虑信号之间的skew;
- 对于TX slave和Rx mst这种组合模式,要保证RX输出的ws/fs sclk到了TX端产生sdo之后,再到RX端用ws/fs sclk能够正确采样TX输出的sdo,就需要确保RX mst输入的sdo数据和ws/fs的偏差在一个T(sclk)之内。所以此种模式不仅关注信号间skew,还要关注信号maxDelay。
然后我们给出一些参数的量级:
- adif和codec的寄存器setup和hold时间都在 几十到几百个ps
- adif和codec的工作时钟都是sclk的十几到上百倍
- sclk(bitclk采样时钟)最大十几MHz,所以sclk的周期在100ns量级 【所有音频采样率及采样深度请见另一文章 TODO】
给出这些参数的量级意义在于指导设置合适的skew和maxDelay,用以最大程度的增加采样可靠性。
另外要实现adif信号的正确传输,除了在物理实现上对skew和maxDelay的约束,我们希望在硬件代码设计的过程中能够提供一些同步逻辑。下面就从这三个方面来展开说明。
设D(sclk) ,D(fs) 和 D(sdo)分别是TX master时 从adif TX到芯片IO的延迟时间,或者Rx slave时从芯片IO到adif RX的延迟时间。
1.I2S/PCM 信号间skew约束
对信号组设置skew约束,skew都约束在5ns以下【见过约束为1ns,3ns的。这个skew阈值主要决定于最大SCLK的周期,和工艺以及IO电压也有关系】,约束包括soc端和codec端。
本节就以数据从adif TX 到芯片IO这一段来分析时序。图1给出了信号间skew较大,导致采样错误的例子:
图 1
NOTE:上图中源端信号中 fs和sdo都是在上升沿改变,且与上升沿的delay很小,这个delay就是寄存器的内部延迟Tco【7nm工艺下在几十ps】,是符合实际情况的。
上图中看出D(sclk), D(fs)和D(sdo) 差别较大,在源端三个信号的关系是 用sclk上升沿采样fs和sdo数据,其中sdo第一个数据‘1’与fs有一拍间隔;而在IO处,用sclk采样fs和sdo时,会发现fs和sdo第一笔数据差了两拍,明显出现了错误,所以尽量约束信号在传输过程中的skew,理想情况下,三根信号skew为0,必然在收端是可以正确采样的。
图2显示了上升沿变换,上升沿采样的情况下 D(fs)< D(sclk) < D(sdo)的情况,而且已经比图1的skew明显小了,但是分析发现 ,虽然三则之间skew不大【只要D(sclk)>D(fs)+Tco】,就出现了fs和sdo第一笔数据差了2各sclk的情况。还是会采样错误。
图 2
所以对于I2S这种需要输出sclk+控制信号+data的接口,通常会有以下的延时要求:
D(sclk) <= D(fs) <= D(sdo)------这种约束的前提就是setup、hold、Tco远小于sclk周期。图3就给出了D(sclk) <= D(fs) <= D(sdo)情况下的时序图,明显看出各信号都在正确的沿被采样。
其他不满足D(sclk) <= D(fs) <= D(sdo)的情况,也很容易出现时序错误,根因在于Tco太小,D(fs)和D(sdo)延迟小了就会被提前采样。
图 3
由上面图1和图3可以观察到另一个现象就是,在上升沿采样时,sclk上升沿到来时,fs和sdo已经稳定了很长时间【Tco时间很小】,而目前工艺下setup时间都在几十ps,我们是不是可以用sclk的下降沿采样信号呢?
答案是肯定的,图4就给出了上升沿改变信号,对端下降沿采样的时序图。可以明显看到采样窗口左右两边都大了很多,无论是setup和hold都能很好的满足。
图 4
图4还可以看出来D(fs) > D(sdo),但任然能够正确的采样数据。此时对D(sclk) <= D(fs) <= D(sdo)的约束要求不是那么强烈,有的设计在这种情况下就没有增加这个约束【但最好加上这个约束,可以使时序分析简单】
需要注意的是:而对于TX slv,直接用adifclk对fs打拍,在和fs取上升后沿这种方式。此时在TX slv看到的delay要满足D(sclk) <= D(fs) <= D(sdo),否则fs会提前一个上升沿,导致出错。
无论是TX slv还是RX slv,满足D(sclk) <= D(fs) <= D(sdo),并满足采样沿和变化沿不同,对于正确传输都是有好处的。
2.I2S/PCM的板间latency
前文已经说了,只有Tx slave和R下 master的组合模式下,才比较关心板间latency,下面就来给出分析。
在TX slave 和Rx master的工作模式下,TX接收Rx输出的ws/fs和sclk信号并进行同步,这个同步的过程需要TX 两个adifclk时间,再加上沿检测只有变化后沿【即翻转后一个adifclk宽度脉冲的信号】又晚了一个adifclk,然后用ws/fs、sclk的变化后沿输出sdo,sdo经过板间延迟D(sdo),到达RX,而此时要用RX的ws/fs和sclk来正确采样sdo,这就要求3adifclk+D(sdo)【这里面fs明显是没有用sclk下沿采样的】不要超过一个sclk的周期.
对于RX mst的sclk和ws/fs delay为0,sdi的延迟经历了以下路径:
Rx ws/fs_o -----> Tx ws/fs_i -----> Tx ws/fs_sync ------> Tx sdo -----> Rx sdi ------> Rx sdi_sync
如下图所示是上升沿变化上升沿采样,可以看出要保证sdi_sync与fs_o的时序关系,就要求上面的延迟不超过一个sclk的周期;如果是上沿变化下沿采样,就要求上面的延迟不超过sclk的半周期。
另外从下图可以看出在TX slv 端不能用同沿采样FS【可以用sclk负沿采样】 这样得到的FS上升沿必然比RX mst的fs上升沿至少晚一拍,用此产生sdo到了RX晚的更多。最好是直接在adifclk打拍fs_sync和fs一起得到fs的上升沿。
在实际的项目中由于sclk在100ns量级,adifclk在10ns~0.xns的量级,D(sdo)也在10+ns【主要是一边的pad延迟就在5ns左右,两边加起来在10ns】的范围,所以有些项目就没有对latency设置约束。
如果sdo在RX master端和ws/fs间隔太远超过1个sclk,这时候就需要逻辑设计来保证。
3.逻辑设计上的保证
综上所述有以下结论:
- 满足D(sclk) <= D(fs) <= D(sdo)
- TX master+Rx slv组合中TX fs/ws,sdata在sclk在变化变化沿和RX端fs/ws,sdata用sclk的采样沿使用不同
- TX slv+Rx mst组合中Rx输出fs/ws所用的sclk沿和采样sdata的沿用同沿,TX采样fs/ws用的sclk沿与Rx端相反
只有满足上述条件,对I2S/PCM来说才是最优的传输和采样约束。为了灵活的满足上述条件,在逻辑设计时,要求能够调整sclk,fs/ws,和sdo的相位,并且能够调正sclk的作用沿。
其实无论skew还是latency的约束,都不能完全保证传输和采样完全正确,而且一旦约束完成,想传输更高的sclk的音频,很容易就出错。所以希望在逻辑设计上做一些工作,能够更好的保证信号间的同步。这就需要能够调整信号间的相位。相位可以以高频adifclk的周期来调整,这个相位调整的精度比较高。另外一种就是以sclk的周期来调整相位。
对于TX master和RX slave组合,在RX接收端对sclk,ws/fs,sdata信号同步之后,在adifclk的精度上调整相位就可以了,也就是软件测试时手动给三个不同的信号设置不同的打拍延迟数,使放音正常。然后把这几个参数固定,就可以稳定使用了。
而对于TX slave和Rx master组合,常常会出现sdo进入RX之后比原RX的ws/fs多晚了一个sclk周期以上,此时就需要对原来的RX ws/fs进行delay,可以以adifclk为精度delay,如果不够还要以sclk为精度delay,也做成软件手动配置和调试来得到一个稳定的值。另外现在的codec、adif都支持配置第一个sdata与ws 下降沿或fs上升沿的data_offset。如果Rx master没做ws/fs的delay,一旦发现音频播放有问题,就可以让Rx mst设置的data_offset比Tx slv的data_offset大来调整。
4.音频传输错误检测
有些代码实现通过检测sdata的bit数左右声道不一致【SNPS的hdmi这么干的】,或整帧的bit数和配置值不一样来上报错误。文章来源:https://www.toymoban.com/news/detail-657527.html
但这只能检测到有限的错误,比如ws/fs和sdata的间隔错误了,就检测不出来。但这种间隔错误一般在调试完delay参数后就不会出现。文章来源地址https://www.toymoban.com/news/detail-657527.html
到了这里,关于I2S/PCM board-level 约束及同步(latency&skew&bitsync)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!