我正在进行一项设计,我认为可能会发生一些我需要处理的溢出问题。为了解决我的问题,我需要了解VHDL如何处理二进制溢出。下面是一些示例代码。
signal temp : std_logic_vector (7 downto 0) := "11111111";
signal temp_2 : std_logic_vector (7 downto 0) := "11111111";
signal result : std_logic_vector (8 downto 0) := "000000000";
result <= temp + temp_2 ;
显然,这没有调用相关的库,但它提供了我正在使用的代码的概念。我的问题是:这个二进制加法如何工作(temp + temp_2),即运行此代码后信号result
是什么?现在,我在编译中遇到错误,因为result
是9位,它期望8位。对这个二进制加法如何工作的任何解释都会非常有用!
答案 0 :(得分:6)
VHDL是强类型的。无论何时分配信号,都需要匹配类型和宽度。
对于类型:您不能将整数类型信号分配给std_logic_vector信号,编译器将抛出错误。您必须首先将整数转换为std_logic_vector。
对于宽度:您需要始终完美匹配宽度分配。在您的情况下,该工具对您很生气,因为您要为信号结果(宽度为9位)分配8位宽的内容。
为了达到您想要的效果,您必须使用符号扩展名。您是签名还是未签名?如果它们是无符号的,只需在最高位位置添加“0”。如果它们已签名,则必须确定位位置7的符号,然后将其扩展到位位置8。
以下是两种情况下的处理方式:
temp_extended_unsigned <= '0' & temp(7 downto 0);
temp_extended_signed <= temp(7) & temp(7 downto 0);
temp_2_extended_unsigned <= '0' & temp_2(7 downto 0);
temp_2_extended_signed <= temp_2(7) & temp_2(7 downto 0);
result <= temp_extended_unsigned + temp_2_extended_unsigned; -- unsigned case
result <= temp_extended_signed + temp_2_extended_signed; -- signed case
请注意,添加1位的位置可以正常添加,但乘法呢?您必须考虑要执行的操作...将两个8位宽的向量相乘会产生16位宽的结果,因此您必须在该示例中对高8位进行符号扩展。