2016-05-19 4 views
1

私はこのコードに問題があります。状態S0は、想定されていなくても、常にアクティブであるようです。この状態の出力は反転しているように見えます(無効にする必要がある場合はアクティブです)。何か案は?最下部のシミュレーションを印刷します。おかげVHDLステートS0は、想定されていないときにアクティブなのはなぜですか?

library IEEE; 
use IEEE.STD_LOGIC_1164.all; 

entity ControlUnit is 
    port(clk   : in std_logic; 
      reset   : in std_logic; 
      validTime  : in std_logic; 
      timeData  : in std_logic_vector(3 downto 0); 
      writeEnable : out std_logic; 
      writeAddress : out std_logic_vector(3 downto 0); 
      averageReady : out std_logic); 
end ControlUnit; 

architecture Behavioral of ControlUnit is 
    type TState is (S0, S1, S2, S3, S4, S5); 
    signal PState, NState: TState; 
begin 

    sync_proc: process(clk, reset) 
    begin 
     if(reset = '1') then 
      PState <= S0; 
     elsif(rising_edge(clk)) then 
      PState <= NState; 
     end if; 
    end process; 

    comb_proc: process(PState, validTime, timeData) 
    begin 
     averageReady <= '0'; 
     writeEnable <= '0'; 
     case PState is 
      when S0 => 
       if(validTime = '1') then 
        writeEnable <= '1'; 
        NState <= S1; 
       else 
        NState <= S0; 
       end if; 
      when S1 => 
       if(validTime = '1') then 
        writeEnable <= '1'; 
        NState <= S2; 
       else 
        NState <= S1; 
       end if; 
      when S2 => 
       if(validTime = '1') then 
        writeEnable <= '1'; 
        NState <= S3; 
       else 
        NState <= S2; 
       end if; 
      when S3 => 
       if(validTime = '1') then 
        writeEnable <= '1'; 
        NState <= S4; 
       else 
        NState <= S3; 
       end if; 
      when S4 => 
       if(validTime = '1') then 
        writeEnable <= '1'; 
        NState <= S5; 
       else 
        NState <= S4; 
       end if; 
      when S5 => 
       averageReady <= '1'; 
       NState <= S0; 
      when others => 
       NState <= S0; 
     end case; 
    end process; 

    with PState select 
     writeAddress <= "0000" when S0, 
          "0001" When S1, 
          "0010" when S2, 
          "0011" when S3, 
          "0100" when S4, 
          "XXXX" when others; 
end Behavioral; 

は、ここでシミュレーションの印刷です:

(クリッカブル)

+2

これは1つのホットエンコーディングのようです(これは合成後のシミュレーションです)。 PState.S0の極性は反転しているように見え、残りは正のように見えます。合成されたハードウェアは極性をまっすぐに保つ必要がありますが、PStateは出力ではありません。正しくシミュレートしますか?あなたは、合成前のシミュレーションを可能にする[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を提供していません。 *どんなアイディアですか?*は質問のために少し広いです。おそらく、あなたが内部を仲間に入れたいのであれば、合成を違ったものにすることができました。 – user1155120

答えて

0

すべてはあなたのコードでokです。なぜあなたはS0状態が常にアクティブであると思いますか?あなたは波形からそれを言うことはできません、なぜならあなたは符号化方式を知らないからです。一方、writeAddress信号の変化は、常に状態マシンが状態を変えることを意味します。

+0

あなたがS0の状態を見てそれを逆転したと考えると、それはそのように見えるはずがない、逆さまですか?私は、S0状態が "デフォルト"であることを意味します...他のどの状態もアクティブでなければ、唯一のアクティブ状態はS0でしたか? 〜100nsでギャップを見れば、アクティブな状態はありません...それは私に少し奇妙に聞こえます –

+0

まず第一に。あなたがどんな状態にいるのか正確に確かめたいなら、その型のenum定義を使わないでください。状態信号は単純なstd_logic_vector型を使用し、自分自身で状態の定数を定義します。ここで私たちは自動列挙型からstd_logic_vectorへの変換を行い、S0状態が "000000"としてエンコードされる可能性があります。リセット信号の直後に波形で表示されます。 –

+0

また、あなたのコードで別の間違いを指摘しておきたい - writeEnableはリセット時に有効です。これは、リセットがアクティブなときにあなたはS0状態にあり、この状態でvalidTime = 1であれば、writeEnも1であるからです。これは私が想定しているものではありません。私はRST_STと呼ばれるもう一つの状態を持つことを提案します。リセット信号がアクティブな場合はその状態を維持し、リセット信号がアクティブでない場合はS0に移動します。だからあなたはwriteEn信号はリセット期間中に作動しません –

関連する問題