2017-07-17 15 views
-1

私は助けが必要です。私は+2048と-2048の間で自分の値をクリップしようとしていますが、これはstd_logic_vector( "111111111111100000000000000000000000"と "000000000000100000000000000000000000")にあります。vhdlリレーショナルオペレーション

--Saturate the output to -2048 to +2048 

saturate1:process (x1,x2) 
--variable sum, tmp :std_logic_vector(WWidth downto 0); 
begin 
    y11 <= x1+x2; 

if y11 >= "000000000000100000000000000000000000" then 
    y <= "000000000000100000000000000000000000"; 
elsif y11 >= "111111111111100000000000000000000000" then 
    y <= "111111111111100000000000000000000000"; 
else 
    y <= y2fullwidth; 
end if; 
end process saturate1; 
はY11、X1、X2およびyは、すべてのタイプのSTD_LOGIC_VECTORある

この問題が生じていますなぜ、私は私のコードのスニペットを添付しています。 ありがとうございます。

答えて

1

i)"000000000000100000000000000000000000"はバイナリで2048ではありません。それは16,772,216です。

ii)数学を行っているようです。したがって、numeric_stdパッケージを使用し、タイプsignedを使用することをお勧めします。

iii)プロセスを2つに分割する必要もあります。信号y11を駆動することはできませんし、後で同じプロセスでサンプリングすることはできません。 (プロセスが中断するまで更新されません)。これが驚きであれば(単にタイプミスではなく)、VHDLの仕組みについてもっと知る必要があります。あなたがタイプsigned比較演算子(<=>=など)は種類signedintegerで動作するようにをオーバーロードしている使用している場合

y11 <= x1+x2; 

saturate1:process (y11) 
--variable sum, tmp :signed(WWidth downto 0); 
begin  
    if y11 >= 2048 then 
    y <= 2048; 
    elsif y11 <= -2048 then 
    y <= -2048; 
    else 
    y <= y2fullwidth; 
    end if; 
end process saturate1; 
+0

あなたは間違っていないですが... –

+0

はありがとう@Matthewテイラー、私は変数を使用してそれを解決することができました、あなたのメソッドは私が以前と同じエラーを与えて動作しませんが、私は努力を感謝します。 – Dammy