赵晓海
(北京思比科微电子技术股份有限公司数字部 北京 100085)
当前,实现图像采集、处理和压缩等功能的数字集成电路产品得到了广泛应用[1]。但是随着消费者对图像质量的要求越来越高、多媒体芯片实现的功能越来越丰富,该领域集成电路的时钟方案也变得越来越复杂。
同步方法除了必须保证数据正确传输外,还应注意以下两方面:所用存储器的容量和EDA(Electronic Design Automation)工具的干预程度。首先应使所用存储器的容量尽量小,因为其不仅占用较大的芯片面积,而且还有较多功耗。其次,要尽量减少和避免使用EDA工具对跨时钟域信号做时序检查和校正。因为,如果源和目标时钟没有确定的相位关系,EDA工具就无法检查前后两级触发器的路径延时与目标时钟的关系;另外即使两时钟有确定的相位关系,EDA工具也可能在信号路径中插入大量的Buffer,从而浪费芯片面积。
这里结合一个CMOS图像传感器的设计实例,总结并提出了几种对跨时钟域信号做同步处理的方法。这些方法既可以保证数据的正确传送,又可以尽量减少对芯片面积的占用。
首先介绍一种输出分辨率为1 280×720的CMOS图像传感器的设计。其CMOS图像阵列的数据端口为4通道,帧率为60帧/s。
该CMOS图像传感器的模块构成如图1(a)所示。
CMOS像素阵列为图像传感器的感光器件。采用Bayer pattern[2]模式,分为4种颜色:G1、R、G2、B。
CMOS图像阵列模块输出信号的时序关系如图1(b)所示。
vsync_pix为帧同步信号,其为1表示帧有效期,为0表示帧消隐期;hsync_pix为行同步信号,相当于输出数据的使能信号,其为1表示行有效期,为0表示行消隐期;data_g1、data_r、data_b、data_g2为4个数据输出端口,每个端口只输出一种颜色的数据。
图1 CMOS图像传感器系统结构Fig.1 System structure diagram of CMOS image sensor
由图1(b)所示,在每个时钟周期,同时输出4个像素的数值,这4个像素为相邻的两行两列像素且处于一个矩形当中。
列拼接模块用于把图像阵列送出的4通道数据按列拼接为双通道数据。即把每行的2个数据合并至一个通道中。这样做的结果是每个输出通道的数据频率提高一倍。
行拼接模块用于把列拼接模块送出的2通道数据合并为单通道数据。当2通道数据输入时,其首先将其中一行送出,然后在一定时间后再送出另一行数据。其输出数据的频率也为输入数据的两倍。
输出频率转换模块是把频率为96 MHz的输入数据转换为以64 MHz频率送出。数据输出模块被用于从不同模块选择输入数据,并完成输出数据的时钟同步工作。CMOS像素阵列控制器用于控制对所有像素的曝光和读出。时钟管理模块用于产生各个模块所需的时钟及复位信号。
该CMOS图像传感器最重要的功能是输出分辨率为1 280×720的图像,且60帧/s。为了达到这个帧率,像素阵列控制器的时钟频率应为109÷((732/2)×(400+1 284/2+16)×60)≈23.2 MHz,所以像素阵列和像素阵列控制器的工作频率定为24 MHz。而4个通道数据合并为一个通道后,数据频率将变为96 MHz,所以让数字逻辑各模块工作在96 MHz时钟上。在此基础上该图像传感器有3种工作模式:单通道输出96 MHz频率的数据、单通道输出64 MHz频率的数据、双通道输出48 MHz频率的数据。
1)单通道输出96 MHz频率数据(模式1)
在该模式下,像素阵列以4通道送出数据,每个通道的数据频率均为24 MHz。此4通道数据首先进入列拼接模块,从此模块输出时变为2通道、每通道频率为48 MHz的数据。之后进入行拼接模块,此模块输出单通道且频率为96 MHz的数据。最后,经数据输出模块,图像传感器以单通道输出96 MHz频率的数据,且帧率为60帧/s。
2)单通道输出64 MHz频率数据(模式2)
在此模式下,行拼接模块输出的单通道且频率为96 MHz的数据被送入输出频率转换模块。该模块将数据的传输频率从96 MHz降为64 MHz。最后经数据输出模块,图像传感器以单通道输出64 MHz频率的数据,帧率仍为60帧/s。
3)双通道输出48 MHz频率数据(模式3)
在该模式下,列拼接模块输出的2通道、频率分别为48 MHz的数据被直接送入数据输出模块。图像传感器以2通道输出频率分别为48 MHz的数据。
根据该CMOS图像传感器功能要求,其时钟方案如图2所示。
图2 时钟方案Fig.2 Clock scheme
该CMOS图像传感器的输入时钟的频率为24 MHz,由PLL(Phase Locked Loop)对其8倍频,输出频率为192 MHz时钟,之后将192 MHz时钟分别做2分频和3分频。2分频产生的96 MHz时钟作为数字部分的主要工作时钟,列拼接模块、行拼接模块、输出频率转换模块均工作在此时钟域中。3分频产生的64 MHz时钟被送入输出频率转换模块,用于将数据频率从96 MHz降为64 MHz。
96 MHz时钟被2分频后产生48 MHz时钟,当图像传感器工作在模式3时,该48 MHz时钟被作为输出数据的同步时钟。
48 MHz时钟被2分频后产生24 MHz,其被送入CMOS像素阵列控制器模块。该模块和CMOS像素阵列均工作在24 MHz时钟域中。
在图像传感器输出图像数据时,其会送出与输出数据同步的时钟,即Pclk,后级芯片必须首先用此时钟采集图像数据。当图像传感器工作在模式1时,Pclk为96 MHz时钟;当其工作在模式2时,Pclk为64 MHz时钟;其工作在模式3时,Pclk为48 MHz时钟。
在CMOS像素阵列控制器的控制下,像素阵列以4通道、每通道24 MHz的频率输出数据。而列拼接模块工作在96 MHz的时钟域内,所以数据进入列拼接模块后,首先必须实现从24 MHz到96 MHz的时钟域切换。
从图2中可以看到,像素阵列所处的24 MHz时钟是由96 MHz时钟4分频后得到的,所以此96 MHz时钟与24 MHz时钟有确定的相位关系。此关系如图3所示。
图3 96 MHz时钟与24 MHz时钟的相位关系Fig.3 Phase relation between 96 MHz clock and 24 MHz clock
当数据从24 MHz时钟的上升沿输出后,其距离下一个96 MHz时钟的上升沿有将近一个96 MHz时钟周期的延时。所以在这种情况下可以直接用目标时钟的上升沿去采源时钟上升沿送出的数据。
另外,在逻辑综合(synthesize)时,必须设置此96 MHz时钟和24 MHz时钟为同步关系,即用synthesize工具去检查所有跨此两个时钟边界的路径是否满足时序要求。
应注意,所有从24 MHz时钟域进入96 MHz时钟域的信号必须首先被96 MHz时钟至少采一拍。这样做的原因是保证跨时钟域信号第一次被目标时钟采集时,此offset能够尽量大。
当该CMOS图像传感器工作在模式2时,输出频率转换模块将把输入频率为96 MHz的数据变为以64 MHz频率输出。
从图2中可以看到,96 MHz时钟和64 MHz时钟均由192 MHz时钟分频得到,但两者之间没有固定的相位关系,所以不能使用2.1所述的方法实现跨时钟域信号的同步。此时可以通过双端口存储器实现跨时钟域信号的同步。
1)输出频率转换模块内部结构
输出频率转换模块的内部结构如图4所示。
该模块的核心为一个双端口存储器,其的一个端口用于96 MHz数据写入,另一端口用于以64 MHz频率将数据读出。
Vsync_in为该模块的帧同步输入信号;Hsync_in为行同步输入信号;Data_in为数据输入端口;Vsync_out,hsync_out为该模块输出的帧同步信号和行同步信号;Data_out为数据输出端口。
2)同步流程
图4 输出频率转换模块的结构Fig.4 Structure diagram of synchronization module
在每一行数据输入时,hsync_in均变为1,此时地址计数器1开始计数。其的计数值将作为写地址信号被送到双端口存储器的wadder端口。hsync_in也作为写信号被送到write端口。此时该行数据被串行写入此存储器中。
hsync_in信号同时也被送入同步器,同步器利用64 MHz时钟将其采两拍后产生信号hsync_sync,其被送入地址计数器2中。地址计数器2将以此信号的上升沿为计数开始的标志,直至计到1280后回到初始值0。该计数值被作为读地址送到双端口存储器的radder端口。此时双端口存储器中的数据被以64 MHz的频率读出。
在地址计数器2从0到1 280的计数过程中,将产生宽度为1 280个64 MHz时钟周期的信号hsync_out,其作为双端口存储器输出数据的使能信号被输出。
Vsync_in信号直接被送入同步器,在被64 MHz时钟同步2拍后,被输出至后级模块。同时,为了提高系统的稳定性,其还被送至地址计数器2中,其的上升沿标志信号将把地址计数器2清零。
据此,数据被逐行逐帧完成跨时钟域处理。
3)存储器容量计算及synthesize设置
从2.2的2)中对该方法的阐述可以看到,将数据写入双端口存储器的频率为96 MHz,而读出频率为64 MHz,有可能出现该行还没有被读完,下一行数据又将被写入FIFO的情况。
另一方面,因为像素阵列模块周而复始的一帧又一帧的输出数据,即使双端口存储器中的数据出现被覆盖的现象,其也不可能停止输出数据。所以对FIFO覆盖现象的避免并不能依靠full或empty[4]这些指示信号。
从以上论述可知,在跨时钟域信号的同步处理中,必须保证FIFO中的数据在被读出前不被覆盖,另一方面还必须使用尽量少的存储器。如果读时钟的频率快于写时钟,那么FIFO的深度可以只用几个字节就可以了。如果读时钟的频率慢于写时钟,双端口存储器的深度与写时钟和读时钟频率的比值有关。在该设计中,写时钟频率为96 MHz,读时钟频率为64 MHz,两者的比值为3:2。也就是说,在向FIFO写入3 Byte数据的同时,只能从FIFO中读出2 Byte数据,且还需要行有效期至少一半的时间用于读出最后1 Byte数据。据此,FIFO的深度至少应为一行图像数据的1/3,行消隐期不能少于一行有效时间的1/2。由此可以进一步推知,如果写时钟与读时钟的频率最简比值为m/n,则FIFO的深度至少为一行有效数据的1/m,行消隐期的宽度至少为一行有效时间的1/n。
根据此计算方法,该图像传感器的行有效期的时间长度为642周期(24 MHz时钟),而行消隐期为416周期,416/642>0.5所以该设计在时间上可以满足数据频率从96 MHz到64 MHz的转换。而双端口存储器的深度应为1 280/3≈428 Byte。这样FIFO中的数据在读出前不会被覆盖。
如前所述,此96 MHz时钟与64 MHz时钟没有固定的相位关系。所以此时synthesize工具无法计算跨这两个时钟边界的路径是否符合时序要求。因此该设计在synthesize时,必须设置此两时钟域的路径为false path。
4)控制信号的同步方法
如2.2的2)中所述,该同步方法不仅对数据做了同步,还涉及对控制信号vsync_in和hsync_in做相应处理。此两信号的同步方法是直接用64 MHz时钟采两拍,生成64 MHz时钟域的信号hsync_sync和vsync_out[5]。
控制信号的同步取决于两方面的因素,其一为此信号的宽度,其二为各控制信号间的时序关系。
如果一个控制信号直接被另一个时钟采集,那么其时间宽度至少为目标时钟周期的两倍,否则目标时钟可能采不到这个信号。另一方面,如果多个控制信号同时进入另一时钟域,而且这几个信号又必须有确定的先后顺序时,就必须注意它们进入同步器前的时间间隔,否则会出现如图5所示的错误。
图5 多控制信号同步错误Fig.5 Error from synchronizing multi-control signals
从图5可以看到,在某种特殊情况下,前级模块可能会在同一个源时钟沿送出vsync_in和hsync_in。因为这两个信号至下一级触发器的路径延时不同,极有可能出现hsync_in延时较小,而vsync_in延时较大的情况。所以目标时钟可能先采到hsync_in,后采到vsync_in。这样同步两拍后,会出现hsync_sync信号比vsync_out信号早一个时钟周期的情况,从而引起后级操作的错误。
当该图像传感器工作在模式3时,其以48 MHz频率输出双通道数据。此时,从列拼接模块输出的数据被直接送至数据输出模块。因为列拼接模块工作在96 MHz时钟域中,所以其输出数据的时间宽度均为2个96 MHz时钟周期。pclk在此模式下频率被设为48 MHz,而48 MHz时钟是由96 MHz时钟分频得到,所以pclk与96 MHz时钟送出的信号没有确定的时序关系,其直接去采96 MHz的数据会有问题。
为使数据能够被正确传送,必须保证数据变化的时刻与pclk的上升沿之间有足够的setup time和hold time[6]。为此采用如图6(a)和图6(b)所示的方法。
图6 从96MHz时钟到48MHz时钟的同步方法Fig.6 Synchronous method from 96MHz clock to 48MHz clock
1)信号说明
phase_flag为相位判断信号,其由96 MHz时钟分频产生,但与48 MHz时钟不同的是,该信号在96 MHz时钟的下降沿变化,所以当96 MHz时钟的复位信号在该时钟的上升沿失效后,phase_flag将先于48 MHz时钟半个周期翻转为1。其与48 MHz时钟有如图6所示的确定相位关系;
vsync_g,hsync_g为列拼接模块输出的帧有效信号和行有效信号;
datain_1,datain_2为列拼接模块输出的两通道数据信号;
hsync_g_pos为hsync_g的上升沿标志信号,其处于96 MHz时钟域中;
phase_g_flag0和phase_g_flag1为输入数据与48 MHz时钟相位关系的标志信号,均在96 MHz时钟域中产生,且phase_g_flag0将进入48 MHz时钟域;
hsync_g_dly2和hsync_g_dly3为hsync_g在96 MHz时钟域中延时2个周期和3个周期的信号;
datain_1_dly2、datain_1_dly3、datain_2_dly2和datain_2_dly3分别为datain_1和datain_2在96 MHz时钟域中延时2个周期和3个周期的信号;
hsync_pclk,data_1_pclk和data_2_pclk为48 MHz时钟第一拍输出的信号。
2)phase 0情况
当96 MHz时钟域的信号进入数据输出模块后,首先产生hsync_g_pos信号。当该信号为1且phase_flag为0时,phase_g_flag0将变为1且phase_g_flag1将变为0,表示此时输入数据与48MHz时钟的相位关系为phase0,即datain_1和datain_2在48 MHz时钟的上升沿附近变化,此时用48 MHz时钟采这两通道数据将有时序问题。
在phase0情况下,phase_g_flag0在48 MHz时钟的下降沿附近变化,所以48 MHz时钟的上升沿可以稳定地采到其的值。此时,根据phase_g_flag0的极性,48 MHz时钟域中的第一级触发器将选择hsync_g_dly3、datain_1_dly3和datain_2_dly3作为输入信号。从图6(a)中可看到,此时这3个信号均在48 MHz时钟下降沿附近发生变化,所以没有时序问题,可以使信号正确无误地进入48 MHz时钟域中。
3)phase 1情况
当hsync_g_pos为1时, 如果phase_flag为1则phase_g_flag1将变为1,表示此时为phase1情况。即96 MHz数据在48 MHz时钟的下降沿附近变化。当phase_flag为0且phase_g_flag1为1时,phase_g_flag0将变为0。这样是保证phase_g_flag0信号的极性始终在48 MHz时钟的下降沿附近变化,从而使其进入48 MHz时钟域时,没有时序问题。其为0后,48 MHz时钟域中的第一级触发器将据此选择hsync_g_dly2、datain_1_dly2和datain_2_dly2作为输入信号。从图6(b)可以看到,此3个信号均在48 MHz时钟的下降沿附件变化,所以用48 MHz时钟的上升沿能够准确采集它们的状态。
此96 MHz时钟域与48 MHz时钟域虽然有确定的时序关系,但是96 MHz时钟送出的信号与48MHz时钟之间却没有确定关系。因此在synthesize的设置当中,跨此两个时钟的路径应设为false path,这些路径的时序只能在逻辑设计中被保证。
综合2中所述,在对跨时钟域信号进行同步处理时,应根据以下情况采用相应的处理方法。
如果两时钟间有确定的相位关系,可以直接用目标时钟采集跨时钟域信号。但应保证采集时,能够有尽量大的时序余量。比如2.1和2.3中所述方法。
如果两时钟没有确定的相位关系,数据同步必须借助FIFO来实现跨时钟域处理,但应根据具体的设计环境使用容量较小的FIFO以节省芯片面积,并且能够保证FIFO中的数据安全。如2.2中所述方法。
为使目标时钟能够稳定采到跨时钟域的信号,该信号的时间宽度一般至少应为目标时钟周期的2倍。特别是源时钟频率高于目标时钟时更应注意这个问题。如2.2中,对hsync_in和vsync_in的处理就是如此。
当源时钟与目标时钟没有确定相位关系时,跨时钟域信号并不能保证在目标时钟的哪个时钟沿翻转。所以,当多个相关信号进入另一个时钟域时,应注意这些信号之间的时序关系。即有时会要求在目标时钟域中,一个信号先有效,而另一个信号必须后有效,比如2.2中所述方法的vsync_in与hsync_in的关系。对于这种情况,应使这些信号在源时钟域中保持足够宽度的间隔。
该CMOS图像传感器设计基于0.18 μm工艺,经逻辑综合、时钟树综合、布局布线、物理版图验证等前、后端处理后,面积为2 mm×2 mm。
经RTL(Register Transfer Level)仿真、门级仿真和实际芯片的系统验证,当输入时钟为24 MHz时,该CMOS图像传感器能够在3种模式下以指定频率正确输出数据。并可以在96MHz、64 MHz、48 MHz和24 MHz时钟之间正确完成控制信号和数据的同步处理。
随着多媒体芯片实现的功能日益增多,其的设计明显向时钟频率更高、时钟方案更复杂的方向发展。在此背景下,对跨时钟域信号做同步处理的方法变得越来越重要。这里以一个CMOS图像传感器的设计为实例,介绍了几种跨时钟域信号的同步方法。同时,对这些方法在使用过程中应注意的问题做了重点阐述。进而,对跨时钟域信号的处理方法做了系统总结。经仿真及芯片系统验证,在此所述同步方法均可正确完成跨时钟域信号的同步工作。
[1]Gonzalez R C,Woods R E.数字图像处理[M].阮秋琦,阮宇智,等,译.2版.北京:电子工业出版社,2007.
[2]Junichi Nakamura.Image Sensors and signal processing for Digital Still Camera[M].Tokyo:CRC Press,2005.
[3]彭莉,秦建业,付宇卓.异步FIFO的设计与验证[J].计算机工程与应用,2005,41(3):98-101.
PENG Li,QIN Jian-ye,FU Yu-zhuo.Asynchronous FIFO design and verification[J].Computer Engineering and Applications,2005,41(3):98-101.
[4]杜旭,王夏泉.ASIC中的异步时序设计[J].微电子学,2004,34(5):528-532.
DU Xu,WANG Xia-quan.Asynchronous Design in ASIC’s[J].Micro Electronics,2004,34(5):528-532.
[5]Clifford E,Cumming S.Synthesis and Scripting Techniques for designingMulti-Asynchronous Clock Dsigns[C]//SNUG San Jose,CA Voted Best Paper 3rd Place,2001:2-4,16-23.
[6]廖艳,王广君,高杨.FPGA异步时钟设计中的同步策略[J].自动化技术与应用,2006,25(1):67-79.
LIAO Yan,WANG Guang-jun,GAO Yang.The synchronizationinthe asynchronousclockdesignforFPGA[J].Techniques of Automation and Applications,2006,25(1):67-79.