Verilog中的有符号计算之认知补码中的有符号计算之认知补码
要想在FPGA的世界里随心所欲的进行有符号运算,必须先对补码有一个很好的认知,本文介绍了Verilog中的补
码计算
Verilog中的有符号计数,一般是自己定义的而不是像C语言之类的定义一个有符号变量就好了。所以,要想在FPGA的世界里
随心所欲的进行有符号运算,必须先对补码有一个很好的认知,然后再注意Verilog中编程的几个特性,两者缺一不可。
对补码初步的认识:
1、正数的补码与源码相同,即正数的补码是其本身。
2、负数的补码,是对其源码(除符号位)取反再加一,于是得到其补码。
3、对负数的补码(除符号位)取反再加一,于是得到其源码。
4、正数的补码被定义为其本身,所以不需以上操作。(其实你也可以理解为正数没有补码)
5、“计算机”储存数时是以补码的形式储存的。
以四位二进制举例(最高位是其符号位):
-7,负7的源码:1_111;
-7,负7的补码:1_001;
在此提出一个看法,帮助理解,补码是给计算机看的,源码是给人看的。
看看1 + (-2)如何计算,我们知道负数的话都是由补码储存的所以就是1 + (-2的补码),及
0_001 + 1_110 = 1_111;(最高为为符号位),所以1111及-1的补码(对负数的补码(除符号位)取反再加一,于是得到其源
码)
这给我们了一个启示,前面说过“Verilog中的有符号计数,一般是自己定义的”,那么在写Verilog时我们把最高为作为符号位,
我们通过最高位判断该数的正负。
对于FPGA的有符号计算,我觉得应该从两种情况进行分析。一种是:输入的两个数本来是无符号的,而由于运算导致结果是
一个有符号的数(如1-7=-6);
另一种是:输入的两个数是有符号的。
对于第一种情况而言,1-7=-6,这个-6会自动以负数补码的形式储存在你声明的寄存器中。举一个例子:
input [4:0]A,
input [4:0]B,
output reg [4:0]Result
A,B作为两个运算的数,Result储存运算的结果,他们的最高位都是表示符号位。
假如:A = 0001,B = 0111;让A-B,那么1-7=-6及Result = 1010(-6 的补码,最高位是符号位),没有问题。
假如:A = 0111,B = 0111;让A+B,那么7+7=14及Result = 1110;此时如果最高位不是符号位那么Result=14没错,但是
此时Result的最高为是符号位,所以结果是-1(1110是-1的补码)。
也就是,一旦产生了进位,结果就错了。所以我们改进一下。
input [3:0]A,
input [3:0]B,
output reg [4:0]Result
我们把Result增加一位,那么7+7=14及Result = 01110;这样就对了;但是1-7,Result = 01010 = 10;这就错了。因为对于
一个4位数
而言-6 的补码是1010,而对于一个5位数而言-6 的补码是11010。所以Result = 11010才对,但是A和B是一个4位数结果只会
产生1010而赋值
给一个5位数的Result结果只能是01010(系统是不会帮你把最高位置1的);所以这个1由我们自己置,正所谓,自己动手丰
衣足食。对于补码而言
评论0