如何定义求和结果的宽度?

How to define sum result's width?

我几乎没有需要 add/subtract 的无符号 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 到 0)。现在,综合后我有以下警告

Width mismatch. <h_tmp> has a width of 13 bits but assigned expression is 8-bit wide.

合成器似乎推断出一个 8 位宽的计算结果,我做错了什么?

假设 addition/subtraction (+/-) 基于 ieee.numeric_std 包(或 ieee.std_logic_arithieee.std_logic_unsigned),结果 addition/subtraction 的长度是最长参数的长度。

因此,如果 addition/subtraction 链中的所有参数都是 8 位长, 那么所有的加法都是8位additions/subtractions,即使通过 您分配给一个 13 位结果。

所以启动 addition/subtraction 链,调整第一个参数的大小 结果的长度,如下面的 ieee.numeric_std 包:

h_tmp <= signed(resize(r4(calc_cnt - 2), h_tmp'length) + r4(calc_cnt - 1) ...

对于 ieee.std_logic_arith 包使用 conv_unsigned