如何获取std_logic_vector的绝对值?在VHDL中

use*_*864 3 vhdl

我无法弄清楚如何取两个std_logic_vector的绝对值(31 downto 0);

这是代码的一个例子:

library ieee;
use ieee.std_logic_1164.all;        
use ieee.numeric_std.all;       -- for the signed, unsigned types and arithmetic ops
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
...
...
port (  
    X: in std_logic_vector(31 downto 0); 
    Y: in std_logic_vector(31 downto 0); 
    F: out std_logic_vector(31 downto 0) 
  );

..
..
..
process(X,Y)
 begin
 F <= abs(X-Y)     --this doesnt work
Run Code Online (Sandbox Code Playgroud)

wjl*_*wjl 6

沟通非标准库包括并使用signed具有内置abs函数的标准类型:

library ieee;
use ieee.std_logic_1164.all;        
use ieee.numeric_std.all; -- this is the standard package where signed is defined
-- never use non-standard ieee.std_logic_arith and ieee.std_logic_unsigned

...

port (  
  X: in  std_logic_vector(31 downto 0); 
  Y: in  std_logic_vector(31 downto 0); 
  F: out std_logic_vector(31 downto 0) 
);

...

process(X,Y) is
begin
  F <= std_logic_vector(abs(signed(X)-signed(Y)));
end process;
Run Code Online (Sandbox Code Playgroud)

最后一行有很多[可能是不必要的]在std_logic_vector和之间进行转换signed,所以你可能更喜欢这个界面,如果它对你的设计的其余部分有意义:

port (  
  X: in  signed(31 downto 0); 
  Y: in  signed(31 downto 0); 
  F: out signed(31 downto 0) 
);
Run Code Online (Sandbox Code Playgroud)

然后最后一行是:

 F <= abs(X-Y);
Run Code Online (Sandbox Code Playgroud)

  • 因为添加 std_logic_vectors 没有意义。添加签名是有道理的;添加无符号数也有意义;正确的答案可能取决于类型...... VHDL 是关于准确说出你想要发生的事情。 (3认同)
  • 如果没有传送类型,则无法使用std_logic_vector区分每个添加,乘法和签名运算符中的有符号和无符号.这是克服VHDL限制而非硬件区别的符号学区别.另外(signed(X)-signed(Y))向VHDL传达相同的信息,将这些std_logic_vector信号视为已签名.强类型有时也可以防止std_ulogic数组的有符号和无符号整数表示之间的操作的错误设计规范.我们也可能对VHDL允许的内容提出迂腐的反对意见. (2认同)