adding 32bit numbers in 16bit processor

R

Ralf Hildebrandt

If I had a 16 bit processor, how do I add two 32 bit numbers with it?

Every addition generates a carry-out. Therefore the carry-out from the
addition of the lower word has to be added during the addition of the
upper word.

Ralf
 
I

IsNull

OK, so first I add the lower 16 bits of each number.Then add the top 16
bits of each number, and to that I add the carry-out from adding the
bottom 16 bits...correct?... but how do I separate the upper bits from
the lower bits? is there some operation or instruction for that?
something like a ShiftR or ShiftL?

thanks for the help!
 
F

Frank Buss

IsNull said:
but how do I separate the upper bits from
the lower bits? is there some operation or instruction for that?
something like a ShiftR or ShiftL?

If you have this:

signal foo: unsigned(32 downto 0);

you can select the upper bits like this:

foo(31 downto 16)
 
P

PeteS

IsNull said:
OK, so first I add the lower 16 bits of each number.Then add the top 16
bits of each number, and to that I add the carry-out from adding the
bottom 16 bits...correct?... but how do I separate the upper bits from
the lower bits? is there some operation or instruction for that?
something like a ShiftR or ShiftL?

thanks for the help!

I don't know if you are doing this with a processor or in HDL of some
description.

Here it is in pseudocode for a processor

we have two numbers - a and b, made up of a[low], a[high], b[low],
b[high], and a result r[low], r[high].

I'll note an important point at the end

Add a[low], b[low] -> r[low]. This may generate a carry, which we use below

add a[high], b[high], carry -> r[high]

There may be a final carry. If you add two values of precision n bits,
the result can have n+1 bits. That's why you chain the carry from the
low order addition.

In HDL, it's not any more work (especially if you use the primitives
with most compilers).

Cheers

PeteS
 
I

IsNull

ok, I see what you are saying..., I'm dealing with a 16-bit accumulator
based processor, I'm trying to figure out a good way of adding 32-bit
numbers with it using its assembly language... I only have 1 register
which is the accumulator and a very limited group of intuctions on its
instruction set.(instructions: Add, Addi, Load, Loadi,Comp,
ShR,BrN,BrNi,Jump,Jumpi,Store,Storei). for example:, if I were to add
4+3 and store it on memory location 1008 the code looks something like
this:
andi 0 # resets accumulator to 0
addi 4 # adds 4 to the accumulator
storei 1000 # stores the value on memory address 1000
andi 0
addi 3
storei 1004
loadi 1000
addi 1004
storei 1008

It's simple but confusing if you are used to x86 or MIPS programming.
so I'm trying to write something like that to add 32bit numbers...

thanks.
IsNull said:
OK, so first I add the lower 16 bits of each number.Then add the top 16
bits of each number, and to that I add the carry-out from adding the
bottom 16 bits...correct?... but how do I separate the upper bits from
the lower bits? is there some operation or instruction for that?
something like a ShiftR or ShiftL?

thanks for the help!

I don't know if you are doing this with a processor or in HDL of some
description.

Here it is in pseudocode for a processor

we have two numbers - a and b, made up of a[low], a[high], b[low],
b[high], and a result r[low], r[high].

I'll note an important point at the end

Add a[low], b[low] -> r[low]. This may generate a carry, which we use below

add a[high], b[high], carry -> r[high]

There may be a final carry. If you add two values of precision n bits,
the result can have n+1 bits. That's why you chain the carry from the
low order addition.

In HDL, it's not any more work (especially if you use the primitives
with most compilers).

Cheers

PeteS
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top