Forum: FPGA, VHDL & Co. Dezimale Zahl auf 7-Segment


von Lucky L. (rantanplan)


Lesenswert?

Hallo ich bin noch ziemlicher Anfänger in sachen VHDL.
Ich hab mal einen CODE geschrieben um Dezimale Werte, die ich über einen 
std_logic_vector bekomme, auf ein 7-Segment aus zu geben.
Könnte das so funktionieren?
1
LIBRARY ieee;
2
USE iee.std_logic_1164.all
3
4
ENTITY sec_einer_to_DIG0 IS
5
6
  PORT
7
  (  sec_einer  :  IN std_logic_vector (9 DOWNTO 0);
8
9
    DIG0_SEG0  :  OUT std_logic;
10
    DIG0_SEG1  :  OUT std_logic;
11
    DIG0_SEG2  :  OUT std_logic;
12
    DIG0_SEG3  :  OUT std_logic;
13
    DIG0_SEG4  :  OUT std_logic;
14
    DIG0_SEG5  :  OUT std_logic;
15
    DIG0_SEG6  :  OUT std_logic;
16
    DIG0_SEG7  :  OUT std_logic;
17
18
    
19
  )
20
21
END sec_einer_to_DIG0
22
23
ARCHITECTURE looks_like OF dec_to_7SEG IS
24
25
BEGIN
26
  PROCESS  (sec_einer)
27
  BEGIN
28
    CASE sec_einer IS
29
      
30
      WHEN "0" => (DIG0_SEG0 <= "1" AND DIG0_SEG1 <= "1" AND DIG0_SEG2 <= "1" AND DIG0_SEG3 <= "1" AND
31
             DIG0_SEG4 <= "1" AND DIG0_SEG5 <= "1" AND DIG0_SEG6 <= "0" AND DIG0_SEG7 <= "0");
32
33
      WHEN "1" => (DIG0_SEG0 <= "1" AND DIG0_SEG1 <= "1" AND DIG0_SEG2 <= "1" AND DIG0_SEG3 <= "1" AND
34
             DIG0_SEG4 <= "1" AND DIG0_SEG5 <= "1" AND DIG0_SEG6 <= "0" AND DIG0_SEG7 <= "0");
35
36
      WHEN "2" => (DIG0_SEG0 <= "1" AND DIG0_SEG1 <= "1" AND DIG0_SEG2 <= "1" AND DIG0_SEG3 <= "1" AND
37
             DIG0_SEG4 <= "1" AND DIG0_SEG5 <= "1" AND DIG0_SEG6 <= "0" AND DIG0_SEG7 <= "0");
38
39
      WHEN "3" => (DIG0_SEG0 <= "1" AND DIG0_SEG1 <= "1" AND DIG0_SEG2 <= "1" AND DIG0_SEG3 <= "1" AND
40
             DIG0_SEG4 <= "1" AND DIG0_SEG5 <= "1" AND DIG0_SEG6 <= "0" AND DIG0_SEG7 <= "0");
41
42
      WHEN "4" => (DIG0_SEG0 <= "1" AND DIG0_SEG1 <= "1" AND DIG0_SEG2 <= "1" AND DIG0_SEG3 <= "1" AND
43
             DIG0_SEG4 <= "1" AND DIG0_SEG5 <= "1" AND DIG0_SEG6 <= "0" AND DIG0_SEG7 <= "0");
44
45
      WHEN "5" => (DIG0_SEG0 <= "1" AND DIG0_SEG1 <= "1" AND DIG0_SEG2 <= "1" AND DIG0_SEG3 <= "1" AND
46
             DIG0_SEG4 <= "1" AND DIG0_SEG5 <= "1" AND DIG0_SEG6 <= "0" AND DIG0_SEG7 <= "0");
47
      
48
      WHEN "6" => (DIG0_SEG0 <= "1" AND DIG0_SEG1 <= "1" AND DIG0_SEG2 <= "1" AND DIG0_SEG3 <= "1" AND
49
             DIG0_SEG4 <= "1" AND DIG0_SEG5 <= "1" AND DIG0_SEG6 <= "0" AND DIG0_SEG7 <= "0");
50
51
      WHEN "7" => (DIG0_SEG0 <= "1" AND DIG0_SEG1 <= "1" AND DIG0_SEG2 <= "1" AND DIG0_SEG3 <= "1" AND
52
             DIG0_SEG4 <= "1" AND DIG0_SEG5 <= "1" AND DIG0_SEG6 <= "0" AND DIG0_SEG7 <= "0");
53
54
      WHEN "8" => (DIG0_SEG0 <= "1" AND DIG0_SEG1 <= "1" AND DIG0_SEG2 <= "1" AND DIG0_SEG3 <= "1" AND
55
             DIG0_SEG4 <= "1" AND DIG0_SEG5 <= "1" AND DIG0_SEG6 <= "0" AND DIG0_SEG7 <= "0");
56
57
      WHEN "9" => (DIG0_SEG0 <= "1" AND DIG0_SEG1 <= "1" AND DIG0_SEG2 <= "1" AND DIG0_SEG3 <= "1" AND
58
             DIG0_SEG4 <= "1" AND DIG0_SEG5 <= "1" AND DIG0_SEG6 <= "0" AND DIG0_SEG7 <= "0");
59
    
60
    END CASE;
61
62
  END PROCESS;
63
END looks_like;

von Lucky L. (rantanplan)


Lesenswert?

Sorry, hatte vergessen die bits an die Zahlen anzupassen.
Hab das natürlich nachgeholt.

von Mathi (Gast)


Lesenswert?

Das kann so nicht funzen. Es fehlen einige Kommas. Deine architecture 
bezieht sich nicht auf Deine Entity.
Muss so sein:
1
ARCHITECTURE looks_like OF sec_einer_to_DIG0 IS

Ich weiß gerade auch nicht ob das mit den AND's funktioniert. 
Prinzipiell kannst Du die einfach sequentiell hinschreiben:
1
WHEN "0" => DIG0_SEG0 <= "1";
2
            DIG0_SEG1 <= "1";
3
            DIG0_SEG2 <= "1";
4
            DIG0_SEG3 <= "1";
5
            DIG0_SEG4 <= "1";
6
            DIG0_SEG5 <= "1";
7
            DIG0_SEG6 <= "0"; 
8
            DIG0_SEG7 <= "0");

Schöner wäre es allerdings wenn Du dir nen Ausgangsvektor in der entity 
definierst und der Werte zuweist.
1
ENTITY sec_einer_to_DIG0 IS
2
  PORT
3
  (  sec_einer  :  IN std_logic_vector (9 DOWNTO 0);
4
5
    DIG_SEC : OUT std_logic_vector(7 downto 0);
6
  );
7
END sec_einer_to_DIG0;
8
9
architecture 
10
...
11
...
12
13
WHEN "0" => DIG0_SEG <= "11111100"

von Mathi (Gast)


Lesenswert?

Ach ne... Keine Kommas, sondern Semikolons. ;)

von Lucky L. (rantanplan)


Lesenswert?

Danke das sich die entity nicht auf die architecture bezieht wäre mir 
nicht aufgefallen.
Einen Ausgangsvektor wollte ich am Anfang auch schon machen, hab mir 
dann aber gedacht das ich es ohne Vektor übersichtlicher ist.

Das ganze soll mal eine Uhr werden. Ist es da möglich die dezimal zu 
7-Segment "Codewanlder" in einer Art "Funktion" zu realisieren. Damit 
ich nicht für jede der sechs Ziffer der Uhr so einen Block schreiben 
muss.

Hab mir da auch schon gedanken darüber gemacht aber es heißt ja immer 
VHDL ist keine "echte Programmiersprache". Deshlab bin ich zu dem Schluß 
gekommen das es nicht funktionieren wird.

von Falk B. (falk)


Lesenswert?

@ Andreas G........ (rantanplan)

>Könnte das so funktionieren?

Prinzipiell ja, aber die Umsetzung ist alles andere als lesbar.
Besser so.
1
LIBRARY ieee;
2
USE iee.std_logic_1164.all
3
4
ENTITY sec_einer_to_DIG0 IS
5
6
  PORT
7
  (  sec_einer  :  IN std_logic_vector (9 DOWNTO 0);
8
     DIG0_SEG  :  OUT std_logic_vector (7 DOWNTO 0)
9
  )
10
11
END sec_einer_to_DIG0
12
13
ARCHITECTURE looks_like OF dec_to_7SEG IS
14
15
BEGIN
16
  PROCESS  (sec_einer)
17
  BEGIN
18
    CASE sec_einer IS
19
      when "000000000" => "10101010101";
20
      when "000000001" => "11111111111";
21
      -- weitere Codierungen einfügen
22
      when others => "10101010101";      
23
    END CASE;
24
25
  END PROCESS;
26
END looks_like;

MFG
Falk

von Mathi (Gast)


Lesenswert?

Klar kann man das auch in eine Funktion schreiben. Aber Du hast ja auch 
schon den dekoder. Den kannst Du auch für jede Ziffer im Toplevel 
instanziieren.

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.