2

if (...) then ... end if; で確認するにはどうすればよいですか。std_logic_vector 変数が負の数のビットを保持する場合の構築? 負の場合は、ゼロの値を割り当てる必要があります。私は持っている :

signal sum : std_logic_vector (15 downto 0);
sum<= (...);
if (...) then
   sum<=x"00";
end if;

ありがとうございました!

4

3 に答える 3

5

STD_LOGIC_VECTOR言語は実行すべき演算について何も知らないため、2 つの を加算することはできません。これは、合成ツールにとって、として宣言されているすべての信号/ポート/変数が、多値論理型のSTD_LOGIC_VECTOR配列にすぎないためです。STD_LOGICそのような型の算術演算は意味がありません。

で公開されているものと同様のインターフェイスを持つ型で算術演算を使用する場合は、で定義されている (符号付き算術演算の) 型と(符号なし演算の) 型STD_LOGIC_VECTORを使用する必要があります。これらの型の間で変換するには、次のように型名を明示的に使用してキャストするだけです。SIGNEDUNSIGNEDIEEE.NUMERIC_STD

std_logic_vector_variable := STD_LOGIC_VECTOR(unsigned_variable);
unsigned_variable := UNSIGNED(std_logic_vector_variable);

つまり、すべてを要約すると、明らかに算術演算を実行するため、signal sumは として宣言する必要があります。SIGNEDそうすれば、必要な比較演算や算術演算を自由に使用できます。結果のコードは、多かれ少なかれ次のようになります。

use IEEE.NUMERIC_STD.ALL;
-- entity and architecture declarations...
signal sum : SIGNED (15 downto 0);
-- inside some process...
if (sum <= 0) then sum <= 0; end if;
于 2013-05-28T22:02:16.430 に答える
2

素早く簡単なハックは、最上位ビットが 1 であるかどうかを確認することです。これは、負の数を示します。

result <= (others=>'0') when sum(sum'left)='1' else sum;

または、std_logic_vector を適切な型に変換して、それが負かどうかを確認できます。

result <= (others=>'0') when signed(sum) < 0 else sum;

または、プロセス内では、選択したシグナル割り当ての代わりに if ステートメントを使用します。

if signed(sum) < 0 then
    result <= (others=>'0');
else
    result <= sum;
end if;
于 2013-05-29T03:05:04.803 に答える
0
signal sum : std_logic_vector (15 downto 0);

sum<= x"E8";

if (sum(15)='1') then

   sum<=x"00";

end if;

MSBをチェックするだけです..

MSB が 1 の場合、それは数値が負であるか正であることを意味します。

于 2014-06-04T13:31:32.053 に答える