A Multiplicação

Com o conhecimento que adquirimos até este ponto já nos é possível montar um circuito multiplicador para números com 4 bits em complemento para 2 e compreender como lá chegamos.
Vamos fazê-lo com um circuito que vai implementar o raciocínio que seguimos numa multiplicação a papel e lápis, de acordo com o algoritmo que desenvolvemos na Figura 1. O que aprendemos até agora ainda só nos permite esta solução.
Vamos fazê-lo por que entendemos que é importante nesta fase exercitar o raciocínio lógico com os conceitos adquiridos numa operação mais complexa e porque o vamos fazer só com 4 bits para uma representação em complemento para 2.
A forma de criar um circuito multiplicador não será certamente aquela que estamos a utilizar agora. Basta olharmos para o quadro do algoritmo da multiplicação ou do circuito que o executa, para facilmente entendermos que, se estivéssemos a trabalhar a 64 bits, seriam de uma dimensão e complexidade impraticáveis.
A solução eficiente para a multiplicação passa pela utilização de circuitos que vamos ter que analisar de seguida para podermos partir para o entendimento da CPU e para a execução da Divisão ou mesmo da Multiplicação mas então já por métodos iterativos.

O Algoritmo

Vamos tratar da mesma forma o algoritmo da multiplicação de números com sinais diferentes ou iguais. Efetivamente, quando multiplicamos dois números quaisquer, não fazemos incidir a operação sobre o sinal, isto é, o sinal é tratado em separado. Mais por mais é mais, mais por menos é menos e menos por menos é mais. No fim aplica-se o sinal que resultar deste método ao resultado final. E aquilo que multiplicamos são os números sem sinal. Certo?
Se multiplicarmos -5 por 4, na realidade o que fazemos é multiplicar 5 por 4 e atribuir o sinal resultante, menos por mais é menos, portanto menos, ao resultado final 20.
Então, a nossa operação de multiplicação terá que ser dividida em duas fases:

  • Determinar qual é o sinal do resultado final da operação.
  • Multiplicar os operandos em módulo, isto é, pelo seu valor absoluto.

O módulo de um número representa o seu valor absoluto positivo. Na base 10 basta tirar o sinal a um número para termos o seu módulo. Mas na base 2 temos que determinar o seu simétrico, no caso de ser negativo e passar a ignorar todos os zeros à esquerda, agora sem significado.

Bom, mas agora temos que ver como foi efetuada a multiplicação dos dois números em módulo, que passámos sem analisar. Vamos começar por fazer o algoritmo da multiplicação, acompanhando com a Figura 1.  Assim, teremos:

Figura-3-21
Figura 1
  1. Escreve-se o multiplicando (o que se vai multiplicar).
  2. Escreve-se o multiplicador (aquele que multiplica) por debaixo do multiplicando e com os seus dígitos alinhados com ele a partir da direita.
  3. Desenha-se um traço por baixo destes dois.
  4. Multiplicam-se todos os dígitos do multiplicando,um a um, pelo primeiro dígito mais à direita do multiplicador, colocando debaixo do mesmo o resultado a partir daí para a esquerda,  transportando o vai um final, se assim for, para a coluna seguinte.
  5. Se o multiplicado não tiver mais dígitos passa-se ao passo 11.
  6. Repete-se a mesma operação com o dígito seguinte do multiplicador. Só que agora o primeiro resultado da operação é colocado no alinhamento deste, isto é, um dígito deslocado à esquerda e por debaixo do resultado anterior e a partir daqui para a esquerda.
  7. Se o multiplicador não tiver mais dígitos à esquerda passamos ao passo 9.
  8. Passa-se ao passo 6.
  9. Desenha-se um traço por debaixo de todos os resultados obtidos.
  10. Somam-se os valores obtidos em todas as linhas, coluna a coluna, colocando o resultado no mesmo alinhamento por debaixo do traço.
  11. O valor obtido é o resultado da multiplicação.

E agora, como é que explicamos isto ao computador na língua dele e num circuito?

Vejamos por exemplo a primeira casa da multiplicação onde está escrito A0B0, a multiplicação do bit A0 pelo bit B0. A multiplicação binária é representada pelo operador AND. Senão vejamos como os resultados das multiplicações

0x0=0, 0x1=0, 1×0=0 e 1×1=1

correspondem aos valores da tabela verdade do operador AND. Então, para obtermos o valor do produto de cada bit do multiplicando por um bit do multiplicador, só temos que ligar os bits que nos interessam em cada caso a uma porta AND que devolverá esse resultado.
Agora vamos obter o resultado da multiplicação pela soma das colunas resultantes do produto dos bits do multiplicando pelo multiplicador. Como o computador só permite a soma de dois bits de cada vez, vamos ter que a realizar tal como na decomposição do algoritmo de soma representada na Figura 1, pela soma sucessiva de duas parcelas, isto é, as duas primeiras linhas (fundo rosa), o resultado desta com a 3ª linha (fundo cinza) e o último resultado com a 4ª linha (fundo verde).
Repare-se que o primeiro bit da primeira linha da multiplicação é o bit S0 do resultado da operação. Não entra no circuito somador. O primeiro bit do resultado de cada circuito somador, constitui também já um bit do resultado. Aquilo que vimos dizendo não é mais do que a leitura da operação tal como é feita a papel e lápis. O carry out (ou o Vai 1?) de cada circuito parcial soma ao último bit do circuito somador seguinte.

O Circuito Lógico

Vamos apoiar a nossa análise na Figura 2, passando a fazer a simples menção aos quadros da mesma onde se encontram os circuitos parciais a analisar.

Figura-3-20
Figura 2

Quanto ao sinal, a regra que determina que quando os sinais são diferentes o resultado é negativo (1) e quando são iguais é positivo (0), é exatamente a resposta de uma porta XOR cujos entradas serão os sinais dos operandos, como no quadro 3. Se forem iguais o resultado será positivo (0) ou XOR falso. Se forem diferentes o resultado será negativo (1) ou XOR verdadeiro.
Só temos que ligar às entradas desta porta o bit de maior ordem de cada operando e a sua saída diretamente ao bit R7 e ao quadro 10 como Sop e Cin.

Vamos agora olhar para os operandos. Se algum for negativo determinamos o seu simétrico, passando a operar com ele. Isto na nossa língua.
E como é que o computador sabe se o número é negativo e atua em conformidade em todas as situações possíveis?
Para isso, basta deixar que o bit representativo do sinal em cada operando faça o seu trabalho. Vamos ver como nos quadros 1 e 2.

  • Os circuitos destes quadros representam os conversores de um número no seu simétrico. O número do circuito 1 é positivo. O do circuito 2 é negativo.
  • Cada bit do operando está ligado a uma porta XOR junto com Sop, o valor do sinal desse operando. Os bits serão negados se o operando for negativo.
  • As saídas dessas portas entram em circuitos somadores onde é adicionado o valor Cin ao valor agora obtido.
  • Os valores que resultam destes circuitos somadores representam o operando ou o seu simétrico, conforme ele for positivo ou negativo.
  • As linhas 4 e 5 ligam os valores dos sinais T3 e V3 às portas XOR iniciais, ao Sop e ao Cin da operação, bem como à porta XOR determinadora do sinal.

Notem que consideramos o carry out do último dos circuitos somadores parciais e inserimo-lo num novo bit de ordem 3, A3 e B3.

E porquê? O bit de ordem 3 não tinha ficado de fora por ser o sinal?

O menor número negativo que se consegue representar com 4 bits (-8=1000) só é representável por 5 bits se for positivo (+8=01000) ou por 4 bits em módulo (8=1000). Portanto, se não tivéssemos lá o bit de ordem 3, o resultado do circuito do quadro 2 seria errado.

A multiplicação dos bits dos operandos assim obtidos é introduzida nos circuitos dos  quadros 7, 8 e 9, onde está representada cada uma das somas parciais do algoritmo, através de portas AND que devolvem o resultado de cada uma dessas multiplicações. São simples circuitos somadores onde se reproduz a ordem dos operandos tal como na representação do algoritmo. O  resultado da soma das linhas do algoritmo, ou seja, o resultado da multiplicação dos dois operandos em módulo, é representado pelos bits S6 a S0.

Agora, os valores de S6 a S0 são passados pelo circuito do quadro 10, idêntico aos circuitos 1 e 2. Neste circuito, o Sop, o Cin e o valor de R7 são determinados pelo sinal do resultado da operação, transportado pela linha 6. Deste circuito onde, quando o resultado for negativo é de novo reposto o seu simétrico, sai o resultado final da operação, representado pelos bits R7 a R0.

Bom, para arejar um pouco e não continuar já com a evolução dos circuitos lógicos, vamos fazer uma pequena abordagem à forma como um computador capta, guarda e mostra imagens e sons.

Este será o tema do próximo Capítulo.