2016-11-09 1 views
1

Моя цель - импортировать объект Keyboard, который использует Button entites.Как использовать сущность внутри архитектуры в 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: entity Work.Button (ck, data_in (0), NUM (0)); и сохраняя остальное как предыдущую запись. – pittuzzo

ответ

1

Использование «прямого экземпляра объекта» вы явно привязываете объект из определенной библиотеки вместо использования «конфигурации» или некоторой стратегии по умолчанию, чтобы найти подходящую. Итак, num_0 : entity Work.Button port map(...); - обратите внимание на явное имя библиотеки (здесь, Work).

Специфическая ошибка вы найдете

std_logic not declared

происходит от правил видимости для библиотеки статей.

Собственная сущность/арка Button обычно находится в отдельном файле, отдельно скомпилированном перед компиляцией верхнего уровня.

Тогда у него будут свои собственные библиотеки/статьи для библиотеки, где объявляется std_logic.

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

С более чем одного объекта в том же файле, этот пункт относится только к следующему объявлении объекта (и делает его видимым о соответствующих архитектур).

Поэтому вам нужно повторить эти две строки перед каждым объявлением сущности в файле.

+0

Перед кнопкой и клавиатурой были 2 разных файла vhdl, и у меня была та же проблема. Но решение - это то, что вы написали: я должен скомпилировать перед Button. Большое спасибо :) – pittuzzo

+0

Тогда у вас была бы другая ошибка, возможно, 'Button' не была объявлена, а не' std_logic'. –