Hallo Leute, ich habe folgendes Problem: Ich möchte eine 4bit lange variable vom typ integer in eine variable vom typ integer array wandeln. dabei soll das msb des array die 1000er stelle haben und das lsb die 1er stelle. Wenn ich einfach eine zuweisung mache, meckert er beim synthetisieren. Könnt ihr mir helfen? hier der Beispiel Code: ... process... ... type integer_array is array (3 downto 0)of integer; variable dezimal: integer := 1234; variable dezimal_array: integer_array := "0000"; begin dezimal_array := dezimal; <-- Fehler ...
> variable dezimal_array: integer_array := "0000";
Eigentlich könnte hier schon ein Fehler auftauchen :-/
Du solltest den Speicherplatz innerhalb des Arrays angeben (den Index)
z.B.
dezimal_array(0) := dezimal;
oder
dezimal_array(2) := dezimal;
An welchen Array-Platz sollte denn sonst der dezimal-Wert gespeichert
werden?
Mein Ziel ist es eine dezimale Zahl (max. 9999) auf 4 7Segment Anzeigen darzustellen. Dazu brauche ich ich jeden Wert der Dezimal Zahl extra, damit ich die 1er 10er 100er 1000er auf den Anzeigen darstellen kann. Man könnte es auch so machen: if(dezimal < 10) then 1000er = 0 100er = 0 10er = 0 1er = dezimal ... if(deziaml <20) then .... Aber das würde riesigen Tippaufwand bedeuten, deshalb will ich die 1er 10er 100er und 1000er aus nem 4 bit breiten array abgreifen. Deshalb muss ich halt meine dezimal zahl in ein array wandeln.
> muss ich halt meine dezimal zahl in ein array wandeln. Sooo billig wirst du das nicht bekommen. Sieh dir deine Binärzahl (das ist deine dezimalzahl eigentlich) mal genauer an. Du kannst ohne Division oder Subtraktion nicht aus einer Binärzahl eine BCD-Zahl (eine Binär Codierte Dezimalzahl, das willst du nämlich) machen. Such mal hier im FPGA-Forum, irgendwo habe ich das schon mal beschrieben.
nene, wir reden aneinander vorbei: meine 7segmentanzeige benötigt natürlich 8 binäre werte (7 + Punkt). Das realisiere ich mit einem case statement: 1. 7Segmentanzeige (1er) .... case dezimal when 1 -> SEG_OUT = "0000101010" (z.B.) ... aber ich will z.B. die einerstelle folgendermaßen realisieren .... case dezimal(0) <-- deshalb brauche ich ein array um auf die 1er zuzugreifen whem 1 --> .... ... Ich brauche also aus meiner 4bit breiten dezimalzahl die niederwertigste(1er) und dann geh ich in mein case statement um sie auszugeben! genauso ist es mit der 10er 100er 1000er
Ihr redet nicht wirklich aneinander vorbei, Lothar hat schon das gesagt, was du brauchst. Ein iteger array bedeutet dicht, dass die Ziffern einzeln gespeichert werden, sondern dass du darin mehrere Integerwerte speichern kannst. Natürlich kannst du entsprechend auch die Ziffern als einzelne Integerwerte darin speichern. Um die zu erhalten, musst du die Integerzahl aber umrechnen, so wie schon gesagt wurde.
Achso, danke an euch beide!Also komm ich nicht um die Tipparbeit herum? if(dezimal < 10) then 1000er = 0 100er = 0 10er = 0 1er = dezimal ... if(deziaml <20) then ....
So kannst du das zwar machen, weiß ja nicht was du vorhast und wie groß die Zahlen werden. Du musst dran denken, du beschreibst Hardware und die baut dir nach deiner Variante einen Haufen Vergleicher und Multiplexer. Wie gesagt, schau mal nach BCD. Eigentlich macht man es über einen Algorithmus, z.B. so lange 1000 abziehen bis man negativ wird und dabei mitzählen, dann hast du die 1000er-Stelle. Von dem Ergebnis was als letztes positiv war dann die 100er abziehen usw. .
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.