我目前正在尝试实现一个数据路径,该路径处理以无符号整数0-255之间的灰度表示的图像数据。(仅供参考,我的目标是在FPGA中实现离散小波变换)
在数据处理过程中,中间值也将为负数。作为一个示例过程,其中一个计算是
result = 48 - floor((66+39)/2)
floor函数用于保证整数数据的处理。对于上述情况,结果为-4,这是一个超出0~255范围的数字。
在提到上述案例后,我有一系列的基本问题。
为了处理负中间数,我是否需要在硬件设计中用2的补码将所有数据表示为"等效无符号数"?例如-4 d=1111 1100 b.
如果我将数据表示为有符号数字的2的补码,我需要9位而不是8位吗?或者,我需要多少比特才能正确处理数据?(对于8位,我不能在2的补码中表示任何超过128的数字。)
如果我使用逐位移位,负数除法是如何工作的?如果我想将结果-4除以4,向右移动2位,结果将变为十进制63,二进制0011111,而不是-1。我该如何解决这个问题?
任何帮助都将不胜感激!
如果您可以选择使用VHDL,那么您可以使用定点库来表示您的数字,并选择舍入模式,以及允许位扩展等。
在Verilog中,我会三思而后行。我不是Verilogger,但混合签名和未签名数据类型的算术规则似乎充满了射门的机会。
另一个需要考虑的选项可能是MyHDL,因为它为您提供了一个非常强大的验证环境,并允许您根据自己的选择在后端吐出VHDL或Verilog。