Forum: FPGA, VHDL & Co. Tastaturdaten einlesen


von Axel P. (funkydunky)


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;

von Sultan (Gast)


Lesenswert?

Was ist das für ein Board ?

von Rick Dangerus (Gast)


Lesenswert?

Hast Du eine passende Testbench dazu?

Rick

von Axel P. (funkydunky)


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

von Axel P. (funkydunky)


Lesenswert?

ist ein spartan 3e

von Jan M. (mueschel)


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.

von Gast (Gast)


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.

von Axel P. (funkydunky)


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

von Rick Dangerus (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.