Zum Hauptinhalt springen

VHDL - Reference

  1-- Literatur: Vorlesungsunterlagen EDS2 von Markus Pfaff (FH-Hagenberg)
  2
  3-- VHDL   Vhsic Hardware Description Language
  4-- VHSIC  Very High Speed Integrated Circuits
  5
  6-- entity / architecture
  7        entity PieceOfHw is
  8            generic (
  9                gAddrWidth : integer := 10;
 10                gDataWidth : integer := 8
 11            );
 12            port (
 13                iClk       : in  bit;
 14                inResAsync : in  bit;
 15                iCountUp   : in  bit;
 16                oCounter   : out integer
 17                -- wie Signals zu behandeln
 18                -- (durch in, out, inout eingeschraenkt)
 19            );
 20        end entity PieceOfHw;
 21        
 22        architecture PieceOfHwBhv of PieceOfHw is
 23            -- Deklarationen
 24            
 25            signal vTemp0 : integer;
 26        begin
 27            -- Struktur und/oder Verhaltensbeschreibung
 28        
 29            CalcSomething: process is
 30                -- lokale Deklarationen
 31                
 32                variable vTemp1 : integer;
 33            begin
 34                vTemp1 := iTempInput + 2;       -- von Ausserhalb
 35                wait;
 36            end process CalcOtherPeople;
 37  
 38        end architecture PieceofHwBhv;
 39        
 40        -- die Architektur sollte in einem separaten Datei abgelegt werden,
 41        -- da es fuer eine Entity mehrere Implementierungen (Bhv, Rtl)
 42        -- geben kann
 43
 44
 45-- Entities "verdrahten"
 46        library Work;                           -- Library bekannt machen
 47        
 48        Timer1: entity Work.PieceOfHw(PieceOfHwBhv)
 49            generic map(
 50                gAddrWidth => 10,
 51                gDataWidth => 16
 52            )
 53            port map(
 54                iClk       => sClk,
 55                inResAsync => snRes,
 56                iCountUp   => sCntUp,
 57                oCounter   => sCntr
 58            );
 59
 60
 61-- diverse Deklarationen
 62        variable vTemp2 : integer := 0;     -- initiale Wert
 63        constant vTemp3 : integer := 12;    -- Konstante (muss initalisiert
 64                                            -- werden, ist nicht schreibbar)
 65                                                
 66                       -- integer              0, -2, 1E6, 1000000
 67                       -- real                 1.0, 0.0, 1.0E+30, -3.32E-10
 68                       -- character            'a', 'B', '1', '@'
 69                       -- boolean              false, true
 70                       -- string               "many characters."
 71                       -- bit                  '0', '1'
 72                       -- time                 10 ns, 20 hr, 30 ps, 40.3 s
 73                       
 74                       -- character'('0')      explizite Zuordnung
 75                       -- bit'('0')
 76        
 77        type aOwnType1 is range -256 to 255;    -- selbst definierte Typen
 78        type aOwnType2 is (SideA, SideB, SideC);
 79        type aOwnType3 is (
 80            'a',
 81            '1',
 82            a,
 83            1,
 84            asdf
 85        );
 86        
 87                                                -- abgeleiteter Typ
 88        subtype aSignedByte is integer range -128 to 127;
 89        
 90        -- unconstrained array types - Array Typen ohne Bereichsangabe
 91        type string is array (positive range <>) of character;
 92        -- constrained array types - Array Typen mit Bereichsangaben
 93        subtype aAddress is range (0 to 255);
 94        type aByte   is array (7 downto 0) of bit;
 95        type aMemory is array (aAddress) of aByte;
 96
 97        
 98-- Zuweisung
 99        type aRegister is array (1 to 4) of integer;
100        variable vXReg : aRegister := (0, 0, 0, 0);
101        vXReg := (1=>12, 2=>234, others=>0);
102        
103        variable vBitVector1 : bit_vector(31 downto 0);
104        variable vBitVector2 : bit_vector(15 downto 0);
105        variable vBitVector3 : bit_vector(1 to 4);
106        vBitVector1(0) := vBitVector2(15);
107        vBitVector2 := vBitVector1(15 downto 0);
108        vBitVector2 := vBitVector1;     -- Zuordnung von links nach rechts
109                                        -- (15) := (31)
110                                        -- (14) := (30)
111                                        -- ...
112                                        -- (0)  := (16)
113        vBitVector3 := vBitVector2;     -- (1)  := (15)
114                                        -- (2)  := (14)
115                                        -- (3)  := (13)
116                                        -- (4)  := (12)
117
118
119-- Rocord Typen
120        type aRecord is record
121            Description      : string;
122            Code             : bit_vector (7 downto 0);
123            NrOfAddressBytes : natural;
124        end record aRecord;
125        
126        constant cRec1 : aRecord := (
127            Description      => "asdf",
128            Code             => "10011111",
129            NrOfAddressBytes => 0
130        );
131        variable vRec2 : aRecord;
132        
133        vActDescr := cRec1.Description;
134        vRec2     := cRec1;
135
136
137-- Zusammenstellungen (Concatenation)
138        variable vABus, vBBus, vCBus : bit_vector (3 downto 0);
139        variable vA, vB, vC, vD : bit;
140        vABus := vA & vB & vC & vD;         -- von links nach rechts
141        vABus := vBBus(3 downto 2) & vCBus(1 downto 0);
142        vABus := (vBBus(3 downto 2), vCBus(1 downto 0));
143
144
145-- logische Operatoren
146        -- and, or, nand, nor, xor, xnor, not
147        vBit1 := vBit2 and vBit3;
148        vBool1 := vBool2 nor vBool3;
149        -- vBool1 := vBit2 and vBit2;       -- boolean und bit nicht mischen
150
151
152-- relationale Operatoren
153        -- >, >=, <, <=, =, /=   liefert boolean
154        vBool1 := (1 < 3);
155        
156        variable vShort : bit_vector(4 to 6) := ('1', '0', '1');
157        variable vLong  : bit_vecotr(0 to 7) := (1=>'1', others=>'0');
158        vBool2 := vShort > vLong;
159        -- von links nach rechts
160        -- 1 0 1           : groesser
161        -- 0 1 0 0 0 0 0 0 : kleiner
162
163
164-- arithmetische Operatoren
165        -- -, +, *, /, mod, rem, **(Hochfunktion), abs
166        -- fuer integer, real(nicht mod, rem), time
167        
168        -- a mod b  -> positiver Rest
169        -- a rem b  -> Rest hat Vorzeichen von a
170        
171        
172-- Schiebeoperationen
173        sll  -- shift left logical         "11110000" sll 2 => "11000000"
174        srl  -- shift right logical        "00001111" srl 2 => "00000011"
175        sla  -- shift left arithmetic      "00001111" sla 2 => "00111100"
176        sra  -- shift right arithmetic     "00111111" sra 2 => "00001111"
177             --                       bzw. "11110000" sra 2 => "11111100"
178        rol  -- rotate left                "00110011" rol 2 => "11001100"
179        ror  -- rotate right               "11001100" ror 2 => "00110011"
180
181-- Attribute
182        subtype SmallInt is integer range 0 to 2356;
183        -- SmallInt'left = 0
184        -- SamllInt'right = 2356
185        -- SmallInt'range = 0 to 2356
186        
187        signal BinNr : bit_vector (31 downto 0);
188        -- BinNr'left = 31
189        -- BinNr'right = 0
190        -- BinNr'low = 0
191        -- BinNr'high = 31
192        -- BinNr'range = 31 downto 0
193        -- BinNr'length = 32
194        
195        signal Flag : bit;
196        -- Flag'event      ... Event aufgetreten?
197        -- Flag'stable(T)  ... waehrend des Zeitraums stabil?
198        -- Flag'active     ... momentan aktiv?
199        -- Flag'delayed(T) ... Kopie von Flag, um T verzoegert
200        -- Flag'last_event, Flag'last_active, Flag'last_value
201
202
203-- diverse Ablauf-Statements
204        -- if
205        if (vA > vB) and (vA < vC) then
206            vGr := vA;
207        elsif (vD > vF) then
208            vGr := vD;
209        else
210            vGr := vB;
211        end if;
212        
213        
214        -- case
215        type aState is (stateA, stateB, stateC, stateD);
216        variable vActState : aState;
217        case vActState is
218            when stateA =>
219                vTemp1 := 12;
220            when stateB =>
221                vTemp1 := 24;
222            when others =>
223                null;
224        end case;
225
226
227        -- while Schleife
228        while (vIndex <= 3) loop
229            -- ...
230            vIndex := vIndex + 1;
231        end loop;
232        
233        -- for Schleife
234        for vIndex in 8 downto 0 loop
235            -- ...
236        end loop;
237        
238        -- endlos Schleife
239        loop
240            -- ...
241        end loop;
242
243
244-- Assertion / Report
245        assert (vSomethingGoesWrong = false)
246            report "output message"
247            severity warning;
248                -- note
249                -- warning
250                -- error
251                -- failure
252        
253        report "output message"
254            severity warning;
255
256
257-- Funktion
258        -- Werte werden eingegeben und ein Ergebnis wird zurueck geliefert
259        -- Eingabewerte sind im Inneren konstant
260        function Larger (cVal1, cVal2 : integer) return integer is
261            variable vResult : integer;
262        begin
263            if cVal1 > cVal2 then
264                vResult := cVal1;
265            else
266                vResult := cVal2;
267            end if;
268            return vResult;
269        end function Larger;
270        
271        vRes := Larger(vVar1, vVar2);
272
273
274-- Prozedur
275        -- Werte ein- oder ausgeben
276        procedure Swap ( variable vA, vB : inout integer;
277                         constant cPermitSwap : boolean ) is
278            variable vTemporal : integer;
279        begin
280            if cPermitSwap then
281                vTemporal := vA;
282                vA := vB;
283                vB := vTemporal;
284                return;
285            end if;
286        end procedure Swap;
287
288        Swap(vVar1, vVar2, true);
289
290
291-- Simulationszeit
292        wait;                       -- fuer immer warten
293        wait for 14 ms;             -- fuer 14ms warten
294        wait on sA, sB;             -- auf Aenderung von sA oder sB warten
295        wait on sA for 14 sec;      -- warte auf Event sA, max. 14 Sekunden
296        wait on sA until sA > 3;    -- warte auf Event sA, mit Bedingung sA>3
297        wait until sA > 3;          -- -,,-
298        wait on sA, sB until sA = 10 for 16 us;
299        
300        sA <= transport sB after 14 us; -- Simulation von Verzoegerungs-
301                                        -- zeiten (propagation delay)
302                                        -- Simulation von Traegheitszeiten
303                                        -- (inertial delay)
304                                        -- Wert muss mindestens 5 ns lang
305                                        -- anders sein, um uebernommen
306                                        -- zu werden
307        sA <= reject 5 ns inertial sB after 10 ns;
308        
309        sA <= reject 5 ns inertial sB after 5 ns; -- =
310        sA <= inertial sB after 5 ns;             -- =
311        sA <= sB after 5 us;
312        sA <=
313            '0' after 10 ns,
314            '1' after 30 ns,
315            '0' after 90 ns;
316
317
318-- shared Variables (nicht brauchbar)
319        -- Ergebnis ist nicht definiert, kommt darauf an welcher Prozess
320        -- zuerst abgearbeitet wird. Es werden beide Variablen vA oder vB,
321        -- da shared varible den Wert immer direkt uebernehmen.
322        entity Swapper is
323        end entity Swapper;
324        architecture SwapperBhv of Swapper is
325            shared variable vA : integer := 10;
326            shared variable vB : integer := 13;
327        begin
328            MakeA2B: process is
329            begin
330                wait for 1 ms;
331                vA := vB;
332            end process MakeA2B;
333            
334            MakeB2A: process is
335            begin
336                wait for 1 ms;
337                vB := vA;
338            end process MakeB2A;
339        end architecture SwapperBhv;
340
341
342-- signals
343        -- fuer eine bestimmte Zeit werden alle vorherigen Werte zwischen-
344        -- gespeichert und mit den gespeicherten Werten werden alle Signals
345        -- neu berechnet.
346        entity Swapper is
347        end entity Swapper;
348        architecture SwapperBhv of Swapper is
349            signal vA : integer := 10;
350            signal vB : integer := 13;
351        begin
352            MakeA2B: process is
353            begin
354                wait for 1 ms;
355                vA <= vB;
356            end process MakeA2B;
357            
358            MakeB2A: process is
359            begin
360                wait for 1 ms;
361                vB <= vA;
362            end process MakeB2A;
363        end architecture SwapperBhv;
364
365
366-- postponed process
367        -- Wir sind nur fuer die stabilisierten Werte interessiert.
368        -- (ignoriert delta-Cycles)
369        TestFinalValues : postponed process is
370        begin
371            assert (A < B)
372                report "TM: A and  B do not  relate  as  desired !"
373                severity warning;
374            wait on A, B;
375        end postponed process TestFinalValues;
376
377
378-- Generate Statement
379        OthrStgs : for Stage in
380            FilteredThrough'left to
381            FilteredThrough'right-1 generate
382        begin
383            OneOtherStage : entity Work.Filter(SomehowElse)
384                port map (
385                    iNoisy => FilteredThrough(Stage),
386                    oCalm  => FilteredThrough(Stage+1)
387                );
388        end generate OtherStages ;
389        
390        
391        MayDefuzzyfy : if DefuzzyfyIt generate
392        begin
393            Defuzzyfying : entity Work.Defuzzyfier(Anyhow)
394                port map (
395                    iFuzzy => FilteredThrough(FilteredThrough'length),
396                    oClean => oFiltered
397                );
398        end generate MayDefuzzify;
399
400
401-- Component Instantiation
402        architecture Structure of Any is
403            -- Komponente Deklarieren
404            component Stacker is
405                port (
406                    iClk       : in bit;
407                    inResAsync : in bit;
408                    ...
409                );
410            end component Stacker;
411            
412            -- Konfiguration Spezifizieren
413            for TheStacker1 use entity work.AStack(Somehow)
414                port map (
415                    iClk       => iClk,
416                    inResAsync => inResAsync,
417                    ...
418                );
419        begin
420            -- Komponente Instanzieren
421            TheStacker1: Stacker
422                generic map (...)
423                port map (...);
424        end architecture Structure;
425
426
427-- Package Deklarieren
428        package ProjectGlobal is
429            constant cBitwidth : integer := 8;
430            type aBinaryNr is bit_vector (cBitWidth-1 downto 0);
431            subtype aIntNr is integer range 0 to 2**cBitwidth-1;
432            
433            function Bin2Int (cBinary : aBinaryNr) return aIntNr;
434            procedure Swap (vBinary1, vBinary2 : inout aBinaryNr);
435            
436            constant cDecidedOk : boolean;
437        end package ProjectGlobal;
438        
439        
440        package body ProjectGlobal is
441            constant cDecidedOk : boolean := true;
442            
443            function Bin2Int (cBinaryNr : aBinaryNr) return aIntNr is
444                variable vAccumulated : integer := 0;
445            begin
446                for Digit in cBinaryNr'range loop
447                    if cBinaryNr(Digit) = '1' then
448                        vAccumulated := vAccumulated + 2**Digit;
449                    end if;
450                end loop;
451                return vAccumulated;
452            end function Bin2Int;
453            
454            procedure Swap (vBinary1, vBinary2 : inout aBinaryNr) is ...
455        end package body ProjectGlobal;
456
457
458-- Package nutzen
459        library IEEE;               -- in welcher Lib. befinded sich Package
460        use IEEE.std_logic_1164;    -- Package Deklarationen sichtbar machen
461        use IEEE.std_logic_1164.all;
462        
463        library std;                -- Standard Library fuer vordefinierte
464                                    -- Sprach-Umgebung
465        library work;               -- Standard User Library
466        use std.standard.all;       -- Deklaration von vordefinierten
467                                    -- Typen und Operationen
468        
469        library IEEE;               -- Standard Library fuer standardisierte
470                                    -- Sprach-Erweiterung
471        use IEEE.std_logic_1164.all;-- 9-wertige Logic Typen und
472                                    -- verfuegbare Operationen
473                                    -- 'U' ... uninitialisiert
474                                    -- 'X' ... Wert unbekannt (Fehler)
475                                    -- '-' ... egal ob durch '0' oder
476                                    --         '1' ersetzt wird
477                                    -- '0', '1'
478                                    -- 'Z' ... high Impedanz
479                                    -- 'L' ... low
480                                    -- 'H' ... high
481                                    -- 'W' ... weak
482        std_ulogic_vector           -- unresolved Datentyp (wird Signal an
483                                    -- mehreren Stellen geschrieben, so
484                                    -- wird Error gemeldet)
485        std_logic_vector            -- resolved Datentyp
486
487
488-- Sensitivity List
489        DoIt: process is
490        begin
491            -- ...
492            wait on A, B, C, D, ...
493        end process DoIt;                       -- =
494        
495        DoIt: process (A, B, C, D, ...) is
496        begin
497            -- ...
498        end process DoIt;
499
500
501-- Concurrent Assertion-Statement
502        TestIt: process is
503        begin
504            assert (A > B)
505                report "message"
506                severity warning;
507            wait on A, B;
508        end processs TestIt;                    -- =
509        
510        assert (A > B)
511            report "message"
512            severity warning;
513
514
515-- Concurrent Signal-Assignment
516        LabelIt: process is
517        begin
518            SesamStreet <= Ernie and Bert after 20 us;
519            wait on Ernie, Bert;
520        end process TestIt;                     -- =
521        
522        LabelIt: SesamStreet <= Ernie and Bert after 20 us;
523
524-- Concurrent Conditional Signal-Assignment
525        Labeled: process is
526        begin
527            if A < B then
528                SesamStreet <= Ernie and Bert;
529            elsif A = B then
530                SesamStreet <= Bibo;
531            else
532                SesamStreet <= Gonzo;
533            end if;
534            wait on A, B, Ernie, Bert, Bibo, Gonzo;
535        end process TestIt;                     -- =
536        
537        Labeled: SesamStreet <=
538            Ernie and Bert when (A<B) else
539            Bibo           when (A=B) else
540            Gonzo;
541
542
543-- Concurrent Selected Signal-Assignment
544        ALabel: process is
545        begin
546            case Month is
547                when May =>
548                    SesamStreet <= Ernie and Bert;
549                when Jun | Oct =>
550                    SesamStreet <= Bibo;
551                when others =>
552                    SesamStreet <= Gonzo;
553            end case;
554            wait on Month, Ernie, Bert, Bibo, Gonzo;
555        end process TestIt;                     -- =
556        
557        ALabel: with Month select
558            SesamStreet <= Ernie and Bert when May,
559            Bibo                          when Jun | Oct,
560            Gonzo                         when others;
561        
562        
563-- Concurrent Procedure-Call
564        Calling: process is
565        begin
566            CheckTiming (D, Clk, Reset, TSetup, THold);
567            wait on D, Clk, Reset;
568        end processs TestIt;                    -- =
569        
570        Calling: CheckTiming (D, Clk, Reset, TSetup, THold);