Contador Binário

Um Contador binário tem por função contar impulsos. Por cada ciclo de clock, o contador incrementa ou decrementa (aumenta 1 ou reduz 1) ao número memorizado nas suas saídas, conforme é um Contador Crescente ou Decrescente.

Um Contador binário é composto por um conjunto de Básculas que memorizam igual conjunto de bits. Na solução que vamos abordar o clock chega simultaneamente a todas as Básculas e estas são ligadas entre si de forma que cada uma contém na sua entrada a informação a memorizar em função do comportamento das outras.

Contador binário Crescente (Cr)

Para construirmos um Contador binário Crescente, vamos estabelecer uma relação na forma como os dígitos mudam de número para número conforme crescem e vamos fazê-lo bit a bit, tentando encontrar um padrão de comportamento que nos permita estabelecer o algoritmo que por sua vez nos permitirá encontrar a solução lógica

Figura 1
Figura 1

Comecemos por analisar a tabela dos dezasseis números representados por 4 bits da Figura 1, acompanhando com a leitura da Figura 2, que representa o circuito lógico de um Contador binário Crescente de 4 bits.

Para B0 verificamos que muda de estado de número para número. Por cada transição muda de estado. Em cada estado é a negação do estado anterior.

Então, para cada estado de B0 teremos em E0 o valor oposto, para que no Clock seguinte seja esse o valor memorizado. Para tal basta ligar a ¬B0 à entrada E0.
E0 = NOT B0

Para B1 verificamos que:

  • B1 é 0  sempre que B1 e B0 forem iguais no número anterior..
  • B1 is 1 every time B1 and B0 forem diferentes no número anterior.

Se aplicarmos um operador XOR a B0 e B1, a sua saída vai-nos dar o valor de E1 em cada situação. Ambos diferentes é 1, ambos iguais é 0. No Clock seguinte o valor pretendido será memorizado em B1.
E1 = B0 XOR B1

Figura 2
Figura 2

Para B2 verificamos que:

  • B2 é 0 sempre que no número anterior.
    • B0 B1 não sejam ambos 1 e B2 é 0 or
    • B0 e B1 não sejam ambos 1 e B2 é 1;
  • B2 é 1 sempre que no número anterior.
    • B0 e B1 sejam ambos 1 e B2 seja 0 ou
    • B0 e B1 não sejam ambos 1 e B2 seja 1.

Ora esta condição que se repete de B0 e B1 não serem ambos 1 ou serem ambos 1, corresponde à aplicação de um operador AND a B0 e B1 que só devolve 1 se ambos forem 1. Então já podemos usar outros termos:

  • E2 é 0 sempre que a B0 AND B1 e B2 são iguais.
  • E2 is 1 sempre que a B0 AND B1 e B2 são diferentes.

Ora, este é o comportamento de uma porta XOR. Se iguais devolve 0 se diferentes devolve 1.

Então, se ligarmos B0 AND B1 e B2 a uma porta XOR teremos à sua saída o valor do B2 seguinte. Vamos ligá-la a E2. No Clock seguinte o valor pretendido será memorizado em B2.
E2 = (B0 AND B1) XOR B2

Para B3  seguimos a linha lógica enunciada para B2, só que nas entradas da porta AND deverão estar B0, B1 e B2

  • E3 é 0 quando B0 AND B1 AND B2 e B3 são iguaisl.
  • E3 é 1 quando B0 AND B1 AND B2 e B3 são diferentes.

Da mesma forma, se ligarmos B0 AND B1 AND B2 e B3 a uma porta XOR teremos à sua saída o valor do B3 seguinte. Vamos ligá-la a E3. No Clock seguinte o valor pretendido será memorizado em B3.
E3 = (B0 AND B1 AND B2) XOR B3

Na Figura 3 temos uma representação simplificada de um contador crescente onde podemos verificar a sua implementação e o seu funcionamento em 4 iterações

Figura 3
Figura 3

O Quadro I representa o ponto de partida, com a situação estabilizada. Nas saídas está o valor 0100(4) de partida. O Clock está em baixa. Nas entradas estão os valores resultantes das ligações às saídas, ou seja o valor 0101(5), aguardando o próximo Clock para ser memorizado, o que acontece no Quadro II, a primeira das 4 iterações representadas. Nos Quadros III, IV e V estão representadas mais 3 iterações, que levam o contador até ao valor final de 1000(8). Cada iteração corresponde a um Clock.

Em cada iteração, os valores que estão à entrada passam para as saídas e as entradas passam a assumir os valores resultantes das suas ligações àquelas, esperando pelo Clock seguinte para repetir a operação.

Tal como definimos inicialmente e agora podemos concluir, as Básculas deste Circuito Contador, contêm a cada momento nas suas entradas a informação a ser memorizada, resultante do seu comportamento anterior e são simultaneamente atuadas pelo Clock.

Contador binário Decrescente (Dcr)

Figure 4
Figure 4

Começamos por analisar a tabela da  Figura 4, acompanhando com a leitura da Figura  5, tentando encontrar um comportamento padrão.

Quanto a B0 verificamos que muda de estado (1→0 0→1) de número para número. Portanto, em E0  deve estar sempre a negação de B0. No Clock seguinte B0 é invertido.
E0 = NOT B0

 Quanto a B1 verificamos que:

  • B1 é 0 sempre que B1 e B0 forem iguais no número anterior.
  • B1 é 1 sempre que B1 e B0 forem diferentes no número anterior.

Ora esta será a devolução de uma porta XNOR. Quando iguais 1, quando diferentes 0. Então temos que ligar a E1 uma porta XNOR cujas entradas sejam B0 e B1.
E1 = B0 XNOR B1

Figura 5

Quanto a B2   verificamos que:

  • B2 é 0 sempre que no número anterior
    • B0 e B1 são ambos 0 e B2 é 0 or
    • B0 e B1 são ambos 0 e B2 é 1;
  • B2 é 1 sempre que no número anterior
    • B0 e B1 são ambos 0 e B2 é 0 ou
    • B0 e B1 são ambos 0 e B2 é 1.

Esta condição de ambos 0 ou ambos não 0 corresponde à aplicação de um operador OR a B0 e B1 que só devolve 0 quando ambos são 0. Dito de outra forma:

  • E2 é 0 forem diferentes B0 OR B1 e B2 forem diferentes.
  • E2 é 1 forem diferentes B0 OR B1 and B2 forem iguais.

Ora, este é o comportamento de uma porta XNOR. Se iguais devolve 1, se diferentes devolve 0. Então vamos ligar B0 OR B1 e B2 a uma porta XNOR e a sua saída a E2. No próximo Clock será memorizado em B2 o valor pretendido.
E2 = (B0 OR B1) XNOR B2

Quanto a B3, seguimos a linha lógica enunciada para B2, só que nas entradas da porta OR deverão estar B0, B1 e B2.

  • E3 é 0 quando B0 OR B1 OR B2 e B3 são diferentes.
  • E3 is 1 quando B0 OR B1 OR B2 e B3 são iguais.

Portanto ligamos a E3 uma porta XNOR cujas entradas são B0 OR B1 OR B2 e B3. No próximo Clock será memorizado em B3 o valor pretendido.
E3 = (B0 OR B1 OR B2) XNOR B3

Na Figura 6, temos uma representação simplificada de um contador decrescente onde podemos verificar a sua implementação e o seu funcionamento em 4 iterações.

Figura 6
Figura 6

Quadro I representa o ponto de partida, com a situação estabilizada. Nas saídas está o valor 1000(8) de partida. O Clock está em baixa. Nas entradas estão os valores resultantes das ligações às saídas, ou seja o valor 0111(7), aguardando o próximo Clock para ser memorizado, o que acontece no Quadro II, a primeira das 4 iterações representadas.

Nos Quadros III, IV e V estão representadas as 3 restantes iterações, que levam o contador até ao valor final de 0100(4).

Conclusões

Acabámos por encontrar mesmo um padrão de comportamento universal para as evoluções crescentes e decrescentes  de um número binário baseando-nos no comportamento dos anteriores, o que nos permite concluir que:

Numa evolução iterativa crescente, o valor do bit Bn de um número terá com os anteriores a seguinte relação:

  • Bn é 0, sempre que  Bn-1 AND … AND B0 Bn  do número anterior forem iguais, ou sempre que no número anterior:
    • Bn-1 a B0 não forem todos  1, e Bn é 0 ou
    • Bn-1 a B0 não forem todos  1, e Bn é 1.
  • Bn é 1 sempre que Bn-1 AND … AND B0 e Bn do número anterior forem  diferentes ou sempre que no número anterior:
    • Bn-1 a B0 forem todos  1, e Bn é 0 or
    • Bn-1 a B0 forem todos  1, e Bn é 1.

Resultando a seguinte expressão para o mesmo

En = (B0 AND … AND Bn-1) XOR Bn

Numa evolução iterativa decrescente, o valor do bit Bn de um número terá com os anteriores a seguinte relação:

  • Bn é 0, sempre que  Bn-1 OR … OR B0 e Bn do número anterior forem diferentes, ou em Português, sempre que no número anterior:
    • Bn-1 a B0 não forem todos  0, e Bn é 0 or
    • Bn-1 a B0 forem todos  0, e Bn é 1.
  • Bn é 1 sempre que Bn-1 OR … OR B0 Bn do número anterior forem iguais, ou, em Português, sempre que no número anterior:
    • Bn-1 a B0 forem todos  0, eBn é 0 or
    • Bn-1 a B0 não forem todos 0, Bn é 1.

Resultando a seguinte expressão para o mesmo

En = (B0 OR … OR Bn-1) XNOR Bn

Contador binário com PL e Deteção de Zero

Os circuitos de contagem são rotativos, isto é, quando atingem um dos limites representáveis pelos seus bits reiniciam-se no limite oposto. Por exemplo, um contador de 4 bits, se for crescente quando atinge 1111 recomeça a 0000 e se for decrescente quando atinge 0000 recomeça a 1111.

Nesta perspetiva são úteis na contagem contínua de valores iguais ao máximo representável pelos seus bits que determinem um evento, sabendo que eles contam sempre até ao limite e recomeçam.

Mas, quando queremos contar um valor que pretendemos indicar de cada vez, precisamos criar instrumentos para informar o contador desse valor. E precisamos também que o contador nos informe de quando conclui cada contagem.

Para este tipo de situação, de forma similar à dos registos de deslocamento, vamos igualmente introduzir um circuito de carregamento em paralelo (PL). Para sabermos quando acaba a contagem, nos contadores decrescentes dispomos da deteção de zero, isto é, o próprio circuito deteta quando chega a 0 e envia um sinal para que se execute novo PL ou qualquer ação que originou a contagem, por exemplo aumentar 1 segundo ao relógio de quartzo de que já falámos após contar 1000 pulsos e voltar a carregar 1000.

Na Figura 7 juntámos um circuito lógico de um Contador binário decrescente a 4 bits com Carregamento em Paralelo e Deteção de Zero e vamos restringir a nossa análise a este tipo de contador (decrescente).

Figura 7
Figura 7

O circuito apresenta-se no final de uma contagem, com PL ativo e portanto com as entradas M1 dos MUX em E, prontas para serem memorizados no próximo Clock.

O carregamento em paralelo (PL)consegue-se, tal como nos Registos de Deslocamento, pela introdução de um MUX  de 2 para 1 antes da entrada de cada báscula. Nas entradas de cada MUX estarão ligados o bit de ordem correspondente do número a carregar e o bit correspondente à evolução da contagem

A deteção de zero (Z) consegue-se ligando todas as saídas do circuito a uma porta NOR que assumirá o valor 1 (Z ativo a 1) quando todas as entradas forem 0 ou a uma porta OR que assumirá o valor 0 (Z ativo a 0) quando todas as entradas forem 0. Quando o contador atinge 0, se Z estiver ligado a PL e ambos tiverem o mesmo estado quando ativos, PL é ativado e o circuito contador carrega o novo valor que esteja nas suas entradas. De imediato Z fica inativo e portanto PL também. O contador começa nova contagem decrescente a partir desse valor.

Neste circuito fizemos PL ativo a 1 para podermos verificar que, como dissemos, o seu estado quando ativo é definido só pelas ligações internas no MUX.

Na Figura 8, juntamos um conjunto de quadros que ilustram a evolução dos valores nas diversas entradas e saídas deste circuito ao longo de uma contagem decrescente de 0100 (4) até 0000 (0), contemplando carregamentos em paralelo e deteção de zero.

Figura 8
Figura 8

Os valores nas saídas e os valores selecionados por PL nos MUX são evidenciados com dígitos de maior dimensão. A ordem dos bits é a ordem das básculas B3,B2,B1,B0. Apresentamos o Clock sempre em alta e após o seu flanco ascendente. Assim, o circuito estará no estado pretendido para esse ciclo e preparado para o Clock seguinte.

  • Quadro I  – O circuito encontra-se no estado descrito para a Figura 7. Embora o clock esteja em alta já criou o estado que vai apresentar quando estiver em baixa.
  • Quadro II – No flanco ascendente do Clock os valores a carregar, presentes em E3,E2,E1,E0, são memorizados.  Está executado o carregamento em paralelo (PL).
    Antes de novo Clock, Z e PL passam a 0, pois as saídas do contador já não são todas 0.  Em consequência, fica selecionada a porta M0 dos MUX, onde se encontram já os bits correspondentes ao número seguinte na contagem, 0011 (3), que fica também em E3,E2,E1,E0 aguardando um novo Clock para ser memorizado.
    Nas entradas M1 dos MUX encontram-se presentes os bits do número a carregar, mas são ignorados.
  • Quadros III, IV e V  – O circuito mantém-se no estado de contagem evoluindo até que o valor 0000 (0) é o próximo na contagem, encontrando-se portanto em E3,E2,E1,E0  aguardando o próximo Clock para ser memorizado.
  • Quadro VI – No flanco ascendente do Clock o contador chega a zero, memorizando o valor 0000 (0).

Após esse flanco do clock,  Z e PL passam a 1. Em consequência são selecionadas as entradas M1 dos MUX onde se encontra agora um novo número, 1010 (10), cuja contagem se pretende efetuar e cujos bits passam a estar em E3,E2,E1,E0, esperando por um novo Clock para serem memorizados. O  detetor de zero através do sinal Z informa o exterior do circuito que esta contagem chegou a zero.

O Clock cai mas os valores que se encontram nas entradas e saídas, bem como o valor de PL mantém-se à espera de novo Clock. Aí nova contagem terá início, agora  a partir de 1010 (10). Repare-se que se PL não fosse ativado o valor em sequência para a contagem seria 1111.