mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL Integer Rechnungen


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Frage bzgl. Integer Berechnungen.
Und zwar habe ich folgenedes Problem:

Gegeben ist der Anzeigewert (8Bit, bzw. 255 in Integer) und die 
Integerstelle. Ich will nun die 255 aufspalten, damit ich einmal die 5, 
dann die 2.Stelle 5 und die 3.Stelle 2 erhalte. Wie realsiere ich das?

Anhand des 8-Bit Wertes convertiere ich diesen in einen Integer, soweit 
zugut aber dann das Splitten weiß ich nicht wie ich das machen soll.
function SegmentValue ( sliderValue : std_logic_vector; SegementPosition: integer) return std_logic_vector is
  variable display_value : integer range 0 to 255;
  begin
    -- SegmentPosition (Stelle) kann 1,2 oder 3 sein.
    -- Slider (Gegebener Counter Wert) convetrieren zu integer
    display_value = conv_integer(sliderValue); -- Integerwert
                -- .... wie kann ich nun dieses display_value splitten ???
end

Liebe Grüße

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

Bewertung
0 lesenswert
nicht lesenswert
> Ich will nun die 255 aufspalten, damit ich einmal die 5,
> dann die 2.Stelle 5 und die 3.Stelle 2 erhalte. Wie realsiere ich das?
Das ist ein wenig aufwendiger, als du dir jetzt denken wirst :-o

Such hier im FPGA-Forum mal nach BCD, oder sieh auf meiner HP nach:
http://www.lothar-miller.de/s9y/categories/27-Byte-nach-BCD
Oder, wenns etwas mehr als nur ein Byte sein darf:
http://www.lothar-miller.de/s9y/categories/28-Vekt...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es nicht eine Funktion, wie z.B. in Java mit der man einen Wert 
Splitten kann?

Oder gibt es nicht eine andere leichtere Methode?

Autor: Patrick Sulimma (abaddon1979)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, da ist nichts schweres dabei ???? Wie Lothar Miller schon sagte, ein 
w enig Aufwendig(sprich: ein wenig Tippsen).

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

Bewertung
0 lesenswert
nicht lesenswert
> Gibt es nicht eine Funktion, wie z.B. in Java mit der man einen Wert
> Splitten kann?
Sei dir bewusst: du beschreibst Hardware
Das muß also alles mit Logikelementen (FFs, LUTs...) abgebildet werden 
können.

Und auch wenn du es in Java programmierst, wird eine Stelle nach der 
anderen abgearbeitet (nur merkst du nichts davon, weil die Funktion 
schon fertig ist).

Wenn du das "nur" für die Simulation brauchen würdest, wäre der 
Sachverhalt einfacher, dann mußt du dir um Ressourcenverbrauch etc... 
keine gedanken machen. Aber ich habe den Verdacht, das soll auf ein 
FPGA. Oder?

BTW:
Falls du gerade so mit VHDL anfängst, vergiss die Keywords function 
und procedure vorerst mal wieder. Du solltest eher das Denken in 
Komponenten (component) lernen.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt im Prinzip ist es leichter, wenn man das einfach abtippt.

@Lothar Miller
Ja, das soll auf einen FPGA drauf, und stimmt es ist ja nicht dasselbe 
wie in Java.

BTW:
Auf deiner Seite ist dieser Quellcode... und müsste die erste digit10 
nicht digit1 sein?
....
begin
   -- BROM 
   process begin
     wait until rising_edge(clk);
     addr <= data;
   end process;
   digits <= BCDRom(to_integer(unsigned(addr)));
  
   dig10  <= digits (3 downto 0);   <==================== FEHLER?!?!?!
   dig10  <= digits (7 downto 4);
   dig100 <= digits(11 downto 8);
end Behavioral;
....

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

Bewertung
0 lesenswert
nicht lesenswert
Gast schrieb:
> Stimmt im Prinzip ist es leichter, wenn man das einfach abtippt.
>
> BTW:
> Auf deiner Seite ist dieser Quellcode... und müsste die erste digit10
> nicht digit1 sein?

Sch...
Ja, richtig. Wird gleich korrigiert ;-)


EDIT:
Du kannst den Takt auch weglassen, dann wird das Ganze in LUTs 
abgebildet.
begin
   digits <= BCDRom(to_integer(unsigned(data)));
 
   dig1   <= digits (3 downto 0);
   dig10  <= digits (7 downto 4);
   dig100 <= digits(11 downto 8);
end Behavioral;
Ob du dir den Ressourcenverbrauch leisten kannst, musst du selber 
abschätzen.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lothar Miller

Danke nochmal!

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du für die Konvertierung etwa 12 Takte Zeit? Dann kannst du dir ein 
paar Ressourcen sparen (Sukzessive Multiplikation mit 2 in BCD).

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

Bewertung
0 lesenswert
nicht lesenswert
> (Sukzessive Multiplikation mit 2 in BCD).
In dem von mir angegebenen Link (BCD-Schieberegister) wird genau sowas 
mit einem Links-Shift gemacht ;-)

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.