Hallo,
hab herausgefunden, dass man über Simulink simulationen von VHDL
modellen durchführen kann, über Matlab wird der Simulator von Modelsim
gestartet.
Hab eine richtig gute Seite gefunden wie man das macht, aber leider
funktioniert es nicht bei mir, vielleicht weiss es ja jemand wie man das
macht, wäre sehr dankbar wenn mir jemand dabei helfen könnte.Danke.
http://www.kxcad.net/cae_MATLAB/toolbox/modelsim/bq9ag2t-1.html
Also, wenn ich den Befehl vsim im command window von Matlab eingebe,
kommt dann diese Fehlermeldung:
1
>> vsim
2
??? Error using ==> hdlsim at 306
3
Could not determine ModelSim version from: Der Befehl "vsim" ist entweder
4
falsch geschrieben oder
5
konnte nicht gefunden werden.
6
7
8
Error in ==> vsim at 89
9
hdlsim(pvpairs{:});
woran liegt das, dass diese Meldung erscheint, kann sein, der Matlab
path ist nicht richtig angegeben, oder woran kann das liegen.Danke.
MfG
Hallo,
vsim ist auch ein Befehl in Matlab, was den Simulator von Modelsim
verlinkt, ich habe herausgefunden dass ich den EDA Simulator Link für
Matlab benötige, um Simulink mit Matlab zu verlinken.
Danke.
Gruß
Also eigentlich ist es dochso, daß man im Xilnx Blockset den ModelSIM
oder den ISIM verwendet, um eingebettetes VHDL zu simulieren. Dazu gibt
es die black box, die noch einen wrapper braucht, damit MATLAB das VHDL
verstehen kann.
Bei der MATLAB/Simulink Simulation ruft dann Simulink den ISIM oder den
externen ModelSIM auf und holt sich die Daten automatisch ab.
Dargestellt werden sie in MATLAB Scopes.
Dann gibt es noch die Möglichkeit, den SysGen anzuweisen, VHDL zu
erzeugen und Testbenches zu machen. Diese kann man in ModelSIM laufen
lassen. Das gilt sowohl für das reine Syntheseprodukt, als auch
Post-Translate und nach dem MAP/PAR.
also das prinzip kenn ich so. man modelliert in matlab/simulink eine
funktionalität und/oder testumgebung und will dann dort bereits fertigen
VHDL-code mit einbinden und testen. um jetzt nicht das ganze Modell aus
matlab/simulink in eine testbench quetschen zu müssen, kann man den
HDL-code über einen cosimulations-block ins simulink-modell einbinden.
damit der hdl-code jedoch in matlab/simulink eingebunden und simuliert
werden kann, brauch brauch man zum einen die simulinkerweiterung EDA
Link und zum anderen einen HDL simulator wie z.B. Modelsim.
Damit beide Programme, also matlab und der simulator, hier mal Modelsim
angenommen, zusammen arbeiten können, muss zuerst der gewünschte
HDL-code in modelsim eingeladen und compiliert werden. anschließend muss
modelsim in den sogenannten "foreign"-modus gebracht werden, um quasi
von matlab ferngesteuert werden zu können. dies geschieht z.B. mit
folgenden befehl:
vsim -foreign "simlinkserver
C:/Programme/Matlab2009a/toolbox/modelsim/windows32/liblfmhdls_tmwvs.dll
" work.core
dieser Befehl ist in Modelsim auszuführen, nicht in matlab. bei einer
anderen Matlab-version kann sich der pfad unterscheiden. einfach die
richtige dll suchen und dann diesen pfad benutzen.
ist Modelsim dann im foreign-modus muss man den cosimulations-block in
simulink konfigurieren. dabei muss man je nachdem wo die programm laufen
die kommunikation definieren. laufen beide programme auf
unterschiedlichen rechner macht mans über sockets, laufen sie auf dem
gleichen rechner über shared memory.
wenn im cosimualtionsblock das automatische einlesen der
HDL-Schnittstelle funktioniert, dann funtioniert auch die kommunikation.
der rest ist dann nur noch einstellsache was man wie sehen will und
schon kann man den hdl-code in matlab simulink mitsimulieren.
Hallo,
Vielen dank für deine ausführliche Erklärung.
Ich habe nun alles so gemacht wie du es gesagt hast, aber leider klappt
es immer noch nicht bei mir. Kannst du mir sagen was man genau bei
simulink einstellen muss um shared memory benutzen zu können. Matlab und
Modelsim beide sind auf dem selben Laufwerk drauf, ich habe modelsim in
den foreign modus versetzt wie du gesagt hast, dann kommt sowas, ist as
in ordnung:
dein befehl in modelsim ist falsch. du musst "/" verwenden, nicht wie
normal üblich bei Pfaden "\", daher wird der befehl falsch interpretiert
und du bekommst die offensichtlichen fehlermeldungen.
Hallo,
Danke nochmal, hat aber leider nicht geklappt. Ich hätt da mal ne frage,
kannst du mir mal sagen, welche versionen du von Modelsim benutzt, hab
gelesen, dass nicht alle Versionen von Modelsim mit dem EDA Simaulator
Link kompatibel sind, hatte vorher Modelsim altera gehabt, dann habe ich
gelesen, dass dieser version nicht kompatibel ist, dann habe ich mir
Modelsim PE student version runtergeladen, hab eben vor kurzem im
internet gelesen, dass diese Version auch nicht klappt, Danke.
Gruß
A.
Hallo,
ich sehe, dass du viel Ahnung mit den Programmen Modelsim und Simulink
hast, wäre es in Ordnung wenn wir auch per mail kontakt haben könnten,
wäre super, könnte dich dann sofort erreichen.Danke.
Hallo,
nun habe ich mich meiner eigentliche Aufgabe gewidmet, ich habe nämlich
einen digitalen PID-Regler in VHDL programmiert nun möchte ich seine
Funktionsweise testen,
meine entity sieht folgendermassen aus:
Nutzt Du die Toolbox? Da muss man doch so einen *.m-config-wrapper
schreiben. In diesem sind die Breiten eingetragen. Muss man per Hand
ändern, wenn man das VHDL geändert hat.
Du musst in deinem Modell in Simulink, mit dem du deinen Regler testen
willst, auch die richtigen Datenbreiten an den In- und Outport
definieren.
Dort definierst du, dass ein Signale z.B. Ufix14 ist, was dann die
richtige Datenbreite als Eingangssignal für den Regler wäre.
hallo,
Danke für eure schnelle Antworten.
Du meinst ich soll in Source Block parameters des Inports, in Attributs
einstellen, da gibt es den fixdt(1,14,0), idt das der richtige Danke.
Gruß
ufix14 steht direkt in der auflistung nicht drin. du musst schon über
die fixdt(...) einstellung gehen. die hattest du ja auch bereits
gefunden, jedoch hattest du dort die parameter "fixdt(1,14,0)", was
bedeutet, dass du ein Sfix14 Datentyp erzeugst. dieser is halt
vorzeichenbehaftet. daher hatte ich nur die modifikation zu
"fixdt(0,14,0)" vorgeschlagen um einen ufix14 daraus zu machen ... also
unsigned.
Hallo,
wenn ich das auswähle kommt trotzdem ein fehler in dem er sagt:
1
'PID_Regler/Constant'requesteduseofdatatype'ufix14'.Useofthisdatatyperequiresafixed-pointlicense,butlicensecheckoutfailed.Tousethismodelwithoutafixed-pointlicense,select"Fixed-Point Tool"under"Fixed-Point"fromthemodel'sToolsmenu.SelecttherootmodelinModelHierarchy.Set"Logging mode"tobe"Force off","Data type override"tobe"Double"and"Data type override applies to"tobe"All numeric types".Thisreplacesmostusesoffixed-pointdatatypeswithfloating-pointdoubles
Ich finde aber nirgends den Fixed point tool, wo ich die ganzen
einstellungen vornehmen kann. Wenn ich lediglich an den signal attributs
des inports gehe gibt es da nur unter Data Type assistant als Model
Fixed Point und das wars auch schon.Danke.
Hallo,
habs rausgefunden, au man das ist in der Menuleiste in Tools und Fixed
point. Alles klar.
Ich hätt da noch ne Frage, mein Regler at ja zwei Eingänge und einen
Ausgang. Ein eingang ist ja der Sollwert (in meinem Fall data_w_i), der
vorgegeben wird und der andere ist ja der Istwert (data_y_i) und der
augang (data_u_o). Ich habe auch eine Testbench zu meinem Regler
geschrieben, worin ich alle alle PID Anteile Festgelegt habe und den
Sollwert vorgebe, soll ich dann die Testbench mit Simulink testen oder
das Hauptprogramm, brauche ich dann Überhaupt noch die Inports und
Outports.Danke.
bei den einstellungen des HDl Cosimulationsblockes habe ich folgendes
eingestellt (siehe Bild).
und die fehlermeldung gibt folgendes aus (siehe Bild.)
Ich kann leider in dem HDL Block nichts verändern. Was mach ich nun.
Vielmals Danke um deine Hilfe.
Hallo Nephilim,
falls du heute da sein solltest, kannst du bitte diesen Fehler mal
anschauen, kriegs einfach nicht raus wie ich ihn beseitige Danke.
Gruß
welche datentyp hast du denn in dem Outport (Out1) eingestellt? wenn
dort "auto" steht, dann versuch ihn mal auch manuell auf "fixdt(0,14,0)"
stellen, damit simulink weiss, das es an dieser Stelle diesen datentyp
anlegen muss.
hallo,
schönen Guten Morgen,
Ich habe schon bereits "fixdt(0,14,0)" eingestellt, sollte ich da
nochwas einstellen, wie siehts aus mit port dimensions oder Variable
size oder signal type, hab mal bei mathworks angefragt, meinten es
könnte daran liegen, dass das Signal data_u_o in meinem VHDL code kein
14 bit wäre, aber ich habe ihn so deklariert:
data_width: integer := 14;
data_u_o : out std_logic_vector(data_width-1 downto 0);
sonst weiß ich nicht weiter.Danke.
versuch dir mal in simulink anzeigen zu lassen, welchen datentyp er
aktuell auf dieser leitung hat, dazu rechte maustaste ins modell (ins
freie, nicht auf einen block), dann auf "format" und dort "Port Data
Type" aktivieren. dann sollten überall die datentypen dran stehen.
vielleicht kommt man so besser dahinter warum dort kein 14 bit datentyp
ist.
hallo,
mir ist was aufgefallen, wenn man in Fixed Point Tool geht und dann in
Simulation Settings auf der rechten Seite, habe ich folgende
Einstellungen:
Siehe Bild
daraufhin kommt die Fehlermeldung die du ja bereits kennst. Wenn ich
aber die daten ändere kommt diese Fehlermeldung:
Siehe Bild.
Liegt es vielleicht daran, dass überall Double steht, weil Data type
override Double ausgewählt ist.Danke.
ja, also dies zeigt natürlich ganz eindeutig wo dein problem liegt. du
hast anscheinend für die "fixed point toolbox" keine lizenz. daher sagt
er dir, dass du das so umstellen sollst, dass er alle fixed point
datentypen mit floating point doubles überschreibt, womit dann aber
deine cosimulation nicht funktioniert.
du solltest dir eine fixed point lizenz besorgen, dann kannst du das
auch verwenden.
man kann die cosimulation soweit betreiben, solange man keine fixedpoint
datentypen verwendet, sondern nur grunddatentypen. dazu gehört aber kein
14bit datentyp, wie in dem PID-Regler von weiter oben gefordert wird.
Versuche mal, den Counter auf FIX16 zu stellen. Das ist der Default und
benötigt offenbar kein FP-Lizenz. Bei mir ist es wenigstens so, daß der
FP-Fehler dann hochkommt, wenn ich etwas anderes nehme, als 16 Bit.
Hallo,
habs auf Ufix16 gestellt, kommt aber dieselbe Fehlermeldung, und die
Daten Typen sehen wie folgt aus. Siehe Bild. ist schon komisch sollte
Ufix16 sein ist aber Uint16 geworden warum das denn nun. Au man.
ufix16 ist das gleiche wie uint16, nur das uint16 der grundatentyp ist.
und sobald simulink kann, wird er die signaltpyen immer versuchen auf
einen seiner grundtypen abzubilden.
zusätzlich zu den änderungen in simulink musst du jetzt aber auch die
port in deinem VHDL-Regler so anpassen, dass die auch 16bit breit sind.
sonst passen die ja wieder nich zusammen.
Hallo,
danke nochmal für deine Antwort, habs jetzt soweit hinbekommen dass
keine Fehlermeldung kommt und Simulink ohne Probleme kompiliert. hab wie
du gesagt hast meine Signale auf 16 bit erweitert, dann hats geklappt,
was ich aber noch fragen wollte ist, sollte ich in dem HDL Cosimulations
Blocks die Testbench mit den vorgegebenen PID Anteilen kompilieren, oder
meinen original code, weil wenn ich den original code nehme, bricht
modelsim mit fehlermeldung ab, da ja keine Werte für die Daten
vorliegen.
Danke.
Hallo,
soweit klappt auch alles wunderbar, nun habe ich ne andere Frage, wie
ich schon erwähnt hatte, dass ich einen PID Regler in VHDL implementiert
hatte, wollt ich ,al wissen, wenn ich mein y (Rückführungsgrösse) an
mein Y anhänge sagt simulink sowas:
warum kann ich denn nicht ohne ein delay block oder memory Block
verwenden?
an mein y wird ja auch der Ausgang des reglers angelegt, amit er wieder
die regeldifferenz bildet und neu einstellt falls nötig.Danke.
wenn du kein delay im modell, oder einen getakteten prozess im vhdl
verwendest, dann würde eine änderung am ausgang eine änderung am eingang
und gleich wieder am ausgang und damit wieder am eingang usw.
verursachen. im realen wäre die datenänderung von der geschwindigkeit
der logikelemente bzw. der LUTs abhängig. in der einfachen simulation
ist diese Zeit jedoch nicht drin, so dass eine solche operation sofort
passiert und somit weiss matlab nicht, wie es damit rechnen kann.
Danke für deine Antwort, ich hätt da noch ein Problem. Da ich ja 16 bit
Wortlänge eingestellt habe, würde ich gerne in Simulink an mein Sollwert
binäre Daten eingeben, ich hatte zwar ein Constant block genutzt, aber
damit funktioniert es nicht gibt es dafür ein anderes Block oder geht es
gar nicht, muss ich daten Dezimal eingeben Danke.
das hat sich geklärt, aber irgendwas stimmt nicht mit meiner Simulink
simu,
bei einem Regler wird ja der Reglerausgang(data_u_o)mit dem Eingang
subtrahiert (data_w_i-data_y_i) nun habe ich ein Unit delay benutzt,
aber mein data_y_i, welches ich zurückführe gibt mir immer ne null aus,
liegt es vielleicht an der unit delay, oder woran kann es noch
liegen.Danke.
was ist denn dein sollwert, den du deinem regler übergibt? und wie sieht
denn dein istwert aus, welcher aus deinem regler rauskommt?
falls die, rein zufällig, gleich sein sollten brauch dein regler ja nix
mehr regeln. ich seh leider deine sollwertgenerierung nicht.
am besten an den ein und ausgängen mal Scopes anklemmen und gucken was
dort bei einer simulation passiert.
Hallo,
also meinem Regler werten Daten in form von Amplitude und Eigenfrequenz
übergeben, die er regeln muss, die daten werden dann ad gewandelt und
dann erst durch den PID regler gejagt, so die Theorie die dahinter
steht, als besipiel nehme ich einfach 14 bit große Zahlen an, könnte
Spannung sein oder auch frequenz, meinem Sollwert habe ich z.B 65000
eingegeben und mein Ausgang liefert dann 22... ind zählt runter wenn ich
immer wieder auf simulieren drücke, will jetzt nicht die 22000
runterzählen, das ist nun mein Istwer, den führe ich zurück und in den
Rückzweig habe ich ja ein unit delay,
hab nun am ausgang ein scope und zum testen nach dem unit delay ein
scope gesetzt und ausgang ist ja in ordnung, aber was nach dem unit
delay kommt ist null, wrum dass denn nun, versteh ich nicht. Kannst mir
vielleicht weiterhelfen.Danke.
Hallo,
ich habe als sample time im Modell 1 und hatte im Unit delay -1 da war
wohl der Fehler habs auf 1 gestellt dann liefs wieder einwandfrei, aber
wie genau bestimme ich denn die sample time, bei simulation stop time
habe ich 10 eingestellt.Danke.
Hallo,
Ich habe jetzt eine sample time von (1/20*10^6) eingestellt, daraufhin
hat er gesagt, das ich die timescale ändern soll, das habe ich
automatisch durch den Cosim Block machen lassen er sagt nun
die sample time is eine virtuelle zeit. diese zeit gibt eine
schrittweite an, wieviel zeit von einem schritt zum nächsten vergeht.
die stop time definiert die länge deiner simulation. bei einer "10"
werden also 10 schritte durchlaufen, wenn die sample time 1 ist und dann
stoppt die simulation. wenn du einen längeren zeitraum sehen möchtest,
dann erhöhe die stop time einfach. bei einer sample time von 2 und einer
stop time von 10 würden nur 5 schritte durchlaufen.
Achsoo ich verstehe, ach deshalb läuft meine Simulation so ewig, oh gott
bei sample time die ich eingestellt, habe dauert es ja dann ne ewigkeit
ich brech lieber gleich ab.
Hallo,
bin nochmal da, hab wieder mal ne Frage, soweit funktioniert alles
wunderbar, nur sobald ich eine Regelstrecke nach dem Cosim Block
anhänge, meckert er, da er kein kontinuierliches Signal sondern ein
diskretes Signal bräuchte, nach welcher Regel transformiere ich nun
meine regelstrecke in die z position.Danke.
Hallo,
also mein endgültiges Simulink Modell sieht wiefolgt aus, aber einige
Sachen versteh ich nicht, beim kompilieren läuft es so langsam, liegt es
an den so kleinen Werten oder an etwaas anderem. Das Oszilloskop zeigt
folgendes wwenn ich Zoome... Das ist doch nicht normal, hab auich die
PID Anteile gändert und ausprobiert, keine Ahnung warum er es nicht tut,
vielleicht hast du ka eine idee.
Ich habe ein ganz normales Simulink Modell mit Simulink Blöcken
erstellt, und es funktioniert einwandfrei, aber sobald ich die Werte in
uint16 umwandle kommen ganz andre Wete dabei raus, hier ist mein
Simulinik Modell und der Datentyp überall ist double,
naja, das problem mit double und uint16 müsste sich auf die kommastellen
zurückführen lassen. also ein double ist ein floatingpoint datentyp, der
z.B. +-1.0347882354 als wert haben kann. ein uint16 kann halt nur werte
von 0 - 65535 haben und zwar ohne kommastellen. wenn deine rechnung
jedoch keine natürliche zahl in diesem bereich errechnet, sondern
vielleicht eine gebrochene, dann wird diese durch den verwendeten
datentypen gerundet, damit er wieder durch den gewählten datentyp
repräsentiert werden kann. also wird aus 1.0347882354 einfach 1. dadurch
rechnet dein algorithmus aber später auch falsch weiter und es entsteht
eine immer größer werdende diskrepanz zwischen den beiden
slimulationsdurchgängen.
aha ok, aber leider kann ich ja mit der PT2 regelstrecke nur double
Werte verwenden, gibt es da keine Möglichkeit, ich habe es mal anders
probiert, ich habe die Z transformation gebildet mit s=z-1/z, hoffe das
stimmt, und hab dann herausgefunden siehe Bild, damit klappt es
einigermaßen, ich probiere gerade die optimalen PID Anteile
herauszufinden hoffe es klappt,
du kannst halt für solche komplexe rechnungen nich einfach nur
integer-datentpyen nutzen, da diese halt keine kommastellen haben.
hierfür sind eigentlich die fixed-point datentypen vorgesehen. um diese
nutzen zu können benötigst du jedoch eine lizenz für die fixed-point
toolbox.
Hallo,
da bin ich wieder, wiollt mal fragen, hier siehst du mein Regelkreis, da
habe ich meine Regelstrecke implementiert, die Simulation läuft deswegen
extrem sangsam, woran kann das liegen und wie kann ich die Simulation
schneller durchführen.Danke.
>du kannst halt für solche komplexe rechnungen nich einfach nur>integer-datentpyen nutzen, da diese halt keine kommastellen haben.>hierfür sind eigentlich die fixed-point datentypen vorgesehen. um diese>nutzen zu können benötigst du jedoch eine lizenz für die fixed-point>toolbox.
Nicht unbedingt. Ich rechne hier munter mit "gepunkteten" Integerwerten
herum und habe keine FP-Lizenz oder spezielle Toolbox.
Hallo,
Ich hab ja beim letzten ml meinen Regelkreis gezeigt, hab dazu ne
verständnisfrage.
Meine regelstrecke hat die Parameter:
G(s)=T^2*s^2+2*D*T*s+1
T=4*10^-6,
D=1.2
da meine Zeitkonstante extrem klein ist, verläuft meine Simulation in
Simulink extrem langsam, dort sind 20 ps in echtzeit 30 Minuten, gibt es
da eine Möglichkeit, die Simulation schneller ablaufen zu lassen.Wäre
sehr dankbar wenn einer mir helfen könnte.Danke.