Forum: FPGA, VHDL & Co. 7Seg. Decoder in ABEL


von Tobe (Gast)


Lesenswert?

Hallo zusammen,

ich habe in ABEL einen 7Seg-Decoder angepasst, um ihn im Lattice ISP 
Lever zu verwenden.

Funktioniert einwandfrei, bis auf den Schönheitsfehler, dass bei 
Ansteuerung mit Adresse 0 auch "0" angezeigt wird. Da aber bei Adresse 0 
angefangen wird zu zählen, soll hier eine "1" auf der Anzeige 
erscheinen.

Nochmal: Adresse 0..15 => Anzeige 1..16

Wie ändere ich das im beiliegenden Code ab??

Danke!

Tobe
1
module  bcd7_2seg  
2
title 'seven segment display decoder'
3
4
" angepasst auf ein Ausgabe a-g und einer Ansteuerung für
5
" LowerSegment und HigherSegment
6
7
" The 5 -bit binary (0 - 64) score is converted into two BCD outputs.
8
" The integer division '/' and the modulus operator '%' are used to
9
" extract the individual digits from the two digit score.
10
" 'Score % 10' will yield the 'units' and
11
" 'Score / 10' will yield the 'tens'
12
"
13
" Achtung: Inverse Logik !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
14
15
16
"          a       
17
"         ---       
18
"       f| g |b
19
"         ---           
20
"       e| d |c
21
"         ---
22
23
  " Zwischengrössen
24
  V7..V0 node; 
25
26
  EN,S5..S0,Clock    pin; "Steuereingänge
27
//  Er      pin; // Fehlerausgang
28
        
29
  a,b,c,d,e,f,g     pin istype 'com'; "7Seg.Ausgänge Einer
30
  Seg      pin istype 'com';
31
  
32
  Zahl=[S5..S0];
33
  
34
35
  bcd1  =[V3..V0];
36
  bcd2  =[V7..V4];
37
38
        ON,OFF  = 0,1;                  " for common anode LEDs 
39
        L,H,X,Z = 0,1,.X.,.Z.;
40
41
   binary          = 0;            "scratch variable
42
   clear   macro (a) {@const ?a=0};
43
   inc     macro (a) {@const ?a=?a+1;};
44
45
46
equations  
47
  when !EN&Clock then   Seg=ON        
48
  else  when !EN&!Clock then   Seg=OFF;
49
  
50
51
52
53
@dcset
54
55
truth_table ( Zahl2 -> [bcd2,bcd1])
56
    clear(binary);
57
         @repeat 64 {binary -> [binary/10,binary%10]; inc(binary);}
58
59
truth_table ([bcd2,bcd1,Seg] -> [ a ,  b ,  c ,  d,  e ,  f ,  g ])
60
              [X,0,ON]  -> [ ON,  ON,  ON,  ON,  ON,  ON, OFF];"
61
              [X,1,ON]  -> [OFF,  ON,  ON, OFF, OFF, OFF, OFF];
62
              [X,2,ON]  -> [ ON,  ON, OFF,  ON,  ON, OFF,  ON];
63
              [X,3,ON]  -> [ ON,  ON,  ON,  ON, OFF, OFF,  ON];
64
              [X,4,ON]  -> [OFF,  ON,  ON, OFF, OFF,  ON,  ON];
65
              [X,5,ON]  -> [ ON, OFF,  ON,  ON, OFF,  ON,  ON];
66
              [X,6,ON]  -> [ ON, OFF,  ON,  ON,  ON,  ON,  ON];
67
              [X,7,ON]  -> [ ON,  ON,  ON, OFF, OFF, OFF, OFF];
68
              [X,8,ON]  -> [ ON,  ON,  ON,  ON,  ON,  ON,  ON];
69
              [X,9,ON]  -> [ ON,  ON,  ON,  ON, OFF,  ON,  ON];
70
              [0,X,OFF]  -> [ OFF,  OFF,  OFF,  OFF,  OFF,  OFF, OFF]; "führende Nullen aus
71
              [1,X,OFF]  -> [OFF,  ON,  ON, OFF, OFF, OFF, OFF];
72
              [2,X,OFF]  -> [ ON,  ON, OFF,  ON,  ON, OFF,  ON];
73
              [3,X,OFF]  -> [ ON,  ON,  ON,  ON, OFF, OFF,  ON];
74
              [4,X,OFF]  -> [OFF,  ON,  ON, OFF, OFF,  ON,  ON];
75
              [5,X,OFF]  -> [ ON, OFF,  ON,  ON, OFF,  ON,  ON];
76
              [6,X,OFF]  -> [ ON, OFF,  ON,  ON,  ON,  ON,  ON];
77
              [7,X,OFF]  -> [ ON,  ON,  ON, OFF, OFF, OFF, OFF];
78
              [8,X,OFF]  -> [ ON,  ON,  ON,  ON,  ON,  ON,  ON];
79
              [9,X,OFF]  -> [ ON,  ON,  ON,  ON, OFF,  ON,  ON];
80
81
end

von Falk B. (falk)


Lesenswert?

@ Tobe (Gast)

>Nochmal: Adresse 0..15 => Anzeige 1..16

>Wie ändere ich das im beiliegenden Code ab??

Wenn du nicht mal soviel Verständnis für ABEL hast und nur copy & paste 
betreibest, sehe ich für weitere Problemlösungen schwarz.

Du musst die beiden Tabellen um eine Zeile verschieben. 1->0, 2->1 ... 
0->9

MfG
Falk

von Timo (Gast)


Lesenswert?

@Falk

Leider stimmt das so nicht! Problematisch ist der Übergang auf 10*x, da 
stimmt die Zehnerstelle nicht..

von Falk B. (falk)


Lesenswert?

@ Timo (Gast)

>Leider stimmt das so nicht! Problematisch ist der Übergang auf 10*x, da
>stimmt die Zehnerstelle nicht..

Man muss die Tabelle als zwei Tabellen betrachten, schliesslich ist ja 
ein Einagng mit X definiert. Dann passt das schon. Einfach mla 
hinschreiben.

So sollte es geben

1
truth_table ([bcd2,bcd1,Seg] -> [ a ,  b ,  c ,  d,  e ,  f ,  g ])
2
              [X,0,ON]   -> [OFF,  ON,  ON, OFF, OFF, OFF, OFF];   "1
3
              [X,1,ON]   -> [ ON,  ON, OFF,  ON,  ON, OFF,  ON];
4
              [X,2,ON]   -> [ ON,  ON,  ON,  ON, OFF, OFF,  ON];
5
              [X,3,ON]   -> [OFF,  ON,  ON, OFF, OFF,  ON,  ON];
6
              [X,4,ON]   -> [ ON, OFF,  ON,  ON, OFF,  ON,  ON];
7
              [X,5,ON]   -> [ ON, OFF,  ON,  ON,  ON,  ON,  ON];
8
              [X,6,ON]   -> [ ON,  ON,  ON, OFF, OFF, OFF, OFF];
9
              [X,7,ON]   -> [ ON,  ON,  ON,  ON,  ON,  ON,  ON];
10
              [X,8,ON]   -> [ ON,  ON,  ON,  ON, OFF,  ON,  ON];   "9
11
              [X,9,ON]   -> [ ON,  ON,  ON,  ON,  ON,  ON, OFF];   "10  
12
13
              [0,X,OFF]  -> [OFF,  ON,  ON, OFF, OFF, OFF, OFF]; " 11
14
              [1,X,OFF]  -> [ ON,  ON, OFF,  ON,  ON, OFF,  ON];
15
              [2,X,OFF]  -> [ ON,  ON,  ON,  ON, OFF, OFF,  ON];
16
              [3,X,OFF]  -> [OFF,  ON,  ON, OFF, OFF,  ON,  ON];
17
              [4,X,OFF]  -> [ ON, OFF,  ON,  ON, OFF,  ON,  ON];
18
              [5,X,OFF]  -> [ ON, OFF,  ON,  ON,  ON,  ON,  ON];
19
              [6,X,OFF]  -> [ ON,  ON,  ON, OFF, OFF, OFF, OFF];
20
              [7,X,OFF]  -> [ ON,  ON,  ON,  ON,  ON,  ON,  ON];
21
              [8,X,OFF]  -> [ ON,  ON,  ON,  ON, OFF,  ON,  ON]; "19
22
              [9,X,OFF]  -> [ OFF,  OFF,  OFF,  OFF,  OFF,  OFF, OFF];
23
end

MfG
Falk

von Timo (Gast)


Lesenswert?

@Tobe

Sehe ich das richtig, dass Du zwei Dezimalstellen anzeigst und "Seg" ein 
Ausgang ist, der auf die ein oder andere Anzeige schaltet??

@ Falk

wenn ich recht habe, würdest Du damit bei 00 eine 11 anzeigen.

von Falk B. (falk)


Lesenswert?

@ Timo (Gast)

>wenn ich recht habe, würdest Du damit bei 00 eine 11 anzeigen.

Hmmm, stimmt. Das wird alles recht verkorkst. Da gibt es zwei Lösungen.

- Eine neue Tabelle schreiben, die aus einem 4 Bit HEX-Wert (kein BCD) 
die Zahlen 1..16 dekodiert.

- den Eingangswert mittels Addierer um 1 erhöhen und dann ausgeben

MfG
Falk

von Timo (Gast)


Lesenswert?

mir scheint die Addiererlösung am saubersten.
Ich habe von ABEL selbst keine Ahnung, aber ich vermute per equation 
wird um 1 hochgezählt.
ich tippe mal in der Art

  MyZahl=[V19..V15]    ' neue Variablen schaffen

equations
  MyZahl=Zahl+1


Könnte das so gehen?

von Rick Dangerus (Gast)


Lesenswert?

Oder noch eleganter: Ein extra enable-Eingang.

Rick

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.