FPGA mit VHDL
VHDL Synthese-Datei Instanziierungsteil
Im Instanziierungsteil von VHDL-Dateien gibt es erst einmal zwei Bereiche:
Die Entity und die Architecture
In der Entity wird die Einheit dieser Instanz beschrieben. Eine Instanz hat "Kontakte" zur Aussenwelt, auch Ports genannt.
Ein Port besteht immer aus einem Namen, gefolgt von einem Doppelpunkt, einer Richtungsbeschreibung (In, Out oder Inout) und eine Beschreibung der Signalart.
Letzteres ist üblicher Weise Standard-Logic (std_logic oder std_logic_vector).
In der Architecure befindet sich die "Logic" der Einheit.
Die Architecture ist wiederum untergliedert in Componenten-Instanziierungen, Signaldefinitionen sowie dem echten Inhalt beginnend mit "begin".
Leider ist es damit noch nicht getan: den im folgenden Teil werden zuerst die oben instanziierten Componenten "verdrahtet", dann folgen die Concurrent-Statements sowie ein oder mehrere Prozesse.
Der Reihe nach:
- Beinhaltet diese Einheit weitere "externe Bauteile", so müssen diese durch eine Componenten-Anweisung erst einmal bekannt gemacht werden.
- Die Signaldefinitionen müssen für die Signale definiert werden, die noch nicht in der Portdeklaration im Entity-Teil benannt wurden.
Weiterhin werden hier die Zustände der Statemachines definiert. - "begin" leitet dann den echten Logikteil ein.
- Nach diesem Begin folgt zuerst einmal die Verdrahtung der externen Bauteile. Hier werden wieder Ports definiert, wobei links die internen Signale der externen Bauteile und rechts die Signale in dieser Einheit benannt werden.
- Das Synthese-Werkzeug kennt generell zwei Arten von "Logik-Verdrahtung/Erzeugung": die Concurrent-Statements und die Process-Statements.
- Concurrent-Statements sind keine getakteten Logikteile. Sie sind immer verfügbar und haben nur die Laufzeitkriterien zu erfüllen. Ein UND-Glied ist zum Beispiel ein solches. Man kann das auch als "Clock-freie Logik" bezeichnen.
- Alles was in einem Process steht, wird mit einem Takt verschaltet und hat immer eine Register-Funktion (D-FlipFlop). Alles was rechts vom Gleichheitszeichen steht, wird erst mit dem nächsten Takt in das Signal geschrieben.
So steht dort eigentlich fast immer "process (CLK, RST)".
Das Bedeutet, dass dieser Prozess eine Sensitivitätsliste (Sensitivity List) mit dem Clock-Signal und dem Reset-Signal hat.
In einer Testbench können auch ganz andere Signalart verwendet werden. Synthesefähig sind aber im weitesten Sinne nur Clock (Taktsignal) und Reset.
Instanziierungs-Grundgerüst einer VHDL-Datei für die Synthese
Die komplette Vorlage für VHDL-Quelltexte kann auch downgeloaded werden.
entity fpga is
Port (
CLK : in std_logic;
RST : in std_logic
);
end fpga;
architecture arc_fpga_intern of fpga is
-- ###########################################
-- Componenten Deklaration
-- ###########################################
component ...
port (
clka: IN std_logic;
rsta: IN std_logic;
:
:
);
end component;
-- ###########################################
-- Defintionen fuer Signale und Statemachines
-- ###########################################
TYPE type_sStatemachine IS (
sStartState, ...);
signal sStatemachine : type_sStatemachine;
signal : std_logic_vector(15 downto 0);
signal : std_logic;
begin
-- ###########################################
-- Componenten Instanziierung
-- ###########################################
ram1 : RAM
port map (
clka => CLK,
rsta => RST,
:
:
);
-- ###########################################
-- Concurrent Statements
-- ###########################################
-- ###########################################
-- Process Statements
-- ###########################################
process (CLK, RST)
begin
if (RST='1') then
sStatemachine <= sStartState;
elsif (CLK'event and CLK='1') then -- CLK rising edge
case sStatemachine is
when sStartState =>
when others => NULL;
end case;
end if;
end process;
end arc_fpga_intern;