Hallo alle,
mein Name ist Wolfgang und ich wollte in meiner Freizeit an einem
Privaten Projekt Arbeiten.
Ich habe mir in meinem Garten eine kleine Windmühle aufgestellt, von der
würde ich gerne die Geschwindigkeit messen.
Ich habe mir schon einen Sensor geholt und denn an meinem FPGA
angeschlossen.
Ich bin schon so weit gekommen, das er mir, wenn der Sensor denn
Magneten entdeckt, mir auf den 7-Seg Display eine 1 anzeigt.
Nun komme ich nicht weiter, ich weiss das ein Aduiono oder andere Boards
einfacher wären, aber ich möchte meine Kenntnisse in VHDL/FPGA
verbessern.
Hat jemand schon mal ein ähnliches Projekt gemacht oder hätte jemand
Quellen für mich?
Schreib dir noch einen Zaehler fuer deinen Sensor und
eine Uhr mit 7 Segmentanzeige.
Dann brauchst du nur noch die Differenz des Zaehlers
zwischen den Sekunden zu bilden, mit 60 zu multiplizieren
und hast "Rotations per Minute"!
Wolfgang schrieb:> von der würde ich gerne die Geschwindigkeit messen.
In welcher Einheit?
Flügelspitzengeschwindigkeit in m/s?
Oder einfach nur U/min?
> Ich bin schon so weit gekommen, das er mir, wenn der Sensor denn> Magneten entdeckt, mir auf den 7-Seg Display eine 1 anzeigt.
Dann solltest du dich noch zum Thema "Eintakten" bzw.
"Einsynchronisieren" schlau machen, denn sonst wird dein Messwert dann
und wann "spinnen".
Cartman schrieb:> Dann brauchst du nur noch die Differenz des Zaehlers> zwischen den Sekunden zu bilden
Das ist natürlich nur sinnvoll, wenn innerhalb 1s genug Impulse
anfallen.
> mit 60 zu multiplizieren und hast "Rotations per Minute"!
Einfacher wäre es, pro Impuls 60 auf einen Zähler draufzuaddieren.
Aber weil ein FPGA verglichen mit der Aufgabe dermaßen schnell ist,
würde ich die Zeit zwischen 2 Impulsen ermitteln (also us/U), dann den
Kehrwert bilden und mit 60000000 multiplizieren und hätte dann U/min.
Diese Rechungen könnte man in einer Tabelle abbilden und mit
Interpolation die Zwischenwerte ermitteln. Nette Fingerübung zum selber
Lernen.
> den Kehrwert bilden
ist fuer ein FPGA immer Schwerstarbeit.
Und nicht unbedingt Anfaengertauglich.
Damit verkomplizierst du ihm den Einstieg voellig unnoetig.
> genug Impulse anfallen
Er kann ja Anzahl der Hallsensoren ja vergroessern :-).
Oder ein paar Ausloesemagnete dazutun.
Ein "genauen" Wert wie 55.5 rpm ist sowieso nur bedingt
aussagekraeftig. Wind ist keine Konstante.
Nicht mal innerhalb einer Umdrehung.
Cartman schrieb:> den Kehrwert bilden ist fuer ein FPGA immer Schwerstarbeit.
Die Anzeige muss ja nicht 1 Mio mal pro Sekunde aktualisiert werden.
> den Kehrwert bilden ist fuer ein FPGA immer Schwerstarbeit.
Deshalb hatte ich ja vorgeschlagen, dass man diesen Kehrwert samt
Skalierung mit dem Ansatz über eine per Excel berechnete Tabelle auch
hinbekommt. Die weiters vorgeschlagene lineare Interpolation ist dabei
ja vorerst mal optional.
> Und nicht unbedingt Anfaengertauglich.
Die Schwachpunkte der Anfängerlösung wurden ja schon angesprochen.
>> genug Impulse anfallen> Er kann ja Anzahl der Hallsensoren ja vergroessern :-).> Oder ein paar Ausloesemagnete dazutun.
Auf jeden Fall sollte auch eine Mittelwertbildung rein, die länger als
nur über 1 Sekunde geht, damit man auch bei 10 U/min noch was Sinnvolles
sieht. Wenn man es schlau macht, läuft der Mittelwert über 1 Minute im
"Hintergrund", während im Vordergrund die Anzeige im Sekundentakt
aktualisiert wird. Auch das ist eine nette Aufgabe.
> Damit verkomplizierst du ihm den Einstieg voellig unnoetig.
Ich zeige nur auf, wie es weitergehen könnte und wie ich es machen
würde. Dabei muss korrekterweise durchaus bedacht werden, dass ich
deutlich mehr Erfahrung habe. Aber auch ich war mal in der Situation des
TO und von nix kommt nix:
https://www.gutefrage.net/frage/genaue-bedeutung-vom-spruch--von-nix-kommt-nix-Wolfgang schrieb:> Ich bin schon so weit gekommen, das er mir, wenn der Sensor denn> Magneten entdeckt, mir auf den 7-Seg Display eine 1 anzeigt.
Da würde ich erst mal gar nichts am FPGA machen, sondern das Allermeiste
im Simulator. Geht viel schneller und ist reproduzierbar...
Hallo Danke für die Ganzen Antworten, ich habe einen Counter
geschrieben, nun bekomme ich auf allen Segmenten einen Error angezeigt
obwohl ich nur eins anspreche, dass macht für mich keinen Sinn.
Ohne deinen Code zu kennen können wir dir nicht helfen.
Wolfgang schrieb:> Error
Etwas mehr Details wären auch sinnvoll.
Noch besser wäre dazu der Name der Hardware oder der Schaltplan.
> auf allen Segmenten einen Error angezeigt
Ich weiss gar nicht, ob ich da noch an mehr Details ueberhaupt
interessiert bin.
Bis zu
> Ich will es in km/h abbilden.
wird es wohl noch eine Weile brauchen.
Wolfgang schrieb:> mein Name ist Wolfgang und ich wollte in meiner Freizeit an einem> Privaten Projekt Arbeiten.
die scheinen sehr wichtig zu sein, wenn du sie groß schreibst
> Ich habe mir in meinem Garten eine kleine Windmühle aufgestellt, von der> würde ich gerne die Geschwindigkeit messen.
du würdest gerne die Drehzahl messen
> Ich habe mir schon einen Sensor geholt und denn an meinem FPGA> angeschlossen.
du hast "den" angeschlossen, denn "denn" wäre das falsche Wort
> Ich bin schon so weit gekommen, das er mir, wenn der Sensor denn> Magneten entdeckt, mir auf den 7-Seg Display eine 1 anzeigt.
s.o.
Was soll das werden? Wie man eine Drehzahl (= Impulse je Zeit) berechnet
ist klar?
> Nun komme ich nicht weiter, ich weiss das ein Aduiono oder andere Boards> einfacher wären,
das glaube ich nicht
> Quellen für mich?
Die Quellen bringen dir gar nichts, weil die meistens nicht dokumentiert
sind und von ähnlic begabten Menschen wie dir verfasst wurden.
Du musst zunächst eine Schaltung hinmalen, die deine Funktion leistet.
mein Problem ist, dass es in ModelSim alles Funktioniert, wie es
Funktionieren soll.
Sobald ich es auf das Board ziehe, bekomme ich einen Error, und ich
weiss nicht wie ich das Debuggen kann.
Da ich in der Simulation alles Funktioniert.
Und ohne Details können wir dir nicht helfen. Auch nicht wenn du weiter
detailfreie Beiträge schreibst. Also was wäre sinnvoll?
Name der beteiligten Boards
Bilder vom Aufbau
Schaltpläne
Code
Alles was du noch bieten kannst damit wir dir helfen können.
Wolfgang schrieb:> einen Error
Auch hier wäre es sinnvoll gewesen zu schreiben was für ein Fehler genau
kommt mit vollständiger Fehlermeldung. Gerne auch Screenshot.
Wolfgang schrieb:> mein Problem ist, dass es in ModelSim alles Funktioniert, wie es> Funktionieren soll.
In der Simulation blikt sogar eine LED, wenn wenn ich schreibe
1
LED<=notLEDafter500ms;
Auf realer Hardware funktioniert das nicht.
> Sobald ich es
Was denn? Zeig mal deinen Code und sag, was der machen soll.
> auf das Board ziehe
Auf welches? Mit welcher Toolchain?
> bekomme ich einen Error
Und der ist geheim?
Wolfgang schrieb:> Hat jemand schon mal ein ähnliches Projekt gemacht
Du solltest mal die Fragen zu deiner Aufgabe lesen und beantworten. Denn
du hast ein Problem und mit den grausam schlechten Informationen, die du
dazu gibst kann dir keiner helfen.
Hallo danke erstmal,
Quartus 2
FPGA: DE10-Lite
Ich will, wenn der Sensor was entdeckt, das auf der 7-Seg. anzeige
hochgezählt wird (x++).
ich habe hier denn ganzen code gepostet.
1
libraryieee;
2
useieee.std_logic_1164.all;
3
useieee.numeric_std.all;
4
entitycountis
5
port
6
(
7
clk:instd_logic;
8
reset:instd_logic;
9
S_1:std_logic;--sensor signal
10
q:outintegerrange0to2147483647;--32bit -- 16 bit 65535
Wolfgang schrieb:> elsif (S_1 = '1') thenWie ich gleich zu Anfang schrieb:>>>> Dann solltest du dich noch zum Thema "Eintakten" bzw.>>>> "Einsynchronisieren" schlau machen, denn sonst wird dein Messwert dann>>>> und wann "spinnen".> variable cnt : integer range 0 to 2147483647;
Warum verwendest du da völlig unnötigerweise eine Variable statt eines
Signals?
Siehe Beitrag "Variable vs Signal"> Ich will, wenn der Sensor was entdeckt, das auf der 7-Seg. anzeige> hochgezählt wird (x++).
Und das funktioniert in der Testbench?
Was passiert damit auf der Hardware? Welche Fehlermeldung bekommst du
von welchem Teil welcher Toolchain?
> ich habe hier denn ganzen code gepostet.
Häng das doch besser als *.vhdl Dateien an, wie über jedem
Texteingabefeld hier steht:
1
Antwort schreiben
2
Wichtige Regeln - erst lesen, dann posten!
3
* Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
In dem "ganzen Code" fehlt die Entity Seg7_Comp, das sollte vermutlich
das Toplevel-Modul sein.
Was hat das gepostete Bild mit der Aufgabe zu tun? Zeigt das Bild die
Module, die du implementieren und verdrahten sollst?
Lothar M. schrieb:> unnötigerweise ein Signal?
Eine Variable. Und genau das ist auch das Problem. cnt ist 0 und wird in
dem Takt maximal 1. Also ist auch q nur ab und zu mal für einen Takt
lang 1.
-gb- schrieb:> Lothar M. schrieb:>> unnötigerweise ein Signal?> Eine Variable.
Aaargh... ich habs korrigiert.
Für Anfänger gilt: man benutzt keine Variable, wenn man nicht unbedingt
eine braucht.
-gb- schrieb:> Eine Variable. Und genau das ist auch das Problem. cnt ist 0 und wird in> dem Takt maximal 1. Also ist auch q nur ab und zu mal für einen Takt> lang 1.
cnt ist eine speichernde Variable (das ist fast schon ein
Kündigungsgrund!) und zählt mangels Flankenerkennung bei Betätigung von
S1 mit der Taktgeschwindigkeit hoch.
Also mal angenommen, der clk ist 50MHz und der Sensor belegt den S1 für
1 ms, dann hat der cnt schon auf 50000 hochgezählt...
Darüber hinaus ist auch die Sensitivliste des Prozesses überdefiniert,
denn Wolfgang schrieb:> process (S_1, clk,reset)
Der Prozess ist vollkommen synchron zum clk und deshalb ausschließlich
auf clk sensitv. Aus diesem Grund gehört auch nur clk in die Liste.
Wolfgang schrieb:
> Quartus 2> FPGA: DE10-Lite> Ich will, wenn der Sensor was entdeckt, das auf der 7-Seg. anzeige> hochgezählt wird (x++).> ich habe hier denn ganzen code gepostet.
Und die restlichen Details? Inhalt der Fehlermeldung? Beim Code fehlt
das Toplevel "Seg7_Comp".
Edith hat gerade
S_1 <= '1' AFTER 0ps,'1' AFTER 10ps,'0' AFTER 20ps,'1' AFTER 30ps,'0'
AFTER 40ps, '1' AFTER 50ps,'0' AFTER 60ps,'1' AFTER 70ps;
in der Testbench gefunden. Das sind eben echt kleine Zeiten. In der
Simulation geht das, aber das was dann auf der Hardware gemacht wird
wird sich von der Simulation deutlich unterscheiden. Daher: Simuliere
immer möglichst so wie du es auch auf der Hardware erwarten würdest.
Miss mit dem Oszi wie lange S_1 high und low ist und dann beschreibe das
so in deiner Testbench.
Edith hat hier
S_1 : std_logic; --sensor signal
noch ein fehlendes in oder out gefunden.
Lothar M. schrieb:
> cnt ist eine speichernde Variable
Jap tatsächlich.
Jetzt mit Bildchen sim.png man sieht schön, dass ein zweiter Puls
an S_1 nichts mehr an der Anzeige ändert.