我有两个签名信号,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
结果中的两个位。
然而,哪些?由于它是一个签名信号,我不知道哪一个是一次性的。当然不是第一个,因为它是标志,但在那之后......
答案 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值。