Forum: FPGA, VHDL & Co. Gray Code to 7-Segment


von Peter Z. (Gast)


Lesenswert?

Hi,
ich habe einen sehr speziellen Analog nach Digital Wandler entworfen, 
der einen 6-Bit-Gray-Code ausgibt.
Mit TTL-IC's wüsste ich, wie ich das auf einer 2-stelligen 
7-Segment-Anzeige  (00...63) ausgeben würde:

1. Zuerst mit 5 Stück 1/4 7486 XOR den Gray-Code nach Binär wandeln.
2. den Binär-Code nach 2 stellig BCD wandeln. Auch da gibt es ein IC, 
dessen Name mir im Moment entfleucht ist.
3. mit 2 Stück 7447 oder 7448 die 7-Segment-Anzeigen treiben.

Wie würde ich das in VHDL schreiben um es vielleicht in ein CPLD XC9572 
zu bringen?
Brauche ich da die drei Schritte, oder geht das in einem Rutsch?

von Christian R. (supachris)


Lesenswert?

Du kannst natürlich auch in einem Rutsch aus dem Gray-Code den 7-Segment 
Code erzeugen. Per LUT oder case Anweisung. Man kann natürlich auch den 
Gray Code erst nach bin wandeln und dann bin zu 7-Segment, aber das 
bringt in deinem Fall ja nix.

von Peter Z. (Gast)


Lesenswert?

Christian R. schrieb:
> Du kannst natürlich auch in einem Rutsch aus dem Gray-Code den 7-Segment
> Code erzeugen. Per LUT oder case Anweisung.

case kenn ich, aber LUT nicht. Hast du mal ein Beispiel?

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


Lesenswert?

Peter Zz schrieb:
> Mit TTL-IC's wüsste ich, wie ich das auf einer 2-stelligen
> 7-Segment-Anzeige  (00...63) ausgeben würde:
Recht viel Aufwand. Ich würde da ein 16 Bit EPROM mit den passenden 64 
Werten programmieren und die Anzeige direkt da anschließen...

Peter Zz schrieb:
> Wie würde ich das in VHDL schreiben
In etwa so:
1
   port (
2
     gray   : in std_logic_vector(5 downto 0),  -- 6 Eingangsbits
3
     zehner : out std_logic_vector(6 downto 0), -- 7 Bits für die Zehnerstelle
4
     einer  : out std_logic_vector(6 downto 0)  -- 7 Bits für die Einerstelle
5
   );
6
7
   process (gray) begin
8
      case gray is              --  abcdefg              abcdefg
9
         when "00000" => zehner <= "1111110"; einer <=  "1111110"; -- 00
10
         when "00001" => zehner <= "1111110"; einer <=  "0110000"; -- 01
11
         when "00011" => zehner <= "1111110"; einer <=  "1101101"; -- 02
12
         :
13
         when "10001" => zehner <= "0110000"; einer <=  "0110000"; -- 62
14
         when others  => zehner <= "0011111"; einer <=  "1111001"; -- 63
15
   end process;

> um es vielleicht in ein CPLD XC9572 zu bringen?
Kann sein, dass das gelingt, allerdings ist für ein CPLD die Tabelle 
schon recht groß...

Peter Zz schrieb:
> case kenn ich, aber LUT nicht.
LUT heißt Lookup Table. Ein RAM oder ein EPROM sind z.B. LUTs: immer 
wenn ich mit der selben Adress reinschaue bekomme ich das selbe 
zurück...

: Bearbeitet durch Moderator
von Peter Z. (Gast)


Lesenswert?

Lothar Miller schrieb:
> Und in VHDL
> Das passt alles

in ein XC9572?

Danke für den VHDL-Code.
Ist aber ein wenig viel Tipparbeit, dafür in einem Schritt. :-)
Das begünstigt wahrscheinlich die Optimierung?!

Kann man das in VHDL auch in 3 Schritten machen?
Würde das in drei Schritten eine Optimierung für ein XC9572 eher 
hilfreich sein oder hinderlich?
Kennt VHDL den Gray-Code?
Kennt VHDL bin to BCD?
Kennt VHDL 7-Segment?

von Christian R. (supachris)


Lesenswert?

Ich vermute, über das direkte Case-Monster freut sich der Synthesizer 
mehr. Ist auch weniger Arbeit für dich. Die Tipparbeit brauchst du 
sowieso, spätestens bei bcd -> 7-Segment.

Ob es reinpasst? Probier es einfach aus, Xilinx Webpack ist kostenlos, 
die 64 Zeilen einhacken und durchlaufen lassen.

: Bearbeitet durch User
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.