VHDL-Forum - Syntax

Was ist hier falsch?

Was ist hier falsch?

Hi Leute ich bekomme immer folgenden Fehler wenn ich meine Schaltung syhtentisieren willl:
Zitat:
Compiling vhdl file "D:/geschäft/05027/scripte/PWM_OUT/main.vhd" in Library work.
Entity compiled.
ERROR:HDLParsers:854 - "D:/geschäft/05027/scripte/PWM_OUT/main.vhd" Line 51. The expression can not be converted to type unsigned.Code sind folgendermaßen in Line 51 aus
Zitat:
dip_int := to_integer(unsigned(Dip));Die "dip_int" ist als variable integer und der "DIP" als "bit_vector(3 downto 0);" defeniert.

Hat da jemand eine Idee?

Habe mal den ganzen Code angehängt...

(Ich hatte das Thema schon mal im Anfängerforum, aber da habe ich nicht gewusst wie's geht, jetzt habe ich ja nen Fehler im Syntax, deshalb jetzt hier )

Hoffe Ihr könnt mir helfen!

greeez

Re: Was ist hier falsch?

während ich den post geschrieben habe ist mir ein licht aufgeangen.....

habs jetzt rausgefunden, warum das bei mir net getan hat, habe aus dem bit_vector jetzt mal ein std_logic_vector gemacht und scho tuts....
jetzt muss mir das nur noch jemand erklären.

Re: Was ist hier falsch?

Ich denke, die Funktion unsigned ist nur für std_(u)logic Werte definiert (zumindestens laut meinem Buch hier). Daran wird es wohl liegen.

Generell ist es vorteilhafter, sowieso diese Typen zu benutzen.

Re: Was ist hier falsch?

ok...welches buch hast du denn?

so hab jetzt mitlerweile das nexte problem:

Bekomme folgenden Fehler:
Zitat:
Analyzing Entity (Architecture ).
ERROR:Xst:769 - "D:/geschäft/05027/scripte/PWM_OUT_V1.0/main.vhd" line 76: Operator must have constant operands or first operand must be power of 2soweit ich das rausgelesen habe hat er ein problem das ich folgendes mache:
Zitat:
DIP1_int := to_integer(unsigned(DIP1));
pulsdauer := 6 * DIP1_int;

DIP2_int := to_integer(unsigned(DIP2));
frequenz := 6 * DIP2_int;
.
.
.
if frequenz_count < ((frequenz / 100)* pulsdauer) then
.
.darf ich die zahl nur einmal verändern, oder ist sie zu groß zum dividieren?
was kann da machen? gibt es einen zahlentyp, der auch kommas kann? dann könnt ich statt durch 100 zu teilen einfach nur mit 0,06 multiplizieren

hier der volle code im anhang

Re: Was ist hier falsch?

Ich denke, es liegt an der Division. Wie wäre es wenn du diese weg lässt, und es so schreibst:

if (frequenz_count*100) < (frequenz* pulsdauer) then

ist das nicht genau das selbe? Und es lässt sich anstandslos synthetsieren....

Oder du zählst frequenz_count immer um 100 hoch, nicht um 1. Dann kannst du dir doch auch die Multiplikation um 100 sparen, oder?

Achso: Ich hab vorhin ins Buch 'VHDL-Synthese' geschaut. Aber auch der 'Designers Guide to VHDL' is da immer gut zum Nachschlagen.

Re: Was ist hier falsch?

ja ok, das ist eine idee... die tzut auch, habe ich total übersehen...sorry.

jetzt wollt ich grad noch nen großes aber sagen, aber mir ist gerade die lösung für mein nextes problem eingefallen...man macht das spaß wenn man endlich selber auf die lösungen kommt

danke für eure hilfe!

greez

Re: [gelöst] Was ist hier falsch?

ich habe da mal wieder das gleiche problem mit dem divid ...
habe schon verschiedenes versucht, aber ich finde keine lösung....
vielleicht findet ihr ja eine

ich habe eine schleife, wo zu einer variavle "zaeh_ges" immer +1 addiert wird, danach soll in einem andere process ein pwm erzeugt werden, mit folgender bedingung
"frequenz_count * 100

Re: Was ist hier falsch?

Wie wäre es wenn du nen Taktteiler erstellst, der den Takt auf 1kHz (T = 1ms) teilt? Mit dem könntest du die Zähler ansteuern. Und würdest dir die Division sparen.

Hab mir aber deinen Quelltext noch nicht angeschaut, da ich kurz angebunden bin. Generell sind Divisionen nicht einfach so synthetisierbar.

Re: Was ist hier falsch?

hört sich im ersten augenblick gut an, aber .....
hmm jetzt komm ich ins grübeln...muss mir das nochmals anschauen, ob das so geht...bin grad auf arbeit und habe grad ein anderes projekt...mal heute mittag anschauen, wenn ich mehr zeit habe.

wäre aber nett wenn du mal meinen code anschauen könntest.

greez

Re: Was ist hier falsch?

Zitat: nobbe
während ich den post geschrieben habe ist mir ein licht aufgeangen.....

habs jetzt rausgefunden, warum das bei mir net getan hat, habe aus dem bit_vector jetzt mal ein std_logic_vector gemacht und scho tuts....
jetzt muss mir das nur noch jemand erklären.Nun ja: Als ob es in VHDL nicht genug Zahlentypen gibt, hat es ZWEI Sorten von Signed/Unsigned, je nachdem welches Modul du benutzt:

use ieee.numeric_std.all;
--> type UNSIGNED is array (NATURAL range ) of STD_LOGIC;

use ieee.numeric_bit.all;
--> type UNSIGNED is array (NATURAL range ) of BIT;

Bleib bei STD_LOGIC, das ist der De-Facto-Standard für alle, und die mehrwertigen Zustände haben schon ein paar Mal den Abend beim Debuggen gerettet.

Re: Was ist hier falsch?

Ich kann mir den Code erst Ende nächster Woche näher anschauen, bin grad voll im Lernen für die Abschlussprüfungen. Mal sehen, was sich danach machen lässt. Hab da auch noch eigene Projekte, die ich dann (endlich) in Angriff nehmen kann.