2012-05-18 79 views
1

很難解釋標題中的問題,所以請繼續閱讀。VHDL計算,不同但仍相同

我有一個項目,我們正在實施一個sobel過濾器。起初,圖像沒有工作,因爲它應該做的,與索貝爾計算

Gx <= ("000" & p3-p1)+(("00" & p6 & '0')-("00" & p4 & '0'))+("000" & p9-p7); 
Gy <= ("000" & p7-p1)+(("00" & p8 & '0')-("00" & p2 & '0'))+("000" & p9-p3); 

,但具有相同calulation以不同的方式

Gx <= ("000" & p3)+("00" & p6 & '0')+("000" & p9)-("000" & p1)-("00" & p4 & '0')-("000" 
& p7); 
Gy <= ("000" & p7)+("00" & p8 & '0')+("000" & p9)-("000" & p1)-("00" & p2 & '0')-("000" 
& p3); 

它完美的工作表現。儘管如此,過濾器的模擬完全一樣。 這與我如何在矢量之前填充零有關嗎?

回答

2

不知道數據類型我不完全確定這是否是原因,但我的猜測是,如果p1 > p3(以及其他一些數據類型),您將從兩種類型的計算中獲得不同的結果。僞代碼示例:

p1 = "010"; 
p3 = "001"; 

--Method1: 
res = "000" & p3-p1 = "000" & "111" = "000111"; 


--Method2 
res = ("000" & p3) - ("000" & p1) = "000001" - "000010" = "111111"; 
+0

'P1:在STD_LOGIC_VECTOR(7 DOWNTO 0);' '信號GX:STD_LOGIC_VECTOR(10 DOWNTO 0);' '信號G:STD_LOGIC_VECTOR(10 DOWNTO 0); ' – chwi

+1

以上應該是有效的。我建議使用numeric_std庫中的UNSIGNED/SIGNED數據類型,而不是(可能使用std_logic_arith或std_logic_unsigned/signed)。 – sonicwave

+0

這解釋得非常好,謝謝! – chwi

相關問題