mikrocontroller.net

Forum: FPGA, VHDL & Co. Tastaturdaten einlesen


Autor: Axel Preuss (funkydunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich verzweifle hier gerade und weiß nicht so recht weiter.

Ich möchte Tastendrücke an einer PC-Tastatur erkennen und auch 
auswerten. Prinzipiell habe ich es schon geschafft, Daten einzulesen und 
auch die Tasten auf einem LCD anzuzeigen. Es hapert aber im Detail.
Ein Tastendruck wird von der Tastatur in 11 bits verpackt. Ein 
Startbit(0), 8 Datenbits die den Tastaturcode angeben, ein Parity und 
ein Stopbit(1).
Die Datenleitung ist vor und nach der Datenübertragung immer auf High.

Ich hatte mir nun ein Shiftregister gebastelt das die Daten 
kontinuierlich einliest und shiftet. Das führt aber zu Problemen, wenn 
man die Tasten auswerten möchte(ich möchte im speziellen einen Druck auf 
die ShiftTasten erkennen/auswerten)

Nun versuche ich mich daran, einen Zähler der bis 11 zählt zu bauen(habe 
ich), der das Shiftregister irgendwie enabelt wenn das Startbit 0 
erkannt wurde, und das dann einfach 11 Werte in den Speicher reinshiftet 
und danach das Shiften bis zum nächsten Tastendruck stoppt.
Irgenwie bekomme ich die Steurung des ganzen aber nicht hin

Ich habe einen Zähler und einen Shift Process, aber irgendwie müssen die 
sich ja gegenseitig enablen bzw. steuern. Vorallem darf der Zähler ja 
nur gestartet werden, wenn ein Startbit=0 erkannt wurde. Wenn eines der 
Datenbits 0 ist, soll ja einfach weitergezählt werden.

Kann mir jemand einen Denkanstoß geben? Ich hab da irgendwie einen 
Knoten im Kopp und bin leider auch kein VHDL Profi
Oder mache ich das ganze viel zu kompliziert und es geht auch einfacher?

Hier mal mein Codeauszug:

SHIFT_TASTE: process (RESET, INTERN_KEY_INTERUPT)
   begin
      if RESET='0' then               --initialisieren
      elsif (INTERN_KEY_INTERUPT = '0' and INTERN_KEY_INTERUPT'event) 
then
       KEY_INPUT <= KEY_INPUT(10 downto 0) & K_IN_DATA;
    end if;
   end process SHIFT_TASTE;

   COUNT11:process(RESET,INTERN_KEY_INTERUPT)
   begin
      if RESET='0' then
         COUNT_INTR <= (others => '0');
      elsif (INTERN_KEY_INTERUPT = '0' and INTERN_KEY_INTERUPT'event) 
then
       COUNT_INTR <= COUNT_INTR + 1;
    end if;
   end process COUNT11;

Autor: Sultan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist das für ein Board ?

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du eine passende Testbench dazu?

Rick

Autor: Axel Preuss (funkydunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
öhm...das ist ein spartan 3 board.

ich simuliere mit do files in modelsim. an testbenches hab ich mich noch 
net rangetraut.

reichen meine angaben? ich denke mir gehts auch eher um so bischen 
pseudocode...vhdl ist einfach von der denkweise irgendwie total anders 
als c oder andere hochsprachen. ich tu mich da recht schwer mit

Autor: Axel Preuss (funkydunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist ein spartan 3e

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst eine state machine (-> google, wiki, forumssuche, etc) mit 
drei Zuständen: idle, warten und auswerten. Aus idle gehst du nach 
warten, wenn eine 0 erkannt wird, dnan zählst du bis 11, und dann 
wertest du das Schieberegister aus und gehst wieder in idle.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um was handelt es sich bei INTERN_KEY_INTERUPT ? Ist das ein Takt oder 
ein Signal von der Tastatur ? Wenn es "nur" ein Signal ist könnte es 
schon mal daran liegen, dass dein Prozess keinen Takt hat und somit nur 
bei jedem Tastendruck reagiert.

Ich würde Dir raten einen Testbench zu schreiben, dann kannst Du Dir 
wenigstens mal anschauen was da wirklich passiert. Ansonsten ist Jans 
Tip sehr gut. Eine Statemachine ist wohl die einfachste Lösung dafür.

Autor: Axel Preuss (funkydunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich probiere es mal mit einer statemachine.


INTERN_KEY_INTERUPT ist quasi ein runtergeteilter Systemtakt. ich prüfe 
256 mal ob eine clock von der tastatur anliegt, und erst dann lese ich 
die tastaturdaten aus. soll störungen verhindern

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach Dir eine richtige Testbench. Ein, die Dir die Werte generiert, die 
Du erwartest. Damit kannst Du erstmal schauen ob Dein Modul richtig 
reagiert.

Alles andere ist doch nur stochern im Nebel und macht auf Dauer keinen 
Spaß.

Rick

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.