【问题标题】:vhdl subtract std_logic_vectorvhdl 减去 std_logic_vector
【发布时间】:2015-12-02 08:19:52
【问题描述】:

我正在尝试减去 2 个标准逻辑向量并得到错误

p2 <= p1(11 downto 0)- idata(11 downto 0);

错误 (10327):sub.vhd(32) 处的 VHDL 错误:无法确定运算符“-”的定义——找到 0 个可能的定义

我已经尝试添加 use IEEE.std_logic_signed.alluse IEEE.std_logic_unsigned.all 或两者并已尝试 p2 &lt;= std_logic_vector(unsigned(p1(11 downto 0)) - unsigned(idata(11 downto 0)));

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
--use IEEE.std_logic_signed.all;
--use IEEE.std_logic_unsigned.all;

entity sub is 

port (  
    clk         : in    std_logic;
    rst         : in    std_logic;
    --en            : in    std_logic;  
    idata    : in    std_logic_vector (11 downto 0);
    odata    : out  std_logic_vector (11 downto 0)  
);
end sub;

architecture beh of sub is
signal p1,p2 :std_logic_vector (11 downto 0);
begin
    process (clk, rst) 
        begin
            if (rst = '1') then
                odata  <= "000000000000";
            elsif (rising_edge (clk)) then  
                    p1 <= idata;
                    p2 <= p1(11 downto 0)- idata(11 downto 0);
                    --p2 <= std_logic_vector(unsigned(p1(11 downto 0)) - unsigned(idata(11 downto 0)));

            end if;             
    end process;
    odata<=p2;
end beh;

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    std_logic_vector 类型只是 std_logic 的数组,它本身没有任何数值解释,因此在尝试应用减号 (-) 等数值运算时会出错。

    不要使用 Synopsys 非标准 std_logic_signed/unsigned/arith 软件包。

    VHDL-2002:使用标准ieee.numeric_std 包中的unsigned 类型将std_logic_vector 转换为unsigned 表示,这允许使用减号等数字运算。代码如下:

    use ieee.numeric_std.all;
    ...
    p2 <= std_logic_vector(unsigned(p1(11 downto 0)) - unsigned(idata(11 downto 0)));
    

    VHDL-2008:使用标准的ieee.numeric_std_unsigned 包将std_logic_vector 转换为unsigned 表示,这允许使用减号等数字运算。代码如下:

    use ieee.numeric_std_unsigned.all;
    ...
    p2 <= p1(11 downto 0) - idata(11 downto 0);
    

    顺便说一句。查看此search 以了解类似问题。

    【讨论】:

    • VHDL 标准的 -2008 修订版还包含一个 numeric_std_unsigned 包,它为 std_logic_vector 提供无符号操作包装。
    • 使用numeric_std_unsigned 包更新了符合VHDL-2008 代码的答案。
    • 2008 不向后兼容 2002 吗?我无法编译上面的 2002 答案,抱怨没有声明 operator+,即使我导入了 ieee.numeric_std.all
    • 上述 VHDL-2002 代码中的构造在编译 VHDL-2008 时也可用,并且由于从 VHDL-2002 移动到 VHDL-2008 编译时通常不会重写代码,因此被广泛使用。
    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多