首页 > 解决方案 > 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;

我必须使用看起来很奇怪的有符号(无符号())转换,因为 abs() 不接受 abs(无符号(a) - 无符号(b))

标签: vhdl

解决方案


推荐阅读