-02-Xilinx的SerDes接口介紹【Xilinx-LVDS讀寫功能實現】

因爲攝像頭輸出的LVDS信號速率會達到600Mbps,我們將不能夠通過FPGA的I/O接口直接去讀取這麼高速率的信號。因此,需要使用Xilinx FPGA內的SerDes去實現高速數據的串並轉換。

熊貓君的文章“Zynq高速串行CMOS接口的設計與實現”,都已經說清楚了,大神~~

參考文檔ug953,ug471,我們爲了捕獲OV7251攝像頭LVDS的數據信號,將會使用的以下資源:
- IDELAYCTRL
- IDELAYE2
- ISERDESE2
- ODELAYE2 (用於模擬LVDS輸出信號)
- OSERDESE2 (用於模擬LVDS輸出信號)
- MMCME2_ADV
- BUFG, BUFR, BUFIO, IBUFG, IBUFDS, OBUFDS

1. IDELAYCTRL
這裏寫圖片描述
因FPGA的電壓偏置、製造過程、電壓、溫度的不同,可能會對整個芯片的時序造成一些小的影響。IDELAYCTRL可以通過一個較高頻率的參考時鐘REFCLK爲IDELAY或ODELAY提供延時抽頭,可選0~31。參考時鐘的頻率可選200MHz或者300MHz,它們的每個抽頭的分辨率分別約是78ps和52ps。我們的LVDS輸入爲600Mbps,則選用200MHz需要21taps,300MHz需要32taps,所以最終選擇200MHz爲參考時鐘。
使用時還需要注意需要對IDELAYCTRL進行LOC約束,實現工具將IDELAYCTRL實例自動複製到整個器件,甚至複製到未使用延遲單元的時鐘區域中。這樣做資源佔用率較高,在每個時鐘區域內都要使用一個全局 時鐘資源,並且使用佈線資源較多,因此功耗較大。參考文檔:輸入輸出延遲單元IODELAY簡介

2. IDELAYE2
這裏寫圖片描述
IDELAYE2邏輯是一個31抽頭的循環延時補償模塊,對輸入的信號進行指定分辨率的延時,從而保證從外部採集到的時鐘和數據信號對應的建立保持時間在可接受的範圍內。簡單的說就是通過配置不同的Tap值,將600MHz的輸入信號實現在1.667ns週期範圍內進行相位調整。
爲了調整時不出現數據的信號的斷裂或者過分的變化,我們需要對Tap值每次只進行加一或者減一操作,不能一次調整的過大。參考xapp585進行動態相位補償設計,章節:SDR Data Reception with Per-Bit Deskew。

3. ISERDESE2
這裏寫圖片描述
ISERDESE2就是我們的核心模塊了,負責將串行數據轉換爲並行數據。
單個ISERDESE2的位寬只有8bit,而我們的數據是10bit,好在我們可以把兩個ISERDESE2進行級聯實現10bit串並轉換。結構如下圖,將bit8和bit9分別連爲Slave的Q3和Q4。
這裏寫圖片描述

雖然前面通過IDELAYE2對數據的相位進行了調整,數據的建立保持時間都OK,可以正常捕獲串行數據了。但是,OV7251只有一對差分時鐘線和一對差分數據線,而沒有額外的串行數據同步信號線,我們必須對串行數據進行字對齊(對於我們來說,像素數據是10bit,所以是進行10bit對齊)。這就需要使用ISERDESE2中的Bitslip功能模塊了。
Bitslip功能是通過BITSLIP輸入信號來調整數據對齊的,BITSLIP信號的參考時鐘是CLKDIV。每發送一次BITSLIP信號,對齊邊沿就會按照下圖的方式變化,SDR和DDR模式的變化方式不同。
這裏寫圖片描述
OV7251發出的數據是DDR方式,所以是按照上圖右邊的方式進行變化:右移1位,左移3位,右移1位,左移3位……。而前面說到,既然沒有同步信號線,我們就只能夠使用數據線中的同步碼Sync Code去實現字對齊。OV7251的幀格式如下圖,我可以使用編碼3FF 000 000 2AC來實現BITSLIP調整。
這裏寫圖片描述
我的處理方式和熊貓君的方式相同:圖像開始傳輸後,在每一幀中都去搜索固定的同步碼“3FF 000 000 2AC”。如果在這一幀找到了同步碼則表示同步完成,若沒有找到同步碼,則在下一幀開始前觸發一次BITSLIP信號,然後繼續查找。直到找到了同步碼爲止,或者超過了20次BITSLIP仍然沒有找到,則代表同步失敗。

ODELAYE2和OSERDESE2相對來說沒有那麼複雜,就不介紹了。

4. MMCME2_ADV
時鐘

5. BUF
buf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章