2016-11-09 82 views
1

我的目的是阻止使用Button實體的Keyboard實體。如何在VHDL體系結構中使用實體

所以我寫了下面的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我面臨以下錯誤編譯:

Error (10482): VHDL error at PitAlarm.vhd(11): object "STD_LOGIC" is used but not declared

但我不明白它「不是指宣佈「???

+0

Actuallay我已經嘗試過但沒有積極的結果。我使用'num_0:實體Work.Button端口映射(ck,data_in(0),NUM(0));',並將其餘部分保留爲我以前的帖子來面對相同的錯誤。 – pittuzzo

回答

1

使用「直接實體實例化」,您明確地將實體綁定到特定庫之外,而不是使用「配置」或某種默認策略來查找匹配的實體。因此,num_0 : entity Work.Button port map(...); - 請注意顯式庫名稱(這裏是Work)。

特定的錯誤你會發現

std_logic not declared

來自圖書館子句中的可見性規則。

按鈕自己的實體/ arch通常會在編譯頂層之前單獨編譯的文件中。

然後,它將擁有自己的圖書館/使用條款,其中聲明std_logic的圖書館。

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

在同一個文件中多個實體,本節僅適用於以下實體聲明(並使其Ø相應的架構可見)。

因此,您需要在文件中的每個實體聲明之前重複這兩行。

+0

按鈕和鍵盤之前2個不同的VHDL文件,我有同樣的問題。但解決辦法就是你寫的:我應該在Button之前編譯。非常感謝:) – pittuzzo

+0

然後你會有一個不同的錯誤,可能'沒有聲明Button',而不是'std_logic'。 –