2013-10-14 90 views
2

在VHDL中,我可以更新使用同一變量的case語句內的變量嗎? case語句位於rising_edge(clk)塊內。謝謝。在case語句中使用變量,VHDL

    case State_var is 
        when "00" => 
         if (Valid= '1') then 
          State_var := "00"; 
         else 
          State_var := "01"; 
         end if; 
        when "01" => 
         if (Valid = '1') then 
          State_var := "00"; 
         else 
          State_var := "10"; 
         end if; 
        when "10" => 
         if (Valid = '1') then 
          State_var := "11"; 
         else 
          State_var := "01"; 
         end if; 
        when "11" => 
         if (Valid = '1') then 
          State_var := "11"; 
         else 
          State_var := "10"; 
         end if; 
        when others => null; 
       end case; 
+2

是的。 (額外字符...) –

回答

-2

爲什麼在狀態機中使用變量?一個狀態機應該是一個已註冊的信號,這就是狀態機的要點。我不推薦在這裏使用一個變量。它會產生很多額外的組合解碼邏輯,並可能有一些競爭條件。

+1

如果您考慮到不同的賦值語義,State的變量可以很好地工作!特別是在這裏 - 對變量進行一次測試 - 解碼邏輯從何而來?畢竟,您可以使用變量創建寄存器 - 從而聲明狀態。信號在變量上的最大優勢在於某些模擬器不會顯示變量 –

+0

@BrianDrummond對於狀態信號,我們可以將狀態機分成兩部分(組合邏輯和時序邏輯),有時候使狀態機的結構更加清晰和可維護。 – 2013-10-15 02:57:47

+0

@Wisatbff - 聲稱它更清晰「你的」方式是有爭議的...... :) –

2

這樣做沒有問題 - 我一直這樣做。

case選擇基於當前狀態變量的值計算一次,並且您對狀態變量所做的更新不會導致case語句立即轉換到新狀態。

2

是的,你可以。您也可以僅使用case聲明:

process(...) 
... 
variable state: std_logic_vector(2 downto 0); 
... 
begin 
... 
state := Valid & State_var; 
... 
    case state is 
      when "000" => State_var := "01"; 
      when "001" => State_var := "10"; 
      when "010" => State_var := "01"; 
      when "011" => State_var := "10"; 
      when "100" => State_var := "00"; 
      when "101" => State_var := "00"; 
      when others => State_var := "11"; 
    end case; 
... 
end process;