wind330

VHDL的有符号运算

0
阅读(5515)

VHDL的有符号整型运算 (by Wind330)

   


最近做了一个色域空间转换的RTL设计,中间有涉及加法、减法、乘法等运算,很好地学了VHDL相关的有符号整型运算。

相关知识

有符号整型运算相关的库是 ieee.numeric_std,相关的数据类型有 signedunsigned,相关的函数有 to_signedto_unsigned。其中函数 to_signed 可以直接把你输入的负数转换为有符号整型。

问题

下面讲述一个我遇到的问题,在设计中我有如下定义:

  signal SignedY    : signed(8 downto 0);
  signal SignedX    : signed(8 downto 0);
  signal SignedZ    : signed(9 downto 0);
  ...
  SignedZ <= SignedX + SignedY;
  ...

当 有符号加法器输入SignedX和SignedY分别为'0'&X"01"与'0'&X"FF",SignedZ得到的仿真结果 为"11"&X"00",而正确的结果应该是"01"&X"00"。个人认为造成这种结果的原因是仿真器行为,也就是说SignedX与 SignedY相加得到一个9-bit的结果,其赋值行为是将9-bit的结果进行符号位扩展后赋于SignedZ,而不是wind330理所当然的认为SignedX与SignedY相加得到一个10-bit的有符号数。

解决办法

把SignedX和SignedY定义为与SignedZ相同的位宽,如下:

  signal SignedY    : signed(9 downto 0);
  signal SignedX    : signed(9 downto 0);
  signal SignedZ    : signed(9 downto 0);
  ...
  SignedZ <= SignedX + SignedY;
  ...

注意

上述的结果都在Modelsim仿真得出,未上FPGA验证。