2017-01-23 50 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)' 意識到您需要在4個時鐘計算之間重置average_sum。截斷也會給你帶來一半的負面偏見。 完整的示例將有助於查看問題是否存在於代碼的其餘部分。 – sv65536

回答

1

是的,它也適用於signed類型。