Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make the 2-complement of a number without using adder

In two-complement to invert the sign of a number you usually just negate every bit and add 1. For example:

011 (3)
100 + 1 = 101 (-3)

In VHDL is:

a <= std_logic_vector(unsigned(not(a)) + 1);

In this way the synthesizer uses an N-bit adder.

Is there another more efficient solution without using the adder?

like image 781
HBv6 Avatar asked Jan 26 '13 17:01

HBv6


People also ask

How do you find the 2 complement of a number?

Step 1: Write the absolute value of the given number in binary form. Prefix this number with 0 indicate that it is positive. Step 2: Take the complement of each bit by changing zeroes to ones and ones to zero. Step 3: Add 1 to your result.

What is 2's complement method?

Two's complement is a mathematical operation to reversibly convert a positive binary number into a negative binary number with equivalent (but negative) value, using the binary digit with the greatest place value (the leftmost bit in big-endian numbers, rightmost bit in little-endian numbers) to indicate whether the ...


2 Answers

I would guess there's not an easier way to do it, but the adder is probably not as bad as you think it is.

If you are trying to say invert a 32-bit number, the synthesis tool might start with a 32-bit adder structure. However then upon seeing that the B input is always tied to 1, it can 'hollow out' a lot of the structure due to the unused gates (AND gates with one pin tied to ground, OR gates with one pin tied to logic 1, etc).

So what you're left with I'd imagine would be a reasonably efficient blob of logic which just increments an input number.

like image 108
Tim Avatar answered Nov 15 '22 10:11

Tim


If you are just trying to create a two's complement bit pattern then a unary - also works.

a = 3'b001 ; //        1
b = -a     ; //3'b111 -1
c = ~a + 1 ; //3'b111 -1

Tim has also correctly pointed out that just because you use a + or imply one through a unary -, the synthesis tools are free to optimise this.

A full adder has 3 inputs (A, B, Carry_in) and 2 outputs (Sum Carry_out). Since for our use the second input is only 1 bit wide, and at the LSB there is no carry, we do not need a 'full adder'.

A half adder which has 2 inputs (A, B) and 2 outputs (Sum Carry), is perfect here.

For the LSB the half adders B input will be high, the +1. The rest of the bits B inputs will be used to propagate the Carry from the previous bit.

There is no way that I am aware of to write in verilog that you want a half adder, but any size number plus 1 bit only requires a half adder rather than a fulladder.

like image 37
Morgan Avatar answered Nov 15 '22 09:11

Morgan