簡體   English   中英

為什么不在VHDL中使用雙進程狀態機?

[英]Why not a two-process state machine in VHDL?

當我學習如何在VHDL中表達有限狀態機時,它采用了雙進程架構。 一個進程處理時鍾/復位信號,另一個進程處理更新狀態和輸出的組合邏輯。 一個例子如下。

我已經看到這種風格受到批評(例如,參見這個問題的評論和答案),但從未詳細說明。 我想知道這背后是否存在客觀(ish)原因。

是否有技術原因可以避免這種風格? Xilinx的合成器似乎將其檢測為狀態機(您可以在輸出中看到它並驗證轉換),但其他人是否在努力解決它,或者生成質量差的實現?

這不是慣用的VHDL嗎? 記住要避免基於意見的答案; 如果它不是慣用的,是否有廣泛使用的教學資源或參考使用不同的風格? 習慣風格也可以存在,因為,例如。 有一些錯誤很容易用正確的風格捕獲,或者因為代碼結構可以更好地表達問題域,或者出於其他原因。

(請注意,我不是要求定義或演示不同的樣式,我想知道是否有客觀原因要特別避免雙過程實現。)

一些示例可以在Free Range VHDL (p89)中找到。 這是一個非常簡單的例子:

library ieee;
use ieee.std_logic_1164.all;

-- Moore state machine that transitions from IDLE to WAITING, WAITING
-- to READY, and then READY back to WAITING each time the input is
-- detected as on.
entity fsm is
    port(
        clk    : in std_logic;
        rst    : in std_logic;
        input  : in std_logic;
        output : out std_logic
    );
end entity fsm;

architecture fsm_arc of fsm is
    type state is (idle, waiting, ready);
    signal prev_state, next_state : state;
begin
    -- Synchronous/reset process: update state on clock edge and handle
    -- reset action.
    sync_proc: process(clk, rst)
    begin
        if (rst = '1') then
            prev_state <= idle;
        elsif (rising_edge(clk)) then
            prev_state <= next_state;
        end if;
    end process sync_proc;

    -- Combinatorial process: compute next state and output.
    comb_proc: process(prev_state, input)
    begin
        case prev_state is
            when idle =>
                output <= '0';
                if input = '1' then
                    next_state <= waiting;
                else
                    next_state <= idle;
                end if; 
            when waiting =>
                output <= '1';
                if input = '1' then
                    next_state <= ready;
                else
                    next_state <= waiting;
                end if;
            when ready =>
                output <= '0';
                if input = '1' then
                    next_state <= waiting;
                else
                    next_state <= ready;
                end if;
        end case;
    end process comb_proc;
end fsm_arc;

(請注意,我現在無法訪問合成器,因此可能會出現一些錯誤。)

我總是推薦單進程狀態機,因為它避免了兩類與初學者非常相似的基本錯誤:

  1. 組合過程的敏感性列表中缺少項目會導致模擬行為異常。 它甚至可以在實驗室中使用,因為大多數合成器都不關心靈敏度列表。
  2. 使用其中一個組合結果作為輸入而不是注冊版本,導致非時鍾循環或僅長路徑/跳過狀態。

不太重要的是,組合過程降低了模擬效率。

不太客觀,我發現它們更容易閱讀和維護; 它們需要更少的鍋爐板,我不必保持靈敏度列表與邏輯同步。

我看到的唯一兩個客觀原因是關於摩爾狀態機的可讀性和仿真效率(主要輸出僅取決於當前狀態,而不是主要輸入)。

可讀性 :如果您在單個流程輸出和下一個狀態計算中合並在一起,則可能更難以閱讀/理解/維護,而不是針對單獨的關注點使用單獨的組合流程。

模擬效率 :在2過程解決方案中,您的組合過程將在每個主要輸入和/或當前狀態變化時觸發。 這對於計算下一個狀態而不是計算輸出的部分的過程部分是有意義的。 后者只能在當前狀態變化時觸發。

參考文獻中有詳細說明。 [1]如下。 首先,FSM分為3類(第一次完成),然后對每個類別進行徹底檢查,並提供許多完整的示例。 對於類別1(常規)有限狀態機,您可以在第107-115頁找到問題的確切答案; 第2類(定時)機器的第185-190頁; 對於類別3(遞歸)狀態機,請參見第245-248頁。 在三個類別中的每個類別中都詳細描述了Moore和Mealy版本的模板。

[1] V. Pedroni,硬件中的有限狀態機:理論與設計(使用VHDL和SystemVerilog),麻省理工學院出版社,2013年12月。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM