Hallo Mikrocontroller.net, vielen Dank für die vielen Tipps, die ich hier im Forum schon finden konnte und ein frohes neues Jahr für alle die dies lesen. Ich sitze derzeit an einem sehr konkreten Problem mit der Hoffnung, dass Ihr mir vielleicht helfen könnt: Ich entwickle auf einem DE2 Board von Altera unter Verwendung der aktuellen Softwareversionen (Webedition) von der Altera-Webseite. Nach meinen ersten Versuchen in VHDL habe ich mit einem Freund zusammen ein einfaches Programm gebaut, dass Tastatureingaben empfangen an der PS/2-Schnittstelle auf dem LCD-Display des DE2 ausgibt. In reinem VHDL funktioniert dieses Beispiel bei uns. Nun habe ich mit einer NIOS II CPU einige LEDs blinken lassen und als nächsten Schritt möchte ich gern das Tastatur zu LCD-Beispiel in eben dieser CPU realisieren. Über den Quartus SOPC-Builder konnte ich das LCD einbinden, dafür war schon ein Element vorhanden. SDRAM für ausreichend Speicher für meinen C-Code habe ich schon eingebunden. Nun hänge ich als Anfänger beim Einbinden/Abfragen der Tastatur: Altera stellt mit den altera_up_avalon_ps2-Dateien anscheinend eine Möglichkeit zur Verfügung die PS/2-Schnitstelle anzusprechen. Mir wird aber zum einen die Funktionsweise noch nicht ganz klar. Handelt es sich dabei um einen Block der die Kommunikation zur Schnittstelle ermöglicht oder um eine zweite CPU mit der ich kommunizieren kann um PS/2-Daten zu empfangen? Zum Anderen, gibt es eine angepasste Schnittstelle für Quartus II v9.1? Leider bekomme ich die Version vom Altera FTP nicht zum Laufen, da beim Einbinden im SOPC-B. einige Funktionen als deprecated bemängelt werden. Seht Ihr eine Chance mit dem Code unter v9.1 weiterzuarbeiten, gibt es Beispielcode wie ich eine PS/2-Tastatur per NIOS auf dem DE2 ansprechen kann oder könnt Ihr mir generell Tipps geben, wie ich weiter vorgehen könnte, um meine Tastatureingaben in meine CPU zu bekommen. Kann ich aus meiner in VHDL geschriebenen Schnittstelle irgendwie einen Block für den SOPC generieren, bzw. hat jemand dazu ein Tutorial? Es sind viele Fragen, aber ich habe mich sehr stark an dieser PS/2 Frage festgebissen und trotz viel Suche und Recherche im Netz komme ich nicht weiter, wobei ich wirklich gern verstehen möchte wie die Arbeit mit CPUs funktioniert. Vielen Dank vorab! Ich freue mich über jede Hilfe. Grüße, Peter.
Hier seine Frage in Kurzform: Wie kann man am Altera DE2 Tastatureingaben von der PS/2-Schnittstelle mit einem NIOS Softcore nutzen? Der downloadbare PS/2-Controller von Altera verweigert den Dienst. Gibt es eine lauffähige Version bzw. wie kann man eine aufbauen?
Wie das "altera_up_avalon_ps2" Modul funktioniert kann ich dir nicht sagen. Das kenne ich nicht. Jedoch könntest du dein Modul kompatibel mit dem Altera Avalon Bus machen. Danach kannst du dann in deiner NIOS CPU mit integrieren und von deinem C Programm aus ansprechen.
Wir sind heute noch einmal das komplette NIOS II Software Developer's Handbook durchgegangen. Das Modul anzupassen ist denke ich noch zu kompliziert für uns. Da wir so vorerst nicht weiterkamen haben wir das Problem beiseite gelegt und erstmal mehrere kleine Projekte aufgebaut, wo wir verschiedenes auf dem Softcore laufen lassen haben. Probleme zeigten sich immer wenn wir versuchten auf den SDRAM zuzugreifen, da müssen wir auf jeden Fall noch nachlesen und umbauen. Sind jetzt erstmal auf den onchip-memory ausgewichen. Ich denke das Problem dabei liegt an den clock-Signalen. Wenn das Programm in den SDRAM geschrieben wird klappt es anscheinend, aber beim Verifizieren wird mit Fehler abgebrochen. Auf dem Altera FTP haben wir nach längerem Suchen dann auch noch eine Implementierung der "altera_up_avalon_ps2" in einem Unterordner "90" gefunden. Soweit konnte ich damit im SOPC einen kompilierbaren Core bauen, das sieht schon vielversprechend aus. Ich habe auch schon den C-Code soweit geschrieben, dass theoretisch ein Empfang der Tastaturdaten möglich sein sollte. Allerdings habe ich gerade das Board nicht hier, um testen zu können. Wenn das so läuft, dann hätte sich die Frage damit geklärt... Ich werde morgen im Laufe des Tages berichten. Schönen Abend noch, Peter.
> einige Funktionen als deprecated bemängelt werden
Sind das Fehler oder nur Warnungen?
Wenn Du was mit Softcores machts, wirst Du früher oder später an den
Punkt kommen, eigene IP/Cores/Code anbinden zu wollen. Dazu mußt Du das
entsprechende Businterface (Avalon/OPB/Wishbone/AHB) realisieren.
Warum machst Du nicht den vorhandenen PS2-Code Avalon-tauglich?
Duke
Hallo Duke, ich habe mich vorerst mit dem Simulieren von VHDL-Code in einer Testbench beschäftigt. Leider habe ich momentan immer noch keinen Zugriff auf das Dev-Board. Das Anbinden an das Businterface ist so einfach dahingesagt, aber für mich noch nicht klar wie das genau vonstatten geht, bzw. an welcher Stelle ich dazu Anleitung finden kann. Ich habe im Handbook nachgelesen zum erstellen eigener DeviceDriver, aber ich bräuchte denke ich mal eine kurze Schlagwort-Anleitung wie man vorgeht. Ich sehe das derzeit so (korrigiert mich bitte wenn ich falsch liege): Ich habe als Block meinen VHDL-Code von dem ich ähnlich wie beim Aufbau der Testbench nur E/A sehe. Da herum baue ich jetzt einen Treiber, der die zeitlichen Anforderungen kennt und die Daten aufbereitet über einen Interrupt an die CPU weiterreicht über besagten Bus. So hab ich es probiert über den SOPC-Builder, dort versucht meinen VHDL Block im importieren. Das brachte mich aber nicht weiter. Geht es an der Stelle in Tcl weiter oder wie geht man vor? Danke vorab.
Duke Scarring schrieb: >> einige Funktionen als deprecated bemängelt werden > Sind das Fehler oder nur Warnungen? Hab ich vergessen zu beantworten: es waren nur Warnungen. Den Fehler bei der Generierung kann ich nicht nachvollziehen. Wir haben den Code dann verworfen und unsere CPU mit der neuen Funktion noch einmal von Grund auf neu aufgebaut in einem ganz neuen Projekt. Wie oben schon erwähnt generiert er nun ohne Probleme. Ich warte noch drauf den Code endlich mal im Board laufen zu lassen.
Ich habe mir jetzt erstmal VHDL-Synthese von Reichardt/Schwarz bestellt. Gibt es noch ein gutes Buch, dass die Entwicklung um den Softcore abdeckt? Also auch detailliert beschreibt wie man IP/Cores/Code anbindet?
Ich habe jetzt endlich die Möglichkeit mit dem Dev-Board zu testen gehabt, leider funktioniert mein Code nicht. Ich habe mein Programm auf Basis des hello_world_small-Templates erstellt und konnte auch Daten auf dem LCD ausgeben. Nun habe ich den Code ergänzt zu folgendem Programm:
1 | #include "sys/alt_stdio.h" |
2 | #include "altera_up_avalon_ps2.h" |
3 | #include "altera_up_ps2_keyboard.h" |
4 | |
5 | int main(void) |
6 | {
|
7 | alt_up_ps2_dev *ps2 = alt_up_ps2_open_dev("/dev/up_avalon_ps2_0"); //Einbinden PS/2 |
8 | alt_up_ps2_init(ps2); |
9 | alt_up_ps2_clear_fifo(ps2); |
10 | |
11 | //Test der STDOUT kommt nicht am LCD an, da PS/2 eventuell als STDOUT gesetzt? |
12 | alt_putstr("test"); |
13 | |
14 | if (ps2->device_type == PS2_KEYBOARD) //ist es eine Tastatur? |
15 | {
|
16 | KB_CODE_TYPE decode_mode; |
17 | alt_u8 buffer; |
18 | char ascii; |
19 | char *inputStr; |
20 | |
21 | while(1) |
22 | {
|
23 | if (decode_scancode(ps2, &decode_mode, &buffer, &ascii)==0) //kommt was der Tastatur? |
24 | {
|
25 | if (decode_mode == KB_ASCII_MAKE_CODE ); |
26 | {
|
27 | translate_make_code(decode_mode, buffer, inputStr); //Space, CTRL, etc übersetzen |
28 | alt_putstr(inputStr); //Ausgabe des Codes |
29 | }}}}
|
30 | else
|
31 | {
|
32 | alt_putstr("Error...\n"); //Fehler beim initialisieren oder keine Tastatur |
33 | return -1; |
34 | }}
|
Wenn ich bei diesem Beispiel die Zeile
1 | alt_up_ps2_init(ps2); |
auskommentiere wird auf dem LCD test Error... ausgegeben. Ich vermute, dass die Initialisierung von ps2 STDOUT umkonfiguriert. Kann ich das irgendwie manuell wieder zurückbiegen, wenn ich mit der small C Library arbeite? (normalerweise hätte ich es mit File, fopen, fprintf versucht, aber die stehen in diesem Fall ja nicht zur Verfügung) Danke vorab.
Es ist nicht alt_up_ps2_open_dev ("/dev/up_avalon_ps2_0"); sondern alt_up_ps2_open_dev("/dev/ps2_0");. Damit sollte es nun komplett laufen, ich werde morgen testen können. Die Namen der Komponenten stehen in der system.h. Ein Dozent von mir hat über den Code gesehen und es gefunden, da wäre ich nicht mehr drauf gekommen, weil ich mich so auf das stdout als Fehlerquelle festgefangen hatte. Danke, damit funktioniert es nun wohl.
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.