Расчет VHDL, другой, но все тот же

Трудно объяснить проблему в заголовке, поэтому, пожалуйста, читайте дальше.

У меня есть проект, в котором мы реализуем фильтр Собеля. По началу изображение не работало как надо, с собелевскими расчетами

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);

но с тем же расчетом, выраженным по-другому

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);

это сработало отлично. Тем не менее, симуляции одного только фильтра точно такие же. Это как-то связано с тем, как я добавляю нули перед векторами?


person chwi    schedule 18.05.2012    source источник


Ответы (1)


Не зная типов данных, я не совсем уверен, является ли это причиной, но я предполагаю, что если p1 > p3 (и некоторые другие тоже), вы получите разные результаты от двух типов вычислений. Пример псевдокода:

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

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


--Method2
res = ("000" & p3) - ("000" & p1) = "000001" - "000010" = "111111";
person sonicwave    schedule 18.05.2012
comment
Вышеупомянутое должно быть действительным тогда. Вместо этого я бы рекомендовал использовать типы данных UNSIGNED/SIGNED в библиотеке numeric_std (вероятно, вы используете std_logic_arith или std_logic_unsigned/signed). - person sonicwave; 18.05.2012
comment
О, я пытался проголосовать, но мне нужно 15 баллов, не знал, что есть кнопка принятия, но теперь я это вижу. Спасибо за внимание! - person chwi; 18.05.2012