Forum: FPGA, VHDL & Co. Wie kann ich altera_up_avalon_ps2 in Quartus II v9.1 nutzen?


von Peter H. (Gast)


Lesenswert?

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.

von Ralf (Gast)


Lesenswert?

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?

von mki (Gast)


Lesenswert?

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.

von Peter H. (Gast)


Lesenswert?

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.

von Duke Scarring (Gast)


Lesenswert?

> 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

von Peter H. (Gast)


Lesenswert?

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.

von Peter H. (Gast)


Lesenswert?

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.

von Peter H. (Gast)


Lesenswert?

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?

von Peter H. (Gast)


Lesenswert?

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.

von Peter H. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.