if (...) then ... end if; で確認するにはどうすればよいですか。std_logic_vector 変数が負の数のビットを保持する場合の構築? 負の場合は、ゼロの値を割り当てる必要があります。私は持っている :
signal sum : std_logic_vector (15 downto 0);
sum<= (...);
if (...) then
sum<=x"00";
end if;
ありがとうございました!
if (...) then ... end if; で確認するにはどうすればよいですか。std_logic_vector 変数が負の数のビットを保持する場合の構築? 負の場合は、ゼロの値を割り当てる必要があります。私は持っている :
signal sum : std_logic_vector (15 downto 0);
sum<= (...);
if (...) then
sum<=x"00";
end if;
ありがとうございました!
STD_LOGIC_VECTOR
言語は実行すべき演算について何も知らないため、2 つの を加算することはできません。これは、合成ツールにとって、として宣言されているすべての信号/ポート/変数が、多値論理型のSTD_LOGIC_VECTOR
配列にすぎないためです。STD_LOGIC
そのような型の算術演算は意味がありません。
で公開されているものと同様のインターフェイスを持つ型で算術演算を使用する場合は、で定義されている (符号付き算術演算の) 型と(符号なし演算の) 型STD_LOGIC_VECTOR
を使用する必要があります。これらの型の間で変換するには、次のように型名を明示的に使用してキャストするだけです。SIGNED
UNSIGNED
IEEE.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;
素早く簡単なハックは、最上位ビットが 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;
signal sum : std_logic_vector (15 downto 0);
sum<= x"E8";
if (sum(15)='1') then
sum<=x"00";
end if;
MSBをチェックするだけです..
MSB が 1 の場合、それは数値が負であるか正であることを意味します。