Forum: FPGA, VHDL & Co. ALTERA FPGA Board GPIO einlesen mit Verilog


von Tommm (Gast)


Lesenswert?

Guten Abend zusammen!

Ich habe ein Altera Cyclone 4 E FPGA Board gekauft. Ich programmiere mit 
Verilog HDL (finde es persönlich angenehmer als VHDL). Mein Wunsch ist 
über den GPIO (36Pin) ein Signal einzulesen und ein anderes auszugeben.

Die Verbindungen vom GPIO zum FPGA und wieder raus konnte ich der 
User_Manual schon entnehmen. Jetzt ist aber die Frage wie ich das ganze 
im Verilog Code einbinden muss, damit ich auch Signale in den FPGA 
bekomme.

Sinn dahinter soll sein, dass ich von aussen eine Frequenz und Amplitude 
vorgebe, mit der ich einen Sinus innerhalb meines FPGA generiere. Der 
Sinus wird dann mit einem Sägezahn verglichen und die so entstehende PWM 
möchte ich für einen Motor-Umrichter verwenden. Die PWM-Signale werden 
also logischerweise über Pins am GPIO wieder ausgegeben.

Das habe ich bisher:

module test_3(

// CLOCK
  CLOCK_50,
  CLOCK2_50,
  CLOCK3_50,

// GPIO deklarieren

  GPIO
);

// Ports
input         CLOCK_50;
input         CLOCK2_50;
input            CLOCK3_50;

inout [35:0]    GPIO;

//HauptCode

endmodule


Ja und hier haperts nun. Ich weis ich kann die GPIO einzeln über 
"GPIO[X]"
mit X={0..35} ansprechen.

Wie kann ich ein Signal von Aussen über den GPIO ins FPGA bekommen? Was 
muss das Signal für digitale Eigenschaften haben?
Wie kann ich das getaktete Signal über eine Art Assign wieder aus dem 
FPGA bekommen?

Sorry wenn die Fragen sehr plump erscheinen, ich bin leider Neuling und 
versuche mich aktuell einzuarbeiten. Vielen Dank im Voraus!

von Gerald M. (gerald_m17)


Lesenswert?

Wie kann dir Verilog angenehmer sein, wenn du noch nicht einmal ein 
Signal an einem PIN ausgeben kannst?

Prinzipiell (ich kann nur VHDL):
Du hast digitale Inputs und Outputs. Genau so musst du sie deklarieren. 
Aus deinen "Inout GPIO" solltest du bei den Inputs ein Input machen, bei 
den outs ein out.
Den Sinn von mehreren 50MHz Clocks erkenne ich auch nicht.
Willst du die Amplitude und Frequenz parallel an den Port anlegen? So 
kann kapier ich das nicht mit dem vergleichen und Sägezahn und weiß der 
Geier was.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tommm schrieb:
> Ich programmiere mit Verilog HDL (finde es ... angenehmer als VHDL).
Und warum nochmal?

> Wie kann ich ein Signal von Aussen über den GPIO ins FPGA bekommen?
Du musst die Pins über "Location Constraints" zuweisen.

> Was muss das Signal für digitale Eigenschaften haben?
Das steht im Datenblatt deines FPGAs und evtl. im Schaltplan deines 
Boards.

> Sinn dahinter soll sein, dass ich von aussen eine Frequenz und Amplitude
> vorgebe, mit der ich einen Sinus innerhalb meines FPGA generiere.
Ich würde das in VHDL so machen:
http://www.lothar-miller.de/s9y/archives/57-Sinusausgabe-mit-PWM.html
Wenn du die Idee dahinter verstanden hast, dann kannst du das leicht 
nach Verilog portieren...

von andi6510 (Gast)


Lesenswert?

Die Vorgehensweise für die Pins ist grob gesagt wie folgt:
Du nennst die Pins in deinem Top-level module so wie du willst und 
deklarierst diese als input bzw output:

module meinspielzeug(clock, signal, led);

input clock;
input signal;
output led;

// hier kommt dann dein Code

endmodule;

Dann simulierst Du das ganze erst mal in ModelSim, so dass alles zur 
Zufriedenheit funktioniert. Hierzu musst Du noch eine Testbench 
schreiben in der das top-level modul (meinspielzeug) eingebunden und mit 
Testsignalen versorgt wird.

Wenn das alles funktioniert gehts daran, das Ganze fürs FPGA zu 
synthetisieren. Hierzu wird das Design in Quartus II (von Altera) 
geladen und nach einstellung welches FPGA du verwendest synthetisiert. 
Dabei landen dan die Ein- und Ausgänge auf mehr oder weniger zufälligen 
Pins. Um nun festzulegen, auf welchen Pins diese Signale wirklich liegen 
sollen, öffnest Du den Pin Planner und und legst dort die Signale auf 
die gewünschten pins. Nochmal auf compile drücken und fertig.

von Tommm (Gast)


Lesenswert?

>> Ich programmiere mit Verilog HDL (finde es ... angenehmer als VHDL).
>Und warum nochmal?

Ich habe bisher nur kleine Experimente mit LEDs und HEX Anzeigen gemacht 
und dabei fiel mir die Arbeit mit Verilog leichter. Ich merke aber das 
ich mich damit unbeliebt mache :D

>Aus deinen "Inout GPIO" solltest du bei den Inputs ein Input machen, bei
>den outs ein out.

Okay das Verstehe ich, aber was dann? Wenn ich über einen GPIO Pin, 
Sagen wir mal GPIO[1] ein Signal einlesen will, wie würde die 
Kommandozeile in VHDL oder Verilog HDL heißen? Ich brauch nur ein 
Beispiel das ich es verstehe.

>Den Sinn von mehreren 50MHz Clocks erkenne ich auch nicht.

Das Board hat drei Clocks, ich hab einfach alle angemacht. Erstmal ohne 
wirklichen Grund.

>Willst du die Amplitude und Frequenz parallel an den Port anlegen? So
>kann kapier ich das nicht mit dem vergleichen und Sägezahn und weiß der
>Geier was.

Die Vorgaben für Amplitude (Wert zw. 0 und 1) sowie Frequenz (Wert zw. 0 
und 100) sollen an Zwei Pins anliegen. Die Beiden Vorgaben lasse ich im 
FPGA zu einem Sinus mit vorgegebener Amplitude und Frequenz 
zusammenbauen. Das Vergleichen mit dem Sägezahn dient der PWM Erzeugung. 
Diese PWM Signale benötigt ein Frequenzumrichter um die Halbleiter so zu 
Takten, dass ein Sinusförmiger Strom am Ende entsteht.


>> Wie kann ich ein Signal von Aussen über den GPIO ins FPGA bekommen?
>Du musst die Pins über "Location Constraints" zuweisen.

Habe da nichts brauchbares in der Hilfe gefunden. Kannst du bitte dazu 
noch ein paar Worte verlieren?

>> Was muss das Signal für digitale Eigenschaften haben?
>Das steht im Datenblatt deines FPGAs und evtl. im Schaltplan deines
>Boards.

Also ich meine nicht die Spannung. Ich meine: Ist es Ratsam eine 
Dezimalzahl (die ich ja für die Frequenz habe) als z.b. 6-Bit Binärzahl 
getaktet in den FPGA zu geben oder gibt es da andere Möglichkeiten?

>> Sinn dahinter soll sein, dass ich von aussen eine Frequenz und Amplitude
>> vorgebe, mit der ich einen Sinus innerhalb meines FPGA generiere.
>Ich würde das in VHDL so machen:
>http://www.lothar-miller.de/s9y/archives/57-Sinusa...
>Wenn du die Idee dahinter verstanden hast, dann kannst du das leicht
>nach Verilog portieren...

Die Idee dahinter hab ich noch nicht ganz verstanden aber ich arbeite 
daran :) werd ich mal schauen wie ich das in Verilog portiere oder ich 
lerne halt VHDL. Sehr lehrreiche Internetseite hast du da wenn ich das 
anmerken darf, steht echt viel drin.

Vielen Dank schonmal für die Antworten!

von andi6510 (Gast)


Lesenswert?

Verilog ist in Ordnung. In Europa wird VHDL gelehrt während die Amis und 
die Asiaten eher Verilog bevorzugen. Ich persönlich habe nun in zwei 
internationalen Firmen nichts anderes als Verilog gemacht und ich 
empfinde es ebenfalls als angenehmer als VHDL (ohne hier die Gründe 
diskutieren zu wollen). Kann also nicht so schlimm sein ,-)

"location constraints" entspricht dem, was ich in meinem posting mit dem 
Pin Planner beschrieben habe. Der Pin Planner erzeugt im Hintergrund die 
entsprechenden constraints so dass Du diese nicht extra von Hand 
editieren musst. Ist fuer den Anfang einfacher.

Wenn du eine Zahl von aussen brauchst (z.B. die Frequenz) gibst du sie 
am einfachsten parallel ein. Also z.B. mit 7 pins mit denen Du dann 
Zahlen zwischen 0 und 127 darstellen kannst. Auf dem FPGA-board sind 
möglicherweise ein paar DIP-Schalter, welche sich hierzu verwenden 
lassen. Oder du verwendest zwei 16-Stufige Binärschalter mit denen du 
eine 8-bit Hex-Zahl einstellen kannst und welche dann 8 Eingangspins 
belegen.

Ganz luxoriös wäre ein Drehencoder, welcher beim Drehen nur hoch/runter 
Impulse erzeugt. Mit diesem wird dann intern ein Zähler hoch bzw runter 
gezählt und das Ergebnis wieder über einen 7-Segment encoder nach 
draussen auf zwei 7-Segment Anzeigen gelegt. Dann kan man die Zahl per 
Hand einstellen.

Schau mal auf fpga4fun.com - ich meine die haben da ein paar Beispiele 
für sowas.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

andi6510 schrieb:
> Ganz luxoriös wäre ein Drehencoder, welcher beim Drehen nur hoch/runter
> Impulse erzeugt.
Den Luxus gäbe es dort auch:
http://www.lothar-miller.de/s9y/archives/53-Drehgeber,-Encoder,-Quadraturdecoder.html

Tommm schrieb:
> Ich meine: Ist es Ratsam eine Dezimalzahl (die ich ja für die Frequenz
> habe) als z.b. 6-Bit Binärzahl getaktet in den FPGA zu geben
Hört sich irgendwie seltsam und exklusiv an...

> oder gibt es da andere Möglichkeiten?
Eine serielle Schnittstelle (RS232) wäre da meine erste Wahl...

Tommm schrieb:
> Sehr lehrreiche Internetseite hast du da wenn ich das anmerken darf,
> steht echt viel drin.
Danke, es ist einiges drin, ich brauche manchmal selber die Suche... ;-)

von Martin K. (martinko)


Lesenswert?

Tommm schrieb:
> . . .
>
> Die Vorgaben für Amplitude (Wert zw. 0 und 1) sowie Frequenz (Wert zw. 0
> und 100) sollen an Zwei Pins anliegen. Die Beiden Vorgaben lasse ich im
> FPGA zu einem Sinus mit vorgegebener Amplitude und Frequenz
> zusammenbauen. Das Vergleichen mit dem Sägezahn dient der PWM Erzeugung.
> Diese PWM Signale benötigt ein Frequenzumrichter um die Halbleiter so zu
> Takten, dass ein Sinusförmiger Strom am Ende entsteht.
>
> . . .

Du kannst an einem Pin keinen Wert zwischen 0 und 1 oder 0 und 100 
einlesen. Du kannst nur digitale Signale (High- / Low Pegel) einlesen.
Das selbe bei der Ausgabe, nur digitale Signale. Wenn Du eine PWM 
Ausgeben möchtest, dann musst Du diese PWM selber generieren.

Gruß Martin

von Tommm (Gast)


Lesenswert?

andi6510 schrieb:
> Verilog ist in Ordnung. In Europa wird VHDL gelehrt während die Amis und
> die Asiaten eher Verilog bevorzugen. Ich persönlich habe nun in zwei
> internationalen Firmen nichts anderes als Verilog gemacht und ich
> empfinde es ebenfalls als angenehmer als VHDL (ohne hier die Gründe
> diskutieren zu wollen). Kann also nicht so schlimm sein ,-)

Vielen Dank andi6510 :D

So, also neues von mir:

erstmal Danke für die tollen Ideen. Habe die prellfreien Taster auf dem 
Board genutzt um mir aus einer Key rising edge & Clock rising edge einen 
Zähler gebaut. Zählt prima hoch und runter. Das Ergebnis lass ich mir 
binär mit LEDs anzeigen. 8 Bit, das langt erstmal.

Zum Sinus: Also die Idee habe ich hoffentlich richtig verstanden - ich 
nehme entweder eine Tabelle die Sinuswerte des ordinären Sinus 
beinhaltet, oder ich nutze den CORDIC Algorithmus. Ich finde den CORDIC 
super, weil er schnell aber vor allem ressourcensparend ist, aber ich 
hab dazu leider keine Quelle gefunden die alles vollends erklärt. Gibt 
es sowas in der Richtung? Vielleicht sogar auf deutsch? Die Grundidee 
mit der Koordinatentransformation ist schon nachvollziehbar aber der 
Schritt vom Dynamischen Systen zur Sinusberechnung ist es noch nicht.

Also nochmal besten Dank! Ich hoffe auf weitere fruchtbare Ergüsse :)

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.