Velocity Reviews > VHDL > Multiply using shift, for signed numbers

# Multiply using shift, for signed numbers

fastgreen2000@yahoo.com
Guest
Posts: n/a

 09-09-2005
I'm trying to achieve multiply using one or more shift operations. For
example,
A = 5*B can be written as
A = 4*B + B or
A = (B sll 2) + B

Now, B is a signed number, so when I do (B sll 2), the shift operation
doesn't discriminate the sign bit, and I end up losing it (falls off to
the left side).

One solution would be to save the MSb of B, perform 'sll' on the rest,
and concatenate them together. If B were signed(7 downto 0) :
A = ((B(7) & (B(6 downto 0) sll 2)) + B;

Is there a better way to do this, perhaps some built-in function I
couldn't find?

I'm thinking that there has to be an easier way. I'm not concerned
about the overflow (yet). Can anyone help? I'm not that fluent in
VHDL. Thank you.

Hubble
Guest
Posts: n/a

 09-12-2005
I think you misunderstood something. signed is two's complement, so
using 8 bits you have

2: 00000010
1: 00000001
0: 00000000
-1: 11111111
-2: 11111110
-3: 11111101
-4: 11111100

if you shift left, sign bits won't fall off.

Hubble.

Hubble
Guest
Posts: n/a

 09-13-2005
Having thought a bit on this topic, the sll operator does not multiply
by 2**n on 2s complement negative numbers. Since you want to use Logic
Half- and fulladdres, 2s complement should be the representation of
choice. (Note: If you use a sign bit and a mantissa, you have to
redefine the +/- operations as well).

So you have to convert a negative number to a positive, shift, add and
invert it again, like this (without test)

variable highbit: std_logic;
...
highbit:=B(B'high);
if highbit='1' then
B:=abs(B);
end if;
Btimes5:=B ssl 4 + B;
if highbit='1' then
Btimes5:=-Btimes5;
end if;

Hubble.