错误:库“IEEE”不包含主单元“numeric_std_unsigned”

时间:2016-03-17 19:16:31

标签: vhdl quartus

我正在使用Quartus prime edition v15.1来编写寄存器文件,我需要使用numeric_std_unsigned包。编译时,出现错误

  

错误(10481):VHDL使用子句错误:设计库“IEEE”不包含主单元“NUMERIC_STD_unsigned”。验证主单元是否存在于库中并且已成功编译。

IEEE库如何拥有numeric_std_unsigned包?我搜索了很多,发现IEEE实际上支持它。如果是这样,我怎样才能首先下载软件包并将其安装到编译器或将其添加到我的项目中?

修改

这是我的代码:

library IEEE;
use IEEE.STD_LOGIC_1164.all; 
use IEEE.std_logic_arith.all;
use IEEE.numeric_std_unsigned.all;


entity regfile is
  port( clk: in STD_LOGIC;
        regwrite: in STD_LOGIC; 
        rs, rt, rd: in STD_LOGIC_VECTOR(1 downto 0); 
        data_in: in STD_LOGIC_VECTOR(15 downto 0); 
        rd1, rd2: out STD_LOGIC_VECTOR(15 downto 0)); 
end;

architecture behave of regfile is 
  type registerFile is array (3 downto 0) of STD_LOGIC_VECTOR(15 downto 0);
  signal registers: registerFile;
begin 
  process(clk) begin

    if rising_edge(clk) then 
      if regwrite='1' then
        registers(to_integer(unsigned(rd))) <= data_in; 
      end if;
     end if;
  end process;

  process(all)
  begin
    if (to_integer(rs)=0) 
    then rd1 <= X"0000"; 
    else rd1 <= registers(to_integer(unsigned(rs))); 
    end if;

    if (to_integer(rt)=0) 
    then rd2 <= X"0000";
    else rd2 <= registers(to_integer(unsigned(rt)));
    end if;
  end process; 
end;

当我使用IEEE.numeric_std_unsigned.all时,编译器会报告我在上面发布的错误。

当我使用IEEE_numeric_std.all时,编译器报告

  1. 无法确定to_integer
  2. 处的对象类型
  3. 多个Use子句导入简单名称unsigned的声明 - 没有任何声明直接可见

3 个答案:

答案 0 :(得分:1)

一旦您修改了问题以提供Minimal, Complete, and Verifiable example,错误就会清晰可见。

使用std_logic_arith删除use子句,它与numeric_std_unsigned使用的无符号声明包不兼容(从调用ieee.numeric_std.all的use子句引用)。在它的位置使用

use ieee.numeric_std.all; 

to_integer架构中的一些regfile函数调用具有[STD_ULOGIC_VECTOR return NATURAL]的签名。

(STD_ULOGIC_VECTOR是VHDL -2008中包std_logic_1164中已解析子类型STD_LOGIC_VECTOR的基本类型)。

某些to_integer转化函数调用(例如to_integer(rs))需要包numeric_std_unsigned。

依赖于包numeric_std的那些(例如registers(to_integer(unsigned(rs)))也依赖于unsigned类型的可见声明与在nu​​meric_std包中可见的同名的类型声明相同(在包numeric_std_unsigned中的use子句中引用)

在VHDL中,即使它们具有相同的名称,每个声明也是唯一的。您引用的是由可见性规则控制的。

在更改use子句之前,只有在Synopsys包中声明的无符号类型在您的实体和体系结构对中可见。

将std_logic_arith切换为numeric_std后,您的代码将使用符合-2008标准的VHDL实现进行分析:

library IEEE;
use IEEE.STD_LOGIC_1164.all; 
-- use IEEE.std_logic_arith.all;
use ieee.numeric_std.all;
use IEEE.numeric_std_unsigned.all;

entity regfile is
    port ( 
        clk:        in  STD_LOGIC;
        regwrite:   in  STD_LOGIC; 
        rs, rt, rd: in  STD_LOGIC_VECTOR(1 downto 0); 
        data_in:    in  STD_LOGIC_VECTOR(15 downto 0); 
        rd1, rd2:   out STD_LOGIC_VECTOR(15 downto 0)
    ); 
end entity;

architecture behave of regfile is 
    type registerFile is array (3 downto 0) of STD_LOGIC_VECTOR(15 downto 0);
    signal registers: registerFile;
begin 
    process (clk) 
    begin
        if rising_edge(clk) then 
            if regwrite = '1' then
                registers(to_integer(unsigned(rd))) <= data_in; 
            end if;
        end if;
    end process;

    process (all)
    begin
        if to_integer(rs) = 0 then 
            rd1 <= X"0000"; 
        else 
            rd1 <= registers(to_integer(unsigned(rs))); 
        end if;

        if to_integer(rt) = 0 then 
            rd2 <= X"0000";
        else 
            rd2 <= registers(to_integer(unsigned(rt)));
        end if;
    end process; 
end architecture;

样式更改不是唯一的更改是use子句。

您可以通过将签名为[UNSIGNED return NATURAL]的to_integer函数调用更改为[STD_ULOGIC_VECTOR return NATURAL]来删除对包numeric_std的依赖:

library ieee;
use ieee.std_logic_1164.all; 
-- use IEEE.std_logic_arith.all;
-- use ieee.numeric_std.all;
use IEEE.numeric_std_unsigned.all;

entity regfile is
    port ( 
        clk:        in  std_logic;
        regwrite:   in  std_logic; 
        rs, rt, rd: in  std_logic_vector(1 downto 0); 
        data_in:    in  std_logic_vector(15 downto 0); 
        rd1, rd2:   out STD_LOGIC_VECTOR(15 downto 0)
    ); 
end entity;

architecture behave of regfile is 
    type registerFile is array (3 downto 0) of STD_LOGIC_VECTOR(15 downto 0);
    signal registers: registerFile;
begin 
    process (clk) 
    begin
        if rising_edge(clk) then 
            if regwrite = '1' then
                registers(to_integer(rd)) <= data_in; 
            end if;
        end if;
    end process;

    process (all)
    begin
        if to_integer(rs) = 0 then 
            rd1 <= X"0000"; 
        else 
            rd1 <= registers(to_integer(rs)); 
        end if;

        if to_integer(rt) = 0 then 
            rd2 <= X"0000";
        else 
            rd2 <= registers(to_integer(rt));
        end if;
    end process; 
end architecture;

注意我们已经删除了包含numeric_std的use子句,并删除了一些类型转换,用于生成索引名称的索引,选择registers元素来写入寄存器文件以及两个读取端口。

对代码示例的这些修改都会分析,详细说明并模拟告诉我们索引是否正常工作。仅使用包numeric_std_unsigned的第二个增强了可读性。

当然,如果您的VHDL工具实际上缺少数据包numeric_std_unsigned并且通过重新安装或更新Quartus工具无法解决,您可以使用符合-1993标准的设计说明:

library ieee;
use ieee.std_logic_1164.all;
-- use IEEE.std_logic_arith.all;
use ieee.numeric_std.all;
-- use IEEE.numeric_std_unsigned.all;

entity regfile is
    port (
        clk:        in  std_logic;
        regwrite:   in  std_logic;
        rs, rt, rd: in  std_logic_vector(1 downto 0);
        data_in:    in  std_logic_vector(15 downto 0);
        rd1, rd2:   out STD_LOGIC_VECTOR(15 downto 0)
    );
end entity;

architecture behave of regfile is 
    type registerFile is array (3 downto 0) of STD_LOGIC_VECTOR(15 downto 0);
    signal registers: registerFile;
begin
    process (clk)
    begin
        if rising_edge(clk) then
            if regwrite = '1' then
                registers(to_integer(unsigned(rd))) <= data_in;
            end if;
        end if;
    end process;

    process (rs, rt) -- (all)
    begin
        if to_integer(unsigned(rs)) = 0 then
            rd1 <= X"0000";
        else
            rd1 <= registers(to_integer(unsigned(rs)));
        end if;

        if to_integer(unsigned(rt)) = 0 then
            rd2 <= X"0000";
        else
            rd2 <= registers(to_integer(unsigned(rt)));
        end if;
    end process;
end architecture;

如果手动指定了过程敏感性列表,并且所有to_integer调用都来自包numeric_std,则需要对std_logic_vector值进行无符号类型转换。

(并进行分析,阐述和模拟)。

答案 1 :(得分:0)

我认为您的意思是unsigned库中numeric_std包的ieee类型。

library ieee;
use ieee.numeric_std.all;
...
signal foo : unsigned(7 downto 0);

library ieee;
use ieee.numric_std;
...
signal bar : numeric_std.unsigned(7 downto 0);

答案 2 :(得分:0)

Quartus Prime 15.1的安装文件夹实际上包含一个名为numeric_std_unsigned_vhdl2008.vhd的文件,它定义了包numeric_std_unsigned及其主体。但是,显然合成器不支持它。

Quartus Prime Standard Handbook v15.1.1,第1卷在第16节中给出了&#34; VHDL综合支持&#34; - &GT; &#34; VHDL-2008支持&#34;指向this online help page的链接。在撰写本回答时,支持的VHDL&#08; 08功能列表引用VHDL&#08; 08标准的第16.8.5节,它定义了包numeric_std_unsigned。也没有提到附录A.2.4。

Quartus手册中的以下小节进一步说明:

  

Quartus Prime软件包括标准IEEE库和几个供应商特定的VHDL库。

     

IEEE库包括标准VHDL包std_logic_1164,numeric_std,numeric_bit和math_real。

鉴于此,您必须恢复使用numeric_std包。但是,此包定义了类型unsigned,它也在std_logic_arith中定义。你应该再使用Synopsys的非标准std_logic_arith软件包。

因此,您必须使用包numeric_std而不是numeric_std_unsignedstd_logic_arith.。然后,您必须先将所有std_logic_vector转换为unsigned,然后再将它们作为参数传递给函数to_integer,例如:

to_integer(unsigned(rs))

而不是

to_integer(rs)