1. Block 2. Signal Blöcke: Zähler, Multiplexer, Dekoder, ... Blöcke werden über Signale miteinander verbunden 1.) Konventionen 1.1.) Namensregeln 1.2.) Kommentare 1.3.) Zuweisungen 2.) Typologie 3.) Vektoren 4.) Aufbau der Schaltungsbeschreibung 4.1.) Header mit Bibliothek und Packageeinbindungen 4.2.) Entity für Schnittstellendefinition 4.3.) Architecture für Funktionsbeschreibung 5.) Nebenläufige oder sequentielle Umgebungen 5.1.) Nebenläufig 5.2.) Sequentiell 6.) Anweisungen 6.1.) Einfache Verknüpfungen 6.2.) Arithmetische Operatoren 6.3.) with/select 6.4.) when/else 6.5.) if/then 6.6.) case/is 1.) Konventionen 1.1.) Namensregeln - Zwischen Gross und Kleinschreibung wird in VHDL nicht unterschieden - ... das übliche 1.2.) Kommentare - Komentare werden durch doppelten Bindestrich eingeleitet --s 1.3.) Zuweisungen - Zuweisungen - Signal an ein anderes Signal - konstanter Wert an Signal - Zeichenkombination <= - Von rechts nach links Beispiel: Y <= S; Y <= A or B; -- Falsch A => Y; -- Falsch 2.) Typologie - VHDL ist streng typgebundene Sprache Es genügt: - boolean - bit - std_logic 1.) Typ: boolean 1.1.) Wertevorrat: true, false 1.2.) Verwendung: logische Abfragen (if) 2.) Typ: bit 2.1.) Wertevorrat: 0, 1 2.2.) Verwendung: Entwurf 3.) Typ: std_logic: 2.1.) Wertevorrat: 0, 1, Z, -, L, H, X, W 2.2.) Entwurf und Simulation Deklartion: signale : typ; signal x0, x1, x2, x3: bit; signal EN: std_logic; signal on_of: boolean; Bei Verknüpfungen müssen einzelne Signale vom selben Typ sein 0: starke 0 1: starke 1 Z: hochohmig -: don't care U: unbekannt X: konflikt L: Schwache 0 H: Schwache 1 W: Schwaches X 3.) Vektoren 3.1.) Deklaration signal : typ ( to ); signal : typ ( downto ); signal x: bit_vector(0 to 7); signal a: std_logic_vector(2 to 4); signal r: bit_vector(3 downto 0); 3.2.) Zuweisungen c <= a or b; c <= ('1', '0', '0', '0'); c <= "1000"; 4.) Aufbau der Schaltungsbeschreibung 4.1.) Header mit Bibliothek und Packageeinbindungen 4.2.) Entity für Schnittstellendefinition 4.3.) Architecture für Funktionsbeschreibung 4.1.) Header - Definitionen die für Schaltungsbeschreibung gelten sollen library ieee; use ieee.std_logic_1164.all use ieee.std_logic_unsigned.all 4.2.) Entity 1.) Eingang 2.) Ausgang 3.) Bidirektional 1.) Eingang: in 2.) Ausgang: out 3.) Bidirektional: inout entity is port ( : ; : ; : ); end; entity multiplexer is port ( a0, a1, a2, a3: in bit; b0, b1, b2, b3: in bit; s: in bit; y0, y1, y2, y3: out bit; ); end; entity counter is port ( clk: in bit; rst: in bit; q: out bit_vector (3 downto 0) ); end; 3.) Die Funktion - Architecture architecture of is -- locale signale begin -- functionsbeschreibung end; architecture mymux of multiplexer is signal a, b, y: bit_vector (0 to 3); begin a <= (a0, a1, a2, a3); b <= (b0, b1, b2, b3); y <= a when (s='0') else b; y0 <= y(0); y1 <= y(1); y2 <= y(2); y3 <= y(3); end mymux 5.) Nebenläufige oder sequentielle Umgebungen 5.1.) Nebenläufige 5.2.) sequentielle Umgebungen - In C werden alle Anweisungen hintereinander abgearbeitet - Anweisungen in VHDL in der Regel nebenläufig, d.h. parallel - Befindet man sich in einer nebenläufigen oder Sequentiellen Umgebung? Aus: architecture verhalten of multiplexer is signal a, b, y: bit_vector (0 to 3); begin a <= (a0, a1, a2, a3); b <= (b0, b1, b2, b3); y <= a when (s='0') else b; y0 <= y(0); y1 <= y(1); y2 <= y(2); y3 <= y(3); end verhalten Wird: architecture mymux of multiplexer is signal a, b, y: bit_vector (0 to 3); begin a <= (a0, a1, a2, a3); b <= (b0, b1, b2, b3); y <= a when (s='0') else b; y0 <= y(0); y1 <= y(1); y2 <= y(2); y3 <= y(3); end mymux - Die erste umgebung ist nebenläufig 5.2.) Squentielle Umgebung 5.2.1.) Prozess process -- lokale signale begin -- sequentielle umgebung end process; - Ist eine Sequentielle Umgebung abgearbeitet, startet die Ausführung von vorne - Eine parallele Umgebung kann mehrere sequentielle enthalten, die parallel ausgeführt werden - Empfindlichkeitsliste: Alle signale die sich potentiell ändern können architecture verhalten of counter is signal qint: std_logic_vector ( 3 downto 0); begin process (reset, clk) begin if (reset='0') then quint <= x"0"; elseif (clk='1') and clk'event then qint <= qint+1; end if; end process; q<=qint; end; Variablen im Prozess process .. variable V std_logic_vector (3 downto 0); begin V := ... end; 6.) Anweisungen 6.1.) Einfache Verknüpfungen - not - and - or - nand - nor - xor - not 6.2.) Arithmetische Operatoren - Addition + - Subtraktion - - gleich = - ungleich /= - kleiner < - kleiner gleich <= - groesser > - groesser gleich >= 6.3.) with/select - nebenläufig with select ergebnis <= when , when , when others; 6.4.) when/else - nebenläufig <= when , else when , else ; 6.5.) if/then - sequentiell if then ; elseif then ; elseif then ; else ; end if; Bedingung muss vom Typ Boolean sein 6.6.) case/is - wie with/select nur in sequentiell case is when => ; when => ; when => ; when others => ; end case; Beispiel Codes: -- 2_zu_1 Multiplexer entity multiplexer is port ( S: in bit; A, B: in bit; Y: out bit; ); end;