"Предупреждение C0007: в архитектуре есть несвязанные экземпляры"!
У меня есть следующий исходный код с компакт-диска, прилагаемого к книге "Основы цифрового дизайна".
Когда я попытался запустить программу, она выдала мне следующую ошибку:
Compiling Fig17_13.vhd...
C:\Users\SPIDER\Desktop\EE460\The Final Project\Fig17_13.vhd(25): Warning C0007 : Architecture has unbound instances (ex. ct2)
Done
Как я могу исправить эту проблему?
Вот код:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity c74163test is
port(ClrN,LdN,P,T1,Clk: in std_logic;
Din1, Din2: in std_logic_vector(3 downto 0);
Count: out integer range 0 to 255;
Carry2: out std_logic);
end c74163test;
architecture tester of c74163test is
component c74163
port(LdN, ClrN, P, T, Clk : in std_logic;
D: in std_logic_vector(3 downto 0);
Cout: out std_logic; Qout: out std_logic_vector(3 downto 0) );
end component;
signal Carry1: std_logic;
signal Qout1, Qout2: std_logic_vector(3 downto 0);
begin
ct1: c74163 port map (LdN,ClrN,P,T1,Clk,Din1,Carry1, Qout1);
ct2: c74163 port map (LdN,ClrN,P,Carry1,Clk,Din2,Carry2,Qout2);
Count <= Conv_integer(Qout2 & Qout1);
end tester;
1 ответ
Вы действительно читали конкретный дизайн раньше (я думаю, что в Fig17_12.vhd
)? В противном случае ваш экземпляр - просто черный ящик (что, я думаю, подразумевается под "несвязанным экземпляром").
Компонент VHDL можно представить себе как пластиковый разъем для микросхемы. Думайте о сущности как о микросхеме, которая в нее вставляется. Экземпляры в вашем коде являются компонентами: думайте о своем коде как о печатной плате (вашей архитектуре) с припаянными к ней пластиковыми гнездами (компонентами). Вам нужны фишки (сущности).
Как микросхемы попадают в розетки? Или, говоря более формально, как сущности привязываются к компонентам. Что ж, (i) если их имена совпадают, то привязка происходит автоматически (но доработка не удастся, если порты разные). Если имена не совпадают (или если порты разные), вам необходимо написать конфигурацию VHDL, чтобы сопоставить объект и компонент.
Итак, в вашем случае вы либо
(i) не составили структуру c74163
или
(ii) сделали это, но предприятие c74163
не идентичен компоненту c74163
, то есть:
entity c74163
port(LdN, ClrN, P, T, Clk : in std_logic;
D: in std_logic_vector(3 downto 0);
Cout: out std_logic; Qout: out std_logic_vector(3 downto 0) );
end entity;
Вы должны спросить себя, действительно ли вам нужно использовать создание экземпляров компонентов. Создание экземпляров компонентов было единственным видом создания экземпляров до VHDL-93, но с тех пор у вас есть выбор также использовать прямое создание экземпляров, при котором вы просто создаете экземпляры сущностей и не используете компоненты вообще. Думайте о прямом создании экземпляра, как о припаивании микросхем непосредственно к печатной плате; пластиковые розетки не используются.
Прямое создание экземпляров обычно является правильным выбором: это проще, и вам не нужно беспокоиться о том, чтобы писать все дважды (в сущности и в компоненте). Обратной стороной является то, что теперь вы должны убедиться, что объект скомпилирован, прежде чем любая архитектура, создающая его экземпляр.
Вот ваш код, написанный с использованием прямого создания экземпляра:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity c74163test is
port(ClrN,LdN,P,T1,Clk: in std_logic;
Din1, Din2: in std_logic_vector(3 downto 0);
Count: out integer range 0 to 255;
Carry2: out std_logic);
end c74163test;
architecture tester of c74163test is
signal Carry1: std_logic;
signal Qout1, Qout2: std_logic_vector(3 downto 0);
begin
ct1: entity work.c74163 port map (LdN,ClrN,P,T1,Clk,Din1,Carry1, Qout1);
ct2: entity work.c74163 port map (LdN,ClrN,P,Carry1,Clk,Din2,Carry2,Qout2);
Count <= Conv_integer(Qout2 & Qout1);
end tester;