使用VHDL中的Std_logic_vector对固定点进行算术运算

时间:2015-05-26 08:01:29

标签: floating-point hex vhdl fixed-point xilinx-ise

我正在用VHDL编写代码,用于对信号进行算术运算。我宣布信号如下:

    signal x : std_logic_vector (7 downto 0); 
    signal y: std_logic_vector (7 downto 0); 
    signal z: std_logic_vector (  7 downto 0);
    z<= x-y ;

详细信息:

  library ieee;
  use ieee.std_logic_1164.all;
  use ieee.numeric_std.all;
  USE ieee.std_logic_arith.conv_std_logic_vector;   
  library ieee_proposed;
  use ieee_proposed.fixed_pkg.all;
  signal heat0,heat1,heat2 : std_logic_vector(31 downto 0); 
  signal Data_In, M_AXIS_TDATA Fixed_input_tdata: std_logic_vector (31 downto 0);
  shared variable float,  h0,h1,h2,fixed1,fixed2,fixed3,fixed_shift :ufixed (23 downto -8);
  shared variable  fixed_64: ufixed (31 downto -32); 
 float := to_ufixed(unsigned (Fixed_input_tdata), 23,-8); 
 h2 :=  to_ufixed(unsigned(Data_In),23,-8); 
 heat1 <= Data_in; 
 h1 :=  to_ufixed(unsigned(heat1),23,-8);  
 heat0<= heat1;
 h0 :=  to_ufixed(unsigned(heat0),23,-8);
 heat1_mult  := std_logic_vector(unsigned(heat1) sll 1);

 fixed_shift := to_ufixed(unsigned (heat1_mult), 23,-8); 
 fixed1 := fixed_shift+h2;   
 fixed2 := h0-fixed1;   
 fixed_64 := fixed2 *float; 
 fixed3 := h1+fixed_64;--(23 downto -8);
M_AXIS_TDATA <= std_logic_vector (fixed3); 

使用定点进行std_logiC-vector的算术运算是否正确?

让我们举一个例子,z = 0x01-0x11。这将给出负输出(0xF0):但我不想要负输出。我希望看到这个价值是积极的。我甚至试图将这些信号类型更改为无符号,但仍然无法成功。实际上我在vhdl中有一些复杂的数学运算,所以我只是举一个例子来说明我的观点是可以理解的。我不想使用签名值。如何发送正无符号输出?

又如:如果我的输出是bf978000,它将显示为负数-1.18。我希望它是积极的,而不是消极的。

让我再举一个例子:

z = 2+ [0.2 *(4-10)] = 0.8。 固定点格式为0.8(0x000000cd)(24整数,8分数格式): 0.2是固定点格式的0x00000033。 (24整数,8分数格式) 但我得到[0x00000002 +(0x00000033 *(0x00000004-0x0000000A)] = FFFFFED0。(这是负数)。如何再次将该输出表示为0.8。

2 个答案:

答案 0 :(得分:1)

如果您可以直接使用z <= x - y,听起来您使用的是ieee.std_logic_unsigned之类的Synopsys软件包,但您可以考虑使用VHDL标准软件包ieee.numeric_std,这是在下面的例子中使用。

std_logic_vector默认情况下不具有任何数字表示形式;它只是一个std_logic的数组。 unsigned包中的ieee.numeric_std类型可以指示执行std_logic_vector的{​​{1}}的数字表示。因此,使用无符号减法的上述表达式将为:

unsigned(x).

任何欠载/超限,与“z = 0x01-0x11”一样,将导致包装而没有任何指示。

答案 1 :(得分:1)

我认为你的问题需要一些改进。我不知道它为什么标记了verilog,你所显示的十六进制数字没有被签名,std_logic_vector首先不是算术(添加这样的解释是用std_logic_arith或类似的,但是它最好使用unsigned并从numeric_std签名)。因此,你的代码必须有更多的减法甚至工作,所显示的负数必须来自其他东西;也许是一个模拟器?模拟器和波形查看器往往有自己的设置来解释信号。

因此,展开您的样本以显示您正在使用的环境,并解释您实际寻求的操作。你的意思是采取差异的绝对值,还是使用饱和算术?