hey, hier Robert. ich möchte eine motorsteuerung für ein BLDC in VHDL
schreiben.
Mein problem sind die IF abfragen. Ich bekomme es nicht hin, die integer
richtig miteinander zu vergleichen. kann mir bitte jemand sagen, wie ich
das richtig schreibe?
Robert schrieb:
Das
> Array type selected signal assignment expression must be of a locally> static subtype.
steht für den (ha, hb, hc) Sensorzustand. Das Argument eines
Conditional Assignments muß in VHDL eben "locally static" (d.h. eben
nicht "im Flug zusammengebastelt") sein. Pack' das in eine temporäre
Variable, dann ist der Fehler weg.
> Illegal concurrent statement.
Hier wird dasselbe Statement angemeckert. Vor VHDL 2008 ist das
Conditional Assignment nur als sequentielles Statement erlaubt (muß
also in einem Prozeß stehen). Ab VHDL 2008 darfst Du es überall
hinschreiben.
Wenn dein Synthesetool VHDL 2008 nicht beherrscht, bleibt nur ändern,
ansonsten halt den entsprechenden Schalter setzen (ModelSim kann's
jedenfalls).
Hier sind zwei if Auslegen vermixt:
1.) das if sollte in einem Prozess stehen, wenn es signale ändert.
oder
2.)Bei einem if-generate werden kann ein port map gemacht werden, es wid
also zur Synthese Zeit Hardware erzugt oder nicht. Dynamisch geht das
nicht
die änderungen an den Ha, hb, hc Signalen habe ich nicht verstanden.
bitte um eine neue erklärung.
ich habe die if abfragen in ein Prozess gelegt. bekomme jetzt andere
Fehler. sollte ich es anders machen?
Robert schrieb:> with bit_vector'(ha ,hb ,hc) select
Das ist ein Conditional assignment und ist so gar nicht und - so:
1
signalh:bit_vector(2downto0);
2
.
3
.
4
.
5
h<=ha&hb&hc;
6
7
withhselect
erst ab VHDL 2008 außerhalb eines Prozesses erlaubbt (vorher nur
innerhalb).
Das hier:
1
elsif(blockkomultation(Sensorzustand)(0)=2)then
2
I_PWMUEn:entitywork.bldcPWM
3
portmap(
4
clk=>clock,
5
startImp=>'0',
6
PwmReg=>"0011000100",--200
7
MotorPwm=>wo_MotorUEn
8
);--Zeile 80
9
endif;
ist irgendwie völlig daneben. Du willst die PWM(?)-Komponente nur dann
instantiieren, wenn der Sensorzustand einen bestimmten Wert hat? Und
falls nicht, soll die entsprechende Hardware "weggezaubert" werden?
Wie stellst Du dir das vor?
Seit wann geht sowas?
> Possible infinite loop: Process contains no WAIT statement.
Ein Prozess braucht entweder eine Sensitivliste oder ein wait().
Mein Tipp: du solltest nicht nur "wild drauf los programmieren", sondern
dich mal mit VHDL beschäftigen. Nimm das Buch "VHDL-Synthese" oder ein
gleichwertiges, das sich mit Umsetzung von VHDL auf reale Hardware
befasst.
Ein Tipp dazu: es gibt unterschiedliche Syntaxelemente für Abfragen
innerhalb und ausserhalb eines Prozesses. Die nennen sich "sequential
statements" und "concurrent statements"
Robert schrieb:> in dieser fassung läuft es auch so wie ich es wollte
... das glaub' ich allerdings erst mal nicht.
Es sei denn, Du wolltest, daß es nicht läuft ;).
Ein Prozeß ohne wait-Statement und ohne Sensitivliste macht seltsame
Dinge ...
Markus F. schrieb:> Ein Prozeß ohne wait-Statement und ohne Sensitivliste macht seltsame> Dinge ...
Nur in der Simulation. Das sagt der Synthesizer aber klar und deutlich.
Aber eines ist ganz offensichtlich: so wie es derzeit darstellst das
gerade so irgendwie hingebastelt.
Robert schrieb:> in dieser fassung läuft es auch so wie ich es wollte.
Heute noch. Zufällig. Zum Glück. Usw.
Simulier das seltsame Konstrukt mal. Der Simulator ist der Debugger
eines HDL Designs.
Lothar M. schrieb:> so wie es derzeit darstellst das> gerade so irgendwie hingebastelt.
um das irgendwie genauer zu beschreiben: so gut ich kann.
ich habe nur sehr wenig erfahrung in vhdl und versuche durch diese
anwendung mehr zu erfahren.
Robert schrieb:> motorbestromung: process (ha,hb, hc)
Die Sensitivliste ist falsch.
Dort müssen die Signale rein, die in der Simulation eine Neuberechnung
des Prozesses nötig machen. Also die, die rechts in Zuweisungen stehen,
und die, die in Abfragen verwendet werden.
Oder kurz: eine falsche Sensitivliste hat eine falsche Simulation als
Ergebnis.
robert schrieb:> ich habe nur sehr wenig erfahrung in vhdl
Das war bei jedem mal so.
> und versuche durch diese> anwendung mehr zu erfahren.
Die üblichen einfachen ersten Schritte (blinkende LED, Laufschrift,
serielle Schnitte...) samt Simulation hast du schon erfolgreich gemacht?
> Fehlermeldung
Was passiert denn in der Zeile 79?
Und was ist der Initialisierungswert eines uneingeschränkten Integers,
wenn du nicht extra einen angibst?
Das hier ist übrigens ein potentieller Kündigungsgrund:
> Sensorzustand: INOUT integer
Wozu soll hier ein bidirektionaler Port nötig sein?
Robert schrieb:> die wait Anweisung konnte ich nicht in den code intrigieren. dabei hat> der Compiler gemeckert.
Du solltest auch nicht irgendwas in deinen Code hineinbasteln, was dir
irgendwer gesagt hat. Sondern du solltest erst mal verstehen Was dann
passiert. Oder es wenigstens versuchen. Denn wie gesagt: die übliche
Try-and-Error Softwareentwicklung kannst du hier nicht anwenden. Du
musst deine Hardware kennen. Dann kannst du sie beschreiben.
Oder sag mal einem eingeborenen subtropischen Dschungelbewohner er solle
einen Schneemann beschreiben. Was kommt dabei wohl raus?
Lothar M. schrieb:>> Fehlermeldung> Was passiert denn in der Zeile 79?Robert schrieb:> if (blockkomultation(Sensorzustand)(0) = 0) then --zeile 79> wo_MotorUEn <= '0';Lothar M. schrieb:> Die üblichen einfachen ersten Schritte (blinkende LED, Laufschrift,> serielle Schnitte...) samt Simulation hast du schon erfolgreich gemacht?
ja. ist ein jahr her und ich merke, das ich da schlecht durch die
aufgaben geführt wurde
Lothar M. schrieb:> Dort müssen die Signale rein, die in der Simulation eine Neuberechnung> des Prozesses nötig machen.
ha, hb, und hc stehen wür die hallsensoren. jedes mal wen es dort eine
änderung gibt, dann sollt der prozess motorbestromung abgearbeitet
werden. ich denke das es besser ist dort die Variable: "Sensorzustand"
zu benutzen, den die ist das eigendliche, worauf es hier ankommt.
zum Projekt: ich habe die realiesierung schon mit ein arduino
gemeistert. also ist mir das, was ich eigendlich machen möchte klar.
dieser ist mir aber zu langsam. ich bestrom den Motor mit
sinuskomultation. also es ist mir nicht zu langsam, es ist zu langsam.
ich kann den motor nur auf kleinen drehzahlen betreiben. dies aber nur
nebennei.
robert schrieb:> if (blockkomultation(Sensorzustand)(0) = 0)
Der Sensorzustand ist logischerweise ein nicht initialisierte Integer,
der mit dem "linkesten" Wert initialisiert wird (siehe die Definition
eines integers in VHDL:
http://www.vhdl.renerta.com/mobile/source/vhd00039.htm und
https://wiki.kip.uni-heidelberg.de/KIPwiki/images/d/d7/VHDL_Language_Reference_Guide_(help_file).pdf).
Und dieser linke Wert ist -2147483648, was natürlich ausserhalb des
erlaubten Bereichs 0..12 liegt.
> ich denke das es besser ist dort die Variable: "Sensorzustand" zu> benutzen, den die ist das eigendliche, worauf es hier ankommt.
Da brauchst du gar nichts zu denken (du hast da keinerlei
Wahlmöglichkeit). Du mußt letztlich nur die Warnungen/Meldungen des
Compilers lesen.
In diese Sensitivliste muss natürlich auch PWM. Siehe meinen Post
zum Thema "rechts von Zuweisungen" weiter oben...
> schon mit ein arduino gemeistert.> also ist mir das, was ich eigendlich machen möchte klar.
Und man sieht, dass du es genau so "programmieren" willst, wie du es
schon hattest...
Hey, ich bin vom Festival zurück mit neuen Problemen. Ich bitte um
Gedult und verständnis dafür, dass ich es so gut wie möglich, aber eben
noch nciht gut schreibe.
Lothar M. schrieb:> Du mußt letztlich nur die Warnungen/Meldungen des> Compilers lesen.
ich lese sie auch aufmerksam. doch das interprätieren, der nachichten
erweißt sich als schwirig.
was ich machen will ist das Signal Sensorzustand bei zwei verschiedenen
Ereignissen zu verändern.
Ein mal, so wie schon geschieben, bei veränderung der Hallsensoren und
zum andern 5 Decodertackte nach einer veränderung des Sensorzustandes.
Hat jemand eine idee wie ich das günstig schreiben kann?
Ozelot S. schrieb:> Mit == vergleicht man etwas mit = setzt man etwas.
Aber NICHT bei VHDL!
Außerdem wurde das hier schon mal falsch verzapft!
robert schrieb:> ** Error: C:/altera/14.1/bldcSorce.vhd(70): Illegal sequential> statement.> -- Loarding entity bldcPWM
"with ... select" ist ein 'concurrent statement' und damit erst ab
VHDL-2008 innerhalb von Prozessen zugelassen. Nimm dafür ein 'sequential
statement' wie "if" oder "case".
robert schrieb:> ** Error: C:/altera/14.1/bldcSorce.vhd(70): Illegal sequential statement.
Du verwendest in einem Prozess eine Zuweisung, die nur
nebenläufig/concurrent ausserhalb eines Prozesses verwendet werden darf.
Fazit: mach den Prozess dort weg, dann ist dieser Fehler weg.
robert schrieb:> motorbestromung: process (clock)
Allerdings taucht der clock im ganzen Prozess nicht auf. Fazit: die
Simulation ist falsch. Sie passt nicht zur erzeugten Hardware. Das
taucht aber garantiert in den Meldungen auf, und das hatte ich schon vor
einer Woche mal geschrieben...
> type Motorzustaende is array (0 to 5) of integer;
Wozu für 4 unterschiedliche Werte (=2 Bit) ein uneingeschränkter Integer
mit 32 Bit?
robert schrieb:> das Signal Sensorzustand bei zwei verschiedenen Ereignissen zu> verändern. Ein mal, so wie schon geschieben, bei veränderung der> Hallsensoren und zum andern 5 Decodertackte nach einer veränderung des> Sensorzustandes.
Du brauchst einen Zustandsautomaten und/oder einen Zähler.
> Hat jemand eine idee wie ich das günstig schreiben kann?
Zeichne eine Hardware, die das machen würde, auf ein Blatt Papier und
beschreibe diese Hardware mit VHDL.