VHDL 3: Sequential Statements (Process)
Sequential Statements Inhalt Sequential Statements Process If Statement Case Statement Wait Assert
Process
Architecture mit Concurrent Statements ARCHITECTURE comb OF rsff IS BEGIN q <= not (r or qn); qn <= not (s or q); END comb;
Architecture mit Process ARCHITECTURE comb OF rsff IS BEGIN END comb; Concurrent Statements P1:Process(xxx) Begin … End process p1; P2: Process(xxx) Begin … End process p2;
detect_overflow: process (zaehler) begin Beispiel Process detect_overflow: process (zaehler) begin end process detect_overflow; overflow <= ‘0‘; if (zaehler > “11111110“) then overflow <= ‘1‘; end if;
Process Ein Process ist ein „Concurrent“ Statement welches eine Ansammlung von „Sequentiellen“ Statements enthält. Prozesse können gleichzeitig mit anderen „Concurrent“ Statements und Prozessen kommunizieren.
Sequentielle statements Process Prozess_name: process (sensitivity liste) deklarationen (variablen etc.) begin sequentielle statements end process prozess_name; signal overflow : std_logic; signal zaehler : std_logic_vector(7 DOWNTO 0); Benennung Eingangssignal Sensitivity Liste detect_overflow: process (zaehler) begin overflow <= ‘0‘; if (zaehler > “11111110“) then overflow <= ‘1‘; end if; end process detect_overflow; Default Statement Sequentielle statements Ausgangszuweisung Ausgangssignal
Ablauf von Process-en P1: process (reset,A,M) Begin if reset = ‘ 1‘ then next_q <= ‘ 0‘; else next_q <= A and M; end if; end process P1; Sequentielle statements: Innerhalb eines Prozesses laufen Statements sequentiell ab. Process 1 Die Prozesse selbst sind ein „concurrent statement“ und laufen innerhalb der Architektur gleichzeitig ab P2: process (clock,next_q) Begin if clock‘event and clock= ‘ 1‘ then q <= next_q; end if; end process P2; Process 2
Deltazeit (Rechnerzeit) Ablauf von Process-en Deltazeit (Rechnerzeit) Simulationszeit
Process In einem Process werden Anweisungen sequentiell (der Reihenfolge nach) abgearbeitet. Hat der Process eine Sensitivity Liste, wird er „zum Leben erweckt“, sobald sich ein Signal, dass sich auf der sensitivity Liste befindet, verändert. Nach Ausführung der letzten Anweisung werden alle im Prozess zugewiesenen Signale aktualisiert, danach „stirbt“ der Process. Hat ein Process keine Sensitivity Liste, ist er immer aktiv.
Sequentielle Statements (Statements im Process)
If-Then-Else Statement
Beispiel für Priorität: Alarmpanel im KKW In einem Kernkraftwerk soll ein Alarmpanel auftretende Störungen in Alarmstufen einteilen (Alarmstufe 3 höchste Dringlichkeit, Alarmstufe 1 niedrigste Dringlichkeit). Es gibt drei Hauptgefahrenquellen, die nach Ihrer Dringlichkeit eingeteilt sind (siehe Tabelle). Am Ausgang der Schaltung befinden sich 4 Lampen, die die jeweiligen Alarmstufen anzeigen. Bei einem Druckabfall im Primärkühlkreislauf würde Alarmstufe 3 (rot) aufleuchten. Bei einem Druckabfall im Sekundärkühlkreislauf würde Alarmstufe 2 (orange) aufleuchten. Bei verringerter Generatordrehzahl gibt es nur Alarmstufe 1 (gelb). Meldet keiner der Eingaenge einen Alarm, so leuchtet die gruene Lampe auf. Ist mehr als ein Alarmsignal aktiv, so richtet sich die Alarmstufe immer nach dem Alarm mit der grössten Dringlichkeit. Wenn z.B. Sekundärkreislauf und Generatordrehzahl Alarm melden, dann ist die Alarmstufe orange.
Entity des Alarmpanels rot Druck Primärkreislauf orange Druck Sekundärkreislauf gelb Generatordrehzahl gering grün Störung Signal Alarmstufe Druck im Primärkreislauf primär = 1 Druckabfall Alarm, primär = 0 Druck o.k. rot Druck im Sekundärkreislauf sekundär = 1 Druckabfall Alarm, sekundär = 0 Druck o.k. orange Generator Drehzahl generator = 1 Drezahl Alarm, generator = 0 Drehzahl o.k. gelb Keine Störung grün
Wahrheitstabelle Eingänge Ausgänge primär sekundär drehzahl grün gelb orange rot
Unvollständige Wahrheitstabelle Eingänge Ausgänge primär sekundär drehzahl grün gelb orange rot 1 x
Entity des Alarmpanels rot primar orange sekundar gelb drehzahl grün ENTITY kkw IS PORT( primar,sekundar,drehzahl : IN std_logic; rot,orange,gelb,gruen : OUT std_logic ); END kkw;
Prioritätsencoder mit „IF-THEN-Else“ Statement LIBRARY ieee; USE ieee.std_logic_1164.all; ARCHITECTURE rtl OF kkw IS BEGIN p1: PROCESS (primar, sekundar, drehzahl) IF (primar = '1') THEN rot <= '1'; orange <= '0'; gelb<='0'; gruen <= '0'; ELSIF(sekundar = '1') THEN rot <= '0'; orange <= '1'; gelb<='0'; gruen <= '0'; ELSIF(drehzahl = '1') THEN rot <= '0'; orange <= '0'; gelb<= '1'; gruen <= '0'; ELSE rot <= '0'; orange <= '0'; gelb<= '0'; gruen <= '1'; END IF; END process p1; END rtl; Ausgangs Zuweisungen Eingangs Bedingung
IF-THEN-ELSE statement if condition_1 then sequential statements elsif condition_2 then sequential statements else sequential statements end if ;
IF-THEN-ELSE statement Die erste zutreffende Zeile wird dem Ausgang zugewiesen, alle nachfolgenden fallen heraus. (priorisierend) Bedingungen dürfen sich überlappen if (Y = 5) then ...if (Y <=5) then. „elsif“ und „else“ sind nicht notwendig If –THEN-ELSE statements können nur in einem Process verwendet werden IF-THEN-ELSE statements dürfen verschachtelt werden IF-THEN-ELSE statements sind die „allgemeine“ Form zur Beschreibung von kombinatorischer Logik in VHDL
IF Then ELSE
CASE Statement
Beispiel: Codewandler Binary-Gray Komb. Logik 1 Gray(0) Binary(1) Binary(2) Komb. Logik 2 Gray(1) Komb. Logik 3 Gray(2)
Wahrheitstabelle Codewandler Binary-Gray BCD Gray 1 1 1 2 1 3 1 1 4 1 5 1 1 6 1 1 7 1 1 1
Entity des BCD-Gray Codewandlers ENTITY bingray IS PORT ( binary : IN std_logic_vector(2 downto 0); gray : OUT std_logic_vector(2 downto 0) ); END bingray;
Code Wandler mit CASE statement Ausgangs Zuweisung bcd2gray: process (bcd) Begin case bcd is when “000“ => gray <= “000“; when “001“ => gray <= “001“; when “010“ => gray <= “011“; when “011“ => gray <= “010“; when “100“ => gray <= “110“; when “101“ => gray <= “111“; when “110“ => gray <= “101“; when OTHERS => gray <= “100“; end case; end process bcd2gray; Wähler Eingangssignal
Case statement case eingang is when wähler => sequential statements when wähler => sequential statements end case;
Case statement Nicht priorisierend, jede Zeile wird gleich behandelt Jede mögliche Eingangskombination muss vorkommen falls am Ende nicht mit „others“ abgeschlossen wird. Keine Eingangskombination darf mehr als 1 x vorkommen Case Statements können nur in einem Process verwendet werden Werden hauptsächlich für Dekodier Funktionen oder zum beschreiben von Automaten verwendet.
Generic View Case Statement
Technology Map von Case
Übersicht über mögliche Fallunterscheidungen in VHDL Sequentiell (innerhalb Prozess) priorisierend If-Then-Else nicht priorisierend Case
ASCII Decoder mit case statement ARCHITECTURE rtl OF ascii_decoder IS SIGNAL pointer: INTEGER RANGE 0 TO 79; SIGNAL zeichen: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN comb_decoder : PROCESS(pointer) case pointer IS when 0 => zeichen <= x“48"; when 1 => zeichen <= x“65"; when 2 => zeichen <= x“6c"; when 3 => zeichen <= x“6c"; when 4 => zeichen <= x“6f"; when 5 => zeichen <= x“21"; when OTHERS => zeichen <= x"20"; END case; …. End process;
Mehrmalige Zuweisung von Signalen Concurrent (ausserhalb Prozess) Sequential (innerhalb Prozess) overflow <= ‘0‘ ; . . overflow <= ‘1‘ ; Nicht möglich – Fehlermeldung overflow <= ‘1‘ ; Möglich – Software arbeitet Zeile für Zeile ab das Signal wird erst am Ende des Prozesses aktualisiert
Wait Statements wait until condition; Warten bis ein bestimmter Zustand eintritt wait on signal_list; Warten bis ein bestimmte(s) Signal(e) wechselt wait for time; Eine bestimmte Zeit warten wait; Unbestimmt Warten Beispiele: Wait until CLK= ‘1‘; Wait for 10 nS; Wait on A,B;
WAIT Statements WAIT Statements sind sequentielle Statements und dürfen nur im Prozess vorkommen Beim Ausführen des WAIT Statements wird der Process unterbrochen und die zugewiesenen Signale werden aktualisiert Nach Ausführen der WAIT Bedingung wird der Prozess an der Stelle fortgefahren, wo er unterbrochen wurde WAIT ist nicht synthetisierbar
Testbench testbench.vhd dut.vhd reset steig flin clk Logische Funktion Erwartete Ergebnisse reset Assert Stimulus Generator steig flin clk dut.vhd Logische Funktion Simulation
Assert Statement assert condition report string severity severity_level ; Mögliche level sind: note warning error failure (bricht Simulation ab) Falls „Condition“ nicht erfüllt, wird ein Report generiert Beispiele: assert (A = B) report “A ungleich B“ severity error ; assert false report “Test programm beendet“ severity note ; „ASSERT“ erlaubt bei einer bestimmten Bedingung im Simulations- programm einen Bericht auszugeben oder das Simulationsprogramm ganz zu stoppen. Assert wird bei der Synthese ignoriert.
Testprogramm zum Austesten des bcd-gray Kodewandlers STIMULUS: process begin bcd <= "000" ; wait for 10 nS; assert (gray = "000") report "expected „000“ " severity failure; wait for 100 nS; bcd <= "111"; assert (gray = "100") report "expected „100“ " severity failure; assert false report " --- ALL TESTS PASS ---" severity note; wait; end process;
Compile Script (compile.do) für funktionale Simulation # create work library vlib work # compile project files vcom -2002 -explicit -work work ../../source/flanken.vhd vcom -2002 -explicit -work work ../../source/tb_flanken.vhd # run the simulation vsim -t 1ns -lib work work.tb_flanken do ../scripts/wave.do run 1800.0 ns Bildet Workverzeichniss „work“ Compiliert VHDL und legt es im „work“ ab Startet Simulator Öffnet Waveform Betrachter Lässt Simulator für 1800 ns laufen