2017-01-23 28 views
0

4つの連続した値の信号の平均を計算しようとしています。この信号は署名されており、正しい計算についてはわかりません。VHDLの符号付き信号の平均操作

SIGNAL my_signed_signal : std_logic_vector(15 DOWNTO 0) := (OTHERS => '0'); 
SIGNAL average_sum  : signed(17 DOWNTO 0) := (OTHERS => '0'); 
SIGNAL average_result : signed(15 DOWNTO 0) := (OTHERS => '0'); 

... 

-- within my process 

average_sum <= average_sum + signed(my_signed_signal); -- loop 4 times 

... 

average_result <= average_sum(17 DOWNTO 2); -- how I finally get the result (div by 4) 

は、私は、これは、符号なしの信号のために働く必要があることを承知していますが、私はそれがために署名したビットの符号付のもののためにないかなり確信しています。しかし、私は本当に何を変えるか分からない。誰にもアイデアはありますか?

+0

私のVHDLは非常に錆びていますが、私は符号の拡張は、関連するタイプがあれば自動的に行われるべきだと考えています。あるいは、入力のMSBを反転させて符号なしの範囲に値をバイアスした後、MSBを反転して、符号なしの結果を符号付きの範囲に非バイアスすることもできます。これは、入力に0x8000を追加し、出力で0x8000 * 4を減算してオフセットを元に戻すことと同じです。 – doynax

+0

答えは、 '+'演算子の定義を調べる 'numeric_std'ライブラリにあるべきです。 –

+1

あなたが提供したスニペットから間違って見えることは何もありません。加算が同じサイズのベクトルで機能していることを確認したい場合は、符号付きの型に対して符号拡張を行う "resize()"関数を使うことができます。 'resize(signed(my_signed_signal)、average_sum'length)' Be 4クロックの計算の間にaverage_sumをリセットする必要があることに注意してください。切り捨ては、結果に半ビットの負の偏りを残します。 完全な例は、問題が残りのコードに含まれているかどうかを確認するのに役立ちます。 – sv65536

答えて

1

はい、それはsignedタイプでも機能します。

関連する問題