2016-04-24 9 views
1

有限状態マシンであることをコンパイラに知らせずに、有限状態マシンを設計するVHDLコードを実装するにはどうすればよいですか? 与えられたコードでは、クラス内でFSMをどのように実装したかを見ることができますが、RTLビューアには状態図が示されています。 さらに私の教授は、コンパイラがFSMを認識しないと、設計がより高速になると言いました。VHDL有限状態マシン

library IEEE; 
use IEEE.std_logic_1164.all; 

entity fsm is 
    port (clk, reset, x1 : IN std_logic; 
        outp : OUT std_logic); 
end entity; 
architecture beh1 of fsm is 
    type state_type is (s1,s2,s3,s4); 
    signal state, next_state: state_type ; 
begin 
    process1: process (clk,reset) 
    begin 
    if (reset ='1') then 
     state <=s1; 
    elsif (clk='1' and clk'Event) then 
     state <= next_state; 
    end if; 
    end process process1; 

    process2 : process (state, x1) 
    begin 
    case state is 
      when s1 => if x1='1' then 
         next_state <= s2; 
         else 
         next_state <= s3; 
         end if; 
      when s2 => next_state <= s4; 
      when s3 => next_state <= s4; 
      when s4 => next_state <= s1; 
    end case; 
end process process2; 

process3 : process (state) 
    begin 
     case state is 
      when s1 => outp <= '1'; 
      when s2 => outp <= '1'; 
      when s3 => outp <= '0'; 
      when s4 => outp <= '0'; 
     end case; 
end process process3; 
end beh1; 
+4

なぜコンパイラがコード構造をFSMとして認識できるのか? –

+0

なぜ誰かがこれをしたいですか?ヒント1:多くのツールが、使用された信号によってFSMを認識します。したがって、あなたの状態に列挙型を使用しないでください。ヒント2:ほとんどのツールでFSM抽出を無効にすることができます。 Hint3:FSMはパターンマッチングによって認識されます。したがって、サポートされていないパターンを使用するか、2/3プロセス形式を使用しないでください。状態図ではなくRTLビューアでFSMのRTLビューを表示するという目標はありますか? – Paebbels

+0

私の教授は、コンパイラの用量がFSM – user3159792

答えて

0

ステートマシンを合成する際の合成コンパイラは、いくつかのエンコーディングから選ぶことができますので、ステートマシンの抽出が無効になっている場合に合成されたデザインがneccessarily速くなったり、小さくありません。 "Assignments" - > "Settings" - > "Analysis &合成設定" - > "詳細設定" - > "VHDLステートマシンの抽出"でステートマシン抽出をオフにすることができます。

まず、抽出がオンになっているデフォルト設定から始めましょう。 例えば、Cyclone IV FPGAを使用する場合、合成コンパイラはステートマシンに対してワンホットエンコーディングを選択します。コンパイルレポートの "Analysis & Synthesis" - > "State Machines"に表示されます。 4つの組み合わせ機能(LUT)と3つのロジック・レジスタが必要です。

Netlist with FSM extraction (クリック可能): - >「ネットリスト・ビューワ」 - >「技術地図ビューア(マッピング後)」のデザインの速さの第1の推定値は、合成されたネットリストにアクセスメニューから「ツール」から推定することができます

我々が見るように、最大​​ある:

  • 1任意の二つのレジスタ間のロジックレベル入力と、レジスタ間のロジックの
  • 1レベルbetwロジックの
  • 1レベル出力とレジスタを指定することができます。

したがって、最終的なタイミングはルーティング遅延に依存するだけです。

FSM抽出を無効にすると、stateが2進数で符号化されるため、2つのLUTと2つのレジスタしか必要ありません。ネットリストは、次のようになります。

Netlist without FSM extraction (クリッカブル)

小さな改善がありました:出力は今、直接レジスタstate[1]で駆動することができます。だからあなたのデザインは現在、より小さなクロック出力時間を持つようになります。

ここでは、ステートマシンの抽出をオフにした後で改善が可能でした。しかし、実際にはタイプstate_typeの実際のエンコーディングに依存するため、これは一般的ではありません。我々は無効FSM抽出を残すとするstate_typeの宣言を変更する場合:3個のLUTと2個のレジスタが必要とされ、レジスタと出力との間論理1レベル:

type state_type is (s3,s1,s2,s4); 

そして合成結果が悪い再度あります。

関連する問題