VHDL:ベクトルのビットをOR演算する


11

ベクトルのビットを一緒にORしたい。だから私は呼ばれるベクトルを持っていて、example(23 downto 0)すべてのビットを別のベクトルにORしたいのですが、これを行う方法はありませんexample(0) or example(1) or ...example(23)か?


代わりに単にゼロと比較できますか?同じ効果があります。
David

Davidのコメントを拡張するには(32ビットベクトルを使用):or_result <= '0' when input=X"00000000" else '1';問題のベクトルの長さに一致するようにゼロの数を変更します。

ロジック減少は見、VHDL 2008年に提供されていますstackoverflow.com/questions/20296276/...
Moberg

また、あなたは、より一般的な方法を使用することができます:result <= '0' when (example=(example'range=>'0')) else '1';
ミゲルリスコ

回答:



5

Verilogには、ユーザーが求めていることを正確に実行する便利な「簡約演算子」があります。ベクトルの|example[23:0]すべてのビットをOR 演算した結果が得られますexample

残念ながら、VHDLにはこの演算子がありません。よるとcomp.lang.vhdlよくある質問、しかし

ベクトルのすべてのビットに対してリダクション演算を実行するための事前定義されたVHDL演算子はありません(たとえば、ベクトルのすべてのビットを「または」に)。ただし、簡約演算子は簡単に実装できます。

[「X」と「Z」の値を処理しない例をスキップする]

    function or_reduce( V: std_logic_vector )
                return std_ulogic is
      variable result: std_ulogic;
    begin
      for i in V'range loop
        if i = V'left then
          result := V(i);
        else
          result := result OR V(i);
        end if;
        exit when result = '1';
      end loop;
      return result;
    end or_reduce;
    ...
    b <= or_reduce( b_vec ); 

誰が反対票を投じたとしても、その理由を説明してください。
フォトン

これは合成可能ですか?
ヨハネスシャウブ-litb 2017

もちろん、@ JohannesSchaub-litbは、非常に大きなORゲート(またはより小さなもののツリー)に合成できます。おそらく、標準ライブラリのバージョン(Aaron D. Marascoの回答)は、その場で生成されるものよりも最適化されています。
フォトン2017

VHDL-2008には単項縮約演算子があります。FAQは古くなっています。さらに、提示された機能は疑わしい合成可能性を備えています。これは、一部のツールがチョークする可能性があり、シミュレーションのマイクロ最適化として以外は必要ない早期終了のためです。
KevinThibedeau、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.