Tenho uma pergunta do exame que não resolvi:
Preciso construir um circuito lógico digital que esteja recebendo o número de 4 bits e retornar true
se o número for 0
, 7
ou 14
. Eu tenho apenas uma XOR
porta (2 entradas), uma NOR
(3 entradas), uma NAND
(2 entradas) e um decodificador de 3 a 8.
Eu acho que essa pergunta é insolúvel, não encontrei nenhuma combinação que possa fazer isso. Alguma idéia de como resolvê-lo?
Respostas:
Eu escrevi um algoritmo em C # que tenta todas as combinações possíveis desses
Nor 3->1
Xor 2->1
Nand 2->1
eDecoder 3->8
.Depois de executá-lo por
7,5 milhões de anos e2 horas, retornou42Falso. Acredito que isso prova que a pergunta não tem resposta, pois esse algoritmo verifica todas as combinações possíveis. :)Me pediram para descrevê-lo, então a próxima parte é uma explicação das partes do código, parte por parte. TL; DR - você pode simplesmente pular o código no final :)
Vamos falar sobre as linhas de entrada, elas têm 0 ou 1 estados e, para cada uma das entradas possíveis (0 a 15), possuem valores diferentes:
para a primeira linha, fica assim: 0 1 0 1 0 1 ... A segunda é: 0 0 1 1 0 0 1 1 ... a terceira: 0 0 0 0 1 1 1 1 .... como binária contando ... você teve a ideia: P
Então eu criei um objeto que representa cada linha em cada um de seus estados:
Como diz bitLine.IsActiveWhenInputIs [5], retorna se a linha estava ativa quando a entrada era 5.
Este é um código que cria as linhas de entrada completamente:
Também criaremos linhas de bits "sempre verdadeiras" e "sempre falsas" - para fornecer uma entrada constante "0" ou "1".
Agora, se você notar, o que estamos procurando é realmente um bitLine específico, verdadeiro quando a entrada é 0, 7, 14. Vamos representá-lo em nossa classe:
Isso tornou as coisas realmente simples: o que realmente estamos procurando é uma maneira de "forjar" este necessário BitLine a partir da linha de bits de entrada (é assim que eu represento ao meu programa o que eu quero que minha saída seja).
Agora, é assim que continuamos: toda vez que usamos algum elemento lógico em nossas bitLines
Xor
, comoNor
,Nand
ou mesmo oDecoder
, estamos realmente criando um novo bitLine \ s. Conhecemos o valor de cada uma das linhas em todas as entradas possíveis de 0 a 15, para que possamos calcular também o novo valor do bitLine em todas as entradas possíveis!Nand Nor e Xor são todos diretos:
Para cada entrada possível, representa como o novo BitLine atuará.
Manusear o decodificador é um pouco complicado, mas a idéia é "se os bits na entrada representam o número x em binário, a linha de bits da x-ésima saída será verdadeira, enquanto todos os outros serão falsos. Diferente da outra função, este obtém uma matriz de linhas de bits e adiciona 8 novas linhas de bits à matriz.
Agora temos todos os nossos elementos básicos, então vamos falar sobre o algoritmo:
Vamos fazer um algoritmo recursivo, a cada profundidade ele tentará usar outros elementos (nem \ ne e xor \ decodificador) nas linhas de bits disponíveis no momento e, em seguida, definirá o elemento como inutilizável para a próxima profundidade recursiva. Sempre que chegarmos ao fundo e não tivermos mais elementos para usar, verificaremos se temos uma linha de bits que é o que estávamos procurando.
Esse código verifica, a qualquer momento, se o grupo atual de linhas contém a linha que estamos procurando:
Esta é a função que ela usa para verificar se duas linhas são iguais:
Ok, agora a parte principal é o principal algoritmo:
Esta função recebe uma lista dos bitLines disponíveis, o comprimento da lista, um booleano representando se cada elemento está disponível no momento (xor / nor / nand / decoder) e um bitLine representando o bitLine que estamos procurando.
Em cada estágio, ele verifica se temos mais elementos para usar, se não - verifica se arquivamos nossa linha de bits necessária.
Se ainda temos mais elementos, então para cada elemento ele chama uma função que deveria lidar com a criação de novas bitLines usando esses elementos e chamando a próxima profundidade recursiva posteriormente.
As próximas funções do manipulador são bem diretas, elas podem ser traduzidas para "escolher 2 \ 3 das linhas de bits disponíveis e combiná-las usando o elemento relevante. Em seguida, chame a próxima profundidade da recursão, só que desta vez não conterá este elemento! ".
essas são as funções:
E é isso, apenas chamamos essa função com a linha necessária que estamos procurando e verifica todas as combinações possíveis de peças elétricas para verificar se é possível combiná-las de tal maneira que, no final, uma única linha seja emitido com os valores necessários.
* observe que eu uso a mesma lista o tempo todo, portanto não precisarei criar novas instâncias de linhas de bit o tempo todo. Dou-lhe um buffer de 200 por esse motivo.
Este é o programa completo:
Espero que desta vez seja uma explicação válida: P
fonte
Esta é uma não resposta, para descartar a solução mais óbvia.
No entanto, a simplificação da expressão anterior é:
esse não é o esperado:
Por esse motivo, acho provável um erro na pergunta, sendo "nand" gate a "nem" one.
fonte
Uma resposta válida para sua pergunta seria qualquer circuito que retorne sempre verdadeiro. Porque ele retornará verdadeiro também se os números de entrada forem 0,7 ou 14.
Eu acho que a pergunta deveria pedir explicitamente um circuito que produza true se os números de entrada são 0,7 ou 14. E que gera false caso contrário.
fonte
É factível. Como uma dica, os dois bits do meio são iguais para todos esses padrões de bits, portanto, a xorá-los produzirá 0, que poderá ser uma entrada para o decodificador com os outros dois bits. As portas restantes são aplicadas às três saídas do decodificador para fornecer a saída correta de bit único.
fonte