Embora o cálculo interno de todas as respostas e o uso de um mux para selecionar entre elas funcionem, certamente não é um projeto mínimo.
Considere que você pode dividir o problema em bits; em vez de um único bloco de lógica com duas entradas de 8 bits, você pode particionar isso como duas seções de 4 bits, desde que possa vinculá-las para obter um resultado geral correto. Felizmente, vincular as fatias não é pior do que um único bit, que no caso de adição representa o bit de transporte. Portanto, cada fatia de 4 bits tem uma entrada e uma saída. (Observe que lógicas como AND e NOR nem precisarão disso, embora, se mais tarde você implementar turnos para a esquerda / direita, esse bit será reutilizado facilmente).
Levado ao extremo, você pode usar 8 fatias de 1 bit cada. É útil pensar nas fatias de 1 bit, porque facilita a reflexão sobre uma abordagem que aumenta de volta para fatias maiores. Portanto, com uma fatia de 1 bit, você tem apenas 7 entradas: o código de função de 4 bits, um pouco da entrada A, um pouco da entrada B e um bit de transporte. Você também tem apenas duas saídas: funcionar e executar. Portanto, agora você pode escrever as duas funções de saída em termos de apenas 7 entradas, que estão dentro do domínio da capacidade humana de reduzir razoavelmente. Você terminará com um punhado de portas que nem sempre necessariamente computarão todas as funções, mas não importa o que acontece dentro da fatia, apenas que produz o resultado correto quando visto de fora.
Agora você pode seguir algumas maneiras. Uma maneira é simplesmente usar 8 dessas fatias de 1 bit e pronto. Outra maneira é fazer fatias maiores e depois usá-las. Passando de 1 para 2 bits, as equações vão de 7 entradas para 9, e 4 bits exigirão funções de 13 entradas. Não é necessariamente fácil, mas fornecerá resultados mais compactos do que a abordagem computar tudo depois mux. Além disso, se você olhar para as partes internas de uma fatia ALU 74181 de 4 bits, não verá um mux lá.
Sim, você precisa de mais lógica de controle.
Sua tarefa anterior era puramente aritmética (isso é uma palavra?); Portanto, você pode usar um somar somador e massagear as entradas usando os sinais de controle para criar as funções que deseja
Suas novas funções são lógicas , portanto, você precisa de outro bloco para executar operações lógicas. Os sinais de controle mudarão a funcionalidade deste bloco.
Então, na parte inferior do seu diagrama, você precisará de um multiplexador (às vezes chamado de 'mux') acionado pelos sinais de controle para escolher qual das respostas você irá emitir (a do somador e o circuito de "massagem de entrada" ou aquele do operador lógico).
Se você pode escolher novas codificações para suas linhas de controle da ALU, talvez eu fique tentado a usar o MSB como uma seleção "aritmética / lógica" e os outros a selecionar a "subfunção" se isso fizer sentido, pois simplifica a decodificação para o mux final.
fonte
Uma boa abordagem para lidar com operações lógicas é fazer com que os bits dos dois operandos sirvam como entradas seletoras para um multiplexador de 4 entradas e alimente as entradas de "dados" do multiplexador com um padrão de quatro bits correspondente à operação desejada (normalmente em uma ULA de 8 bits, haveria oito multiplexadores - um para cada bit - e as entradas "dados" de todos os 8 multiplexadores seriam ligadas).
fonte