Also folge ich diesem Tutorial, in dem sie einige grundlegende VHDL erklären, indem sie einen Vier-Bit-Addierer als Beispiel verwenden:
-- Example of a four bit adder
library ieee;
use ieee.std_logic_1164.all;
-- definition of a full adder
entity FULLADDER is
port (a, b, c: in std_logic;
sum, carry: out std_logic);
end FULLADDER;
architecture fulladder_behav of FULLADDER is
begin
sum <= (a xor b) xor c ;
carry <= (a and b) or (c and (a xor b));
end fulladder_behav;
-- 4-bit adder
library ieee;
use ieee.std_logic_1164.all;
entity FOURBITADD is
port (a, b: in std_logic_vector(3 downto 0);
Cin : in std_logic;
sum: out std_logic_vector (3 downto 0);
Cout, V: out std_logic);
end FOURBITADD;
architecture fouradder_structure of FOURBITADD is
signal c: std_logic_vector (4 downto 0);
component FULLADDER
port(a, b, c: in std_logic;
sum, carry: out std_logic);
end component;
begin
FA0: FULLADDER
port map (a(0), b(0), Cin, sum(0), c(1));
FA1: FULLADDER
port map (a(1), b(1), C(1), sum(1), c(2));
FA2: FULLADDER
port map (a(2), b(2), C(2), sum(2), c(3));
FA3: FULLADDER
port map (a(3), b(3), C(3), sum(3), c(4));
V <= c(3) xor c(4);
Cout <= c(4);
end fouradder_structure;
Ich versuche zu verstehen, warum der component
Teil in die fouradder_structure
in der FULLADDER-Entität verwendeten Ports neu definieren muss; Beide enthalten die folgenden Teile:
port(a, b, c: in std_logic;
sum, carry: out std_logic);
Ich habe dann irgendwo gelesen , dass component
die Schnittstelle definiert wird, die der fouradder_structure
erwartet. Das würde erklären, warum entity
und component
beide die verwendeten Ports deklarieren müssen, aber woher weiß der dann, dass er die zuvor definierte Entität fouradder_structure
verwenden soll ? FULLADDER
Ist es eine Namenskonvention?
TL; DR , wie ist sich die Architektur fouradder_structure
bewusst, dass sie die Entität verwenden muss FULLADDER
?
Wenn Sie nicht angeben, welche Architektur eine Entitätsinstanziierung verwenden wird, verwendet sie die zuletzt kompilierte Architektur für diese Entität.
Persönlich würde ich die direkte Instanziierung von Entitäten verwenden. Um dies zu verwenden, löschen Sie die Komponentendeklaration ( component FULLADDER ...
) und instanziieren Sie sie folgendermaßen:
FA0: entity work.FULLADDER(fulladder_behav)
port map ( ...
Auf diese Weise können Sie leicht erkennen, welche Architektur verwendet wird, und Sie sparen sich die Pflege einer Komponentendeklaration sowie der Instanziierung.
Wenn Sie dies aus irgendeinem Grund nicht tun möchten, sehen Sie sich die Verwendung von configuration
s an.
configuration
Sie können mit einer Anweisung steuern, welche Entität (und welche ihrer Architekturen) an eine bestimmte Komponente gebunden ist (vorausgesetzt, sie hat kompatible Schnittstellen, dh Port- und generische Listen). Dies kann entweder Teil der Architektur sein – eine eingebettete Konfiguration – oder eine separat kompilierte Einheit, z. B. in einer separaten Datei.
Wenn Sie sich nicht um Konfigurationen kümmern, erhalten Sie die Standardkonfiguration. Oder Sie können sowohl Komponenten als auch Konfigurationen mit direkter Entitätsinstanziierung umgehen – beide Ansätze werden in Jeffs Antwort beschrieben. (Die direkte Instanziierung von Entitäten ist am einfachsten und scheint heutzutage oft der bevorzugte Ansatz zu sein).
Benutzer1534664
scary_jeff
Benutzer1534664
Michael
scary_jeff