Projekte.PCI-Tutorial-INTEntwurf (Struktur)


Hardware-Entwurf mit PCI-Interrupts

Übersicht

Die für dieses Projekt modifizierten Dateien des LogiCore PCI Interfaces sind: [xc2s200fg456_32_33.ucf] [pcim_top.vhd] [cfg.vhd] [userapp.vhd] .

Dieser Beispielentwurf demonstriert die Interruptfunktion des LogiCore PCI Interfaces. Ist der User-Button gedrückt, werden Interrupts ausgelöst.

Konfiguration des LogiCore PCI Interfaces

In der Datei cfg.vhd muss die Interruptfunktion akitviert werden.
    -------------------------------------------------------------
    --  Configure other PCI Header options
    -------------------------------------------------------------

    [...]

      -- Interrupt Enable
      cfg_int(113) <= ENABLE ;
Außerdem soll durch die Implementation eines einfachen PCI-Targets der Interruptstatus abgefragt werden können. Dafür wird ein 4 KByte großer I/O-Speicherbereich reserviert.
--------------------------------------------------------------
-- Configure Base Address Registers
--------------------------------------------------------------

  -- BAR0
  cfg_int(0)              <= ENABLE ;
  cfg_int(32 downto 1)    <= SIZE4K ;
  cfg_int(33)             <= NOFETCH ;
  cfg_int(35 downto 34)   <= TYPE00 ;
  cfg_int(36)             <= MEMORY ;
Alle anderen Optionen bleiben deaktiviert bzw. behalten ihre Standardeinstellungen bei.

Bemerkungen zum Hardware-Entwurf

Um einen Interrupt auszulösen, wird das Eingangssignal INTR_N (negierte Logik!) des LogiCore PCI Interfaces auf 0 gesetzt. Die Spezifikation empfiehlt, es solange gesetzt zu lassen, bis es der Interrupthandler des reagierenden Treibers bestätigt hat.

Der gedrückte User-Button (USER_BUTTON = '0') setzt das Interrupt-Flag intr_reg (negierte Logik!), das mit der INTR_N-Leitung verbunden ist. Sein Status kann über ein minimales PCI-Target abgefragt werden, das über nur ein Nur-Lese-Register verfügt, nämlich gerade das Interrupt-Flag. Eine fallende Flanke beim Steuersignal oe_intr_reg signalisiert das Ende eines Lesezugriffs auf intr_n_reg. Das bei der Flankenerkennung erzeugte Signal oe_intr_reg_fell setzt intr_reg wieder zurück auf 1. Die User-LED leuchtet bei intr_reg = INTR_N = '0'.

Bemerkung: In "echten" Anwendungen sollte man noch ein Steuerregister vorsehen, mit dem die Interruptfunktion ein- und ausgeschaltet werden kann, um ungewünschte Interrupts unterbinden zu können. Erst wenn der Treiber bereit ist, gibt dieser dann die Interruptfunktion auf der Hardware frei.

Der kommentierte VHDL-Code in der Datei userapp.vhd baut auf dem vorangegangenen Single Transfer Target auf und kann unmittelbar nachvollzogen werden.

Eine allgemeine Beschreibung der Zusammenhänge zwischen den PCI-Interruptleitungen und den bekannten IRQ-Leitungen der Interruptcontroller des PCs sowie des Zuweisungsmechanismus in der Konfigurationsphase (Register Interrupt Line und Interrupt Pin des PCI Configuration Headers) werden auf Seite Der PCI Configuration Header im Abschnitt "Interrupt Pin und Interrupt Line" beschrieben.


Autor: gkemnitz, Letzte Änderung: 14.04.2011 15:09:59


 TU Clausthal 2020  Impressum