www.mikrocontroller.net

Forum: FPGA, VHDL & Co. integer in integer array wandeln


Autor: Stefan Z. (derdespot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
     ...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>     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?

Autor: Stefan Z. (derdespot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Stefan Z. (derdespot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Stefan Z. (derdespot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
....

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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. .

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.