Forum: FPGA, VHDL & Co. VHDL Integer Rechnungen


von Gast (Gast)


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.
1
function SegmentValue ( sliderValue : std_logic_vector; SegementPosition: integer) return std_logic_vector is
2
  variable display_value : integer range 0 to 255;
3
  begin
4
    -- SegmentPosition (Stelle) kann 1,2 oder 3 sein.
5
    -- Slider (Gegebener Counter Wert) convetrieren zu integer
6
    display_value = conv_integer(sliderValue); -- Integerwert
7
                -- .... wie kann ich nun dieses display_value splitten ???
8
end

Liebe Grüße

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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-Vektor-nach-BCD

von Gast (Gast)


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?

von Patrick S. (abaddon1979)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Gast (Gast)


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?
1
....
2
begin
3
   -- BROM 
4
   process begin
5
     wait until rising_edge(clk);
6
     addr <= data;
7
   end process;
8
   digits <= BCDRom(to_integer(unsigned(addr)));
9
  
10
   dig10  <= digits (3 downto 0);   <==================== FEHLER?!?!?!
11
   dig10  <= digits (7 downto 4);
12
   dig100 <= digits(11 downto 8);
13
end Behavioral;
14
....

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.
1
begin
2
   digits <= BCDRom(to_integer(unsigned(data)));
3
 
4
   dig1   <= digits (3 downto 0);
5
   dig10  <= digits (7 downto 4);
6
   dig100 <= digits(11 downto 8);
7
end Behavioral;
Ob du dir den Ressourcenverbrauch leisten kannst, musst du selber 
abschätzen.

von Gast (Gast)


Lesenswert?

@Lothar Miller

Danke nochmal!

von der mechatroniker (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

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.