我不想发现后期合成,即32位加法器用于某些操作,而不是实际需要的小得多的加法器。对于下面的代码,我是否需要将其分解并为每个减法运算分配一个适当大小的变量,以使综合避免默认使用32位加法器,还是需要更多步骤?
diff := diff +
abs(to_int(reference_window(i)(j)(15 downto 11)) - to_int(search_window(i)(j+k)(15 downto 11))) +
abs(to_int(reference_window(i)(j)(10 downto 5)) - to_int(search_window(i)(j+k)(10 downto 5))) +
abs(to_int(reference_window(i)(j)(4 downto 0)) - to_int(search_window(i)(j+k)(4 downto 0)));
to_int()的定义如下:
function to_int(a : std_logic_vector) return integer is
begin
return to_integer(unsigned(a));
end to_int;
我认为这可能是一个可能的答案,但是如果有人发布了提供特定规则的答案,那就更好了,以确保您的代码不会意外地合成为32位加法器。
red_diff := unsigned(abs(signed(unsigned(reference_window(i)(j)(15 downto 11))) - signed(unsigned(search_window(i)(j+k)(15 downto 11)))));
green_diff := unsigned(abs(signed(unsigned(reference_window(i)(j)(10 downto 5))) - signed(unsigned(search_window(i)(j+k)(10 downto 5)))));
blue_diff := unsigned(abs(signed(unsigned(reference_window(i)(j)(4 downto 0))) - signed(unsigned(search_window(i)(j+k)(4 downto 0)))));
diff := diff + red_diff + green_diff + blue_diff;
我必须使用看起来奇怪的有符号(unsigned())转换,因为abs()不接受abs(unsigned(a)-unsigned(b))