www.mikrocontroller.net

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


Autor: Tobe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
module  bcd7_2seg  
title 'seven segment display decoder'

" angepasst auf ein Ausgabe a-g und einer Ansteuerung für
" LowerSegment und HigherSegment

" The 5 -bit binary (0 - 64) score is converted into two BCD outputs.
" The integer division '/' and the modulus operator '%' are used to
" extract the individual digits from the two digit score.
" 'Score % 10' will yield the 'units' and
" 'Score / 10' will yield the 'tens'
"
" Achtung: Inverse Logik !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1


"          a       
"         ---       
"       f| g |b
"         ---           
"       e| d |c
"         ---

  " Zwischengrössen
  V7..V0 node; 

  EN,S5..S0,Clock    pin; "Steuereingänge
//  Er      pin; // Fehlerausgang
        
  a,b,c,d,e,f,g     pin istype 'com'; "7Seg.Ausgänge Einer
  Seg      pin istype 'com';
  
  Zahl=[S5..S0];
  

  bcd1  =[V3..V0];
  bcd2  =[V7..V4];

        ON,OFF  = 0,1;                  " for common anode LEDs 
        L,H,X,Z = 0,1,.X.,.Z.;

   binary          = 0;            "scratch variable
   clear   macro (a) {@const ?a=0};
   inc     macro (a) {@const ?a=?a+1;};


equations  
  when !EN&Clock then   Seg=ON        
  else  when !EN&!Clock then   Seg=OFF;
  



@dcset

truth_table ( Zahl2 -> [bcd2,bcd1])
    clear(binary);
         @repeat 64 {binary -> [binary/10,binary%10]; inc(binary);}

truth_table ([bcd2,bcd1,Seg] -> [ a ,  b ,  c ,  d,  e ,  f ,  g ])
              [X,0,ON]  -> [ ON,  ON,  ON,  ON,  ON,  ON, OFF];"
              [X,1,ON]  -> [OFF,  ON,  ON, OFF, OFF, OFF, OFF];
              [X,2,ON]  -> [ ON,  ON, OFF,  ON,  ON, OFF,  ON];
              [X,3,ON]  -> [ ON,  ON,  ON,  ON, OFF, OFF,  ON];
              [X,4,ON]  -> [OFF,  ON,  ON, OFF, OFF,  ON,  ON];
              [X,5,ON]  -> [ ON, OFF,  ON,  ON, OFF,  ON,  ON];
              [X,6,ON]  -> [ ON, OFF,  ON,  ON,  ON,  ON,  ON];
              [X,7,ON]  -> [ ON,  ON,  ON, OFF, OFF, OFF, OFF];
              [X,8,ON]  -> [ ON,  ON,  ON,  ON,  ON,  ON,  ON];
              [X,9,ON]  -> [ ON,  ON,  ON,  ON, OFF,  ON,  ON];
              [0,X,OFF]  -> [ OFF,  OFF,  OFF,  OFF,  OFF,  OFF, OFF]; "führende Nullen aus
              [1,X,OFF]  -> [OFF,  ON,  ON, OFF, OFF, OFF, OFF];
              [2,X,OFF]  -> [ ON,  ON, OFF,  ON,  ON, OFF,  ON];
              [3,X,OFF]  -> [ ON,  ON,  ON,  ON, OFF, OFF,  ON];
              [4,X,OFF]  -> [OFF,  ON,  ON, OFF, OFF,  ON,  ON];
              [5,X,OFF]  -> [ ON, OFF,  ON,  ON, OFF,  ON,  ON];
              [6,X,OFF]  -> [ ON, OFF,  ON,  ON,  ON,  ON,  ON];
              [7,X,OFF]  -> [ ON,  ON,  ON, OFF, OFF, OFF, OFF];
              [8,X,OFF]  -> [ ON,  ON,  ON,  ON,  ON,  ON,  ON];
              [9,X,OFF]  -> [ ON,  ON,  ON,  ON, OFF,  ON,  ON];

end 

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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



truth_table ([bcd2,bcd1,Seg] -> [ a ,  b ,  c ,  d,  e ,  f ,  g ])
              [X,0,ON]   -> [OFF,  ON,  ON, OFF, OFF, OFF, OFF];   "1
              [X,1,ON]   -> [ ON,  ON, OFF,  ON,  ON, OFF,  ON];
              [X,2,ON]   -> [ ON,  ON,  ON,  ON, OFF, OFF,  ON];
              [X,3,ON]   -> [OFF,  ON,  ON, OFF, OFF,  ON,  ON];
              [X,4,ON]   -> [ ON, OFF,  ON,  ON, OFF,  ON,  ON];
              [X,5,ON]   -> [ ON, OFF,  ON,  ON,  ON,  ON,  ON];
              [X,6,ON]   -> [ ON,  ON,  ON, OFF, OFF, OFF, OFF];
              [X,7,ON]   -> [ ON,  ON,  ON,  ON,  ON,  ON,  ON];
              [X,8,ON]   -> [ ON,  ON,  ON,  ON, OFF,  ON,  ON];   "9
              [X,9,ON]   -> [ ON,  ON,  ON,  ON,  ON,  ON, OFF];   "10  

              [0,X,OFF]  -> [OFF,  ON,  ON, OFF, OFF, OFF, OFF]; " 11
              [1,X,OFF]  -> [ ON,  ON, OFF,  ON,  ON, OFF,  ON];
              [2,X,OFF]  -> [ ON,  ON,  ON,  ON, OFF, OFF,  ON];
              [3,X,OFF]  -> [OFF,  ON,  ON, OFF, OFF,  ON,  ON];
              [4,X,OFF]  -> [ ON, OFF,  ON,  ON, OFF,  ON,  ON];
              [5,X,OFF]  -> [ ON, OFF,  ON,  ON,  ON,  ON,  ON];
              [6,X,OFF]  -> [ ON,  ON,  ON, OFF, OFF, OFF, OFF];
              [7,X,OFF]  -> [ ON,  ON,  ON,  ON,  ON,  ON,  ON];
              [8,X,OFF]  -> [ ON,  ON,  ON,  ON, OFF,  ON,  ON]; "19
              [9,X,OFF]  -> [ OFF,  OFF,  OFF,  OFF,  OFF,  OFF, OFF];
end 

MfG
Falk

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder noch eleganter: Ein extra enable-Eingang.

Rick

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.