EmbDev.net

Forum: FPGA, VHDL & Verilog 2's Complement in verilog


von verilog code for two's complement (Guest)


Rate this post
useful
not useful
How do I convert inputs into  two complement and perform alu operation 
on those input to produce a o/p which should also be in two's 
complement?

The question which I came across is

A module has three inputs: two 32-bit signed numbers represented in 2'c 
complement format (A & B) and a 2-bit control (CTRL).  It produces four 
outputs: a 32-bit result (R),  an overflow flag (O), a sign flag (N), 
and a Zero flag (Z).  The result should be in 2's complement format as 
well.

I am struck in 2'c complement part. any ideas?

von Alex (Guest)


Rate this post
useful
not useful
From wikipedia's article on 2's complement (very worth a reading...):

"The two's-complement system has the advantage that the fundamental 
arithmetic operations of addition, subtraction, and multiplication are 
identical to those for unsigned binary numbers (as long as the inputs 
are represented in the same number of bits and any overflow beyond those 
bits is discarded from the result)"

Answer: You don't.

That means that R = A (op) B

if (op) is + one possibility could be:

assign R = A + B;
assign Z = R == 32'h0;
assign N = R[31];
assign O = (A[31] & B[31] & (~R[31]) | ((~A[31]) & (~B[31]) & R[31]);

something like that

von verilog code for two's complement (Guest)


Rate this post
useful
not useful
Model a 32-bit ALU that can perform the following operations in 
behavioral Verilog:

                Control Lines           Operation
                        00                      Addition
                        01                      Subtract
                        10                      Bitwise XOR
                        11                      Bitwise AND

This module has three inputs: two 32-bit signed numbers represented in 
2'c complement format (A & B) and a 2-bit control (CTRL).  It produces 
four outputs: a 32-bit result (R),  an overflow flag (O), a sign flag 
(N), and a Zero flag (Z).  The result should be in 2's complement format 
as well.  The overflow bit is set when the result of addition or 
subtraction is out of range.  The sign flag is set when the result is 
negative.  The zero flag is set when the result is zero.  Verify the 
functionality of the model Using simulation. Use the following test 
vectors for the simulation results that you submit:

                 Addition & subtraction

                 A = FFFFFFF0   B = FFFFFFFF
                 A = FFFFFFFF   B = 000F00FF
                 A = 98998998   B = 12341234
                 A = AAAAAAAA   B = EFABCD12
                 A = FFFFFFFF   B = 00000001
                 A = FFFFFFFF   B = FFFFFFFF
                 A = FFFFFFFC   B = FFFFFFFC
                 A = FFFFFF00   B = 00000AB4
                 A = 00000025   B = 00080808

                 bitwise AND , bitwise XOR:

                 A = FFFFFFFF    B = 0A0AB0B0
                 A = ABCD4545    B = 12383588
                 A = F0F0F0F0    B = CFCFCFCF
                 A = 00000000    B = 11111111

von verilog code for two's complement (Guest)


Rate this post
useful
not useful
Actually, the inputs are given in 2's complement. How do I get the 
output in 2's complement as well?

Should I do the regular conversion of the output to get 2's 
complement(say invert and add one)?

And, how Do i get to know that the result is negative without 
simulating?

von Alex (Guest)


Rate this post
useful
not useful
without simulating ? pencil+paper...

You didn't read my answer in post 2, or didn't understand it. There is 
the answer to your question.

...
You say the numbers are 2's complement, it doesn't matter what they are 
as long as you apply the right rules to operate and the interpret the 
results.

Let's assume that you are using only 4 bits and that the MSB is the sign 
bit:

If you say that your input is 2's complement, then the following table 
applies:

binary | decimal representation (2's complement)
  0000 | 0
     ...
  0111 | 7
  1000 | -8
     ...
  1111 | -1

Now let's do add, ok ?

3 + 4 = 7
0011 + 0100 = 0111 ok ?
4 + (-1) = 3
0100 + 1111 = 0011 ok ?

Do you see what I meant in post 2 ?

Now, write some code and simulate it. (icarus verilog is very handy for 
that)

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.