Forum: FPGA, VHDL & Co. DE0-Nano Board mit Ausgang von externen Sensoren anschließen (optischer Sensor)


von Hans W. (de0-nano)


Lesenswert?

Hi zusammen,

so langsam bin ich echt am Verzweifeln.

Ich habe mir ein De0-Nano Board von Altera zugelegt und wollte damit 
eigentlich die Ausgänge verschiedener Sensoren zusammenschalten und 
damit ein bissel "rumspielen".

Nun komm ich zum eigentlichen Problem:

Ich scheitere schon an den einfachsten Sachen wie ich das so sehe.

Zunächst möchte ich ganz einfach die Ausgänge zweier Sensoren (optischer 
Sensor) 24V Ausgangsspannung über einen Optokoppler der von 24V auf 3.3 
V reduziert an zwei der GPIO PINS der 40 PINS anschließen. Die GPIO 
Eingänge habe ich via boolesche Algebra mit einem UND Baustein verbunden 
und den Ausgang des UND Baustein mit der LED0 verbunden.

Nun das ganze kompiliert und danach die PINS definiert. Die beiden 
Eingangspins vom   Expansion Headder lautet GPIO_024 und GPIO_026, der 
Ausgang geht auf A15 /LED0).

Jetzt nochmal kompiliert und das ganze via Programmer auf den FPGA 
übertragen.

Sobald das abgeschlossen ist stelle ich fest, dass 7 Dioden leicht 
glimmen und die Diode die ich eigentlich ansteuern möchte leuchtet hell 
auf obwohl beide Eingänge noch keine 3,3V Eingangsspannung liefern.

Kann mir das mal einer erklären was ich hier grundsätzlich falsch mache? 
Muss ich hier noch extern ein Pull down Widerstand anschließen und die 
beiden Eingangspins auf Masse ziehen wenn der Sensor grad nicht 
schaltet?

Oder soll och die beiden Eingänge via ADC in digitale Signale umwandeln 
und damit weitermachen? Falls ja wie  mach ich das genau? Ich habe am 
ADC zwar 8 Eingänge aber nur einen Ausgang.

Ich bin echt am verzweifeln und langweile euch sicher weil das ganze 
bestimmt trivial ist jedoch würde ich mich über qualifizierte Hilfe 
super riesig freuen.


So ich hoffe nun, dass das Problem hier einigermaßen verständlich 
umschrieben ist und wünsche euch einen angenehmen Tag.

viele Grüße

von Duke Scarring (Gast)


Lesenswert?

Hans Wurst schrieb:
> Sobald das abgeschlossen ist stelle ich fest, dass 7 Dioden leicht
> glimmen und die Diode die ich eigentlich ansteuern möchte leuchtet hell
> auf obwohl beide Eingänge noch keine 3,3V Eingangsspannung liefern.
>
> Kann mir das mal einer erklären was ich hier grundsätzlich falsch mache?
> Muss ich hier noch extern ein Pull down Widerstand anschließen und die
> beiden Eingangspins auf Masse ziehen wenn der Sensor grad nicht
> schaltet?

Versuch doch erstmal die LED's per Taster/Dip-Switch anzusteuern.
Damit kannst Du sicherstellen, das die Toolchain richtig läuft.

Duke

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


Lesenswert?

Hans Wurst schrieb:
> obwohl beide Eingänge noch keine 3,3V Eingangsspannung liefern.
Sondern? Welche Pegel hast du an deinen Eingängen?

von Sigi (Gast)


Lesenswert?

Stell doch einfach mal deine VHDL-Files und das QSF-File hier
ins Forum ein. Dann kann man schon mal erste Fehler einkreisen
bzw. ausschliessen.

von Matthias (Gast)


Lesenswert?

Es gibt eine Einstellung für unused pins. Da kannst du zb einstellen 
"unused pins used as input with pull up" und dergleichen...
LG

von Hans W. (de0-nano)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

vielen, vielen Dank für die ganzen Antworten, ich bin leider jetzt erst 
dazu gekommen das zu lesen.

Ich habe gerade eben das Projekt erneut erstellt und die entsprechenden 
Files hier auch hochgeladen.

Im Moment habe ich noch gar keine Ahnung vom VHDL Code, ich erzeuge 
meine Hardwarebeschreibung immer in der *.bdf Datei und erzeuge mir 
daraus die *.vhd Datei.

Es ist jedenfalls wie gehabt, die 7 LED die ich nicht angesteuert habe 
glimmen und die eine die ich ansteuern möchte brennt hell wobei die 
beiden PINS (C9 und E11) nicht mit 3,3V angesteuert wurden. Bin echt 
ratlos. Bin für jede Hilfe dankbar.

Schönen abend noch :-)

von Hans W. (de0-nano)


Lesenswert?

Hans Wurst schrieb:
> Hallo zusammen,
>
> vielen, vielen Dank für die ganzen Antworten, ich bin leider jetzt erst
> dazu gekommen das zu lesen.
>
> Ich habe gerade eben das Projekt erneut erstellt und die entsprechenden
> Files hier auch hochgeladen.
>
> Im Moment habe ich noch gar keine Ahnung vom VHDL Code, ich erzeuge
> meine Hardwarebeschreibung immer in der *.bdf Datei und erzeuge mir
> daraus die *.vhd Datei.
>
> Es ist jedenfalls wie gehabt, die 7 LED die ich nicht angesteuert habe
> glimmen und die eine die ich ansteuern möchte brennt hell wobei die
> beiden PINS (C9 und E11) nicht mit 3,3V angesteuert wurden. Bin echt
> ratlos. Bin für jede Hilfe dankbar.
>
> Schönen abend noch :-)


Nachtrag:
Ich habe jetzt anstelle der GPIO PINS (GPIO_024 und GPIO_026 des 40 
poligen  Headder) zwei Schalter auf dem Board angeschlossen, wie Duke 
vorab schon vorgeschlagen hat. Jetzt zeigt sich folgendes Bild.

Die 7 LEDs die ich nicht ansteuern möchte glimmen ebenfalls. Die LED die 
ich schalten möchte ist allerdings aus und wird erst hell wenn beide 
Schalter auf 1 stehen. So wie gewünscht. Warum geht das aber nicht wenn 
ich extern an die entsprechenden PINs jeweils 3,3V anlege?

von peter (Gast)


Lesenswert?

Du kannst keine LED direkt ansteuern, dazu ist der Strom zu gering an 
den GPIO. Ich glaube die haben ca nur Max 12mAH.
Ich steuere meine LED über Transistoren an , die am GPIO-Pin von 
DE0-Board hängen. Auch die LED die nicht leuchten sollen , müssen einen 
Bezugspunkt in der VHDL haben.

Gruss

von G. L. (lele)


Lesenswert?

Könnte es sein, dass die Eingänge, also deine GPIOs 024 und 026 
pulldowns brauchen?...nicht daß sie schweben oder so...
Klemm doch mal versuchsweise extern an die Pins je einen 1k oder 10k 
(was du eben da hast) widerstand gegen GND.

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


Lesenswert?

peter schrieb:
> Du kannst keine LED direkt ansteuern, dazu ist der Strom zu gering an
> den GPIO. Ich glaube die haben ca nur Max 12mAH.
Wenn schon, dann mA. Aber heutzutage kann man eine LED ganz gut sichtbar 
mit 1 mA leuchten lassen. Und das tun alle diese Eval-Boards...

> Ich steuere meine LED über Transistoren an , die am GPIO-Pin von
> DE0-Board hängen. Auch die LED die nicht leuchten sollen , müssen einen
> Bezugspunkt in der VHDL haben.
Das "Glimmen" der nicht benutzten LEDs deutet darauf hin, dass 
unbenutzte Pins mit einem Pullup ausgestattet werden, damit keine 
undefinierten Pegel an die Eingangstreiber kommen. Aber so etwas steht 
im Datenblatt des FPGAs. Das ist eine unglaublich interessante und 
vielseitige Lektüre, die man besonders dann, wenn man so einen Baustein 
in der Praxis einsetzen will, wenigsztens mal quergelesen haben MUSS.

Hans Wurst schrieb:
> So wie gewünscht. Warum geht das aber nicht wenn ich extern an die
> entsprechenden PINs jeweils 3,3V anlege?
Ich meine, das schon mal gefragt zu haben: hast du das gemessen? Und: 
legst du als Low-Pegel dann auch 0V /am FPGA-Pin/ an? Du musst sowohl 
bei High wie auch bei Low für definierte Pegel am FPGA-Pin sorgen.

: Bearbeitet durch Moderator
von Hans W. (de0-nano)


Lesenswert?

Hallo Lothar,

vielen Dank für die Hinweise. Ich habe ca. 1.3 V an den 'offenen' PINS 
gemessen. Ich werde wohl, so lange kein High Signal geliefert wird die 
PINS mittels Pulldown Widerstand auf Masse legen.

Ich habe gehofft, dass das Board so etwas drauf hat. Pullup-Widerstände 
für die unbelegten PINS geht ja auch. Wenn ich alle freien PINS auf 
Masse lege ändert das auch nicht an am Resultat.

Sollte das dann funktionieren komme ich zum nächsten Problem wo ich 
nicht weiß ich ich es angehen soll.

Zukünftig würde ich gern zwei oder mehr Sensoren anschließen und ich 
möchte, dass die LED nur leuchtet wenn alle Sensoren entweder, zur 
gleichen Zeit oder wenn die Sensoren innerhalb einer Sekunde (beginnend 
ab dem ersten HIGH Signal eines der Sensoren), auf HIGH stehen, sprich 
3,3V liefern.


Nochmal anders gesagt:
Der FPGA soll also prüfen sobald einer der Sensoren HIGH wird ob dann 
innerhalb einer Sekunde die anderen auch HIGH werden und dann die LED 
zum leuchten bringen, wenn nicht soll der Ausgangspegel des ersten 
Sensor wieder auf LOW gehen.

Der ganze Prozess soll erst wieder in Takt gesetzt werden bis einer der 
Sensoren ein HIGH meldet.

Ich hoffe es ist einigermaßen nachzuvollziehen was ich meine.

Wo muss ich da ansetzen? Wie kann man das Ganze umsetzen?

Muss ich dazu nun die Sensorausgänge mittels ADC in ein digitales Signal 
umwandeln um dann damit bitweise weiter zu arbeiten? Oder kann das ganze 
auch analog erledigt werden

Viele Grüße und vielen Dank für die Hilfe schon mal.

von jonas biensack (Gast)


Lesenswert?

Naja du brauchst wohl einen zurücksetzbaren Zähler, google: asynchron 
counter vhdl. Mit ein paar Berechnungen am schreibtisch und der 
quartz-frequenz kann man dann leicht ausrechnen, wie lange so ein Zähler 
zählen muss bis er eine Sekunde verblassen hat. Dazu einen kleinen 
Zustandsautomat der die Zustände (fang_neu_an, zählt, fertig) händelt 
und die Eingänge abklappert... das ist doch vollkommen easy...

Gruß Jonas

von Aufpasser (Gast)


Lesenswert?

jonas biensack schrieb:
> Naja du brauchst wohl einen zurücksetzbaren Zähler, google: asynchron
> counter vhdl.

asynchron ist böse danach googelt man nicht!

Ernsthaft, einen asynchronen Zähler verwendet man nicht in einem FPGA.

von Hans W. (de0-nano)


Lesenswert?

Zitat: ".. das ist doch vollkommen easy.."

Na wenns denn so einfach wäre. Aber vielen Dank vorab für die 
Denkanstöße, dann weiß ich wenigstens schon mal wonach ich googlen muss.

Viele Grüße

von Hans W. (de0-nano)


Lesenswert?

Aufpasser schrieb:
> jonas biensack schrieb:
>> Naja du brauchst wohl einen zurücksetzbaren Zähler, google: asynchron
>> counter vhdl.
>
> asynchron ist böse danach googelt man nicht!
>
> Ernsthaft, einen asynchronen Zähler verwendet man nicht in einem FPGA.

Worum sollte man keinen asynchronen Zähler verwenden? Dein Vorredner 
sieht das doch anders?!?

Viele Grüße

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


Lesenswert?

jonas biensack schrieb:
> Mit ein paar Berechnungen am schreibtisch und der quartz-frequenz kann
> man dann leicht ausrechnen, wie lange so ein Zähler zählen muss bis er
> eine Sekunde verblassen hat.
Ich lasse das den Synthesizer rechnen. Da hängt schließlich ein Quadcore 
hinten dran...

Hans Wurst schrieb:
> Ich habe gehofft, dass das Board so etwas drauf hat.
Du kannst üblicherweise im FPGA Pullups oder Pulldowns konfigurieren.

> Wo muss ich da ansetzen? Wie kann man das Ganze umsetzen?
Alles, was Zeiten sind, wird im FPGA über Zähler realisiert.

> Der FPGA soll also prüfen sobald einer der Sensoren HIGH wird ob dann
> innerhalb einer Sekunde die anderen auch HIGH werden und dann die LED
> zum leuchten bringen, wenn nicht soll der Ausgangspegel des ersten
> Sensor wieder auf LOW gehen.
Wie lang soll die LED leuchten? Was soll passieren, wenn ein der zweite 
Sensor erst nach 1,2s aktiv wird?
> Der ganze Prozess soll erst wieder in Takt gesetzt werden bis einer der
> Sensoren ein HIGH meldet.
Kannst du dazu mal ein Timingdiagramm oder ein Ablaufdiagramm mit ein 
paar der auftretenden Möglichkeiten zeichnen?

> Worum sollte man keinen asynchronen Zähler verwenden?
Man macht in einem FPGA (zumindest als Anfänger) NICHTS asynchron. 
Niemals! Sondern man verwendet einen Takt mit 50 oder 100MHz und macht 
alles synchron zu diesem. Externe Eingänge werden allesamt erst mal 
einsynchronisiert. Es gibt auch keinen asynchronen Reset, der einfach so 
von einem FPGA-Pin kommt.
Such einfach mal hier im Forum nach "Postulate" und lies die Threads, wo 
ich die aufgestellt habe.

: Bearbeitet durch Moderator
von Duke Scarring (Gast)


Lesenswert?

Hans Wurst schrieb:
> Die LED die
> ich schalten möchte ist allerdings aus und wird erst hell wenn beide
> Schalter auf 1 stehen. So wie gewünscht
Super!

> Warum geht das aber nicht wenn
> ich extern an die entsprechenden PINs jeweils 3,3V anlege?
Hast Du auch die Masse verbunden oder nur die Signalleitung?


Hans Wurst schrieb:
> vielen Dank für die Hinweise. Ich habe ca. 1.3 V an den 'offenen' PINS
> gemessen. Ich werde wohl, so lange kein High Signal geliefert wird die
> PINS mittels Pulldown Widerstand auf Masse legen.

Laut Schaltplan sind die LEDs mittels Vorwiderstand an GND 
angeschlossen.
Die 1.3 V reichen offenbar aus, um sie glimmen zu lassen.

Warum legst Du die Ausgänge an denen die LEDs nicht leuchten sollen 
nicht einfach auf '0':
1
  LED2 <= '0';
2
  LED3 <= '0';
3
  LED4 <= '0';
4
  LED5 <= '0';
5
  LED6 <= '0';
6
  LED7 <= '0';

Duke

von Hans W. (de0-nano)


Lesenswert?

Duke Scarring schrieb:
> Hans Wurst schrieb:
>> Die LED die
>> ich schalten möchte ist allerdings aus und wird erst hell wenn beide
>> Schalter auf 1 stehen. So wie gewünscht
> Super!
>
>> Warum geht das aber nicht wenn
>> ich extern an die entsprechenden PINs jeweils 3,3V anlege?
> Hast Du auch die Masse verbunden oder nur die Signalleitung?

Ich habe da im Moment nur die Signalleitung angeschlossen, sonst nichts!
>
>
> Hans Wurst schrieb:
>> vielen Dank für die Hinweise. Ich habe ca. 1.3 V an den 'offenen' PINS
>> gemessen. Ich werde wohl, so lange kein High Signal geliefert wird die
>> PINS mittels Pulldown Widerstand auf Masse legen.
>
> Laut Schaltplan sind die LEDs mittels Vorwiderstand an GND
> angeschlossen.
> Die 1.3 V reichen offenbar aus, um sie glimmen zu lassen.
>
> Warum legst Du die Ausgänge an denen die LEDs nicht leuchten sollen
> nicht einfach auf '0':
>
1
>   LED2 <= '0';
2
>   LED3 <= '0';
3
>   LED4 <= '0';
4
>   LED5 <= '0';
5
>   LED6 <= '0';
6
>   LED7 <= '0';
7
>


Weil ich bisher nur mit der boolschen Algebra gearbeitet und noch keine 
code getippt habe. Das Wissen muss ich mir erst noch aneignen.

Kann jemand ne schön leicht verdauliche Literatur zum einstiegt in die 
VHDL Programmierung mittels Quartus II empfehlen? Oder eine generelle 
Literatur zum Thema VHDL?


Viele Grüße

von Hans W. (de0-nano)


Lesenswert?

Lothar Miller schrieb:
> jonas biensack schrieb:
>> Mit ein paar Berechnungen am schreibtisch und der quartz-frequenz kann
>> man dann leicht ausrechnen, wie lange so ein Zähler zählen muss bis er
>> eine Sekunde verblassen hat.
> Ich lasse das den Synthesizer rechnen. Da hängt schließlich ein Quadcore
> hinten dran...
>
> Hans Wurst schrieb:
>> Ich habe gehofft, dass das Board so etwas drauf hat.
> Du kannst üblicherweise im FPGA Pullups oder Pulldowns konfigurieren.

Also an dem DE0-Nano und der Software Quartus II ist es mir nicht 
gelungen Pulldown Widerstände an PINS zu belegen. Pullup geht.
>
>> Wo muss ich da ansetzen? Wie kann man das Ganze umsetzen?
> Alles, was Zeiten sind, wird im FPGA über Zähler realisiert.
>
>> Der FPGA soll also prüfen sobald einer der Sensoren HIGH wird ob dann
>> innerhalb einer Sekunde die anderen auch HIGH werden und dann die LED
>> zum leuchten bringen, wenn nicht soll der Ausgangspegel des ersten
>> Sensor wieder auf LOW gehen.
> Wie lang soll die LED leuchten? Was soll passieren, wenn ein der zweite
> Sensor erst nach 1,2s aktiv wird?

Die LED soll so lange leuchtet bis alle Sensoren für die dauer von einer 
Sekunde wieder LOW sind.


>> Der ganze Prozess soll erst wieder in Takt gesetzt werden bis einer der
>> Sensoren ein HIGH meldet.
> Kannst du dazu mal ein Timingdiagramm oder ein Ablaufdiagramm mit ein
> paar der auftretenden Möglichkeiten zeichnen?

Das kann ich gern machen, allerdings bedarf es da ein wenig 
Gehirnschmalz was ich da reinstecken müsste da komm ich erst am WE zu. 
Reich ich aber gern nach.
>
>> Worum sollte man keinen asynchronen Zähler verwenden?
> Man macht in einem FPGA (zumindest als Anfänger) NICHTS asynchron.
> Niemals! Sondern man verwendet einen Takt mit 50 oder 100MHz und macht
> alles synchron zu diesem. Externe Eingänge werden allesamt erst mal
> einsynchronisiert. Es gibt auch keinen asynchronen Reset, der einfach so
> von einem FPGA-Pin kommt.


> Such einfach mal hier im Forum nach "Postulate" und lies die Threads, wo
> ich die aufgestellt habe.

Werd ich machen.

Danke für die Tipps

Viele Grüße

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


Lesenswert?

Hans Wurst schrieb:
>>> Warum geht das aber nicht wenn
>>> ich extern an die entsprechenden PINs jeweils 3,3V anlege?
>> Hast Du auch die Masse verbunden oder nur die Signalleitung?
> Ich habe da im Moment nur die Signalleitung angeschlossen, sonst nichts!
Wie nochmal?
3,3V OHNE Masse sind irgendwas! Halte mal NUR die Plus-Leitung deines 
Messgeräts an die 3,3V. Was misst du? Und was misst du, wenn du auch die 
MASSE-Leitung mit dazunimmst?

von Hans W. (de0-nano)


Lesenswert?

Lothar Miller schrieb:
> Hans Wurst schrieb:
>>>> Warum geht das aber nicht wenn
>>>> ich extern an die entsprechenden PINs jeweils 3,3V anlege?
>>> Hast Du auch die Masse verbunden oder nur die Signalleitung?
>> Ich habe da im Moment nur die Signalleitung angeschlossen, sonst nichts!
> Wie nochmal?
> 3,3V OHNE Masse sind irgendwas! Halte mal NUR die Plus-Leitung deines
> Messgeräts an die 3,3V. Was misst du? Und was misst du, wenn du auch die
> MASSE-Leitung mit dazunimmst?

Hallo zusammen,

ich habe nun die Schaltung ein wenig verändert. Diesmal habe die die 
GPIO Eingänge 024 und 026 als Eingang definiert und diese mit einem UND 
Baustein verknüpft. Der Ausgang vom UND geht auf alle 8 Dioden.

Jetzt dachte ich habe ich die PINs 24 und 26 vom 40er Headder über einen 
pulldown widerstand an Masse angeschlossen. Dies Masse ist die vom 
Board.

Nun wollte ich mit der Spannung vom PIN 30 an die beiden Widerstände 
gehen und quasi ein Signal simulieren.

Nun zum Problem. Gebe ich die 3,3V Leitung auf den Widerstand an der 
Seite wo Masse ist resetet sich das Board, geh ich auf die andere Seite 
passiert nichts wenn ich beide Widerstände mit 3,3V vom PIN 29 verbinde.

Alle 8 Dioden bleiben dunkel.


Das muss doch aber gehen.

von Hans W. (de0-nano)


Lesenswert?

Hans Wurst schrieb:
> Lothar Miller schrieb:
>> Hans Wurst schrieb:
>>>>> Warum geht das aber nicht wenn
>>>>> ich extern an die entsprechenden PINs jeweils 3,3V anlege?
>>>> Hast Du auch die Masse verbunden oder nur die Signalleitung?
>>> Ich habe da im Moment nur die Signalleitung angeschlossen, sonst nichts!
>> Wie nochmal?
>> 3,3V OHNE Masse sind irgendwas! Halte mal NUR die Plus-Leitung deines
>> Messgeräts an die 3,3V. Was misst du? Und was misst du, wenn du auch die
>> MASSE-Leitung mit dazunimmst?
>
> Hallo zusammen,
>
> ich habe nun die Schaltung ein wenig verändert. Diesmal habe die die
> GPIO Eingänge 024 und 026 als Eingang definiert und diese mit einem UND
> Baustein verknüpft. Der Ausgang vom UND geht auf alle 8 Dioden.
>
> Jetzt dachte ich habe ich die PINs 24 und 26 vom 40er Headder über einen
> pulldown widerstand an Masse angeschlossen. Dies Masse ist die vom
> Board.
>
> Nun wollte ich mit der Spannung vom PIN 30 an die beiden Widerstände
> gehen und quasi ein Signal simulieren.
>
> Nun zum Problem. Gebe ich die 3,3V Leitung auf den Widerstand an der
> Seite wo Masse ist resetet sich das Board, geh ich auf die andere Seite
> passiert nichts wenn ich beide Widerstände mit 3,3V vom PIN 29 verbinde.
>
> Alle 8 Dioden bleiben dunkel.
>
>
> Das muss doch aber gehen.

Nachtrag:

Nun funktioniert das oben beschriebene, ich habe leider 
fälschlicherweise die Dioden mit einem Bus Kabel anstatt einem normalen 
in quartus II verbunden.

Jetzt geht das schon mal, vielen dank an euch alle.

Schönen Tag noch und sicherlich bis bald

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


Lesenswert?

Hans Wurst schrieb:
> Gebe ich die 3,3V Leitung auf den Widerstand an der Seite wo Masse ist
> resetet sich das Board
Tja, das ist nach einem Kurzschluss einfach so. Nachvollziehbar...

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.