10bit Wert => 4x 7 Segment

Gast #4566994
Lesenswert?

Hallo zusammen,

ich habe einen 10bit Wert, den ich gerne auf vier 7-Segment Anzeigen 
ausgeben möchte.

0-1023 sind ja die Werte.

Mir fällt nur eine lange LUT ein, aber ich möchte ungern mir für 1024 
Werte die LEDs zusammen suchen und dann schauen, dass der korrekte Wert 
angezeigt wird.

Gibt es sowas vielleicht schon fertig für VHDL?
Bzw. gibt es vielleicht ein Script oder eine Website, die die LUT 
automatisch generiert?

Meine LEDs sind low-active...

Vielen Dank!
Andi :)
#4567041
Lesenswert?

@Andi (Gast)

>ich habe einen 10bit Wert, den ich gerne auf vier 7-Segment Anzeigen
>ausgeben möchte.

>0-1023 sind ja die Werte.

Scheint so.

>Mir fällt nur eine lange LUT ein, aber ich möchte ungern mir für 1024
>Werte die LEDs zusammen suchen und dann schauen, dass der korrekte Wert
>angezeigt wird.

Das wäre in der Tat mühsam.

>Gibt es sowas vielleicht schon fertig für VHDL?

Wahrscheinlich. Aber was lernst du dabei?

>Bzw. gibt es vielleicht ein Script oder eine Website, die die LUT
>automatisch generiert?

Eher nicht.

Man kann auch die Zahl in die 4 Dezimalziffern zerlegen und dann mit 
einem deutlich einfacheren Dekoder mit 10 Eingangscodes die 10 
7-Segment-Codes generieren. Das Ganze seriell mittels Statemachine 
spart auch noch Hardwareressourcen, da man nur 1 Dekoder braucht. Die 
Division/Modulo Operation muss man halt clever machen oder einfach per 
mehrfacher Subtraktion.

Oder man zeigt die Zahl hexadezimal an, dann muss man nicht die 
einzelnen Ziffern zerlegen, die sind schon da. Noch einfach ist eine 
binäre Anzeige ;-)

Eine schöne Übungsaufgabe.
Gast #4567058
Lesenswert?

Eine binäre Anzeige mittels LEDs habe ich schon.
Das Umrechnen zur Kontrolle nervt aber ;)

Ich habe mir jetzt die LUT gebaut, ging doch besser als gedacht mit 
Excel und der Spaltenbearbeitung im Editor.

0-1023 erst in binär umrechnen lassen und damit habe ich meinen Eingang 
der CASE Abfrage.

Das Ergebnis habe ich mir aus Kontanten zusammen gebaut.
1
c_null  : std_logic_vector  := "0000001"; -- low active LEDs
2
c_eins : std_logic_vector  := "1001111";
3
c_zwei : std_logic_vector  := "0010010";
4
-- usw.
5

6
CASE
7
WHEN "0000000000" => s_leds <= c_null & c_null & c_null & c_null;
8
WHEN "0000000001" => s_leds <= c_null & c_null & c_null & c_eins;
9
-- usw. 
10

11
LED0 <= s_leds( 5 DOWNTO  0);
12
LED1 <= s_leds( 6 DOWNTO 11);
13
LED2 <= s_leds(12 DOWNTO 17);
14
LED3 <= s_leds(18 DOWNTO 23);

So sollte das grob passen... mal sehen, ob ich das im FPGA unterbkomme 
:)
Moderator (Firma: Titel) Persönliche Seite #4567082
Lesenswert?

Andi schrieb:
> 0-1023 erst in binär umrechnen lassen und damit habe ich meinen Eingang
> der CASE Abfrage.
Auf gut deutsch also in eine BCD-Darstellung umwandeln. Und das für eine 
schnarchlangsame Anzeige fürs Auge? Da wäre mir ein ROM zu teuer. Mit 
dem Shift-Add-3 Verfahren geht das ressourcenschonender...
Siehe dort:
http://www.lothar-miller.de/s9y/archives/34-Vektor-nach-BCD.html
http://www.lothar-miller.de/s9y/categories/44-BCD-Umwandlung

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren