Multiplicação
O circuito de multiplicação por iterações funciona de forma idêntica ao de divisão e é este o método que deve ser utilizada. De qualquer forma não vamos agora fazê-lo.
Os objetivos de desenvolvimento de um raciocínio lógico interligando circuitos lógicos já conhecidos para encontrar a solução lógica para uma situação mais complexa e de entendimento da propagação de sinais ao longo do Ciclo de Clock estão cumpridos.
Como desafio à elaboração de um raciocínio lógico e para pôr à prova os conhecimentos de propagação de sinais com o clock tentem desenvolver um circuito para multiplicação de dois números de 4 bits (para que o resultado caiba em 8) por esta forma.
Cá estaremos para ajudar.
Comparação
Cinco é maior do que três.
Dez é menor do que vinte.
O conjunto de pessoas que habita em Tokyo é maior do que o conjunto de pessoas que habita em Lisboa.
O peso específico do chumbo é maior que o peso específico do algodão.
O valor da derivada de f(x) = 7 + 2x para x=3 é maior do que para x=2.
São exemplos de comparações de valores absolutos ou resultantes do cálculo de expressões matemáticas, mas sempre de grandezas quantificáveis.
A comparação de duas grandezas é frequentemente utilizada em qualquer programa. Principalmente em instruções condicionais, como por exemplo:
SE (A>B) FAZ ISTO SENÃO FAZ AQUILO.
Em linguagem de programação isto é na quase generalidade representado pela instrução condicional
IF (x) … ELSE… [SE (x) … SENÃO…],
sendo a declaração contida dentro de IF o caminho a seguir se (x) for verdade e a declaração contida dentro de ELSE o caminho a seguir se (x) for falso.
Observação:
Em lógica matemática, à expressão (x) contida na condição IF chama-se predicado.
O que comparamos na expressão (x) são valores humanos quantificáveis e comparáveis. O resultado da comparação é um valor booliano verdadeiro ou falso.
Os símbolos matemáticos standard mais comuns que exprimem a comparação de duas grandezas são:
- > (maior do que),
- < (menor do que),
- = (igual a),
- ≠ (diferente de),
- ≥ (maior ou igual que) e
- ≤ (menor ou igual que).
O que se pretende fazer com este tipo de circuito é comparar duas grandezas, concretamente comparar números em complemento para 2. O que para nós humanos até não é difícil.
Mas como é que isso se faz no computador?
Vamos fazer o raciocínio como tem sido habitual para chegarmos a uma conclusão. Vamos acompanhar com a Figura 1, onde se comparam dois números A e B de 8 bits em complemento para 2, A0 a A7 e B0 a B7, em que A7 e B7 representam os respetivos sinais.
Comecemos por analisar os sinais dos números a comparar. Se forem diferentes, o maior é o que tiver sinal positivo. Se forem iguais teremos que analisar a subtração dos dois.
Portanto, para já temos que distinguir se os sinais são diferentes ou iguais. E a forma de o fazer é através do operador XOR, que responde 1 quando ambos os operandos são diferentes e 0 quando são iguais.
Então vamos ligar A7 e B7 a uma porta XOR e separar a nossa análise para as duas situações.
QUANDO OS SINAIS SAO DIFERENTES.
Nesta situação a devolução de XOR é 1 e o maior número será aquele que for positivo, isto é, aquele em que o bit de maior ordem for 0. Portanto temos que saber qual dos dois números é positivo e qual é negativo. Como o sinal dos dois é diferente basta-nos saber o sinal de B para o relacionarmos com A. Para sabermos se B é positivo ou negativo vamos comparar B7 com XOR que já sabemos que é 1. E nada melhor que uma porta AND, que só devolve 1 quando ambas as entradas são 1, para nos dar a resposta a esta pergunta. Então vamos ligar XOR e B7 às entradas de uma porta AND.
- Se AND devolver 1 é porque as entradas são ambas 1. Então B7 é 1, B é negativo e A>B.
- Se AND devolver 0 é porque as entradas não são ambas 1. Então B7 é 0 , B é positivo e A.
Portanto, para A e B com sinais diferentes é o sinal de B (B7) que define a relação entre A com B, sendo que se B for negativo A>B e se for positivo A
QUANDO OS SINAIS SÃO IGUAIS.
Logo no início deste Capítulo abordámos a questão do carry out da subtração de dois números positivos, utilizando para isso a tabela da Figura 1.
Percebe-se daí que existe uma relação do carry out de uma soma de números binários com os sinais e valores dos operandos. Vamos verificar qual é e a sua aplicabilidade neste caso.
Se A e B forem ambos positivos, a atual situação é idêntica à que lá se descreveu, isto é, será efetuada a soma de A (positivo) com o simétrico de B (negativo), valendo agora o que lá concluímos que: Se o carry out é 1 então, em valor absoluto, A≥B.
Mas aqui não estamos a comparar valores absolutos mas sim valores reais. Por isso não serve. Certo?
Dos valores absolutos podemos partir para os reais. Como A e B são ambos positivos, os seus valores reais são iguais aos seus valores absolutos, pelo que já podemos concluir que,
Quando A e B são ambos positivos se o carry out é 1 então, em valor real, A≥B.
Se A e B forem ambos negativos basta invertermos o lugar dos operandos na soma (propriedade comutativa da soma) para que a soma a realizar seja de B (positivo) com o simétrico de A (negativo) ocupando B o lugar de A e A o lugar de B na tabela da Figura 1. Da mesma forma e usando o mesmo raciocínio concluímos que: Se o carry out é 1 então, em valor absoluto, B≥A.
Como A e B são ambos negativos os seus valores reais são iguais ao valor negativo do seu valor absoluto. E, quanto maior o valor absoluto de um número negativo menor ele é, como por exemplo 5>3 mas -5<-3.
Generalizando, se em valor absoluto B≥A em valor real B≤A ou A≥B. Então já podemos concluir que:
Quando A e B são ambos negativos se o carry out é 1 então, em valor real, A≥B.
Está encontrada a relação do carry out da operação com os operandos e seus sinais e é que:
Para A e B com sinais iguais, qualquer que seja o seu sinal, quando o Carry Out for 1 então A≥B e quando for 0 então A
AGORA PARA SINAIS DIFERENTES
Temos duas respostas para o mesmo problema. Uma para quando A e B têm ambos sinais iguais e outra para quando têm sinais diferentes.
E agora como é que o circuito vai saber qual das saídas escolher?
Bom, para selecionar entre duas entradas utiliza-se um MUX de 2 para 1. Mas temos que encontrar um bit de seleção para ele, que selecione uma das entradas se os sinais forem diferentes e seleciona outra se forem iguais. Parece que o sinal de saída da porta XOR que analisa os sinais de A e B serve na perfeição.
- Se XOR devolver 0, é porque os sinais são iguais. A entrada selecionada é a E0, onde se vai ligar o carry out do circuito somador.
- Se XOR devolver 1 é porque os sinais são diferentes. A entrada selecionada é a E1, onde deverá estar ligada a saída da porta AND, sendo o seu valor (A7 XOR B7) AND B7.
Agora já podemos dizer que, para quaisquer valores dos operandos A e B, a saída do MUX será 1 se A≥B e 0 se A.
Mas A≥B é uma afirmação vaga para a informação que se pretende. Pode ser maior ou pode ser igual. E em cada caso nós precisamos de saber se é maior ou igual.
Então como é que o circuito vai agora ser informado sobre qual das duas situações se verifica?
Vejamos. Se A e B forem iguais, resultado será 0 em todos os bits e o carry out será 1. Certo? Então, assim sendo, basta ligar todos os bits do resultado a uma porta NOR que só devolverá o valor 1 quando todas as entradas forem 0, portanto quando A e B são iguais. Juntamos aqui na Figura 2 alguns testes de comparação efetuados para diferentes relações de sinais e valores entre A e B.
Conclusão
Este circuito fornece dois bits de resposta, pois tem que fornecer duas informações diferentes.
Chamando R à saída do multiplexer teremos
R=1 → A≥B
R=0 → A
Chamando Ig à saída da porta NOR teremos
Ig=1 → A=B
Ig=0 → A≠B
E assim saberemos se A é maior, igual ou menor do que B.