5

Códigos

Introdução5.1

Nesta aula, exploraremos como podemos codificar informações de formas variadas. É importante que você note que, embora estejamos manipulando números, não estamos tratando de sistemas de numeração propriamente ditos, ainda que alguns possam ser interpretados dessa forma. Na verdade, lidamos com sistemas que codificam um número em outro formato, funcionando de maneira semelhante a uma cifra de criptografia, com o objetivo de obter benefícios específicos conforme o propósito do sistema de codificação escolhido.

Utilidade

Esses códigos podem não parecer tão úteis à primeira vista, entretanto, você os utilizará ao longo da disciplina, mesmo que de forma pontual. O código BCD é amplamente utilizado para projetar displays numéricos em hardware, enquanto o código de Gray será fundamental na etapa de minimização de circuitos por meio do mapa de Karnaugh.

Código BCD5.2

Denominamos como código qualquer representação de números, letras ou palavras por meio de um grupo especial de símbolos. Provavelmente, o exemplo mais familiar para você seja o código Morse, no qual uma série de pontos e traços representa as letras do alfabeto. Até este ponto, vimos que é possível representar qualquer decimal por um binário equivalente, o que nos permite imaginar o sistema de numeração convencional como uma codificação em binário puro. Desse modo, embora todos os sistemas digitais utilizem a numeração binária em suas operações internas, o mundo externo permanece naturalmente decimal. Isso significa que, em certas ocasiões, você desejará converter valores de binário para decimal com facilidade e, por esse motivo, uma maneira de codificar números decimais que combine características dos dois sistemas é empregada em situações determinadas.

Utilizamos o termo Decimais Codificados em Binário, do inglês BCD (Binary-Coded-Decimal), quando cada dígito de um número decimal é representado individualmente pelo seu equivalente em binário. Como um dígito decimal pode assumir no máximo o valor 9, são necessários 4 bits para codificar cada um deles, visto que o código binário do 9 é $1001_2$. Observe os dois exemplos abaixo para visualizar essa conversão:

$$ \begin{array}{ccc l} 8 & 7 & 4 & \text{(decimal)} \\ \downarrow & \downarrow & \downarrow & \\ 1000 & 0111 & 0100 & \text{(BCD)} \end{array} $$
$$ \begin{array}{ccc l} 9 & 4 & 3 & \text{(decimal)} \\ \downarrow & \downarrow & \downarrow & \\ 1001 & 0100 & 0011 & \text{(BCD)} \end{array} $$

Processo de conversão BCD mostrando dígitos decimais mapeados para grupos binários de 4 bits

Perceba que cada dígito é convertido estritamente no seu equivalente binário puro e que são sempre utilizados 4 bits para cada posição decimal. Entretanto, é fundamental notar que o BCD utiliza apenas as combinações de $0000_2$ até $1001_2$ para representar cada dígito, deixando de usar as representações maiores que esta última. Em outras palavras, apenas 10 dos 16 valores possíveis para o grupo de 4 bits são válidos. Caso um desses números proibidos apareça em um sistema, isso normalmente indica a ocorrência de algum erro de processamento. Como o BCD se baseia nesta conversão direta, o processo de retornar do código BCD para o decimal é extremamente simples, consistindo no procedimento inverso em que você deve agrupar os bits de 4 em 4 e transformar cada grupo em seu respectivo número decimal.


Problema: Converta $0110100000111001$ (BCD) em seu equivalente decimal.

$$ \underbrace{0110}_{6} \quad \underbrace{1000}_{8} \quad \underbrace{0011}_{3} \quad \underbrace{1001}_{9} $$

Como você pode observar, realizamos agrupamentos de 4 bits. No código BCD, essa tarefa é simplificada, pois, como cada dígito foi convertido originalmente para 4 bits, o número resultante sempre apresentará um múltiplo de 4 bits.


BCD não é um sistema de numeração!

É importante que você perceba que o BCD não é outro sistema de numeração como o binário, o decimal ou o hexadecimal. O BCD é, na realidade, o próprio sistema decimal no qual cada dígito individual é codificado em seu equivalente binário, o que torna o número BCD diferente do binário puro.

O código binário puro é obtido a partir do número decimal completo, enquanto no código BCD cada dígito decimal é convertido de forma isolada. Para ilustrar essa diferença, veja o exemplo do número 137 comparando as duas representações:

$$ \begin{aligned} 137_{10} &= 10001001_2 && \text{(binário)} \\ 137_{10} &= 0001 \ 0011 \ 0111 && \text{(BCD)} \end{aligned} $$

Note que o código BCD requer 12 bits, enquanto o binário puro exige apenas 8 bits para representar o mesmo valor. Embora isso possa parecer ineficiente em termos de armazenamento, a principal vantagem desta representação é a relativa facilidade de conversão. Apenas os grupos de 4 bits dos dígitos de 0 a 9 precisam ser memorizados por você ou pelo sistema. Essa característica é especialmente valiosa do ponto de vista do hardware, pois simplifica os circuitos lógicos que realizam as conversões mútuas.

Código Gray5.3

Alguns sistemas digitais operam em altas velocidades, como ocorre em máquinas rotativas no controle de posição de um disco rígido. Essas máquinas reagem a variações bruscas nas entradas digitais e, caso várias condições de entrada variem ao mesmo tempo, o sinal pode ser interpretado incorretamente pelo hardware. Para minimizar esse problema, o código de Gray busca representar os números de forma que, quando colocados em sequência numérica, dois valores adjacentes difiram em apenas um bit. Para compreender melhor essa necessidade, tome como exemplo o número $3_{10}$ escrito com 4 bits, que seria $0011_2$. Ao incrementarmos para $4_{10}$, obteríamos $0100_2$. Observe que, nesse caso, mudamos três bits simultaneamente, o que pode causar instabilidades. A tabela abaixo demonstra a transição entre valores binários de três bits e o respectivo código de Gray.

$$ \begin{array}{ccc|ccc} \mathbf{B_2} & \mathbf{B_1} & \mathbf{B_0} & \mathbf{G_2} & \mathbf{G_1} & \mathbf{G_0} \\ \hline 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 & 1 & 1 \\ 0 & 1 & 1 & 0 & 1 & 0 \\ 1 & 0 & 0 & 1 & 1 & 0 \\ 1 & 0 & 1 & 1 & 1 & 1 \\ 1 & 1 & 0 & 1 & 0 & 1 \\ 1 & 1 & 1 & 1 & 0 & 0 \end{array} $$

Disco codificador em código Gray mostrando a aplicação física de transições de bit único

Assim como no caso do BCD, o código de Gray é apenas uma abstração do número binário e não um sistema de numeração independente. O que fazemos é realizar a contagem em binário e converter cada número para seu equivalente no código Gray. Para converter binário em Gray, você deve começar com o bit mais significativo (MSB) e utilizá-lo como o primeiro bit Gray. Em seguida, compare o binário MSB com o próximo bit binário ($B_1$). Se eles forem iguais, o resultado $G_1$ será 0, mas se forem diferentes, $G_1$ será 1. O processo continua comparando $B_1$ com $B_0$ para encontrar $G_0$. A imagem abaixo resume este fluxo de conversão.

Convertendo (a) binário (encode) em Gray e (b) Gray em binário.

Você pode notar que o MSB em Gray é sempre igual ao MSB em binário. De fato, o processo descrito trata-se de uma operação XOR com o próprio número deslocado. Ou seja, se você tomar um número $B$ qualquer em binário, poderá obter seu equivalente em Gray por meio da fórmula $G = B \oplus (B \gg 1)$. Uma forma prática de descrever isso seria deslocar o valor um bit para a direita, posicioná-lo abaixo do original e realizar um XOR bit a bit, lembrando que, se os bits forem iguais, o resultado será 0 e, se forem diferentes, será 1.


Problema: Converta o binário $1011_2$ para o código Gray.

$$ \begin{array}{r cccc l} & 1 & 0 & 1 & 1 & \text{(Binário original)} \\ \oplus & 0 & 1 & 0 & 1 & \text{(Deslocado p/ direita)} \\ \hline & 1 & 1 & 1 & 0 & \text{(Código Gray)} \end{array}$$

Ao deslocarmos o número um bit para a direita, perdemos o último bit original e acrescentamos um zero à esquerda para manter a quantidade de bits, permitindo o XOR conforme demonstrado.

Relações entre as representações numéricas5.4

A tabela abaixo apresenta a representação dos números decimais de 1 a 15 nos sistemas binário, hexadecimal e nos códigos BCD e Gray. É importante que você observe, especialmente, como a representação BCD mantém rigorosamente o uso de 4 bits para cada dígito decimal individual.

Representação dos números decimais em diferentes códigos.

Códigos Alfanuméricos5.5

Além de dados puramente numéricos, um computador precisa ser capaz de manipular informações de texto. Isso significa que ele deve reconhecer códigos que representem as letras do alfabeto, sinais de pontuação e caracteres especiais. Esses sistemas são conhecidos como códigos alfanuméricos. Um código completo desse tipo inclui 26 letras minúsculas, 26 maiúsculas, 10 dígitos numéricos e diversos sinais de pontuação e símbolos como +, /, #, entre outros, representando basicamente tudo o que você encontra em um teclado.

Código ASCII5.5.1

O padrão mais utilizado mundialmente é o Código Padrão Americano para Troca de Informações (ASCII). Ele utiliza 7 bits, o que resulta em $2^7 = 128$ representações possíveis, quantidade suficiente para abranger todos os caracteres padrão e funções de controle como o RETURN e o LINEFEED. A tabela a seguir mostra parte desse código com seus equivalentes em hexadecimal e decimal.

Códigos ASCII padrão.

O computador utiliza o código ASCII tanto para armazenar informações digitadas quanto para transferir dados para dispositivos externos como impressoras. Veja como você pode aplicar isso em um exemplo prático.


Problema: Codifique, em ASCII, a seguinte mensagem, com aspas não inclusas, usando a representação hexadecimal: "COST = $72."

A codificação de cada caractere resulta na seguinte tabela:

CaractereCódigo ASCII (hex)
C43
O4F
S53
T54
espaço20
=3D
espaço20
$24
737
232

Dessa forma, a mensagem final em hexadecimal é representada pela sequência $43\ 4F\ 53\ 54\ 20\ 3D\ 20\ 24\ 37\ 32$.

Bytes, Nibbles e Palavras5.6

A maioria dos microcomputadores armazena informações em grupos de 8 bits, recebendo o nome especial de byte. Um byte pode representar qualquer tipo de dado e é a unidade fundamental de medida na computação. Se você tiver uma sequência de 32 bits, por exemplo, terá exatamente 4 bytes. Da mesma forma, para representar o número decimal 846.569 em BCD, você precisaria de 24 bits, o que equivale a 3 bytes, já que cada um dos seis dígitos consome 4 bits.

Frequentemente, dividimos os números binários em grupos menores de 4 bits, conhecidos como nibbles. Este termo surgiu nos primórdios da computação como uma brincadeira com a palavra byte (mordida), significando uma "mordidinha". Assim, um byte é composto por exatamente dois nibbles. Se você analisar o binário $1001 0101$, o nibble menos significativo é o $0101$, que equivale ao valor decimal 5.

Finalmente, temos o conceito de palavra (word), que representa a unidade natural de informação com a qual um sistema digital opera. O tamanho da palavra depende da arquitetura do hardware. Enquanto um computador de um forno de micro-ondas pode operar com palavras de 8 bits (um byte), o seu computador pessoal provavelmente lida com palavras de 64 bits (8 bytes) por vez.

Questões5.7

  1. Converta os seguintes números decimais para o código BCD:

    (a) 35;

    (b) 908;

    (c) 1472.


  1. Transforme as seguintes sequências em BCD para seus equivalentes decimais: (a) $1000 \ 0010$;

    (b) $0111 \ 0101 \ 0100$;

    (c) $0001 \ 0110 \ 0011 \ 1001$.


  2. Identifique quais das seguintes sequências de 4 bits são inválidas no código BCD e explique o motivo: $0101$, $1100$, $1001$, $1011$.


  1. Converta os seguintes números binários puros para o código Gray:

    (a) $1010_2$;

    (b) $1111_2$

    (c) $01101_2$.


  1. Realize a conversão inversa (Gray para Binário) dos seguintes códigos:

    (a) $1100_G$;

    (b) $1011_G$;

    (c) $1110_G$.


  1. Explique o passo a passo da conversão do binário $1001_2$ para Gray, utilizando o método da operação XOR.

  1. Codifique a palavra "Hardware" para o formato ASCII utilizando a representação hexadecimal.

  2. Decodifique a seguinte sequência ASCII hexadecimal para texto: $44\ 69\ 67\ 69\ 74\ 61\ 6c$.

  3. Determine quantos bytes e quantos nibbles são necessários para representar o número decimal $52931$ no formato BCD.

  1. Explique por que o código BCD é considerado menos eficiente em termos de espaço de memória do que o binário puro e cite uma vantagem que justifique o seu uso em sistemas de hardware.

  2. Qual é a característica fundamental do código Gray que o torna ideal para sensores de posição em eixos rotativos e como essa característica evita erros de leitura?

  3. Diferencie o conceito de Byte, Nibble e Palavra, explicando como o tamanho da Palavra pode variar entre diferentes arquiteturas de computadores.

Próximos passos5.8

No próximo capítulo, Tabela-verdade e Portas Lógicas, você estudará os conceitos introdutórios sobre as principais portas lógicas e aprenderá diferentes formas de descrever e analisar o funcionamento dos circuitos digitais, incluindo o uso de tabelas-verdade e uma introdução às expressões da álgebra booleana.