VHDL
Van Wikipedia
VHDL staat voor VHSIC Hardware Description Language. Het is een programmeertaal waarmee digitale geïntegreerde schakelingen en programmeerbare logica in FPGAs kunnen worden beschreven en gemodelleerd. Vaak wordt de beschrijving ingevoerd in IDE software, zodat naderhand het model van de digitale schakeling gesimuleerd en getest kan worden. Daarna kan overgaan worden naar de daadwerkelijke fysische realisatie van het ontwerp, of in het geval van FPGAs, wordt het ontwerp gecompileerd.
Oorspronkelijk is de programmeertaal ontworpen door het ministerie van defensie (Department of Defense) van het Amerikaanse leger, maar is inmiddels uitgegroeid tot een algemeen aanvaarde beschrijving van digitale schakelingen. Verilog is een andere veelgebruikte 'hardware description language' (HDL). De IEEE is de organisatie die standaardisatie van VHDL tot stand brengt (IEEE 1076).
Uitgaande van deze VHDL-beschrijving kan een hardwareontwerp gemaakt worden. De taal wordt gebruikt als beschrijving van elektronische chips. VHDL bestaat reeds langer dan de FPGA. Toen de FPGA's verschenen, is het gebruik van VHDL in een stroomversnelling gekomen, omdat de ontwerpcyclus vanaf de beschrijving tot aan de realisatie van een elektronisch circuit enkele grootte-orden sneller geworden is. Bij de beschrijving van een elektronisch circuit met VHDL moet met drie invalshoeken rekening worden gehouden:
- elektronisch;
- logisch;
- hiërarchisch.
Inhoud |
[bewerk] De elektronische invalshoek
Omdat VHDL een elektronisch circuit beschrijft dat nadien moet worden gerealiseerd, moet er rekening worden gehouden met de elementaire hardware-aspecten van het te ontwerpen schema.
[bewerk] I/O Poorten
Een FPGA's maakt contact met de buitenwereld via zijn pinnetjes, in VHDL poorten genoemd. Bij ontwerpbordjes zoals Pegasus zijn vele van deze pinnetjes verbonden met hardware op de kaart. Voorbeelden zijn: de klok, knopjes, schakelaars, een input/output connector. Op deze manier zijn deze randtoestellen beschikbaar voor de schakelingen binnen de FPGA. Beschikbaar wil zeggen dat zij niet zijn opgenomen in de schakeling. Om ze op te nemen moet een expliciete verbinding gemaakt worden met de pinnetjes op de rand van de FPGA. Op een typische FPGA zoals de Spartan 2 zijn er meer dan 200 pinnetjes (208 in de PQ208-behuizing, waarvan 140 I/O pinnetjes).
De fabrikant van het Pegasus bord heeft dus vele mogelijkheden om zijn hardware aan te sluiten. Het is essentieel de lijst van verbindingen naar deze hardware te kennen. Deze staat in de handleiding van het bordje, en is typisch terug te vinden in een bestand met de extensie UCF (User Constraints File). De ontwerpsoftware maakt gebruik van het UCF bestand om de schakeling te verbinden met de buitenwereld. Een typische regel in deze ASCII file is NET "btn<0>" LOC = "P59";
. Dit betekent dat draad btn(0) van de rij btn beschikbaar is op pin 59. merkt op dat alle verbindingen naar buiten in de UCF file moeten staan, en enkel deze verbindingen.
[bewerk] De logische invalshoek
De programmeertaal VHDL laat toe individuele elektronische componenten te beschrijven, en deze hiërarchisch te verbinden. In die zin is VHDL vergelijkbaar met een gestructureerde programmeertaal, waarin het hoofdprogramma de globale schakeling voorstelt en de functies te beschrijving geven van de componenten. Een elektronische component is een entiteit met de volgende eigenschappen:
- input/output poorten, dit zijn de pinnetjes waarmee de component verbonden wordt met zijn omgeving;
- inwendige signalen, dit zijn de draden waarop logische elektrische signalen lopen.
- een architectuur, dit is de functionele beschrijving van component. Uitgaande van deze beschrijving wordt hardware gevormd die uit de input signalen de output signalen genereert.
De ontwerper kan gebruikmaken van drie elementen:
- elementaire operaties die binnen VHDL bekend zijn, zoals bitoperaties, logische functies, enzovoort
- bibliotheekfuncties die aangeboden worden door de constructeur. Sommige van deze componenten worden ook IPR (intellectual property rights) componenten genoemd. Dit gebeurt voornamelijk voor complexe schakelingen zoals een software processor (bv. MicroBlaze).
- zelfgemaakte componenten, die in een VHDL file staan, of in een bibliotheek.
Een prototype van een VHDL bestand voor een component staat hieronder.
library IEEE; use IEEE.std-logic-1164.all; use library-name.package-name.all; entity entity-name is port( input signals: in std-logic; output signals: out std-logic); end entity-name; architecture arch-name of entity-name is -- definieer inwendige signalen en/of types signal inwendige signalen : type := initialisatie begin proces-1: process (sensitiviteitslijst van signalen) begin -- beschrijving van het proces end process proces-1; --(eventueel:) proces-2: process (sensitiviteitslijst van signalen) begin -- beschrijving van het proces end process proces-2; -- Inwendige signalen of poorten <= combinatorische functie van de signalen (CSA's: concurrent signal assignment's) end arch-name;
[bewerk] Sequentiële en combinatorische functies
Het bovenstaande prototype van een VHDL-component bestaat uit twee delen: processen en combinatorische functies of CSA's (concurrent signal assignments).
[bewerk] Proces
De processen dienen een sequentiële functie te beschrijven, en hebben een sensitiviteitslijst. De sensitiviteitslijst bevat één of meerdere signalen die het proces in gang zetten. Het proces bevat een reeks sequentiële statements, die aangestuurd worden door een verandering van een signaal in de sensitiviteitslijst. Dit signaal kan een klok of een gewoon signaal zijn. Als voorbeeld beschouwen we een eenvoudige flipflop:
entity flipflop is port (Clk, D : in std_ulogic; Q : out std_ulogic); end flipflop; architecture imp of flipflop is begin process (Clk) -- Process sensitive to Clk begin if (Clk’event and Clk = ’1’) then -- Rising edge Q <= D; end if; end process P1; end imp;
[bewerk] Combinatorische functie
De architectuur van een component kan ook een eenvoudige combinatorische functie beschrijven. Deze component berekent onmiddellijk en op elk moment de uitgang op basis van de ingang. Een voorbeeld is de comparator:
entity comparator is port ( A, B : in std_logic_vector(7 downto 0); GE : out std_logic); end comparator; architecture imp of comparator is begin GE <= ’1’ when A >= B else ’0’; end imp;
Zoals eerder gezegd is het mogelijk sequentiële functies en combinatorische functies in een component op te nemen.
[bewerk] Het langste pad en de klokperiode
Een combinatorische functie vraagt een rekentijd die afhankelijk is van het langste pad in de combinatorische schakeling. Omdat een combinatorische functie geen geheugenelementen heeft, moet de klokperiode lang genoeg zijn om de commentatoren zijn functie uit te rekenen. Bij de synthese van de FPGA wordt dit nagegaan, en zal men eventueel de klok vertragen. De resultaten kan men bekijken in het synthese rapport:
Timing Summary: --------------- Speed Grade: -5 Minimum period: 8084ns (Maximum Frequency: 123.701MHz) Minimum input arrival time before clock: 2827ns Maximum output required time after clock: 10.602ns Maximum combinational path delay: 7631ns
Indien de maximale frequentie groter is dan de klokfrequentie van de FPGA en is dit een goed ontwerp, want het kan tegen de maximale effectieve snelheid lopen.