【问题标题】:how do I take the absolute value of a std_logic_vector? in VHDL如何获取 std_logic_vector 的绝对值?在 VHDL 中
【发布时间】:2014-02-22 01:47:48
【问题描述】:

我不知道如何取两个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

【问题讨论】:

  • 如何使用铅笔和纸计算二进制值的绝对值?只需在 VHDL 中复制该算法即可。
  • @JoeHass 如果您正在学习,或者您需要一些非内置的东西,但在标准 signed 类型上使用内置 abs 时,这是正确的答案@ 类型通常会合成在许多 FPGA 和 ASIC 供应商的合成器中更好地编码,特别是一些内置的数学运算。

标签: vhdl


【解决方案1】:

抛弃非标准库包含并使用具有内置abs函数的标准signed类型:

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;

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

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

那么最后一行就是:

 F <= abs(X-Y);

【讨论】:

  • 嘿,感谢您的回复,当我删除 ieee.std_logic_unsigned_all;我不能再添加或减去逻辑向量。但是当我将逻辑向量转换为有符号时,它会编译:D 我不知道为什么
  • 因为添加 std_logic_vectors 没有意义。添加符号是有意义的;添加无符号也很有意义;正确的答案可能取决于类型...... VHDL 就是要准确地说出你想要发生的事情。
  • 如果不传递类型,则无法使用 std_logic_vector 仅使用每个加法、乘法和签名运算符之一来区分有符号和无符号。这是克服 VHDL 限制的符号学区别,而不是硬件区别。此外 (signed(X)-signed(Y)) 将相同的信息传送到 VHDL,将这些 std_logic_vector 信号视为有符号。强类型有时还可以防止 std_ulogic 数组的有符号和无符号整数表示之间的错误设计规范。我们也可能对 VHDL 中允许的某些内容提出迂腐的反对意见。
  • 抱歉,包含如上所示的库,但得到错误,'function 'abs' not defined .... Using Quartus Prime Light, V20.1.1
猜你喜欢
  • 2021-04-09
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多