Latch Triggers: Engenharia reversa do registro de instrução no Intel 8086

O microprocessador Intel 8086 é um dos chips mais influentes que existe. A arquitetura x86 que ele gerou continua a dominar os computadores desktop e servidores até hoje. E, no entanto, esse chip ainda é simples o suficiente para que seus circuitos possam ser examinados e desmontados sob um microscópio. Neste artigo, explicarei a implementação de um latch dinâmico [ flip-flop de estágio único ], um circuito que contém um bit. O 8086 tem mais de 80 travas espalhadas por todo o chip contendo vários bits importantes do status do processador, mas irei me concentrar em oito deles que implementam o registro de instrução e mantêm a instrução de execução.



O 8086 tem mais de 80 travas. Alguns deles armazenam os valores dos pinos AD (endereço / dados) ou pinos de controle. Outros armazenam o endereço atual do microcódigo e do microcódigo, bem como o endereço de retorno da rotina do microcódigo. O terceiro armazena os bits do registro do comando de origem e de saída e a operação ALU do comando. Muitos armazenam os status do estado interno, que ainda entendo.





Crystal 86 mostrando o registro de instrução de 8 bits



A foto acima mostra o molde de silício 8086 sob um microscópio. Removi as camadas de metal e polissilício para que vocês pudessem ver os transistores - há cerca de 29.000 no total. A área alocada contém um buffer de comando de 8 bits, consistindo em oito travas. Este processador de 1978 ainda era simples o suficiente para um único registro de 8 bits ocupar uma área relativamente grande. A ampliação mostra o silício e os transistores que formam uma única trava.



Como funciona uma trava dinâmica



A trava é um dos elementos mais importantes do 8086, pois controla o que o processador está fazendo. As travas podem ser feitas de maneiras diferentes; o 8086 usa um circuito compacto conhecido como trava dinâmica. A trava dinâmica depende da operação de um gerador de relógio de duas fases, que costumava ser usado para controlar microprocessadores daquela época. O relógio de duas fases gera dois sinais de relógio que estão ativos por sua vez. Na primeira fase, o relógio principal está alto e o relógio que o acompanha está baixo. Então eles trocam de lugar. O ciclo é repetido em uma freqüência de clock, por exemplo 5 MHz.



Muitos microprocessadores usam portas NAND para formar flip-flops RS. Um flip-flop RS geralmente ocupa mais espaço do que um latch dinâmico, especialmente se circuitos adicionais forem adicionados a ele para manter a frequência do clock. Os gatilhos D (gatilhos de atraso) também são populares, mas ficam ainda mais complexos e usam seis portas. Em muitos casos, um transistor de passagem é suficiente; ele pode armazenar um valor para um ciclo de clock, mas não fornece armazenamento de longo prazo.



A velocidade de clock mais alta possível é sempre escolhida para os processadores. O primeiro 8086 funcionava em até 5 MHz e, posteriormente, o 8086-1 suportava até 10 MHz. Porém, devido ao uso de lógica dinâmica, o 8086 também possui uma frequência de clock mínima: 2 MHz. Se o gerador de relógio funcionar mais devagar, existe o risco de vazamento de carga dos condutores antes que os circuitos o acessem, resultando em erros.





A trava no processador 8086 consiste em quatro transistores de passagem e dois inversores. A trava opera em sinais de relógio intermitentes.



O diagrama acima mostra uma trava típica do 8086. Consiste em dois inversores e vários transistores de passagem. Para nossos propósitos, o transistor de passagem pode ser considerado uma chave: se 1 vem para a porta, o transistor transmite o sinal mais adiante. Se vier 0, o transistor bloqueia o sinal. O transistor de passagem é controlado por vários sinais: load, que carrega um pouco na trava; hold (hold), mantendo o valor de bit existente; o relógio da primeira fase e o relógio da segunda, invertidos.



O diagrama abaixo mostra como um valor (neste caso, 1) é carregado na trava. O sinal de carga aumenta, permitindo que o sinal de entrada (1) passe pelo transistor. Já que o sinal do relógioalto, o sinal passa do segundo transistor para o inversor, que dá 0. Nesse momento, o terceiro transistor (relógio) bloqueia o sinal.





O sinal de entrada é carregado na trava quando o sinal de carga está alto.



Na próxima fase do relógio, o sinal do relógio fica alto, fazendo com que o sinal 0 alcance o segundo inversor, que dá saída 1. Como o sinal de retenção é alto, o sinal volta, mas é bloqueado pelo transistor do relógio.... O que torna este circuito dinâmico é que nenhum sinal de entrada está sendo enviado para o primeiro inversor. Sua entrada permanece 1 (mostrado em cinza) devido à capacitância do circuito. Algum dia essa carga vazará, o valor será perdido, mas antes desse momento ocorrerá uma nova comutação do gerador de pulso do relógio.





Quando o sinal do clock fica alto, o valor passa pelo segundo inversor. A entrada para o primeiro inversor (cinza) é mantida pela capacitância do circuito.



Após alternar o estado do gerador de relógio, a entrada para o segundo inversor fornecerá a capacidade do circuito (veja abaixo). O sinal volta, recarregando e atualizando a entrada do primeiro inversor. Em relógios subsequentes, a trava alternará entre este e o padrão anterior, mantendo o valor armazenado e mantendo a saída estável.



A chave para o funcionamento da trava é a presença de dois inversores, que mantêm o sinal de saída estável. Um número ímpar de inversores causaria oscilação - esse recurso é usado pela bomba de carga do 8086. Além disso, um par de inversores usa um conjunto de registradores do 8086 para armazenar bits. Porém, em um conjunto de registradores, os dois inversores são conectados diretamente, sem os transistores de passagem acionados por clock, resultando em um sistema de armazenamento mais compacto, mas difícil de gerenciar.





Quando o sinal do clock está alto, o valor passa pelo primeiro inversor.



Implementação em silício



O 8086 e outros processadores daquela época eram baseados em transistores N-MOS . Eles eram feitos de um substrato de silício, ao qual impurezas de arsênio ou boro eram adicionadas durante o processo de dopagem , que formavam os transistores. Em cima do silício estava o polissilício, que criava as portas dos transistores e os condutores que conectavam todos os componentes. Outra camada, de metal, fornecia conexões condutoras adicionais. Os processadores modernos, em comparação, usam a tecnologia CMOS , uma combinação das tecnologias N-MOS e P-MOS, e têm mais de uma camada condutora metálica.





Como um transistor N-MOS ( estrutura MOS ) é implementado em um IC



O diagrama acima mostra a estrutura do transistor. Um transistor pode ser visto como uma chave que permite que a corrente flua de uma seção (fonte) para outra (dreno). O transistor é acionado por um portão feito de um tipo especial de silício - polissilício. Aplicar uma tensão à porta permite que a corrente flua entre a fonte e o dreno, enquanto puxar a porta para 0 V bloqueia a corrente. A porta é separada do silício por uma camada isolante de óxido - por isso, a porta funciona como um capacitor, como pode ser visto no exemplo de uma trava dinâmica.



O inversor (abaixo) é composto de um transistor N-MOS e um resistor. Quando o sinal está baixo, o transistor está desligado, então o resistor pull-up puxa o sinal de saída para cima. Quando o sinal está alto, o transistor liga, conectando a saída ao terra e puxando a saída para baixo. Assim, o circuito inverte o sinal de entrada.



O resistor pull-up na porta N-MOS é implementado usando um tipo especial de transistor. Um transistor de modo de esgotamento funciona como um resistor, mas ocupa menos espaço e é mais eficiente.





O diagrama mostra como um inversor é feito de um transistor e um resistor. A foto mostra como o circuito é implementado no chip. A camada de metal foi removida para revelar o polissilício e o silício.



A foto à direita mostra como o 8086 implementa fisicamente um inversor. As áreas amareladas são de silício condutor com impurezas e as áreas manchadas são de polissilício na parte superior. O transistor é feito onde o polissilício cruza o silício dopado. O polissilício forma a porta do transistor e seções de silício em ambos os lados fornecem a fonte e o dreno do transistor. Um grande retângulo de polissilício forma um resistor pull-up entre + 5V e a saída. Você pode comparar a estrutura dessas estruturas físicas com um diagrama.



O diagrama abaixo mostra a implementação da trava no chip. Um transistor de passagem e dois inversores são marcados; o primeiro inversor é descrito acima. Condutores de polissilício conectam componentes uns aos outros. Conexões adicionais foram fornecidas por uma camada de metal (removida para a foto). A forma complexa dos transistores permite o uso mais eficiente do espaço.





Foto microscópica da trava no processador 8086. A camada de metal com os condutores foi removida, mas seus traços são visíveis na forma de linhas verticais avermelhadas. Foto girada 180 ° para se ajustar ao layout.



A trava usa buffers de saída não marcados no diagrama para fornecer sinais de alta corrente para a saída e saída invertida. Esses buffers têm um nome engraçado, "superbuffers" - porque eles fornecem uma corrente muito mais alta do que um inversor N-MOS típico. O problema com um inversor N-MOS é que ele funciona lentamente ao dirigir algum circuito de alta capacidade. Como o superbuffer fornece mais corrente, ele alterna o sinal muito mais rápido. Ele consegue isso substituindo o resistor pull-up por um transistor de corrente mais alta. A desvantagem é que o transistor pull-up requer um inversor para operar, portanto, o circuito do superbuffer é mais complicado. Portanto, o superbuffer é usado apenas quando necessário - geralmente ao enviar um sinal para muitos portões ou ao dirigir um ônibus longo.





Implementação do superbuffer 8086. Observe que as conexões de +5 V e terra são movidas para os transistores mais à direita.



O diagrama acima mostra um esquema do superbuffer de latch 8086. Ao contrário de um superbuffer convencional, este tem um superbuffer invertido e não invertido. Para entender o circuito, observe que o resistor central e o transistor formam um inversor. A saída do inversor é conectada aos transistores superiores, e a entrada não invertida é conectada aos transistores inferiores. Então, se a entrada for 1, os transistores inferiores ligam, e se a entrada for 0, graças ao inversor, os transistores superiores ligam. Então, se a entrada for 1, os transistores inferiores puxarão a saída para cima, e a saída correspondente - para baixo. Se a entrada for 0, os transistores superiores puxarão a saída para baixo e a saída correspondente- acima.



O problema com o inversor N-MOS é que o resistor pull-up tem uma corrente limitada. Quando a saída é 0, o transistor no inversor rapidamente e com corrente relativamente alta puxa a saída para baixo. No entanto, se a saída for 1, a saída será aumentada por um resistor pull-up muito mais fraco.



Um superbuffer é semelhante a um inversor CMOS, pois possui um transistor pull-up e um transistor pull-down. A diferença é que o CMOS usa transistores P-MOS e N-MOS, enquanto o P-MOS usa uma entrada de porta invertida. Por outro lado, o superbuffer N-MOS requer um inversor separado. Em outras palavras, um inversor CMOS usa dois transistores, e o superbuffer é muito menos eficiente, pois requer quatro transistores.



O superbuffer usa um transistor de modo de aprimoramento para puxar para cima e um transistor de modo de aprimoramento para puxar para baixo. A tensão limite de um transistor com seu próprio canal está abaixo de zero, o que permite que sua saída seja puxada para 5 V e não desliga com uma tensão mais baixa. Quando a saída é baixa, o transistor de autocanalização ainda estará ligado e funcionará como um pull-up normal em um inversor convencional, de modo que uma certa quantidade de corrente fluirá através dele. Você pode ler mais sobre o superbuffer aqui .



Registro de comando



Como a maioria dos processadores, o 8086 tem um registro de instrução onde a instrução em execução no momento é armazenada. No 8086, o registro de comando contém o primeiro byte do comando (que pode ser vários bytes), portanto, é composto de oito travas. Alguém poderia pensar que eles seriam idênticos, no entanto, cada um deles tem sua própria forma. O layout do 8086 é altamente otimizado, de modo que o formato de cada trava é projetado para fazer o melhor uso do espaço disponível devido às limitações dos condutores ao redor. Em particular, observe que algumas travas se conectam e compartilham a alimentação e o aterramento. Aparentemente, pelo mesmo motivo, as travas não se encaixam.





Todas as 8 travas têm formas ligeiramente diferentes, otimizadas para os condutores circundantes. No início do artigo, a trava # 1 foi girada 180 °. As linhas verticais vermelhas são traços da camada de metal removida.



A equipe viaja o 8086 em um caminho sinuoso. O processador usa pré-busca para melhorar o desempenho, carregando instruções da memória antes que sejam necessárias. Eles são armazenados na fila de comandos, uma fila de 6 bytes localizada no meio de um conjunto de registradores. Em comparação, os processadores modernos têm um cache de comando que pode ter vários megabytes.



Quando um comando é executado, ele é armazenado no registrador de comando, aproximadamente no centro do chip. As distâncias relativamente grandes explicam a necessidade de um superbuffer. O registro de comando alimenta o comando para a "ROM de descriptografia de grupo". Esta ROM define as características de alto nível do comando - é um byte, ou multibyte, ou é o prefixo do comando. E esta é apenas uma pequena parte do complexo sistema de processamento de instrução 8086. Outras travas armazenam partes das instruções, marcando o uso de registro e operações ALU, e um circuito separado controla o mecanismo de microcódigo - mas vou descrever isso separadamente.





Crystal 8086, os principais componentes para processamento de comandos estão marcados. Ao longo do perímetro, fios de solda conectam o cristal a contatos externos.



Conclusão



O 8086 faz uso extensivo de travas dinâmicas para armazenar estados internos. Eles são visíveis ao microscópio e seus circuitos podem ser rastreados e compreendidos. O cristal 8086 é interessante de analisar porque, ao contrário dos processadores modernos, seus transistores são grandes o suficiente para serem vistos em um microscópio. Era um processador sofisticado com 29.000 transistores para a época, mas simples o suficiente para que seus circuitos fossem rastreados e compreendidos.



All Articles