我目前正在尝试实现一个数据路径,该路径处理以无符号整数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,二进制为0011 1111,而不是-1。我该如何解决这个问题?
任何帮助将不胜感激!
答案 0 :(得分:1)
如果您可以选择使用VHDL,那么您可以使用fixed point library来表示您的数字并选择舍入模式,以及允许位扩展等。
在Verilog,好吧,我会三思而后行。我不是Verilogger,但混合有符号和无符号数据类型的算术规则似乎充满了拍摄机会。
另一个需要考虑的选项可能是MyHDL,因为它为您提供了一个非常强大的验证环境,并允许您根据自己的选择在后端吐出VHDL或Verilog。