VHDL Taal beschrijvingen Multivalue logic Functies in VHDL Eigen types definiëren Kloksignalen en testbenches
Multivalue logic Het overloaden van functies en operatoren: uitbreiden van aantal mogelijke signaalwaarden naast ‘0’ en ‘1’. Doel: meer informatie geven over de signaaltoestand tijdens simulatie. Voorbeeld: AND poort met hoog impedante ingangen: De waarheidstabel is: Hoe beschrijf je dit in VHDL? AND 1 Z TYPE tri IS (‘0’, ‘1’,’Z’); FUNCTION “AND” (left, right: tri) RETURN tri IS TYPE tri_array IS ARRAY (tri, tri) OF tri; CONSTANT and_table : tri_array := ((‘0’,’0’,’0’), (‘0’,’1’,’1’), (‘0’,’1’,’1’)); BEGIN RETURN and_table (left, right); END FUNCTION “AND”;
STD_ULOGIC type AND waarheids tabel voor std_ulogic type: IEEE 1164: standaard die 9 mogelijke waarden en bij behorende functies beschrijft: TYPE std_ulogic IS (‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,‘L’,‘H’, ‘-‘); ‘U’ Unitialized ‘X’ geforceerde onbekende ‘0’ geforceerde 0 ‘1’ geforceerde 1 ‘Z’ hoge impedantie ‘W’ zwakke onbekende ‘L’ zwakke 0 ‘H’ zwakke 1 ‘-‘ don’t care AND waarheids tabel voor std_ulogic type: AND U X 1 Z W L H - Met std_ulogic mag maar 1 waarde aan een signaal worden toegekend. Dus 1 source (out, inout, buffer, driver) Meerder sources op signaal (bv uitgangen van tri state buffer) kan alleen met std_logic
Multiple outputs Std_logic staat toe dat meerdere outputs aan een signaal verbonden worden Std_logic kan gedefinieerd worden als een subtype van std_ulogic omdat het slechts een uitbreidende functie is en de signaalwaarden niet veranderd. Wat gebeurt er als a <= ‘0’, en a <=’1’ , bij std_logic? En bij std_ulogic? a <= out1 a <= out2 U X 1 Z W L H - Alles bevindt zich in een gecompileerde package waarvan een library IEEE is gemaakt, de standaard die je hieruit wil gebruiken is std_logic: declareren voor elke entity, geldt dan ook voor alle bijbehorende architectures. LIBRARY IEEE; USE IEEE.std_logic_1164.all OPDRACHT: Schrijf functie voor AND poort met 4 value logic(0 ,1, Z, X) waarvoor geldt (met afnemende prioriteit): 1 of meer inputs 0 geeft output 0, 1 of meer inputs X geeft output X
Eigen types definiëren VHDL staat de gebruiker toe om eigen types te definiëren: enumerated (opsomming) types. ARCHITECTURE gedrag OF processor IS TYPE my_state(reset, idle, dma_cycle, int_cycle); … SIGNAL state, next_state : my_state; SIGNAL two_bit : STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN state <= reset; // correct state <= 00; // NIET correct state <= two_bit; // NIET correct END gedrag; Kun je dit wel implementeren? Synthese tools bieden wel de mogelijkheid om enumerated types te mappen naar een bitpatroon.
Klok signaal maken: Reset signaal maken: Concurrent: clock <= NOT clock AFTER 10ns; Werkt alleen als clock van type bit is, anders initialiseren: SIGNAL clock : std_logic := ‘0’; Process: clk: PROCESS IS BEGIN Clock <= ‘0’; WAIT FOR 10 ns; Clock <= ‘1’; WAIT FOR 10ns; END PROCESS clk; rst: PROCESS IS BEGIN reset <= ‘1’; WAIT FOR 5 ns; reset <= ‘0’; WAIT FOR 5ns; WAIT; END PROCESS rst; Reset signaal maken:
Resultaten naar file schrijven: Wegschrijven van stoplicht state met tijd op een regel; monitor: PROCESS (hoofdweg_groen, zijweg_groen) IS VARIABELE linebuffer : line; BEGIN Write(linebuffer, NOW) IF hoofdweg_groen = ‘1’ THEN Write(linebuffer, STRING’(“Hoofdweg is groen) ELSE Write(linebuffer, STRING’(“Zijweg is groen) END IF; Writeline(output, linebuffer) END PROCESS; OPDRACHT: maak een testbench die klok synchroon een 4 bits teller signaal genereert als output. De klok is 2 MHz en de output ijlt 100ns na op de klok.