2017-03-31 5 views
1

ザイリンクスでは、作成したVHDLコードのラッチを推測しています。私はこれのために考えられる原因を調べ、それが不完全なif文またはcase文のためにしばしばあることを見出した。私は行ってきたし、elseと他のステートメントが含まれていることを確認しましたが、私はまだ警告を受けています。私はこれが私が取り組んでいる別のプロジェクトにも影響していると思うので、なぜこれが当てはまるのか理解したいと思います。ザイリンクスのVHDLラッチ警告のトラブルシューティング

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity state_machine is 
    port(trig, en: in std_logic; cstate,nstate: out std_logic_vector(0 to 2)); 
end state_machine; 

architecture Behavioral of state_machine is 
signal cstate_s,nstate_s: std_logic_vector(0 to 2); 

begin 
cstate <= cstate_s; 
nstate <= nstate_s; 

process(en, cstate_s) 
begin 
    if en = '1' then 
     nstate_s <= "111"; 
     if cstate_s = "111" then 
      nstate_s <= "011"; 
     elsif cstate_s = "011" then 
      nstate_s <= "100"; 
     elsif cstate_s = "100" then 
      nstate_s <= "101"; 
     elsif cstate_s = "101" then 
      nstate_s <= "110"; 
     elsif cstate_s = "110" then 
      nstate_s <= "111"; 
     else 
      null; 
     end if; 
    else 
     null; 
    end if; 
end process; 

process(trig, nstate_s) 
begin 
    if rising_edge(trig) then 
     cstate_s <= nstate_s; 
    else 
     null; 
    end if; 
end process; 

end Behavioral; 

警告:XSTで:737 - 信号のための3ビットのラッチを見つけました。不完全なケースまたはifステートメントからラッチが生成される可能性があります( )。我々は は、 タイミングの問題につながる可能性があるので、FPGA/CPLDデザインでのラッチの使用をお勧めしません。そこについて

+1

nstate_sのif文優先エンコーダ/マルチプレクサが不完全です。条件値 "011"、 "100"、 "101"、 "110"、 "111"をカバーし、ヌルステートメントのelseステートメントがあります。つまり、条件値「000」、「001」、および「010」の場合、ラッチを定義するnstate_sに異なる値をドライバしません。 else caseをcstate_sの現在の値をドライバに変更します。 elseは、trigの立ち上がりエッジで設定された値を保持するcstate_sレジスタに余分です。ヌル・ステートメントを使用することなくデザイン・キャリアを進めることができるはずです。 – user1155120

+1

合成で使用される唯一の値は、バイナリ表現値( '0'、 '1'、 'L'、 'H'は '0'と '1'にマッピングされ、 'Z'はハイインピーダンス状態を推測するために使用されます)です。 else(またはcase othersの選択肢)は、合成のバイナリ値とシミュレーションのためのすべての不特定の値をカバーする必要があります。 2つの用途は互換性がありません。 IEEE Std 1076-2008を参照してください。16.8.2標準ロジックタイプの解釈。金属的な値(U '、' X '、' W '、' - ')を指定する文は合成では無視されます。 – user1155120

答えて

3

組合せプロセスを合成する際に、beginおよびプロセスのすべての出力が割り当てられていないend process;間にパスがあってはならない合成しないラッチできなくします。これはという完全な割り当てと呼ばれます。プロセスの出力は、その内部の任意の場所に割り当てられたsignalです。

このようなパスがあります。 nullステートメントのパスが実行されると、最初のプロセス(nstate_s)の出力はに割り当てられません。したがって、合成されたラッチが得られます。ちょうどnullの声明があることに意味がない。これらのパスで出力にどの値が割り当てられているかを本当に気にしない場合は、'-'に出力を割り当てます。つまり、はVHDLでを気にしません。ところで

trigを仮定すると、クロックである)、2番目のプロセスが、組み合わせではありません(それはシーケンシャルである)ので、あなたは完全な割り当てに従う必要はありません。 elseブランチは不要です。