下移有符号数的最简单方法
Easiest Way to Shift Down A Signed Number
我将一个 2s 补码浮点数相乘并将其用于 DSP 内部的一些数学运算。我得到结果并希望将其向下移动,但我不确定最简单的方法。
例如:
constant b_const : integer := integer(real(1.0 / 3.0) / real((2.0**-10.0)));
signal b : std_logic_vector(10 downto 0);
begin
b <= std_logic_vector(to_signed(b_const, b'length)) ;
dsp: work.entity_dsp -- p = a * b
port map(
clk => clk,
a => a,
b => b,
p => p -- also signed
);
c <= p / 2**10; -- Isn't this very resource intensive ?
我查看了函数 "resize",但它似乎只是截断或填充位。我认为 FPGA 的黄金法则是永远不要使用“/”,除非它实现了我想要做的事情的简单解决方案?
有什么建议吗?
如果要截断 LSB,可以使用 numeric_std 中定义的 shift_right 函数,然后调整大小。
c <= resize(shift_right(p, 10), c'length);
或者,您可以切片:
c <= p(c'length+10 downto 10);
我将一个 2s 补码浮点数相乘并将其用于 DSP 内部的一些数学运算。我得到结果并希望将其向下移动,但我不确定最简单的方法。
例如:
constant b_const : integer := integer(real(1.0 / 3.0) / real((2.0**-10.0)));
signal b : std_logic_vector(10 downto 0);
begin
b <= std_logic_vector(to_signed(b_const, b'length)) ;
dsp: work.entity_dsp -- p = a * b
port map(
clk => clk,
a => a,
b => b,
p => p -- also signed
);
c <= p / 2**10; -- Isn't this very resource intensive ?
我查看了函数 "resize",但它似乎只是截断或填充位。我认为 FPGA 的黄金法则是永远不要使用“/”,除非它实现了我想要做的事情的简单解决方案?
有什么建议吗?
如果要截断 LSB,可以使用 numeric_std 中定义的 shift_right 函数,然后调整大小。
c <= resize(shift_right(p, 10), c'length);
或者,您可以切片:
c <= p(c'length+10 downto 10);