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!
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.
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...
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.
>> 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!
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.
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.htmlTommm 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... ;-)
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
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 :)