1. 程式人生 > >在FPGA中實現源同步LVDS接收正確字對齊

在FPGA中實現源同步LVDS接收正確字對齊

原文地址:http://www.eefocus.com/article/09-06/5922703030607pn55.html

在序列資料傳輸中,資料接收端需要一些特定的資訊來恢復出正確的字邊界,以確定序列碼流中哪些位元屬於原始並行資料裡的同一時鐘節拍裡的資料,這一處理過程稱為字對齊(Word Aligner)。一些標準的協議會定義特殊的碼型(常見的碼型如8B/10B編碼中的K28.5)用於字對齊處理。另一些帶源同步時鐘的LVDS介面,通常會利用低頻的源同步時鐘來攜帶字對齊資訊,用於接收端的正確恢復。FPGA對上述兩種方案都可以進行正確處理。那麼,如何FPGA中利用低頻源同步時鐘實現低壓差分訊號(LVDS)接收字對齊呢? 

對於標準協議,FPGA通常都會有智慧財產權(IP)模組提供。本文主要討論在FPGA中利用低頻源同步時鐘實現低壓差分訊號(LVDS)接收字對齊的設計方法及步驟。 


LVDS已經成為業界高速傳輸最普遍應用的差分標準。LVDS的優勢包括:由於採用差分訊號帶來的對共模噪聲的免疫能力,進而提高了抗噪聲能力;功率消耗較小,噪聲較小等。由於LVDS有比較好的抗躁聲特性,它可以採用低至幾百毫伏的訊號擺幅,進而可以支援更高的資料速率。 

LVDS序列器/解串器(SERDES)可以完成多位寬度的並行訊號到LVDS序列訊號的轉換以及反方向操作,如圖1所示。有些器件提供圖1中的隨路時鐘,但有些器件可能並不提供,這時LVDS解串器還必須具有時鐘恢復(CDR)功能。市面上有各種規格的LVDS SERDES器件,此外FPGA或其它一些器件也都能整合LVDS SERDES模組。 

圖1:LVDS序列器/解串器的功能示意圖。


為確保正確的資料傳送,通過LVDS接收器後必須能恢復字順序,即輸入到LVDS序列器的最高位元能夠正確地出現在解串器恢復輸出資料的最高位元位置上,至少是需要預先知道出現在哪個位元位置上後再進行調整。圖2和圖3分別給出了4位寬度下字順序得到保留和沒有得到保留的例子。對於圖3的情況,需要採用一種方法找把字順序調整過來。 

圖2:字順序得到保留。

圖3:字順序沒有得到保留。


字順序的調整通常採用尋找訓練碼來進行。一些標準的協議通常會定義特殊的碼型來進行字對齊處理,比如8B/10B編碼中K28.5碼型的主要功能就是字對齊處理。傳送端在有效資料中插入K28.5碼型,接收端在收到的資料中尋K28.5碼型,找到之後以這個碼型為參考得到正確的並行資料輸出。此外,諸如SDH協議就利用幀頭位置的A1A2位元組來進行字對齊處理。 

另外一些相對低速的LVDS介面也利用低頻的源同步時鐘來攜帶字對齊資訊,以便在接收端實現正確的資料恢復。這裡的低頻源同步時鐘也如圖1中的隨路時鐘,LVDS資料和隨路時鐘之間的倍數關係通常等於LVDS序列化時的倍數因子。比如,德州儀器(TI)的SN65LVDS95 LVDS傳送器,不僅可完成21:3的LVDS序列化傳送,還將21位的並行資料和時鐘序列化成3路LVDS資料輸出和1路時鐘輸出。序列化因子的值等於7,所以輸出時鐘的頻率是LVDS資料速率的七分之一。通過這個隨路時鐘,配套的解串器SN65LVDS96就能夠正確恢復並行資料。 

與這類單獨的LVDS SERDES器件相比,FPGA整合LVDS模組能提供更高的整合度,並簡化硬體設計、節省PCB面積,從而降低應用成本。高階FPGA還在I/O單元裡固化了LVDS序列器/解串器,支援非常高的速率,比如Altera公司的Stratix III系列。 

Stratix III FPGA系列是Altera公司基於TSMC 65nm工藝的高階FPGA,是業界高密度高效能可程式設計邏輯器件中,功耗最低的產品系列。Stratix III 器件可以同時提供最多276對LVDS序列化傳送模組和276對LVDS解序列化接收模組,每路LVDS最高可以支援1.6Gbps。此外,它還獨家提供可程式設計的輸出擺幅和預加重功能,以支援長距離背板傳送,如圖4所示。 

圖4:Stratix III 支援可程式設計的輸出擺幅(Vs(p-p))和預加重(Vpp(p-p))。


圖5顯示了Stratix III的LVDS接收器中固化在I/O單元裡的模組。源同步的低頻時鐘rx_inclk通過PLL倍頻移相後得到DIFFI/OCLK,對輸入資料rx_in進行取樣,取樣後的資料可以進行最高因子為10的解序列化。 

圖5:Stratix III I/O固化的LVDS接收器。


由於FPGA具有非常高的靈活性,比如支援不同LVDS輸入資料和輸入時鐘之間的倍頻關係,以及不同的解序列化因子,所以Stratix III LVDS硬核模組的輸出字順序通常是不確定的,每次上電或者復位後字順序都有可能發生變化,使用時需要根據特殊碼型進行字對齊處理。 

當輸入到FPGA的資料和時鐘之間的倍數關係等於解串器的解序列化因子時,FPGA與單獨的LVDS解串器一樣,有確定的字順序輸出,可以在沒有訓練碼型的情況下繼續正常應用。圖6是解序列化因子為7時的時序圖。假設隨路時鐘的上升沿對應資料的最高位元,在FPGA內部,PLL會從隨路時鐘產生一個進行過相位調整的7倍頻率取樣時鐘。此時鐘對輸入資料進行取樣後送入解串器,通過控制解串器的裝載時鐘相位,得到確定的並行資料輸出字順序。裝載時鐘的相位相對隨路時鐘相位的固定差異是通過接收PLL的相位控制來實現的,因此必須在輸入時鐘穩定後再釋放PLL的復位控制,或者等輸入時鐘穩定後再復位PLL一次,否則輸出的字順序在每次上電時都可能不固定。 

圖6:LVDS接收及解序列化時序圖。


在具體應用時,還需通過模擬來確定具體應用下的字輸出順序,然後在邏輯設計裡面進行調整,使最終的並行輸出符合滿足需求。下面以與TI的SN65LVDS95 LVDS傳送器對接為例來介紹具體的設計方法和步驟。當把Stratix III的LVDS與別的LVDS器件對接時,也可以此為參考。 

圖7:LVDS95輸出時序。


在圖7,LVDS95輸出的時鐘和資料是對齊到輸出時鐘的上升沿上的,資料的最高位元(MSB)出現在時鐘上升沿之在後的第三個位元。這裡的目的是使Stratix III 的LVDS接收器輸出正確的字順序,也即圖7中的D6出現在並行輸出資料的最高位元上。 

圖8:綜合設定頁面。


假設並行側的時鐘頻率是60MHz,這樣序列LVDS的速率是480Mbps。為方便描述,這裡只針對1路LVDS資料進行設計。 

首先根據LVDS95的時序進行Stratix III中的LVDS模組(ALTLVDS)的呼叫。 

圖9:頻率和鎖相環設定頁面。


在圖8的綜合設定頁面中,我們沒有選上“Implement Serializer/Deserializer circuitry in logic cells,這樣就用到了LVDS SERDES硬核。同樣也沒有選上“Enable Dynamic Phase Alignment mode”選項,這表示不使用DPA功能。 

圖10:接收器設定頁面。


在圖9中,根據LVDS95的輸出時序,在“What is the phase alignment of rx_in with respect to the rising edge of rx_inclock? ”裡選擇了0度。在圖10的設定中,通常情況下需要選上“Register outputs”選項。但因為後續設計邏輯包含了這些暫存器,所以這裡選擇該選項。此外,在這裡沒有使能“rx_channel_data_align”埠來進行字重新對齊。 

接下來需要通過模擬找出序列因子等於7的情況下,LVDS硬核的字順序情況。圖11給出了頂層設計例子,圖12是在MODELSIM裡的模擬結果。 

圖11:頂層模組的設計。


從圖11的模擬波形可以看到,LVDS時鐘上升沿之後的第一個資料將在並行側的rx_out_tmp[6:0]中的rx_out_tmp[2]出現。結合LVDS95的特性,LVDS95輸出的MSB(D6)將在rx_out_tmp[0]出現,於是需要將此輸出滑動一位,得到正確的字順序。 

圖12:模擬波形。


在圖13中,首先將資料進行一拍延時,得到rx_out_tmp_dly[6:0],然後將rx_out_tmp_dly[0]放置在輸出資料的最高位,rx_out_tmp[6:1]順序放置在其他位上,得到資料向右滑動一位的效果。如果需要滑動多位,調整上述的放置位置就可以了。對上述調整邏輯,我們可以進一步通過模擬來驗證。在此我們輸入了一個計數器資料進行確認。圖14給出了模擬的部分輸出結果,圖中,左邊兩根豎條標出了LVDS輸入的“000001”資料,右邊的兩個豎條標出了rx_out的正確輸出。這證明了我們的調整是正確的。 

圖13:字順序的調整邏輯。

圖14:內容為計數器的模擬輸出波形。


本文小結 
在利用Stratix III做LVDS接收時,我們可以將解序列化因子設定成等於輸入的LVDS資料和時鐘之間的倍數關係,這樣就可以得到確定的字輸出順序,從而可以不依賴訓練碼實現正確LVDS接收的字對齊。此方法不僅適合於FPGA與單獨的LVDS傳送器進行對接,也可用於FPGA與FPGA之間的資料傳送,使用時FPGA的LVDS傳送端送出低頻的源同步時鐘即可。