VHDL如何确保使用最小的加法器?

时间:2018-09-29 23:45:29

标签: vhdl

我不想发现后期合成,即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))

0 个答案:

没有答案