FPGA 設計之 跨時鐘域的彈性Buffer

2022-05-27     大方老師單片機

原標題:FPGA 設計之 跨時鐘域的彈性Buffer

FPGA設計跨時鐘域Buffer

\\\插播一條:

自己在今年整理一套單片機單片機相關論800余篇

論文製作思維導圖

原理+源代+開題報++外文資料

想要的同學私信找我。

在前面的文章中我們已經介紹了異FIFO的設計原FPGA設計跨時鐘-FIFO)。我們知道為了防FIFO overflow underflow,異FIFO有空滿信號。當滿信號有效時會反壓前級邏輯,不讓其繼續寫數據FIFO內,當空信號有效時,則通知後級邏輯,數據已經全部讀出,不讓其繼續讀FIFO如果我們的應用需求是數據必須不斷流入然後流FIFO呢?這意味著既不能反壓前級也不能通知後級。

Buffer便是應用在這種需求下的一種跨時鐘域的設計方法。本文將從以下幾點介紹彈Buffer:

·Buffer的應用背景

·Buffer與普通異FIFO的區別

·Buffer的具體設計

·Buffer有什麼缺點

Buffer的應用背景

在起初PCI總線設計中,採用的是同步時序結構,即發送端和接收端使用同步時鐘,發送端只需要發送數據,接收端正常採樣即可。這種同步結構要求時鐘到達發送端和接收端的時間精確相同,特別是對總線接pin-to-pinskew要求極高。隨著總線頻率的提升,skew的要求也越來越高,使得時鐘網絡布線越來越困難。

因此,當前的很多高速接口設計,PCIeEthernet都是採用了源同步source-synchronous)時序結構,即發送端同時發送時鐘和數據,接收端需要從接收到的數據中恢復出數據的採樣時鐘,用該時鐘來採樣收到的數據。這種設計方式雖然避免了上述的問題,但是也帶來了新的問題,即跨時鐘域的問題,因為這種設計結構下一般會有兩個時鐘域,Recovered Clock Domain Local Clock Domain。一般來說Recovered Clock Local Clock之間頻率只有些微的差別,彈Buffer便是用來解決這種情況下的跨時鐘域數據傳輸問題的。如1所示:

1 - PCIe器件中使用彈Buffe做跨時鐘域處理

Buffer與普通異FIFO的區別

普通的異FIFO讀寫時鐘不同,隨著數據的不斷寫入或者不斷讀出,最終必然會到達滿或空的狀態,從而停下數據從寫時鐘域向讀時鐘域的流動,直FIFO不再為滿或空。

對於彈Buffe來說,讀寫時鐘之間獨有些微的差別,頻次近似。數據會不斷從寫時鐘域流向讀時鐘域的,為了到達這個目標,彈Buffer會自己丟棄或者插入數據來補償讀寫時鐘之間的頻/相位差。應用彈Buffer的總線協議會定義特定Symbol,假PCIe協議SkipEthernet協議IDLE,這些特殊定義Symbol就能夠被用來丟棄或者插入而不影響正常的數據傳輸。

Buffer的詳細設計

從上一局部的內容我們能夠看出來,彈Buffer相比普通異FIFO主要是增加丟棄或插特殊字符的邏輯,同時也沒有滿空信號。

1G Ethernet協議為例Ethernet協議要求兩個包之間須要發送特殊字IDLE,該字符能夠被彈Buffer用來做時鐘頻/相位的補償。我們的設計10bit位寬的數據,採樣時鐘125M,讀寫時鐘之間允許最高300ppm的頻次差別。

如何考Buffer的深度

+/-300ppm的容忍程度,頻次範圍則是124.9625M~125.0375M之間。以最差情況看,假入寫時鐘124.9625Mhz8.0024ns),讀時鐘125.0375Mhz7.9976ns)。兩者之間時鐘周期的差0.0048ns,也就是說 7.9976/0.0048=1666Cycle會有一次時鐘周期的漂移。

Ethernet最長的包1500bytes計算,一個包會跨 (1500*8)/10=1200Cycle。所以一Ethernet包至多有一次時鐘周期的漂移。假設我們想在每次漂移之後都做時鐘補償,那FIFO的深度4即可,想留一些裕量則能夠考慮更大的深度,816

如何決定是否丟棄或插IDLE字符

FIFO深度4為例。FIFO的正常工作模式下,我們會FIFO總是處在半滿狀態,即2個數據。然後我們設置兩個閾值31。當

【文章福利】:小編整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件裡面,有需要的可以自行添加哦!~點擊綠色通訊軟體搜airuimcu加入。

FIFO內所含的數據大於等3時,我們認為寫時鐘過快,則丟IDLE字符。FIFO內所含的數據數目小於等1時,我們認為讀時鐘過快,需要插IDLE字符。

那麼什麼時候丟棄或插入呢?當然不能在一Ethernet包內,因為這樣會導致數據傳輸錯誤。前面我們已經提到在兩Ethernet包的間隔,協議要求要發IDLE字符,我們可以在間隔期間看IDLE字符後選擇丟棄或插入。

綜上,我們設計的彈Buffer可能會是這樣的一個工作流程:

.FIFO上電後達到半滿狀態

.數據不斷流FIFO再流出FIFO一直處於半滿狀態,所存數據個數2

.一個新Ethernet數據包來臨,在傳輸這個包期間FIFO的讀寫時鐘發生了一次漂移,寫時鐘更快。導FIFO內所存放的數據個數變成3

.Ethernet包傳輸結束,發送端開始發IDLE字符,我們檢測IDLE字符後同時檢FIFO內的數據個數,發FIFO不是半滿,而3

.我們認為寫時鐘快了,則丟棄接下來收到IDLE字符,直FIFO恢復半滿

Buffer就不需要考OverflowUnderflow了麼?

因為我們對彈Buffer的深度設計是基於讀寫時鐘之間ppm差計算的,如果能保證讀寫時鐘ppm差滿足要求,那麼是不用考慮的。

如果無法保證,我們則需要考慮增OverflowUnderflow的判斷,並報Error。一旦出OverflowUnderflow我們認為系統無法正常工作,需要停止運行。

Buffer有什麼缺點

從彈Buffer的設計可以看出,其主要的缺點是會帶來延遲。為了保證彈Buffer在正常情況的半滿狀態,我們需要先將數BufferFIFO中。上文中的設計,彈Buffer會引入至3Cycle,至2Cycle的延遲。

總結

本篇文章主要介紹了用於跨時鐘域的彈Buffer的應用背景和設計原理。

文章來源: https://twgreatdaily.com/zh-cn/211445a241dad7a1d1ca3b5d364fe5e4.html