VHDL的有符号运算
0赞
发表于 10/27/2010 9:23:06 PM
阅读(5515)
VHDL的有符号整型运算 (by Wind330)
最近做了一个色域空间转换的RTL设计,中间有涉及加法、减法、乘法等运算,很好地学了VHDL相关的有符号整型运算。
相关知识
有符号整型运算相关的库是 ieee.numeric_std,相关的数据类型有 signed 和 unsigned,相关的函数有 to_signed, to_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验证。
