Arquitetura de sistemas de computadores 1 parte. Portões lógicos

Elementos lógicos


Bom dia, estou iniciando uma série de artigos sobre como escrever uma máquina virtual na linguagem Golang. Eu escolhi esse idioma porque é fácil de ler e possui as funções necessárias na biblioteca padrão que serão úteis no futuro.

Este artigo não contém absolutamente nenhuma informação nova para quem pode compilar tabelas de verdade para simples portas lógicas. Se você souber como, não perca tempo e passe para a segunda parte.

Uma porta lógica é um dispositivo com uma ou mais entradas e uma ou mais saídas. Nesta parte, consideraremos apenas os mais simples deles. Para portas de modelagem, usaremos apenas os sinais 0 e 1, sem usar as características de entrada e saída de portas reais.

Como trabalharemos com Golang, cada elemento pode ser representado como uma função.
No Go, a função fica assim:

func (   )    {     //     return    } 

Buffer


Este é o elemento mais simples com uma entrada e uma saída. Na prática, é usado para amplificar um sinal ou criar um atraso, às vezes pode ser substituído por um condutor.

aBUF a
0 00 0
11

no caso do buffer, nossa função ficará assim:

 func Buf(v bool) bool {    return v } 

Inversor


O mesmo buffer, apenas a saída inverte o sinal.

aNÃO é um
0 01
10 0

no caso de um inversor, a função terá a seguinte aparência:

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

OU


Este elemento precisa de pelo menos um sinal igual a 1 para obter 1 na saída.

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

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

E


Ele sempre retorna 1, quando 1 é fornecido a todas as suas entradas, em todos os outros casos retorna 0.

aba AND b
0 00 00 0
0 010 0
10 00 0
111

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

OU exclusivo


Para obter 1 na saída, é necessário que diferentes sinais (0 e 1) ou (1 e 0) sejam aplicados à entrada. Esta operação é útil porque permite trocar duas variáveis ​​sem usar memória adicional.

aba 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) } 

Ou não


Funciona como um elemento OR, apenas um inversor está conectado à sua saída, da qual obtemos um sinal.

aba nem b
0 00 01
0 010 0
10 00 0
110 0

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

E NÃO


O elemento funciona exatamente da mesma forma que o elemento E, apenas o sinal é invertido na saída.

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

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

OU exclusivo com inversão


O elemento funciona da mesma maneira que o elemento OR, apenas o sinal é invertido na saída.

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

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

Agora que as funções foram gravadas, você pode montá-las no pacote Gate, com base no qual implementaremos coisas mais complexas. Nossa hierarquia de pacotes será semelhante a uma hierarquia de abstração de computador real. O código fonte pode ser encontrado aqui .

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


All Articles