1

シグナルを複数のシグナルと同時に比較するためのコードを書いています。

次に例を示します。

process (CLK, reset)
if reset = '0' then
    data <= (others => '0');
elsif rising_edge (CLK) then 
    if A = B then
         data <= data OR "0001";
    else data <= data AND "1110";
    end if;

    if A = C then
        data <= data OR "0010";
    else data <= data AND "1101";
    end if;

    if A = D then
        data <= data OR "0100";
    else data <= data AND "1011";
    end if;

    if A = E then
        data <= data OR "1000";
    else data <= data AND "0111";
    end if;
end if;
end process;

A と B、C、D、および E の信号を比較し、データ内の関連するビットをオンまたはオフにしたいだけです。合成ツールは B、C、および D の if ステートメントを最適化し、E if ステートメントのみを残すため、上記のコードは機能しません。case - when ステートメントを使用することも考えましたが、関連する単一ビットをオフにするメカニズムがありません。他の人が4ビットすべてをオフにすることしかできない場合。これを行う効果的な方法は何ですか?ありがとう!

ところで、これら 4 つの if ステートメントはすべて同時に実行されますか? それとも、異なるサイクルで実行されますか? それらは1つずつ実行されると思います。そうしないと、ファンインが発生します。

4

1 に答える 1

2

あなたは、必要のない言語で C を書こうとしています! C では単一のビットにアクセスすることはできず、バイトとそれ以上の単位にしかアクセスできないため、C プログラマーは AND/OR、つまり &,| に頼る必要があります。ビットを設定またはクリアします。

VHDL では、ワードの個々のビットをアドレス指定し、

if A = B then
     data(0) <= '1';
else 
     data(0) <= '0';
end if;

はるかに簡単です。そして、はい、それらはすべて同時に、すべてのクロックサイクルで実行されます。

データをブール値の配列として宣言したいのですが、

signal data : array(3 downto 0) of boolean;

それから私は書くことができました

process (CLK, reset)
begin
   if reset = '0' then
      data <= (others => false);
   elsif rising_edge (CLK) then 
      data <= (A = E) & (A = D) & (A = C) & (A = B);
   end if;
end process;

に std_logic_vector を使用する必要がある場合data、この形式の便利さは (ほぼ) 魅力的であり、A の型の "=" 演算子を std_logic を返すものでオーバーロードするのに十分です。その後、小さな関数を作成する代わりに、このコードを保持することができました。

編集:元のアプローチが機能しない理由に対処するには、例としてここで説明されているように、シグナル割り当てのセマンティクスを理解する必要があります。

そのため、Data への最初の割り当て (A=B の場合) は、プロセスが中断した後に発生するように格納されます。次に、2 番目の割り当てが BEFORE IT HAPPENED に置き換わるため、最初のそのような割り当ては行われません。

元のアプローチが機能するために必要なのは、変数の割り当てがすぐに行われるため、変数です。

process (CLK, reset)
    variable data_int : whatever; -- same type as data
begin
if reset = '0' then
    data <= (others => '0');
elsif rising_edge (CLK) then 
    data_int := data;
    if A = B then
         data_int := data_int OR "0001";
    else data_int := data_int AND "1110";
    end if;
    ...
    if A = E then
         data_int := data_int OR "1000";
    else data_int := data_int AND "0111";
    end if;

    data <= data_int;

end if;
end process;

これで、単一の割り当てにdata個別の変更がすべて含まれます。ただし、最適解よりもはるかに大きなものに統合される可能性があります。

于 2013-04-30T20:46:53.133 に答える