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

时间:2015-02-07 13:34:23

标签: vhdl

我有几个无符号,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位宽的计算结果,我做错了什么?

1 个答案:

答案 0 :(得分:1)

假设加法/减法(+ / -)基于ieee.numeric_std 包(或ieee.std_logic_arithieee.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