對於FPGA內部的復位,之前一直比較迷,這兩天仔細研究官方數據手冊,解開了心中的諸多疑惑,感覺自己又進步了呢.....
原創不易,轉載請轉原文,注明出處,謝謝。
一、關於POR(Power-On Reset )
FPGA在上電工作時,會先進入復位模式,將所有RAM位清除,並通過內部弱上拉電阻將用戶I/O置為三態。接着依次完成 配置、初始化工作,如果這一切都順利,就進入用戶模式,FPGA會根據用戶所編寫的時序邏輯開始工作。
二、FPGA上電工作過程詳解
從第一條我們知道,FPGA從上電到進入用戶模式,會有一個過程。就不放時序圖惡心人了,直接上干貨,如圖1所示。
圖1
過程詳解
- 上電觸發一個復位事件,拉低nCONFIG、nSTATUS、CONF_DONE、INIT_DONE引腳,清除RAM位,三態用戶I/O,進入復位;
- 復位過程中,控制邏輯檢測所有供電電壓,當他們在規定時間達到規定值,並穩定下來,則進入配置,否則就需要用戶通過重新拉低nCONFIG足夠時間等待電壓達標,優秀的電源設計對數字電路是很重要的;
- 復位順利完成,則依次釋放nCONFIG、nSTATUS,讓它們被上拉電阻拉高,進入配置,配置模式必須和MSEL[4:0]的設置必須匹配,編寫的邏輯電路由quartus生成配置文件,在這個時候燒寫到FPGA中,這過程叫做配置,常用的配置方式有JTAG在線模式,和EPCS/EPCQ配置模式;
- 配置成功,則釋放CONF_DONE,進入初始化,初始化是按照用戶意圖將各寄存器置位成預期值;
- 初始化完成,則釋放INIT_DONE,進入用戶模式,系統按照既定時序開始運轉。
*****注意*****
- 電源不穩,后面一切免談,電源質量好,后面一切應該也順利;
- 設計硬件電路時,nCONFIG、nSTATUS、CONF_DONE必須上拉,因為初始化完成就萬事大吉了,所以INIT_DONE不用管,配置完成后當做普通I/O用;
- MSEL[4:0]設置;
- 設計硬件電路時,要注意配置FLASH和FPGA連接,以及JTAG端口的設計,硬件錯了就白瞎;
三、關於FPGA的復位
如前所述,我們已經知道,每次上電工作,FPGA必定進行復位、初始化等操作。所以理論上,后續工作工程中,FPGA是不需要復位的,尤其是全局復位。但是,一方面為了保險起見應該進行局部復位和寄存器初始化(在時序過程中的任意時刻賦值),保證寄存器中的值是我們期望的值,而且某些IP核在工作前也必須復位;另一方面,電路中難免出現亞穩態等,使系統工作異常,這就需要形成一種機制,觸發一個復位事件,使系統進入 “復位—>配置—>初始化—>用戶模式” 這一過程。
所以有:
- 在 “三叔學FPGA系列之一:Cyclone V中的時鍾資源” 一文中一提到,全局時鍾布線資源通常非常有限,而全局復位用的也是全局時鍾的布線資源,所以能不用全局復位盡量別用,用局部復位就行了,也就是不要在所有always中都用同一個rst_n,可以通過內部邏輯生成多個局部復位信號rstn0,rstn1,rstn2.....
- 在硬件電路設計時,Cyclone V以前的FPGA都有RESET引腳,但設計手冊中別沒有說這個引腳一定要用作復位,可以當做普通I/O用,在Cyclone V中RESET引腳被取消了。我的理解是:RESET引腳的作用有兩點,一是為了在系統運行過程中出現異常時,可以手動按鈕之類的觸發一個復位事件,使系統復位;二是采用電容延時的方式,強制增加上電復位時間,確保復位成功。當上訴兩方面都沒有太大必要的情況下,RESET引腳就沒什么用了,所以Intel牛B,在Cyclone V中直接去掉RESET引腳(個人猜想,未到技術區求證);
- 再次說明,RESET≠全局復位,實現全局復位有一萬種方法,比如通過內部邏輯,或者通過matlab控制串口等等;
- 關於是否使用全局復位,網上眾說紛紜,Intel也沒有官方說法。我的理解是,看個人的系統情況。比如:全局時鍾本來就緊張,那么就pass全局復位,用局部復位,反之資源充足,用全局復位。
四、驗證后再來更新
關於第三節的內容,很多都是我個人的猜想,但是也是參考了官方手冊,以及個人項目開發中的經驗,准確率十之八九,后續驗證后再來更新。
關於上述疑問,2018年11月3日續更
- 硬件設計沒問題,時鍾沒問題,電源也沒問題,理論上FPGA系統已經可以正常復位、配置、初始化、並工作了,接下來就邏輯設計的優劣問題;
- 有了第1條,FPGA中確實沒必要使用全局復位,對於需要復位的模塊,通過一定方法讓它產生一種錯誤反饋機制,並觸發一個局部復位就行了;
- 全局時鍾都干掉了,專門的復位引腳也沒有太大意義,它的作用不同於POR中的復位,僅僅是在已經初始化並進入用戶模式的FPGA中產生一個復位信號而已,並不能起到上電復位的效果,這個效果,有局部復位就搞定了!要是系統死機了,復位引腳也無能為力,這需要可靠的邏輯電路設計來保障!
- 還是那句話,資源充足的土豪根本不需要糾結,隨意作!我這么深究也是作,加深理解沒錯~
關於上述疑問,2018年11月21日續更
- 經過驗證,全局復位信號是必須的,全局復位引腳非必須(可用內部電路代替);
- 全局復位是為了等到所有寄存器被初始化賦值並穩定下來,再按照時鍾整齊划一地讀寫,否則必定產生亞穩態,因為時鍾的穩定必定先於寄存器的穩定;
- 上述內容已在cyclone V中已驗證,延時時間要具體看工程復雜度、需要初始化的寄存器數量==,復位時間不夠,必定產生亞穩態;
- 為了踩平這個坑,花了我兩天時間。。。但是值!
- 亞穩態往往是萬惡之源,切記切記。

