__ _ __ _ / /___ ____ _(_)____ ____ ___ ____ _____/ /_ (_)___ ___ / / __ \/ __ `/ / ___/ / __ `__ \/ __ `/ ___/ __ \/ / __ \/ _ \ / / /_/ / /_/ / / /__ / / / / / / /_/ / /__/ / / / / / / / __/ /_/\____/\__, /_/\___/ /_/ /_/ /_/\__,_/\___/_/ /_/_/_/ /_/ \___/ /____/Digitalelektronik Version 1.0.1b Die LogicMachine ist ein Interpreter fuer boolsche Terme mit bis zu 4 physikalischen Eingaengen A, B, C, D. Es ist am ehesten vergleichbar mit einem sehr vereinfachten generischen Logicarray (GAL) und soll in erster Linie zum Lernen und besseren Verstaendnis fuer Digitalelektronik dienen und ist somit fuer Auszubildende geeignet. Grundsaetzlich jedoch kann die LogicMachine jedoch auch in einer Schaltung als digitaler Baustein verwendet werden. Die Verarbeitungsgeschwindigkeit ist jedoch noch nicht einmal im Ansatz mit einem GAL oder einem FPGA vergleichbar, die LogicMachine verarbeitet hier nur im fuenfstelligen Kilohertzbereich. Erreichbare logische Schaltungen: - boolsche Algebra - D-FlipFlop - Zaehler (asynchron intern, synchron mit externem Takt) - Anzeige Decoder eines Wuerfels - Wuerfel grundsaetzlich - 7-Segment Decoder - digitaler Multiplexer - 2 Bit Addierer Grundsaetzlich ist der Kreativitaet hier freien Lauf gelassen. Mit der LogicMachine kann eine extrem preiswerte Schaltung hierfuer aufgebaut werden, an zusaetzlicher Software zur Benutzung, Konfiguration und Eingabe logischer Terme bedarf es lediglich eines Terminalprogramms wie bspw. PuTTY oder PicoCom. Jegliche Eingabe erfolgt hierueber mit einem Protokoll: 230400 bd / 8N1 Die LogicMachine sendet hierbei auch ESC-Sequenzen, wie sie bspw. in einer Linuxkonsole verarbeitet werden. Urspruenglich war die LogicMachine mit einem ATmega168 realisiert und wurde jetzt auf einen (wesentlich preiswerteren) CH32V003 portiert. Zur Steuerung, Kontrolle und Konfiguration der LogicMachine dient ein rudimentaeres Menu (welches im Mikrocontroller laeuft) und dessen Menupunkte durch das senden eines einzelnen Buchstabens aktiviert wird. Das Mainmenu beinhaltet folgende Punkte: ---------------------------------------------------------- [E]dit Term | [Z]eige Term | Zeige [T]abelle | [S]peichern | [L]aden | [F]lash loeschen | [C]onfig | [N]eu | [R]un | ---------------------------------------------------------- ----------------------------------------------------------------------------------- [E]dit Term ----------------------------------------------------------------------------------- Durch druecken der Taste 'e' gelangt man in den Termeditor. Hier kann ein boolscher Ausdruck fuer jeden der 8 Ausgaenge eingegeben werden. Hierbei kann auch ein Ergebnis eines Ausgang innerhalb des Terms verknuepft werden. Grundsaetzlich werden Leerzeichen ignoriert und aus dem Term geloescht. Da das Terminal im Textmodus arbeitet, gibt es folgende Bezeichner fuer die entsprechenden Verknuepfungen. ---------------- UND-Verknuepfung ---------------- Eine UND-Verknuepfung kann wahlweise durch ein '*', ein '&' oder eben durch das weglassen des Zeichens geschrieben werden. Beispiele fuer erlaubte Terme: q0 = a*b q1 = cd q2 = q1 * a q3 = a & c ----------------- ODER-Verknuepfung ----------------- Eine ODER-Verknuepfung wird durch das '+' oder ein '|' Zeichen eingegeben. Beispiele fuer erlaubten Terme: q0 = ab + c q1 = c | d ------------------ NICHT-Verknuepfung ------------------ Eine NICHT-Verknuepfung wird durch das '/' eingegeben. Beispiel fuer erlaubten Term: q0 = ab /cd ----------------------------------------------------------------------------------- [Z]eige Term ----------------------------------------------------------------------------------- Durch druecken der Taste 'z' werden alle eingegebenen Terme aufgelistet ----------------------------------------------------------------------------------- Zeige [T]abelle ----------------------------------------------------------------------------------- Durch druecken der Taste 't' werden alle eingegebenen Terme aufgelistet und zu- saetzlich die dazugehoerende Wahrheitstabelle: Q0= /a/b/c/d Q1= a/b/c/d Q2= /ab/c/d Q3= ab/c/d Q4= /a/bc/d Q5= a/bc/d Q6= /abc/d Q7= abc/d | Ausgaenge Qx | DCBA 0 1 2 3 4 5 6 7 ---------------------------------- 00 0000 1 . . . . . . . 01 0001 . 1 . . . . . . 02 0010 . . 1 . . . . . 03 0011 . . . 1 . . . . 04 0100 . . . . 1 . . . 05 0101 . . . . . 1 . . 06 0110 . . . . . . 1 . 07 0111 . . . . . . . 1 08 1000 . . . . . . . . 09 1001 . . . . . . . . 0A 1010 . . . . . . . . 0B 1011 . . . . . . . . 0C 1100 . . . . . . . . 0D 1101 . . . . . . . . 0E 1110 . . . . . . . . 0F 1111 . . . . . . . . ----------------------------------------------------------------------------------- Die Menupunkte [S]peichern | [L]aden | [F]lash loeschen | [N]eu ----------------------------------------------------------------------------------- Durch das Druecken der Tasten 's', 'l', 'f' werden die Terme und die Konfigurations- register im Flashspeicher abgelegt, aus diesem geladen oder der Flashspeicher geloescht (das Firmwareprogramm natuerlich nicht). Durch das Druecken der Taste 'n' werden die Terme sowie die Konfigurationsregister im Arbeitsspeicher geloescht, nicht jedoch im Flashspeicher ----------------------------------------------------------------------------------- [C]onfig ----------------------------------------------------------------------------------- Durch druecken der Taste 'c' gelangt man in das Konfigrationsmenu. Hier koennen Angaben darueber gemacht werden, ob Ein- oder Ausgaenge invertiert werden sollen oder ob ein Ausgang als sogenannter gepufferter Ausgang arbeiten soll. Zudem wird hier der interne Counter konfiguriert. Die entsprechenden Register sind: ----------------------------------------------------------------------------------- Output Invert Register: OIR ----------------------------------------------------------------------------------- Das OIR legt fest, ob das Ergebnis einer boolschen Logik am Ausgang invertiert werden soll oder nicht. OIR +---------+---------+---------+---------+---------+---------+---------+---------+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +---------+---------+---------+---------+---------+---------+---------+---------+ | inv.7 | inv.6 | inv.5 | inv.4 | inv.3 | inv.2 | inv.1 | inv.0 | +---------+---------+---------+---------+---------+---------+---------+---------+ inv.7 : inv.0 : 0 => das Ergebnis einer boolschen Logik wird am Ausgang nichtinvertierend ausgegeben 1 => das Ergenis wird am Ausgang invertiert ausgegeben ----------------------------------------------------------------------------------- Output Buffer Register: OBR ----------------------------------------------------------------------------------- Das OBR legt fest, ob das Ergebnis einer boolschen Logik direkt am ausgegeben wird, oder ob dieses in einem D-FlipFlop gepuffert wird. Im Falle eines Speicherns (puffern), wird das Ergebnis der boolschen Logik in das D-FlipFlop mit fallender Taktflanke an GPIO PD$ verwendet, das Ergebnis erscheint am Ausgang also erst mit dieser fallenden Taktflanke OBR +---------+---------+---------+---------+---------+---------+---------+---------+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +---------+---------+---------+---------+---------+---------+---------+---------+ | sto.7 | sto.6 | sto.5 | sto.4 | sto.3 | sto.2 | sto..1 | sto..0 | +---------+---------+---------+---------+---------+---------+---------+---------+ sto.7 : sto.0 : 1 => das Ergebnis einer boolschen Logik wird in einem D-FlipFlop gespeichert 0 => Ergebnis wird nicht gespeichert ----------------------------------------------------------------------------------- Input Invert Register: IIR ----------------------------------------------------------------------------------- Das IIR legt fest, ob die an den Eingaengen anliegenden Logikpegel dem Logikarray invertiert zugefuehrt werden sollen oder nicht. IIR +---------+---------+---------+---------+---------+---------+---------+---------+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +---------+---------+---------+---------+---------+---------+---------+---------+ | reserv | reserv | reserv | reserv | inp.d | inp.c | inp.b | inp.a | +---------+---------+---------+---------+---------+---------+---------+---------+ 7 : 4 : reserviert inp.d : inp.a : 0 => Der Eingang am GPIO wird nichtinvertiert dem Logikarray zugefuehrt 1 => Der Eingang wird dem Logikarray invertiert zugefuehrt ----------------------------------------------------------------------------------- Counter Set Register: CSR ----------------------------------------------------------------------------------- Mit Hilfe des CSR ist moeglich einen internen Zaehler zu nutzen, dessen Ausgaenge an die Eingaenge des Logicarrays angelegt werden. Zudem wird hier festgelegt, ob dieser Counter mittels einem internen oder externen Taktgebers mit einem Takt versorgt wird. Zudem beinhaltet das CSR den Resetwert, bei dessen Zaehlerstand der Zaehler auf 0 zurueck gesetzt wird. Soll der interne Zaehler aktiviert werden, so ist der Betrieb mit gepufferten Ausgaengen nicht moeglich. Der Wert in OBR muss dann 0x00 sein. CSR +---------+---------+---------+---------+---------+---------+---------+---------+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +---------+---------+---------+---------+---------+---------+---------+---------+ | cen | clkext | cmp.5 | cmp.4 | cmp.3 | cmp.2 | cmp.1 | cmp.0 | +---------+---------+---------+---------+---------+---------+---------+---------+ cen : 1 => Interner Zaehler verfuegbar, 0 => interner Zaehler nicht verfuegbar clkext : 1 => externer Takt an GPIO PD4 mit fallender Flanke wird verwendet 0 => interner Taktgenerator mit Coretakt 2 kHz und Taktteiler in CLCH:CLCL wird verwenet cmp.5 : cmp.0 : Vergleichswert (compare), bei erreichen dieses Wertes wird der interne Zaehler auf 0 zurueck gesetzt. Beinhaltet CLCH:CLCL den Wert 0, wird der Zaehler nie zurueck gesetzt und zaehlt von 0x00 bis 0x3F ----------------------------------------------------------------------------------- Der Taktteiler ClockCounterHigh:ClockCounterLow CLCH:CLCL ----------------------------------------------------------------------------------- Der Grundtakt des internen Taktgenerators betraegt 2 kHz. Dieser kann durch einen 16-Bit Wert in CLCH:CLCL geteilt werden. CLCH +---------+---------+---------+---------+---------+---------+---------+---------+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +---------+---------+---------+---------+---------+---------+---------+---------+ | div.15 | div.14 | div.13 | div.12 | div.11 | div.10 | div.9 | div.8 | +---------+---------+---------+---------+---------+---------+---------+---------+ CLCl +---------+---------+---------+---------+---------+---------+---------+---------+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +---------+---------+---------+---------+---------+---------+---------+---------+ | div.7 | div.6 | div.5 | div.4 | div.3 | div.2 | div.1 | div.0 | +---------+---------+---------+---------+---------+---------+---------+---------+ Beispiel: CLCH = 0x07, CLCL= 0xD0 Taktteiler ist 0x07D0, dieses entspricht 2000 dezimal. Der interne Zaehle wird mit 1 Hz betrieben ----------------------------------------------------------------------------------- [R]un ----------------------------------------------------------------------------------- Durch Druecken der Taste 'r' wird die LogicMachine gestartet, der Controller arbeitet nun die Terme entsprechend einer gemachten Konfiguration ab. Jede beliebige Taste beendet die Ausfuehrung. ------------------------------------------------------------------------------------ Pinbelegung der LogicMachine ------------------------------------------------------------------------------------ Ausgaenge: Q0 : PC0 Q1 : PC1 Q2 : PC2 Q3 : PC3 Q4 : PC4 Q5 : PC5 Q6 : PC6 Q7 : PC7 Clockout : PD2 (waehrend der Laufzeit der LogicMachine wird hier der Takt des internen Taktgebers ausgegeben) Eingaenge: A : PD3 B : PA1 C : PA2 D : PD0 term_enable: PD7 Auf PD7 liegt normalerweise der Resetanschluss des CH32V003. Will man diese Funktion nutzen, muss ueber die Optionbytes des CH32V03 der Resetanschluss als PD7 verfuegbar gemacht werden. Im gegensatz zu AVR-Controller ist ein Rueckgaengigmachen jederzeit moeglich. Wird term_enable genutzt so gilt folgende Logik: term_enable == High : Terminalfunktion ist wie oben aufgefuehrt verfuegbar == LOW : die im Flashspeicher abgelegten Terme und die Konfiguration werden geladen und ausgefuehrt. Ein unter- brechen der Ausfuehrung ist nur duch Abschalten der Betriebsspannung moeglich. --------------------------------------------------------------------------------------- Ralph Seelig im Oktober 2025