2017-11-15 2 views
1

信号を事前定義された値のリストと比較して、少なくともこの値と同じ値が存在するかどうかを確認したい(または、同じ値がリスト)。VHDL:複数の値と信号を比較する

例アプリケーション:受信したコマンドを有効なコマンドの事前定義されたリストと比較し、コマンドが無効な場合はエラー状態になります。想像してみれば、有効なコマンドは3つだけです(0x00、0x01、0xFF)。そして、このコードは、仕事をするでしょう:

--valid commands: 0x00, 0x01, 0xFF 

process(clk) is 
--somewhere in the middle of FSM 
    if cmd /= x"00" and cmd /= x"01" and cmd /= x"01" then 
    next_state <= error; 
    end if; 
end process; 

しかし、私は効率的に(スタイルコーディングの面で長いリストの同じものを実装する方法を疑問に思う、手動で各値と比較することなく(すなわちこのような行を書くことを避けてください:)

if cmd=val1 or cmd=val2 or ... or cmd=valN then --imagine N=100 

これは、配列やループと関係があると思いますか?

答えて

3

基準値の配列をループは、おそらく保守が容易である:

subtype ref_value is std_ulogic_vector(7 downto 0); 
type ref_value_array is array (natural range <>) of ref_value; 
constant ref_values: ref_value_array(0 to 2) := (x"00", x"01",...); 
... 
next_state <= error; 
for i in ref_values'range loop 
    if cmd = ref_values(i) then 
    next_state <= no_error; 
    break; 
    end if; 
end loop; 
+0

cmdの有効な選択肢は、明示的であり、他のすべての値が他の人の選択によって覆われているcase文もあります。 – user1155120

+1

@ user1155120多くの選択肢があれば、これはおそらくコンパクトでメンテナンスが容易ではありません。 –

+0

アクションなしの選択肢(エラーに割り当てられていないnext_state)は、 '|'で区切られたref_valueリテラルです。 '、'の代わりに、[最小、完全で、検証可能な例](https://stackoverflow.com/help/mcve)はコンテキストの欠如 - ここでの型と使用の意味 - を示しています。あなたは、質問の例とは異なる値(no_error)を仮定しています。直接的または間接的な列挙値ですか? – user1155120

関連する問題