1

ビット単位の操作に関する Verilog の動作を模倣しようとしています (つまり、ベクトルのすべてのビットで機能し、1 ビットの回答を出力する操作。

例:

use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
...
signal vect  : std_logic_vector (length -1 downto 0);
signal ans   : std_logic;
signal addin : std_logic;

vect = all '0' の場合、ans を '1' (nor) にしたい

vect = all '1' の場合、ans を '1' にしたい (および)

vect = even num of '1' の場合、 ans を '1' (xor) などにする必要があります。

私は次の関数を作成しました(ここでは1つだけを示しています):

function vand (vect :std_logic_vector) return std_logic is
  variable temp : std_logic;
begin 
  temp := '1';
  for I in (vect'length -1) downto 0 loop
    temp := temp and vect(I);
  end loop;
  return temp;
end;

この関数は、すべてのビットに「AND」を与える必要があります。だから、ここに私の質問があります:

を。そのような操作を行う簡単な方法はありますか?

b. 私はこのように Vand を使用していますif Vand(vect & addin) = '1' do something...が、vect が '0H' で addin が 'H' の場合、条件が満たされ、理由がわかりません。この種の操作が問題になる理由を誰かが考えることができますか? 関数は他の場合でも動作しますが、ここでは急速な変化に対する耐性をテストし、この望ましくない動作を取得しました。

編集

ベクトル「vect」またはベクトル「vect & addin」の長さがわかりません。

編集 2

Vand(vect : std_logic_vector; b: std_logic)オリジナルを使用するサブ関数を作成することで 2 番目の問題を解決しVandました (途中で Vnor にバグが見つかりました)。これら2つの機能よりも優れたソリューションをまだ望んでいます。

4

1 に答える 1