FPGA如何處理--器件數據傳輸的異步處理

  記於:2020.6.29異步

  概述:在FPGA設計中,異步信號是咱們須要重點照顧的,不少不起眼的(缺少咱們仔細思考處理的)信號,每每會給咱們的設計帶來揮之不去的隱患。沒錯,就是那種時不時出現的小問題,你想他出現的時候,它不必定出現。可是,在你想早點下班的時候,它卻會不經意出現。在這個筆記裏邊,我將講述一個處理一個外部輸入異步信號的過程。測試

  過程:spa

  在咱們的一個產品中,須要用到一個母板以及一個子板,各自有一個FPGA芯片做爲信號處理傳輸的中心。這兩個FPGA之間,使用同一個狀態機(3個狀態,使用2bit),分別是idle狀態(00),load狀態(01),rtx狀態(10)。從母板到子板使用的是2個普通的信號線鏈接,使用的是3.3v信號線,子板跟母板使用的時鐘信號都是100MHz。該信號在子板中使用,做爲重要的狀態機信號,離職的工程師是直接的將該信號直接使用,甚至都沒有將這個輸入信號buffer一下。設計

  那麼,現象是什麼樣子的呢?那就是在產品作高低溫的時候,常常會採集的信號抖動(消失)。其實,如今回過頭來,能夠考慮獲得,確定是採集這個時間段的信號出現了異常。可是,因爲整個信號鏈路比較長,咱們也懷疑過是否其餘模塊的輸出或者開關引發的干擾問題引發的。事實上,我接手後,在處理高低溫的問題上,開始也是焦頭爛額,這個工程的可維護性實在太差了。頂層使用的是quartus的圖像界面,像硬件同樣的連線的,那麼能夠想象的是,他確定沒有對這個設計作仿真的。而後,代碼的整潔、規範、註釋,確定是沒有的,想都不要想。上一個離職的工程師接手過來,兩年了都不敢改動一點,就算是改動了,也過不了高低溫測試,也就是沒法轉產。好吧,離題了。總之,在驗證高低溫的過程當中,出現問題的緣由可能不少。調試

  在我檢查外部輸入信號的時候,我發現這些信號都沒有作輸入輸出的io_buffer,那不用多說了,先加上,穩妥一些。事實上,爲這兩根信號I_fsm_state加上輸入輸出buffer以後,高低溫出現問題的機率(特別是低溫)的狀況明顯減小了。原來在10臺儀器中,通常會有8臺高低溫問題,如今可能變成了3/10臺有問題。固然出現高低溫問題的緣由還有其餘的,好比ADC的數據採樣同步問題,這個是另一個話題。當我處理完其餘問題以後,也試過一次測試10臺高低溫,所有經過的狀況。當我自覺得是沒有問題以後,在接下來的一年裏邊,大概是兩三個月,質檢人員會拿一臺兩臺儀器過來給我說是低溫問題,在-10度的左右的時候出現系統信號混亂不正常的狀況,等到問題升高幾度,又會恢復正常。這種狀況,由於自己機器從-10度的冰箱裏邊拿出來,開機十幾分鍾後,機器自己會發熱,溫度天然會上去,所以這不算是嚴重問題,也不會影響使用,加上出現的狀況極少,所以我也就敷衍過去了,總的來講,我是沒有更多的頭緒,以及充足的時間來解決這個問題,畢竟出現問題的時間仍是很短的。資源

  根本因素出現了:同步

  然而,我在調試另外另一個新板子的時候,意外的發現,這個I_fsm_state[1:0]信號,跳轉竟然出現這種狀況: 01 01 01 01 01 00 10 10 10 10 10;實際上,這個狀態機的跳轉,應該是01 01 01 01 01 10 10 10 10.也就是說,只有從01->10的狀況,沒有從01->00的這個設計的。當我檢查是否有buffer,以及將I_fsm_state打兩拍以後再使用,狀況仍是同樣。這時候,我就考慮,這兩個信號從不一樣的IO出來,通過排插走線,在100MHz的時鐘下,是否可以徹底的同步呢,也便是I_fsm_state[0]須要從1->0,  以及I_fsm_state[1]須要從 0->1 ,這兩個信號可否徹底同步的跳轉呢。在理想狀況下,是能夠的,可是實際上,這兩個FPGA的時鐘是同頻異步的,這個兩個信號通過不一樣的物理走線,不免會出現延時不一致的狀況。所以,出現不一樣步反而是必然的狀況。產品

  那麼,既然問題的可能緣由找到了,那麼問題很好解決了。方法也是多種多樣的,我想到的方法一,使用時鐘進行跟FIFO作跨時域處理,這個是經常使用的方法,可是須要添加時鐘信號又要浪費信號線,使用FIFO,總以爲仍是浪費了一些資源。方法二,增長一些同步狀態機邏輯,至關於去抖電路,例如當信號從01->10的時候,若是出現00,則不進行處理,保證狀態機的順序是正常的,不會中間出現01 01 00 10 10的這種狀況,畢竟兩個板子出現一個週期的跳動對系統沒有影響。所以,我選擇了方法二,可是,這種方法不是必然合適,當須要處理的bit數位寬比較多的時候,這種方法就不適用了。方法3、若是使用格雷碼的狀態機,應該能夠避免這個問題的,可是因爲該狀態機牽涉到的東西比較多,因此仍是做罷。it

  這樣,因爲這兩個信號的異步處理而引發的問題消失了。io

  感想:如何處理異步信號,方法上,咱們確定聽過不少,也知道出現這些狀況應該怎麼處理。可是,當咱們設計的時候,很容易忽略這些處理方法,或者說,咱們沒有捱過板子,就不會把這些設計原則記在內心。在咱們能夠進行代碼設計的時候,須要儘量的按照前人總結的原則,不要走沒必要要的彎路。

相關文章
相關標籤/搜索