带符号的乘法结果修剪

时间:2016-11-27 12:42:19

标签: vhdl

我拥有什么

我有两个签名信号,10b长度为其中一个,2b为另一个。

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

然后我想将它们相乘:

R_S_E <= R_S_R * prbs_sup_u;

将结果存储到另一个10b信号中。

为什么再次10b

因为prbs_sup_u是2b,并且它只有[-1,1]值(只有那两个)。因此,虽然乘法的结果是12b,但我认为(只有在我没有弄错的情况下)我应该能够将操作的可能结果存储在另一个10b信号中。

所以你的问题是......

在进行乘法运算后,我应该能够处理12b结果中的两个位。

然而,哪些?由于它是一个签名信号,我不知道哪一个是一次性的。当然不是第一个,因为它是标志,但在那之后......

1 个答案:

答案 0 :(得分:1)

只需使用resize操作截断不需要的MSB(幅度),如:

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

您可以在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.

如果prbs_sup_u只能有值1或-1,那么您还可以考虑:

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;

然后操作可能更明显,并且电路将更小,因为实现不必包括处理未使用的0和-2值。