Escritos
B. Piropo
Internet:
< Coluna em ForumPCs >
Volte de onde veio
19/12/2005
< Computadores XVIII: Lógica temporizada >

Para entendermos o que vem a ser “lógica temporizada” (em inglês, “clocked logic”) devemos ter em mente que tudo o que ocorre no interior dos computadores depende da alteração, ao longo do tempo, do estado de grandezas elétricas.
Tomemos como exemplo a própria memória principal, MP, ou memória RAM, que discutimos na coluna anterior (embora apenas superficialmente; voltaremos a ela em detalhes mais adiante): sua característica mais importante é justamente a possibilidade de alterar o valor armazenado em cada uma de suas muitas posições. E isto é feito alterando o estado de cada um dos oito capacitores usados nas oito células de memória que armazenam o valor de cada posição. Alterando-se o estado de um capacitor de “carregado” para “descarregado”, altera-se o valor do bit correspondente de “um” para “zero”.
Então, para alterar o valor contido (ou “escrever” novo valor) em uma posição de memória é necessário modificar o estado dos oito capacitores elementares que a constituem, carregando-os ou descarregando-os. O que pode ser feito, respectivamente, aplicando-se tensões elétricas a seus terminais ou fechando-se um curto-circuito entre eles (operação realizada pelo controlador da memória). E é fundamental que estas modificações ocorram de forma tão simultânea quanto possível, ou seja, que os oito capacitores mudem de carga ao mesmo tempo. Porém, por mais cuidadosa que seja a técnica de fabricação, alguns destes capacitores podem demorar um pouco mais para se carregarem – ou descarregarem – que outros (note que falamos aqui de intervalos de tempo da ordem de nanossegundos, ou bilionésimos de segundo).
Nesse contexto, a importância do fator “tempo” é crucial e é fácil entender o porquê. Imagine que se tente fazer uma leitura do conteúdo de uma dada posição de memória logo após ter-se escrito nela um novo valor. Imagine ainda que o procedimento de escrita em cada uma das oito células que formam aquela posição de memória não tenha sido simultâneo e ainda não tivesse sido encerrado quando a leitura foi feita. O resultado disso será a leitura do valor em um instante em que o estado de alguns capacitores já foram alterados e outros ainda não. E o valor lido não estará correto.
Pois a lógica temporizada visa evitar justamente situações como estas. E consegue de uma forma simples e engenhosa. Vejamos como através de um exemplo.

Figura 1: Lendo dados na varanda


Imagine que você e um amigo que mora em um prédio próximo, cujas varandas são mutuamente visíveis, como as da Figura 1, decidam se comunicar hasteando bandeiras nas varandas. Usariam o código ASCII no qual cada um de seus 256 caracteres é representado por um byte. E, para formar os bytes, recorreriam a varais estendidos nas varandas, onde pendurariam bandeiras brancas ou negras, fazendo uma bandeira negra corresponder ao bit “um” e uma bandeira branca ao bit “zero”. Combinando oito bandeiras de cada vez (que, juntas, formariam um byte) você e seu amigo poderiam trocar mensagens “escrevendo” um caractere após o outro. Mas enfrentariam um problema: depois de “ler” um caractere anotando a combinação de bandeiras brancas e pretas que formam o byte a ele correspondente, como saber se o amigo na outra varanda já teria terminado de ajustar todas as oito bandeiras para gerar o próximo caractere?
Bem, há diversas soluções. Uma delas seria instalar em um ponto visível de ambas as varandas, como o do poste mostrado na Figura 1, uma lâmpada que “pisque” em intervalos regulares. Digamos, de minuto em minuto. Você e seu amigo combinariam anotar as posições das bandeiras somente após cada lampejo da lâmpada. Desta forma, cada um de vocês teria um minuto inteiro para ajeitar as bandeiras formando os bytes (caracteres) desejados e a certeza que, no momento da leitura, todas as oito bandeiras já estariam em suas devidas posições.

ANIMAÇÃO 2: CLIQUE AQUI PARA ACOMPANHAR A TRANSMISSÃO DE UMA MENSAGEM DE “Bom_dia”


Será que funciona? Acompanhe o que acontece na Animação 2. Veja, depois de cada lampejo da lâmpada sobre o poste, como as bandeiras mudam uma a uma até formarem o byte correspondente a cada caractere. Repare que elas já estarão devidamente “arrumadas” antes do próximo lampejo, garantindo que o observador leia o valor correto quando a lâmpada “piscar” novamente. E a mensagem prossegue, caractere a caractere, até o último. O método é simples, quase tosco, mas funciona.
Pois bem: a forma que você e seu amigo escolheram para se comunicar pode até não ser muito prática. Mas, com ela, vocês acabaram de inventar a lógica temporizada.
Nossos micros funcionam exatamente assim. Ou quase: em vez da lâmpada que “pisca”, usam cristais de quartzo que emitem pulsos de tensão elétrica em intervalos absolutamente regulares.
O quartzo é um tipo de rocha cujos cristais apresentam uma curiosa propriedade: quando a eles se aplica uma corrente elétrica, vibram emitindo pulsos de tensão em uma freqüência absolutamente constante (chamada freqüência de ressonância) que depende das dimensões e da forma do cristal. Quando se necessita marcar tempos com grande precisão em circuitos eletrônicos, aplica-se uma corrente elétrica a um cristal lapidado de forma a manter uma freqüência de ressonância exata. Contando-se as vibrações determina-se os tempos decorridos (por exemplo: se o cristal oscilar em 1 KHz, ou mil vezes por segundo, basta contar mil oscilações para obter um segundo; a freqüência de oscilação é tão regular que as imprecisões acumuladas andam na casa de poucos segundos por mês). Relógios digitais são feitos a partir de cristais de quartzo.
Como vimos na coluna anterior, um dos elementos contidos em uma UCP (mais especificamente em sua unidade de controle) é um temporizador (ou “clock”), constituído por um cristal que determina a freqüência de operação da UCP, ou seja, o ritmo em que transcorrem suas ações internas. O intervalo entre dois pulsos emitidos sucessivamente por este cristal corresponde ao “ciclo de máquina” da UCP.
Nos primeiros computadores pessoais (como o PC/XT, o primeiro computador pessoal da IBM lançado em agosto de 1981 cuja UCP era o microprocessador 8088 da Intel com freqüência de operação de 4,77 MHz) o cristal contido na UCP comandava não somente o ritmo de suas operações internas como também o das transferências de dados entre ela e os componentes da placa-mãe. Em outras palavras: nessas máquinas a freqüência de operação da UCP era igual à do barramento. Porém nestes 25 anos a tecnologia de fabricação de microprocessadores evoluiu muito mais rapidamente que a de fabricação dos módulos de memória RAM. O resultado disso é que já não se pode ler e escrever na MP com a mesma rapidez com que se sucedem os ciclos de máquina da UCP. Trocando em miúdos: a freqüência de operação interna das UCPs modernas é muito mais rápida que a dos barramentos.
No que diz respeito ao barramento frontal, ou seja, à comunicação entre UCP e MP, em geral a freqüência interna da UCP é um múltiplo da freqüência do barramento. Por exemplo: um moderno microprocessador cuja freqüência de operação é de 2 GHz pode funcionar em uma placa-mãe cujo barramento frontal opere, digamos, com a freqüência de 200 MHz. É prática corrente dizer que nessa situação o “multiplicador” é igual a dez (200 MHz x 10 = 2.000 MHz = 2 GHz), o que dá a idéia de que a freqüência é gerada para controlar o barramento e somente então multiplicada por dez para ser aplicada à UCP. Na verdade ocorre justamente o oposto: o sinal (sucessão de pulsos) gerado pelo cristal interno da UCP para determinar sua freqüência de operação interna é que é dividido por dez (ou seja: submetido a um contador que deixa passar apenas um pulso a cada dez que recebe) para ser aplicado ao barramento (mais especificamente: à linha de “clock”, ou linha CLK, do barramento).

Figura 3: “Sinais” (pulsos elétricos) de freqüência constante


Veja como a coisa funciona examinando o esquema da Figura 3. Em sua parte superior aparece, em vermelho, o “sinal” produzido por um cristal de quartzo lapidado para gerar uma freqüência de 100 MHz. Este cristal emitirá um pulso de tensão a cada dez nanossegundos (um ns é igual a um bilionésimo de segundo; em um segundo são então emitidos cem milhões de pulsos com a duração de 10 ns, o que garante a freqüência de 100 MHz). Se acompanharmos a variação da tensão na linha (condutor elétrico) onde este pulso é aplicado, veremos que ela sobe rapidamente até atingir seu valor máximo, mantém-se neste máximo por alguns ns, cai rapidamente até zero e aí se mantém por mais alguns ns, repetindo este ciclo continuamente. O “período” (ou seja, a duração de um ciclo completo) é medido desde o início de um ciclo (quando a tensão começa a subir) até o início do ciclo seguinte. E, como se vê no gráfico da parte superior da Figura 3, dura exatos 10 ns.
Já na parte inferior vê-se o mesmo sinal, porém submetido a um “divisor por cinco”, ou seja, um circuito que de cada cinco pulsos deixa passar apenas um. O resultado disso é um sinal cujos pulsos se sucedem a cada 50 ns. Um sinal destes corresponde a uma freqüência de operação de 20 MHz (faça as contas, dividindo um segundo por 20 milhões).
O exemplo é apenas ilustrativo (não há computadores comerciais cuja UCP opere em 100 MHz e cujo barramento frontal opere em 20 MHz), mas dá uma idéia razoável de como é possível operar um sistema no qual a UCP e o barramento frontal operam em freqüências diferentes e, sobretudo, explica porque quando isto ocorre a freqüência de operação da UCP é sempre um múltiplo daquela em que opera o barramento frontal.
Se tudo isso lhe parece complicado, guarde apenas um detalhe: uma das linhas do barramento de controle do FSB serve apenas para ditar o ritmo de funcionamento do barramento, ou sua freqüência de operação. Isto é feito através de pulsos sucessivos de tensão elétrica aplicados a esta linha. E se observarmos a variação da tensão ao longo do tempo nessa linha, teríamos um resultado parecido com o dos gráficos exibidos na Figura 3. Esta linha chama-se “linha de clock”, ou simplesmente CLK.
Na comunicação entre os componentes da placa-mãe estes pulsos desempenham o mesmo papel da lâmpada no poste da Figura 1.
A coisa funciona assim: digamos que a UCP quer enviar um número para a memória. Imaginemos que seja um número a ser escrito em uma das posições da MP. No exemplo da placa-mãe que vimos na coluna anterior, o número terá oito bits (pois cada posição de memória pode armazenar um byte). Portanto, o barramento que transportará este valor terá oito linhas, das quais cada uma transportará um bit. Como este valor é um dado a ser escrito na MP, este conjunto de linhas denomina-se “barramento de dados” (veja a coluna anterior, < http://www.forumpcs.com.br/viewtopic.php?t=141948 > “Placas-mãe e memória principal”).
Os oito bits que formam o número serão então transportados pelo barramento de dados da UCP para o controlador da memória, que depois tomará as providências para escrevê-los no endereço desejado.
Mas como um condutor elétrico pode “transportar” um bit?
Fácil: através de uma tensão elétrica. Se aplicarmos uma tensão em uma das extremidades do condutor, esta tensão se propagará por todo o condutor (senão ele não seria um condutor, verdade?) e poderá ser percebida (ou “lida”) na extremidade oposta.
Então, para “transportar” um bit “um” da UCP para a memória basta que a UCP aplique uma tensão na extremidade de uma das linhas do barramento frontal (que, como sabemos, liga a UCP à MP) e espere esta tensão ser “lida” pelo controlador da memória na extremidade oposta da linha. E para “transportar” um bit “zero” basta não aplicar tensão alguma no condutor correspondente.
Imagine que o número a ser “transportado” seja “00110011”. O barramento de dados tem oito condutores (ou “linhas”) paralelos. Então basta aplicar uma tensão nos dois condutores da extremidade direita, não aplicar tensão alguma nos seus dois vizinhos da esquerda, aplicar tensões nos próximos dois condutores e não aplicar nos dois últimos.
Mas estas tensões não podem permanecer aplicadas por todo o tempo. Elas são aplicadas apenas até o momento em que, do outro lado, o controlador da memória as “lê”.
E quando isso ocorrerá?
Bem, lembra-se do poste entre os dois edifícios lá na Figura 2? Pois o condutor elétrico denominado “linha de clock” (ou CLK) do barramento de controle desempenha uma função equivalente. A UCP dispõe de todo o tempo transcorrido entre dois pulsos sucessivos para aplicar as tensões devidas no seu lado do barramento. Em seguida, espera até que um pulso seja disparado na linha CLK. Este pulso também é percebido pelo controlador da memória (pois o barramento se estende por todos os elementos da placa-mãe). E exatamente neste momento, ao sentir o pulso, o controlador da memória lê as tensões em sua extremidade do barramento.
O fato das leituras das tensões nas oito linhas do barramento de dados serem feitas sempre no início de cada pulso garante que todas sejam lidas simultaneamente. Portanto, mesmo que a UCP ou o controlador da MP demorem um pouco mais ou um pouco menos para ajustar cada tensão, como este ajuste é feito sempre nos intervalos entre pulsos, haverá tempo suficiente para que tudo esteja “nos conformes” no momento em o novo pulso é disparado, garantindo assim que o valor lido estará sempre correto.
E assim a faina prossegue: cada vez que um pulso é disparado na linha CLK (o que corresponde ao início do lampejo da lâmpada no poste) o controlador da memória lê as oito tensões nos condutores do barramento de dados. Para leituras sucessivas, a UCP altera as tensões no intervalo entre pulsos, colocando um novo valor lá do seu lado. Que será lido pelo controlador da memória no lado oposto assim que for disparado mais um pulso. E assim são transportados números entre UCP e memória, byte após byte. Evidentemente, para transportar dados entre memória e UCP, o procedimento é exatamente o mesmo, porém no sentido inverso: o controlador da memória ajusta as tensões na sua extremidade das linhas de dados e, no próximo pulso da linha CLK, a UCP as lê lá na sua extremidade.
Assim funciona a chamada lógica temporizada. Que, para quem gosta de definir as expressões com propriedade, é “uma metodologia de projeto da lógica digital baseada em um sinal temporizado (“clock signal”) usada na implementação de circuitos lógicos combinatórios para sincronizar transmissão de dados através de barramentos”.
Agora já podemos destrinchar os procedimentos de leitura e escrita na memória.
Na próxima coluna, naturalmente.

B. Piropo


URL: http://www.bpiropo.com.br
Copyright Benito Piropo Da-Rin
WebMaster:
Topo da Página
Atualizada em
(MM/DD/AA) + Hora
Wagner Ribeiro ]