記于:2020.6.29
概述:在FPGA設計中,異步信號是我們需要重點照顧的,很多不起眼的(缺乏我們仔細思考處理的)信號,往往會給我們的設計帶來揮之不去的隱患,沒錯,就是那種時不時出現的小問題,你想他出現的時候,它不一定出現,但是,在你想早點下班的時候,它卻會不經意出現,在這個筆記里邊,我將講述一個處理一個外部輸入異步信號的程序,
程序:
在我們的一個產品中,需要用到一個母板以及一個子板,各自有一個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數位寬比較多的時候,這種方法就不適用了,方法三、如果使用格雷碼的狀態機,應該可以避免這個問題的,但是由于該狀態機牽涉到的東西比較多,所以還是作罷,
這樣,由于這兩個信號的異步處理而引起的問題消失了,
感想:如何處理異步信號,方法上,我們肯定聽過很多,也知道出現這些情況應該怎么處理,但是,當我們設計的時候,很容易忽略這些處理方法,或者說,我們沒有挨過板子,就不會把這些設計原則記在心里,在我們可以進行代碼設計的時候,需要盡可能的按照前人總結的原則,不要走不必要的彎路,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/433.html
標籤:Verilog
