2016-04-24 92 views
0

我乘以一个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 ? 

我看了一下功能“调整”,但它只是似乎无论是截断或垫位。我认为FPGA的黄金法则从来不会使用“/”,除非它意识到我正在尝试做的简单解决方案?

有什么建议吗?

+0

划分是由二的幂,其被平凡作为右移位实现在带符号的整数(正校正,如果操作数负)或定点算术,并作为浮点算术中的指数减法。 – njuffa

+1

也许不清楚在有符号整数/定点算术运算中对负值的修正应该是什么?算术右移除以2的幂,*将结果舍入到负无穷*,而整数除以2的幂*舍入(舍入到零)*结果(在C,C++中)。所以必要的修正是:如果(x <0)x = x + 2 ** n-1; r = x >> n;',其中'>>表示算术右移。 – njuffa

回答

0

如果要截断LSB,可以使用numeric_std中定义的shift_right函数,然后调整大小。

c <= resize(shift_right(p, 10), c'length); 

或者,可以采用片:

c <= p(c'length+10 downto 10); 
+0

但是,这将改变2s恭维签名号码的值 – fiz

+1

是的,负值在处理分歧与位移时的处理方式不同。另请参阅此答案:http://stackoverflow.com/a/24145443/5900503您可以按@njuffa建议的方式进行操作。在右移之前有条件地为负数添加常数。根据FPGA的不同,可以使用DSP模块内部的后置加法器完成此操作,而无需使用额外的LUT。 – elgorwi

相关问题