EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
进进按语 本文作者樊继明先生在2015年曾出版过 《FPGA深度解析》 ,这是一本FPGA开发经验总结式的书籍,值得推荐。 樊先生曾经设计过芯片,涉及的是100G OTN DSP物理层芯片逻辑设计,现聚焦于高速接口以及数字波束合成方面FPGA相关的应用。 工科生的技术高手很多了,但有能力有意愿将自己的积累写出来的并不多,所以原创的价值就很大。樊先生的技术文章是我喜欢的实战性很强的文章,虽然我看不太懂,但我能嗅出他的文章的价值。 唯期樊大侠笔耕不断,能在智库上发表的文章系列化,最终在2017年能将他在智库上发表的文章出版成书。那将是他的第二本书。 在鼎阳硬件智库一开始的规划中就有图书出版的计划,所以我们一直在力揽“大家”在智库上开设专栏。 希望此前几位先生的努力将能吸引更多的“大家”加入专栏写作计划。鼎阳科技倾力支持硬件相关的技术文章的原创,略备稿酬,每1000字600的稿酬,经年不变。欢迎投稿! 上周里热论差分线的长度匹配问题,有人喊出:Skew是高速信号领域永恒的话题。同步接收问题其实也是Skew相关问题。本文的结论是:高速器件输出LVDS信号给FPGA或者FPGA输出LVDS信号给外部高速器件是一个在很多场合都会应用到的场景,当LVDS信号速率在FPGA 采用源同步接收的LVDS I/O能力支持的情况下,FPGA可以使用源同步+输入约束的方式进行接收,这样可以简化设计,同时节省逻辑资源,让设计更加简单易懂。
: s, @4 k$ U: c# h3 h 虽然SerDes接口在很多应用中很流行,但是对于不少高速系统,源同步的LVDS接口也依然存在。FPGA经常涉及到LVDS(Low Voltage Differential Signaling)信号的接收,比如说FPGA与一些采样率较高的ADC,或者一些高清显示屏的接口通常都是LVDS接口。这些信号有着一个共性,就是采用LVDS电平标准,采用源同步方式传输。由于这些信号速率一般很高,因此如何保证接收的这些信号的正确性,是一个FPGA设计者经常会遇到的难题。本文旨在提供一种简单方便的方法来稳定的接收该种方式的信号。
- I5 R, r3 M: t# _1.1 什么是LVDS信号?
0 F/ B0 _ N. @& l! ]# L LVDS的全称是Low Voltage Differential Signaling, 即低压差分信号。这是一种高速的,低摆幅,差分,低功耗的传输方式。最早该信号标准由美国国家半导体公司提出,后来被广泛用于各种高速接口,如LVDS液晶显示屏,高速ADC的数据接口,以及一些视频传输应用。 LVDS电平标准的电压摆幅是350 mV,由于其摆幅很低,因此上升时间很短,因此比起LVCMOS,LVTTL等电平标准具有更高的传输速度。理论上LVDS的传输最高速率可以达到1.9G b/s的水平。 LVDS有一个特点,就是采用电流传输驱动模式,电流标准值通常为3.5 mA。LVDS接收器由于具有很高的输入阻抗,所以LVDS的接收端需要端接一个100欧的电阻以对驱动电流进行接收。其识别逻辑’1’和逻辑’0’是根据电流的方向来识别,如图1所示,LVDS差分信号在输出端接有串行匹配50欧电阻,以Cyclone IV FPGA为例,FPGA的rxin+和rxin-端,并有一个100欧的电阻,该电阻即是LVDS驱动电流的取样电阻。当电流方向由txout +到txout –时,此时rxin+和rxin-端会产生350 mV的压降,此时被认定为逻辑’1’,当电流方向由txout-到txout +时,此时rxin+和rxin-端会产生- 350 mV的压降,因此被认定为逻辑’0’。 图1
8 l, O) n2 M" d" b 1.2 带LVDS输出接口的一个高速ADC
) P5 U" \/ R) R- @ 在很多高速器件里,比如说高采样率的ADC,很多都带有LVDS电平标准源同步的输出接口,所谓的源同步,就是数据和同步时钟并行传输的意思。这里以TI(德州仪器)公司的ADS62P49为例,讲述FPGA接收LVDS信号的例子。 ADS62P49是一款具有较高采样频率的双通道ADC(即一个芯片有2个ADC),每个ADC采样频率达到250M HZ,量化比特位宽为14比特,因此每个子ADC数据速率达到250M x 14 = 3.5 Gbps。每个子ADC采用了7对LVDS差分信号来传输数据以及一对LVDS同步时钟。其输出接口采用双沿模式(DDR, Double Data Rate),即在每个同步时钟周期内,数据速率为同步时钟的两倍,即数据在上升沿和下降沿都会产生变化。第一对LVDS传输量化14比特中的第0位和第1位,第二对LVDS传输量化14比特中的第2位和第3位,第三对LVDS传输量化14比特中的第4位和第5位,第四对LVDS传输量化14比特中的第6位和第7位,第五对LVDS传输量化14比特中的第8位和第9位,第六对LVDS传输量化12比特中的第10位和第11位,第七对LVDS传输量化14比特中的第12位和第13位,因此只需要七对信号即可传输14比特的量化值。每对LVDS接口的速率为250*2 = 500Mbps。该接口框图如图2所示: 3 e2 N2 W/ T' t1 Q. s2 b: z
图2(摘自ADS62P49 Datasheet)
3 P$ W6 I2 ?: r 如图2所示,CLKOUTP/M即为LVDS信号中的同步时钟信号,DA0_P/M到D12_P/M即为数据差分信号,DA0_P/M表示为同一对差分信号,该信号传输第0和第1比特,以此类推。 该ADC的LVDS接口输出时序如图3所示: 图3(摘自ADS62P49 Datasheet) 如图3所示,可以清楚的看到,数据信号的偶比特和奇比特的有效时刻基本上以输出时钟CLKOUTM/P的上升沿和下降沿的中心。 那么问题来了,在FPGA里是否可以直接使用该同步时钟直接寄存器锁存信号不就可以了吗?事实上通常的做法都是这样的(该通常的做法跟FPGA的源同步LVDS I/O性能有关),但是必须加接口约束。为什么呢?因为ADC的LVDS输出的时钟和数据的相位关系是会随着工作环境,芯片的批次而变化的,因此不同工作环境,不同批次的芯片时钟和数据的相位关系可能会有变化,如果不加接口约束直接用源同步时钟锁存数据有可能会造成建立时间或保持时间不满足,进而造成接收数据错误。因此,必须加入接口时序约束以保证输入接口的寄存器满足建立时间和保持时间。如下图所示: 图4 基于该ADC的源同步传输特性,对于该种ADC的LVDS信号的接收通常采用源同步接收再加时序约束来保证接收的过程能够满足接收数据的建立时间和保持时间,进而保证接收信号的正确性。依照tsu和th的值进行input delay约束,如果时序满足,那么可以肯定FPGA的接收将是正确无误的。Tsu和th的值说明如图5所示: & e K9 S# N' k
图5 (摘自ADS62P49 Datasheet) : _& `$ A( u& {. N5 I# D7 g0 j& r* f! V
图6 (摘自ADS62P49 Datasheet) 图6为ADS62P49数据手册提到的tsu和th的变化范围,这两个值必须用在FPGA的接口时序约束中,以保证输入的稳定性。 1.3 采用input delay约束保证源同步接收的正确性+ }2 S9 E4 v. S) l6 O& K3 l
由于ADC基本上是带有LVDS电平的随路时钟,因此采用该时钟作为数据接收寄存器的工作时钟来接收ADC的输出LVDS数据信号。 源同步方式主要是使用ADC输出随路时钟(数据同步时钟)来采样ADC输出数据,其框图如图7所示: 图7
5 |6 Q7 f2 p' A2 X' Z 如上图所示,数据由ADC输出,差分时钟和差分数据经过FPGA的I/O buffer后变成单端信号,由于数据跟随路时钟clk的关系为DDR方式,因此让数据同时进入FPGA的两个寄存器DIL和DIH,DIL工作于时钟上升沿,DIH工作于时钟下降沿,最终出来两个工作于clk速率下的并行信号(可使用FPGA I/O资源里的DDIO)。该种方法简单有效,FPGA I/O寄存器直接采用clk上升沿和下降沿锁存ADC的输出数据。 我们知道,电子元器件在不同的温度和不同的电压下,其表现出来的时序特性不一样。因此,为了保证在各种不同的条件下都能正确的接收该信号,我们必须对这种接收方式进行输入时序约束,然后查看最终的布局布线结果是否在各种工作条件下时序都能得到满足。所以,在做这项工作前,设计者需要知道在电路板上ADC输出随路时钟到达FPGA管脚以及数据到达FPGA管脚之间的时间差,即skew值。另外还需要知道在ADC的输出管脚处,其输出数据和输出时钟之间的关系的极限值,在ADC的数据手册里,一般用Tsetup和Thold来表示这个关系,根据这个关系设计者可以轻易的估算出该数据的有效采样窗口。ADS62P49的Tsetup和Thold与采样有效窗口的关系可根据图5计算出来,为Tsumin+Thmin=1.1ns。如图8所示:
0 [( P* d4 z9 ` ]) G7 S- F) b$ V 图8 如图9所示,根据ADS62P49的数据手册,随路时钟clk与数据为中心对齐方式,即clk的边沿(上升沿或者下降沿)在数据有效期的中间。数据从有效到到达clk上升沿的边沿被定义为Tsetup,数据从上升沿到本次输出数据无效的时间被定义为Thold。因此整个数据的有效时间即为Tsetup+Thold,在这个时间内时钟采样到的数据都是正确的,这也就是所谓的采样窗口。在设计中,我们一般会努力的让寄存器的时钟采样点在中间,这样能够保证setup和hold的裕量都一样,而不是一个大一个小的方式。时钟采样位置的变化对裕量的影响如图9所示: 图9 如图9所示,在该种方式下,采样时钟点往左移,setup余量变小,hold余量变大。而图10中则是采样时钟点往右移,此时的setup余量变大,hold余量将会变小。其实在不同的工作条件下,采样时钟很难保证一直在数据有效的中心点,甚至在某些工作条件下,采样时钟会跑出数据有效窗口,如此即会导致接收数据错误。这也是为什么要做输入时序约束保证时序正确性的原因,其目的就是保证数据时钟能一直在数据有效窗口内。 图10 以ADS62P49为例,说明如何对LVDS数据信号的接收做时序约束。如前所述,ADS62P49输出为双沿模式,其时钟为250MHZ,在其输出管脚处,其时钟管脚和数据管脚的最小Tsetup和最小Thold分别为0.55ns和0.55 ns,因此可知其数据采样窗口为0.55+0.55 = 1.1ns。对于此类高速源同步接口,一般要求在PCB布线上时钟信号和数据信号做等长处理,因此依托于这个条件,我们可算出最大的max delay为: 1/((250M)*2)-Tsetup = 2-0.55 = 1.45ns min delay为Thold = 0.55ns 之所以max delay计算法则如此,可以认为ADC上升沿打出数据,FPGA采用下降沿接收,或者是下降沿打出数据,FPGA在上升沿接收,因为做input delay的约束即为告诉时序分析工具其数据到达I/O管脚时和其源同步时钟的最大和最小延时关系,按照数据手册上的Tsetup的图示,即数据和时钟沿的最小setup关系可以认为是ADC上升沿/下降沿输出的最大延时,同理最小hold关系可以认为是ADS4122上升沿/下降沿输出的最小延时。 时序分析的关系如图11所示: 图11 如图11所示,vir_clk为虚拟时钟,作为对外部输入数据同步时钟的声明,可以认为该时 钟就是ADC的同步输出时钟。clk为FPGA锁存输入数据的时钟,来自于外部时钟(与虚拟时钟等效)。其setup关系为vir_clk上升沿打出数据,clk下降沿接收或者是vir_clk下降沿打出数据,clk上升沿接收。hold关系为vir_clk上升沿与clk上升沿或者是vir_clk下降沿与clk下降沿。 该源同步为双沿模式,因此还应该针对此情况对set_input_delay做时钟双沿的说明,约束 语句如下(设6路LVDS数据名为in,源同步时钟为clk): create_clock -name {clk} -period 5.000 -waveform { 0.000 2.500 } [get_ports {clk}] create_clock -name {vir_clk} -period 5.000 -waveform { 0.000 2.500 } 如上两条语句为建立一个外部的输入数据同步的虚拟时钟以及跟该虚拟时钟一致的FPGA的输入数据同步时钟。 set_input_delay -max 1.450 -clock [get_clocks {vir_clk}] [get_ports {in }] set_input_delay -min 0.55 -clock [get_clocks {vir_clk}] [get_ports {in }] set_input_delay -clock_fall -max 1.45 -clock [get_clocks {vir_clk}] [get_ports {in }] -add_delay set_input_delay -clock_fall -min 0.55 -clock [get_clocks {vir_clk}] [get_ports {in }] -add_delay 由于该源同步方式为DDR模式,因此上述第一条和第二条语句声明的是上升沿打出,下降沿锁存的input max delay和input min delay约束,第三条语句和第四条语句声明的是下降沿打出,上升沿锁存的input max delay和input min delay约束。由于相对于同一个虚拟时钟有两个一样的input max delay和input min delay约束,因此需在后面两条语句加上-add_delay表示此两条语句不被上面两条语句所覆盖。 另外,由于时序分析工具会覆盖整个时钟周期,但是实际上本设计的时钟关系为半个周期,因此还需要告诉时序分析工具不需要对整个时钟周期进行分析,因此加入了false path语句: set_false_path -setup -rise_from [get_clocks {vir_clk}] -rise_to [get_clocks {clk}] set_false_path -setup -fall_from [get_clocks {vir_clk}] -fall_to [get_clocks {clk}] set_false_path -hold -rise_from [get_clocks {vir_clk}] -fall_to [get_clocks {clk}] set_false_path -hold -fall_from [get_clocks {vir_clk}] -rise_to [get_clocks {clk}] 此四条语句分别表示,在做setup分析的时候,不需要对两个相隔一个周期的上升沿进行分析和下降沿进行时序分析,在做hold分析的时候,不需要对两个相隔半个周期的上升沿和下降沿进行时序分析。 以Cyclone IV FPGA为样本,时序分析得到Slack为正,可以说明采用该方式接受LVDS信号是可以保证FPGA的采样是满足建立时间和保持时间,即为在外部硬件设计合理的情况下,FPGA可以保证在芯片的工作环境内能够正确稳定的接收该速率的LVDS信号。 结束语1 G; G/ q( Z. H, w9 X W. \8 a
高速器件输出LVDS信号给FPGA或者FPGA输出LVDS信号给外部高速器件是一个在很多场合都会应用到的场景,当LVDS信号速率在FPGA 采用源同步接收的LVDS I/O能力支持的情况下,FPGA可以使用源同步+输入约束的方式进行接收,这样可以简化设计,同时节省逻辑资源,让设计更加简单易懂。 ( b/ O. n5 b/ }+ C
鼎阳硬件智库专家介绍 樊继明,硬件设计与测试从业6年,专长ASIC/FPGA逻辑设计,高速接口(LVDS, 高速SerDes)逻辑设计与验证,2009年毕业于华南理工大学,工学硕士。曾在通讯行业从事过3年的ASIC设计,主要涉及到光传送网100G OTN DSP物理层芯片逻辑设计,现在某医疗设备行业从事FPGA逻辑设计,主要聚焦于高速接口以及数字波束合成方面的设计。
) P) q* W: q- @% F5 q. | |