我有几个无符号,8位宽的数字,我需要一起加/减。在示例下方:
h_tmp <= signed(r4(calc_cnt - 2) + r4(calc_cnt - 1) + r4(calc_cnt) +
r4(calc_cnt + 1) + r4(calc_cnt + 2) -
r2(calc_cnt - 2) - r2(calc_cnt - 1) - r2(calc_cnt) -
r2(calc_cnt + 1) - r2(calc_cnt + 2));
我知道13位宽的结果对于我拥有的数字是可以的,所以我将h_tmp定义为有符号(12 downto 0)。现在,合成后我有以下警告
Width mismatch. <h_tmp> has a width of 13 bits but assigned expression is 8-bit wide.
似乎合成器推断了一个8位宽的计算结果,我做错了什么?
答案 0 :(得分:1)
假设加法/减法(+
/ -
)基于ieee.numeric_std
包(或ieee.std_logic_arith
和ieee.std_logic_unsigned
),结果
加法/减法的长度是最长参数的长度。
因此,如果加法/减法链中的所有参数都是8位长, 然后所有的添加都是8位加法/减法,即使通过 您分配了13位结果。
因此,通过调整第一个参数的大小来启动加法/减法链
结果的长度,如下面的ieee.numeric_std
包:
h_tmp <= signed(resize(r4(calc_cnt - 2), h_tmp'length) + r4(calc_cnt - 1) ...
对ieee.std_logic_arith
包使用conv_unsigned
。