我使用VHDL在Quartus II上创建了一个新项目,但是在运行之后给出了下面显示的错误。你知道为什么吗?
错误(10481):VHDL在test_VHDL.vhd使用子句错误(5):设计库“work”不包含主单元“std_arith”
错误(10800):test_VHDL.vhd(5)处的VHDL错误:use子句中的选定名称不是扩展名称
错误:Quartus II 64位分析&合成不成功。 2个错误,1个警告
错误:峰值虚拟内存:1003兆字节
错误:处理结束:2015年12月5日星期六19:50:39
错误:经过时间:00:00:13
错误:总CPU时间(在所有处理器上):00:00:38
错误(293001):Quartus II完全编译失败。 4个错误,1个警告
这是我的代码:
library ieee;
use ieee.std_logic_1164.all;
library work;
use work.std_arith.all; --extinde operatorul ” + “ la opera]ii \ntre semnale
--[i numere \ntregi
entity SUM is
port (a : in std_logic_vector(3 downto 0);
b : in std_logic;
ini,start,clk,a_disponibil,b_disponibil : in std_logic;
sum : out std_logic_vector(4 downto 0);
q : inout std_logic_vector(4 downto 0));
end SUM;
architecture arch_SUM of SUM is
signal load_a,load_b,reset,load_s : std_logic;
signal z : std_logic_vector(0 to 3);
type STARE is (S0,S1,S2,S3,S4); --st`rile automatului
signal S : STARE;
begin
--NUMARATOR
---------------------------------------------------------------
NUM : process(b)
begin
if rising_edge(b) then
if reset='1' then q<=(others=>'0');
elsif load_a='1' then
for i in 3 downto 0 loop --\ncarc` operandul a
q(i) <= a(i); --\n ultimii 3 bistabili
end loop; --ai num`r`torului
elsif load_b='1' then
q <= q+1; --adun` b la a
end if;
end if;
end process NUM;
--REGISTRU
--------------------------------------------------------------------
REG: process(clk)
begin
if rising_edge(clk) then
if reset='1' then sum<=(others=>'0');
elsif load_s='1' then
sum<=q;
end if;
end if;
end process REG;
--AUTOMAT
-----------------------------------------------------------------------------------
AUTOMAT : process(ini,clk)
begin
if INI='1' then s<=S0; --ini]ializeaz` automatul
elsif rising_edge(clk) then
case S is --descrie diagrama st`rilor
when S0 =>
if start='1' then S<=S1;
else S<=S0;
end if;
when S1 =>
if a_disponibil='1' then S<=S2;
else S<=S1;
end if;
when S2 =>
if b_disponibil='1' then S<=S3;
else S<=S2;
end if;
when S3 =>
if b_disponibil='0' then S<=S4;
else S<=S3;
end if;
when S4 => S<=S0;
end case;
end if;
end process AUTOMAT;
with S select
z<= "0000" when S0, --genereaz` ie[irea
"0010" when S1,
"1000" when S2,
"0100" when S3,
"0001" when others;
load_a <= z(0);
load_b <= z(1); --conexiuni interne
reset <= z(2);
load_s <= z(3);
end arch_SUM;
有谁知道为什么以及如何解决它?
答案 0 :(得分:1)
语句use work.std_arith.all;
引入了sysnthesis编译器,以便在与VHDL文件相同的库中查找包std_arith
。如果您没有在Quartus项目设置中指定一个,那么它将是默认库。在这种情况下,您必须提供自己的包实现,并将此文件添加到Quartus项目中。
如果您正在寻找Synopsys的非标准软件包,那么您必须将该行更改为use ieee.std_logic_arith.all;
。但是,此库未为类型+
定义运算符std_logic_vector
。 编辑如果您希望将std_logic_unsigned
视为无符号数字,则必须在包std_logic_vector
中定义所需的运算符。该软件包随use ieee.std_logic_unsigned.all;
一起提供。如果您想要签名算术,请添加use ieee.std_logic_signed.all;
。
但是,我建议使用标准IEEE库ieee.numeric_std
,它定义了矢量类型unsigned
和signed
上的算术运算符。
例如,在实体中声明
sum : out unsigned(4 downto 0);
q : inout unsigned(4 downto 0);