2017-07-05 42 views
0

我正在实现一个自定义的16位cpu(在Verilog中)。如果我需要实现溢出标志来处理签名比较,那么我会遇到麻烦。签名比较中需要溢出标志吗?

在我目前的执行情况,我只检查零的结果和标志位来确定结果的比较:

when comparing x to y the ALU calculates: x - y (2's compl) 
If the sign bit is set and the result is not zero y > x 
If the sign bit is not set and the result is not zero x > y 

我不使用溢出标志来确定结果的比较。我已经为x和y尝试了许多不同的值,并且它们都是正确的。

可以签名比较是否实现没有溢出标志?如果不是,你能否给我x和y的值,以这种方式给出错误的结果?

+0

你试过了什么样的数字? – EOF

+0

@EOF f.e. 0xa000(-24k)和0xb000(-20k)。和0xf000,0xff00,0x8000,0x7000,0x8400,0x0f00,0x1700,0xf000 ... – ErwinM

+0

的大多数组合您是否尝试过'INT_MIN'('0x8000')和'1'('0x1')? 'INT_MIN - 1'将溢出并创建'INT_MAX'('0x7FFF'),它非零且没有符号位设置,根据您的表,它会指示INT_MIN> 1。 – EOF

回答

0

首先:

“sign”位不帮你检查x> y。你还需要“携带”位,你可以使用8位无符号运算看到:(更换“132”,由“-124”,你看,它也不会签署算术工作)

132 - 2 = 130 (sign bit set, carry clear) 
132 - 6 = 126 (sign bit clear, carry clear) 
6 - 132 = 130 (sign bit set, carry set) 
2 - 132 = 126 (sign bit clear, carry set) 

您的实际问题:

这取决于,正是你要问:

如果能够设计出仅具有一个指令集,允许无符号比较,可以做签署比较CPU:

在这种情况下答案是肯定的 - 因为你可以在评论中看到你的答案。在执行CMP操作之前,只需简单地颠倒两个数字的最高位(使用XOR操作)即可。

如果你想知道你有多少“标志”位需要那么根据签订的比较条件跳转是可能的(只有)一个CMP指令和条件跳转指令:

您将需要至少3个标志:“Zero”,“Carry”和第三个标志允许你计算“Sign XOR Overflow”的值。

(所以你可能会使用“SignXorOverflow”标志。)

由于“溢出”不能从“零”计算,“进位”和“注册”,您将需要“溢出”位,如果你想拥有“Sign”位。