Rotationstaster
Dieses Interface ist eine spezielle Implementierung eines Bit Eingabe Interface mit einer Logik zur Entprellung des Rotations Tasters, wie er auf dem Spartan 3E Starter Kit eingesetzt wird. Die Logik zur Entprellung wurde entsprechend der Applikation zum Spartan 3E Starter kit von Xilinx in Verilog realisiert. Die E/A Register des Modul entsprechen denen des BIT_IN InterfaceFunktion
Der Modul hat 3+2 Eingänge, die ein Interruptsignal bei steigender oder fallender Flanke am Eingang erzeugen können. Die Eingänge eines Moduls können einzeln programmiert werden, indem das jeweils korrespondierende Bit des entsprechenden Steuerregisters verändert wird.
Register
Offset | Register | Funktion | Zugriff | Initialwert | |
0 | ROT_TA_DAT | Daten | read | ||
1 | ROT_TA_IE | Interrupt Freigabe für jedes Bit | read/write | 0x00019 | |
2 | ROT_TA_EDGSEL | Auswahl der aktiven Flanke für jedes Bit | read/write | 0x00019 | |
3 | ROT_TA_IR_STATUS | Interrupt Status für jedes Bit | read | ||
4 | ROT_TA_CONTER | Zählt mit jedem rechts Impuls hoch und mit links Impuls runter | read/write | 0x00000 |
Das Datenregister ROT_TA_DAT enthält die Daten der Pins des Moduls und die Signale RECHTS und LINKS. Bei einem Reset werden diese beiden Bits mit Null initialisiert. Auf das Register kann nur lesend zugegriffen werden. Die Signale RECHTS und LINKS werden erst bei einem Lesen des ROT_TA_IR_STATUS Registers wieder gelöscht. Erst dann können sie erneut bei einer entsprechenden Bewegung gesetzt werden.
Im Steuerregister ROT_TA_IE können für die einzelnen Pins des Moduls Interrupts aktiviert werden. Bei einem Reset werden alle Bits mit Null initialisiert. Auf das Register kann lesend und schreibend zugegriffen werden.
Im Steuerregister ROT_TA_EDGSEL kann für die Pins des Moduls ausgewählt werden, ob sie auf steigende oder fallende Flanken einen Interrupt generieren sollen. Bei einem Reset werden alle Bits mit Null (= fallende Flanke) initialisiert. Auf das Register kann lesend und schreibend zugegriffen werden. (Die Signale RECHTS und LINKS sollten auf die steigende Flanke initialisiert werden.)
Im Statusregister ROT_TA_IR_STATUS wird für die einzelnen Pins des Moduls der Zustand des Interruptsignals angezeigt. Bei einem Reset werden alle Bits mit Null initialisiert. Auf das Register kann nur lesend zugegriffen werden. Die Bits des Registers werden erst bei einem Lesen eines der anderen 3 Register wieder gelöscht. Damit können auch sehr kurze Impulse erkannt werden. Die gesetzten Bits des Registers lösen nur dann Interrupt aus, wenn auch das Bit an der gleichen Position im ROT_TA_IE Register gesetzt ist.
Im Zählerregister ROT_TA_CONTER erhöht jede Bewegung nach rechts den Wert im Register und jede Bewegung nach links verringert den Wert im Register. Das Register kann mit jedem beliebigen Wert geschrieben werden. Nach Reset hat das Register den Wert Null.
Bei diesem Modul gibt es nur 3 Eingänge, die mit den Signalen des Rotations Tasters verbunden werden müssen. In der Dokumentation zum Spartan 3E Starterkit sind dazu folgende Bilder zu finden:
Die drei Signale haben im Modul die Namen rot_a, rot_b und rot_p. Sie sind in dieser Reihenfolge mit den Eingängen des Modul Register PIN_IN_DAT verbunden. An den folgenden beiden Bit werden die Signale LINKS und RECHTS erzeugt. Das Register hat also folgenden Aufbau:
Bit Nummer | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
Signal | rechts | links | rot_a | rot_b | rot_p |
Signal im Bild | A | B | ROT_CENTER |
Die Signale rechts und links werden erst nach einem Lesen des Registers ROT_TA_IR_STATUS wieder gelöscht!
rot.h
#ifndef __ROT_H #define __ROT_H #define ROT_PUSH (1<<0) // Druecken des Taster #define ROT_SIG_B (1<<1) // Signal B von ROT #define ROT_SIG_A (1<<2) // Signal A von ROT #define ROT_LEFT (1<<3) // Signal Links #define ROT_RIGHT (1<<4) // Signal Rechts typedef struct rot_ta { volatile unsigned int data; // (r) (r = reset-interrupt) volatile unsigned int ie; // (r/W) (r = reset-interrupt) volatile unsigned int edgsel; // (r/w) (r = reset-interrupt) volatile unsigned int ir_stat; // (r) volatile unsigned int counter; // (r/w) } rot_regs_t; #endif
Konfiguration und Instanziierung
Die Interruptleitung des Moduls muss an den gewünschten Eingang des Interruptkontrollers angeschlossen werden und die IO-Pins an die Eingänge des Top Level Moduls. Diese müssen dann noch den Pins des FPGA im jConfig zugeordnet werden.
Verbindungen
Name | Richtung | Pin am 3estk | Funktion | ||
reset | in | Reset | |||
intr | out | Interruptsignal mit einem freien Eingang am Interruptkontroller Verbinden. | |||
rot_a | in | K18 | Eingangsleitung, die mit Signal A vom Rotationstaster des Boards verbunden ist | ||
rot_b | in | G18 | Eingangsleitung, die mit Signal B vom Rotationstaster des Boards verbunden ist | ||
rot_p | in | V16 | Eingangsleitung, die mit Signal ROT_CENTER vom Rotationstaster des Boards verbunden ist |
UCF Einstellungen für die FPGA-Pin K18, G18 und V16 die auf dem 3eSTK-Board mit dem Rotationstaster verbunden sind.
NET "ROT_A" LOC = "K18" | IOSTANDARD = LVTTL | PULLUP ; NET "ROT_B" LOC = "G18" | IOSTANDARD = LVTTL | PULLUP ; NET "ROT_CENTER" LOC = "V16" | IOSTANDARD = LVTTL | PULLDOWN ;
Die Signale des Rotationstaster sind bei diesem Modul alle einzeln konfigurierbar, da hier bei dem verwendeten Board unterschiedliche Eigenschaften eingestellt werden müssen. Die obigen UCF Angaben müssen der Board-Beschreibung (z.B.: ML507 Virtex 5) entnommen werden.
Getestete UCF Einstellungen für die FPGA-Pin AH30, AG30 und AH29 die auf dem ML507-Board mit dem Rotationstaster verbunden sind.
NET "pin_ROT_ROTARY_INCA" LOC = "AH30" | IOSTANDARD = LVTTL | PULLDOWN; NET "pin_ROT_ROTARY_INCB" LOC = "AG30" | IOSTANDARD = LVTTL | PULLDOWN; NET "pin_ROT_ROTARY_PUSH" LOC = "AH29" | IOSTANDARD = LVTTL | PULLUP;
Protokoll des Tests
rot_ta.cTimer, RTI, LED und UART Test in C 1. Zeit auf der Konsole anzeigen Ende bei jeder Eingabe CTRL+B Stunden mit + stellen CTRL+C Minuten mit + stellen CTRL+D Sekunden mit + stellen CTRL+E Ende Stellen Aktuelle Zeit: 20:13:55 SpartanMC 18 TU-Dresden InfMR 2. Alle Eingaben werden auf der Konsole angezeigt Ende bei ESC Hallo, das ist der 2. Test Test des Rotations und Taster Moduls ESC = Programm Ende 0 0 1 1 2 2 3 0....5....0....5....0....5....0 ^
rot_ta2.c
Timer, RTI, LED, UART und Rotationstaster Test in C 1. Zeit auf der Konsole anzeigen Ende bei jeder Eingabe Stellen mit dem Rotationstaster oder CTRL+B Stunden mit + stellen CTRL+C Minuten mit + stellen CTRL+D Sekunden mit + stellen CTRL+E Ende Stellen Aktuelle Zeit: 07:36:22 Hallo ich bin SpartanMC 18 2. Alle Eingaben werden auf der Konsole angezeigt Ende bei ESC Hallo, das ist ein Test 3. Test des Rotationstaster Moduls ESC = Programm Ende 0 0 1 1 2 2 3 0....5....0....5....0....5....0 ^ Timer, RTI, LED, UART und Rotationstaster Test in C 1. Zeit auf der Konsole anzeigen Ende bei jeder Eingabe Stellen mit dem Rotationstaster oder CTRL+B Stunden mit + stellen CTRL+C Minuten mit + stellen CTRL+D Sekunden mit + stellen CTRL+E Ende Stellen Aktuelle Zeit: 09:56:09 Hallo ich bin SpartanMC 18
Testprogramm mit Ausgabe auf die mit der UART verbundene Konsole (mit Interrupt)
Programm für den Rotationstaster als C-Quelle rot_ta.c, als Übersetzungsliste rot_ta.lst und im spho-Format spartanmc_0.sph können hier geladen werden.Programm für den Rotationstaster als C-Quelle rot_ta2.c, als Übersetzungsliste rot_ta2.lst und im spho-Format spartanmc_0.sph können hier geladen werden.
Konfiguration im binären Format für den Spartan 3E Starter Kit auf der das Programm lauffähig ist.
Die Konfiguration hat 3 Speicherblöcke und kann hier aus der TAR.GZ-Datei unter /spartanmc-projects-master/praktikum_prog_mc/foerderband/3estk/ oder einzeln aus dem GIT geladen werden.- Konfigurationsdatei für jConfig
- Mit jConfig daraus erstellte module_test1_step_foerderband.v, module_subsystem_0.v, hardware.h und peripherals.h Datei
- Die verwendete Firmware mit StartUP Loader für 9 Speicherblöcke übersetzt als Quelle wd_rot_ta2_lcd.c, als Übersetzungsliste wd_rot_ta2_lcd.lst und im MEM-Format spartanmc_0.sph können hier geladen werden.
- SPARTANMC.BIT Datei für das 3e Board und SPARTANMC.MSK Datei für Verify im iMpact (nur Jumper M1 geschlossen).
- M25P16.MCS Datei und M25P16.CFI Datei für den SPI-PROM des 3e Board (nur Jumper M0 offen).
- xcf04s.MCS Datei und xcf04s.CFI Datei für den Platform Flash-PROM des 3e Board (alle Jumper M0, M1 und M2 geschlossen). Diese 6 Dateien in ein Verzeichnis speichern und von dort mit dem iMpact in einen der PROMs oder die FPGA speichern.