Forum: FPGA, VHDL & Co. Simulink mit Modelsim verlinken


von A. (Gast)


Lesenswert?

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

von Georg (Gast)


Lesenswert?

>The vsimulink command is a Link for ModelSim variant of the ModelSim vsim 
>command.


Also wieso gibst du vsim in Matlab ein ?

Gruß, Georg

von A. (Gast)


Lesenswert?

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ß

von Georg (Gast)


Lesenswert?

>ich habe herausgefunden dass ich den EDA Simulator Link für
>Matlab benötige, um Simulink mit Matlab zu verlinken.

Was hat das mit Modelsim zu tun ?

von J. S. (engineer) Benutzerseite


Lesenswert?

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.

von Weltbester FPGA Pongo (Gast)


Lesenswert?

Wofür braucht man diese ModelSIM-Simulation überhaupt noch?

Ich denke, das MATLAB macht das nun selbst. Oder doch nicht?

von Nephilim (Gast)


Lesenswert?

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.

von A. (Gast)


Lesenswert?

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:
1
vsim -foreign "simlinkserver E:\Program Files\MATLAB\R2010b\toolbox\edalink\extensions\modelsim\windows32\liblfmhdls_tmwvs.dll" work.inverter
2
# vsim -foreign {simlinkserver E:Program FilesMATLABR2010b  oolboxedalinkextensionsmodelsimwindows32liblfmhdlc_tmwvs.dll} work.inverter 
3
# Loading std.standard
4
# Loading ieee.std_logic_1164(body)
5
# Loading work.inverter(behavioral)
6
# ** Warning: (vsim-FLI-3162) Ignoring extra files in foreign attribute "simlinkserver E:Program FilesMATLABR2010b  oolboxedalinkextensionsmodelsimwindows32liblfmhdlc_tmwvs.dll".
7
# Loading E:Program
8
# ** Error: (vsim-3193) Load of "E:Program" failed: File not found.
9
# ** Warning: (vsim-FLI-3160) Failed to load FLI object file "E:Program".
10
#         Region: /inverter

Danke.

von Nephilim (Gast)


Lesenswert?

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.

von A. (Gast)


Lesenswert?

Hallo,

Danke für deine Antwort, aber irgendwie ist immer noch ein fehler 
vorhanden, komme einfach nciht weiter.

•
1
vsim -foreign "simlinkserver E:/Program Files/MATLAB/R2010b/toolbox/edalink/extensions/modelsim/windows32/liblfmhdls_tmwvs.dll" work.inverter
2
# vsim -foreign {simlinkserver E:/Program Files/MATLAB/R2010b/toolbox/edalink/extensions/modelsim/windows32/liblfmhdls_tmwvs.dll} work.inverter 
3
# Loading std.standard
4
# Loading ieee.std_logic_1164(body)
5
# Loading work.inverter(behavioral)
6
# ** Warning: (vsim-FLI-3162) Ignoring extra files in foreign attribute "simlinkserver E:/Program Files/MATLAB/R2010b/toolbox/edalink/extensions/modelsim/windows32/liblfmhdls_tmwvs.dll".
7
# Loading E:/Program
8
# ** Error: (vsim-3193) Load of "E:/Program" failed: File not found.
9
# ** Warning: (vsim-FLI-3160) Failed to load FLI object file "E:/Program".
10
#         Region: /inverter

Danke

von peter (Gast)


Lesenswert?

probier:
vsim -foreign "simlinkserver E:/Program\ 
Files/MATLAB/R2010b/toolbox/edalink/extensions/modelsim/windows32/liblfm 
hdls_tmwvs.dll"  work.inverter

von A. (Gast)


Lesenswert?

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.

von Nephilim (Gast)


Lesenswert?

die modelsim PE student edition funktioniert ... selbst schon verwendet 
inner cosimulation

von Nephilim (Gast)


Lesenswert?

der fehler aus dem zuletzt geposteten Fehlerabbild ist durch das 
leerzeichen im Pfad bei "Program Files" zu begründen.

von A. (Gast)


Lesenswert?

Hallo, na gut hier die Fehlermeldung, nach  der Korrektur.Danke.
1
vsim -foreign "simlinkserver E:/Program\Files/MATLAB/R2010b/toolbox/edalink/extensions/modelsim/windows32/liblfmhdls_tmwvs.dll" work.inverter
2
# vsim -foreign {simlinkserver E:/ProgramFiles/MATLAB/R2010b/toolbox/edalink/extensions/modelsim/windows32/liblfmhdls_tmwvs.dll} work.inverter 
3
# Loading std.standard
4
# Loading ieee.std_logic_1164(body)
5
# Loading work.inverter(behavioral)
6
# Loading E:/ProgramFiles/MATLAB/R2010b/toolbox/edalink/extensions/modelsim/windows32/liblfmhdls_tmwvs.dll
7
# ** Error: (vsim-3193) Load of "E:/ProgramFiles/MATLAB/R2010b/toolbox/edalink/extensions/modelsim/windows32/liblfmhdls_tmwvs.dll" failed: File not found.
8
# ** Warning: (vsim-FLI-3160) Failed to load FLI object file "E:/ProgramFiles/MATLAB/R2010b/toolbox/edalink/extensions/modelsim/windows32/liblfmhdls_tmwvs.dll".
9
#         Region: /inverter

von A. (Gast)


Lesenswert?

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.

von peter (Gast)


Lesenswert?

das immer noch falsch:
das muss
"Program\ Files" sein, mit leerzeichen

von A. (Gast)


Lesenswert?

Hallo,
Habs probiert, gibt immer noch denselben Fehler.Danke.
1
vsim -foreign "simlinkserver E:/Program\ Files/MATLAB/R2010b/toolbox/edalink/extensions/modelsim/windows32/liblfmhdls_tmwvs.dll" work.inverter
2
# vsim -foreign {simlinkserver E:/Program Files/MATLAB/R2010b/toolbox/edalink/extensions/modelsim/windows32/liblfmhdls_tmwvs.dll} work.inverter 
3
# Loading std.standard
4
# Loading ieee.std_logic_1164(body)
5
# Loading work.inverter(behavioral)
6
# ** Warning: (vsim-FLI-3162) Ignoring extra files in foreign attribute "simlinkserver E:/Program Files/MATLAB/R2010b/toolbox/edalink/extensions/modelsim/windows32/liblfmhdls_tmwvs.dll".
7
# Loading E:/Program
8
# ** Error: (vsim-3193) Load of "E:/Program" failed: File not found.
9
# ** Warning: (vsim-FLI-3160) Failed to load FLI object file "E:/Program".
10
#         Region: /inverter

von Nephilim (Gast)


Lesenswert?

versuch mal matlab so zu installieren, das im pfad kein leerzeichen 
auftritt. dann sollte auch diese fehlermeldung verschwinden.

von A. (Gast)


Lesenswert?

Hallo,
gut mach ich. Ich wollt noch was zu Matlab fragen, wenn ich da den 
befehl vsim eingebe kommt diese Fehlermeldung:
1
Both launcher " modelsim -noautoldlibpath -gui -do "do {E:/Documents and Settings/localadmin/My Documents/MATLAB/compile_and_launch.tcl}"" and " questasim -noautoldlibpath -gui -do "do {E:/Documents and Settings/localadmin/My Documents/MATLAB/compile_and_launch.tcl}"" failed with non-zero status! 
2
If the problem is that it is not on the system path, 
3
please use parameter 'hdlsimdir' to specify its location
4
??? Error using ==> hdlsim at 283
5
** Error: Only one of -i, -gui or -c can be used.
6
Use the -help option for complete vsim usage.
7
8
9
Error in ==> vsim at 101
10
hdlsim(pvpairs{:});
Hat sie mit dem Modelsim zu tun, weils da nicht klappt oder liegt es an 
was anderem.Danke.

von A. (Gast)


Lesenswert?

Hallo,

Alles klar vielen Dank nochmal für alles. KLappt super. Falls ich 
weitere Fragen haben sollte wende ich mich an dir.Danke Nochmal.

von A. (Gast)


Lesenswert?

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:
1
port(
2
  clk_i:  in  std_logic;
3
  rst_i:  in  std_logic;
4
  k_v: in std_logic_vector(intern_data_width-1 downto 0); --28bit
5
  k_p: in std_logic_vector(intern_data_width-1 downto 0); --28bit
6
  k_i: in std_logic_vector(intern_data_width-1 downto 0); --28bit
7
  k_d: in std_logic_vector(intern_data_width-1 downto 0); --28bit
8
  use_nl_feed_forward: in std_logic;
9
  data_nl_i  : in std_logic_vector(data_width-1 downto 0); --14bit
10
  data_w_i:   in std_logic_vector(data_width-1 downto 0); --14bit
11
  data_y_i:   in std_logic_vector(data_width-1 downto 0); --14bit
12
  data_u_o:   out std_logic_vector(data_width-1 downto 0) --14bit
13
  );
meine Frage nun, wie sage ich simulink, dass mein data_w_i 14 bit gross 
ist, wenn ich simulink starte, kommt die Fehlermeldung:
1
Data type mismatch at signal '/pi_controller_and_feed_forward/data_w_i'.This port expects a Logic data type of size 14

wie kann man dies in Simulink einstellen.danke.

von J. S. (engineer) Benutzerseite


Lesenswert?

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.

von Nephilim (Gast)


Lesenswert?

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.

von A. (Gast)


Lesenswert?

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ß

von Nephilim (Gast)


Lesenswert?

naja, ich dachte eher an ufix14, also fixdt(0,14,0), aber grundlegend 
ja, genau das meinte ich.

von A. (Gast)


Lesenswert?

Hallo,
na gut ok, aber wo find ich denn dann Ufix14, das finde ich nrigends in 
den Einstellungen.Danke.

Gruß

von Nephilim (Gast)


Lesenswert?

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.

von A. (Gast)


Lesenswert?

Hallo,
wenn ich das auswähle kommt trotzdem ein fehler in dem er sagt:
1
'PID_Regler/Constant' requested use of data type 'ufix14'. Use of this data type requires a fixed-point license, but license checkout failed. To use this model without a fixed-point license, select "Fixed-Point Tool" under "Fixed-Point" from the model's Tools menu. Select the root model in Model Hierarchy. Set "Logging mode" to be "Force off", "Data type override" to be "Double" and "Data type override applies to" to be "All numeric types". This replaces most uses of fixed-point data types with floating-point doubles

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.

von A. (Gast)


Lesenswert?

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.

von A. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
hab mein Simulink Programm soweit erweitert mit subsystem und anderes.
Da kommt jetzt wieder eine neue Fehlermeldung:
1
Error reported by S-function 'shdlcosim' in 'PID_Regler1/Subsystem/HDL Cosimulation/S-Function':
2
Data type mismatch at signal '/pi_controller_and_feed_forward/data_u_o'.This port expects a Logic data type of size 14

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.

von A. (Gast)


Lesenswert?

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ß

von Nephilim (Gast)


Lesenswert?

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.

von A. (Gast)


Lesenswert?

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.

von A. (Gast)


Lesenswert?

Hallo, sollte ich ein Minimum, Maximum einstellen die habe ich nämlich 
offen gelassen.danke.

von Nephilim (Gast)


Lesenswert?

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.

von A. (Gast)


Lesenswert?

Hallo,
habs gemacht und an allen In-und Outports steht double dran, aber ich 
habe doch nirgends double ausgewählt. wie kommt denn das zustande.Danke.

von A. (Gast)


Lesenswert?

Ich hätt da mal noch ne frage, sollte ich in Configuration Parameters 
bei Hadware Implementation FPGA auswählen oder eher generic. Danke.

von A. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Nephilim (Gast)


Lesenswert?

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.

von Frager (Gast)


Lesenswert?

Ich habe keine fixed point Lizenz - kann aber dennoch CO-Simulation 
(HW+SIM) betreiben.(?)

von Nephilim (Gast)


Lesenswert?

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.

von J. S. (engineer) Benutzerseite


Lesenswert?

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.

von A. (Gast)


Lesenswert?

Hallo,
Danke für eure Tipps, probier ich mal sofort aus.Danke nochmal.

von A. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von A. (Gast)


Angehängte Dateien:

Lesenswert?

Die Source Parameter sind wie folgt eingestellt, hoffentlich habe ich 
hier keinen Fehler.Danke.

von Nephilim (Gast)


Lesenswert?

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.

von A. (Gast)


Lesenswert?

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.

von A. (Gast)


Lesenswert?

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:
1
Cannot solve algebraic loop involving 'PID_Regler2/Subsystem/HDL Cosimulation/S-Function' because it consists of blocks that cannot be assigned algebraic variables, such as blocks with discrete-valued outputs, blocks with non-double or complex outputs, Stateflow blocks, or nonvirtual subsystems. Consider breaking the algebraic loop. For example, add a delay or a memory block to the loop.

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.

von Nephilim (Gast)


Lesenswert?

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.

von A. (Gast)


Lesenswert?

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.

von A. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Nephilim (Gast)


Lesenswert?

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.

von A. (Gast)


Lesenswert?

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.

von A. (Gast)


Lesenswert?

Hallo,
in wirklichkeit soll eine Apmlituden und Frequenzrampe an den regler 
übergeben werden, versuche ob es mit einer Rampe klappt. Danke.

von Nephilim (Gast)


Lesenswert?

was ist deine sample time im Modell? welche sample time ist im unit 
delay eingestellt? wie lang is deine simulationsdauer?

von A. (Gast)


Lesenswert?

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.

von A. (Gast)


Lesenswert?

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
1
1 second in Simulink corresponds to 2*10^(-5) s in the HDL simulator

was genau bedeutet das nun. Meine Simulation dauert jetzt ja ewig sind 
schon 30 sekunden vorbei ist das normal.Danke.

von Nephilim (Gast)


Lesenswert?

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.

von A. (Gast)


Lesenswert?

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.

von A. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Nephilim (Gast)


Lesenswert?

versuchs mal zusätzlich mit ner "rate transition", so dass nich nur der 
datentyp angepasst wird, sondern auch die zeit.

von A. (Gast)


Lesenswert?

kann ich es nicht mit der discreten Transfer Fcn machen, soll die rate 
transition vor oder hinter der regelstrecke sein.Danke.

von A. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von A. (Gast)


Angehängte Dateien:

Lesenswert?

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,

von A. (Gast)


Angehängte Dateien:

Lesenswert?

UUUps hab das falsche angehängt, hier nochmal, und hier das Modell

von Nephilim (Gast)


Lesenswert?

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.

von A. (Gast)


Angehängte Dateien:

Lesenswert?

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,

von Nephilim (Gast)


Lesenswert?

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.

von A. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von A. (Gast)


Lesenswert?

Hallo,
Nephilim, falls du da bist, kannst du den vorigen Eintrag von mir lesen 
danke, hab immer noch das Problem. Danke.

von J. S. (engineer) Benutzerseite


Angehängte Dateien:

Lesenswert?

>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.

von A. (Gast)


Lesenswert?

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.

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.