1. 程式人生 > >三叔學FPGA系列之二:Cyclone V中的POR、配置、初始化,以及復位

三叔學FPGA系列之二:Cyclone V中的POR、配置、初始化,以及復位

對於FPGA內部的復位,之前一直比較迷,這兩天仔細研究官方資料手冊,解開了心中的諸多疑惑,感覺自己又進步了呢.....

 一、關於POR(Power-On Reset )

FPGA在上電工作時,會先進入復位模式,將所有RAM位清除,並通過內部弱上拉電阻將使用者I/O置為三態。接著依次完成 配置、初始化工作,如果這一切都順利,就進入使用者模式,FPGA會根據使用者所編寫的時序邏輯開始工作。

二、FPGA上電工作過程詳解

從第一條我們知道,FPGA從上電到進入使用者模式,會有一個過程。就不放時序圖噁心人了,直接上乾貨,如圖1所示。

圖1

過程詳解

  1. 上電觸發一個復位事件,拉低nCONFIG、nSTATUS、CONF_DONE、INIT_DONE引腳,清除RAM位,三態使用者I/O,進入復位;
  2. 復位過程中,控制邏輯檢測所有供電電壓,當他們在規定時間達到規定值,並穩定下來,則進入配置,否則就需要使用者通過重新拉低nCONFIG足夠時間等待電壓達標,優秀的電源設計對數位電路是很重要的;
  3. 復位順利完成,則依次釋放nCONFIG、nSTATUS,讓它們被上拉電阻拉高,進入配置,配置模式必須和MSEL[4:0]的設定必須匹配,編寫的邏輯電路由quartus生成配置檔案,在這個時候燒寫到FPGA中,這過程叫做配置,常用的配置方式有JTAG線上模式,和EPCS/EPCQ配置模式;
  4. 配置成功,則釋放CONF_DONE,進入初始化,初始化是按照使用者意圖將各暫存器置位成預期值;
  5. 初始化完成,則釋放INIT_DONE,進入使用者模式,系統按照既定時序開始運轉。

*****注意*****

  • 電源不穩,後面一切免談,電源質量好,後面一切應該也順利;
  • 設計硬體電路時,nCONFIG、nSTATUS、CONF_DONE必須上拉,因為初始化完成就萬事大吉了,所以INIT_DONE不用管,配置完成後當做普通I/O用;
  • MSEL[4:0]設定;
  • 設計硬體電路時,要注意配置FLASH和FPGA連線,以及JTAG埠的設計,硬體錯了就白瞎;

三、關於FPGA的復位

如前所述,我們已經知道,每次上電工作,FPGA必定進行復位、初始化等操作。所以理論上,後續工作工程中,FPGA是不需要復位的,尤其是全域性復位。但是,一方面為了保險起見應該進行區域性復位和暫存器初始化(在時序過程中的任意時刻賦值),保證暫存器中的值是我們期望的值,而且某些IP核在工作前也必須復位;另一方面,電路中難免出現亞穩態等,使系統工作異常,這就需要形成一種機制,觸發一個復位事件,使系統進入 “復位—>配置—>初始化—>使用者模式” 這一過程。

所以有:

  1. 在 “三叔學FPGA系列之一:Cyclone V中的時鐘資源” 一文中一提到,全域性時鐘佈線資源通常非常有限,而全域性復位用的也是全域性時鐘的佈線資源,所以能不用全域性復位儘量別用,用區域性復位就行了,也就是不要在所有always中都用同一個rst_n,可以通過內部邏輯生成多個區域性復位訊號rstn0,rstn1,rstn2.....
  2. 在硬體電路設計時,Cyclone V以前的FPGA都有RESET引腳,但設計手冊中別沒有說這個引腳一定要用作復位,可以當做普通I/O用,在Cyclone V中RESET引腳被取消了。我的理解是:RESET引腳的作用有兩點,一是為了在系統執行過程中出現異常時,可以手動按鈕之類的觸發一個復位事件,使系統復位;二是採用電容延時的方式,強制增加上電覆位時間,確保復位成功。當上訴兩方面都沒有太大必要的情況下,RESET引腳就沒什麼用了,所以Intel牛B,在Cyclone V中直接去掉RESET引腳(個人猜想,未到技術區求證);
  3. 再次說明,RESET≠全域性復位,實現全域性復位有一萬種方法,比如通過內部邏輯,或者通過matlab控制串列埠等等;
  4. 關於是否使用全域性復位,網上眾說紛紜,Intel也沒有官方說法。我的理解是,看個人的系統情況。比如:全域性時鐘本來就緊張,那麼就pass全域性復位,用區域性復位,反之資源充足,用全域性復位。

四、驗證後再來更新

關於第三節的內容,很多都是我個人的猜想,但是也是參考了官方手冊,以及個人專案開發中的經驗,準確率十之八九,後續驗證後再來更新。