VHDL

programmeertaal

VHDL staat voor VHSIC (Very High Speed Integrated Circuit) Hardware Description Language. Het is een hardwarebeschrijvingstaal waarmee digitale geïntegreerde schakelingen en programmeerbare logica in EPLDs (EPLD staat voor Erasable Programmable Logic, zoals onder andere CPLD's en FPGA's) 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 (voor ASIC designs), of in het geval van EPLDs, wordt het ontwerp gecompileerd.

Oorspronkelijk is de programmeertaal ontworpen door het Amerikaanse Ministerie van Defensie (Department of Defense), 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.

De elektronische invalshoek bewerken

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.

I/O Poorten bewerken

Een FPGA maakt contact met de buitenwereld via zijn pinnen, in VHDL poorten genoemd. Bij ontwerpbordjes zijn veel van deze pinnen 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 pinnen op de FPGA. Op een typische FPGA zoals de Spartan 2 zijn er meer dan 200 pinnen (208 in de PQ208-behuizing, waarvan 140 I/O pinnen).

De fabrikant van het ontwikkelbord 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 de I/O pin btn(0) beschikbaar is op pin 59. Merk op dat alle verbindingen naar buiten in de UCF file moeten staan, dit kan je via de IDE (ISE) opgeven, de ASCII file hoef je niet handmatig in te vullen.

De logische invalshoek bewerken

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 de beschrijving geven van de componenten. Een elektronische component is een entiteit met de volgende eigenschappen:

  • input/output poorten, dit zijn de pinnen 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:

  1. elementaire operaties die binnen VHDL bekend zijn, zoals bitoperaties, logische functies, enzovoort
  2. 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).
  3. 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;

Sequentiële en combinatorische functies bewerken

Het bovenstaande prototype van een VHDL-component bestaat uit twee delen: processen en combinatorische functies of CSA's (concurrent signal assignments).

Proces bewerken

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
   P1: process (Clk) -- Process sensitive to Clk
   begin
     if (Clkevent and Clk = 1) then -- Rising edge
       Q <= D;
     end if;
   end process P1;
 end imp;

Combinatorische functie bewerken

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.

Het langste pad en de klokperiode bewerken

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 VHDL wordt dit nagegaan, en zal men eventueel de worst case klok berekenen. 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 gewenste klokfrequentie kan dit ontwerp werken op een EPLD, want het kan de gewenste snelheid lopen.