Arquitectura de sistemas informáticos 1 parte. Puertas lógicas

Elementos lógicos


Buen día, estoy comenzando una serie de artículos sobre cómo escribir una máquina virtual en el idioma Golang. Elegí este idioma porque es fácil de leer y tiene las funciones necesarias en la biblioteca estándar que serán útiles en el futuro.

Este artículo no contiene absolutamente ninguna información nueva para aquellos que saben cómo hacer tablas de verdad para puertas lógicas simples. Si sabe cómo hacerlo, no pierda el tiempo y pase a la segunda parte.

Una puerta lógica es un dispositivo con una o más entradas y una o más salidas. En esta parte consideraremos solo el más simple de ellos. Para modelar puertas, usaremos solo las señales 0 y 1, sin usar las características de entrada y salida de las puertas reales.

Como trabajaremos con Golang, cada elemento puede representarse como una función.
En Go, la función se ve así:

func (   )    {     //     return    } 

Tampón


Este es el elemento más simple que tiene una entrada y una salida. En la práctica, se usa para amplificar una señal o crear un retraso; a veces puede ser reemplazado por un conductor.

unBUF a
0 00 0
11

en el caso del búfer, nuestra función se verá así:

 func Buf(v bool) bool {    return v } 

Inversor


El mismo búfer, solo la salida invierte la señal.

unNO un
0 01
10 0

en el caso de un inversor, la función se verá así:

 func Inv(v bool) bool {    return !v } 

O


Este elemento necesita al menos una señal igual a 1 para obtener 1 en la salida.

unba OR b
0 00 00 0
0 011
10 01
111

 func Or(v, s bool) bool {    return v || s } 

Y


Siempre devuelve 1, cuando se suministra 1 a todas sus entradas, en todos los demás casos devuelve 0.

unba y b
0 00 00 0
0 010 0
10 00 0
111

 func And(v, s bool) bool {    return v && s } 

O exclusivo


Para obtener 1 en la salida, es necesario que se apliquen diferentes señales (0 y 1) o (1 y 0) a la entrada. Esta operación es útil porque le permite intercambiar dos variables sin usar memoria adicional.

unba xor b
0 00 00 0
0 011
10 01
110 0

 func Xor(v, s bool) bool { //  (v ^ s)    ,   bool     ,       return (v || s) && !(v && s) } 

O no


Funciona como un elemento OR, solo un inversor está conectado a su salida, de donde obtenemos una señal.

unba ni b
0 00 01
0 010 0
10 00 0
110 0

 func Nor(v, s bool) bool {    return !(v || s) } 

Y no


El elemento funciona exactamente igual que el elemento And, solo la señal se invierte en la salida.

unba nand b
0 00 01
0 011
10 01
110 0

 func Nand(v, s bool) bool {    return !(v && s) } 

O exclusivo con inversión


El elemento funciona de la misma manera que el elemento OR, solo la señal se invierte en la salida.

unba XNOR b
0 00 01
0 010 0
10 00 0
111

 func Xnor(v, s bool) bool { //       return !((v || s) && !(v && s)) } 

Ahora que las funciones están escritas, puede ensamblarlas en el paquete Gate, sobre la base de lo cual implementaremos cosas más complejas. Nuestra jerarquía de paquetes será similar a una jerarquía de abstracción de computadora real. El código fuente se puede encontrar aquí .

Source: https://habr.com/ru/post/476100/


All Articles