www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Tastaturdaten einlesen

Autor: Axel Preuss (funkydunky)
Datum: 13.05.2008 21:33

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: 14.05.2008 17:58

Was ist das für ein Board ?
Autor: Rick Dangerus (Gast)
Datum: 14.05.2008 21:33

Hast Du eine passende Testbench dazu?

Rick
Autor: Axel Preuss (funkydunky)
Datum: 14.05.2008 21:51

ö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: 14.05.2008 21:52

ist ein spartan 3e
Autor: Jan M. (mueschel)
Datum: 14.05.2008 21:55

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: 14.05.2008 23:17

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: 14.05.2008 23:26

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: 15.05.2008 18:05

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net