我們正在實施VHDL以太網MAC控制器..在FSM中處理異步信號的正確實現是什麼?
開始的,這裏是我的代碼的代碼片斷..
-- next state
PROCESS(p_state, phy_start, phy_ctr, phy_clk)
BEGIN
CASE p_state IS
WHEN sIDLE =>
IF(phy_start = '1' or rising_edge(phy_start)) THEN
n_state <= sPRE;
ELSIF(phy_start'event AND phy_start='0') THEN
n_state <= n_state;
ELSE
n_state <= sIDLE;
END IF;
............
的問題是,我的教授告訴我有關phy_start爲在rising_edge()中的時鐘信號必須僅與僅一個phy_clk時鐘相關聯。我想要發生的是當phy_start斷言時,它會在下一個時鐘週期進入sPRE狀態。斷言在時鐘的上升沿完成。我曾嘗試
PROCESS(p_state, phy_start, phy_ctr, phy_clk)
BEGIN
CASE p_state IS
WHEN sIDLE =>
IF(phy_start = '1') THEN
n_state <= sPRE;
ELSIF(phy_start'event AND phy_start='0') THEN
n_state <= n_state;
ELSE
n_state <= sIDLE;
.............
,但它不進入phy_start =「1」,因爲它在過渡發生。(還有就是我們所說的建立時間,其中的數據必須是穩定的,持續時間,以便被正確地讀取)。那麼正確的實施是什麼?或者,如果斷言發生在上升沿,或者phy_start必須在時鐘的下降沿斷言,我別無選擇,只能斷言2個時鐘週期的phy_start。此外,下一個狀態邏輯的正確靈敏度列表是什麼?
什麼是應在NRESET? – Xegara
您通常需要在開始時重置信號,以便從衆所周知的配置開始。通常情況下,復位信號爲低電平有效,復位信號反相。出於這個原因,我把它稱爲nreset(取消重置)。在這裏,您可以簡單地刪除它,但對於其他類型的設計,如果您在開始時沒有重置狀態,則會出現一些嚴重問題。 – Scola
當它在時鐘的上升沿聲明時,phy_start的值會如何,因爲您設計了一個邏輯,就像您提供的一樣? – Xegara