Btc Sources
Btc Sources

Reputation: 2061

Signed multiplication result trim

What I have

I've two signed signals, 10b length one of them and 2b the other one.

signal R_S_R      : signed(9 downto 0);
signal prbs_sup_u : signed(1 downto 0);

Then I want to multiply them like:

R_S_E <= R_S_R * prbs_sup_u;

Storing the result into another 10b signal.

Why 10b again

Because prbs_sup_u is 2b, and it'll only have [-1, 1] values (only those two). So, although result of multiplication is 12b, I think (only if I'm not mistaken) I should be able to store the posible results of the operation in another 10b signal.

So your question is...

After doing the multiplication, I should be able to dispose of two of the bits from the 12b result.

However, which ones? Since it's a signed signal, I don't know which one are disposable. Of course not the first one, since it's the sign, but after that...

Upvotes: 0

Views: 2327

Answers (1)

Morten Zilmer
Morten Zilmer

Reputation: 15934

Simply use the resize operation to truncate unrequired MSBs (magnitude) like:

R_S_E <= resize(R_S_R * prbs_sup_u, R_S_E'length);

You can find the documentation in numeric_std.resize:

-- Id: R.1
function RESIZE (ARG: SIGNED; NEW_SIZE: NATURAL) return SIGNED;
-- Result subtype: SIGNED(NEW_SIZE-1 downto 0)
-- Result: Resizes the SIGNED vector ARG to the specified size.
--         To create a larger vector, the new [leftmost] bit positions
--         are filled with the sign bit (ARG'LEFT). When truncating,
--         the sign bit is retained along with the rightmost part.

If the prbs_sup_u can only have value 1 or -1, then you can also consider:

if prbs_sup_u = 1 then
    R_S_E <= R_S_R;
else  -- prbs_sup_u = -1 
    R_S_E <= - R_S_R;
end if;

The operation may then be more obvious, and the circuit will be smaller, since the implementation does not have to include handling of the unused 0 and -2 values.

Upvotes: 3

Related Questions