Frage:
Anzeige einer zweistelligen Ganzzahl auf zwei 7-Segment-Anzeigen
John Smith
2013-04-05 20:04:05 UTC
view on stackexchange narkive permalink

Ich habe Probleme beim Anzeigen einer Binärzahl in einer Anzeige. Ich bin mir nicht sicher, wie ich eine binäre Zahl in ihre einzelnen Zahlen aufteilen soll.

Wenn ich beispielsweise 25 anzeigen möchte, möchte ich diese in binäre Zahlen in "2" und "5" aufteilen . Ich habe 8 Bits und möchte es in zwei 4-Bit-Teile aufteilen, wobei die ersten 4 Bits die erste Ziffer in Binär und die zweiten 4 Bits die zweite Ziffer in Binär darstellen.

BEARBEITEN: Zur Verdeutlichung versuche ich dies mithilfe von Logikgattern.

Welche Programmiersprache verwenden Sie? Oder verwenden Sie kein Mikro und suchen nach einer Lösung für Logikgatter?
Ich suche nach einer Logikgatterlösung.
Möchten Sie dies mithilfe einer tatsächlich diskreten Logik oder durch Entwerfen in Verilog oder VHDL tun?
Ich benutze Logisim, aber eine allgemeine Darstellung wäre auch in Ordnung, denke ich.
Fünf antworten:
shuckc
2013-04-05 20:30:32 UTC
view on stackexchange narkive permalink

Die Double-Dabble -Technik konvertiert Binärdaten durch wiederholtes Verschieben in BCD. Jede Wiederholung halbiert die verbleibende Binärzahl und verdoppelt die BCD-Zahl. Nachdem der vollständige Binärwert verschoben wurde, wird das Ergebnis erhalten. Nach jeder Verschiebung wird eine Korrektur auf jede 4-Bit-BCD-Spalte angewendet (oder auf solche mit mehr als 3 Bits, die um diesen Punkt verschoben wurden). Diese Korrektur sucht nach Ziffern, bei denen die Dezimalzahl 9 -> 10 bei der nächsten Schicht überläuft, und korrigiert das Ergebnis durch Hinzufügen von drei .

Warum drei? BCD-Ziffern im Bereich von null bis vier (0,1,2,4) verdoppeln sich nach der Verschiebung auf natürliche Weise auf 0,2,4,8. Wenn Sie 5 b 0101 untersuchen, wird dies zu b 1010 (0xA) verschoben, was keine BCD-Ziffer ist. 5 wird daher auf (3 + 5) korrigiert, dh b 1000 (0x8), was sich während der Verschiebung auf 16 Dezimalstellen (0x10) verdoppelt, was einen Übertrag von 1 zur nächsten Ziffer und der erwarteten Null darstellt.

Implementierungen wiederholen diesen Vorgang entweder zeitlich synchron unter Verwendung eines Schieberegisters und von 'n' Zyklen für einen n-Bit-Eingang oder im Raum, indem sie die Logikschaltungen für die Korrektur platzieren, die sich gegenseitig speisen und die Verschiebung durchführen mit Verkabelung. Es gibt einen Übertragspfad durch jede Ziffer, und die Übertragslogik ist nicht für die FPGA-Übertragungskettenlogik (binär) geeignet, sodass die Raumimplementierung im Allgemeinen inakzeptable Zeitsteuerungsergebnisse für große Eingaben liefert. Ein typischer technischer Kompromiss.

Für eine parallele (asynchrone) Konvertierung

Für enge Werte wie Ihren Dr. Auf der Website von John Loomis finden Sie eine Anleitung zur Logikstruktur, die für die Implementierung in Hardware erforderlich ist. Moderne umprogrammierbare Logik kann nach aggressiver Synthese eine Breite von 8 Bit bis zu 100 MHz erreichen. Das Modul add3 nimmt eine 4-Bit-Eingabe und gibt sie wörtlich aus, oder wenn mehr als vier, fügt es drei hinzu:

  Modul add3 (in, out); input [ 3: 0] in; Ausgabe [3: 0] out; reg [3: 0] out; immer @ (in) case (in) 4'b0000: out < = 4'b0000; // 0 -> 0 4'b0001: out < = 4'b0001;
4'b0010: out < = 4'b0010; 4'b0011: out < = 4'b0011; 4'b0100: out < = 4'b0100; // 4 -> 4 4'b0101: out < = 4'b1000; // 5 -> 8 4'b0110: out < = 4'b1001; 4'b0111: out < = 4'b1010; 4'b1000: out < = 4'b1011; 4'b1001: out < = 4'b1100; // 9 -> 12 default: out < = 4'b0000; endcaseendmodule  

Die Kombination dieser Module ergibt die Ausgabe. modules together

Für eine sequentielle Variante (mit mehreren Zyklen, Pipeline)

Für Wide signalisiert eine serielle Technik, die in Xlinx App Note "XAPP 029" beschrieben ist und 1 Bit pro Zyklus ausführt, wahrscheinlich mit 300 MHz +.

Wenn jemand eine gute Hybridtechnik kennt, wäre ich interessiert es zu wissen. Ich habe beide in Verilog mit Prüfständen in meiner verilog-utils -Sammlung modelliert.

Ich mag den Xilinx-Ansatz. Es ist einfach und ermöglicht kompakten (wenn auch nicht unbedingt schnellen) Code auf Mikroprozessoren, der Anweisungen für die BCD-Arithmetik enthält. Wenn man wirklich keine Geschwindigkeit benötigt, kann der Xilinx-Ansatz angepasst werden, um lange Dezimalausgaben mit einer einzelnen 4-Bit-BCD-Einheit zusammen mit einer Reihe von Schieberegistern zu erzeugen. Für eine zweistellige Nummer ist das natürlich nicht wirklich notwendig.
Rocketmagnet
2013-04-05 20:18:35 UTC
view on stackexchange narkive permalink

Was Sie tun möchten, wird als Konvertierung in Binary Coded Decimal bezeichnet. Einige Computer verfügen über spezielle Anweisungen, die bei der Konvertierung von und zu BCD sowie bei der Addition und Subtraktion helfen. Dies ist jedoch für Sie nicht relevant.

Der einfachste Weg, Ihre 8-Bit-Zahl in zwei 4-Bit-Zahlen umzuwandeln, besteht darin, sie in Potenzen von 10 zu verarbeiten.

Die while-Schleife dort implementiert im Grunde eine Divisionsoperation . Eine andere Möglichkeit, diese Funktion zu implementieren, ist:

  vorzeichenloses Zeichen acht_bit_to_two_four_bit (vorzeichenloser Zeichenwert) {vorzeichenloses Zeichenergebnis = 0; Ergebnis = (Wert / 10) << 4; Ergebnis + = (Wert% 10); Ergebnis zurückgeben;}  

Dies verwendet tatsächlich zwei Divisionsoperationen. Teuer! Stattdessen können wir eine der Teilungen durch Multiplizieren und Subtrahieren ersetzen.

  vorzeichenloses Zeichen acht_bit_to_two_four_bit (vorzeichenloses Zeichenwert) {vorzeichenloses Zeichenergebnis = 0; Ergebnis = (Wert / 10) << 4; Ergebnis + = (Wert - Ergebnis * 10); Ergebnis zurückgeben;}  

Die Tatsache, dass diese Funktion mit Teilungen implementiert ist, macht es wahrscheinlich schwierig, sie mit kombinatorischer Logik zu implementieren. Um dies in reiner Logik zu tun, ist es wahrscheinlich der beste Ansatz, die erste Funktion zu implementieren.

Das würde ich auch tun. Schade [er sucht nach einer Logikgatterlösung] (http://electronics.stackexchange.com/questions/64538/displaying-a-2-digit-integer-on-two-7-segment-display?noredirect=1# comment123400_64538) ...
Entschuldigung, ich verstehe, wie man das logisch macht, bin mir aber nicht sicher, wie man es mit Logikgattern macht.
@YamatoC - Es ist der gleiche Algorithmus, wenn Sie Logikgatter verwenden möchten. Sie müssen Divisions- und Modulo-Operationen in Ihrer Logik implementieren. Dies sind etwas komplexe Berechnungen, aber wenn Sie nach Divisionsalgorithmen suchen, sollten Sie in der Lage sein, etwas zu finden, das implementierbar ist.
mjh2007
2013-04-05 20:39:07 UTC
view on stackexchange narkive permalink

Suchen Sie einen Binär-BCD-Konverter wie den 74185?

Wenn nicht, gibt es auf Wikipedia eine Liste der Logikchips der Serie 7400 Sie könnten durchsehen und finden, was Sie brauchen.

xyzio
2013-04-05 20:36:38 UTC
view on stackexchange narkive permalink

Eine Logikgatterlösung ist mithilfe einer Wahrheitstabelle und Karnaugh-Karten einfach. Die Wahrheitstabelle hat den Binärwert als Eingabe und den gewünschten BCD-Wert für die Ausgabe.

Ihre Wahrheitstabelle sollte folgendermaßen aussehen:

  a0 a1 a2 a3 | b6 b5 b4 b3 b2 b1 b0 <br>0 0 0 0 | 0 0 0 0 0 0 00 0 0 1 | 7-Seg-Ausgabe für 10 0 1 0 | 7-Seg-Ausgabe für 2 usw.  

Konvertieren Sie dann die Wahrheitstabelle in Karnaugh-Karten (K-Karten) und lösen Sie nach b6, b5 ... b0. Nehmen Sie die resultierenden Gleichungen und implementieren Sie sie mithilfe von Logikgattern.

Informationen zu K-Maps: http://en.wikipedia.org/wiki/Karnaugh_map

Und hier ist eine Lösung, die eine ähnliche Ausführung mit Nand-Gates durchläuft: http://circuitscan.homestead.com/files/digelec/bcdto7seg.htm

Bearbeiten: Aus dem Kommentare: Wenn Ihre 4-Bit-Zahl nicht unbedingt eine BCD darstellt, dh über 9 hinausgeht, würde ich die Gleichung direkt aus der Wahrheitstabelle ableiten. So zum Beispiel für diesen Eintrag in der Wahrheitstabelle:

  a0 a1 a2 a3 | output0 1 0 1 | 0 1 1 0 1 1 0  

Ihre Gleichung für das erste Bit (0) lautet a0 + a1 (Balken) + a2 + a3 (Balken), das zweite Bit (1) ist a0 ( bar) + a1 + a2 (bar) + a3 und so weiter. Das Implementieren dieser Gleichung in Logikgattern ist unkompliziert.

Bearbeiten2: Viele dieser Gleichungen überlappen sich und Sie können sie nach der Generierung weiter vereinfachen.

Für eine 2 (dezimal!) Ziffernzahl ist das eine ziemlich große Wahrheitstabelle.
Die Wahrheitstabelle muss für eine 4-Bit-Eingabe nur einmal berechnet werden. Die gleichen Gleichungen gelten für die 2. 4-Bit-Zahl.
Die Eingabe ist tatsächlich 7 Bit, nicht 4 Bit. Der Eingabebereich ist [0..99], was 7-Bit-Speicher erfordert.
@xyzio Nein, die Wahrheitstabelle hängt von 4 Bits + BCD-Übertrag von der vorherigen Ziffer ab
Ah, ich habe die Frage wörtlich gelesen, wobei 4 Bits = 1 BCD-Ziffer sind, was impliziert, dass die 4 Bits nur Werte bis 9 enthalten. Wenn dies der Fall ist, würde ich betrügen und direkte Gleichungen aus der Wahrheitstabelle ableiten. 7-stellige k-map ist unhandlich.
Phil Wright
2016-11-10 11:00:52 UTC
view on stackexchange narkive permalink

Wenn Sie die Schaltung so einfach wie möglich gestalten möchten, würde ich empfehlen, statt dezimal anzuzeigen, hexadezimal zu verwenden.In diesem Fall zeigt jede 7-Segment-Anzeige einen Wert von 0 bis 15 an, wobei die Zahlen 10, 11, 12, 13, 14 und 15 als A, B, C, D, E und F angezeigt werden. Dann benötigen Sie nur zwei MC14495-ICsum jeden 4-Bit-Wert in seine 7-Segment-Anzeigeausgänge umzuwandeln.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...