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;
ö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
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.