【发布时间】:2016-04-24 04:20:44
【问题描述】:
我将一个 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 的一条黄金法则是永远不要使用“/”,除非它为我正在尝试做的事情实现了一个简单的解决方案?
有什么建议吗?
【问题讨论】:
-
除法是 2 的幂,在有符号整数或定点算术中作为右移(如果操作数为负,则加上校正)和浮点中的指数减法很容易实现算术。
-
也许不清楚在有符号整数/定点算术中操作时负值的校正应该是什么?算术右移是除以 2 的幂,将结果向负无穷大舍入,而整数除以 2 的幂 截断(向零舍入) 结果(在 C、C++ 中)。所以必要的修正是:
if (x < 0) x = x + 2**n-1; r = x >> n;,其中>>表示算术右移。
标签: floating-point vhdl fpga twos-complement