如何在VHDL中使用体系结构内的实体

时间:2016-11-09 11:26:37

标签: entity vhdl fpga quartus

我的目的是强制使用Button entites的键盘实体。

所以我编写了以下VHDL代码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Keyboard is
    port ( ck, stop :       in STD_LOGIC;
             data_in :  in STD_LOGIC_VECTOR (11 downto 0);
             data_out : out STD_LOGIC_VECTOR (3 downto 0));
end Keyboard;

entity Button is
    port ( clk :         in STD_LOGIC ;
             signal_in : in STD_LOGIC;
          output :   out STD_LOGIC);
end Button;

architecture test of Keyboard is
    signal NUM : STD_LOGIC_VECTOR (11 downto 0) := (others=>'0');

    component Button is
    port ( clk :         in STD_LOGIC ;
             signal_in : in STD_LOGIC;
          output :   out STD_LOGIC);
    end component;

    begin

    num_0 : entity Button port map(ck,data_in(0),NUM(0));
    num_1 : entity Button port map(ck=>clk,data_in(1)=>signal_in,NUM(1)=>output);
    num_2 : entity Button port map(ck=>clk,data_in(2)=>signal_in,NUM(2)=>output);
    num_3 : entity Button port map(ck=>clk,data_in(3)=>signal_in,NUM(3)=>output);
    num_4 : entity Button port map(ck=>clk,data_in(4)=>signal_in,NUM(4)=>output);
    num_5 : entity Button port map(ck=>clk,data_in(5)=>signal_in,NUM(5)=>output);
    num_6 : entity Button port map(ck=>clk,data_in(6)=>signal_in,NUM(6)=>output);
    num_7 : entity Button port map(ck=>clk,data_in(7)=>signal_in,NUM(7)=>output);
    num_8 : entity Button port map(ck=>clk,data_in(8)=>signal_in,NUM(8)=>output);
    num_9 : entity Button port map(ck=>clk,data_in(9)=>signal_in,NUM(9)=>output);
    num_on : entity Button port map(ck=>clk,data_in(10)=>signal_in,NUM(10)=>output);
    num_off : entity Button port map(ck=>clk,data_in(11)=>signal_in,NUM(11)=>output);

    output <= "0000" when NUM = "000000000001" else --0
                 "0001" when NUM = "000000000010" else --1
                 "0010" when NUM = "000000000100" else --2
                 "0011" when NUM = "000000001000" else --3
                 "0100" when NUM = "000000010000" else --4
                 "0101" when NUM = "000000100000" else --5
                 "0110" when NUM = "000001000000" else --6
                 "0111" when NUM = "000010000000" else --7
                 "1000" when NUM = "000100000000" else --8
                 "1001" when NUM = "001000000000" else --9
                 "1010" when NUM = "010000000000" else --ON
                 "1100" when NUM = "100000000000" else --OFF
                 "1111";

end test;

architecture EdgeDetector of Button is
    signal signal_d:STD_LOGIC;
    begin

    process(clk)
    begin
        if clk= '1' and clk'event then
            signal_d<=signal_in;
      end if;
    end process;

     output<= (not signal_d) and signal_in; 
end EdgeDetector;

通过在QuartusII上开始编译,我面临以下错误:

  

错误(10482):PitAlarm.vhd上的VHDL错误(11):对象“STD_LOGIC”是   已使用但未声明

但我无法理解“未宣布”是什么意思???

1 个答案:

答案 0 :(得分:1)

使用“直接实体实例化”,您将实体显式绑定到特定库之外,而不是使用“配置”或某些默认策略来查找匹配的实体。因此,num_0 : entity Work.Button port map(...); - 请注意显式库名称(此处为Work)。

您找到的具体错误

  

未声明std_logic

来自库子句的可见性规则。

Button自己的实体/ arch通常位于一个单独的文件中,在编译顶层之前单独编译。

然后它将为声明std_logic的库提供自己的库/ use子句。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

如果同一文件中有多个实体,则此子句仅适用于以下实体声明(并使其在相应的体系结构中可见)。

因此,您需要在文件中的每个实体声明之前重复这两行。