·

Cursos Gerais ·

Linguagens de Programação

Send your question to AI and receive an answer instantly

Ask Question

Preview text

Projeto Digital e Arquitetura de Computadores By David Money Harris Sarah L Harris Morgan Kaufman English 2nd Edition 2013 Esta tradução Portuguesa foi patrocinada pela Imagination Technologies wwwimgteccom communityimgteccomuniversity ii Esta edição do Digital Design and Computer Architecture de David Money Harris e Sarah L Harris é publicada por acordo com a ELSEVIER INC a Delaware Corporation com sede em 360 Park Avenue South New York NY 10010 USA Publicada por Imagination Technologies 2nd Edição Português ISBN 9780995483903 Elsevier Inc Todos os diretos reservados 2nd Edition English ISBN 9780123944245 Traduzido por António EspíritoSanto e Renato de Macedo Giovanini António EspíritoSanto Licenciado em Engenharia Eletrotécnica ramo de Automação Energia e Electrónica pela Universidade de Coimbra e Mestre em Engenharia Eletrotécnica ramo de Sistemas e Automação pela mesma Universidade Obteve o Doutoramento em Engenharia Eletrotécnica pela Universidade da Beira Interior onde é atualmente Professor Auxiliar Na Universidade da Beira Interior leciona unidades curriculares de Sistemas Embutidos e de Instrumentação e Medida Para além disso coordena o Laboratório de Investigação de Instrumentação e Sensores Biomédicos É ainda investigador do Instituto de telecomunicações Renato de Macedo Giovanini Engenheiro Eletricista graduado pela Universidade Estadual Paulista UNESP Faculdade de Engenharia de Ilha Solteira onde atualmente desenvolve projeto de Pesquisa no LIEB Laboratório de Instrumentação e Engenharia Biomédica na área de Instrumentação Eletrônica aplicada à Engenharia de Reabilitação Já atuou como professor ou instrutor em diversas áreas de música a cursos prévestibulares Se tiver sugestões eou correções por favor envie para António EspíritoSanto iii Material Ensino MIPSfpga Introdução O MIPSfpga disponibiliza o códigofonte RTL do núcleo MIPS microAptiv para implementação numa FPGA juntamente com materiais de ensino O núcleo MIPS microAptiv UP é um membro da mesma família de microcontroladores encontrados em muitos dispositivos embarcados incluindo o popular microcontrolador PIC32MZ da Microchip e o novo Artik1 da Samsung Os materiais de ensino irão mostrarlhe como usar este núcleo como parte de um curso de Arquitectura de Computadores abrindo o caminho para que os seus alunos possam explorar o modo como o núcleo de um processador comercial com pipeline trabalha internamente e possam usar este núcleo em seus projetos criando os seus próprios projetos SoC Com a sua longa herança e excelente documentação a MIPS é a escolha preferida de arquitetura RISC para muitos professores em todo o mundo Mas no passado para demonstrar conceitoschave os professores tiveram de se contentar com a criação de núcleos parciais MIPSlike ou usar cópias não oficiais de herança dúbia Agora não o MIPSfpga é o verdadeiro RTL industrial não ofuscado e está disponível livremente para uso acadêmico Estrutura Os materiais pedagógicos MIPSfpga são compostos de três partes O Getting Started Package contém um guia detalhado que começa com uma breve introdução ao núcleo MIPSfpga incluído no pacote Ele dá uma visão geral de como configurar o núcleo para a simulação ou colocálo numa FPGA assim como a programação do processador Orientações sobre a instalação do software também são dadas juntamente com detalhadas e instruções de referência sobre o núcleo e iv a sua ISA Instruction Set Architecture o Guia do System Integrator e como usar as UDI User Defined Instructions Todos os usuários precisam deste pacote em primeiro lugar porque ele contém a RTL os guias de referência um instalador OpenOCD Codescape Essentials e outros componentes O Getting Started Guides em outros idiomas são apenas traduções do guia MIPSfpga Fundamentals Aqui o leitor vai encontrar slides acompanhado de roteiros de laboratório ilustrando o uso da Digilent Nexys 4 DDR ou outras plataformas Com isso será levado desde construir o núcleo até à programação em C e assembly com 9 exercícios para completar ao longo do caminho O leitor então pode avançar e adicionar uma variedade de periféricos ao núcleo de modo a permitir um maior nível de interação O último exemplo ilustra como portar o MIPSfpga para outras placas FPGA tais como a Basys 3 MIPSfpga SOC Este pacote avançado permite que execute o Buildroot Linux no MIPSfpga especificamente utilizando a plataforma Digilent Nexys4 DDR O núcleo microAptiv é empacotado como um bloco IP utilizável por Xilinx Vivado IP Integrator Como resultado o AXI baseado nos blocos de IP da Xilinx pode facilmente ser conectado com o núcleo MIPS Estes são usados para criar um exemplo SoC como um projeto com uma UART e Ethernet rodando sob Linux em MIPSfpga Um bloco GPIO AXI personalizado juntamente com um exemplo de driver em Linux também é fornecido Há extensa documentação incluída Coletivamente estes constituem uma excelente base para um curso SoC sendo altamente relevante para as necessidades da indústria de projeto de chips embora o nível de complexidade a destine a uma pósgraduação Os estudantes de doutoramento e pósdoc vão também reconhecer que este material será muito útil para os seus projetos de pesquisa Cursos Alvo e Projetos Nível de Escolaridade Projecto Digital microarquiteturas BSC Organização de Computares Arquiteturas Arquiteturas Avançadas de Computadores Licenciatura Mestrado Projeto SoC MSc Verificação de Projeto MSc Projeto de Sistemas Embarcados Licenciatura Mestrado v Arquitetura de Processadores modificações melhorias otimização MSc PhD Os Autores Os materiais do curso foram desenvolvidos por David Harris e Sarah Harris coautores do popular livro Digital Design and Computer Architecture e fornece um acompanhamento exclusivamente relevante da MIPSfpga Materiais Complementares Livro de texto Computer Organisation and Design de David Patterson e John L Hennessy continua a ser a bíblia para essas atividades e fornece mais profundidade ao Harris Harris num curso baseado em MIPSfpga Outros livros relevantes são referenciados aqui httpcommunityimgteccomuniversityresourcesbookssubjectmipsarchitecture Aceda ao núcleo microAptiv em silício através de placas como Digilent WiFire incorporação da Microchip PIC32MZ MCU Vídeos do workshop dadas por Sarah Harris e Parimal Patel da Xilinx online Aqui httpcommunityimgteccomuniversityvideogallery Programa global de Workshops a ser anunciado na página Eventos Universitários vi Ferramentas requeridas Hardware Host PC Windows 64 bits Digilent Basys 3 ou Nexys 4 DDR com Xilinx Artix 7 FPGA Adaptação a outras placas foi demonstrada Zed board Nexys 3 Nexys 4 not DDR etc programador JTAG SEEED Studio MIPS Bus Blaster incluindo o adaptador de 14 para 12 pinos para a placa Nexys4 DDR Software Codescape MIPS SDK Essentials instalador incluído com o Getting Started Package OpenOCD Instalador incluído com o Getting Started Package ou versão offline disponível para download do site do IUP Vivado Xilinx Web Pack Edition Mentor Graphics ModelSim Student ou Full editions ou Xilinx Xsim Disponibilidade Imediata MIPSfpga Getting Started ver 13 MIPSfpga Fundamentals 13 MIPSfpga SOC ver 10 vii Línguas em que o Getting Started Fundamentals está atualmente disponível Inglês Chinês simplificado Japonês Russo Espanhol Suporte O fórum Insider MIPS aqui tem uma linha especificamente para questões técnicas sobre o MIPSfpga O fórum do IUP Imagination University Programme aqui para discussão de currículos e outros assuntos Parceiros Temos trabalhado em estreita colaboração com a Xilinx e a Digilent que deram um apoio maravilhoso a este projeto grande e complexo Os detalhes sobre seus programas universitários está aqui viii Como se juntar ao IUP e aceder a estes materiais 1 Clique em Register ou Join IUP na página de principal wwwimgteccomuniversity 2 Complete a primeira seção the Community Registration 3 Marque a caixa selecionada Join Imagination University Programme e complete a informação adicional 4 Um email de verificação será enviado para si para ativação Por favor verifique também a caixa de correio de spam porque de vez em quando o correio é filtrado 5 Para fazer download dos materiais de ensino visite a página IUP Teaching Resources httpcommunityimgteccomuniversityresources 6 Solicitar o pacote s que deseja aceite o contrato de licença e forneça alguns detalhes sobre como pretende usar os materiais 7 Em seguida iremos receber um pedido para aprovar a sua transferência normalmente esta ação completase em menos de 48 horas Uma vez aprovado receberá um email com as instruções de download NOTA Os pedidos podem ser rejeitados pelas seguintes razões Os dados de registo estão incompletos Há poucos ou nenhuns detalhes sobre a utilização prevista O solicitante parece ser uma empresa comercial ou um concorrente ix Índice 1 DO ZERO AO UM 1 11 O PLANO DE JOGO 1 12 A ARTE DE GERIR A COMPLEXIDADE 2 13 ABSTRAÇÃO DIGITAL 6 14 BASES NUMÉRICAS 8 15 PORTAS LÓGICAS 23 16 POR BAIXO DA ABSTRAÇÃO DIGITAL 27 17 TRANSÍSTORES CMOS 33 18 CONSUMO DE ENERGIA 43 19 SUMÁRIO E ANTECIPAÇÃO 45 2 PROJETO DE LÓGICA COMBINATÓRIA 73 21 INTRODUÇÃO 73 22 EQUAÇÕES BOOLEANAS 77 x 23 ÁLGEBRA BOOLEANA 81 24 DA LÓGICA ÀS PORTAS 90 25 LÓGICA COMBINATÓRIO MULTINÍVEL 93 26 XS E ZS OH MEU DEUS 97 27 MAPAS DE KARNAUGH 99 28 BLOCOS COMBINATÓRIOS 109 29 TEMPORIZAÇÃO 115 210 SUMÁRIO 123 3 PROJETO DE LÓGICA DIGITAL 139 31 INTRODUÇÃO 139 32 BÁSCULAS E FLIPFLOPS 140 33 PROJETO DE LÓGICA SÍNCRONA 153 34 MÁQUINAS DE ESTADOS FINITOS 159 35 TEMPORIZAÇÃO DA LÓGICA SEQUENCIAL 186 36 PARALELISMO 208 37 SUMÁRIO 213 4 LINGUAGENS DE DESCRIÇÃO DE HARDWARE 231 41 INTRODUÇÃO 231 42 LÓGICA COMBINATÓRIA 237 43 MODELAGEM ESTRUTURAL 257 xi 44 LÓGICA SEQUENCIAL 262 45 MAIS LÓGICA COMBINATÓRIA 271 46 MÁQUINAS DE ESTADOS FINITOS 289 47 TIPOS DE DADOS 297 48 MÓDULOS PARAMETRIZADOS 304 49 TESTBENCHES 310 410 SUMÁRIO 317 5 BLOCOS DE CONSTRUÇÃO DIGITAL 339 51 INTRODUÇÃO 339 52 CIRCUITOS ARITMÉTICOS 339 53 SISTEMAS NUMÉRICOS 361 54 BLOCOS DE CONSTRUÇÃO SEQUENCIAIS 368 55 MATRIZES DE MEMÓRIA 373 56 MATRIZES LÓGICAS 386 57 SUMÁRIO 397 6 ARQUITETURA 417 61 INTRODUÇÃO 417 62 LINGUAGEM ASSEMBLY 418 63 LINGUAGEM DE MÁQUINA 431 64 PROGRAMANDO 439 xii 65 MODOS DE ENDEREÇAMENTO 476 66 LUZ CÂMERA AÇÃO COMPILANDO MONTANDO E CARREGANDO 480 67 MISCELÂNEA 489 68 PERSPECTIVA DO MUNDO REAL ARQUITETURA X86 496 69 SUMÁRIO 507 7 MICROARQUITETURA 529 71 INTRODUÇÃO 529 72 ANÁLISE DE DESEMPENHO 534 73 PROCESSADORES DE CICLOÚNICO 536 74 PROCESSADOR MULTICICLO 554 75 PROCESSADOR COM PIPEPLINE 579 76 REPRESENTAÇÃO HDL 604 77 EXCEÇÕES 621 78 MICROARQUITETURA AVANÇADA 625 79 PERSPECTIVA DO MUNDO REAL MICROARQUITETURA X86 644 710 SUMÁRIO 653 8 MEMÓRIA E SISTEMAS DE IO 667 81 INTRODUÇÃO 667 82 ANÁLISE DA PERFORMANCE DOS SISTEMAS DE MEMÓRIA 672 83 CACHES 674 xiii 84 MEMÓRIA VIRTUAL 695 85 INTRODUÇÃO AO IO 710 86 SISTEMAS DE IO EMBARCADOS 713 87 SISTEMAS IO DO PC 793 88 PERSPECTIVA DO MUNDO REAL MEMÓRIA X86 E SISTEMAS IO 803 89 SUMÁRIO 808 A IMPLEMENTAÇÃO DE SISTEMAS DIGITAIS 825 A1 INTRODUÇÃO 825 A2 LÓGICA 74XX 825 A3 LÓGICA PROGRAMÁVEL 827 A4 CIRCUITOS INTEGRADOS DE USO ESPECÍFICO 835 A5 DATA SHEETS 835 A6 FAMÍLIA LÓGICAS 842 A7 EMPACOTAMENTO E MONTAGEM 845 A8 LINHAS DE TRASMISSÃO 851 A9 ECONOMIA 866 B INSTRUÇÕES MIPS 871 C PROGRAMAÇÃO EM C 877 C1 INTRODUÇÃO 877 C2 BEM VINDO AO C 879 xiv C3 COMPILAÇÃO 881 C4 VARIÁVEIS 885 C5 OPERADORES 890 C6 CHAMADAS DE FUNÇÃO 894 C7 DECLARAÇÕES DE CONTROLE DE FLUXO 896 C8 MAIS TIPOS DE DADOS 902 C9 BIBLIOTECAS PADRÃO 922 C10 COMPILADOR E OPÇÕES DA LINHA DE COMANDO 933 C11 ERROS COMUNS 935 D PROCESSADOR MIPSFPGA 941 D1 INTRODUÇÃO 941 D2 OBTER E INSTALAR AS FERRAMENTAS DE TRABALHO 952 D3 SIMULAÇÃO COM O MODELSIM 963 D4 CARREGAR E DEPURAR UM PROGRAMA EM TEMPO REAL 972 xv x i Prefácio Porquê publicar mais um livro sobre projeto digital e arquitetura de computadores Há dezenas de bons livros impressos sobre o projeto digital Há também vários bons livros sobre arquitetura de computadores especialmente os textos clássicos de Patterson e Hennessy Este livro é único na sua abordagem na medida em que apresenta o projeto de lógica digital a partir da perspectiva da arquitetura de computadores começando do início com 1 e 0 e levando os alunos através da concepção de um microprocessador MIPS Temos utilizado várias edições do Computer Organization and Design COD de Patterson Hennessy durante muitos anos no Harvey Mudd College Gostamos particularmente da cobertura da arquitetura MIPS porque é uma arquitetura de microprocessador comercialmente bemsucedida mas é simples o suficiente para explicar claramente e construir numa aula introdutória Dado que a nossa disciplina não tem nenhum prérequisito a primeira metade do semestre é dedicada ao projeto digital o que não é coberto pelo COD Outras universidades têm indicado a necessidade de um livro que combine o projeto digital com a arquitetura de computadores Comprometermonos a preparar um desses livros Acreditamos que a construção de um microprocessador é um rito especial de iniciação para estudantes de engenharia e ciência da computação O funcionamento interno de um processador parece quase mágico para os não iniciados mas revelase simples quando cuidadosamente explicado O projeto digital em si é um tema poderoso e emocionante A programação em linguagem assembly revela a linguagem interna falada pelo processador A microarquitetura é a ligação entre as partes Este livro é adequado para uma rápida introdução de um único semestre para projeto da arquitetura de computadores digitais ou para dois semestres em sequência dando mais tempo para digerir o material e ii experimentar no laboratório O curso pode ser ensinado sem prérequisitos O material geralmente é ensinado nos anos iniciais do curso mas também pode ser acessível a calouros brilhantes Características Este livro oferece uma série de características especiais Cobertura LadoaLado com SystemVerilog e VHDL As linguagens de descrição de hardware HDL Hardware Discreption Language estão no centro das práticas modernas de projeto digital Infelizmente os projetistas estão divididos igualmente entre as duas linguagens dominantes SystemVerilog e VHDL Este livro introduz as HDL no Capítulo 4 logo que projeto lógico combinatório e sequencial tenha sido abordado As HDL são então utilizadas nos Capítulos 5 e 7 para projetar blocos de construção maiores e processadores inteiros No entanto O Capítulo 4 pode ser ignorado e os Capítulos posteriores ainda assim ficam acessíveis para os cursos que optem por não cobrir HDL Este livro é único na sua apresentação ladoalado de SystemVerilog e VHDL permitindo que o leitor aprenda as duas linguagens O Capítulo 4 descreve os princípios que se aplicam a ambas as HDL em seguida fornece a sintaxe específica de cada linguagem e exemplos em colunas adjacentes Este tratamento ladoa lado torna mais fácil para um instrutor escolher qualquer uma das HDL e para o leitor a transição de uma para a outra quer numa aula ou em prática profissional Arquitetura Clássica MIPS e Microarquitetura Os Capítulos 6 e 7 focam a arquitetura MIPS adaptada a partir da abordagem feita por Patterson e Hennessy A arquitetura MIPS é ideal porque é uma arquitetura real entregue em milhões de produtos por ano no entanto é simples e fácil de aprender Além disso centenas de universidades em todo o mundo têm desenvolvido pedagogia laboratórios e ferramentas em torno da arquitetura MIPS iii Perspectivas do Mundo Real Os Capítulos 6 7 e 8 ilustram a arquitetura a microarquitetura e hierarquia de memória de processadores Intel x86 O Capítulo 8 também descreve os periféricos no contexto do microcontrolador PIC32 da Microchip Estes Capítulos têm uma perspectivam do mundo real e mostram como os conceitos discutidos nos Capítulos relacionados com os chips são encontrados em muitos PC e electrónica de consumo Overview Acessível de Microarquiteturas Avançadas O Capítulo 7 inclui uma visão geral das modernas características da microarquitetura de alto desempenho incluindo branch prediction superscalar e outoforder operation multithreading e multicore processors A abordagem é acessível a um aluno num primeiro curso e mostra como as microarquiteturas do livro podem ser estendidas a processadores modernos Exercícios de FimdeCapítulo e Perguntas da Entrevista A melhor maneira de aprender projeto digital é fazêlo Cada Capítulo termina com numerosos exercícios para praticar o material Os exercícios são seguidos por um conjunto de perguntas de entrevista que os nossos colegas da indústria pediram a alunos candidatos para trabalhar neste domínio Essas perguntas fornecem uma visão útil para os candidatos vislumbrarem os problemas de trabalho normalmente encontrados no processo de entrevista As soluções dos exercícios estão disponíveis através das páginas web da editora e dos instrutores do livro Para mais detalhes consulte a seção seguinte suplementos online Suplementos Online Os materiais complementares estão disponíveis online em textbookselseviercom 9780123944245 Este site da editora acessível a todos os leitores inclui Soluções dos exercícios ímpares iv Link para ferramentas profissionais de Projeto Assistido por Computador CAD da Altera e Synopsys Link para QtSpim referidos genericamente como SPIM um simulador MIPS Código HDL para o processador MIPS Dicas úteis para o Altera Quartus II Dicas úteis para o IDE da Microchip MPLAB Slides no formato PowerPoint PPT do curso Amostras de materiais do curso e de laboratório Errata O site do instrutor vinculado ao site da editora e acessível a quem se registe em textbookselseviercom inclui Soluções para todos os exercícios Link para ferramentas profissionais de Projeto Assistido por Computador CAD da Altera e Synopsys A Synopsys oferece o Synplify Premier às universidades qualificadas num pacote de 50 licenças Para mais informações sobre o programa Universitário da Synopsys aceder ao site do instrutor para este livro Figuras do texto em formatos JPG e PPT Detalhes adicionais sobre como usar as ferramentas Altera Synopsys Microchip e QtSpim no seu curso são fornecidos na próxima seção Detalhes sobre os materiais de laboratório de amostra também são fornecidos aqui v Como usar as Ferramentas de Software num Curso Altera Quartus II A Quartus II Web Edition é uma versão gratuita da ferramenta profissional para projeto FPGA Quartus II Permite que os alunos carreguem os seus projetos digitais em esquema ou usando uma linguagem de descrição de hardware HDL SystemVerilog ou VHDL Depois de carregarem o projeto os alunos podem simular os seus circuitos usando o ModelSim Altera Starter Edition que está disponível com o Altera Quartus II Web Edition O Quartus II Web Edition também inclui uma ferramenta de síntese lógica que suporta tanto o SystemVerilog como o VHDL A diferença entre a Web Edition e a Subscription Edition é que a Web Edition suporta um subconjunto das FPGA mais comuns da Altera A diferença entre o ModelSimAltera Starter Edition e as versões comerciais do ModelSim é que a Starter Edition degrada o desempenho para simulações com mais de 10000 linhas de HDL Microchip MPLAB IDE O MPLAB da Microchip Integrated Development Environment IDE é uma ferramenta para programação de microcontroladores PIC e está disponível para download gratuito A aplicação MPLAB integra escrita compilação simulação e depuração debug numa única interface Ela inclui um compilador C e um depurador permitindo que os alunos possam desenvolver programas em C e assembly compilálos e opcionalmente programálos num microcontrolador PIC Ferramentas Opcionais Synplify Premier e QtSpim O Synplify Premier e o QtSpim são ferramentas opcionais que podem ser utilizadas com este material O produto Synplify Premier é um ambiente de síntese e depuração para projeto de FPGA e CPLD Está incluído o HDL Analyst uma ferramenta de análise HDL gráfica única que gera automaticamente vistas vi esquemáticas do projeto com crossprobing ao códigofonte HDL Isto é extremamente útil no processo de aprendizagem e depuração A Synopsys oferece o Synplify Premier às universidades qualificadas num pacote de 50 licenças Para mais informações sobre o programa Universitário da Synopsys ou o software de desenho Synopsys FPGA visite o site instrutor deste livro textbookselseviercom9780123944245 O QtSpim também chamado simplesmente de SPIM é um simulador MIPS que executa código assembly MIPS Os alunos inserem o seu código assembly para MIPS num arquivo de texto e executamno usando o QtSpim O QtSpim exibe as instruções a memória e os valores dos registros Ligações para os arquivos dos manuais e dos exemplos do utilizador estão disponíveis no site da editora textbookselseviercom978012394424 Labs O site da editora inclui links para uma série de laboratórios que cobrem tópicos de projeto digital através da arquitetura de computador Os laboratórios ensinam os alunos como usar as ferramentas Quartus II para introduzir simular sintetizar e implementar seus projetos Os laboratórios também incluem tópicos na linguagem de programação em C e assembly usando o IDE MPLAB da Microchip Após a síntese os alunos podem implementar os seus projetos usando a plataforma DE2 de desenvolvimento e educação da Altera Esta placa poderosa e com preços competitivos está disponível a partir de wwwalteracom A placa contém uma FPGA que pode ser programada para implementar os projetos dos estudantes Nós fornecemos laboratórios que descrevem como implementar uma seleção de projetos na placa DE2 usando o Cyclone II Web Edition Para executar os laboratórios os alunos terão de baixar e instalar o Quartus II Web Edition da Altera e IDE MPLAB da Microchip Os instrutores também podem optar por instalar as ferramentas em máquinas de vii laboratório Os laboratórios incluem instruções sobre como executar os projetos na placa DE2 A etapa de implementação pode ser ignorada mas nós descobrimos que possui um grande valor Os laboratórios foram testados no Windows mas as ferramentas também estão disponíveis para Linux Erros Como todos os programadores experientes sabem qualquer programa de complexidade significativa contém sem dúvida bugs Assim também os livros Tivemos muito cuidado para encontrar e eliminar os erros neste livro No entanto alguns sem dúvida permanecem Iremos manter uma errata na página Web do livro Por favor envie os seus relatórios de erros para ddcabugsonehotlogiccom A primeira pessoa a relatar um erro significativo com uma correção que usemos numa impressão futuro será recompensada com uma recompensa de US 1 Agradecimentos Em primeiro lugar agradecemos a David Patterson e John Hennessy pelo seu pioneirismo na microarquitetura MIPS descrita em seu livro Computer Organization and Design Temos vindo a ensinar a partir de várias edições do seu livro ao longo de muitos anos Agradecemos o seu apoio gracioso deste livro e a sua permissão para construir nas suas microarquiteturas Duane Bibby o nosso cartunista favorito trabalhou muito e bem para ilustrar a diversão e aventura do projeto digital Agradecemos também o entusiasmo de Nate McFadden Todd Green Danielle Miller Dia Robyn e do resto da equipe do Morgan Kaufmann que permitiu que este livro acontecesse viii Gostaríamos de agradecer ao Matthew Watkins que contribuiu na seção sobre multiprocessadores Heterogéneos no Capítulo 7 Também apreciamos o trabalho de Chris Parks Carl Pearson e Jonathan Chai que testaram o código e desenvolveram conteúdo para a segunda edição Numerosos revisores melhoraram substancialmente o livro Eles incluem John Barr Jack V Briner Andrew C Brown Carl Baumgaertner A Utku Diril Jim Frenzel Jaeha Kim Philip King James PinterLucke Amir Roth Z Jerry Shi James E Stine Luke Teyssier Peiyi Zhao Zach Dodds Nathaniel Guy Ashwin Krishna Volnei Pedroni Karl Wang Ricardo Jasinski e um revisor anónimo Apreciamos também aos alunos do nosso curso em Harvey Mudd College que nos deram um feedback útil em esboços deste livro Uma nota especial a Matt Weiner Carl Walsh Andrew Carter Casey Schilling Alice Clifton Chris Bacon e Stephen Brawner E por último mas não menos importante ambos agradecemos às nossas famílias por seu amor e apoio ix Acerca dos Autores David Money Harris é professor de engenharia no Harvey Mudd College Recebeu seu PhD em Engenharia Elétrica pela Universidade de Stanford e seu MEng em Engenharia Elétrica e Ciência da Computação pelo MIT Antes de ingressar em Stanford ele trabalhou na Intel como um projetista de lógica e circuitos nos processadores Itanium e Pentium II Desde então ele é consultor na Sun Microsystems HewlettPackard Evans Sutherland e noutras empresas de projeto As paixões de David incluem o ensino a construção de chips e explorar o ar livre Quando não está no trabalho ele pode ser encontrado em caminhadas montanhismo ou escalada Ele particularmente gosta de caminhar com os seus três filhos David detém cerca de uma dúzia de patentes e é autor de três outros livros de texto sobre projeto de chips bem como quatro guias das montanhas do sul da Califórnia Sarah L Harris é professora associada de engenharia no Harvey Mudd College Recebeu seu PhD e MS em Engenharia Eléctrica pela Universidade de Stanford Antes de ingressar em Stanford recebeu um B S em Engenharia Eléctrica e da Computação pela Universidade Brigham Young Sarah também trabalhou na HewlettPackard San Diego Supercomputer Center e Nvidia Ela ama ensinar e experimentação laboratorial Quando ela não está trabalhando ou correndo atrás dos seus dois filhos pode ser encontrada a tocar música com amigos em caminhadas na canoagem no ciclismo e a viajar Capítulo um Do Zero ao Um 1 1 Do Zero ao Um 11 O PLANO DE JOGO Os microprocessadores revolucionaram o mundo durante as últimas três décadas Um computador portátil possui hoje mais capacidades do que no passado um mainframe do tamanho de uma sala Um carro topo de linha possui cerca de 50 microprocessadores Os avanços nos microprocessadores tornaram os telefones celulares e a internet possíveis melhoraram vastamente a medicina e transformaram a forma como a guerra é travada As vendas na indústria mundial dos semicondutores cresceram dos 21 bilhões de US em 1985 para os 300 bilhões em 2011 sendo os microprocessadores um segmento importante destas vendas Acreditamos que os microprocessadores não são apenas tecnicamente economicamente e socialmente importantes mas são também uma invenção humana intrinsecamente fascinante No momento em que o leitor acabar de ler este livro ele saberá como projetar e construir um microprocessador As capacidades que o leitor irá adquirir ao longo do caminho vão permitirlhe projetar outros sistemas digitais Assumese que o leitor está basicamente familiarizado com conhecimentos de eletricidade experiência prévia em programação e um interesse genuíno em perceber o funcionamento de um computador Este livro focase no projeto de sistemas digitais que funcionam em termos de 1 e 0 Começase por estudar o funcionamento de portas de lógica digital que aceitam 1 e 0 como entradas e devolvem na sua saída 1 e 0 como resultado Em seguida é explorada a forma de combinar portas lógicas em módulos de maior complexidade tais como somadores ou memórias Transitase em seguida para a programação em linguagem assembly que é a língua nativa do microprocessador Finalmente a associação de portas lógicas vai permitir construir um microprocessador que executa essa linguagem assembly Capítulo um Do Zero ao Um 2 Uma grande vantagem dos sistemas digitais é que os blocos utilizados na sua construção são muito simples apenas 1 e 0 Não requerem matemática complexa ou um conhecimento aprofundado de física Em vez disso o desafio do projetista passa por combinar estes blocos simples em sistemas de complexidade crescente Um microprocessador pode ser o primeiro sistema que o leitor constrói que é demasiado complexo para ser por ele interiorizado Um dos temas abordados neste livro é a gestão da complexidade 12 A ARTE DE GERIR A COMPLEXIDADE Uma das características que separa um engenheiro ou cientista da computação de um leigo é uma abordagem sistemática da gestão da complexidade Os modernos sistemas digitais são construídos a partir de milhões ou bilhões de transistores Nenhum ser humano pode compreender estes sistemas escrevendo equações que descrevem o movimento dos elétrons em cada transistor e resolver todas essas equações simultaneamente O leitor terá que aprender a gerir a complexidade para perceber como construir um microprocessador sem se atolar num pântano de detalhes 121 Abstração Uma técnica fundamental para gerenciar a complexidade é a abstração Escondendo os detalhes sempre que eles não sejam relevantes Um sistema pode ser visto de diferentes níveis de abstração Por exemplo os políticos abstraemse do mundo em cidades municípios estados e países Um município contém várias cidades e um estado contém muitos municípios Quando um político está concorrendo à presidência o político está principalmente interessado em saber como o estado irá votar em vez de saber como cada município irá votar de modo que o estado é um nível mais útil de Capítulo um Do Zero ao Um 3 abstração Por outro lado o Instituto de Estatística mede a população de cada cidade por isso esta agência deve considerar os detalhes associados a um menor nível de abstração A Figura 11 ilustra os níveis de abstração de um sistema computacional eletrônico juntamente com blocos de construção típicos em cada nível No nível mais baixo de abstração temos a física o movimento dos elétrons O comportamento dos elétrons é descrito através da mecânica quântica e das equações de Maxwell O nosso sistema é construído a partir de dispositivos eletrônicos como transístores ou tubos de vácuo era uma vez Estes dispositivos têm bem definidos pontos de ligação chamados terminais e podem ser modelados através da relação observada entre a tensão e a corrente medida em cada terminal Ao abstrair a este nível do dispositivo podemos ignorar os elétrons individuais O próximo nível de abstração corresponde aos circuitos analógicos em que os dispositivos são montados para criar componentes tais como os amplificadores Os circuitos analógicos possuem uma faixa contínua de tensões de entrada e saída Os circuitos digitais tais como as portas lógicas estão limitados a tensões pertencentes a intervalos discretos que usaremos para indicar os níveis 0 e 1 No projeto de sistemas lógicos vamos construir estruturas mais complexas como somadores ou memórias utilizando circuitos digitais A microarquitetura liga os níveis de abstração lógica com a arquitetura O nível de abstração da arquitetura descreve o computador do ponto de vista do programador Por exemplo a arquitetura Intel x86 utilizada por microprocessadores na maioria dos computadores pessoais PC é definida por um conjunto de instruções e registros memória para armazenar temporariamente variáveis que o programador está autorizado a usar A microarquitetura envolve a combinação de elementos lógicos para executar as instruções definidas na arquitetura Uma arquitetura particular pode ser implementada por uma de várias microarquiteturas diferentes com diferentes relações de preçosdesempenhospotência Por exemplo o processador Intel Core i7 o Intel 80486 e o AMD Athlon todos implementam a arquitetura x86 com diferentes microarquiteturas Entrando no reino do software o sistema operacional lida com detalhes de baixo nível tais como o acesso a uma unidade de disco rígido ou a gestão da memória Finalmente os aplicativos usam essas facilidades oferecidas pelo sistema operacional para resolver um problema para o utilizador Figura 11 Níveis de abstração para um sistema computacional electrónico Capítulo um Do Zero ao Um 4 Graças ao poder de abstração a sua avó pode navegar na Web sem qualquer preocupação pelas vibrações quânticas dos elétrons ou a organização da memória no computador dela Este livro centrase nos níveis de abstração dos circuitos digitais através da arquitetura de computadores Quando o leitor trabalha num nível de abstração é bom saber algo sobre os níveis de abstração imediatamente acima e abaixo de onde ele está a trabalhar Por exemplo um cientista da computação não pode otimizar completamente o código sem compreender a arquitetura para a qual o programa está a ser escrito Um engenheiro de dispositivos não pode optar por soluções de compromisso no projeto de um transístor sem compreender os circuitos em que serão utilizados os transístores Esperamos que ao terminar de ler este livro o leitor possa escolher o nível de abstração adequado para resolver o seu problema e avaliar o impacto das suas escolhas de projeto noutros níveis de abstração 122 Disciplina Disciplina é o ato de restringir intencionalmente as suas escolhas de projeto para que se possa trabalhar de forma mais produtiva num nível mais alto de abstração A utilização de peças intermutáveis é uma aplicação familiar de disciplina Um dos primeiros exemplos de peças intermutáveis foi na fabricação da espingardas de pederneira Até o início do século IXX as espingardas eram fabricadas individualmente à mão Os componentes adquiridos a vários artesãos eram cuidadosamente armazenados e montados por um armeiro altamente qualificado A disciplina de peças intermutáveis revolucionou a indústria Ao limitar os componentes a um conjunto padronizado com tolerâncias bem definidas as espingardas passaram a poder ser montadas e reparadas muito mais rapidamente e com menos habilidade O armeiro deixou de se preocupar com os níveis mais baixos de abstração tais como a forma específica individual de um cano ou coronha No contexto deste livro a disciplina digital será muito importante Os circuitos digitais utilizam tensões discretas enquanto os circuitos analógicos usam tensões contínuas Por conseguinte os circuitos digitais são um subconjunto dos circuitos analógicos e em certo sentido devem ser mais limitados do que a classe mais ampla de circuitos analógicos No entanto os circuitos digitais são muito mais simples de projetar Ao nos limitarmos aos circuitos digitais podemos facilmente combinar componentes em sistemas sofisticados que em última análise superam aqueles construídos a partir de componentes analógicos Cada Capítulo deste livro começa com um ícone de abstração indicando o foco do Capítulo em azulescuro com temas secundários mostrados em tons mais claros de azul Capítulo um Do Zero ao Um 5 em muitas aplicações Por exemplo televisores digitais discos compactos CD e telefones celulares substituem atualmente os seus antecessores analógicos 123 Os Três Y Além da abstração e da disciplina os projetistas utilizam os três y para gerir a complexidade hierarquia modularidade e regularidade Estes princípios aplicamse tanto a sistemas de software como de hardware A hierarquia implica a divisão de um sistema em módulos em seguida devese ainda subdividir cada um destes módulos até que as peças sejam fáceis de entender A modularidade afirma que os módulos têm funções e interfaces bem definidas para que se possam interligar facilmente sem imprevistos efeitos colaterais A regularidade procura uniformidade entre os módulos Os módulos mais comuns são reutilizados muitas vezes reduzindo o número de módulos distintos que devem ser concebidos Para ilustrar esses y voltamos ao exemplo da fabricação das espingardas Uma espingarda de pederneira foi um dos objetos mais intrincados de uso comum no início do século IXX Utilizando o princípio da hierarquia podemos dividilo em componentes como é mostrado na Figura 12 trinco coronha e cano O Capitão Meriwether Lewis da Lewis and Clark Expedition foi um dos primeiros defensores de peças intercambiáveis para espingardas Em 1806 ele explicou As armas de Drewyer e do Sarg Pryor ficaram ambas fora de serviço A primeira foi reparada com um trico novo o antigo tornouse impróprio para uso a segunda teve o cão quebrado que foi substituído por uma cópia que havia sido preparada para o trinco em Harpers Ferry onde foi fabricada Mas pela precaução tomada em trazer esses trincos extras e as peças de trincos além da ingenuidade de John Shields a maioria das nossas armas estaria neste momento totalmente inadequadas para uso mas felizmente para nós eu tenhoas aqui comigo para registrar que todas elas estão em boa ordem Veja Elliott Coues ed a história de Lewis e Clark Expedition 4 vols New York Harper 1893 reimpressão 3 vols New York Dover 3 817 Capítulo um Do Zero ao Um 6 13 ABSTRAÇÃO DIGITAL A maioria das variáveis físicas é contínua Por exemplo a tensão de um fio a frequência de oscilação ou a posição de uma massa são todas quantidades contínuas Os sistemas digitais por outro lado representam informações com variáveis de valores discretos ou seja variáveis com um número finito de valores distintos Figura 12 Espingarda Flintlock com uma vista detalhada Image by Euroarms Italia wwweuroarmsnet 2006 Charles Babbage 17911871 Frequentou a Universidade de Cambridge e casouse com Georgiana Whitmore em 1814 Inventou a Máquina Analítica o primeiro computador mecânico do mundo Também inventou o cowcatcher e a taxa postal universal e a gazua Imagem cortesia da Fourmilab Suíça wwwfourmilabch Capítulo um Do Zero ao Um 7 Um sistema digital inicial que utilizava variáveis com dez valores discretos era a Máquina Analítica de Charles Babbage Babbage trabalhou de 1834 a 1871 na concepção e tentando construir este computador mecânico A Máquina Analítica utilizava engrenagens com dez posições marcadas de 0 a 9 como um velocímetro mecânico num carro A Figura 13 mostra um protótipo da Máquina Analítica na qual cada linha processa um dígito Babbage optou por 25 linhas de engrenagens a máquina possui por isso 25 dígitos de precisão Ao contrário da máquina de Babbage a maioria dos computadores electrónicos usa uma representação binária dois valores na qual uma tensão alta indica um 1 e uma tensão baixa indica um 0 uma vez que é mais fácil de distinguir entre duas tensões do que entre dez A quantidade de informação D numa variável discreta avaliada com n estados distintos é medida em unidades de bits como 𝐷 log2 𝑁 𝑏𝑖𝑡𝑠 11 Uma variável binária transmite log22 1 bit de informação Na verdade a palavra bit deriva de dígito binário Cada uma das engrenagens de Babbage permitia log210 3322 bits de informação pois poderia estar numa das 23322 10 posições Um sinal contínuo contém teoricamente uma Figura 13 Máquina Analítica de Babbage em construção por altura da sua mortem 1871 Imagem cortesia do Science MuseumScience and Society Picture Library Capítulo um Do Zero ao Um 8 quantidade infinita de informação porque pode assumir um número infinito de valores Na prática o ruído e o erro de medição limitam as informações a apenas 10 a 16 bits para a maioria dos sinais contínuos Se a medição tem de ser feita rapidamente o conteúdo de informação é inferior por exemplo 8 bits Este livro centrase em circuitos digitais que utilizam variáveis binárias 1 e 0 George Boole desenvolveu um sistema de lógica de funcionamento tendo por base variáveis binárias que agora é conhecido como lógica booleana Cada uma das variáveis de Boole pode assumir o valor TRUE ou FALSE Os computadores electrónicos geralmente usam uma tensão positiva para representar 1 e zero volts para representar 0 Neste livro vamos usar os termos 1 TRUE e HIGH como sinónimos Da mesma forma vamos usar 0 FALSE e LOW de forma intermutável A beleza da abstração digital é que os projetistas digitais podemse concentrar nos 1 e 0 ignorando se as variáveis booleanas são fisicamente representadas com tensões específicas engrenagens rotativas ou mesmo através de níveis de fluido hidráulico Um programador de computadores pode trabalhar sem a necessidade de conhecer os detalhes íntimos de hardware do computador Por outro lado a compreensão dos detalhes do hardware permite ao programador otimizar o software para esse computador específico Um bit isolado não carrega muita informação Na próxima seção examinamos como grupos de bits podem ser usados para representar números Nos próximos Capítulos vamos também utilizar grupos de bits para representar letras e programas 14 BASES NUMÉRICAS O leitor está acostumado a trabalhar com números decimais Nos sistemas digitais que consistem em 1 e 0 os números binários ou hexadecimais são muitas vezes mais convenientes Esta seção apresenta os diversos sistemas numéricos que serão utilizados em todo o resto do livro Capítulo um Do Zero ao Um 9 141 Números Decimais Na escola primária o leitor aprendeu a contar e a fazer contas em decimal Assim como o leitor provavelmente tem dez dedos há dez dígitos decimais 0 1 2 9 Os dígitos decimais são associados para formar números decimais maiores Cada posição de um dígito decimal tem dez vezes o peso da posição anterior Da direita para a esquerda os pesos das posições são 1 10 100 1000 e assim por diante Os números decimais são referidos como base 10 A base é indicada por um subscrito após o número para evitar a confusão quando se trabalha com mais do que uma base Por exemplo a Figura 14 mostra a forma como o número decimal 974210 é escrito como a soma de cada um dos seus dígitos multiplicado pelo peso da posição correspondente Um número decimal de Ndígitos representa uma das possibilidades 10N 0 1 2 3 10N 1 Esta é chamada a gama do número Por exemplo um número de três dígitos decimais representa uma das 1000 possibilidades na faixa de 0 a 999 142 Números Binários Os bits representam um de dois valores 0 ou 1 e são associados para formar números binários Cada posição de um número binário tem o dobro do peso da posição anterior assim os números binários têm base 2 No sistema binário o peso da posição mais uma vez da direita para a esquerda é 1 2 4 8 16 32 64 128256 512 1024 2048 4096 8192 16384 32768 65536 e assim por diante Se o leitor trabalha com números binários muitas vezes vai economizar tempo se se lembrar dessas potências de dois até 216 Um número binário de Nbit representa uma das possibilidades 2N 0 1 2 3 2N1 A Tabela 11 mostra os 1 2 3 e 4 bits de números binários e os seus equivalentes decimais Figura 14 Representação de um número decimal Capítulo um Do Zero ao Um 10 Exemplo 11 CONVERSÃO DE BINÁRIO PARA DECIMAL Converter o número binário 101102 para decimal Solução A Figura 15 ilustra o processo de conversão Tabela 11 Números binários e o seu equivalente decimal Capítulo um Do Zero ao Um 11 Exemplo 12 CONVERSÃO DE DECIMAL PARA BINÁRIO Converter o número decimal 8410 para binário Solução Determinar se cada posição do resultado binário tem um 1 ou um 0 Podemos fazer isso a partir da esquerda ou da direita Trabalhando a partir da esquerda começamos com a maior potência de 2 menor do que ou igual ao número neste caso 64 84 64 para que haja um 1 na posição do 64 restando 8464 20 20 32 para que haja um 0 na posição do 32 20 16 para que haja um 1 na posição do 16 deixando 2016 4 4 8 para que haja um 0 na posição do 8 4 4 para que haja um 1 na posição do 4 deixando 44 0 Assim deve haver 0 de na posição do 2 e primeira posição Colocando tudo junto temos que 8410 10101002 Trabalhar a partir da direita repetidamente devemos dividir o número por 2 O resto vai para a posição 842 42 então 0 vai para a posição do 1 422 21 então 0 vai para a posição do 2 212 10 com um resto de 1 indo para posição do 4 102 5 por isso 0 fica na posição do 8 52 2 com um resto de 1 indo para a posição do 16 22 1 então 0 vai para a posição do 32 Finalmente 12 0 com um resto de 1 indo para a coluna do 64 Novamente temos 8410 10101002 143 Números Hexadecimais Escrever números binários longos é entediante e propenso a erros Um grupo de quatro bits representa uma de 24 16 possibilidades Por isso às vezes é mais conveniente trabalhar na base 16 Figura 15 Conversão de um número binário para decimal Capítulo um Do Zero ao Um 12 chamada de hexadecimal Os números hexadecimais utilizam os dígitos de 0 a 9 juntamente com as letras A a F como se mostra na Tabela 12 As posições na base 16 têm pesos de 1 16 162 ou 256 163 ou 4096 e assim por diante Exemplo 13 CONVERSÃO DE HEXADECIMAL PARA BINÁRIO E DECIMAL Converter o número hexadecimal 2ED16 para binário e decimal Solução A conversão de hexadecimal para binário é fácil porque cada dígito hexadecimal corresponde diretamente a quatro dígitos binários 216 00102 E16 11102 e D16 11012 de modo que 2ED16 0010111011012 A conversão para decimal requer o uso da aritmética mostrada na Figura 16 Exemplo 14 CONVERSÃO DE BINÁRIO PARA HEXADECIMAL Converter o número binário 11110102 para hexadecimal Solução Novamente a conversão é fácil Devemos começar a ler partindo da direita Os quatro bits menos significativos são 10102 A16 Os próximos bits são 1112 716 Daí o resultado ser 11110102 7A16 Hexadecimal é um termo cunhado pela IBM em 1963 deriva do grego hexi seis e do Latim decem dez Um termo mais adequado seria usar o termo do Latim sexa seis mas sexadecimal soava muito picante Figura 16 Conversão de um número hexadecimal para binário Capítulo um Do Zero ao Um 13 Tabela 12 Sistema numérico hexadecimal Exemplo 15 CONVERSÃO DE DECIMAL PARA HEXADECIMAL E BINÁRIO Converter o número decimal 33310 para hexadecimal e binário Solução Como na conversão de decimal para binário a conversão hexadecimal pode ser feita a partir da esquerda ou da direita Trabalhando a partir da esquerda devemos começar com a maior potência de 16 a menos do que ou igual ao número neste caso 256 256 vai para 333 uma vez para que haja um 1 na coluna 256 Capítulo um Do Zero ao Um 14 deixando 333256 77 16 vai para 77 quatro vezes por isso temos um 4 na posição do 16 deixando 7716 4 13 1310 D16 para que haja um D na posição do 1 Em resumo 33310 14D16 Agora é fácil converter de hexadecimal para binário devemos proceder como no Exemplo 13 resulta 14D16 1010011012 Trabalhando a partir da direita devemos repetidamente dividir o número por 16 O resto da divisão fica nas respectivas posições 33316 20 com um resto de 1310 D16 indo para a posição do 1 2016 1 com um resto de 4 indo para a coluna 16 116 0 com um resto de 1 para a posição do 256 Mais uma vez o resultado é 14D16 144 Bytes Nibbles e All That Jazz Um grupo de oito bits é chamado de byte Ele representa uma de 28 256 possibilidades O tamanho de objetos armazenados na memória do computador é habitualmente medido em bytes em vez de bits Um grupo de quatro bits ou metade de um byte é chamado de nibble Ele representa uma de 24 16 possibilidades Um dígito hexadecimal ocupa um nibble e dois dígitos hexadecimais ocupam um byte inteiro Nibbles já não é uma unidade usada comumente mas o termo é bonito Os microprocessadores lidam com pedados de dados chamados de palavras O tamanho de uma palavra depende da arquitetura do microprocessador Quando este Capítulo foi escrito em 2012 a maioria dos computadores tinham processadores de 64bits o que indica que eles operam palavras de 64bits Na época os computadores mais velhos processavam palavras de 32 bits também estavam amplamente disponíveis Os microprocessadores mais simples especialmente os utilizados em dispositivos tais como torradeiras usam palavras de 8 ou 16bits Num grupo de bits o bit na posição 1 é chamado de bit menos significativo lsb less significative bit e ao bit na outra extremidade dáse a designação de bit mais significativo msb most significative bit como mostrado na Figura 17 a para um número binário de 6bits Do mesmo modo dentro de uma palavra os bytes são identificados como byte menos significativo LSB Less Significative Byte e de byte mais significativo MSB Most Significative Byte como mostrado na Figura 17 b para um número de 4bytes escrito com oito dígitos hexadecimais Um microprocessador é um processador construído num único chip Até à década de 1970 os processadores eram demasiado complexos para caber num único chip por isso processadores de mainframe foram construídos a partir de placas contendo muitas fichas A Intel lançou o primeiro microprocessador de 4 bits chamado de 4004 em 1971 Agora até mesmo os supercomputadores mais sofisticados são construídos usando microprocessadores Usaremos os termos microprocessador e processador de forma intercambiável ao longo deste livro Capítulo um Do Zero ao Um 15 Por coincidência 210 1024 103 Assim o termo quilo grego para mil indica 210 Por exemplo 210 bytes é um kilobyte 1 KB Da mesma forma o Mega milhões indica 220 106 e giga bilhões indica 230 109 Se o leitor souber que 210 1000 220 1 milhão 230 1 bilhão e se conhecer as potências de dois até 29 é para ele fácil estimar mentalmente qualquer potência de dois Figura 17 Byte menos e mais significante Exemplo 16 ESTIMAÇÃO DE UMA POTÊNCIA DE DOIS Encontrar o valor aproximado de 224 sem utilizar uma calculadora Solução Devemos dividir o expoente em múltiplos de dez com o resto 224 220 24 220 1 milhão 24 16 Assim 224 16 milhões Tecnicamente 224 16777216 mas 16 milhões é perto o suficiente 145 Adição Binária A adição binária é semelhante à adição decimal mas mais fácil como mostrado na Figura 18 Tal como na soma decimal se a soma dos dois números é maior do que o que se encaixa num único dígito transportamos o valor 1 para a próxima posição Na Figura 18 é feita a comparação entre a adição de números decimais e números binários Na coluna mais à direita da Figura 18 a 7 9 16 o que não pode caber num único dígito porque ele é maior do que 9 Portanto guardamos o primeiro dígito 6 e transportamos as dezenas 1 para a posição seguinte Da mesma forma em binário se a soma de dois números é maior do que 1 o segundo dígito é transportado para a posição seguinte Por exemplo na coluna mais à direita da Figura 18 b a soma 1 1 210 102 não cabe num único dígito binário Então guardamos o primeiro dígito 0 e transportamos o segundo dígito 1 do resultado para a próxima posição Na segunda posição a soma é de 1 1 1 310 112 Novamente devemos guardar Capítulo um Do Zero ao Um 16 o primeiro dígito 1 e transportar o segundo dígito 1 para a próxima posição Por razões óbvias o bit que é transportado para a posição vizinha é chamado de bit de transporte Figura 18 Exemplo de adição com transportes a decimal b binário Exemplo 17 SOMA BINÁRIA Encontrar 01112 01012 Solução A Figura 19 mostra que o valor da soma é 11002 Os transportes são indicados a azul Podemos verificar o nosso trabalho repetindo a operação em decimal 01112 710 01012 510 A soma é 1210 11002 Os sistemas digitais geralmente operam com um número fixo de dígitos Dizse que a adição transborda overflow se o resultado for muito grande para caber nos dígitos disponíveis Um número de 4 bits por exemplo permite valores no intervalo 0 15 A adição binária de 4bits transborda se o resultado for superior a 15 O quinto bit é descartado produzindo um resultado incorreto nos restantes quatro bits A situação de overflow pode ser detectada através da verificação de um transporte para fora da posição mais significativa Exemplo 18 SOMA COM OVERFLOW Encontrar 11012 01012 Ocorre um overflow Figura 19 Exemplo de uma soma binária Capítulo um Do Zero ao Um 17 Solução A Figura 110 representa que a soma é 100102 Este resultado transborda do intervalo de um número binário de 4bits Se tiver de ser armazenado como quatro bits o bit mais significativo é descartado deixando o resultado incorreto de 00102 Se o cálculo foi feito usando números com cinco ou mais bits o resultado teria sido 100102 corretamente representado 146 Números Binários com Sinal Até agora temos considerado apenas números binários sem sinal que representam quantidades positivas Muitas vezes queremos representar números positivos e negativos o que requer um sistema numérico binário diferente Existem vários esquemas para representar números binários com sinal os dois mais amplamente empregados são chamados de sinalmagnitude e complemento2 Números Sinal Magnitude Números sinalmagnitude são intuitivamente atraentes porque eles seguem o nosso costume de escrever números negativos usando um sinal de menos seguido pela magnitude Um número sinalmagnitude de Nbit usa o bit mais significativo como sinal e os restantes N1 bits como a magnitude valor absoluto Um bit de sinal de 0 indica um valor positivo e um bit de sinal de 1 indica um valor negativo Exemplo 19 NÚMEROS DE SINALMAGNITUDE Escreva 5 e 5 como um número sinalmagnitude de 4 bits Solução Ambos os números têm uma magnitude de 510 1012 Assim 510 01012 e 510 11012 Infelizmente a adição binária normal não funciona para números de sinalmagnitude Por exemplo a adição normal de 510 510 dá 11012 01012 100102 o que não faz sentido Um número sinalmagnitude de Nbit abrange a gama 2N1 1 2N1 1 Os números sinalmagnitude são um pouco estranhos já que tanto 0 como 0 existem Ambos indicam o valor zero Como o leitor pode esperar pode ser problemático ter duas representações diferentes para o mesmo número Figura 110 Exemplo de uma soma binária com overflow Capítulo um Do Zero ao Um 18 Número em complemento2 Os números representados no formato complemento2 são idênticos aos números binários sem sinal exceto que a posição do bit mais significativo tem um peso de 2N1 em vez de 2N1 Esta representação ultrapassa as limitações dos números sinalmagnitude o zero tem uma representação única e a adição comum funciona Em representação de complemento2 o zero é escrito como todos os zeros 00 0002 O número mais positivo tem um 0 na posição mais significativa e 1 de outras posições 01 1112 2N1 1 O número mais negativo tem um 1 na posição mais significativa e 0 noutras posições 10 0002 2N1 O valor 1 é escrito com todos os bits a 1 11 1112 Notese que os números positivos têm um 0 na posição do bit mais significativo e os números negativos têm um 1 na posição do bit menos significativo de modo que o bit mais significativo pode ser visto como o bit de sinal No entanto os restantes bits são interpretados de forma diferente para números complemento2 e números de sinalmagnitude O sinal de número de complemento2 é revertido num processo chamado obter o complemento2 Este processo consiste em complementar todos os bits do número seguida da soma de 1 à posição do bit menos significativo Isto é útil para encontrar a representação de um número negativo ou para determinar a magnitude de um número negativo Exemplo 110 REPRESENTAÇÃO DE UM NÚMERO NEGATIVO EM COMPLEMENTO2 Obter a representação de 210 em complemento2 num formato de 4bits Solução Comece com 210 00102 Para obter 210 inverta os bits e adicione 1 A inversão 00102 produz 11012 Sendo 11012 1 11102 Assim 210 é 11102 O foguete de 7 bilhões de USD Ariane 5 lançado em 4 de Junho de 1996 saiu da sua rota 40 segundos após o lançamento partiuse e explodiu O problema foi causado quando o computador que controla o foguete sofreu um overflow da sua gama de 16 bits e crashou O código tinha sido extensivamente testado no foguete Ariane 4 No entanto o Ariane 5 tinha um motor mais rápido que produziu valores maiores para o computador de controlo que levou ao overflow Fotografia cortesia da ESACNESARIANESPACEService Optique CS6 Capítulo um Do Zero ao Um 19 Exemplo 111 VALOR DE NÚMEROS NEGATIVOS EM COMPLEMENTO2 Determinar o valor decimal do número em complemento2 10012 Solução O número 10012 inicia por 1 por isso deve ser negativo Para encontrar a sua magnitude devemos inverter os bits e adicionar 1 Inversão 10012 01102 01102 1 01112 710 Assim 10012 710 Os números em complemento2 têm a vantagem de que a adição funciona corretamente tanto para os números positivos como negativos Devemos recordar que aquando da adição de números de N bits o Nésimo bit de transporte ie o bit N 1 do resultado é descartado Exemplo 112 ADICIONAR DOIS NÚMEROS EM COMPLEMENTO2 Determine a 210 110 e b 710 710 usando números de complemento2 Solução a 210 110 11102 00012 11112 110 B 710 710 10012 01112 100002 O quinto bit é descartado deixando o resultado de 4 bits correto 00002 A subtração é realizada tomando o complemento2 do segundo número seguida da adição Exemplo 113 SUBTRAIR DOIS NÚMEROS EM COMPLEMENTO2 Determine a 510 310 e b 310 510 usando números de 4bits em complemento2 Solução a 310 00112 Tome o complemento2 para obter 310 11012 Agora devemos adicionar 510 310 01012 11012 00102 210 Note que o transporte da posição mais significativa é descartado porque o resultado é armazenado em quatro bits b Tome o complemento2 de 510 para obter 510 10112 Agora adicione 310 510 00112 10112 11102 210 Capítulo um Do Zero ao Um 20 O complemento2 de 0 é encontrado invertendo todos os bits produzindo 11 1112 e adicionando 1 o que produz todos os bits 0 desconsiderando o transportar para fora da posição do bit mais significativo Por isso o zero é sempre representado com todos os bits 0 Ao contrário do sistema sinalmagnitude o sistema complemento2 não tem uma representação separado 0 O zero é considerado positivo porque o seu bit de sinal é 0 Como os números sem sinal os números de complemento2 de Nbit representam um dos 2N possíveis valores No entanto os valores são divididos entre números positivos e negativos Por exemplo um número sem sinal de 4bits representa 16 valores 0 a 15 Um número de 4bits em complemento2 também representa 16 valores 8 a 7 Em geral o intervalo dos números de Nbits em complemento2 está dentro do intervalo 2N1 2N1 1 Fará sentido que haja mais um número negativo do que números positivos porque não há 0 O número mais negativo 10 0002 2N1 é às vezes chamado de número estranho O complemento2 é encontrado invertendo os bits produzindo 01 1112 e adicionando 1 que produz 10 0002 o número estranho novamente Assim este número negativo não tem contrapartida positiva A adição de dois números positivos ou números negativos de Nbits pode causar overflow se o resultado é maior do que 2N1 1 ou inferior a 2N1 A adição de um número positivo a um número negativo nunca causa overflow Ao contrário dos números sem sinal um transporte para fora da coluna mais significativa não indica overflow Em vez disso o overflow ocorre se os dois números que estão sendo adicionados têm o mesmo bit de sinal e o resultado tem o bit de sinal oposto Exemplo 114 ADICIONAR DOIS NÚMEROS EM COMPLEMENTO2 COM OVERFLOW Determine 410 510 usando números de 4bits em complemento2 Ocorre um overflow do resultado Solução 410 510 01002 01012 10012 710 O resultado ultrapassa o intervalo dos números positivos de 4 bits em complemento2 produzindo um resultado negativo incorreto Se o cálculo for realizado usando cinco ou mais bits o resultado 010012 910 teria sido correto Capítulo um Do Zero ao Um 21 Quando um número em complemento2 é estendido para mais bits o bit de sinal deve ser copiado para as posições de bit mais significativas Este processo é chamado de extensão de sinal Por exemplo os números 3 e 3 são escritos como números de 4bits em complemento2 como 00112 e 11012 respectivamente A sua extensão de sinal para sete bits ocorre copiando o bit de sinal para os três novos bits superiores para formar 00000112 e 11111012 respectivamente Comparação dos Sistemas Numéricos Os três sistemas de números binários mais utilizados são sem sinal complemento2 e sinalmagnitude A Tabela 13 compara o intervalo de números de Nbits em cada um destes três sistemas Os números em complemento2 são convenientes porque representam inteiros positivos e negativos e por causa disso a operação de soma normal funciona para todos os números A subtração é realizada negando o segundo número ie efetuando o complemento2 e então efetuando a adição A menos que indicado de outra forma devemos assumir que todos os números binários utilizam a representação em complemento2 Tabela 13 Intervalo de números de Nbits Capítulo um Do Zero ao Um 22 Figura 111 Linha numérica e codificação binária de 4bits A Figura 111 apresenta uma linha de número que indica os valores de números de 4bits em cada um dos sistemas Os números sem sinal abrangem o intervalo 0 15 Os números em complemento2 cobrem o intervalo 8 7 Os números positivos 0 7 compartilham a mesma codificação como números sem sinal Os números negativos 8 1 são codificados de tal modo que o maior valor binário sem sinal representa um número mais próximo de 0 Note que o número estranho 10002 representa 810 e não tem correspondente positivo Os números de sinalmagnitude abrangem a gama 7 7 O bit mais significativo é o bit de sinal Os números positivos 1 7 compartilham a mesma codificação dos números sem sinal Os números negativos são simétricos mas têm o bit de sinal cativo O zero possui a dupla representação de 0000 e 1000 Assim os números de Nbit de sinalmagnitude representam apenas 2N 1 inteiros por causa das duas representações para 0 Capítulo um Do Zero ao Um 23 15 PORTAS LÓGICAS Agora que sabemos como usar variáveis binárias para representar informações vamos explorar os sistemas digitais que executam operações sobre essas variáveis binárias As portas lógicas são circuitos digitais simples que possuem uma ou mais entradas digitais e produzem uma saída binária As portas lógicas são desenhadas com um símbolo que mostra a entrada ou entradas e a saída As entradas são normalmente desenhadas do lado esquerda ou superior e as saídas do lado direito ou inferior Os projetistas digitais normalmente usam letras perto do início do alfabeto para as entradas da porta e a letra Y para a saída da porta A relação entre as entradas e a saída pode ser descrita por uma tabela verdade ou uma equação booleana A tabela verdade lista as entradas à esquerda e a saída correspondente à direita As tabelas possuem uma linha para cada combinação possível de entradas Uma equação booleana é uma expressão matemática que usa variáveis binárias 151 Porta NOT Uma porta NOT tem uma entrada A e uma saída Y como mostrado na Figura 112 A saída da porta NOR é o inverso da sua entrada Se A é FALSE então Y é TRUE Se A é TRUE então Y é FALSE Esta relação é resumida pela tabela verdade e a equação booleana na figura A linha sobre A na equação booleana é designada de NOT então Y 𝐴 é lido Y é igual a NÃO A A porta NOT é também chamado de inversora Outros textos utilizam uma variedade de notações para NOT incluindo Y A Y A Y A ou Y A Usaremos Y 𝐴 exclusivamente mas não se confunda se encontrar outra notação em outros lugares 152 Buffer A outra porta lógica de uma entrada é chamada de buffer e é mostrada na Figura 113 Ela simplesmente copia a entrada para a saída Do ponto de vista lógico um buffer não é diferente de um fio por isso pode parecer inútil No entanto do ponto de vista analógico o buffer pode ter características desejáveis tais como a capacidade de produzir grandes quantidades de corrente para um motor ou a capacidade de enviar rapidamente a sua saída para muitas portas Este é um exemplo de que é preciso considerar vários níveis de abstração para entender completamente um sistema a Figura 112 Porta NOT Capítulo um Do Zero ao Um 24 abstração digital esconde o verdadeiro propósito de um buffer O símbolo triângulo indica um tampão Um círculo na saída indica inversão como foi visto no símbolo NOT da Figura 112 153 Porta AND As portas lógicas de duas entradas são mais interessantes A porta AND mostrada na Figura 114 produz uma saída de TRUE Y se e somente se ambos A e B são TRUE Caso contrário a saída é FALSE Por convenção as entradas são listadas na ordem 00 01 10 11 como se estivesse contando em binário A equação booleana para uma porta AND pode ser escrita de várias maneiras Y A B Y AB ou Y A B O símbolo é pronunciado intersecção e é preferido pelos lógicos Nós preferimos Y AB leia Y é igual a A e B porque somos preguiçosos 154 Porta OR A porta OR mostrada na Figura 115 produz uma saída de TRUE Y se A ou B ou ambas são TRUE A equação Booleana para uma porta OR é escrita como Y A B ou Y A B O símbolo é designado por união e é preferido pelos lógicos Os projetistas digitais normalmente usam a notação Y A B é pronunciado Y é igual a A ou B 155 Outras Portas de Duas Entradas A Figura 117 apresenta outras portas lógicas comuns de duas entradas XOR OU exclusivo pronunciase exOR é TRUE se A ou B mas não ambos são TRUE Qualquer porta pode ser seguida por um círculo para inverter o seu funcionamento A porta NAND implementa NOT AND A sua saída é TRUE a menos que ambas as entradas sejam TRUE A porta NOR implementa NOT OR A sua saída é TRUE se nem A nem B são TRUE Uma porta XOR de Nentradas é às vezes chamada de porta de paridade e produz uma saída TRUE se um número ímpar de entradas são TRUE Tal como acontece com portas de duas entradas as combinações de entrada na tabela verdade são listadas em ordem da contagem Figura 113 Porta Buffer Figura 114 Porta AND De acordo com Larry Wall inventor da linguagem de programação Perl as três principais virtudes de um programador são preguiça impaciência e arrogância Capítulo um Do Zero ao Um 25 Figura 116 Mais portas de duas entradas Exemplo 115 PORTA XNOR A Figura 117 apresenta o símbolo e a equação Booleana para uma porta XNOR de duas entradas que executa o inverso de uma XOR Complete a tabela verdade Solução A Figura 118 mostra a tabela verdade A saída XNOR é TRUE se ambas as entradas são FALSE ou ambas as entradas forem TRUE A porta XNOR de duas entradas é às vezes chamada de porta igualdade porque a sua saída é verdadeira quando as entradas são iguais Figura 117 Porta XNOR Figura 115 Porta OR Uma estranha maneira de lembrar o símbolo OR é que o seu lado de entrada é curvo como a boca de Pac Man de modo que a porta está com fome e com vontade de comer qualquer entrada TRUE que possa encontrar Capítulo um Do Zero ao Um 26 Figura 118 Tabela verdade XNOR 156 Portas de Múltiplas Entradas Existem muitas funções booleanas de três ou mais entradas As mais comuns são AND OR XOR NAND NOR e XNOR Uma porta AND de Nentradas produz uma saída TRUE quando todas as suas N entradas são TRUE Uma porta OR de Nentradas produz uma saída TRUE quando pelo menos uma entrada for TRUE Exemplo 116 PORTA NOR DE TRÊS ENTRADAS A Figura 119 mostra o símbolo e a equação booleana para uma porta NOR de três entradas Complete a tabela verdade Solução A Figura 120 mostra a tabela verdade A saída é TRUE somente se nenhuma das entradas for TRUE Exemplo 117 PORTA AND DE QUATRO ENTRADAS A Figura 121 mostra o símbolo e a equação booleana para uma porta de quatroentrada Crie uma tabela verdade Solução A Figura 122 mostra a tabela verdade A saída é TRUE somente se todas as entradas forem TRUE Figura 119 Porta NOR de 3 entradas Figura 120 Tabela verdade da porta NOR de 3 entradas Capítulo um Do Zero ao Um 27 16 POR BAIXO DA ABSTRAÇÃO DIGITAL Um sistema digital utiliza variáveis discretas No entanto as variáveis são representadas por quantidades físicas contínuas tais como a tensão de um fio a posição de uma roda dentada ou o nível de fluido dentro de um cilindro Assim o projetista deve escolher uma maneira de relacionar o valor contínuo com o valor discreto Por exemplo considere que representa um sinal binário A com uma tensão num fio Seja 0 volts V indicados por A 0 e 5 V indicados A 1 Qualquer sistema real deve tolerar algum ruído de modo que 497 V provavelmente deve ser interpretado como A 1 também Mas e 43V Ou 28V Ou 2500000V 161 Fonte de Tensão Suponhamos que a menor tensão no sistema é de 0 V também chamado terra ou GND A tensão mais alta do sistema vem da fonte de alimentação e é normalmente chamado de VDD Na tecnologia de 1970 e 1980 VDD era geralmente 5 V Com os circuitos integrados a progrediram para transístores menores a VDD caiu para 33 V 25 V 18 V 15 V 12 V ou ainda valores menores para economizar energia e evitar a sobrecarga dos transístores 162 Níveis Lógicos O mapeamento de uma variável contínua para uma variável binária discreta é feito definindo níveis lógicos como mostrado na Figura 123 A primeira porta é chamada de driver a segunda porta é chamada de receiver A saída do controlador é ligada à entrada do receiver O driver produz um nível LOW 0 de saída na gama de 0 a VOL ou um HIGH 1 de saída na gama de VOH a VDD Se o receiver recebe uma entrada na faixa de 0 a VIL irá considerar a entrada a LOW Se o receiver recebe uma entrada na faixa de VIH a VDD ele vai considerar a entrada a HIGH Se por algum motivo como o ruído ou componentes defeituosas a entrada do receiver cair na zona proibida entre VIL e VIH o comportamento da porta é imprevisível VOH VOL VIH e VIL são chamados de níveis lógicos altos e baixos de saída e entrada Figura 121 Porta AND de 4 entradas Figura 122 Tabela verdade da porta AND de 4 entradas Capítulo um Do Zero ao Um 28 163Margens de Ruído Se a saída do driver é para ser interpretada corretamente na entrada do receiver devemos escolher VOL VIL e VOH VIH Assim mesmo que a saída do driver seja perturbada por algum ruído a entrada do receiver detectará o nível lógico correto A margem de ruído é a quantidade de ruído que pode ser adicionado de tal forma que o sinal pode ainda ser interpretado como uma entrada válida num pior caso da saída Como pode ser visto na Figura 123 as margens de ruído de baixo e alto nível são respectivamente 𝑁𝑀𝐿 𝑉𝐼𝐿 𝑉𝑂𝐿 12 𝑁𝑀𝐻 𝑉𝑂𝐻 𝑉𝐼𝐻 13 Figura 123 Níveis lógicos e margens de ruído VDD representa a tensão no dreno do transístor semicondutor de óxido de metal usada para construir a maioria dos chips modernos A tensão de alimentação é também por vezes chamada VCC que está para a tensão no coletor de um transístor bipolar de junção utilizado para construir chips numa tecnologia mais antiga O GND é por vezes chamado de VSS porque é a tensão da source de um transístor semicondutor de óxido de metal Veja a Seção 17 para mais informações sobre transístores Capítulo um Do Zero ao Um 29 Exemplo 118 DETERMINAR AS MARGENS DE RUÍDO Considere o circuito inversor da Figura 124 VO1 é a tensão de saída do inversor I1 e VI2 é a tensão de entrada do conversor I2 Ambos os conversores têm as seguintes características VDD 5 V VIL 135 V VIH 315 V VOL 033 V e VOH 384 V Quais são as margens de ruído de nível baixo e alto do inversor o circuito pode tolerar 1 V de ruído entre VO1 e VI2 Figura 124 Circuito inversor Solução As margens de ruído do inversor são NML VIL VOL 135 V 033 V 102 V NMH VOH VIH 384 V 315 V 069 V O circuito pode tolerar 1 V de ruído quando a saída está a LOW NML 102 V mas não quando a saída está a HIGH NMH 069 V Por exemplo suponha que o driver I1 gera no pior caso o valor HIGH VO1 VOH 384 V Se o ruído fizer com que a tensão diminua 1 V antes de atingir a entrada do receptor VI2 384 V 1 V 284 V Este é menor do que o valor de entrada HIGH aceitável VIH 315 V de modo que o receiver pode não detectar uma entrada HIGH adequada 164 Característica de Transferência DC Para entender os limites da abstração digital devemos aprofundar o comportamento analógico de uma porta lógica A característica de transferência DC de uma porta lógica descreve a tensão de saída como uma função da tensão de entrada quando a entrada é alterada de forma suficientemente lenta para que a saída possa manterse É chamada de características de transferência porque descreve a relação entre as tensões de entrada e saída Um inversor ideal deverá ter um limiar de comutação brusco a VDD2 conforme mostrado na Figura 125 a Para VA VDD2 VY VDD Para VA VDD2 V Y 0 Neste caso VIH VIL VDD2 VOH VDD e VOL 0 DC indica um comportamento em que uma tensão de entrada é mantida constante ou as alterações ocorrem devagar o suficiente para que o resto do sistema possa manterse A raiz histórica do termo vem da corrente contínua um método de transmissão de energia através de uma linha com uma tensão constante Em contraste a resposta transiente de um circuito é o comportamento quando uma tensão de entrada varia rapidamente A Seção 29 explora mais a resposta transitória Capítulo um Do Zero ao Um 30 Um inversor verdadeiro muda gradualmente mais entre os extremos tal como mostrado na Figura 125 b Quando a tensão de entrada VA é 0 a tensão de saída VY VDD Quando VA VDD V Y 0 No entanto a transição entre estes extremos é suave e não pode ser exatamente centrada em VDD2 Isso levanta a questão de como definir os níveis lógicos Um lugar razoável para escolher os níveis lógicos é onde o declive da característica de transferência dYdVA é 1 Estes dois pontos são chamados de pontos de ganho unitário Escolhendo os níveis lógicos nos pontos de ganho unitário geralmente maximiza as margens de ruído Se VIL foi reduzido VOH só iria aumentar por uma pequena quantidade Mas se VIL for aumentado VOH cairia vertiginosamente Figura 125 Característica de transferência DC e níveis lógicos Capítulo um Do Zero ao Um 31 165 A Disciplina Estática Para evitar entradas que caem na zona proibida as portas lógicas digitais são concebidas de acordo com a disciplina estática A disciplina estática requer que dadas as entradas logicamente válidas cada elemento do circuito irá produzir saídas logicamente válidas Conformandose com a disciplina estática os projetistas digitais sacrificaram a liberdade de usar elementos de circuito analógico arbitrários para obterem a simplicidade e a robustez dos circuitos digitais Eles permitem elevar o nível de abstração de analógico para digital aumentando a produtividade de projeto ao esconder detalhes desnecessários A escolha de VDD e dos níveis lógicos é arbitrária mas todas as portas que se comunicam devem ter níveis lógicos compatíveis Por conseguinte as portas são agrupadas em famílias lógicas de modo a que todas as portas de uma família lógica obedeçam à disciplina estática quando usadas com outras portas na família As portas lógicas da mesma família lógica encaixam como Legos as quais usam tensões de alimentação e níveis lógicos consistentes As quatro grandes famílias lógicas que predominaram desde a década de 1970 através da década de 1990 são a TransistorTransistor Logic TTL a Complementary MetalOxideSemiconductor Logic Low Voltage Logic TTL LVTTL e Low Voltage Logic CMOS LVCMOS Os níveis lógicos utilizados são comparados na Tabela 14 Desde então as famílias lógicas têmse dividido com a proliferação das tensões de alimentação ainda mais baixas O Apêndice A6 revisita as famílias lógicas mais populares em detalhe Capítulo um Do Zero ao Um 32 Tabela 14 Famílias lógicas de níveis lógicos de 5 V e 33 V Tabela 15 Compatibilidade das famílias lógicas Exemplo 119 COMPATIBILIDADE DAS FAMÍLIAS LÓGICAS Quais das famílias lógicas apresentadas na Tabela 14 podem comunicar entre elas de forma confiável Solução A Tabela 15 lista a compatibilidade lógica entre famílias lógicas Notese que uma família com lógica de 5 V tais como a TTL ou a CMOS pode produzir uma tensão de saída tão alto quanto 5V Se este sinal de 5 V aciona a entrada de uma família de 33 V tal como a lógica LVTTL vs LVCMOS pode danificar o receiver a menos que este seja especialmente concebido para ser 5 volts compatível Capítulo um Do Zero ao Um 33 17 TRANSÍSTORES CMOS Esta e outras seções marcadas com são opcionais e não são necessárias para compreender o fluxo principal do livro A Máquina Analítica de Babbage foi construída a partir de engrenagens e os computadores eléctricos iniciais utilizavam relés ou tubos de vácuo Os computadores modernos usam transístores porque são baratos pequenos e de confiança Os transístores são interruptores controlados eletricamente que ligam ou desligam quando uma tensão ou corrente é aplicada a um terminal de controlo Os dois principais tipos de transístores são os transístores de junção bipolar bipolar junction transistors e os transístores de efeito de campo de metaloxidosemicondutor metaloxide semiconductor field effect transistors MOSFET ou transístores MOS Em 1958 Jack Kilby na Texas Instruments construiu o primeiro circuito integrado contendo dois transístores Em 1959 Robert Noyce na Semiconductor Fairchild patenteou um método de interconexão de vários transístores em um único chip de silício Na época os transístores custavam cerca de US 10 cada Graças a mais de três décadas de avanços de fabricação sem precedentes os engenheiros podem agora empacotar cerca de um bilhão de transístores MOSFET num chip de 1 cm2 de silício e esses transístores custam menos do que 10 micro centavos cada A capacidade e os custos continuam a melhorar por uma ordem de magnitude a cada 8 anos ou mais Os MOSFET são agora os blocos de construção de quase todos sistemas digitais utilizam Nesta seção vamos espreitar por baixo da abstração digital para ver como as portas lógicas são construídas a partir de MOSFET 171 Semicondutores Os transístores MOS são construídos a partir de silício o átomo predominante na pedra e areia O silício Si é um átomo do grupo IV por isso tem quatro elétrons na sua camada de valência e forma ligações com quatro átomos adjacentes resultando numa rede cristalina A Figura 126 a mostra a estrutura em duas dimensões para facilidade de desenho mas devemos lembrar que a rede efetivamente forma um cristal cúbico Na figura uma linha representa uma ligação covalente Por si Robert Noyce 19271990 Nascido em Burlington Iowa Recebeu um B A em física pela Grinnell College eum PhD em Física pelo MIT Apelidado de prefeito do Vale do Silício por sua profunda influência sobre a indústria CoFundador da Fairchild Semiconductor em 1957 e da Intel em 1968 Inventou o circuito integrado Muitos engenheiros de suas equipes fundaram outras empresas de semicondutores 2006 Intel Corporation Reproduzido com permissão Capítulo um Do Zero ao Um 34 só o silício é um mau condutor porque todos os elétrons estão amarrados em ligações covalentes No entanto tornase um condutor melhor quando pequenas quantidades de impurezas chamadas átomos dopantes são cuidadosamente adicionadas Se um dopante do grupo V como arsénio As é adicionado os átomos dopantes têm um elétron extra que não está envolvido nas ligações Os elétrons podem facilmente moverse sobre a estrutura deixando um átomo dopante ionizado As para trás como mostrado na Figura 126 b O elétron carrega uma carga negativa de modo que chamamos o arsénio de dopante do tipon Por outro lado se um dopante do grupo III tais como o boro B é adicionado aos átomos dopantes falta um elétron como mostrado na Figura 126 c Esta falta de elétrons é denominada de lacuna Um elétron de um átomo de silício vizinho pode moverse para preencher a ligação em falta formando um átomo dopante ionizado B e deixando uma lacuna no átomo de silício vizinho De um modo semelhante a lacuna pode migrar em torno da estrutura A lacuna é uma falta de carga negativa por isso atua como uma partícula carregada positivamente Por isso chamamos o Boro de dopante do tipop Uma vez que a condutividade de silício muda ao longo de muitas ordens de grandeza dependendo da concentração dos dopantes o silício é designado de semicondutor 172 Díodos A junção entre o silício do tipop e do tipon silício é chamado de díodo A região do tipop é chamada de ânodo e a região de tipon é chamada de cátodo conforme ilustrado na Figura 127 Quando a tensão no ânodo sobe acima da tensão no cátodo o díodo é polarizado diretamente e a corrente flui através do díodo a partir do ânodo para o cátodo Mas quando a tensão de ânodo é menor do que a tensão no cátodo o díodo é polarizado reversa e a corrente não passa O símbolo de díodo mostra intuitivamente que a corrente flui em uma única direção Figura 126 Estrutura cristalina do Silício de átomos dopantes Capítulo um Do Zero ao Um 35 173 Capacitor Um capacitor é constituído por dois condutores separados por um isolador Quando uma tensão V é aplicada a um dos condutores o condutor acumula a carga elétrica Q e o outro condutor acumula a carga Q oposta A capacitância C do capacitor é a razão entre a carga e a tensão C Q V A capacitância é proporcional ao tamanho dos condutores e inversamente proporcional à distância entre eles O símbolo para um capacitor está ilustrado na Figura 128 A capacidade é importante porque o carregamento ou descarga de um condutor leva tempo e energia Uma capacidade maior significa que um circuito será mais lento e necessita de mais energia para funcionar A velocidade e a energia serão discutidas ao longo deste livro 174 Transístores nMOS e pMOS Um MOSFET é um sanduíche de várias camadas de condução e materiais isolantes Os MOSFET são construídos a partir de finas wafers de silício com cerca de 15 a 30 cm de diâmetro O processo de fabrico começa com uma simples wafer O processo envolve uma sequência de passos ao longo dos quais os dopantes são implantados ao silício filmes finos de dióxido de silício e silício são produzidos e o metal é depositado Entre cada passo a wafer é padronizada de modo a que os materiais aparecem apenas onde são desejados Uma vez que os transístores têm comprimento de uma fracção de mícron 1 μm 1 micron 106 m toda a bolacha é processada de uma só vez é por isso pouco dispendioso o fabrico de bilhões de transístores de cada vez Uma vez que o processamento esteja concluído a wafer é cortada em retângulos chamados de chips ou dice que contêm milhares milhões ou até bilhões de transístores O chip é testado e em seguida colocado num plástico ou pacote de cerâmico com pinos de metal para conectálo a uma placa de circuito A sanduíche de MOSFET consiste numa camada condutora chama de porta no topo de uma camada isolante de dióxido de silício SiO2 na parte superior da bolacha de silício o chamado substrato Historicamente a porta foi construída a partir de metal daí o nome de semicondutores de óxidos de metal Os processos de fabrico modernos usam silício policristalino para a porta porque não funde durante os passos de processamento de alta temperatura subsequentes O dióxido de silício é mais conhecido como vidro e é muitas vezes chamado simplesmente de óxido na indústria de Figura 127 Díodo de Junção pn Estrutura e símbolo Figura 128 Símbolo do capacitor Técnicos numa sala limpa da Intel usando fato de proteção GoreTex para evitar que partículas dos seus cabelos pele e roupas contaminassem os transístores microscópicos em wafers de silício 2006 Intel Corporation Reproduzido com permissão Capítulo um Do Zero ao Um 36 semicondutores A sanduíche de metalóxidosemicondutor forma um condensador em que uma camada fina de óxido isolante chamado de dielétrico separa as placas de metal e semicondutoras Figura 129 Transístores nMOS e pMOS Existem dois tipos de MOSFET nMOS e pMOS A Figura 129 mostra secções transversais de cada tipo feito por corte de uma wafer e olhando para ele de lado Os transístores do tipon chamado nMOS têm regiões dopantes do tipon adjacentes à porta chamada de source e dreno e são construídas sobre um substrato semicondutor do tipop Os pMOS são exatamente o oposto que consiste numa source de tipop e a região do dreno num substrato tipon Um MOSFET comportase como um interruptor controlado por tensão em que a tensão da porta cria um campo eléctrico que liga ou desliga a ligação entre a source e o dreno A designação de transístor de efeito de campo vem deste princípio de operação Vamos começar por explorar o funcionamento de um transístor nMOS Um pacote dualinline de 40 pinos DIP contém um pequeno chip pouco visível no centro que está ligado a 40 pinos de metal 20 por lado por fios de ouro mais finos do que um fio de cabelo fotografia de Kevin Mapp Harvey Mudd College Capítulo um Do Zero ao Um 37 O substrato de um transístor nMOS está normalmente ligada a GND a tensão mais baixa no sistema Em primeiro lugar consideremos a situação quando a porta está também a 0 V conforme mostrado na Figura 130 a Os díodos entre a source ou o dreno e o substrato estão polarizados inversamente porque a tensão da source ou do dreno é não negativa Assim não existe um caminho para o fluxo de corrente entre a source e o dreno de modo que o transístor está ao corte Agora considere que a porta é colocada a VDD como mostrado na Figura 130 b Quando uma tensão positiva é aplicada à placa de topo de um condensador estabelece um campo eléctrico que atrai a carga positiva para a placa de topo e a carga negativa para a placa inferior Se a tensão é suficientemente grande de modo que muita carga negativa é atraída para o lado de baixo da porta a região inverte do tipop para se tornar efetivamente do tipon Esta região invertida é denominada de canal Agora o transístor tem um percurso contínuo a partir da source do tipon através do canal do tipon para o dreno do tipon de modo que os elétrons podem fluir da source para o dreno O transístor está em condução A tensão da porta necessária para ligar um transístor é chamada de tensão de limiar Vt e é tipicamente de 03 a 07 V Figura 130 Funcionamento de um transístor nMOS Os terminais da source e do dreno são fisicamente simétricos No entanto podemos dizer que a carga flui da source para o dreno Num transístor nMOS a carga é transportada por elétrons que fluem de tensão negativa para a tensão positiva Num transístor pMOS a carga é transportada por lacunas que fluem da tensão positiva para a tensão negativa Se desenharmos esquemas com a tensão mais positiva na parte superior e a mais negativo na parte inferior a source de cargas negativa num transístor nMOS é o terminal inferior e a fonte de cargas positivas num transistor pMOS é o terminal superior Um técnico segura uma bolacha de 12 polegadas que contém centenas de microprocessadores 2006 Intel Corporation Reproduzido com permissão Capítulo um Do Zero ao Um 38 Os transístores pMOS trabalham exatamente de maneira oposta como pode ser deduzido a partir do círculo no seu símbolo mostrado na Figura 132 O substrato é mantido a VDD Quando a porta está também a VDD e o transístor pMOS fica ao corte Quando a porta está a GND o canal inverte para tipo p e o transístor pMOS fica em condução Infelizmente os MOSFET não são interruptores perfeitos Em particular os transístores nMOS comutam bem para 0 mas mal para 1 Especificamente quando a porta de um transístor nMOS está a VDD o dreno só irá comutar entre 0 e VDD Vt Da mesma forma os pMOS comutam bem para 1 mas mal para 0 No entanto vamos ver que é possível construir portas lógicas que usam transístores apenas no seu modo bom Figura 131 Modelo de interrupto dos MOSFET Os transístores nMOS precisam de um substrato do tipop e os pMOS precisam de um substrato tipon Para construir os dois tipos de transístores no mesmo chip os processos de fabricação normalmente começam com uma wafer do tipop em seguida implantam regiões do tipon chamadas de wells onde os transístores pMOS serão construídos Estes processos que fornecem ambos os tipos de transístores são chamados Complementar MOS ou CMOS Os processos CMOS são utilizados para construir a grande maioria de todos os transístores fabricados hoje Em resumo os processos CMOS dãonos dois tipos de comutadores controlados eletricamente como mostrado na Figura 132 A tensão na porta g regula o fluxo de corrente entre a source s e o dreno d Os transístores nMOS estão ao corte quando a porta está 0 e em condução quando a porta Figura 132 Esquemático de uma porta NOT Capítulo um Do Zero ao Um 39 está a 1 Os transístores pMOS são exatamente o oposto em condução quando a porta está a 0 e ao corte quando a porta está a 1 175 Porta CMOS NOT A Figura 132 apresenta um diagrama esquemático de uma porta NOT construída com transístores CMOS O triângulo indica GND e a barra indica VDD esses rótulos estarão omissos em esquemas futuros O transístor nMOS N1 está ligado entre GND e a saída Y O transístor pMOS P1 está ligado entre VDD e a saída Y Ambas as portas dos transístores são controladas através da entrada A Se A 0 N1 está OFF e P1 está ON Assim Y está ligado a VDD mas não a GND e é puxado para cima um 1 lógico P1 permite um bom 1 Se A 1 N1 está ON e P1 está OFF e Y é puxado para baixo um 0 lógico N1 permite um bom 0 Verificando a tabela verdade na Figura 112 vemos que o circuito é de facto uma porta NOT 176 Outras Portas Lógicas CMOS A Figura 133 apresenta um diagrama esquemático de uma porta NAND de duas entradas Nos diagramas esquemáticos as ligações são sempre unidas utilizando junções de três vias Nos cruzamentos são utilizadas junções de quatro vias e somente um ponto é mostrado Os transístores nMOS N1 e N2 estão ligados em série ambos os transístores nMOS devem estar em condução de modo a puxar a saída para baixo para GND Os pMOS P1 e P2 estão em paralelo apenas um transístor pMOS deve estar em condução para puxar a saída para VDD A Tabela 16 lista o funcionamento das redes de pullup e de pulldown e o estado da saída demonstrando que a porta funciona como um NAND Por exemplo quando A 1 e B 0 N1 está ON mas N2 está OFF bloqueando o caminho de Y para GND P1 está OFF mas P2 está ON criando um caminho de VDD para Y Assim Y é puxado para cima a 1 Figura 133 Esquemático de uma porta NAND de duas entradas Gordon Moore 1929 Nascido em San Francisco Recebeu um B S em química pela Universidade de Berkeley e um PhD em química e física da Caltech Co Fundador da Intel em 1968 com Robert Noyce Observa em 1965 que o número de transístores num chip de computador duplica a cada ano Esta tendência tornou se conhecida como Lei de Moore Desde 1975 número de transístores dobra a cada dois anos Um corolário da Lei de Moore é que o desempenho do microprocessador dobra a cada 18 a 24 meses As vendas de semicondutores também têm aumentado exponencialmente Infelizmente o consumo de energia tem também aumentado exponencialmente 2006 Intel Corporation Reproduzido com permissão Capítulo um Do Zero ao Um 40 Tabela 16 Operação de uma porta AND A Figura 134 mostra a forma geral utilizada para construir qualquer porta lógica de inversão como NOT NAND ou NOR Os transístores nMOS permitem bons 0 por isso uma rede pulldown de transístores nMOS é colocada entre a saída e GND para puxar a baixo a saída para 0 Os transístores pMOS permitem bons 1 então uma rede de pullup de transístores pMOS é colocada entre a saída e VDD para puxar a saída até 1 As redes podem ser constituídas por transístores em série ou em paralelo Quando os transístores estão em paralelo a rede está ON se qualquer transístor está em condução Quando os transístores estão em série a rede está ON somente se ambos os transístores estão em condução A barra através da ligação de entrada indica que a porta pode receber múltiplas entradas Se tanto a rede de pullup como de pulldown estiverem ON simultaneamente um curtocircuito existiria entre o VDD e o GND A saída da porta pode estar numa zona proibida e os transístores consumirem grandes quantidades de energia possivelmente o suficiente para queimar Por outro lado se tanto a rede de pullup como de pulldown estiverem OFF simultaneamente a saída não Figura 134 Forma geral de uma porta logica inversora Capítulo um Do Zero ao Um 41 estaria ligada nem a VDD nem a GND Dizemos que a saída flutua O seu valor é indefinido As saídas flutuantes são geralmente indesejáveis mas na Seção 26 veremos como elas podem eventualmente ser usadas em vantagem do projetista Numa porta lógica a funcionar adequadamente uma das redes deve estar ON e a outra OFF em determinado momento de modo que a saída esteja puxado para HIGH ou para LOW e não em curto circuito ou flutuante Podemos garantir isso usando a regra de complementos de condução Quando os transístores nMOS estão em série os transístores pMOS devem estar em paralelo Quando os transístores nMOS estão em paralelo os transístores PMOS devem estar em série Exemplo 120 ESQUEMÁTICO DE UM NAND DE TRÊS ENTRADAS Desenhe um esquema para uma porta NAND de três entradas usando transístores CMOS Solução A porta NAND deve produzir uma saída a 0 somente quando todas as três entradas estiverem a 1 Assim a rede de pulldown deve ter três transístores nMOS em série Através da regra de complemento da condução os pMOS deve estar em paralelo Uma porta destas é mostrada na Figura 135 podese verificar a função observando que a tabela verdade está correta Exemplo 121 ESQUEMÁTICO DE UM NOR DE DUAS ENTRADAS Desenhe um esquema para uma porta NOR de duas entradas usando transístores CMOS Solução A porta NOR deve produzir uma saída a 0 se qualquer entrada estiver a 1 Assim a rede de pulldown deve ter dois transístores nMOS em paralelo Pela regra de complemento de condução os pMOS devem estar em série Uma porta é mostrada na Figura 136 Exemplo 122 ESQUEMÁTICO DE UM AND DE DUAS ENTRADAS Desenhe um esquema para uma porta AND de duas entradas usando transístores CMOS Projetistas experientes afirmam que dispositivos eletrônicos funcionam porque contêm fumaça mágica Eles confirmam esta teoria com a observação de que se a fumaça mágica deixa o dispositivo ele deixa de trabalhar Figura 135 Esquemático de uma porta NAND de três entradas Capítulo um Do Zero ao Um 42 Solução É impossível construir uma porta AND com uma única porta CMOS No entanto a construção de portas NAND e NOT é fácil Assim a melhor maneira de construir uma porta AND utilizando transístores CMOS é a utilização de um NAND seguido por um NOT como mostrado na Figura 137 177 Portas de Transmissão Por vezes os projetistas acham conveniente utilizar um interruptor ideal que possam transmitir bem tanto o 0 como o 1 Lembrese que os transístores nMOS são bons a transmitir o 0 e os pMOS são bons a transmitir o 1 então a combinação paralela dos dois permite transmitir ambos os valores A Figura 138 mostra tal circuito chamado de porta de transmissão ou porta de passagem Os dois lados do interruptor são chamados de A e B porque é um interruptor bidirecional e não tem nenhum lado de entrada ou saída preferida Os sinais de controlo são chamados enable EN e 𝐸𝑁 Quando EN 0 e 𝐸𝑁 1 ambos os transístores estão desligados Assim a porta de transmissão está OFF ou descativada então A e B não estão ligados Quando EN 1 e 𝐸𝑁 0 a porta de transmissão está ligada ou cativada e qualquer valor lógico pode fluir entre A e B 178 Lógica PseudonMOS Uma porta NOR CMOS de Nentradas usa N nMOS em paralelo e N transístores pMOS em série Os transístores em série são mais lentos do que os transístores em paralelo assim como as resistências em série têm maior resistência do que resistores em paralelo Além disso os pMOS são mais lentos do que os transístores nMOS porque as lacunas não se podem mover em torno da estrutura de silício tão rapidamente como os elétrons Portanto os transístores nMOS em paralelo são rápidos e os transístores pMOS em série são lentos especialmente quando muitos estão em série A lógica pseudonMOS substitui a pilha lenta de transístores pMOS com um único transístor pMOS fraco que está sempre ON como mostrado na Figura 139 Este transístor pMOS é frequentemente chamado de fraco pullup As dimensões físicas do transístor pMOS são selecionadas de modo que o transístor PMOS vá puxar a saída Y a HIGH fracamente isto é apenas se nenhum dos transístores nMOS está em condução Mas se algum transístor nMOS está em condução domina os pullup fracos e puxa Y para baixo o suficiente perto de GND para produzir um 0 lógico Figura 136 Esquemático de uma porta NOR de duas entradas Figura 137 Esquemático de uma porta AND de duas entradas Figura 138 Porta de transmissão Capítulo um Do Zero ao Um 43 A vantagem da lógica pseudonMOS é que ela pode ser usada para construir portas NOR rápidas com muitas entradas Por exemplo a Figura 140 mostra um NOR pseudonMOS de quatroentrada As portas pseudonMOS são úteis para certas matrizes de memória e lógica discutidas no Capítulo 5 A desvantagem é que existe um curtocircuito entre VDD e GND quando a saída está a LOW os transístores fracos pMOS e nMOS estão ambos em condução O curtocircuito deixa passar energia de forma contínua de modo que a lógica pseudonMOS deve ser utilizada com moderação As portas pseudonMOS obtiveram o seu nome na década de 1970 quando os processos de fabricação só tinham transístores nMOS Um transístor fraco nMOS foi utilizado para puxar a saída a HIGH porque os transístores PMOS não estavam disponíveis 18 CONSUMO DE ENERGIA O consumo de energia é a quantidade de energia utilizada por unidade de tempo O consumo de energia é de grande importância em sistemas digitais A vida útil da bateria dos sistemas portáteis como telefones celulares e computadores portáteis é limitada pelo consumo de energia A potência também é significativa para os sistemas que estão ligados porque a eletricidade custa dinheiro e porque o sistema vai sobreaquecer se consumir muita energia Os sistemas digitais consumem energia dinâmica e estática A energia dinâmica é utilizada para carregar condensadores à medida que os sinais mudam entre 0 e 1 A energia estática é utilizada mesmo quando os sinais não mudem e o sistema estiver ocioso As portas lógicas e as ligações que as conectam têm uma capacidade A energia obtida a partir da fonte de alimentação para carregar um condensador C à tensão VDD é CVDD2 Se a tensão no condensador comuta à frequência f ou seja f vezes por segundo o condensador carrega f2 e descarrega f2 vezes por segundo A descarga não retira energia da fonte de alimentação de modo que o consumo de energia dinâmica é 𝑃𝑑𝑖𝑛𝑎𝑚𝑖𝑐𝑎 1 2 𝐶𝑉𝐷𝐷 2𝑓 14 Figura 139 PeudonMOS genérico Figura 140 Porta NOR de quatro entradas pseudonMOS Capítulo um Do Zero ao Um 44 Exemplo 123 CONSUMO DE ENERGIA Um telefone celular tem uma bateria de 6 watthora Whr e opera a 12 V Suponha que quando ele está em uso funciona a 300 MHz e a quantidade média de capacidade a comutar no chip num dado tempo é de 10 nF 108 Farads Quando em uso ele também transmite 3 W de potência através da sua antena Quando o telefone não está em uso a potência dinâmica cai para quase zero porque o processamento de sinal está desligado Mas o telefone requer também a 40 mA de corrente de repouso se ele está em uso ou não Determinar a vida útil da bateria do telefone a se ele não estiver sendo usado e b se ele está sendo usado continuamente Solução A potência estática Pestática 0040 A 12 V 48 mW A Se o telefone não estiver sendo usado este é o único consumo de energia de modo que a vida útil da bateria é 6 Whr 0048 W 125 horas cerca de 5 dias B Se o telefone estiver sendo usado a potência dinâmica é Pdinâmica 05108 F12 V23 108 Hz 216 W Juntamente com a potência estática e de transmissão a potência total ativa é 216 W 0048 W 3 W 52 W de modo que a vida útil da bateria é de 6 W hr 52 W 115 horas Este exemplo simplifica a operação real de um telefone celular mas ilustra as ideiaschave de consumo de energia Os sistemas eléctricos consomem alguma corrente mesmo quando eles estão ociosos Quando os transístores estão ao corte eles perdem uma pequena quantidade de corrente Alguns circuitos tais como as portas pseudonMOS discutidas na Secção 178 têm um caminho de VDD para GND através do qual a corrente flui continuamente A corrente estática total o IDD é também chamada de corrente de fuga ou a corrente de alimentação de repouso que flui entre VDD e GND O consumo de energia estática é proporcional a esta corrente estática 𝑃𝐸𝑠𝑡á𝑡𝑖𝑐𝑎 𝐼𝐷𝐷𝑉𝐷𝐷 15 Capítulo um Do Zero ao Um 45 19 SUMÁRIO E ANTECIPAÇÃO Há 10 tipos de pessoas neste mundo aqueles que podem contar em binário e aqueles que não podem Este Capítulo introduziu princípios para a compreensão e concepção de sistemas complexos Embora o mundo real seja analógico os projetistas digitais disciplinamse para utilizar um subconjunto discreto de possíveis sinais Em particular variáveis binárias têm apenas dois estados 0 e 1 também chamados de FALSE e TRUE ou HIGH e LOW As portas lógicas calculam uma saída binária de uma ou mais entradas binárias Algumas das portas lógicas comuns são NOT TRUE quando a entrada é FALSE AND TRUE quando todas as entradas são TRUE OR TRUE quando todas as entradas são TRUE XOR TRUE quando um número ímpar de entradas é TRUE As portas lógicas são normalmente construídas a partir de transístores CMOS que se comportam como interruptores controlados eletricamente Os transístores nMOS ficam em condução quando a gate está a 1 Os transístores pMOS ficam em condução quando a gate está a 0 Nos Capítulos 2 ao 5 continuamos o estudo da lógica digital O Capítulo 2 aborda a lógica combinatória em que as saídas dependem apenas das entradas atuais As portas lógicas introduzidas já são exemplos de combinações lógicas O leitor vai aprender a projetar circuitos que envolvem múltiplas portas para implementar uma relação entre as entradas e as saídas especificadas por uma tabela verdade ou uma equação booleana O Capítulo 3 aborda a lógica sequencial em que as saídas dependem tanto do estado atual como passado das entradas Os registros são elementos sequenciais comuns que recordam a sua entrada anterior As máquinas de estados finitos construídas a partir de registros e lógica combinatória são uma maneira poderosa para construir sistemas complicados de uma maneira sistemática Estudamos também o sincronismo de sistemas digitais para analisar o quão rápido este pode operar O Capítulo 4 descreve as linguagens de descrição de hardware HDL As HDL estão relacionadas com as linguagens de programação convencionais mas são usadas para Capítulo um Do Zero ao Um 46 simular e construir hardware em vez de software A maioria dos sistemas digitais de hoje é projetada com HDL SystemVerilog e VHDL são as duas línguas predominantes e elas são cobertas em paralelo neste livro O Capítulo 5 estuda outros blocos combinatórios e sequenciais de construção tais como somadores multiplicadores e memórias O Capítulo 6 aborda a arquitetura de computadores Ele descreve o processador MIPS um microprocessador padrão da indústria usado em electrónica de consumo algumas estações de trabalho Silicon Graphics e muitos sistemas de comunicações tais como televisores hardware de rede e ligações sem fios A arquitetura MIPS é definida por seus registros e conjunto de instruções assembly O leitor vai aprender a escrever programas em linguagem assembly para o processador MIPS de modo que possa comunicar com o processador na sua língua nativa Os Capítulos 7 e 8 estabelecem a ponte entre a lógica digital e a arquitetura de computadores O Capítulo 7 investiga a microarquitetura a organização dos blocos de construção digitais tais como somadores e registradores necessários para construir um processador Nesse Capítulo o leitor aprende a construir o seu próprio processador MIPS Na verdade aprende três microarquiteturas que ilustram diferentes compromissos de desempenho e custo O desempenho do processador tem aumentado exponencialmente exigindo cada vez sistemas de memória mais sofisticadas para alimentar a procura insaciável por dados O Capítulo 8 investiga a arquitetura do sistema de memória e também descreve como os computadores comunicam com dispositivos periféricos como teclados e impressoras Capítulo um Do Zero ao Um 47 Exercícios Exercício 11 Explique num parágrafo pelo menos três níveis de abstração que são utilizados por a biólogos que estudam o funcionamento das células b químicos que estudam a composição de matéria Exercício 12 Explique num parágrafo como as técnicas de hierarquia modularidade e regularidade podem ser utilizadas por a projetistas de automóveis b empresas na gestão das suas operações Exercício 13 Ben Bitdiddle está a construir uma casa Explique como pode ele usar os princípios de hierarquia modularidade e regularidade para economizar tempo e dinheiro durante construção Exercício 14 Uma tensão analógica situase na gama 05 V Se puder ser medida com uma precisão de 50 mV quantos bits de informações transmite no máximo Capítulo um Do Zero ao Um 48 Exercício 15 A sala de aula tem um velho relógio na parede cujo ponteiro dos minutos se avariou a Se o leitor pode ler o ponteiro das horas para o valor mais próximo dos 15 minutos quantos bits de informação o relógio transmite sobre o tempo b Se o leitor sabe se é antes ou depois do meiodia quantos bits de informação adicional sabe sobre o tempo Exercício 16 Os Babilónios desenvolveram o sistema de numeração sexagesimal base 60 à cerca de 4000 anos atrás Quantos bits de informação são transmitidos com um dígito sexagesimal Como se escreve o número 400010 em sexagesimal Exercício 17 Quantos números diferentes podem ser representados com 16 bits Exercício 18 Qual é o maior número binário de 32 bits sem sinal Exercício 19 qual é o maior número binário de 16 bits que pode ser representado com a números sem sinal b números em complemento2 c números de sinalmagnitude Exercício 110 Qual é o maior número binário de 32 bits que pode ser representado com Capítulo um Do Zero ao Um 49 a números sem sinal b números em complemento2 c números de sinalmagnitude Exercício 111 Qual é o menor número binário de 16 bits mais negativo que pode ser representado com a números sem sinal B números em complemento2 c números de sinalmagnitude Exercício 112 Qual é o menor número binário de 32 bits mais negativo que pode ser representado com a números sem sinal B números em complemento2 c números de sinalmagnitude Exercício 113 Converta os seguintes números binários sem sinal para decimal Apresente o seu trabalho a 10102 b 1101102 c 111100002 Capítulo um Do Zero ao Um 50 d 0001000101001112 Exercício 114 Converta os seguintes números binários sem sinal para decimal Apresente seu trabalho a 11102 b 1001002 c 110101112 d 0111010101001002 Exercício 115 Repita o Exercício 113 mas converta em hexadecimal Exercício 116 Repita o Exercício 114 mas converta em hexadecimal Exercício 117 Converta os seguintes números hexadecimais para decimal Mostre seu trabalho a A516 b 3B16 c FFFF16 d D000000016 Exercício 118 Converta os seguintes números hexadecimais para decimal Mostre seu trabalho Capítulo um Do Zero ao Um 51 a 4E16 b 7C16 c ED3A16 d 403FB00116 Exercício 119 Repita o Exercício 117 mas converta para binário sem sinal Exercício 120 Repita o Exercício 118 mas converta para binário sem sinal Exercício 121 Converta os seguintes números binários em complemento2 para decimal a 10102 b 1101102 c 011100002 d 100111112 Exercício 122 Converta os seguintes números binários em complemento2 para decimal a 11102 b 1000112 c 010011102 d 101101012 Capítulo um Do Zero ao Um 52 Exercício 123 Repita o Exercício 121 assumindo que os números binários estão na forma de sinalmagnitude em vez de na representação em complemento2 Exercício 124 Repita o Exercício 122 assumindo que os números binários estão na forma de sinalmagnitude em vez de na representação em complemento2 Exercício 125 Converta os seguintes números decimais para binário sem sinal a 4210 b 6310 c 22910 d 84510 Exercício 126 Converta os seguintes números decimais para binário sem sinal a 1410 b 5210 c 33910 d 71110 Exercício 127 Repita o Exercício 125 mas converta para hexadecimal Capítulo um Do Zero ao Um 53 Exercício 128 Repita o Exercício 126 mas converta para hexadecimal Exercício 129 Converta os seguintes números decimais para números de 8bits em complemento2 ou indique se o número decimal ultrapassa o intervalo a 4210 b 6310 c 12410 d 12810 e 13310 Exercício 130 Converta os seguintes números decimais para números de 8bits em complemento2 ou indique se o número decimal ultrapassa o intervalo a 2410 b 5910 c 12810 d 15010 e 12710 Exercício 131 Repita o Exercício 129 mas converta para números de sinalmagnitude de 8 bits Exercício 132 Repita o Exercício 130 mas converta para números de sinalmagnitude de 8 bits Capítulo um Do Zero ao Um 54 Exercício 133 Converta os dois números seguintes de 4bits para 8bits em complento2 a 01012 b 10102 Exercício 134 Converta os dois números seguintes de 4bits para 8bits em complento2 a 01112 b 10012 Exercício 135 Repita o Exercício 133 se os números não possuírem sinal em vez de complemento2 Exercício 136 Repita o Exercício 134 se os números não possuírem sinal em vez de complemento2 Exercício 137 A base 8 é designada como octal Converta cada um dos números do Exercício 125 para octal Exercício 138 A base 8 é referida como octal Converta cada um dos números de Exercício 126 para octal Capítulo um Do Zero ao Um 55 Exercício 139 Converta cada um dos números seguintes de octal para binário hexadecimal e decimal a 428 b 638 c 2558 d 30478 Exercício 140 Converta cada um dos seguintes números de octal para binário hexadecimal e decimal a 238 b 458 c 3718 d 25608 Exercício 141 Quantos números de 5bit em complemento2 são maiores do que 0 Quantos são inferiores a 0 Como é que as suas respostas seriam diferentes para números sinalmagnitude Exercício 142 Quantos números de 7bit em complemento2 são maiores do que 0 Quantos são inferiores a 0 Como é que as suas respostas seriam diferentes para números sinalmagnitude Capítulo um Do Zero ao Um 56 Exercício 143 Quantos bytes possui uma word de 32bit Quantas nibles possui essa word Exercício 144 Quantos bytes possui uma word de 64bits Exercício 145 Um dado modem DSL opera a 768 kbitss Quantos bytes pode ele receber num 1 minuto Exercício 146 Uma porta USB 30 pode enviar dados a 5 Gbitsseg Quantos bytes pode ela enviar num 1 minuto Exercício 147 Os fabricantes de discos rígidos usam o termo megabyte para significar 106 bytes e gigabyte para significar 109 bytes Quantos GB reais de música que você pode armazenar num disco rígido de 50 GB Exercício 148 Estime o valor de 231 sem usar uma calculadora Exercício 149 A memória no microprocessador Pentium II é organizada como uma matriz retangular de bits com 28 linhas e 29 colunas Estimar quantos bits possui sem usar uma calculadora Exercício 150 Desenhe uma linha de números análoga à da Figura 111 para números de 3bits sem sinal em complemento2 e sinalmagnitude Capítulo um Do Zero ao Um 57 Exercício 151 Desenhe uma linha de números análoga à da Figura 111 para números de 2bits sem sinal em complemento2 e sinalmagnitude Exercício 152 Execute as seguintes adições de números binários sem sinal Indicar se a soma transborda ou não num resultado de 4bits a 10012 01002 b 11012 10112 Exercício 153 Execute as seguintes adições de números binários não assinados Indicar se a soma a soma transborda ou não num resultado de 8bits a 100110012 010001002 b 110100102 101101102 Exercício 154 Repita o Exercício 152 assumindo que os números binários estão na forma complemento2 Exercício 155 Repita o Exercício 153 assumindo que os números binários estão na forma complemento2 Exercício 156 Converta os seguintes números decimais para números binários em complemento2 de 6bits e adicioneos Indique se a soma transborda ou não o resultado de 6bits Capítulo um Do Zero ao Um 58 a 1610 910 b 2710 3110 c 410 1910 d 310 3210 e 910 1610 f 2710 3110 Exercício 157 Repita o Exercício 156 para os seguintes números a 710 1310 b 1710 2510 c 2610 810 d 3110 1410 e 1910 2210 f 210 2910 Exercício 158 Execute as seguintes adições de números hexadecimais sem sinal Indique se a soma transborda ou não num resultado de 8bits dois dígitos hex a 716 916 b 1316 2816 c AB16 3E16 Capítulo um Do Zero ao Um 59 d AD16 8F16 Exercício 159 Execute as seguintes adições de números hexadecimais sem sinal Indique se a soma transborda ou não um resultado de 8bits dois dígitos hex A 2216 816 B 7316 2C16 C 7F16 7 F16 D C216 A416 Exercício 160 Converta os seguintes números decimais em números binários de 5bits em complemento2 e subtraiaos Indique se a diferença transborda ou não um resultado de 5bits a 910 710 b 1210 1510 c 610 1110 d 410 810 Exercício 161 Converta os seguintes números decimais em números binários de 6bits em complemento2 e subtraiaos Indique se a diferença transborda ou não um resultado de 6bits a 1810 1210 b 3010 910 c 2810 310 Capítulo um Do Zero ao Um 60 d 1610 2110 Exercício 162 Num sistema numérico binário de Nbits com bias B os números positivos e negativos são representados somando o seu valor ao valor de bias B Por exemplo para o número de 5bits com bias de 15 o número 0 é representado como 01111 1 como 10000 e assim por diante Os sistemas de números com bias são por vezes usados em matemática de vírgula flutuante que será discutido no Capítulo 5 Considere um sistema numérico binário de 8bit s com bias de 12710 a qual o valor decimal que o número binário 100000102 representa b que número binário representa o valor 0 c qual é a representação do valor do número mais negativo d qual é a representação do valor do número mais positivo Exercício 163 Desenhe uma linha numérica análoga à da Figura 111 para números de 3bit com bias de 3 ver Exercício 162 para uma definição de números com bias Exercício 164 Num sistema de codificação binária decimal BCD 4 bits são utilizados para representar um dígito decimal de 0 a 9 Por exemplo 3710 é escrito como 00110111 BCD a escreva 28910 em BCD b converta 100101010001 BCD para decimal c converta 01101001BCD para binário d explique porque o BCD pode ser uma maneira útil para representar números Capítulo um Do Zero ao Um 61 Exercício 165 responda às seguintes questões relacionadas com os sistemas BCD ver Exercício 164 para a definição da BCD a escreva 37110 em BCD b converta 000110000111BCD para decimal c converta 10010101 BCD para binário d Explique as desvantagens do BCD quando comparado com representações binárias de números Exercício 166 Um disco voador despenhouse num campo de milho no Nebraska O FBI investiga os destroços e encontra um manual de engenharia contendo uma equação no sistema numérico Marte 325 42 411 Se esta equação está correta quantos dedos o leitor esperaria que os marcianos tenham Exercício 167 Ben Bitdiddle e Alyssa P Hacker estão tendo uma discussão Ben diz Todos os inteiros maiores que zero exatamente divisíveis por seis têm exatamente dois 1s na sua representação binária Alyssa discorda Ela diz Não mas todos esses números têm um número par de 1s na sua representação Você concorda com o Ben ou com a Alyssa ou com ambos ou com nenhum Explique Exercício 168 Ben Bitdiddle e Alyssa P Hacker estão a ter outra discussão Ben diz Eu posso obter o complemento2 de um número subtraindo 1 e em seguida invertendo todos os bits do resultado Alyssa diz Não eu posso fazer isso examinando cada bit do número começando com Capítulo um Do Zero ao Um 62 o menos significativo Quando o primeiro 1 é encontrado inverter cada bit subsequente Você concorda com Ben ou com a Alyssa ou com ambos ou com nenhum Explique Exercício 169 Escreva um programa na sua linguagem favorita por exemplo C Java Perl para converter números de binário para decimal O utilizador deve digitar um número binário sem sinal O programa deve imprimir o equivalente decimal Exercício 170 Repita o Exercício 169 mas que converta de uma base arbitrária b1 para outra base b2 conforme especificado pelo utilizador Aceite bases até 16 usando as letras do alfabeto para dígitos superiores a 9 O utilizador deve introduzir b1 b2 e seguido o número a converter na base b1 O programa deve imprimir o número equivalente na base b2 Exercício 171 Desenhe o símbolo a equação booleana e tabela verdade para a uma porta OR de três entradas b uma porta OR exclusivo XOR de três entradas portão c uma porta de quatro entradas XNOR Exercício 172 Desenhe o símbolo a equação booleana e tabela verdade para a uma porta OR de quatro entradas b uma porta XNOR de três entradas c uma porta NAND de cinco entradas Capítulo um Do Zero ao Um 63 Exercício 173 Uma porta de maioria produz uma saída TRUE se e somente se mais de metade de suas entradas são TRUE Produza uma tabela verdade para a porta maioria de três entradas mostrado na Figura 141 Figura 141 Porta maioria de três entradas Exercício 174 A porta ANDOR AO de três entradas mostrado na Figura 142 produz uma saída TRUE se ambas A e B são TRUE ou se C é TRUE Produza uma tabela verdade para esta porta Figura 142 Porta ANDOR de três entradas Exercício 175 A porta ORAND invertida de três entradas AOI mostrada na Figura 143 produz uma saída FALSE se C é verdadeiro e A ou B são TRUE Caso contrário produz uma saída TRUE Produza uma tabela verdade para esta porta Figura 143 Porta ANDORNOT de três entradas Capítulo um Do Zero ao Um 64 Exercício 176 Existem 16 tabelas verdade diferentes para funções booleanas de duas variáveis Liste cada uma destas tabelas verdade Dê a cada uma um nome descritivo tal como OR NAND e assim por diante Exercício 177 Quantas tabelas verdade diferentes existem para funções booleanas de N variáveis Exercício 178 É possível atribuir níveis lógicos de modo que um dispositivo com as características de transferência apresentada na Figura 144 opere como um conversor Se sim quais são os níveis HIGH e LOW de entrada e saída VIL VOL VIH e VOH e as margens de ruído NML e NMH Se não explique porque não Figura 144 Função de transferência DC Capítulo um Do Zero ao Um 65 Exercício 179 Repita o Exercício 178 para as características de transferência mostradas na Figura 145 Figura 145 Função de transferência DC Exercício 180 É possível atribuir níveis lógicos de modo que um dispositivo com as características de transferência apresentada na Figura 146 opere como um buffer Se sim quais são os níveis HIGH e LOW de entrada e saída VIL VOL VIH e VOH e as margens de ruído NML e NMH Se não explique porque não Capítulo um Do Zero ao Um 66 Figura 146 Função de transferência DC Exercício 181 Ben Bitdiddle inventou um circuito com as características de transferência mostrados na Figura 147 que ele gostaria de usar como buffer Será que vai funcionar Porque sim ou porque não Ele gostaria de o anunciar como sendo compatível com lógica LVCMOS e LVTTL Pode o buffer do Bem receber corretamente as entradas a partir dessas famílias lógicas A saída pode fazer o drive correto essas famílias lógicas Explique Figura 147 Função de transferência DC Capítulo um Do Zero ao Um 67 Exercício 182 Enquanto caminhava por um beco escuro Ben Bitdiddle encontrou uma porta de duas entradas cuja função de transferência é mostrada na Figura 148 As entradas são A e B e a saída é Y Figura 148 Função de transferência DC a que tipo de porta lógica ele encontrou b quais são os níveis lógicos aproximados de HIGH e LOW Capítulo um Do Zero ao Um 68 Exercício 183 Repita o Exercício 182 para a Figura 149 Figura 149 Função de transferência DC Exercício 183 Esboce um circuito a nível do transístor para as seguintes portas CMOS Use um número mínimo de transístores a porta NAND de quatro entradas b porta ORANDNOT de três entradas ver Exercício 175 c porta NANDOR de três entradas ver Exercício 174 Exercício 184 Esboce um circuito a nível do transístor para as seguintes portas CMOS Use um número mínimo de transístores a porta NOR de três b porta AND de três entradas c porta OR de duas entradas Capítulo um Do Zero ao Um 69 Exercício 185 Uma porta minoritária produz uma saída TRUE se e somente se menos da metade de suas entradas são TRUE Caso contrário produz uma saída FALSE Esboce um circuito a nível de transístor para uma porta CMOS minoritária de três entradas Use um número mínimo de transístores Exercício 186 Escreva uma tabela verdade para a função desempenhada pela porta da Figura 150 A tabela verdade deve ter duas entradas A e B Qual é o nome desta função Figura 150 Esquema mistério Exercício 187 Escreva uma tabela verdade para a função desempenhada pela porta da Figura 151 A tabela verdade deve ter três entradas A B e C Figura 151 Esquema mistério Capítulo um Do Zero ao Um 70 Exercício 188 Implemente as seguintes portas lógicas de três entradas usando apenas portas lógicas pseudonMOS Estas portas recebem três entradas A B e C Utilize um número mínimo de transístores A porta NOR de três entradas B porta NAND de três entradas C porta AND de três entradas Exercício 189 A lógica ResistorTransístor RTL usa transístores nMOS para puxar a saída da porta a LOW e uma resistência fraca para puxar a saída a HIGH quando nenhum dos caminhos para a terra está cativo A porta NOT construída utilizando um RTL é mostrado na Figura 152 Esboce uma porta NOR RTL de três entradas Use um número mínimo de transístores Figura 152 Porta RTL NOT Capítulo um Do Zero ao Um 71 Questões de Entrevista Estas perguntas foram feitas em entrevistas para trabalhos de projeto digital Pergunta 11 Desenhe um circuito a nível do transístor para uma porta NOR CMOS de quatro entradas Pergunta 12 O rei recebe 64 moedas de ouro em impostos mas tem razões para acreditar que uma é falsa Ele convocao para identificar a moeda falsa O leitor tem uma balança que pode conter moedas de cada lado Quantas vezes o leitor precisa usar a balança para encontrar a moeda falsa mais leve Pergunta 13 O professor o assistente o aluno de projeto digital e o calouro precisam atravessar uma ponte frágil numa noite escura A ponte é tão instável que apenas duas pessoas podem atravessar de uma vez Eles têm apenas uma lanterna entre eles e a extensão é muito longa para lançar a lanterna então alguém deve leválo de volta para as outras pessoas O caloiro pode atravessar a ponte em 1 minuto O estudante de projeto digital pode atravessar a ponte em 2 minutos O assistente pode atravessar a ponte em 5 minutos O professor que sempre se distrai e leva 10 minutos para atravessar a ponte Qual é o tempo mais rápido para fazer chegar todos ao outro lado da ponte Capítulo um Do Zero ao Um 72 Capítulo dois Projeto de Lógica Combinatória 73 2 Projeto de Lógica Combinatória 21 INTRODUÇÃO Na eletrônica digital um circuito é uma rede que processa variáveis de valores discretos Um circuito pode ser visto como uma caixa preta mostrada na Figura 21 com Um ou mais terminais de entrada de valor discreto Um ou mais terminais de saída de valor discreto Uma especificação funcional descrevendo a relação entre as entradas e saídas Uma especificação temporal descrevendo o atraso entre as mudanças nas entradas e as respostas nas saídas Olhando dentro da caixa preta os circuitos são compostos de nós e elementos Um elemento é por si só um circuito com entradas saídas e uma especificação Um nó é um fio cuja tensão transmite um valor variável discreto Os nós são classificados como entrada saída ou interno As entradas recebem valores vindos do mundo externo As saídas entregam os valores para o mundo externo Os fios que não são nem entradas nem saídas são chamados de nós internos Figura 21 Circuito representado como uma caixa preta com entradas saídas e especificações Capítulo dois Projeto de Lógica Combinatória 74 Figura 22 Elementos e nós A Figura 22 ilustra um circuito com três elementos E1 E2 e E3 e seis nós Os nós A B e C são entradas Y e Z são saídas n1 é um nó interno entre E1 e E3 Os circuitos digitais são classificados como combinatórios ou sequenciais A saída de um circuito combinatório depende apenas do valor atual das entradas por outras palavras ele combina os valores atuais das entradas para determinar o valor da saída Por exemplo uma porta lógica é um circuito combinatório A saída de um circuito sequencial depende tanto dos valores atuais de entrada quanto dos anteriores por outras palavras ele depende da sequência de entrada Um circuito combinatório não possui memória mas um circuito sequencial tem memória Este Capítulo foca os circuitos combinatórios e o Capítulo 3 examina os circuitos sequenciais A especificação funcional de um circuito combinatório expressa os valores de saída em termos dos valores atuais das entradas A especificação temporal de um circuito combinatório consiste nos limites inferiores e superiores do atraso da entrada para a saída Iremos inicialmente nos concentrar nas especificações funcionais e então retornar para as especificações temporais mais tarde neste Capítulo A Figura 23 mostra um circuito combinatório com duas entradas e uma saída À esquerda da figura estão as entradas A e B e à direita está a saída Y O símbolo dentro da caixa indica que o circuito é implementado utilizando apenas lógica combinatório Nesse exemplo a função F é especificada como Capítulo dois Projeto de Lógica Combinatória 75 OR Y FAB A B Literalmente podemos dizer que a saída Y é uma função de duas entradas A e B nomeada Y A OR B A Figura 24 mostra duas possíveis implementações para o circuito lógico combinatório da Figura 23 Como veremos repetidamente ao longo deste livro existem muitas implementações possíveis para uma única função O leitor é quem escolhe qual utilizar dados os blocos digitais à sua disposição e as suas limitações de projeto Essas limitações incluem frequentemente área velocidade potência e tempo de projeto A Figura 25 mostra um circuito combinatório com múltiplas saídas Este circuito combinatório particular é chamado de full adder e iremos vêlo novamente na Seção 521 As duas equações especificam a função das saídas S e Cout em termos das entradas A B e Cin A fim de simplificar as ilustrações muitas vezes utilizamos uma linha única cortada por uma barra para indicar um barramento um pacote de vários sinais O número especifica quantos sinais existem no barramento Por exemplo a Figura 26 a representa um bloco de lógica combinatória com três entradas e duas saídas Se o número de bits não tiver importância ou for óbvio a barra pode ser mostrada sem o número A Figura 26 b indica dois blocos de lógica combinatória com um número arbitrário de saídas de um bloco servindo como entrada para o segundo bloco As regras da associação combinatória dizemnos como podemos construir um grande circuito combinatório a partir de elementos combinatórios menores Um circuito é dito combinatório se ele for constituído por elementos de circuitos interconectados de tal modo que Todos os elementos do circuito são combinatórios Todos os nós do circuito são também designados como uma entrada ou conectados a exatamente um terminal de saída de um elemento do circuito O circuito não contém caminhos cíclicos todos os caminhos através do circuito visitam cada nó do circuito no máximo uma vez Figura 23 Bloco de circuito combinatório Figura 24 Duas implementações OR Figura 25 Circuito combinatório de múltiplas saídas Capítulo dois Projeto de Lógica Combinatória 76 Exemplo 21 CIRCUITOS COMBINATÓRIOS Quais dos circuitos na Figura 27 são circuitos combinatórios de acordo com as regras da composição combinatório Solução O circuito a é combinatório Sendo construído a partir de dois elementos de circuitos combinatórios inversores I1 e I2 Tem três nós n1 n2 e n3 n1 é a entrada para o circuito e para I1 n2 é um nó interno saída de I1 e entrada de I2 n3 é a saída do circuito e de I2 b não é um circuito combinatório pois existe um caminho cíclico a saída da função XOR realimenta uma das entradas Consequentemente um caminho cíclico partindo de n4 passa através da porta XOR em direção a n5 que retorna a n4 c é combinatório d não é combinatório pois o nó n6 está conectado aos terminais de saída tanto de I3 quanto de I4 e é combinatório ilustrando dois circuitos combinatórios conectados formando um circuito combinatório maior f não obedece às regras da associação combinatória pois existe um caminho cíclico através dos dois elementos Dependendo das funções dos elementos ele pode ser ou não um circuito combinatório Figura 27 Circuitos de exemplo Figura 26 Notação de barra para múltiplos sinais Capítulo dois Projeto de Lógica Combinatória 77 Grandes circuitos como microprocessadores podem ser muito complicados então utilizamos os princípios do Capítulo 1 para gerir a complexidade Visualizando o circuito como uma caixa preta com uma função e interface bem definida é uma aplicação de abstração e modularidade Construindo o circuito principal através de circuitos menores é uma aplicação de hierarquia As regras de composição combinatória são aplicações de disciplina A especificação funcional de um circuito combinatório é usualmente expressa através de uma tabela verdade ou equação Booleana Nas próximas seções nós descreveremos como derivar uma equação Booleana a partir de qualquer tabela verdade e como utilizar a álgebra Booleana e os mapas de Karnaugh para simplificar equações Mostraremos como implementar estas equações utilizando portas lógicas e como analisar a velocidade destes circuitos 22 EQUAÇÕES BOOLEANAS Equações Booleanas lidam com variáveis que são TRUE ou FALSE sendo portanto perfeitas para descrever a lógica digital Esta Seção define algumas terminologias comumente utilizadas em equações Booleanas e mostra como escrever uma equação Booleana para qualquer função lógica baseada na sua tabela verdade 221 Terminologia O complemento de uma variável A é seu inverso 𝐴 A variável ou o seu complemento são chamados literais Por exemplo 𝐴 𝐴 𝐵 𝐵 são literais Chamamos A de forma verdadeira da variável e A de forma complementar forma verdadeira não significa que A tem valor TRUE mas meramente que A não possui uma barra sobre ele A função lógica AND de uma ou mais variáveis literais é chamada de produto 𝐴𝐵 𝐴𝐵𝐶 e 𝐵 são todos produtos de uma função de três variáveis Um mintermo é um produto envolvendo todas as entradas da função 𝐴𝐵𝐶 é um mintermo para uma função de três variáveis A B e C mas 𝐴𝐵 não é pois não envolve C Similarmente a união OR de uma ou mais variáveis literais é chamada de soma Um maxtermo é a Capítulo dois Projeto de Lógica Combinatória 78 soma envolvendo todas as entradas da função 𝐴 𝐵 𝐶 é um maxtermo para uma função de três variáveis A B e C A ordem de operação é importante na interpretação de equações Booleanas Y A BC significa Y A OR BAND C ou Y A OR B AND C Nas equações Booleanas a função NOT tem a máxima precedência seguida pela função AND e depois OR Da mesma forma que nas equações comuns os produtos são realizados antes das somas Portanto a equação é lida como Y A OR B AND C A equação 21 mostra outro exemplo da ordem de operações 𝐴𝐵 𝐵𝐶𝐷 𝐴𝐵 𝐵𝐶𝐷 21 222 Forma de Soma de Produtos Uma tabela verdade com N entradas contém 2𝑁 linhas uma para cada possível valor da entrada Cada linha na tabela verdade é associada a um mintermo que mostra o sinal lógico TRUE para aquela linha A Figura 28 mostra uma tabela verdade com duas entradas A e B Cada linha mostra o seu mintermo correspondente Por exemplo o mintermo para a primeira linha é 𝐴𝐵 pois 𝐴𝐵 é TRUE quando A 0 e B 0 Os mintermos são numerados partindo de 0 a linha de cima corresponde ao mintermo 0 𝑚0 a próxima linha corresponde ao mintermo 1 𝑚1 e assim por diante Podemos escrever uma equação Booleana para qualquer tabela verdade somando cada um dos mintermos para o qual a saída Y possui nível lógico TRUE Por exemplo na Figura 28 existe apenas uma linha ou mintermo para o qual a saída Y é verdadeira circulado em azul Portanto 𝑌 𝐴𝐵 A Figura 29 mostra uma tabela verdade com mais de uma linha para as quais a saída é TRUE A soma de cada mintermo circulado resulta em 𝑌 𝐴𝐵 𝐴𝐵 Esta é denominada a forma canônica soma de produtos de uma função pois a saída é igual à soma OR dos produtos AND formando mintermos Apesar de existirem muitas maneiras de se escrever a mesma função tal como 𝑌 𝐵𝐴 𝐵𝐴 iremos classificar os mintermos na mesma ordem pela qual aparecem na tabela verdade de tal modo que sempre escreveremos a mesma expressão Booleana para uma mesma tabela verdade Figura 28 Tabela verdade e mintermos Figura 29 Tabela verdade com vários mintermos TRUE Capítulo dois Projeto de Lógica Combinatória 79 A forma de soma de produtos canônicos pode também ser escrita na notação sigma utilizandose o símbolo de somatórios Σ Com essa notação a função da Figura 29 pode ser reescrita como 𝐹𝐴 𝐵 Σ𝑚1 𝑚3 ou 22 𝐹𝐴 𝐵 Σ13 Exemplo 22 FORMA DE SOMA DE PRODUTOS Ben Bitdiddle está fazendo um piquenique Ele não irá aproveitar se chover ou se houver formigas Projete um circuito que irá ter saída TRUE apenas se Ben aproveitar o piquenique Solução Primeiro defina as entradas e as saídas As entradas são A e R que indicam se existem formigas e se está chovendo respectivamente A será TRUE se houver formigas e FALSE se não houver Da mesma forma R é TRUE se chover e FALSE se o sol sorrir sobre Ben A saída E é o aproveitamento do piquenique por Ben E é TRUE se Ben aproveitar o piquenique e FALSE se ele não aproveitar A Figura 210 mostra a tabela verdade para a experiência de Ben no piquenique Utilizando a forma de soma de produtos canônicos escrevemos a equação como 𝐸 𝐴𝑅 ou 𝐸 Σ0 Podemos construir a equação utilizando dois inversores e a porta AND de duas entradas mostrada na Figura 211 a O leitor pode reparar que essa tabela verdade é a da função NOR mostrada na Seção 155 𝐸 𝐴 NOR 𝑅 𝐴 𝑅 A Figura 211 b mostra a implementação da função NOR Na Seção 23 mostraremos que essas duas equações 𝐴𝑅 e 𝐴 𝑅 são equivalentes Forma Canônica é apenas uma palavra chique para denominar forma padrão O leitor pode utilizar esse termo para impressionar seus amigos e para amedrontar seus inimigos Figura 210 Tabela verdade de Ben Capítulo dois Projeto de Lógica Combinatória 80 A forma de soma de produtos dá uma equação Booleana para qualquer tabela verdade com qualquer número de variáveis A Figura 212 mostra uma tabela verdade com três entradas de valores aleatórios A forma de soma de produtos dessa função lógica é 𝑌 𝐴𝐵𝐶 𝐴𝐵𝐶 𝐴𝐵𝐶 ou 23 𝑌 Σ045 Infelizmente a forma de soma de produtos não gera necessariamente uma equação simples Na Seção 23 mostraremos como escrever a mesma função utilizandose termos menores 223 Forma de Produto de Somas Um modo alternativo de expressar funções Booleanas é a forma canônica de produto de somas Cada linha da tabela verdade corresponde ao maxtermo que é FALSE para aquela linha Por exemplo o maxtermo da primeira linha de uma tabela verdade de duas entradas é AB pois AB é FALSE quando A0 B0 Podemos escrever uma equação Booleana para qualquer circuito diretamente da sua tabela verdade como uma função AND de cada um dos maxtermos para o qual a saída é FALSE A forma canônica do produto de somas pode também ser escrita na notação pi utilizandose o símbolo matemático para produto Π Exemplo 23 FORMA DE PRODUTO DE SOMAS Escreva uma equação na forma de produto de somas para a tabela verdade na Figura 213 Solução A tabela verdade possui duas linhas nas quais a saída é FALSE Portanto a função pode ser escrita na forma de produto de somas como 𝑌 𝐴 𝐵 𝐴 𝐵 ou utilizando a notação pi 𝑌 Π𝑀0 𝑀2 ou ainda 𝑌 Π02 O primeiro maxtermo 𝐴 𝐵 garante que Y 0 para A 0 B 0 pois qualquer valor AND 0 é igual a 0 Da mesma forma o segundo maxtermo 𝐴 𝐵 garante que Y 0 para A 1 B 0 A Figura 213 é a mesma tabela verdade da Figura 29 mostrando que a mesma função pode ser escrita em mais do que uma forma Figura 211 Circuito de Ben Figura 212 Tabela verdade aleatória de três entradas Capítulo dois Projeto de Lógica Combinatória 81 De forma similar a equação Booleana para o piquenique do Ben Figura 210 pode ser escrita na forma de produto de somas apenas circulandose as três linhas com 0s obtendose 𝐸 𝐴 𝑅𝐴 𝑅 𝐴 𝑅 ou 𝐸 Π123 Essa forma é mais feia do que a equação na forma de soma de produtos 𝐸 𝐴𝑅 mas as duas equações são logicamente equivalentes A soma de produtos produz uma equação mais curta quando a saída é TRUE em apenas algumas linhas de uma tabela verdade o produto das somas é mais simples quando a saída é FALSE em apenas algumas linhas de uma tabela verdade 23 ÁLGEBRA BOOLEANA Na Seção anterior aprendemos como escrever uma expressão Booleana a partir de uma tabela verdade No entanto esta expressão não necessariamente leva ao conjunto mais simples de portas lógicas Do mesmo modo que o leitor pode utilizar a álgebra para simplificar equações matemáticas também pode utilizar a álgebra Booleana para simplificar equações Booleanas As regras da álgebra Booleana são muito parecidas com as da álgebra comum em alguns casos até mais simples pois as variáveis possuem apenas dois valores possíveis 0 ou 1 A álgebra Booleana é baseada num conjunto de axiomas que assumiremos estarem corretos Axiomas não são provados no mesmo sentido em que uma definição não pode ser provada Com base nesses axiomas provamos todos os teoremas da álgebra Booleana Figura 213 Tabela verdade com vários maxtermos FALSE Capítulo dois Projeto de Lógica Combinatória 82 Tabela 21 Axiomas da álgebra Booleana Estes teoremas têm grande significância no sentido prático pois eles nos ensinam a como simplificar a lógica para produzir circuitos menores e mais baratos Os axiomas e teoremas da álgebra Booleana obedecem ao sentido da dualidade Se os símbolos 0 e 1 e os operadores AND e OR são interrelacionados a declaração ainda será correta Utilizamos o símbolo para denotar o dual de uma declaração 231 Axiomas A Tabela 21 mostra os axiomas da álgebra Booleana Estes cinco axiomas e seus duais definem as variáveis Booleanas e os significados de NOT AND e OR O axioma A1 declara que uma variável Booleana é 0 se ela não for 1 O axioma dual A1 declara que a variável é 1 se ela não for 0 Juntos A1 e A1 dizem que estamos a trabalhar num campo binário ou Booleano de zeros e uns Os axiomas A2 e A2 definem a operação NOT Os axiomas A3 até A5 definem AND seus duais A3 a A5 definem OR Figura 214 Teorema da Identidade em hardware a T1 b T1 Figura 215 Teorema do elemento nulo em hardware a T2 b T2 Capítulo dois Projeto de Lógica Combinatória 83 Tabela 22 Teoremas Booleanos de uma variável 232 Teoremas de uma Variável Os teoremas T1 a T5 na Tabela 22 descrevem como simplificar equações envolvendo uma variável O teorema da identidade T1 declara que para qualquer variável Booleana B B AND 1 B O seu dual declara que B OR 0 B Em hardware como mostrado na Figura 214 T1 significa que se uma das duas entradas de uma porta AND é sempre 1 podemos remover a porta AND e substituíla por um fio conectado a variável B Da mesma forma T1 significa que se uma das duas entradas de uma porta OR é sempre 0 podemos substituir a porta OR por um fio conectado à B Em geral portas lógicas custam dinheiro potência e atraso então substituir uma porta por um fio tem os seus benefícios O teorema do elemento nulo T2 diz que B AND 0 é sempre igual a 0 Portanto 0 é chamado de elemento nulo para a operação AND pois ele sempre anula o efeito de qualquer outra entrada Seu dual declara que B OR 1 é sempre igual a 1 Portanto 1 é o elemento nulo para a operação OR Em hardware como mostrado na Figura 215 se uma entrada de uma porta AND é 0 podemos substituir a porta AND por um fio com nível logico LOW 0 Da mesma forma se uma das entradas de um OR for 1 podemos substituir a porta OR por um fio conectado ao nível lógico HIGH 1 A idempotência T3 diz que uma variável AND ela própria é igual a ela Da mesma forma uma variável OR ela própria é igual a ela mesma O teorema recebe este nome a partir do latim idem igual e potent potência A operação retorna a mesma coisa que recebe A Figura 216 mostra que este teorema novamente permite a substituição de uma porta por um fio Figura 216 Teorema da Idempotência em hardware a T3 b T3 Figura 217 Teorema da involução T4 Figura 218 Teorema do complemento em hardware a T5 b T5 Capítulo dois Projeto de Lógica Combinatória 84 A involução T4 é um modo rebuscado de dizer que complementar uma variável duas vezes resulta na variável original Na eletrônica digital dois errados resultam num certo Duas portas inversoras em série logicamente cancelam uma à outra e são logicamente equivalentes a um fio como mostrado na Figura 217 O dual de T4 é ele próprio O teorema do complemento T5 Figura 218 declara que uma variável AND e o seu complemento é 0 pois uma delas precisa ser 0 Por dualidade uma variável OR e o seu complemento é 1 porque uma delas precisa ser 1 233 Teoremas com muitas Variáveis Os teoremas do T6 ao T12 na Tabela 23 descrevem como simplificar equações envolvendo mais do que uma variável Booleana A comutatividade e associatividade T6 e T7 trabalham do mesmo modo que na álgebra tradicional Por comutatividade a ordem de entrada para uma função AND ou OR não afeta o valor da saída Por associatividade os agrupamentos específicos das entradas não afetam os valores da saída O teorema da distributividade T8 é o mesmo da álgebra tradicional mas o seu dual T8 não é Através de T8 AND se distribui por cima de OR e por T8 OR se distribui por cima de AND Na álgebra tradicional a multiplicação se distribui antes da adição mas a adição não se distribui por cima da multiplicação de modo que B C B D B C D Os teoremas T9 a T11 nos permitem eliminar variáveis redundantes Pensando um pouco o leitor será capaz de se convencer que estes teoremas estão corretos O Teorema de De Morgan T12 é uma ferramenta particularmente poderosa no projeto de sistemas digitais O teorema mostra que o complemento do produto de todos os termos é igual ao produto do O teorema do elemento nulo leva a expressões estranhas que são verdade Isso é particularmente perigoso quando utilizado por pessoas que enviam anúncios O LEITOR GANHARÁ UM MILHÃO DE DÓLARES ou nós lhe enviaremos uma escova de dentes pelo correio O leitor provavelmente receberá uma escova de dentes Capítulo dois Projeto de Lógica Combinatória 85 complemento de cada termo Da mesma forma o complemento da soma de todos os termos é igual ao produto dos complementos de cada termo Tabela 23 Teoremas Booleanos para muitas variáveis De acordo com o teorema de De Morgan uma porta NAND é equivalente a uma porta OR com suas entradas invertidas Similarmente uma porta NOR é equivalente a uma porta AND com suas entradas invertidas A Figura 219 mostra as portas equivalentes de De Morgan para portas NAND e NOR Os dois símbolos mostrados para cada função são chamados duais Eles são logicamente equivalentes e podem ser utilizados de modo intercambiável O círculo símbolo da inversão é chamado bolha ou bola Intuitivamente o leitor pode imaginar que empurrando a bolha através da porta lógica faz com que ela saia pelo outro lado e mude o formato da porta lógica de AND para OR ou viceversa Por exemplo a porta NAND na Figura 219 consiste num corpo de porta AND com uma bolha na saída Empurrar a bolha para a esquerda resulta num corpo de porta OR com bolhas nas entradas As regras fundamentais para esses empurrões de bolha são Augustus De Morgan morte 1871 Matemático Britânico nascido na Índia Cego de um olho Seu pai morreu quando ele tinha 10 anos Entrou no Trinity College Cambridge com 16 anos e foi contratado como professor de matemática da recentemente fundada London University com 22 anos Escreveu largamente sobre muitos assuntos matemáticos incluindo lógica álgebra e paradoxos A cratera lunar de De Morgan tem esse nome em homenagem a ele Ele propôs um enigma para o ano de seu nascimento Eu tinha x anos no ano x² Capítulo dois Projeto de Lógica Combinatória 86 Figura 219 Portas equivalentes de De Morgan Empurrando bolhas para trás partindo da saída ou para frente partindo da entrada muda o corpo da porta logica de AND para OR ou viceversa Empurrar uma bolha da saída de volta para as entradas coloca as bolhas em todos os terminais de entrada Empurrar bolhas em todos os terminais de entrada em direção a saída coloca uma bolha no terminal de saída A Seção 252 utiliza os empurrões de bolha no auxílio da análise de circuitos Exemplo 24 DERIVANDO A FORMA DE PRODUTO DE SOMAS A Figura 220 mostra a tabela verdade para uma função Booleana 𝑌 e seu complemento 𝑌 Usando o Teorema de De Morgan derive a forma canônica de produto de somas de 𝑌 para a forma de soma de produtos de 𝑌 Solução a Figura 221 mostra os mintermos circulados contidos em 𝑌 A forma canônica de soma de produtos de 𝑌 é Figura 220 Tabela verdade mostrando 𝒀 e 𝒀 Figura 221 Tabela verdade mostrando os mintermos para 𝒀 Capítulo dois Projeto de Lógica Combinatória 87 𝑌 𝐴𝐵 𝐴𝐵 24 Tomando o complemento de ambos os lados da equação e aplicandose o Teorema de De Morgan duas vezes obtemos 𝑌 𝑌 𝐴𝐵 𝐴𝐵 𝐴𝐵 𝐴𝐵 𝐴 𝐵𝐴 𝐵 25 234 A Verdade por Detrás de Tudo Um leitor curioso provavelmente se perguntaria como provar que este teorema é verdade Na álgebra Booleana a prova de teoremas com um número finito de variáveis é fácil apenas mostre que o teorema é válido para todos os valores possíveis para essas variáveis Este método é chamado indução perfeita e pode ser realizado com uma tabela verdade Exemplo 25 PROVANDO O TEOREMA UTILIZANDO A INDUÇÃO PERFEITA Prove o teorema T11 da Tabela 23 Solução Verifique ambos os lados da equação para todas as oito combinações de B C e D A tabela verdade na Figura 222 ilustra essas combinações Como 𝐵𝐶 𝐵𝐶 𝐶𝐷 𝐵𝐷 para todos os casos o teorema é provado Figura 222 Prova da tabela verdade T11 Capítulo dois Projeto de Lógica Combinatória 88 235 Simplificando Equações Os teoremas da álgebra Booleana nos ajudam a simplificar equações Booleanas Por exemplo considere a expressão na forma de soma de produtos a partir da tabela da Figura 29 𝑌 𝐴𝐵 𝐴𝐵 Pelo teorema T10 essa equação é simplificada para 𝑌 𝐵 Isto pode parecer óbvio quando se observa a tabela verdade Em geral múltiplos passos podem ser necessários para simplificar equações mais complexas O princípio básico da simplificação de equações na forma de soma de produtos é combinar os termos utilizandose a relação 𝑃𝐴 𝑃𝐴 𝑃 onde P pode ser qualquer implicante Até quando uma equação pode ser simplificada Definimos que uma equação na forma de soma de produtos deve ser minimizada se forem utilizados o mínimo possível de implicantes Se existem muitas equações com o mesmo número de implicantes o implicante mínimo será aquele com o menor número de literais Um implicante é chamado de implicante primo se ele não pode ser combinado com nenhum outro implicante na equação a fim de formar um novo implicante com um número menor de literais Os implicantes numa equação mínima devem ser todos implicantes primos Por outro lado eles podem ser combinados para reduzir o número de literais Exemplo 26 MINIMIZAÇÃO DE EQUAÇÕES Minimize a equação 23 𝐴𝐵𝐶 𝐴𝐵𝐶 𝐴𝐵𝐶 Solução Começamos com a equação original e então aplicamos os teoremas Booleanos passoapasso como mostrado na Tabela 24 Simplificamos completamente a equação até este ponto Vamos olhar mais de perto Da equação original os mintermos 𝐴𝐵𝐶 e 𝐴𝐵𝐶 diferem em apenas uma variável A Então combinamos os mintermos para formar 𝐵𝐶 No entanto se olharmos para a equação original notaremos que os últimos dois mintermos 𝐴𝐵𝐶 e 𝐴𝐵𝐶 também diferem em apenas um literal 𝐶 e 𝐶 Assim usando o mesmo método podemos combinar esses dois mintermos para formar o mintermo 𝐴𝐵 Dizemos que os implicantes 𝐵𝐶 e 𝐴𝐵 compartilham o mintermo 𝐴𝐵𝐶 Capítulo dois Projeto de Lógica Combinatória 89 Então estamos bloqueados e apenas podemos simplificar apenas um dos pares de mintermos ou podemos simplificar os dois Utilizando o teorema da idempotência podemos duplicar os termos quantas vezes quisermos 𝐵 𝐵 𝐵 𝐵 𝐵 Utilizando este princípio simplificamos a equação completamente para os seus dois implicantes primos 𝐵𝐶 e 𝐴𝐵 como mostrado na Tabela 25 Tabela 24 Minimização de equações Tabela 25 Minimização melhorada de equações Capítulo dois Projeto de Lógica Combinatória 90 Apesar de ser um pouco contra intuitivo expandir um implicante por exemplo transformando 𝐴𝐵 em 𝐴𝐵𝐶 𝐴𝐵𝐶 pode ser útil na minimização de equações Fazendo isso o leitor pode repetir um dos mintermos expandidos para ser combinado com outro mintermo O leitor pode ter notado que simplificar totalmente uma equação Booleana com os teoremas da álgebra Booleana pode levar a certa tentativa e erro A Seção 27 descreve um procedimento metódico chamado mapa de Karnaugh que torna o processo mais simples Porque simplificar uma equação Booleana se ela continua logicamente equivalente A simplificação reduz o número de portas lógicas usadas para implementar fisicamente a função deixandoa menor mais barata e possivelmente mais rápida A próxima Seção descreve como implementar equações Booleanas utilizando portas lógicas 24 DA LÓGICA ÀS PORTAS Um esquemático é um diagrama de um circuito digital que mostra os elementos e as suas conexões Por exemplo o esquemático na Figura 223 mostra uma possível implementação de hardware para a nossa função lógica favorita a equação 23 𝑌 𝐴𝐵𝐶 𝐴𝐵𝐶 𝐴𝐵𝐶 Através do esboço de esquemáticos num estilo consistente podemos deixamolos mais fáceis de ler e de encontrar defeitos Geralmente obedecemos às seguintes orientações Entradas do lado esquerdo ou acima do esquemático Saídas do lado direito ou abaixo do esquemático Quando possível o sentido de orientação das portas deve ser da esquerda para a direita Utilizar fios retos é melhor do que fios com várias esquinas fios irregulares fazem o leitor gastar muito esforço mental seguindo os fios ao invés de pensar sobre o que o circuito faz Fios sempre são conectados numa junção T Um ponto no cruzamento entre fios indica que eles estão conectados entre si Cruzamento de fios num ponto significa que eles não estão conectados Capítulo dois Projeto de Lógica Combinatória 91 Figura 223 Esquemático para 𝒀 𝑨𝑩𝑪 𝑨𝑩𝑪 𝑨𝑩𝑪 As últimas três orientações são mostradas na Figura 224 Qualquer equação Booleana na forma de soma de produtos pode ser desenhada como um diagrama esquemático de um modo sistemático semelhante à Figura 223 Primeiramente desenhe as colunas para as entradas Ponha inversores em colunas adjacentes para disponibilizar as entradas complementadas se necessário Desenhe as linhas e as portas AND para cada um dos mintermos Em seguida para cada saída desenhe uma porta OR conectada aos mintermos relacionados com aquela saída Esse estilo é chamado array lógico programável pois os inversores portas AND e OR são colocados num estilo sistemático Esse tipo de desenho é melhor discutido na Seção 56 A Figura 225 mostra uma implementação da equação simplificada que encontramos utilizando álgebra Booleana no exemplo 26 Note que o circuito simplificado possui significativamente menos hardware do que o circuito da Figura 223 Ele também é mais rápido pois utiliza portas com menos entradas Figura 224 Ligações de fios Capítulo dois Projeto de Lógica Combinatória 92 Podemos diminuir o número de entradas ainda mais ainda que de apenas um inversor tirando vantagem das portas inversoras Observe que 𝐵𝐶 é uma porta AND com entradas invertidas A Figura 226 mostra um esquemático utilizando essa otimização a fim de se eliminar o inversor em C Lembre se que pelo teorema de De Morgan a porta AND com entradas inversoras é equivalente a uma porta NOR Dependendo da tecnologia de implementação pode ser mais barato utilizar a menor quantidade possível de portas ou então dar preferência a certos tipos de portas em relação a outras Por exemplo NANDs e NORs são preferíveis ao invés de AND e OR na implementação tipo CMOS Muitos circuitos possuem múltiplas saídas cada uma delas computando uma função Booleana separada Podemos escrever uma tabela verdade separada para cada saída mas é conveniente escrever todas as saídas numa única tabela verdade e então desenhar um esquemático para todas elas Exemplo 27 CIRCUITOS DE MÚLTIPLAS SAÍDAS O reitor o chefe de departamento o professor assistente e o chefe do departamento de dormitórios utilizam o auditório de tempos em tempos Infelizmente eles ocasionalmente entram em conflito devido a alguns desastres como quando a reunião do reitor para recolha de fundos ocorreu ao mesmo tempo que a festa dos dormitórios Alyssa P Hacker foi chamada para projetar um sistema de reserva de sala O sistema possui quatro entradas 𝐴3 𝐴0 e quatro saídas 𝑌3 𝑌0 Estes sinais também podem ser escritos como 𝐴30 e 𝑌30 Cada usuário confirma a sua entrada solicitando o auditório para o dia seguinte O sistema confirma no máximo uma saída garantindo o auditório para o usuário de maior prioridade O reitor que está pagando por esse sistema demanda maior prioridade 3 O chefe de departamento professor assistente e chefe do departamento de dormitórios possuem prioridade decrescente Escreva uma tabela verdade e as equações Booleanas para este sistema Desenhe o circuito que desenvolva a função Figura 225 Esquemático para 𝒀 𝑩𝑪 𝑨𝑩 Figura 226 Esquemático usando menos portas lógicas Capítulo dois Projeto de Lógica Combinatória 93 Solução Esta função é chamada de circuito de prioridade de quatro entradas Seu símbolo e sua tabela verdade são mostrados na Figura 227 Poderíamos escrever cada saída na forma de soma de produtos e então reduzir as equações utilizando álgebra Booleana No entanto as equações simplificadas são claramente compreensíveis através da inspeção da descrição funcional e tabela verdade do sistema 𝑌3 é TRUE sempre que 𝐴3 for acionada então 𝑌3 𝐴3 𝑌2 é TRUE se 𝐴2 foi acionado e 𝐴3 não foi acionado então 𝑌2 𝐴3 𝐴2 𝑌1é TRUE se nenhuma das entradas de maior prioridade for acionada 𝑌1 𝐴3 𝐴2 𝐴1 E 𝑌0 é TRUE sempre que 𝐴0 for acionada apenas Portanto 𝑌0 𝐴3 𝐴2 𝐴1𝐴0 O esquemático é mostrado na Figura 228 Um projetista experiente poderia implementar a lógica desse circuito por inspeção Dada uma especificação clara simplesmente transformaria as palavras em equações e as equações em portas lógicas Note que se 𝐴3 é acionado no circuito de prioridade as saídas são aquelas não interessando as entradas dont care Nós utilizamos o símbolo X para descrever entradas que não interferem nos valores das saídas A Figura 229 mostra que a tabela verdade do circuito de prioridade de quatro entradas se torna muito menor considerandose os dont cares A partir dessa tabela verdade nós podemos facilmente ler as equações Boolenas na forma de soma de produtos apenas ignorando as entradas com X Dont cares podem também aparecer nas saídas das tabelas verdades como veremos na Seção 273 25 LÓGICA COMBINATÓRIO MULTINÍVEL A lógica na forma de soma de produtos é chamada lógica de dois níveis pois consiste em literais conectados a um nível de portas AND conectados por sua vez a um nível de portas OR Os projetistas muitas vezes constroem circuitos com mais do que dois níveis de portas lógicas Estes circuitos combinatórios multiníveis podem utilizar menos hardware do que seus equivalentes em dois níveis O método dos empurrões de bolha é especialmente útil na análise e projeto de circuitos multinível Figura 227 Circuito de prioridade de prioridade Capítulo dois Projeto de Lógica Combinatória 94 251 Redução de Hardware Algumas funções lógicas necessitam de uma enorme quantidade de hardware quando construídas utilizandose a lógica de dois níveis Um exemplo notável é a função XOR de múltiplas variáveis Por exemplo considere o projeto de uma porta XOR de três entradas utilizando as técnicas de dois níveis que estudámos até agora Lembrese que uma XOR de N entradas produz uma saída de valor TRUE quando um número par de entradas é TRUE A Figura 230 mostra a tabela verdade para uma função XOR de três entradas com as linhas circuladas que produz Figura 230 em saídas TRUE A partir da tabela verdade obtemos a equação Booleana na forma de soma de produtos mostrada na equação 26 Infelizmente não é possível simplificar essa equação para um número menor de implicantes 𝑌 𝐴𝐵𝐶 𝐴𝐵𝐶 𝐴𝐵𝐶 𝐴𝐵𝐶 26 Por outro lado 𝐴 𝐵 𝐶 𝐴 𝐵 𝐶 prove o leitor por indução perfeita caso tenha dúvidas Portanto uma XOR de três entradas pode ser construída a partir de portas XOR de duas entradas em cascata como mostrado na Figura 231 Figura 230 XOR de três entradas a especificação funcional b implementação lógica de dois níveis Figura 228 Esquemático do circuito Figura 229 Tabela verdade do circuito de prioridade com dont care X X é um símbolo com mais do que um significado que significa não importa ou dont care em tabelas verdade e contenção em simulação lógica veja Seção 261 Pense um pouco para não confundir os significados Alguns autores utilizam D ou ao invés de dont care para evitar ambiguidades Capítulo dois Projeto de Lógica Combinatória 95 De modo similar uma XOR de oito entradas necessitaria de 128 portas AND de oito entradas e uma porta OR de 128 entradas para uma implementação de soma de produtos em dois níveis Uma opção melhor é a utilização de uma árvore de portas XOR de duas entradas como mostrado na Figura 232 Selecionar a melhor implementação multinível para uma função lógica específica não é um processo simples Mais ainda melhor possui vários significados menor quantidade de portas mais rápido menor tempo de projeto menor custo menor consumo de potência No Capítulo 5 o leitor verá que o melhor circuito num tipo de tecnologia não é necessariamente o melhor noutro tipo Por exemplo temos utilizado portas AND e OR mas na tecnologia CMOS NAND e NOR são mais eficientes Com alguma experiência o leitor irá descobrir que pode criar um bom projeto multinível através da inspeção de vários circuitos O leitor irá desenvolver um pouco essa experiência conforme for estudando os exemplos de circuito através deste livro Conforme for aprendendo explore várias opções de projeto e faça um balanço entre eles As ferramentas CAD Computeraided design estão disponíveis para a consulta num grande espaço de possíveis projetos multinível para que encontre algum que melhor se adapte às limitações dado os blocos disponíveis 252 Empurrões de Bolha O leitor deve se lembrar da Seção 176 que nos circuitos CMOS as portas NAND e NOR são preferíveis sobre AND e OR Porém analisar por inspeção uma equação de um circuito multinível com NAND e NOR pode ser bem complicado A Figura 233 mostra um circuito multinível o qual a função não é imediatamente clara através da inspeção O método dos empurrões de bolha é um modo útil de redesenhar estes circuitos para que as bolhas se cancelem e a função possa ser determinada mais facilmente A partir dos princípios da Seção 233 as orientações para os empurrões de bolhas são os seguintes Comece nas saídas do circuito e trabalhe em direção às entradas Empurre qualquer bolha na saída de volta para a entrada assim o leitor poderá ler a equação em termos da saída por exemplo 𝑌 ao invés do complemento da saída 𝑌 Figura 231 XOR de três entradas utilizando XOR de duas entradas Figura 232 XOR de oito entradas utilizando sete XOR de duas entradas Capítulo dois Projeto de Lógica Combinatória 96 Trabalhando no sentido contrário desenhe cada porta de tal forma que as bolhas se possam cancelar Se a porta atual tiver uma bolha na entrada desenhe a porta precedente com uma bolha na saída Se a porta atual não tem uma bolha na entrada desenhe a porta precedente sem nenhuma bolha na saída A Figura 234 mostra como redesenhar a Figura 233 de acordo com as orientações para os empurrões de bolha Partindo da saída 𝑌 a porta NAND possui uma bolha na saída que nós gostaríamos de eliminar Nós então empurramos a bolha na saída de modo a formar uma porta OR com entradas invertidas mostrada na Figura 234 a Trabalhando para a esquerda vemos que a porta mais à direita possui uma bolha na entrada que se cancela com a bolha de saída da porta NAND do meio não sendo necessárias mudanças nesse caso como mostrado na Figura 234 b A porta do meio não tem nenhuma bolha de entrada por isso transformamos a porta mais à esquerda para não ter nenhuma bolha de saída como se mostra na Figura 234 c Agora todas as bolhas no circuito se cancelam exceto as entradas de modo que a função pode ser lida por inspeção em termos de AND e OR de entradas normais ou complementadas 𝑌 𝐴𝐵𝐶 𝐷 A fim de enfatizar esse último ponto a Figura 235 mostra um circuito logicamente equivalente com aquele na Figura 234 As funções dos nós internos estão mostradas em azul Como as bolhas em série se cancelam nós podemos ignorar as bolhas na saída da porta central e numa das entradas da porta mais à direita a fim de produzir uma lógica equivalente ao circuito da Figura 235 Exemplo 28 EMPURRÕES DE BOLHA PARA LÓGICA CMOS Muitos projetistas pensam em termos de portas AND e OR mas supondo que o leitor gostaria de implementar o circuito da Figura 236 utilizando lógica CMOS que favorecem portas NAND e NOR Usando a técnica dos empurrões de bolha converta o circuito para portas NAND NOR e inversoras Solução Uma solução usando força bruta seria apenas substituir cada porta AND por uma NAND e um inversor e cada porta OR por uma NOR e um inversor como mostrado na Figura 237 Isso requer oito portas Note que o inversor é desenhado com a bolha na sua frente ao invés de atrás para enfatizar como a bolha pode ser cancelada com a porta inversora anterior Figura 233 Circuito multinível utilizando NAND e NOR Figura 234 Circuito utilizando empurrões de bolha Capítulo dois Projeto de Lógica Combinatória 97 Para obter uma solução melhor observe que bolhas podem ser adicionadas à saída de uma porta e à entrada da porta seguinte sem que haja mudança na função como mostrado na Figura 238 a A porta AND final é convertida numa NAND e uma inversora como mostrado na Figura 238 b Esta solução requer apenas cinco portas Figura 237 Circuito pobre utilizando NAND e NOR Figura 238 Circuito melhorado utilizando NAND e NOR 26 XS E ZS OH MEU DEUS A álgebra Booleana é limitada aos valores 0 e 1 No entanto circuitos reais podem também possuir valores ilegais e flutuantes representados simbolicamente por X e Z 261 Valor Ilegal X O símbolo X indica que o nó do circuito tem um valor desconhecido ou ilegal Isso normalmente acontece quando tanto 0 quanto 1 estão sendo direcionados para o mesmo nó ao mesmo tempo A Figura 239 mostra um caso onde o nó 𝑌 recebe tanto nível HIGH quanto LOW Esta situação chamada contenção é considerada um erro e deve ser evitada A tensão verdadeira num nó pode ser algo entre 0 e 𝑉𝐷𝐷 dependendo da força das portas que estão transmitindo os níveis HIGH e Figura 235 Lógica equivalente do circuito utilizando empurrões de bolha Figura 236 Circuito utilizando AND e OR Capítulo dois Projeto de Lógica Combinatória 98 LOW Essa região é considerada quase sempre uma zona proibida A contenção pode requer uma grande quantidade de potência das portas em conflito resultando em aquecimento do circuito e possivelmente em danos Os valores X são algumas vezes utilizados por simuladores de circuito para indicar um valor não inicializado Por exemplo se o leitor se esquecer de especificar o valor de uma entrada o simulador pode assumir que essa é uma entrada X para prevenir problemas Como mencionado na Seção 24 os projetistas de sistemas digitais também usam o símbolo X para indicar valores dont care em tabelas verdade Tenha certeza de que não está confundindo os dois significados Quando X aparece numa tabela verdade ele indica que o valor da variável presente na tabela verdade não é importante tanto faz se é 0 ou 1 Quando o X aparece num circuito isso significa que o nó do circuito possui um valor desconhecido ou ilegal 262 Valor Flutuante Z O símbolo Z indica que um nó não está sendo alimentado nem por nível HIGH nem LOW O nó é dito estar flutuante em alta impedância ou alta Z Um equívoco típico é que um nó flutuante ou não alimentado é o mesmo que um nível lógico 0 Na realidade um nó flutuante pode ser 0 pode ser 1 ou pode ser qualquer tensão entre esses dois níveis dependendo da história do sistema Um nó flutuante nem sempre significa um erro no circuito desde que outro elemento do circuito alimente o nó com um nível lógico válido quando o valor desse nó for relevante para a operação do circuito Um modo comum de se produzir um nó flutuante é esquecendose de alimentar uma entrada do circuito ou assumir que uma entrada não conectada é o mesmo que uma entrada com nível lógico 0 Esse erro pode fazer com que o circuito se comporte incorretamente pois a entrada flutuante muda aleatoriamente de 0 para 1 De fato apenas tocar o circuito pode ser suficiente para disparar a mudança devido à eletricidade estática do corpo Temos visto circuitos que operam corretamente apenas enquanto o aluno mantém o dedo pressionado sobre o chip O buffer tristate mostrado na Figura 240 possui três possibilidades de estado de saída HIGH 1 LOW 0 e flutuante Z O buffer tristate possui uma entrada A uma saída Y e um enable ativação Figura 239 Circuito com contenção Figura 240 Buffer Tristate Capítulo dois Projeto de Lógica Combinatória 99 E Quando o enable é TRUE o buffer tristate se comporta como um simples buffer transferindo o valor da entrada para a saída Quando o enable é FALSE a saída é flutuante Z O buffer tristate na Figura 240 possui um enable ativo a alto Isto é quando o enable é HIGH1 o buffer está ativado A Figura 241mostra um buffer tristate com um enable ativo a baixo Quando o enable é LOW 0 o buffer está ativado Mostramos que o sinal se torna ativo a baixo colocando se uma bolha no seu fio de entrada Frequentemente indicamos uma entrada ativa a baixo colocando uma barra sobre o seu nome 𝐸 ou colocando as letras bou barapós o seu nome 𝐸𝑏ou 𝐸𝑏𝑎𝑟 Os buffers tristate são normalmente utilizados em barramentos que conectam múltiplos chips Por exemplo um microprocessador um controlador de vídeo e um controlador Ethernet poderiam todos precisar se comunicar com a memória do sistema num computador pessoal Cada chip pode se conectar com o barramento de memória compartilhado utilizandose buffers tristate como mostrado na Figura 242 Somente a um chip por vez é permitido ativar o seu sinal de ativação para transmitir um valor para o barramento Os outros chips devem produzir saídas flutuantes para que não causem contenção com o chip a comunicar com a memória Qualquer chip pode ler a informação do barramento compartilhado a qualquer momento Estes barramentos tristate já foram comuns No entanto nos computadores modernos com maiores velocidades são possíveis através de links ponto a ponto nos quais os chips são conectados entre si diretamente ao invés de um barramento compartilhado 27 MAPAS DE KARNAUGH Após trabalhar com muitas minimizações de equações Booleanas utilizando álgebra Booleana o leitor vai perceber que se não tomar cuidado às vezes irá terminar com uma equação completamente diferente ao invés de uma equação simplificada Os mapas de Karnaugh Kmaps são um método gráfico para a simplificação de equações Booleanas Eles foram inventados em 1953 por Maurice Karnaugh um engenheiro de telecomunicações da Bell Labs Os Kmaps funcionam bem para problemas com menos do que quatro variáveis Mais importante ainda dão informações sobre a manipulação de equações Booleanas Figura 241 Buffer Tristate com Enable ativo a baixo Figura 242 Buffer Tristate conectando múltiplos chips Capítulo dois Projeto de Lógica Combinatória 100 Recordamos que a lógica da minimização envolve a combinação de termos Dois termos contendo um implicante 𝑃 e as formas real e complementar de alguma variável 𝐴 são combinados para eliminar 𝐴 𝑃𝐴 𝑃𝐴 𝑃 Os mapas de Karnaugh tornam estes termos combináveis fáceis de ver colocandoos perto um do outro numa grade A Figura 243 mostra a tabela verdade e o Kmap para uma função de três entradas A linha de cima do Kmap dá os três valores possíveis para as entradas A e B A coluna da esquerda dá as duas possibilidades de valores para a entrada C Cada quadrado no Kmap corresponde a uma linha na tabela verdade e contém o valor da saída 𝑌 naquela linha Por exemplo o quadrado do canto superior esquerdo corresponde à primeira linha da tabela verdade e indica que o valor de saída 𝑌 1 quando 𝐴𝐵𝐶 000 Assim como cada linha numa tabela verdade cada quadrado no mapa de Karnaugh representa um único mintermo A propósito de explicação a Figura 243 c mostra os mintermos correspondentes para cada quadrado no Kmap Figura 243 Função de três entradas a tabela verdade b Kmap c Kmap mostrando os mintermos Cada quadrado ou mintermo difere do quadrado adjacente de uma mudança numa única variável Isso significa que quadrados adjacentes compartilham todos os mesmos literais exceto um o qual aparece em forma TRUE num quadrado e em forma complementar em outro Por exemplo os quadrados representando os mintermos 𝐴𝐵𝐶 e 𝐴𝐵𝐶 são adjacentes e diferem somente da variável C O leitor pode ter notado que as combinações 𝐴 e 𝐵 na linha de cima estão numa ordem peculiar 00011110 Essa ordem é chamada de código Gray Ele difere da ordem binária comum Maurice Karnaugh 1924 Graduado como bacharel em física pela City College of New York em 1948 recebeu seu PhD em física pela Yale em 1952 Trabalhou na Bell Labs e na IBM de 1952 a 1993 e como professor de ciência da computação pela Polythecnic Unversity of New York de 1980 a 1999 Os códigos de Gray foram patenteados Patente EUA 2632058 por Frank Gray um pesquisador da Bell Labs em 1953 Eles são especialmente úteis em codificadores mecânicos porque um pequeno desalinhamento provoca um erro em apenas um bit Os códigos Gray generalizam para qualquer número de bits Por exemplo uma sequência de código de Gray 3 bits é 000 001 011 010 110 111 101 100 Capítulo dois Projeto de Lógica Combinatória 101 00011011 em que entradas adjacentes diferem apenas numa variável Por exemplo 0111 apenas mudam 𝐴 para 1 enquanto 0110 poderia mudar 𝐴 de 1 para 0 e 𝐵 de 0 para 1 Portanto escrever as combinações em ordem binária poderia não produzir a propriedade desejada de quadrados adjacentes diferindo apenas de uma variável O Kmap também envolve Os quadrados logo à direita são efetivamente adjacentes aos quadrados logo à esquerda nos quais diferem em apenas uma variável 𝐴 Por outras palavras o leitor poderia pegar o mapa e enrolálo num cilindro então juntar os finais do cilindro em forma de donut e ainda assim garantir que quadrados adjacentes iriam diferir em apenas uma variável 271 Pensamento Circular No Kmap da Figura 243 apenas dois mintermos são apresentados na equação 𝐴𝐵𝐶 e 𝐴𝐵𝐶 como indicado pelos uns na coluna da esquerda Lendo os mintermos a partir do mapa de Karnaugh é exatamente equivalente a ler as equações na forma de soma de produtos a partir da tabela verdade Figura 244 Minimização com mapa de Karnaugh Como antes podemos utilizar a álgebra Booleana para minimizar as equações na forma de soma de produtos 𝑌 𝐴𝐵𝐶 𝐴𝐵𝐶 𝐴𝐵𝐶 𝐶 𝐴𝐵 27 Os mapas de Karnaugh ajudam a fazer essa simplificação graficamente circulando os 1 em quadrados adjacentes como mostrado na Figura 244 Para cada círculo escrevemos o implicante correspondente Lembrese da Seção 22 que um implicante é o produto de um ou mais literais Variáveis cujas formas verdadeiras e complementares estão ambas no círculo são excluídas do Lewis Carroll representava um enigma relacionado na Vanity Fair em 1879 As regras do quebracabeça são bastante simples Duas palavras são propostas com o mesmo comprimento e o enigma consiste em as vincular interpondo outras palavras cada um dos quais deve diferir da próxima palavra em apenas uma letra Isto quer dizer uma carta pode ser alterada em uma das palavras apresentadas em seguida uma letra da palavra assim obtida e assim por diante até chegar à outra palavra dada Por exemplo SHIP para DOCK SHIP SLIP SLOP SLOT SOOT LOOT LOOK LOCK DOCK Pode o leitor encontrar uma sequência mais curta Capítulo dois Projeto de Lógica Combinatória 102 implicante Nesse caso a variável 𝐶 tem tanto a sua forma verdadeira 1 quanto sua forma complementar 0 no círculo então não a incluímos no implicante Por outras palavras Y é TRUE quando 𝐴 𝐵 0 independente de 𝐶 Então o implicante é 𝐴𝐵 O mapa de Karnaugh dá a mesma resposta que encontramos utilizando a álgebra Booleana 272 Minimização Lógica com Mapas de Karnaugh Os mapas de Karnaugh fornecem num modo visual simples de minimizar a lógica Simplesmente circule todos os blocos retangulares com 1 no mapa utilizando o menor número possível de círculos Cada círculo deve ser o maior possível Então tome os implicantes que foram circulados De modo mais formal lembrese que uma equação Booleana é minimizada quando é escrita como uma soma do menor número possível de implicantes principais Cada círculo no mapa de Karnaugh representa um implicante Os maiores círculos possíveis são os implicantes principais Por exemplo no mapa de Karnaugh da Figura 244 𝐴𝐵𝐶 e 𝐴𝐵𝐶 são implicantes mas não implicantes principais Apenas 𝐴𝐵 é um implicante principal no mapa de Karnaugh As regras para se encontrar uma equação minimizada a partir de um Kmap são as seguintes Utilize o menor número possível de círculos necessários para cobrir todos os 1 Todos os quadrados dentro de cada círculo devem conter 1 Cada círculo deve cobrir um bloco retangular que seja potência de 2 isto é 1 2 ou 4 quadrados em cada direção Cada círculo deve ser o maior possível Um círculo pode dar as voltas ao redor das bordas do Kmap Um 1 num Kmap pode ser circulado múltiplas vezes se isso permitir menos círculos serem utilizados Figura 245 Kmap para o exemplo 29 Figura 246 Solução para o exemplo 29 Capítulo dois Projeto de Lógica Combinatória 103 Exemplo 29 MINIMIZAÇÃO DE UMA FUNÇÃO DE TRÊS VARIÁVEIS UTILIZANDO UM MAPA DE KARNAUGH Suponha que nós temos a função 𝑌 𝐹𝐴 𝐵 𝐶 com o mapa de Karnaugh mostrado na Figura 245 Minimize a equação utilizando o mapa de Karnaugh Solução Circule os 1 no Kmap usando a menor quantidade possível de círculos como mostrado na Figura 246 Cada círculo no mapa de Karnaugh representa um implicante principal e a dimensão de cada círculo é uma potência de 2 2x1 e 2x2 Formamos o implicante principal para cada círculo escrevendo as variáveis que aparecem no círculo apenas em condição verdadeiro ou apenas na forma complementada Por exemplo no círculo 2x1 as formas verdadeira e complementar de B estão incluídas no círculo então não incluímos B no implicante principal No entanto apenas a forma verdadeira de 𝐴 𝐴 e a forma complementada de 𝐶 𝐶 estão nesse círculo então incluímos essas variáveis no implicante principal 𝐴𝐶 Similarmente o círculo 2x2 cobre todos os quadrados onde 𝐵 0 então o implicante principal é 𝐵 Note como o quadrado superior direito mintermo é coberto duas vezes para tornar o círculo do implicante principal o maior possível Como nós vimos nas técnicas de álgebra Booleana isso equivale a compartilhar o mintermo para reduzir o tamanho dos implicantes Note também como o círculo cobrindo quatro quadrados dá a volta pelos lados do mapa de Karnaugh Exemplo 210 DECODIFICADOR DE DISPLAY DE SETE SEGMENTOS Um decodificador de display de sete segmentos toma um dado de entrada de 4 bits 𝐷30 e produz sete saídas que controlam diodos emissores de luz que mostram um dígito de 0 a 9 As sete saídas são Figura 247 Ícone para o display decodificador de sete segmentos Capítulo dois Projeto de Lógica Combinatória 104 também chamadas de segmento a a g ou 𝑆𝑎 𝑆𝑔 como definido na Figura 247 Os dígitos são mostrados na Figura 248 Escreva uma tabela verdade para as saídas e use os Kmaps para encontrar equações Booleanas para as saídas 𝑆𝑎 e 𝑆𝑏 Deve assumir que os valores ilegais de entrada 1015 produzem uma leitura em branco Solução A tabela verdade é dada na Tabela 26 Por exemplo uma entrada de 0000 deve ligar todos os segmentos exceto 𝑆𝑔 Cada uma das sete saídas é uma função independente de quatro variáveis O Kmap para as saídas 𝑆𝑎 e 𝑆𝑏 são mostrados na Figura 249 Lembrese que quadrados adjacentes podem diferir em apenas uma variável então rotulamos as linhas e colunas na ordem do código Gray 00011110 Tenha o cuidado de lembrar essa ordem quando inserir os valores das saídas nos quadrados Próximo passo circular os implicantes principais Utilize o menor número possível de círculos necessários para cobrir todos os 1 Um círculo pode atravessar as bordas vertical e horizontal e um 1pode ser circulado mais de uma vez A Figura 250 mostra os implicantes principais e as equações Booleanas simplificadas Figura 248 Dígitos para o display decodificador de sete segmentos Note que o conjunto mínimo de implicantes principais não é único Por exemplo a entrada 0000 no mapa de 𝑆𝑎 foi circulado também com a entrada 1000 para produzir o mintermo 𝐷2 𝐷1 𝐷0 O círculo poderia além disso ter incluído a entrada 0010 produzindo o mintermo 𝐷3 𝐷2 𝐷0 como mostrado com linhas pontilhadas na figura Figura 251 Capítulo dois Projeto de Lógica Combinatória 105 A Figura 252 ilustra um erro comum no qual um implicante não principal foi escolhido para cobrir o 1 no canto superior esquerdo O mintermo poderia ter sido combinado com qualquer um dos 1 adjacentes para formar um círculo maior como foi feito nas duas figuras anteriores Figura 249 Mapas de Karnaugh para 𝑺𝒂 e 𝑺𝒃 Figura 250 Mapa de Karnaugh solução para o exemplo 210 Capítulo dois Projeto de Lógica Combinatória 106 Figura 251 Mapa de Karnaugh alternativo para 𝑺𝒂 mostrando diferentes conjuntos de implicantes principais Tabela 26 Tabela verdade para o display decodificador de sete segmentos Capítulo dois Projeto de Lógica Combinatória 107 273 Dont Cares Lembrese que entradas dont care numa tabela verdade foram introduzidas na Seção 24 para reduzir o número de linhas na tabela quando algumas variáveis não afetam as saídas Elas são indicadas pelo símbolo X que significa que a entrada pode ser tanto 0 quanto 1 Dont cares também aparecem em saídas de tabelas verdade quando a saída não é importante ou a combinação de entrada correspondente é impossível de ocorrer Tais saídas podem ser tratadas tanto como 0 quanto 1 pelo projetista Num mapa de Karnaugh os X permitem ainda mais simplificar a lógica Eles podem ser circulados se ajudarem a cobrir os 1 com círculos maiores ou em quantidade menor mas eles não precisam ser circulados se não forem úteis Exemplo 211 DECODIFICADOR DE DISPLAY DE SETE SEGMENTOS COM DONT CARES Repita o exemplo 210 considerando que não nos importamos com os valores das saídas para as entradas ilegais dos valores de 10 a 15 Solução O Kmap é mostrado na Figura 253 com as entradas X representando dont cares Como os dont cares podem ser 0 ou 1 circulamos um dont care se ele nos permitir cobrir os 1 com círculos maiores ou com menos círculos Dont cares circulados são tratados como 1 enquanto dont cares não circulados são 0 Observe como um quadrado 2x2 vai através dos quatro cantos ser circulado para o segmento 𝑆𝑎 O uso dos dont cares simplifica substancialmente a lógica 274 A grande Imagem A álgebra Booleana e os mapas de Karnaugh são dois métodos de simplificação lógica Em última análise o objetivo é encontrar um método de baixo custo para a implementação de uma determinada função lógica Figura 252 Mapa de Karnaugh alternativo para 𝑺𝒂 mostrando implicantes incorretos Capítulo dois Projeto de Lógica Combinatória 108 Nas modernas práticas de engenharia programas de computador chamados sintetizadores lógicos produzem circuitos simplificados a partir de uma descrição de uma função lógica como será visto no Capítulo 4 Para grandes problemas os sintetizadores lógicos são muito mais eficientes que os humanos Para pequenos problemas um humano com um pouco de experiência pode encontrar uma boa solução por inspeção Nenhum dos autores nunca utilizou um mapa de Karnaugh na vida real para resolver um problema prático Mas o conhecimento adquirido a partir dos princípios fundamentais dos mapas de Karnaugh é valioso E os mapas de Karnaugh muitas vezes aparecem nas entrevistas de emprego Figura 253 Soluções de Kmap com dont cares Capítulo dois Projeto de Lógica Combinatória 109 28 BLOCOS COMBINATÓRIOS A lógica combinatória é frequentemente agrupada em blocos maiores a fim de se construírem sistemas mais complexos Essa é uma aplicação do princípio de abstração escondendo os detalhes a nível das portas e enfatizando a função do bloco Até aqui nós já estudamos três destes blocos full adders na Seção 21 circuitos de prioridade na Seção 24 e decodificadores de displays de sete segmentos na Seção 27 Esta Seção introduz mais dois blocos normalmente utilizados multiplexadores e decodificadores O Capítulo 5 cobre outros blocos combinatórios 281 Multiplexadores Os multiplexadores estão entre os circuitos combinatórios mais normalmente utilizados Eles escolhem uma saída de entre muitas possíveis entradas tendo por base o valor de um sinal de seleção Um multiplexador às vezes é carinhosamente chamado de mux 282 Multiplexadores 21 A Figura 254 mostra o esquemático e a tabela verdade de um multiplexador 21 com duas entradas de dados 𝐷0 e 𝐷1 uma entrada de seleção 𝑆 e uma saída 𝑌 O multiplexador escolhe entre as duas entradas de dados baseada na entrada de seleção se 𝑆 0 𝑌 𝐷0 e se 𝑆 1 𝑌 𝐷1 𝑆 também é chamado de sinal de controle pois controla o que o multiplexador faz Um multiplexador 21 pode ser construído a partir da lógica de soma de produtos como mostrado na Figura 255 A equação Booleana para o multiplexador pode ser derivada com um mapa de Karnaugh ou lida por inspeção 𝑌 é 1 se 𝑆 0 AND 𝐷0 é 1 OR 𝑆 1 AND 𝐷1 é 1 Alternativamente os multiplexadores podem ser construídos a partir de buffers tristate como mostrado na Figura 256 O controle do tristate é arranjado de tal modo que em todas as vezes exatamente um buffer tristate está ativo Quando 𝑆 0 o tristate T0 está ativado permitindo que 𝐷0 flua para 𝑌 Quando 𝑆 1 o tristate T1 está ativado permitindo que 𝐷1 flua para 𝑌 Figura 254 Símbolo e tabela verdade de um multiplexador 21 Capítulo dois Projeto de Lógica Combinatória 110 Figura 255 Implementação de um multiplexador 21 utilizando lógica de dois níveis Multiplexadores Maiores Um multiplexador 41 possui quatro entradas de dados e uma saída como mostrado na Figura 257 Dois sinais de seleção são necessários para escolherem entre as quatro entradas O multiplexador 41 pode ser construindo utilizandose a lógica de soma de produtos tristates ou múltiplos multiplexadores 21 como mostrado na Figura 258 Os termos do produto ativando os tristates podem ser formados utilizandose portas AND e inversoras Eles também podem ser formados usando um decodificador o qual foi introduzido na Seção 282 Os Multiplexadores maiores como os multiplexadores 81 ou 161 podem ser construídos expandindose os métodos mostrados na Figura 258 Em geral um multiplexador 𝑁 1 necessita de Figura 256 Multiplexador utilizando buffers tristate O curtocircuito em conjunto das saídas de várias portas lógicas tecnicamente viola as regras para circuitos combinatórios dadas na Seção 21 Mas porque exatamente uma das saídas é conduzida a qualquer momento a exceção é permitida Figura 257 Multiplexador 41 Capítulo dois Projeto de Lógica Combinatória 111 log2 𝑁 linhas de seleção Novamente a melhor escolha de implementação depende da tecnologia alvo Figura 259 Implementação de um multiplexador 41 a lógica de dois níveis b tristates c hierárquica Lógica do Multiplexador Os multiplexadores podem ser usados como tabelas de pesquisa para realizar funções lógicas A Figura 259 mostra um multiplexador 41 utilizado para implementar uma porta AND de duas entradas As entradas A e B servem como linhas de seleção As entradas de dados do multiplexador são conectadas a 0 ou 1 de acordo com a linha correspondente da tabela verdade Em geral um multiplexador de 2𝑁 entradas pode ser programado para realizar qualquer função lógica de 𝑁 entradas aplicandose 0 ou 1 às entradas de dados apropriadas De fato através da mudança nos dados de entrada o multiplexador pode ser reprogramado para realizar uma função diferente Figura 258 Implementação de um multiplexador 41 com lógica de porta AND de duas entradas Capítulo dois Projeto de Lógica Combinatória 112 Com um pouco de destreza nós podemos cortar o tamanho de um multiplexador pela metade utilizando apenas um multiplexador de 2𝑁1 entradas para realizar qualquer função lógica de 𝑁 entradas A estratégia é deixar um dos literais com 0 ou com 1 como entrada de dados do multiplexador Para ilustrar este princípio a Figura 260 mostra as funções AND e XOR implementadas com multiplexadores 21 Começamos a partir de uma tabela verdade comum e combinamos pares de linhas a fim de eliminar a variável de entrada mais à direita expressando a saída em termos dessa variável Por exemplo no caso da AND quando 𝐴 0 𝑌 0 independentemente de 𝐵 Quando 𝐴 1 𝑌 0 se 𝐵 0 e 𝑌 1 se 𝐵 1 então 𝑌 𝐵 Nós então usamos o multiplexador como uma tabela de pesquisa de acordo com a nova e menor tabela verdade Figura 260 Lógica de multiplexador utilizando variáveis de entrada Capítulo dois Projeto de Lógica Combinatória 113 Exemplo 212 LÓGICA COM MULTIPLEXADORES Alyssa P Hacker precisa implementar a função 𝑌 𝐴𝐵 𝐵𝐶 𝐴𝐵𝐶 para finalizar o seu projeto sênior mas quando ela olha para o seu kit de laboratório o único componente que sobrou é um multiplexador 81 Como implementaria ela essa função Solução A Figura 261 mostra a implementação de Alyssa utilizando um único multiplexador 81 O multiplexador age como uma tabela de pesquisa onde cada linha na tabela verdade corresponde a uma entrada do multiplexador Exemplo 213 LÓGICA COM MULTIPLEXADORES REPRISADA A Alyssa ligou seu circuito uma última vez antes da apresentação final e explodiu o multiplexador 81 ela acidentalmente o alimentou com 20 V ao invés de 5 V após passar a noite em claro Ela implorou a seus amigos para que lhe cedessem componentes e eles lhe deram um multiplexador 41 e uma porta inversora Ela pode construir o seu circuito apenas com esses componentes Solução A Alyssa reduziu a sua tabela verdade para quatro linhas deixando a saída dependendo de 𝐶 ela também poderia ter escolhido rearranjar as colunas da tabela verdade a fim de deixar a saída dependente de 𝐴 e 𝐵 A Figura 262 ilustra o novo projeto Figura 261 Circuito da Alyssa a tabela verdade b implementação do multiplexador Capítulo dois Projeto de Lógica Combinatória 114 283 Decodificadores Um decodificador possui 𝑁 entradas e 2𝑁 saídas Ele ativa exatamente uma de suas saídas dependendo da combinação das entradas A Figura 263 ilustra um decodificador 24 Quando 𝐴10 00 𝑌0 1 Quando 𝐴10 01 𝑌1 1 e assim por diante Exemplo 214 IMPLEMENTAÇÃO DE UM DECODIFICADOR Implemente um decodificador 24 com portas AND OR e NOT Solução A Figura 264 ilustra a implementação de um decodificador 24 utilizando quatro portas AND Cada porta depende de ambas as formas verdadeiras e complementadas de cada entrada Em geral um decodificador 𝑁 2𝑁 pode ser construído a partir de 2𝑁 portas AND de 𝑁 entradas que aceitam as várias combinações das entradas normais e complementadas Cada saída num decodificador representa um único mintermo Por exemplo 𝑌0 representa o mintermo 𝐴1 𝐴0 Esse fato será conveniente quando utilizarmos decodificadores em outros blocos digitais Lógica do Decodificador Decodificadores podem ser combinados com portas OR para construírem funções lógicas A Figura 265 mostra a função XNOR de duas entradas utilizando um decodificador 24 e uma única porta OR Devido a cada entrada do decodificador representar um único mintermo a função é construída como OR de todos os mintermos na função Na Figura 265 𝑌 𝐴𝐵 𝐴𝐵 𝐴 𝐵 Quando são utilizados decodificadores para se construir lógica é mais fácil expressar as funções na forma de tabela verdade ou na forma canônica de soma de produtos Uma função de 𝑁 entradas com 𝑀 1s na tabela verdade pode ser construída com um decodificador 𝑁 2𝑁 e um OR de 𝑀 entradas conectadas a todos os mintermos contendo 1 na tabela verdade Esse conceito será aplicado para a construção de Memórias de Apenas Leitura Read Only Memories ROMs na Seção 556 Figura 262 Novo circuito da Alyssa Figura 263 Decodificador 24 Capítulo dois Projeto de Lógica Combinatória 115 29 TEMPORIZAÇÃO Nas seções anteriores a nossa preocupação principal é se o circuito funciona idealmente utilizando poucas portas No entanto como qualquer projetista amadurecido de circuitos irá constatar um dos problemas mais desafiadores no projeto de circuitos é a temporização fazer um circuito funcionar rapidamente Uma saída leva tempo para mudar a sua resposta a uma mudança na entrada A Figura 266 mostra o atraso entre a mudança na entrada e a mudança subsequente na saída de um buffer A figura é chamada de diagrama de temporização ele representa a resposta transitória do circuito do buffer quando a entrada muda A transição do nível LOW para HIGH é chamada flanco ascendente Similarmente a transição de HIGH para LOW não mostrada na figura é chamada de flanco descendente A seta azul indica que o flanco ascendente de 𝑌 é causada pelo flanco ascendente de 𝐴 Medimos o atraso do ponto de 50 do sinal de entrada 𝐴 até ao ponto de 50 do sinal de saída 𝑌 O ponto de 50 é o ponto em que o sinal está na metade do caminho 50 entre os valores LOW e HIGH conforme a transição é realizada 291 Atraso de Propagação e de Contaminação A lógica combinatória é caracterizada por seu atraso de propagação e contamination delay O atraso de propagação 𝑡𝑝𝑑 é o tempo máximo a partir do qual a entrada muda de valor até quando a saída ou as saídas atingem seu valor final O contamination delay 𝑡𝑐𝑑 é o tempo mínimo a partir do qual a entrada muda de nível até quando qualquer uma das saídas comece a mudar de valor A Figura 267 ilustra o atraso de propagação e contamination delay de um buffer em azul e cinza respectivamente A figura mostra que 𝐴 é inicialmente HIGH ou LOW e muda de estado num dado instante estamos interessados apenas no fato de que ele muda mas não qual o valor que ele tem Em resposta 𝑌 muda algum tempo depois Os arcos indicam que 𝑌 começa a mudar de valor 𝑡𝑐𝑑 após a transição de 𝐴 e que 𝑌 definitivamente se estabelece no novo valor dentro do tempo 𝑡𝑝𝑑 Figura 264 Implementação de um decodificador 24 Figura 265 Função lógica utilizando decodificador Capítulo dois Projeto de Lógica Combinatória 116 As causas fundamentais para o atraso nos circuitos incluem o tempo necessário para carregar as capacitâncias num circuito e a velocidade da luz 𝑡𝑝𝑑 e 𝑡𝑐𝑑 podem ser diferentes devido a muitas razoes incluindo Diferentes atrasos de subida e descida Múltiplas entradas e saídas algumas das quais são mais rápidas que outras Circuitos diminuem a velocidade quando estão quentes e aumentam quando estão frios Calcular 𝑡𝑝𝑑 e 𝑡𝑐𝑑 requer uma profundidade em níveis baixos de abstração fora do escopo deste livro No entanto os fabricantes normalmente fornecem data sheets especificando estes atrasos para cada porta Juntamente com os fatores já listados os atrasos de propagação e contamination delay são também determinados através do caminho que um sinal faz da entrada para a saída A Figura 268 mostra um circuito lógico de quatro entradas O caminho crítico mostrado a azul é o caminho da entrada 𝐴 para a saída 𝐵 É o caminho mais longo e portanto o mais lento pois a entrada viaja através de três portas até a saída Esse caminho é crítico pois limita a velocidade a que o circuito opera O caminho curto através do circuito mostrado em cinza vai da entrada D à saída Y Este é o menor e portanto mais rápido caminho através do circuito pois a entrada viaja através de apenas uma porta para a saída O atraso de propagação de um circuito combinatório é igual à soma dos atrasos de propagação através de cada elemento no caminho crítico O contamination delay é a soma dos contamination delays através de cada elemento no caminho curto Esses atrasos são mostrados na Figura 269 e são descritos pelas seguintes equações 𝑡𝑝𝑑 2𝑡𝑝𝑑𝐴𝑁𝐷 𝑡𝑝𝑑𝑂𝑅 28 𝑡𝑐𝑑 𝑡𝑐𝑑𝐴𝑁𝐷 29 Quando os projetistas falam sobre calcular o atraso de um circuito eles geralmente se referem ao pior caso o atraso de propagação a não ser que esteja claro de uma outra forma a partir do contexto Figura 266 Atraso do circuito Capítulo dois Projeto de Lógica Combinatória 117 Figura 267 Atraso de propagação e de contaminação Exemplo 215 ENCONTRANDO ATRASOS Ben Bitdiddle precisa encontrar o atraso de propagação e o contamination delay do circuito mostrado na Figura 270 De acordo com o seu datasheet cada porta tem um atraso de propagação de 100 pico segundos ps e um contamination delay de 60 ps Atrasos nos circuitos são normalmente da ordem de picossegundos 1 𝑝𝑠 1012segundos a nanossegundos 1 𝑛𝑠 109segundos Trilhões de picossegundos foram gastos para o leitor ler esta caixa de texto Figura 268 Caminho curto e caminho crítico Capítulo dois Projeto de Lógica Combinatória 118 Figura 269 Formas de onda do caminho curto e do caminho crítico Solução Ben começou encontrando o caminho crítico e o caminho mais curto através do circuito O caminho crítico destacado em azul na Figura 271 vai da entrada 𝐴 ou 𝐵 através de três portas até à saída 𝑌 Consequentemente 𝑡𝑝𝑑 é igual a três vezes o atraso de propagação de uma única porta ou 300 ps O caminho mais curto mostrado em cinza na Figura 272 vai da entrada 𝐶 𝐷 ou 𝐸 através de duas portas para a saída 𝑌 Existem apenas duas portas no caminho mais curto então 𝑡𝑐𝑑 é igual a 120 ps Exemplo 216 TEMPORIZAÇÃO DE MULTIPLEXADORES CONTROLE CRÍTICO VS DADOS CRÍTICOS Compare o pior caso de temporização dos projetos de três multiplexadores de quatro entradas mostrados na Figura 258 na Seção 281 A Tabela 27 lista os atrasos de propagação dos componentes Qual o caminho crítico para cada projeto Dada a sua análise de temporização porque o leitor escolheria um projeto ao invés de outro Embora estejamos ignorando atraso de condutor nesta análise os circuitos digitais são agora tão rápidos que o atraso de condutores longos pode ser tão importante quanto o atraso das portas A velocidade de atraso luz em fios é coberto no Apêndice A Figura 270 Circuito do Ben Figura 271 Caminho crítico do circuito do Ben Capítulo dois Projeto de Lógica Combinatória 119 Solução Um dos caminhos críticos para cada uma das três opções de projeto é destacado em azul na Figura 273 e Figura 274 𝑡𝑝𝑑𝑠𝑦 indica o atraso de propagação da entrada 𝑆 para a saída 𝑌 𝑡𝑝𝑑𝑑𝑦 indica o atraso de propagação da entrada 𝐷 para a saída 𝑌 𝑡𝑝𝑑 é o pior dos dois max𝑡𝑝𝑑𝑠𝑦 𝑡𝑝𝑑𝑑𝑦 Tanto para a implementação lógica de dois níveis quanto para a implementação por tristates na Figura 273 o caminho crítico vai de um dos sinais de controle 𝑆 para a saída 𝑌 𝑡𝑝𝑑 𝑡𝑝𝑑𝑠𝑦 Estes circuitos são de controle crítico devido ao caminho crítico ir dos sinais de controle à saída Qualquer atraso adicional nos sinais de controle vai diretamente para o pior caso de atraso O atraso de 𝐷 para 𝑌 na Figura 273 b é de apenas 50 ps comparado ao atraso de 𝑆 para 𝑌 de 125 ps A Figura 274 mostra a implementação hierárquica de um multiplexador 41 utilizando dois estágios de multiplexadores 21 O caminho crítico vai de qualquer uma das entradas 𝐷 para a saída Este circuito é crítico em dados pois o caminho crítico vai da entrada de dados até a saída 𝑡𝑝𝑑 𝑡𝑝𝑑𝑑𝑦 Se as entradas de dados chegam bem antes das entradas de controle poderíamos preferir o projeto com o menor atraso controlesaída o projeto hierárquico da Figura 274 Similarmente se as entradas de controle chegam bem antes das entradas de dados nós poderíamos preferir o projeto com o menor atraso dadossaída o projeto com tristates da Figura 273 b A melhor escolha depende não apenas do caminho crítico através do circuito e dos tempos de chegada mas também da potência custo e disponibilidade de componentes Figura 272 Caminho mais curto do circuito do Ben Capítulo dois Projeto de Lógica Combinatória 120 Figura 273 Atrasos de propagação num multiplexador 41 a lógica de dois níveis b tristate Tabela 27 Especificações de temporização para elementos de circuitos multiplexadores Figura 274 Atraso de propagação em um multiplexador Hierárquico utilizando multiplexadores 21 Capítulo dois Projeto de Lógica Combinatória 121 292 Glitches Até agora temos discutido o caso em que uma única mudança na entrada causa uma única mudança na saída No entanto é possível que uma única transição na entrada cause múltiplas transições na saída Elas são chamadas de glitches ou hazards Apesar de os glitches normalmente não causarem problemas é importante perceber que eles existem e reconhecelos ao olhar um diagrama de temporização A Figura 275 mostra um circuito com um glitche e o mapa de Karnaugh do circuito A equação Booleana é corretamente minimizada mas vamos dar uma olhada no que acontece quando 𝐴 0 𝐶 1 e 𝐵 transita de 1 para 0 A Figura 276 ilustra este cenário O caminho mais curto caminho em cinza passa através de duas portas a AND e a OR O caminho crítico mostrado em azul passa através da inversora e de duas portas a AND e a OR Com a transição de 𝐵 de 1 para 0 n2 no caminho mais curto cai antes que n1 no caminho crítico possa se elevar Até que n1 aumente as duas entradas da porta OR são 0 e a saída 𝑌 cai para 0 Quando n1 eventualmente aumenta 𝑌 retorna a 1 Como é mostrado no diagrama de temporização da Figura 276 𝑌 inicia em 1 e termina em 1 mas momentaneamente vai para o valor 0 Enquanto esperarmos que atraso de propagação termine antes que dependamos da saída os glitches não serão um problema pois a saída eventualmente vai para o valor correto Caso optemos por isso podemos evitar o glitch adicionando outra porta lógica na implementação Isso é mais simples de se entender em termos do Kmap A Figura 277 mostra como uma mudança na entrada em 𝐵 de 𝐴𝐵𝐶 001 para 𝐴𝐵𝐶 011 se move de um implicante principal para outro A mudança através da fronteira dos dois implicantes principais no mapa de Karnaugh indicam um possível glitch Como vimos no diagrama de temporização na Figura 276 se a implementação do circuito de um dos implicantes primos desliga antes que o circuito de outro implicante primo possa ligar existe um glitch Para consertar isto adicionamos outro círculo que cobre a fronteira do implicante primo como mostrado na Figura 278 O leitor talvez possa reconhecer isso como teorema do consenso onde o termo adicionado 𝐴𝐶 é o consenso ou termo redundante Figura 275 Circuito com Glitch Capítulo dois Projeto de Lógica Combinatória 122 A Figura 279 mostra o circuito à prova de glitch A porta AND adicionada é destacada em azul Agora a mudança de 𝐵 quando 𝐴 0 e 𝐶 1 não causa um glitch na saída pois a porta AND azul emite 1 durante toda a transição Figura 276 Temporização de um glitch Em geral um glicth pode ocorrer quando uma mudança numa variável atravessa a fronteira entre dois implicantes primos num mapa de Karnaugh Podemos eliminar o glitch adicionando implicantes redundantes ao Kmap para cobrir essas fronteiras Isso é claro vem com um custo extra de hardware No entanto mudanças simultâneas em várias entradas também podem causar glitches Este tipo de glitches não pode ser resolvido adicionandose hardware Devido à vasta maioria de circuitos de sistemas de interesse que possuem transições simultâneas ou quase simultâneas os glitches são um fato na vida da maioria dos circuitos Apesar de termos mostrado como eliminar um tipo de glitch o ponto de discussão não é sobre eliminálos mas estar cientes de que eles existem Isso é especialmente importante quando analisamos os diagramas de temporização num simulador ou osciloscópio Figura 277 Mudança na entrada cruzando a fronteira do implicante Figura 278 Kmap sem o glitch Figura 279 Circuito sem o glitch Capítulo dois Projeto de Lógica Combinatória 123 210 SUMÁRIO Um circuito digital é um módulo com entradas e saídas de valores discretos e uma especificação descrevendo a função e a temporização do módulo Este Capítulo teve o seu foco nos circuitos combinatórios nos quais as saídas dependem unicamente dos valores atuais de entradas A função de um circuito combinatório pode ser dada por uma tabela verdade ou equação Booleana A equação Booleana para qualquer tabela verdade pode ser obtida sistematicamente utilizandose a forma de soma de produtos ou de produto de somas Na forma de soma de produtos a função é escrita como a soma OR de um ou mais implicantes Implicantes são produtos AND de literais Literais são as formas verdadeiras ou complementadas das variáveis de entrada As equações Booleanas podem ser simplificadas utilizandose as regras da álgebra Booleana Em particular elas podem ser simplificadas em mínimas formas de soma de produtos através da combinação de implicantes que diferem entre si apenas na forma verdadeira e complementada de um dos literais 𝑃𝐴 𝑃𝐴 𝑃 Os mapas de Karnaugh são ferramentas visuais de minimização de funções de até quatro variáveis Na prática os projetistas podem usualmente simplificar funções de poucas variáveis por inspeção Ferramentas de projeto auxiliado por computador são utilizadas para funções mais complicadas tais métodos e ferramentas são discutidos no Capítulo 4 As portas lógicas são conectadas entre si para criar circuitos combinatórios que realizam uma função desejada Qualquer função na forma de soma de produtos pode ser construída utilizandose lógica de dois níveis os complementos das entradas são constituídos por portas NOT os produtos por portas AND e as somas por portas OR Dependendo da função e dos blocos lógicos disponíveis implementações lógicas multinível com vários tipos de portas podem ser mais eficientes Por exemplo os circuitos CMOS favorecem portas NAND e NOR pois essas portas podem ser construídas diretamente por transistores CMOS sem que portas NOT extra sejam necessárias Quando portas NAND e NOR são utilizadas a técnica dos empurrões de bolha é útil para acompanhar as inversões Capítulo dois Projeto de Lógica Combinatória 124 As portas lógicas são combinadas para produzir circuitos maiores como multiplexadores decodificadores e circuitos de prioridade Um multiplexador escolhe uma das entradas de dados baseado numa entrada de seleção Um decodificador leva uma das saídas para nível HIGH de acordo com as entradas Um circuito de prioridade produz uma saída indicando qual a entrada de maior prioridade Todos esses circuitos são exemplos de blocos combinatórios O Capítulo 5 irá introduzir mais blocos lógicos incluindo outros circuitos aritméticos Esses blocos serão utilizados extensivamente para construir um microprocessador no Capítulo 7 A especificação de temporização de um circuito combinatório consiste nos atrasos de propagação e contaminação do circuito Estes indicam os maiores e menores tempos entre uma mudança na entrada e a consequente mudança na saída Calcular o atraso de propagação de um circuito envolve identificar o caminho crítico através do circuito e então adicionar os atrasos de propagação para cada elemento ao longo do caminho Existem muitas maneiras diferentes de se implementar circuitos combinatórios complicados essas maneiras oferecem compensações entre velocidade e custo O próximo Capítulo irá se deslocar para os circuitos sequenciais nos quais as saídas dependem tanto dos valores atuais como os valores anteriores das entradas Por outras palavras circuitos sequenciais possuem memória do passado Capítulo dois Projeto de Lógica Combinatória 125 Exercícios Exercício 21 Escreva a equação Booleana na forma canônica de soma de produtos para cada uma das tabelas verdade na Figura 280 Figura 280 Tabelas verdade para os Exercício 21 e Exercício 23 Exercício 22 Escreva a equação Booleana na forma canônica de soma de produtos para cada uma das tabelas verdade na Figura 281 Capítulo dois Projeto de Lógica Combinatória 126 Figura 281 Tabelas verdade para os Exercício 22 e Exercício 24 Exercício 23 Escreva a equação Booleana na forma canônica de produto das somas para cada uma das tabelas verdade na Figura 280 Exercício 24 Escreva a equação Booleana na forma canônica de produto das somas para cada uma das tabelas verdade na Figura 281 Exercício 25 Minimize cada uma das equações Booleanas do Exercício 21 Exercício 26 Minimize cada uma das equações Booleanas do Exercício 22 Capítulo dois Projeto de Lógica Combinatória 127 Exercício 27 Esboce um circuito combinatório razoavelmente simples implementando cada uma das funções do Exercício 25 Razoavelmente simples significa que o leitor não vai desperdiçar portas lógicas mas tampouco vai gastar muito tempo verificando cada possível implementação para o circuito Exercício 28 Esboce um circuito combinatório razoavelmente simples implementando cada uma das funções do Exercício 26 Exercício 29 Repita o Exercício 27 usando apenas portas NOT AND e OR Exercício 210 Repita o Exercício 28 usando apenas portas NOT AND e OR Exercício 211 Repita o Exercício 27 usando apenas portas NOT N AND e NOR Exercício 212 Repita o Exercício 28 usando apenas portas NOT NAND e NOR Exercício 213 Simplifique as seguintes equações Booleanas utilizando os teoremas Booleanos Verifique se as respostas estão corretas utilizando uma tabela verdade ou um Kmap a 𝑌 𝐴𝐶 𝐴𝐵𝐶 b 𝑌 𝐴𝐵 𝐴𝐵𝐶 𝐴 𝐶 c 𝑌 𝐴𝐵𝐶𝐷 𝐴𝐵𝐶 𝐴𝐵𝐶𝐷 𝐴𝐵𝐷 𝐴𝐵𝐶𝐷 𝐵𝐶𝐷 𝐴 Capítulo dois Projeto de Lógica Combinatória 128 Exercício 214 Simplifique as seguintes equações Booleanas utilizando os teoremas Booleanos Verifique se as respostas estão corretas utilizando uma tabela verdade ou um Kmap a 𝑌 𝐴𝐵𝐶 𝐴𝐵𝐶 b 𝑌 𝐴𝐵𝐶 𝐴𝐵 c 𝑌 𝐴𝐵𝐶𝐷 𝐴𝐵𝐶𝐷 𝐴 𝐵 𝐶 𝐷 Exercício 215 Esboce um circuito combinatório relativamente simples implementando cada uma das funções do Exercício 213 Exercício 216 Esboce um circuito combinatório relativamente simples implementando cada uma das funções do Exercício 214 Exercício 217 Simplifique cada uma das seguintes equações Booleanas Esboce um circuito combinatório relativamente simples implementando a equação simplificada a 𝑌 𝐵𝐶 𝐴𝐵𝐶 𝐵𝐶 b 𝑌 𝐴 𝐴𝐵 𝐴𝐵 𝐴 𝐵 c 𝑌 𝐴𝐵𝐶 𝐴𝐵𝐷 𝐴𝐵𝐸 𝐴𝐶𝐷 𝐴𝐶𝐸 𝐴 𝐷 𝐸 𝐵𝐶𝐷 𝐵𝐶𝐸 𝐵𝐷𝐸 𝐶𝐷𝐸 Exercício 218 Simplifique cada uma das seguintes equações Booleanas Esboce um circuito combinatório relativamente simples implementando a equação simplificada a 𝑌 𝐴𝐵𝐶 𝐵𝐶 𝐵𝐶 b 𝑌 𝐴 𝐵 𝐶 𝐷 𝐴𝐷 𝐵 c 𝑌 𝐴𝐵𝐶𝐷 𝐴𝐵𝐶𝐷 𝐵 𝐷 𝐸 Capítulo dois Projeto de Lógica Combinatória 129 Exercício 219 Dê um exemplo de uma tabela verdade que requer entre 3 e 5 bilhões de linhas e pode ser construída utilizandose menos de 40 mas pelo menos 1 portas de duas entradas Exercício 220 Dê um exemplo de um circuito com um caminho cíclico e que mesmo assim é combinatório Exercício 221 Alyssa P Hacker diz que qualquer função Booleana pode ser escrita na forma mínima de soma de produtos como uma soma de todos os implicantes primos da função Ben Bitdiddle diz que existem algumas funções para as quais as suas equações mínimas não envolvem todos os implicantes primos Explique por que Alyssa está certa ou dê um contraexemplo demostrando o ponto de Ben Exercício 222 Prove que os teoremas a seguir são verdadeiros utilizando indução perfeita O leitor não precisará provar seus duais a O teorema da idempotência T3 b O teorema da distributividade T8 c O teorema da cominação T10 Exercício 223 Prove o Teorema de De Morgan T12 para três variáveis 𝐵1 𝐵2 𝐵0 utilizando indução perfeita Exercício 224 Escreva equações Booleanas para o circuito da Figura 282 O leitor não precisará minimizar as equações Capítulo dois Projeto de Lógica Combinatória 130 Figura 282 Esquemático do circuito Exercício 225 Minimize as equações Booleanas do Exercício 224 e esboce um circuito melhorado com a mesma função Exercício 226 Utilizando portas equivalentes de De Morgan e métodos de empurrão de bolha redesenhe o circuito da Figura 283 a fim de que o leitor possa encontrar a equação Booleana por inspeção Escreva a equação Booleana Figura 283 Circuito esquemático Capítulo dois Projeto de Lógica Combinatória 131 Exercício 227 Repita o Exercício 226 para o circuito da Figura 284 Figura 284 Circuito esquemático Exercício 228 Encontre a equação Booleana mínima para a função na Figura 285 Lembrese de tirar vantagem das entradas dont care Figura 285 Tabela verdade do exercício 228 Exercício 229 Esboce um circuito para a função do Exercício 228 Capítulo dois Projeto de Lógica Combinatória 132 Exercício 230 O seu circuito feito no Exercício 229 tem algum glitch potencial quando uma das entradas varia Se não explique porque não Se sim mostre como modificar o circuito para eliminar os glitches Exercício 231 Encontre a equação Booleana mínima para a função na Figura 286 Lembrese de tirar vantagem das entradas dont care Figura 286 Tabela verdade do exercício 231 Exercício 232 Esboce um circuito para a função lógica do Exercício 231 Exercício 233 Ben Bitdiddle vai aproveitar seu piquenique em dias ensolarados e sem formigas Ele também vai aproveitar o seu piquenique em qualquer dia que haja um beija flor assim como em dias que existam formigas e joaninhas Escreva uma equação Booleana para seu aproveitamento A em termos do Sol S das formigas F dos beija flores B e das joaninhas J Capítulo dois Projeto de Lógica Combinatória 133 Exercício 234 Complete o projeto do decodificador de sete segmentos 𝑆𝑐 através de 𝑆𝑔 ver Exercício 210 a Derive equações Booleanas para as saídas 𝑆𝑐 através de 𝑆𝑔 assumindo que entradas maiores do que 9 produzem entradas em branco 0 b Derive equações Booleanas para as saídas 𝑆𝑐 através de 𝑆𝑔 assumindo que entradas maiores do que 9 são consideradas dont cares c Esboce um a implementação a nível de portas lógicas relativamente simples do item b Saídas múltiplas podem ser compartilhadas quando apropriado Exercício 235 Um circuito possui quatro entradas e duas saídas As entradas 𝐴30 representa um número de 0 a 15 A saída 𝑃 deve ser TRUE se o número for primo 0 e 1 não são primos mas 235 e assim por diante são A saída 𝐷 deve ser TRUE se o número for divisível por 3 Dê equações Booleanas simplificadas para cada saída e esboce o circuito Exercício 236 Um codificador de prioridades possui 2𝑁 entradas Ele produz uma saída binária de Nbits indicando se o bit mais significativo da entrada é TRUE ou 0 se nenhuma das entradas for TRUE Ele também produz uma saída NONE que é TRUE se nenhuma das entradas é TRUE Projete um codificador de prioridade de oito entradas com entradas 𝐴70 e saídas 𝑌20 e NONE Por exemplo se as entradas são 00100000 a saída 𝑌 deve ser 101 e NONE deve ser 0 Forneça a equação Booleana simplificada para cada saída e esboce o esquemático Exercício 237 Projete um codificador de prioridades modificado veja o Exercício 236 que recebe uma entrada de 8 bits e produz duas saídas de 3 bits 𝑌20 e 𝑍20 𝑌 indica que o bit mais significativo da entrada é TRUE 𝑍 indica que o segundo bit mais significativo da entrada é TRUE 𝑌 deve ser 0 se nenhuma das entradas é TRUE 𝑍 deve ser 0 não mais que uma das entradas é VERDADEIRO Dê a equação Booleana simplificada para cada saída e esboce o esquemático Capítulo dois Projeto de Lógica Combinatória 134 Exercício 238 Um código de termômetro de M bits para o número k consiste de k bits 1 nas posições menos significativas e M k bits 0 em todos outros bits significativos Um código conversor de binário para termômetro tem N entradas e 2𝑁1 saídas Ele produz um código de termômetro de 2𝑁1 bits para o número especificado na entrada Por exemplo se as entradas são 110 a saída deve ser 0111111 Projete um conversor de código binário para termômetro 37 Dê a equação Booleana simplificada para cada saída e esboce o esquemático Exercício 239 Escreva a equação Booleana minimizada para a função realizada pelo circuito na Figura 287 Figura 287 Circuito multiplexador Exercício 240 Escreva a equação Booleana minimizada para a função realizada pelo circuito na Figura 288 Figura 288 Circuito multiplexador Exercício 241 Implemente a função da Figura 280 b utilizando a Um multiplexador 81 Capítulo dois Projeto de Lógica Combinatória 135 b Um multiplexador 41 e uma inversora c Um multiplexador 21 e duas outras portas lógicas Exercício 242 Implemente a função do Exercício 217 a utilizando Um multiplexador 81 Um multiplexador 41 e uma inversora Um multiplexador 21 e duas outras portas lógicas Exercício 243 Determine o atraso de propagação e o atraso de contaminação do circuito na Figura 283 Use os atrasos de porta dados na Tabela 28 Exercício 244 Determine o atraso de propagação e o atraso de contaminação do circuito na Figura 284 Use os atrasos de porta dados na Tabela 28 Tabela 28 Atrasos de porta para os Exercício 243 Exercício 247 Capítulo dois Projeto de Lógica Combinatória 136 Exercício 245 Esboce o esquemático para um decodificador rápido 38 Suponha que os atrasos de porta são dados pela Tabela 28 e apenas as portas daquela tabela estão disponíveis Projete seu decodificador para que ele tenha o menor caminho crítico possível e indique qual caminho é esse Quais são os atrasos de propagação e de contaminação Exercício 246 Projete novamente o circuito do Exercício 235 para que ele seja o mais rápido possível Utiliza apenas as portas da Tabela 28 Esboce o novo circuito e indique qual o caminho crítico Quais são os atrasos de propagação e de contamination Exercício 247 Projete novamente o circuito do Exercício 236 para que ele seja o mais rápido possível Utiliza apenas as portas da Tabela 28 Esboce o novo circuito e indique qual o caminho crítico Quais são os atrasos de propagação e de contamination Exercício 248 Projete um multiplexador 81 com o menor atraso possível das entradas de dados para a saída O leitor pode utilizar qualquer uma das portas da Tabela 27 Esboce o esquemático Utilizando os atrasos de porta dados pela tabela determine o atraso total Capítulo dois Projeto de Lógica Combinatória 137 Questões de Entrevista Essas perguntas foram feitas em entrevistas para trabalhos de projeto digital Pergunta 21 Esboce um esquema para a função XOR de duas entradas usando apenas portas NAND Apenas quantos pode usar Pergunta 22 Projete um circuito que vai dizer se um determinado mês tem 31 dias O mês é especificado por uma entrada de 4bits A30 Por exemplo se as entradas são 0001 o mês é janeiro e se as entradas são 1100 o mês é dezembro A saída Y circuito deve ser ativada apenas quando o mês especificado pelas entradas tem 31 dias nele Escreva a equação simplificada e desenhe o diagrama de circuito utilizando um número mínimo de portas Dica Lembrese de tirar proveito das condições dont care Pergunta 23 O que é um buffer tristate Como e porque é usado Pergunta 24 Uma porta ou conjunto de portas é universal se pode ser usado para construir qualquer função Booleana Por exemplo o conjunto AND OR NOT é universal a Uma porta AND por si só é universal Porque o é ou porque o não é b É o conjunto OR NOT universal Porque o é ou porque o não é c É a porta NAND por si só universal Porque o é ou porque o não é Capítulo dois Projeto de Lógica Combinatória 138 139 3 Projeto de Lógica Digital 31 INTRODUÇÃO No último Capítulo demonstramos como analisar e projetar lógica combinatória A saída da lógica combinatória depende apenas dos valores atuais das entradas Dada uma especificação sob a forma de tabela verdade ou equação booleana podemos criar um circuito otimizado que observa as especificações Neste Capítulo vamos analisar e projetar lógica sequencial As saídas da lógica sequencial dependem tanto dos atuais valores da entrada como dos anteriores Assim a lógica sequencial tem memória A lógica sequencial pode lembrarse explicitamente de certas entradas anteriores ou pode refinar as entradas anteriores numa quantidade menor de informação chamada de estado do sistema O estado de um circuito sequencial digital é definido por um conjunto de bits designado de variáveis de estado que contêm todas as informações sobre o passado necessárias para explicar o comportamento futuro do circuito O Capítulo começa por estudar básculas e flipflops que são circuitos sequenciais simples que armazenam o estado de um bit Em geral os circuitos sequenciais possuem uma análise complexa Para simplificar o projeto vamos disciplinarmonos a construir apenas circuitos sequenciais síncronos formados por lógica combinatória e bancos de flipflops que contêm o estado do circuito O Capítulo descreve máquinas de estados finitos que são uma maneira fácil de projetar circuitos sequenciais Finalmente analisamos a velocidade dos circuitos sequenciais e discutimos o paralelismo como uma forma de aumentar a velocidade Capítulo três Projeto de Lógica Digital 140 32 BÁSCULAS E FLIPFLOPS O bloco de construção fundamental de memória é um elemento biestável um elemento com dois estados estáveis A Figura 31 a mostra um elemento biestável simples consistindo de um par de inversores ligados em realimentação A Figura 31 b mostra o mesmo circuito redesenhado para enfatizar a simetria Os inversores estão numa configuração crosscoupled o que significa que a entrada de I1 é a saída de I2 e vice versa O circuito não tem entradas mas possui duas saídas Q e Q Figura 31 Par de inversores crosscoupled A análise deste circuito é diferente da análise de um circuito combinatória porque é cíclica Q depende de 𝑄 e 𝑄 depende Q Considere os dois casos Q é 0 ou Q é 1 Trabalhando com as consequências de cada caso temos Caso I Q 0 Como mostrado na Figura 32 a I2 recebe uma entrada FALSE Q de modo que produz uma saída de TRUE em 𝑄 I1 recebe uma entrada TRUE 𝑄 de modo que produz uma saída FALSE em Q Isto é consistente com a suposição inicial que Q 0 de modo que este caso é estável Caso II Q 1 Como mostrado na Figura 32 b I2 recebe uma entrada TRUE e produz uma saída FALSE em 𝑄 I1 recebe uma entrada FALSE e produz uma saída TRUE em Q Este caso é novamente estável Da mesma forma que Y é vulgarmente usado para a saída da lógica combinatória Q é comumente utilizada para a saída da lógica sequencial Capítulo três Projeto de Lógica Digital 141 Figura 32 Operação biestável de um par de inversores crosscoupled Dado que os inversores crosscoupled têm dois estados estáveis Q 0 e Q 1 o circuito é dito biestável Um ponto subtil é que o circuito tem um terceiro estado possível com ambas as saídas aproximadamente a meio caminho entre 0 e 1 Isso é designado por estado metaestável e será discutido na Seção 354 Um elemento com N estados estáveis transmite log2N bits de informação de modo que um elemento biestável armazena 1 bit O estado dos inversores crosscoupled está contido numa variável de estado binário Q O valor de Q diznos tudo sobre o passado que é necessário para explicar o comportamento futuro do circuito Especificamente se Q 0 ele permanecerá para sempre a 0 e se Q 1 ele permanecerá a 1 para sempre O circuito tem um outro nó 𝑄 mas 𝑄 não contêm qualquer informação adicional porque se Q é conhecido 𝑄 também é conhecido Por outro lado 𝑄 é também uma opção aceitável para a variável de estado Quando a energia é aplicada pela primeira vez a um circuito sequencial o estado inicial é desconhecido e geralmente imprevisível Ele pode ser diferente de cada vez que o circuito seja ligado Embora os inversores crosscoupled possam armazenar 1 bit de informação eles não são práticos porque o utilizador não tem entradas para controlar o estado No entanto outros elementos biestáveis tais como básculas e flipflops disponibilizam entradas para controlar o valor da variável de estado O restante desta secção considera estes circuitos 321 Báscula SR Um dos circuitos sequenciais mais simples é a báscula SR a qual é composta por duas portas NOR na configuração crosscoupled tal como mostrado na Figura 33 A básculas tem duas entradas S e R e duas saídas Q e 𝑄 A báscula SR é semelhante ao inversor crosscouple mas o seu estado pode ser controlado através das entradas S e R que fazem set e reset da saída Q Capítulo três Projeto de Lógica Digital 142 Figura 33 Esquema de uma báscula RS Uma boa maneira de entender um circuito desconhecido é analisar a sua tabela verdade de modo que é por onde vamos começar Lembrese que uma porta NOR produz uma saída FALSE quando uma entrada for TRUE Considere as quatro possíveis combinações de R e S Caso I R 1 S 0 N1 vê finalmente uma entrada TRUE R de modo que produz uma saída FALSE em Q N2 vê ambos Q e S FALSE por isso produz uma saída TRUE em 𝑄 Caso I II R 0 S 1 N1 recebe entradas de 0 e 𝑄 Porque nós ainda não sabemos 𝑄 não podemos determinar a saída Q N2 recebe finalmente uma entrada TRUE S por isso produz uma saída FALSE em 𝑄 Agora podemos revisitar N1 sabendo que ambas as entradas são FALSE então a saída Q é TRUE Caso III R 1 S 1 N1 e N2 veem finalmente uma entrada TRUE R ou S de modo que cada uma produz uma saída FALSE Daí Q e 𝑄 serem ambas FALSE Caso IV R 0 S 0 N1 recebe a entradas de 0 e 𝑄 Porque nós ainda não sabemos 𝑄 não podemos determinar a saída N2 recebe entradas de 0 e Q Porque nós ainda não sabemos Q não podemos determinar a saída Agora estamos presos Esta é uma reminiscência dos inversores crosscoupled Mas sabemos que Q deve ser 0 ou 1 Assim podemos resolver o problema verificando o que acontece em cada uma destes subcasos Capítulo três Projeto de Lógica Digital 143 Caso IVa Q 0 Dado que S e Q são FALSE N2 produz uma saída TRUE em Q como mostrado na Figura 34 a Agora N1 recebe uma entrada TRUE Q então a sua saída Q é FALSE da mesma forma que tínhamos assumido Caso IVb Q 1 Uma vez que Q é TRUE N2 produz uma saída FALSE em 𝑄 como mostrado na Figura 34 b Agora N1 recebe duas entradas FALSE R e 𝑄 logo sua saída Q é TRUE da mesma forma que tínhamos assumido Figura 34 Estados biestáveis de uma báscula SR Colocando tudo junto suponha que Q tem algum valor antes conhecido a que chamaremos Qprev antes de entrarmos no caso IV Qprev é 0 ou 1 e representa o estado do sistema Quando R e S são 0 Q vaise lembrar deste antigo valor Qprev e 𝑄 será o seu complemento 𝑄𝑝𝑟𝑒𝑣 Este circuito tem memória A tabela verdade da Figura 35 resume esses quatro casos As entradas S e R significam Set e Reset Fazer set de 1 bit significa tornálo TRUE Fazer reset de 1 bit significa tornálo FALSE As saídas Q e 𝑄 são normalmente complementares Quando R é ativo Q faz reset a 0 e 𝑄 faz o contrário Quando S é ativo Q é definido como 1 e 𝑄 faz o contrário Quando nenhuma entrada está ativa Q lembra o seu antigo valor Qprev Ativando S e R simultaneamente não faz muito sentido porque isso significa que a báscula deve ser ligada e desligada ao mesmo tempo o que é impossível O circuito responde levando ambas as saídas 0 Capítulo três Projeto de Lógica Digital 144 Figura 35 Tabela verdade de uma báscula SR Figura 36 Símbolo de uma báscula SR A báscula SR é representada pelo símbolo na Figura 36 Usar o símbolo é uma aplicação de abstração e modularidade Existem várias maneiras de construir uma báscula SR tais como o uso de diferentes portas lógicas e transístores No entanto qualquer elemento do circuito com o relacionamento especificado pela tabela verdade na Figura 35 e o símbolo na Figura 36 é chamado de báscula SR Como os inversores crosscoupled a báscula SR é um elemento biestável com 1 bit de estado armazenado em Q No entanto o estado pode ser controlado através das entradas S e R Quando R é ativado o estado é reposto a 0 Quando S é ativado o estado é definido como 1 Quando nenhuma das entradas é ativada o estado mantém o seu valor antigo Observe que toda a história das entradas pode ser avaliada pela variável única de estado Q Não importa o padrão de set ou reset ocorrido no passado tudo o que é necessário para prever o comportamento futuro da báscula SR é se ela esteve mais recentemente set ou reset 322 Báscula D A báscula SR é perigosa porque ela tem um comportamento estranho quando ambas as entradas S e R são ativadas simultaneamente Além disso as entradas S e R confundem as questões de o quê e quando Ativando uma das entradas determina não apenas o que o estado deve ser mas também quando se deve mudar Projetar circuitos tornase mais fácil quando essas perguntas sobre o quê e quando estão separadas Capítulo três Projeto de Lógica Digital 145 A báscula D na Figura 37 a resolve estes problemas Ela tem duas entradas A entrada de dados D controla qual deve ser o próximo estado A entrada de clock CLK controla quando o estado deve mudar Mais uma vez analisamos a báscula escrevendo a tabela verdade dada na Figura 37 b Por conveniência consideramos em primeiro lugar os nós internos 𝐷 S e R Se CLK 0 S e R são FALSE independentemente do valor de D Se CLK 1 uma porta AND irá produzir TRUE e outra FALSE dependendo do valor de D Dado S e R Q e 𝑄 são determinados usando a Figura 35 Observe que quando CLK 0 Q lembra o seu antigo valor Qprev Quando CLK 1 Q D Em todos os casos o símbolo 𝑄 representa o complemento de Q como é lógico A báscula D evita o perigoso caso de simultaneamente ativar as entradas R e S Juntando tudo vemos que o relógio controla quando os dados fluem através da báscula Quando CLK 1 a báscula está transparente Os dados em D fluem através de Q como se a báscula fosse apenas um buffer Quando CLK 0 a báscula está opaca Ela bloqueia os novos dados de fluírem para Q e Q mantém o valor antigo Assim a báscula D é às vezes chamada de báscula transparente ou uma báscula sensível ao nível O símbolo da báscula D é fornecido na Figura 37 c A báscula D atualiza o seu estado continuamente enquanto CLK 1 Veremos mais tarde neste Capítulo que é útil atualizar o estado somente num instante específico no tempo O flipflop D descrito na próxima seção faz exatamente isso Figura 37 báscula D a esquema b tabela verdade c símbolo Algumas pessoas preferem usar báscula aberta ou fechada em vez de transparente ou opaca No entanto achamos que esses termos são ambíguos aberto significa transparente como uma porta aberta ou opaco como um circuito aberto Capítulo três Projeto de Lógica Digital 146 323 Flipflop D Um flipflop D pode ser construído a partir de duas básculas D controladas por relógios complementares como se mostra na Figura 38 a A primeira báscula L1 é chamada de mestre A segunda báscula L2 é chamada de escravo O nó entre elas é chamado de N1 Um símbolo para o flipflop D é dado na Figura 38 b Quando a saída 𝑄 não é necessária o símbolo é frequentemente condensado como na Figura 38 c Quando o CLK 0 a báscula mestre está transparente e o escravo está opaco Portanto qualquer que seja o valor em D é propagado para N1 Quando CLK 1 o mestre tornase opaco e o escravo tornase transparente O valor em N1 é propagado para Q mas N1 é cortado de D Assim o valor que estava em D imediatamente antes que o relógio efetuasse a transição de 0 para 1 é copiado para Q imediatamente após a subida do relógio Em todas as outras vezes Q mantém o seu valor antigo porque há sempre uma báscula opaca bloqueando o caminho entre D e Q Por outras palavras um flipflop D cópia o nível lógico de D para Q na borda ascendente do relógio e relembra o seu estado em todas as outras vezes Releia esta definição até que a tenha memorizado um dos problemas mais comuns para projetistas digitais iniciantes é esquecer o que um flipflop faz A borda ascendente do relógio é muitas vezes chamada abreviadamente de flanco do clock A entrada D especifica qual será o novo estado O clock indica quando o estado deve ser atualizado Figura 38 Flipflop D a esquemático b símbolo c símbolo condensado A distinção precisa entre flipflops e báscula é um pouco confusa e evoluiu ao longo do tempo No uso comum da indústria um flipflop é disparado por borda Em outras palavras é um elemento biestável com uma entrada de relógio O estado das mudanças do flipflop apenas em resposta a um relógio como quando o relógio sobe de 0 a 1 Um elemento biestável sem um relógio disparado por borda é comumente chamado de básculas O termo flipflop ou báscula por si só geralmente referese a uma báscula D ou flipflop D respectivamente porque estes são os tipos mais comumente utilizados na prática Capítulo três Projeto de Lógica Digital 147 Exemplo 31 CONTAGEM DE TRANSÍSTORES NUM FLIPFLOP Quantos transístores são necessários para construir o flipflop D descrito nesta seção Solução Uma porta NAND ou NOR usa quatro transístores Uma porta NOT utiliza dois transístores Uma porta AND é construída a partir de uma NAND e outra NOT pelo que ela usa seis transístores A báscula SR usa duas portas NOR ou seja oito transístores A báscula D usa uma báscula SR duas portas AND e uma porta NOT ou seja 22 transístores O flipflop D usa duas básculas D e uma porta NOT ou seja 46 transístores A Secção 327 descreve uma implementação CMOS mais eficiente usando portas de transmissão Um flipflop D é também conhecido como um flipflop mestreescravo um flipflop disparado por borda ou um flipflop disparado por borda positiva O triângulo nos símbolos denota uma entrada de relógio disparado por borda A saída 𝑄 é muitas vezes omitida quando ela não é necessária 324 Registro Um registro de Nbits é um banco de N flipflops que compartilham uma entrada CLK comum de modo que todos os bits do registro são atualizados em simultâneo Os registros são os alicerces fundamentais da maioria dos circuitos sequenciais A Figura 39 mostra o esquema e o símbolo para um registro de quatro bits com entradas D30 e saídas Q30 D30 e Q30 são dois barramentos de 4bits 325 Enabled FlipFlop Um enabled flipflop possui outra entrada chamada EN ou habilitar para determinar se os dados são carregados na transição do relógio Quando EN é TRUE o enabled flipflop comportase como um flipflop D comum Quando EN é FALSE o enabled flipflop ignora o relógio e mantém o seu estado Os enabled flip flops são úteis quando se deseja carregar um novo valor para um flipflop apenas em algumas das vezes em vez de a cada transição do relógio Figura 39 Registro de 4bits a esquemático b símbolo Capítulo três Projeto de Lógica Digital 148 A Figura 310 mostra duas maneiras de construir um enabled flipflop a partir de um flipflop D e uma porta extra Na Figura 310 a um multiplexador de entrada escolhe se se deve passar o valor de D se EN é TRUE ou para reciclar o velho estado de Q se EN é FALSE Na Figura 310 b o relógio passa por uma porta lógica Se EN é TRUE a entrada CLK para o flipflop comuta normalmente Se EN é FALSE a entrada CLK também é FALSE e o flipflop mantém o seu valor antigo Observe que EN não deve mudar enquanto CLK 1 para que o flipflop veja um glitch no relógio comutação num momento incorreto Geralmente executar lógica no relógio é uma má ideia Fazer passar o relógio por uma porta atrasa o relógio e pode causar erros temporais como veremos na Seção 353 assim devemos fazêlo apenas se houver a certeza de que se sabe o que se está a fazer O símbolo para um enabled flipflop é dado na Figura 310 c Figura 310 Enabled flipflop ab esquemáticos c símbolo 326 Resettable FlipFlop Um resettable flipflop possui outra entrada chamada RESET Quando RESET for FALSE o resettable flip flop comportase como um flipflop D comum Quando RESET for TRUE o Resettable flipflop ignora D e repõe a saída para 0 Os resettable flipflops são úteis quando queremos forçar um estado conhecido ou seja 0 em todos os flipflops num sistema quando ligado pela primeira vez Estes flipflops podem ser síncronos ou assíncronos Os resettable flipflop síncronos fazem reset a eles próprios apenas no flanco ascendente do relógio CLK Os resettable flipflop assíncronos fazem reset a eles próprios logo que RESET se torne TRUE independente do CLK Capítulo três Projeto de Lógica Digital 149 A Figura 311 a mostra como construir um resettable flipflop síncrono através de um flipflop D comum e uma porta AND Quando 𝑅𝐸𝑆𝐸𝑇 for FALSE a porta AND força um 0 na entrada do flipflop Quando 𝑅𝐸𝑆𝐸𝑇 for TRUE a porta AND passa D ao flipflop Neste exemplo 𝑅𝐸𝑆𝐸𝑇 é um sinal activo a baixo o que significa que o sinal de reset executa a sua função quando está a 0 e não a 1 Ao adicionar um inversor o circuito poderia ter aceite em alternativa um sinal de reset activo a baixo A Figura 311 b e Figura 311 c mostram os símbolos para um resettable flipflop com reset activo a alto Figura 311 Resettable flipflop síncrono a esquemáticos b c símbolos Um resettable flipflop assíncrono requer modificar a estrutura interna do flipflop e são deixados para que o leitor o possa projetar no Exercício 313 no entanto eles estão frequentemente disponíveis para o projetista como um componente padrão Como o leitor pode imaginar os settable flipflops também são usados ocasionalmente Eles carregam um 1 no flipflop quando SET é ativado e também estão disponíveis na versão síncronas e assíncronas Os resettable e settable flipflop também podem ter uma entrada de habilitação e podem ser agrupados em registros de Nbit 327 Projeto de Básculas e FlipFlops a Nível do Transístor O Exemplo 31 mostrou que básculas e flipflops exigem um grande número de transístores quando construídas a partir de portas lógicas Mas o papel fundamental de uma báscula é ser transparente ou Capítulo três Projeto de Lógica Digital 150 opaca muito parecido com um interruptor Lembrese da secção 177 em que uma porta de transmissão é uma forma eficiente de construir um interruptor CMOS então podemos esperar que poderíamos tirar proveito das portas de transmissão para reduzir a contagem do transístor Uma báscula compacta D pode ser construída a partir de uma única porta de transmissão como mostrado na Figura 312 a Quando CLK 1 e 𝐶𝐿𝐾 0 a porta de transmissão está ON então D flui para Q e a báscula está transparente Quando CLK 0 e 𝐶𝐿𝐾 1 a porta de transmissão está OFF então Q está isolado de D e a báscula está opaca Esta báscula sofre de duas grandes limitações Nó de saída flutuante Quando a báscula está opaca Q não é mantido no seu valor por nenhuma das portas Assim Q é chamado de nó flutuante ou dinâmico Depois de algum tempo ruído e corrente de fugas podem perturbar o valor de Q Sem buffer A ausência de buffers causou defeitos em vários produtos comerciais Um aumento de ruído que puxe D a uma tensão negativa pode ligar o transístor nMOS tornando a báscula transparente mesmo quando CLK 0 Da mesma forma um aumento de D acima de VDD pode ligar o transístor pMOS mesmo quando CLK 0 E a porta de transmissão é simétrica por isso pode conduzir para trás com o ruído em Q a afetar a entrada D A regra geral é que nem a entrada de uma porta de transmissão nem o nó de estado de um circuito sequencial pode ser continuamente exposto ao mundo exterior onde o ruído é provável A Figura 312 b mostra uma báscula D de 12 transístores mais robusta utilizada em chips comerciais modernos Ela ainda é construída em torno de uma porta de transmissão chaveada mas acrescenta inversores I1 e I2 para isolar a entrada e a saída O estado da báscula é realizado no nó N1 O inversor I3 e o buffer tristate T1 fornece realimentação para transformar N1 num nó estático Se uma pequena quantidade de ruído ocorre em N1 enquanto CLK 0 T1 irá conduzir N1 de volta para um valor lógico válido A Figura 313 mostra um flipflop D construído a partir de duas básculas estáticas controladas pelo CLK e 𝐶𝐿𝐾 Alguns inversores internos redundantes foram removidos de modo que o flipflop requer apenas 20 transístores Este circuito assume que CLK e 𝐶𝐿𝐾 estão ambos disponíveis Se não mais dois transístores são necessários para um inversor de CLK Capítulo três Projeto de Lógica Digital 151 Figura 312 Esquemático de uma báscula D Figura 313 Esquemático de um flipflop D 328 Colocando Tudo Junto Básculas e flipflops são os blocos fundamentais dos circuitos sequenciais Lembrese que uma báscula D é sensível ao nível enquanto que um flipflop D é disparado por borda A báscula D é transparente quando CLK 1 permitindo que a entrada D flua para a saída Q O flipflop D copia D para Q no flanco de subida de CLK Em todas as outras situações básculas e flipflops mantêm seu estado anterior Um registro é um banco de vários flipflops D que compartilham um sinal CLK comum Capítulo três Projeto de Lógica Digital 152 Exemplo 32 COMPARAÇÃO DE FLIPFLOPS E BÁSCULAS Ben Bitdiddle aplica as entradas CLK e D apresentados na Figura 314 a uma báscula D e a um flipflop D Ajude a determinar a saída Q de cada dispositivo Solução A Figura 315 mostra as formas de onda da saída assumindo um pequeno atraso para Q para responder às alterações da entrada As setas indicam a causa de mudança de uma saída O valor inicial de Q é desconhecido e pode ser 0 ou 1 como indicado pelo par de linhas horizontais Primeiro considerando a báscula No primeiro flanco de subida do CLK D 0 então Q definitivamente tornase 0 Sempre que D muda enquanto CLK 1 Q também o segue Quando D muda enquanto CLK 0 ele será ignorado Agora considere o flipflop Em cada flanco de subida do CLK D é copiado para Q Em todas as outras vezes Q mantém o seu estado Figura 314 Exemplo de forma de onda Figura 315 Forma de onda da solução Capítulo três Projeto de Lógica Digital 153 33 PROJETO DE LÓGICA SÍNCRONA Em geral os circuitos sequenciais incluem todos os circuitos que não são combinatórios ou seja aqueles cuja resultado não pode ser determinado simplesmente olhando para as entradas atuais Alguns circuitos sequenciais são simplesmente magníficos Esta seção começa por examinar alguns desses circuitos interessantes Em seguida introduz a noção de circuitos sequenciais síncronos e a disciplina dinâmica Disciplinandonos nós próprios nos circuitos sequenciais síncronos podemos desenvolver modos fáceis e sistemáticos para analisar e projetar sistemas sequenciais 331 Alguns Circuitos Problemáticos Exemplo 33 CIRCUITOS ASTÁVEIS Alyssa P Hacker encontrou três inversores interligados numa malha como se mostra na Figura 316 A saída do terceiro inversor é realimentado para o primeiro inversor Cada inversor tem um atraso de propagação de 1 ns Determinar o que o circuito faz Solução Suponha que o nó X está inicialmente a 0 Então Y 1 Z 0 e portanto X 1 o que é inconsistente com a nossa hipótese inicial O circuito não tem estados estáveis e dizse ser astável ou instável A Figura 317 apresenta o comportamento do circuito Se X sobe no instante 0 Y vai cair em 1 ns Z irá subir em 2 ns e X vai cair de novo em 3 ns Por sua vez Y vai subir em 4 ns Z vai cair em 5 ns e X vai subir novamente em 6 ns e em seguida o padrão irá se repetir Cada nó oscila entre 0 e 1 com um período tempo de repetição de 6 ns Este circuito é chamado um oscilador em anel O período do oscilador em anel depende do atraso de propagação de cada inversor Este atraso depende da forma como o inversor foi fabricado da tensão de alimentação e até mesmo da temperatura Portanto o período de funcionamento do anel oscilador é difícil de prever com precisão Em suma o oscilador em anel é um circuito sequencial com zero entradas e uma saída que muda periodicamente Figura 316 Três inversores em malha Capítulo três Projeto de Lógica Digital 154 Figura 317 Formas de onda do oscilador em anel Figura 318 Uma báscula D melhorada Figura 319 Formas de onda ilustrando as condições de corrida da báscula Capítulo três Projeto de Lógica Digital 155 Exemplo 34 CONDIÇÕES DE CORRIDA Ben Bitdiddle desenhou uma nova báscula D que alega ser melhor do que a da Figura 37 porque usa menos portas Ele escreveu a tabela verdade para encontrar a saída Q dadas as duas entradas D e CLK e o antigo estado da partida Qprv Com base nesta tabela verdade ele obteve as equações Booleanas Ele obtém Qprv realimentando a saída Q O seu projeto é mostrado na Figura 318 A sua báscula trabalha corretamente independente dos atrasos de cada porta Solução A Figura 319 mostra que o circuito tem uma condição de corrida que faz com que ele falhe quando certas portas são mais lentas do que outras Supondo CLK D 1 A báscula é transparente e passa D para fazer Q 1 Agora CLK cai A báscula devese lembrar do seu valor antigo mantendo Q 1 No entanto suponha que o atraso através do inversor de CLK para 𝐶𝐿𝐾 é bastante longo em comparação com os prazos de portas AND e OR Então os nós N1 e Q podem ambos cair antes que 𝐶𝐿𝐾 suba Nesse caso N2 nunca irá subir e Q fica preso a 0 Este é um exemplo de projeto de circuito assíncrono em que as saídas estão diretamente realimentadas para as entradas Os circuitos assíncronos são conhecidos por terem condições de corrida onde o comportamento do circuito depende de qual dos dois caminhos através de portas lógicas é mais rápido Um circuito pode trabalhar enquanto um aparentemente idêntico construído a partir de portas com atrasos um pouco diferentes pode não funcionar Ou o circuito pode funcionar apenas em determinadas temperaturas e tensões em que os atrasos estão corretos Estas avarias são extremamente difíceis de rastrear 332 Circuitos Sequenciais Síncronos Os dois exemplos anteriores contêm circuitos chamados caminhos cíclicos nos quais as saídas são realimentadas diretamente para as entradas Eles são circuitos sequenciais em vez de circuitos combinatórios A lógica combinatória não tem caminhos cíclicos e nem restrições de corrida Se as entradas são aplicadas à lógica de combinações as saídas terão sempre o valor correto dentro de um atraso de propagação No entanto os circuitos sequenciais com caminhos cíclicos podem ter corridas Capítulo três Projeto de Lógica Digital 156 indesejáveis ou comportamento instável A análise de problemas nesses circuitos é demorada e muitas pessoas brilhantes cometeram erros Para evitar estes problemas os projetistas quebram os caminhos cíclicos através da inserção de registros algures no caminho Isso transforma o circuito numa coleção de lógica combinatória e de registros Os registros contêm o estado do sistema que muda apenas no flanco do relógio por isso dizemos que o estado é sincronizado com o relógio Se o relógio é suficientemente lento de modo que as entradas para todos os registros estejam definidas antes da próxima transição de relógio todas as corridas são eliminados Adoptando esta disciplina de usar sempre registros no caminho de realimentação levanos à definição formal de um circuito sequencial síncrono Lembrese que um circuito é definido pelos seus terminais de entrada e de saída e pelas suas especificações funcionais e temporais Um circuito sequencial tem um conjunto finito de estados discretos S0 S1 Sk1 Um circuito sequencial síncrono tem uma entrada de relógio cujos flancos ascendentes indicam uma sequência de tempos em que as transições de estado ocorrem Muitas vezes usamos os termos estado atual e próximo estado para distinguir o estado do sistema no presente do estado em ele vai entrar na próxima transição de relógio A especificação funcional detalha o próximo estado e o valor de cada saída para cada combinação possível de valores de estado e de entrada atual A especificação de tempo consiste num limite superior tpcq e num limite inferior tccq do tempo entre o flanco de subida do relógio até que ocorram as mudanças na saída bem como a tempo de setup e hold tsetup e thold indicam quando as entradas devem estar estáveis em relação ao flanco de subida do relógio As regras de composição de circuitos sequenciais síncronos ensinamnos que um circuito é um circuito sequencial síncrono se ele possui elementos de circuito interligados de tal forma que Cada elemento do circuito ou é um registro ou um circuito combinatório Pelo menos um elemento do circuito é um registro Todos os registros recebem o mesmo sinal de relógio Cada percurso cíclico contém pelo menos um registro O tpcq representa o tempo de propagação do relógio para Q em que Q indica a saída do circuito sequencial síncrono O tccq significa o tempo de contaminação a partir do relógio para Q Estes são análogos ao tpd e tcd na lógica combinatória Esta definição de um circuito sequencial síncrono é suficiente mas mais restritiva do que o necessário Por exemplo em microprocessadores de alto desempenho alguns registros podem receber relógios atrasados para espremer o último bit de desempenho Da mesma forma alguns microprocessadores usam básculas em vez de registros No entanto a definição é adequada para todos os circuitos sequenciais síncronos abordados neste livro e para a maioria dos sistemas digitais comerciais Figura 320 Estado atual e próximo de flipflop Capítulo três Projeto de Lógica Digital 157 Circuitos sequenciais que não são síncronos são chamados de assíncronos Um flipflop é o mais simples circuito sequencial síncrono Ele tem uma entrada D um relógio CLK uma saída Q e dois estados 0 1 A especificação funcional de um flipflop é que o próximo estado é D e que a saída Q é o estado atual como mostrado na Figura 320 Nós muitas vezes designamos o estado atual de variável S e o próximo estado de variável 𝑆 Neste caso a linha depois do S indica o próximo estado não inversão A temporização de circuitos sequenciais será analisada na Seção 35 Dois outros tipos comuns de circuitos sequenciais síncronos são chamados de máquinas de estados finitos e pipelines Estes serão abordados mais adiante neste Capítulo Figura 321 Exemplos de circuitos Capítulo três Projeto de Lógica Digital 158 Exemplo 35 CIRCUITOS SEQUENCIAS SÍNCRONOS Qual dos circuitos da Figura 321 são circuitos sequenciais síncronos Solução O circuito a é combinatório e sequencial porque não tem registros O b é um circuito sequencial simples sem realimentação O c não é nem um circuito combinatório nem um circuito sequencial síncrono porque tem uma báscula que não é nem um registro nem um circuito combinatório Os circuitos d e e são circuitos síncronos de lógica sequencial são duas formas de máquinas de estados finitos que são discutidas na Seção 34 O circuito f não é nem sequencial combinatória nem síncrona porque tem um percurso cíclico a partir da saída da lógica combinatória volta para a entrada da mesma lógica mas sem um registro no caminho O circuito g é de lógica sequencial síncrona sob a forma de um pipeline que estudaremos na Seção 36 O circuito h não é falando rigorosamente um circuito sequencial síncrono porque o segundo registro recebe um sinal de relógio diferente do primeiro retardado por dois inversores de atraso 333 Circuitos Síncronos e Assíncronos O projeto de circuitos assíncronos em teoria é mais geral do que o projeto de circuitos síncronos porque a temporização do sistema não é limitada pelos registros de sincronização Assim como os circuitos analógicos são mais gerais do que os circuitos digitais pois os circuitos analógicos podem usar qualquer tensão os circuitos assíncronos são mais gerais do que circuitos síncronos porque eles podem usar qualquer tipo de realimentação No entanto os circuitos síncronos provaram ser mais fáceis de projetar e usar do que os circuitos assíncronos assim como os digitais são mais fáceis do que os circuitos analógicos Apesar de décadas de pesquisa sobre circuitos assíncronos praticamente todos os sistemas digitais são essencialmente síncronos Claro que os circuitos assíncronos às vezes são necessários quando se comunica entre sistemas com diferentes relógios ou quando se recebe entradas em tempos arbitrários assim como os circuitos analógicos são necessários ao se comunicar com o mundo real de tensões contínuas Além disso a investigação em circuitos assíncronos continua a gerar detalhes interessantes alguns dos quais podem melhorar muito os circuitos síncronos Capítulo três Projeto de Lógica Digital 159 34 MÁQUINAS DE ESTADOS FINITOS Os circuitos sequenciais síncronos podem ser desenhados nas formas apresentadas na Figura 322 Estas formas são chamadas de máquinas de estados finitos FSM Eles obtiveram este nome porque um circuito com k registros pode estar num de um número finito 2k de estados únicos Uma FSM tem entradas M N saídas e k bits de estado Ele também recebe um relógio e opcionalmente um sinal de reset Uma FSM é composta por dois blocos de lógica combinatória lógica do estado seguinte e lógica de saída e um registro que armazena o estado Em cada flanco do relógio a FSM avança para o próximo estado que foi calculado com base no estado atual e nas entradas Existem duas classes gerais de máquinas de estados finitos caracterizadas pelas suas especificações funcionais Nas máquinas de Moore as saídas dependem apenas do estado atual da máquina Nas máquinas de Mealy as saídas dependem tanto do estado atual e como das entradas atuais As máquinas de estados finitos fornecem uma forma sistemática de projetar circuitos sequenciais síncronos dada uma especificação funcional Este método irá ser explicado no restante desta secção começando com um exemplo 341 Projeto Exemplo de FSM Para ilustrar a concepção das FSM considere o problema de inventar um controlador para um semáforo num cruzamento movimentado no campus Os estudantes de engenharia estão a deambular entre os dormitórios e os laboratórios na Av Académica Eles estão ocupados lendo sobre as FSM nos seus livros favoritos e não estão olhando para onde estão indo Os jogadores de futebol estão a moverse apressadamente entre os campos de atletismo e sala de jantar em Blvd Bravado Eles estão jogando à bola para trás e para frente e não estão também olhando para onde estão indo Vários ferimentos graves já ocorreram no cruzamento destas duas ruas e o decano dos estudantes pede a Ben Bitdiddle para instalar um semáforo antes que haja mortes As máquinas de Moore e de Mealy receberam o nome dos seus inventores investigadores que desenvolveram a teoria de autómatos os fundamentos matemáticos das máquinas de estado na Bell Labs Edward F Moore 1925 2003 não deve ser confundido com o fundador da Intel Gordon Moore publicou seu artigo seminal Gedankenexperiments on Sequential Machines em 1956 Em seguida tornouse professor de matemática e ciência da computação na Universidade de Wisconsin George H Mealy publicou um método de síntese de circuitos sequenciais em 1955 Posteriormente ele escreveu o primeiro sistema operativo da Bell Labs para o computador IBM 704 Mais tarde ele se juntou à Universidade de Harvard Capítulo três Projeto de Lógica Digital 160 Figura 322 Máquinas de estados finitos a A máquina de Moore b máquina de Mealy Ben decide resolver o problema com uma FSM Ele instala dois sensores de tráfego TA e TB na Av Académica e no Blvd Bravado respectivamente Cada sensor indica TRUE se os alunos estão presentes e FALSE se a rua está vazia Ele também instala dois semáforos LA e LB para controlar o tráfego Cada luz recebe entradas digitais para especificar se ela deve estar verde amarela ou vermelha Por isso a sua FSM tem duas entradas TA e TB e duas saídas LA e LB O cruzamento com luzes e sensores são mostrados na Figura 323 Ben fornece um relógio com um período de 5 segundos Em cada pulso de relógio flanco ascendente as luzes podem mudar de acordo com os sensores de tráfego Ele também fornece um botão de reset para que os técnicos possam colocar o controlador num estado inicial conhecido ao ligálo A Figura 324 mostra uma vista da caixa preta da máquina de estados O próximo passo de Ben é esboçar o diagrama de transição de estado mostrado na Figura 325 para indicar todos os possíveis estados do sistema e as transições entre esses estados Quando o sistema é reiniciado as luzes estão verde na Av Académica e vermelho em Blvd Bravado A cada 5 segundos o controlador examina o padrão de tráfego e decide o que fazer a seguir Enquanto o tráfego está presente na Av Académico as luzes não mudam Quando já não existe tráfego na Av Académica a luz da Av Capítulo três Projeto de Lógica Digital 161 Académica tornase amarela durante 5 segundos antes de ficar vermelha e a luz do Blvd Bravado fica verde Da mesma forma a luz da Blvd Bravado permanece verde enquanto o tráfego está presente na avenida em seguida tornase amarela e eventualmente vermelha Figura 323 Mapa do campus Figura 324 Vista de caixa preta da máquina de estados finitos Capítulo três Projeto de Lógica Digital 162 Figura 325 Diagrama da transição de estados Num diagrama de transição de estado os círculos representam os estados e os arcos representam as transições entre estados As transições ocorrem no flanco ascendente do relógio que não é representado no diagrama porque ele está sempre presente num circuito sequencial síncrono Além disso o relógio controla quando devem ocorrer as transições enquanto que o gráfico indica que transições ocorrem O arco ilustrado apontando do espaço exterior para o estado S0 indica que o sistema deve entrar nesse estado após reset independentemente do estado anterior em que se encontrava Se um estado tem vários arcos deixandoo os arcos são rotulados para mostrar que entrada aciona cada transição Por exemplo quando no estado S0 o sistema irá permanecer nesse estado se TA é TRUE e passar para S1 se TA é FALSE Se um estado tem um único arco a deixálo a transição ocorre sempre independentemente das entradas Por exemplo quando no estado S1 o sistema irá sempre transitar para S2 Os valores que as saídas têm enquanto num determinado estado são indicados no estado Por exemplo enquanto no estado S2 LA é vermelha e LB é verde O Ben reescreve o diagrama de transição de estado como uma tabela de transição de estado Tabela 31 que indica para cada estado e entrada qual será o próximo estado S Note que a tabela usa o Observe que os estados são designados como S0 S1 etc As versões subscritas S0 S1 etc referem se aos bits de estado Capítulo três Projeto de Lógica Digital 163 símbolo X dont care sempre que o próximo estado não depende de uma entrada em particular Além disso note que Reset é omitido da tabela Em vez disso usamos resettable flipflops que sempre vão para o estado S0 quando reinicia independentes das entradas O diagrama de transição de estado é abstrato usando estados designadas S0 S1 S2 S3 e saídas designadas vermelha amarela verde Para construir um circuito real aos estados e às saídas devem ser atribuídas codificações binárias Ben escolhe as codificações dadas nas Tabela 32 e Tabela 33 Cada estado e cada saída são codificados com dois bits S10 LA10 e LB10 Tabela 31 Tabela de transição de estados Tabela 32 Codificação de estados Capítulo três Projeto de Lógica Digital 164 Tabela 33 Codificação das saídas O Ben actualiza a tabela de transição do estado para usar estas codificações binárias como mostra a Tabela 34 A tabela de transição de estado revista é uma tabela verdade especificando o próximo estado lógico Ela define o próximo estado S como uma função do estado actual S e das entradas A partir desta tabela é fácil serem lidas as equações Booleanas para o próximo estado na forma de soma de produtos 𝑆1 𝑆1 𝑆0 𝑆1𝑆0 𝑇𝐵 𝑆1𝑆0 𝑇𝐵 𝑆0 𝑆1 𝑆0𝑇𝐴 𝑆1𝑆0 𝑇𝐵 31 As equações podem ser simplificadas usando mapas de Karnaugh mas muitas vezes fazêlo por inspeção tornase mais fácil Por exemplo os termos TB e 𝑇𝐵 na equação S1 são claramente redundantes Assim S1 reduzse a uma operação XOR Equação 32 dá as equações simplificadas de próximo estados Tabela 34 Codificação binária das transições de estado Capítulo três Projeto de Lógica Digital 165 Tabela 35 Tabela de saída 𝑆1 𝑆1 𝑆0 𝑆0 𝑆1 𝑆0 𝑇𝐴 𝑆1𝑆0 𝑇𝐵 32 Da mesma forma Ben escreve uma tabela de saída Tabela 35 indicando para cada estado qual deve ser a saída nesse estado Novamente é fácil de serem lidas e simplificar as equações Booleanas para as saídas Por exemplo observar que LA1 é TRUE apenas nas linhas onde S1 é TRUE 𝐿𝐴 𝑆1 𝐿𝐴0 𝑆1 𝑆0 𝐿𝐴 𝑆1 𝐿𝐵0 𝑆1𝑆0 33 Finalmente Ben esboça a sua FSM de Moore na forma da Figura 322 a Em primeiro lugar ele desenha o registro de estado de dois bits como mostrado na Figura 326 a Em cada flanco do relógio o estado de registro copia o próximo estado S10 para se tornar o estado S10 O registro de estado recebe um reset síncrono ou assíncrono para inicializar a FSM no arranque Em seguida ele desenha a lógica do próximo estado com base na equação 32 que calcula o próximo estado a partir do estado atual e das entradas como mostrado na Figura 326 b Finalmente ele desenha a lógica de saída com base na equação 33 que calcula as saídas a partir do estado atual como mostrado na Figura 326 c A Figura 327 mostra um diagrama temporal que ilustra o controlador de semáforo passando por uma sequência de estados O diagrama mostra CLK Reset as entradas TA e TB o próximo estado S o estado S e as saídas LA e LB As setas indicam causalidade por exemplo alterando o estado faz com que Capítulo três Projeto de Lógica Digital 166 as saídas se alterem e mudando as entradas faz com que o próximo estado a mude As linhas a tracejado indicam os flancos ascendentes do CLK quando o estado muda Figura 326 Circuito da máquina de estados para o controlador de semáforo Figura 327 Diagrama temporal do controlador de semáforo Este esquema usa algumas portas AND com negações nas entradas Elas podem ser construídas com portas AND e inversores de entrada com portas NOR e inversores para as entradas não negadas ou com alguma outra combinação de portas A melhor escolha depende da tecnologia de implementação em particular Capítulo três Projeto de Lógica Digital 167 O relógio tem um período de 5 segundos assim os semáforos mudam no máximo uma vez a cada 5 segundos Quando a máquina de estados finitos é ligada pela primeira vez o seu estado é desconhecido como indicado pelos pontos de interrogação Portanto o sistema deve ser redefinido de modo a colocá lo num estado conhecido Neste diagrama temporal S é redefinido imediatamente para S0 indicando que os resettable flipflops assíncronos estão sendo usados No estado S0 a luz LA está verde e a luz LB está vermelha Neste exemplo o tráfego chega imediatamente na Av Académica Portanto o controlador permanece no estado S0 mantendo LA verde mesmo que o tráfego chegue no Blvd Bravado e inicia a espera Após 15 segundos todo o tráfego passou na Av Académica e TA cai No relógio seguinte o controlador segue para o estado S1 transformando LA em amarelo Em mais 5 segundos o controlador prossegue para o estado S2 em que LA fica vermelha e LB fica verde O controlador espera no estado S2 até que todo o tráfego na Blvd Bravado passe Ele então transita para S3 fazendo LB amarelo Depois de 5 segundos o controlador entra no estado S0 transformando LB em vermelho e LA em verde O processo repete indefinidamente 342 Codificação de Estados No exemplo anterior as codificações de estado e de saída foram selecionadas arbitrariamente Uma escolha diferente teria resultado num circuito diferente Uma pergunta natural é como determinar a codificação que produz o circuito com o menor número de portas lógicas ou o atraso de propagação mais curto Infelizmente não existe uma maneira simples de encontrar a melhor codificação exceto tentar todas as possibilidades o que é inviável quando o número de estados é elevado No entanto muitas vezes é possível escolher uma boa codificação por inspeção para que os estados ou as saídas relacionadas partilhem bits Ferramentas computeraided CAD são também boas na busca do conjunto de possíveis codificações e selecionando um razoável Uma decisão importante na codificação de estados é a escolha entre codificação binária e a codificação onehot Com codificação binária como foi usada no exemplo do controlador de semáforo cada estado está representado como um número binário Como os K números binários a poderem ser representados pelos log2K bits um sistema com K estados apenas necessita de log2K bits de estado Apesar dos melhores esforços de Ben os alunos não prestam atenção aos semáforos e as colisões continuam a ocorrer O decano dos estudantes perguntalhe a ele e à Alyssa para projetar uma catapulta para lançar os estudantes de engenharia diretamente para os telhados dos seus dormitórios através das janelas abertas do laboratório ignorando o cruzamento problemático Mas isso é assunto para outro livro Capítulo três Projeto de Lógica Digital 168 Na codificação onehot um bit separado de estado é usado para cada estado Chamase onehot porque apenas um bit está quente ou verdadeiro em qualquer momento Por exemplo uma FSM codificada em onehot com três estados teria codificações de estados de 001 010 e 100 Cada bit de estado é armazenado num flipflop então uma codificação onehot requer mais flipflops do que a codificação binária No entanto com a codificação onehot a lógica de próxima estado e saída é muitas vezes mais simples de modo que são necessários menos portas A melhor escolha de codificação depende do FSM específico Exemplo 36 CODIFICAÇÃO DOS ESTADOS DE UMA FSM Um contador de divisãoporN possui uma saída e não tem entradas A saída Y está HIGH para N ciclos de relógio Em outras palavras a saída divide a frequência do relógio por N O diagrama de transição de estado e a forma de onda para um contador divisorpor3 é mostrado na Figura 328 Esboce o circuito para este contador usando codificação de estado binário e onehot Figura 328 Contador dividepor3 a forma de onda e b diagrama de transição de estado Solução As Tabela 36 e Tabela 37 mostram as transições de estado e saída antes da codificação A Tabela 38 compara a codificação binária e onehot para os três estados A codificação binária usa dois bits de estado Usando esta codificação a tabela de transição de estado é mostrada na Tabela 39 Notese que não existem entradas o próximo estado depende apenas do Capítulo três Projeto de Lógica Digital 169 estado atual A tabela de saída é deixada como um exercício para o leitor As equações de próximo estado e de saída são 𝑆1 𝑆1 𝑆0 𝑆0 𝑆1 𝑆0 34 𝑌 𝑆1 𝑆0 35 Tabela 36 Tabela de transição de estado do contador dividepor3 Tabela 37 Tabela de saída do contador dividepor3 A codificação onehot usa três bits de estado A tabela de transição de estado para esta codificação é mostrada na Tabela 310 e a tabela de saída é novamente deixada como um exercício para o leitor As equações de próximo estado e de saída são as seguintes 𝑆2 𝑆1 𝑆1 𝑆0 𝑆0 𝑆2 36 𝑌 𝑆0 37 Capítulo três Projeto de Lógica Digital 170 A Figura 329 mostra os esquemas para cada um destes projetos Notese que o hardware para o projeto da codificada binária poderia ser optimizado para compartilhar a mesma porta entre Y e S0 Observe também que a codificação onehot requer flipflops com s settable e r resettable para inicializar a máquina para S0 no arranque A melhor escolha de implementação depende do custo relativo das portas e dos flipflops mas o projeto onehot geralmente é preferível para este exemplo específico Tabela 38 Codificações e binária e onehot para contador dividirpor3 Tabela 39 Tabela de transição de estado com codificação binária Tabela 310 Tabela de transição de estado com codificação onehot Capítulo três Projeto de Lógica Digital 171 Figura 329 Contador dividepor3 a forma de onda e b diagrama de transição de estado 343 Máquinas de Moore e de Mealey Até agora temos mostrado exemplos de máquinas de Moore na qual a saída depende apenas do estado do sistema Assim nos diagramas de transição de estado para máquinas de Moore as saídas são rotuladas nos círculos Lembrese que as máquinas de Mealy são muito parecidas com as máquinas de Moore mas as saídas podem depender tanto das entradas como do estado atual Assim nos diagramas de transição de estado para máquinas de Mealy as saídas são colocadas nos arcos em vez de nos círculos O bloco de lógica combinatória que calcula as saídas usa o estado atual e as entradas como foi mostrado na Figura 322 b Exemplo 37 MÁQUINA DE MOORE VS MÁQUINA DE MEALY Alyssa P Hacker é dono de um caracol robótico de estimação com um cérebro FSM O caracol rasteja a partir da esquerda para a direita ao longo de uma fita de papel contendo uma sequência de 1 e 0 Em cada ciclo de clock o caracol rasteja para o próximo bit O caracol sorri quando os dois últimos bits ao longo dos quais se arrastou são da esquerda para a direita 01 Projete a FSM para calcular quando o caracol deve sorrir A entrada A é a parte debaixo das antenas do caracol A saída Y é TRUE quando o Uma maneira fácil de lembrar a diferença entre os dois tipos de máquinas de estados finitos é que uma máquina de Moore geralmente tem mais estados do que uma máquina de Mealy para um determinado problema Capítulo três Projeto de Lógica Digital 172 caracol sorri Compare os projetos das máquinas de estado de Moore e Mealy Esboce um diagrama temporal para cada máquina que mostra a entrada os estados e a saída quando o caracol de Alyssa se arrasta ao longo da sequência 0100110111 Solução A máquina de Moore requer três estados como mostrado na Figura 330 a Considere que o diagrama de transição de estado está correto Em particular por que é que há um arco de S2 para S1 quando a entrada está a 0 Em comparação a máquina Mealy requer apenas dois estados como mostrado na Figura 330 b arco é identificado como AY A é o valor da entrada que causa essa transição e Y é a saída correspondente As Tabela 311 e Tabela 312 mostram a transição de estado e tabela de saída para a máquina de Moore A máquina de Moore requer pelo menos dois bits de estado Considere o uso da codificação binária de estado S0 00 S1 01 e S2 10 As Tabela 313 e Tabela 314 reescrevem as tabelas de transição de estado e de saída com estas codificações A partir dessas tabelas encontramos as seguintes equações de estado e de saída por inspeção Note se que estas equações são simplificadas fazendo uso do fato de que o estado 11 não existe Deste modo o próximo estado e saída correspondente para o estado que não existe são dont care não mostrado nas tabelas Usamos os dont care para minimizar as nossas equações 𝑆1 𝑆0𝐴 𝑆0 𝐴 38 𝑌 𝑆1 39 A Tabela 315 mostra a transição de estado e de saída para a máquina de Mealy A máquina de Mealy requer apenas um bit de estado Considere o uso de uma codificação de estado binária S0 0 e S1 1 A Tabela 316 reescreve a transição de estado e de saída com estas codificações A partir dessas tabelas encontramos as seguintes equações de estado e de saída por inspeção 𝑆0 𝐴 310 Capítulo três Projeto de Lógica Digital 173 𝑌 𝑆0𝐴 311 Os esquemas das máquinas de Moore e de Mealy são mostrados na Figura 331 Os diagramas temporais para cada máquina são mostrados na Figura 332 As duas máquinas seguem uma sequência diferente de estados Além disso a saída da máquina Mealy sobe um ciclo mais cedo porque responde à entrada em vez de esperar a mudança de estado Se a saída da máquina de Mealy fosse atrasada através de um flipflop ela iria coincidir com a saída da máquina de Moore Quando escolher o seu estilo do projeto da FSM o leitor deve considerar quando quer que as suas saídas respondam Figura 330 Diagramas de transição de estado da FSM a A máquina de Moore b máquina de Mealy Tabela 311 Tabela de transição de estado da máquina de Moore Capítulo três Projeto de Lógica Digital 174 Tabela 312 Tabela de saída da máquina de Moore Tabela 313 Tabela de transição de estado da máquina de Moore com codificações de estado Tabela 314 Tabela de saída da máquina de Moore com codificações de estado Capítulo três Projeto de Lógica Digital 175 Tabela 315 Tabela de transição de estado e saída da máquina de Mealy Tabela 316 Tabela de transição de estado da máquina de Mealy com codificações de estado Capítulo três Projeto de Lógica Digital 176 344 Factoring Máquinas de Estado O projeto de FSM complexas é frequentemente mais fácil se elas forem divididas em várias máquinas de estado mais simples que interagem de tal modo que as saídas de algumas máquinas são as entradas de outras Esta aplicação da hierarquia e modularidade é chamada de factoring de máquinas de estado Figura 331 Esquemas de FSM para máquinas a Moore e b de Mealy Figura 332 Diagramas temporais para as máquinas de Moore e de Mealy Capítulo três Projeto de Lógica Digital 177 Exemplo 38 MÁQUINAS DE ESTADO UNFACTORED E FACTORED Modifique o controlador de semáforo da Seção 341 para ter um modo de desfile o que mantém a luz verde para o Boulevard Bravado enquanto os espectadores e a banda marcham para jogos de futebol em grupos dispersos O controlador recebe mais duas entradas P e R Ativando P por pelo menos um ciclo entrase no modo de desfile Ativando R durante pelo menos um ciclo saise do modo de desfile Quando em modo de desfile o controlador procede através de sua sequência normal até LB ficar verde em seguida permanece nesse estado com LB verde até que o modo desfile termine Em primeiro lugar esboce um diagrama de transição de estado para uma única FSM como mostrado na Figura 333 a Em seguida esboce os diagramas de transição de estado para duas FSM interagindo como mostrado na Figura 333 b O Modo FSM ativa a saída M quando se está no modo de desfile A Lights FSM controla as luzes com base em M e nos sensores de tráfego TA e TB Solução A Figura 334 a mostra o desenho da EFM Os estados S0 a S3 lidam com o modo normal Os estados S4 a S7 lidam com o modo desfile As duas metades do diagrama são quase idênticas mas no modo de parada a FSM permanece no estado S6 com a luz verde no Blvd Bravado As entradas P e R controlam o movimento entre estas duas metades O projeto de FSM é confuso e entediante A Figura 334 b mostra o projeto factored da FSM O Modo FSM tem dois estados para controlar se as luzes estão no modo normal ou no modo desfile A Ligth FSM é modificada para permanecer em S2 enquanto M é TRUE Capítulo três Projeto de Lógica Digital 178 Figura 333 Projetos para a FSM controlador de tráfego modificada a único e b factored Capítulo três Projeto de Lógica Digital 179 Figura 334 Diagrama de transição de estados a não factored b factored 345 Obtendo uma FSM de um Esquema A derivação do diagrama de transição de estado a partir de um esquema segue quase o processo inverso do projeto de uma FSM Este processo pode ser necessário por exemplo quando se pega num projeto com documentada incompleta ou caso seja necessário fazer engenharia reversa do sistema de outra pessoa Capítulo três Projeto de Lógica Digital 180 Examine o circuito ativando as entradas saídas e bits de estado Escreva as equações dos próximos estado e de saída Crie as tabelas dos próximos estado e de saída Reduza a tabela de próximo estado para eliminar estados inacessíveis Atribua a cada combinação de bits de estado válidos um nome Reescreva a tabela de próximo estado e de saída com nomes de estado Desenhe o diagrama de transição de estado Escreva por palavras o que a FSM faz Na etapa final deve ter o cuidado de descrever sucintamente o objetivo global e função da FSM Não basta voltar a descrever cada transição do diagrama de transição de estado Exemplo 39 OBTER UMA FSM DO SEU CIRCUITO Alyssa P Hacker chega em casa mas o teclado do seu acesso foi religado e o seu código antigo não funciona Um pedaço de papel está colado a ele tal como se mostra no diagrama do circuito da Figura 335 Alyssa pensa que o circuito poderá ser uma máquina de estados finitos e decide derivar o diagrama de transição de estado para ver a ajuda a abrir a porta Solução Alyssa começa por examinar o circuito A entrada é A10 e a saída é Unlock Os bits de estado já estão marcados na Figura 335 Esta é uma máquina de Moore porque a saída depende apenas dos bits de estado Do circuito ela retira diretamente as equações de próximo estado e de saída 𝑆1 𝑆0𝐴1 𝐴0 𝑆0 𝑆1 𝑆0 𝐴1𝐴0 𝑈𝑛𝑙𝑜𝑐𝑘 𝑆1 312 Capítulo três Projeto de Lógica Digital 181 Figura 335 Circuito da FSM encontrada no Exemplo 39 Em seguida ela escreve as equações das tabelas de próximo estado e de saída como mostrado nas Tabela 317 e Tabela 318 colocando primeiro 1 nas posições das tabelas como indicado pela Equação 312 Ela coloca em seguida 0 nos restantes lugares Alyssa reduz a tabela removendo os estados não utilizados e combinando linhas dont cares O estado S10 11 nunca é listado como sendo um possível próximo estado na Tabela 317 então as linhas com este estado atual são removidas Para o estado atual S10 10 o próximo estado é sempre S10 00 independentemente das entradas por isso dont care são inseridos para as entradas As tabelas reduzidas são mostradas nas Tabela 319 e Tabela 320 Ela atribui nomes a cada combinação de bits de estado S0 é S10 00 S1 é S10 01 e S2 é S10 10 As Tabela 321 e Tabela 322 mostram as tabelas de próximo estado e de saída com os nomes de estado Capítulo três Projeto de Lógica Digital 182 Tabela 317 Tabela de próximo estado derivada do circuito na Figura 336 Tabela 318 Tabela da saída proveniente do circuito da Figura 335 Capítulo três Projeto de Lógica Digital 183 Tabela 319 Tabela simplificada do próximo estado Tabela 320 Tabela simplificada da saída Capítulo três Projeto de Lógica Digital 184 Tabela 321 Tabela simbólica do próximo estado Tabela 322 Tabela simbólica da saída Capítulo três Projeto de Lógica Digital 185 Figura 336 Diagrama de transição de estado da FSM encontrada do Exemplo 39 Alyssa escreve o diagrama de transição de estado mostrado na Figura 336 usando as Tabela 321 e Tabela 322 Por inspeção ela pode ver que a máquina de estados finitos destranca a porta só depois de detectar um valor de entrada A10 de 3 seguido por um valor de entrada de 1 A porta é então novamente bloqueada Alyssa tenta este código no teclado da porta e esta abrese 346 Revisão das FSM As máquinas de estados finitos são uma forma poderosa de projetar sistematicamente circuitos sequenciais a partir de uma especificação escrita Use o seguinte procedimento para projetar um FSM Identifique as entradas e as saídas Esboce um diagrama de transição de estado Capítulo três Projeto de Lógica Digital 186 Para uma máquina de Moore Faça uma tabela de transição de estado Faça uma tabela de saída Para uma máquina Mealy Escreva uma tabela combinada das transições de estado e de saída Selecione a codificação dos estados a sua seleção afeta o projeto do hardware Escreva as equações Booleanas para a lógica do próximo estado e de saída Esboce o esquema de circuito Vamos usar repetidamente as FSM para projetar sistemas digitais complexos ao longo deste livro 35 TEMPORIZAÇÃO DA LÓGICA SEQUENCIAL Lembrese que um flipflop copia a entrada D para a saída Q no flanco ascendente do relógio Este processo é chamado de amostragem sampling de D na borda ascendente do relógio Se D está estável a 0 ou a 1 quando o relógio sobe este comportamento é claramente definido Mas o que acontece se D está mudando ao mesmo tempo que o relógio sobe Este problema é semelhante ao que se coloca a uma câmara ao tirar uma fotografia Imagine que fotografa um sapo pulando de uma almofada de lírio para o lago Se o leitor tirar a foto antes do salto irá ver um sapo numa almofada de lírio Se o leitor tirar a foto depois do salto irá ver ondulações na água Mas se o leitor tirar a foto assim que o sapo pula o leitor poderá ver uma imagem do sapo esborratada que se estende desde a almofada de lírio até à água Uma câmara é caracterizada pelo seu tempo de abertura durante o qual o objeto tem de permanecer parado para se capturar uma imagem nítida Do mesmo modo um elemento sequencial tem um tempo de abertura em torno do flanco do relógio durante o qual a entrada deve ser estável para que o flipflop possa produzir uma saída bem definida Capítulo três Projeto de Lógica Digital 187 A abertura de um elemento sequencial é definida por um tempo de preparação setup e um tempo de espera hold antes e depois do flanco do relógio respectivamente Assim como a disciplina estática nos limita a usar níveis lógicos fora da zona proibida a disciplina dinâmica nos limita ao uso de sinais que mudam fora do tempo de abertura Tirando proveito da disciplina dinâmica podemos pensar no tempo em unidades discretas chamadas de ciclos de relógio assim como nós pensamos nos níveis de sinal como discreto 1 e 0 Um sinal pode apresentar glitch e oscilar descontroladamente por alguma quantidade limitada de tempo Sob a disciplina dinâmica estamos preocupados apenas sobre o seu valor final no fim do ciclo de relógio depois de ter normalizado num valor estável Assim podese simplesmente escrever An como o valor do sinal A no final do ciclo de relógio de ordem n onde n é um número inteiro em vez de A t o valor de A em algum instante t em que t é um qualquer número real O período do relógio tem que ser longo o suficiente para todos os sinais estabilizarem Isto define um limite para a velocidade do sistema Em sistemas reais o relógio não atinge todos os flipflops precisamente ao mesmo tempo Esta variação no tempo chamada de defasagem do relógio aumenta ainda mais o período de relógio necessário Algumas vezes é impossível satisfazer a disciplina dinâmica especialmente quando se faz o interface com o mundo real Por exemplo considere um circuito com uma entrada proveniente de um botão Um macaco pode pressionar o botão apenas quando o relógio sobe Isso pode resultar num fenómeno chamado de metaestabilidade onde o flipflop captura um valor a meio caminho entre 0 e 1 que pode levar uma quantidade ilimitada de tempo para determinar um valor lógico correto A solução para tais entradas assíncronas é usar um sincronizador que possui uma probabilidade muito pequena mas diferente de zero de produzir um valor lógico ilegal Vamos expandir todos estes conceitos no restante desta seção 351 A Disciplina Dinâmica Até agora temonos focado na especificação funcional dos circuitos sequenciais Recordese que um circuito sequencial síncrono tal como um flipflop ou FSM também tem uma especificação temporal tal como ilustrado na Figura 337 Quando o relógio sobe a saída ou saídas podem começar a mudar depois do relógioparaQ contamination delay tccq e deve estabelecer definitivamente o valor final Capítulo três Projeto de Lógica Digital 188 dentro do relógioparaQ propagation delay tpcq Estes representam os atrasos mais rápidos e mais lentos através do circuito respectivamente Para o circuito amostrar a sua entrada corretamente a entrada ou entradas devem ter estabilizado pelo menos algum setup time tsetup antes do flanco de subida do relógio e devem permanecer estáveis durante pelo menos durante algum hold time thold após o flanco de subida do relógio A soma do setup time e do hold time é chamado de aperture time do circuito uma vez que é o tempo total durante o qual a entrada deve permanecer estável A disciplina dinâmica afirma que as entradas de um circuito sequencial síncrono devem estar estáveis durante o setup e hold time em torno do flanco do relógio Ao impor essa exigência garantimos que os flipflops amostram os sinais enquanto eles não estão mudando Porque estamos preocupados apenas sobre os valores finais das entradas no momento em que são recolhidos podemos tratar os sinais tanto como discretos no tempo assim como em níveis lógicos 352 Temporização do Sistema O período de relógio ou tempo de ciclo Tc é o tempo entre os flancos de um sinal de relógio repetitivo O seu recíproco fc 1 Tc é a frequência de relógio Tudo o resto é idêntico aumentando a frequência do relógio aumentase o trabalho que um sistema digital pode realizar por unidade de tempo A frequência é medida em unidades de hertz Hz ou ciclos por segundo 1 megahertz MHz 106 Hz e um gigahertz GHz 109 Hz A Figura 338 a ilustra um caminho genérico num circuito sequencial síncrono cujo período de relógio se deseja calcular No flanco ascendente do relógio o registro R1 produz uma saída ou saídas Q1 Estes sinais entram num bloco de lógica combinatória produzindo D2 a entrada ou entradas para o registro R2 O diagrama temporal da Figura 338 b mostra que cada sinal de saída pode começar a mudar com um contamination delay depois da mudança das entradas e a estabelecerse no valor final dentro de um tempo de atraso de propagação após as suas entradas se estabelecerem As setas cinzentas representam o contamination delay através de R1 e da lógica combinatória e as setas azuis representam o atraso de propagação através de R1 e da lógica combinatória Analisamos as restrições temporais em relação ao setup time e ao hold time do segundo registro R2 Nas três décadas a seguir à compra de um computador Apple II por um familiar dos autores até ao tempo presente de escrita as frequências de relógio dos microprocessadores aumentaram de 1 MHz até vários GHz um fator de mais de 1000 Esta aceleração explica parcialmente as mudanças revolucionárias feitas pelos computadores na sociedade Capítulo três Projeto de Lógica Digital 189 Figura 337 Especificações temporais para um circuito sequencial síncrono Figura 338 Caminho entre registros e diagrama temporal Restrição do Setup Time Na Figura 339 o diagrama temporal mostra apenas o atraso máximo através do percurso indicado pelas setas azuis Para satisfazer o setup time de R2 D2 deve estabelecerse o mais tardar antes do setup time da próxima transição de relógio Assim encontramos uma equação para o período de relógio mínimo 𝑇𝑐 𝑡𝑝𝑐𝑞 𝑡𝑝𝑑 𝑡𝑠𝑒𝑡𝑢𝑝 313 Capítulo três Projeto de Lógica Digital 190 Em projetos comerciais o período de relógio é muitas vezes ditado pelo Diretor de Engenharia ou pelo departamento de marketing para garantir um produto competitivo Além disso o propagation delay e o setup time do relógioparaQ do flipflop tpcq e tsetup são especificados pelo fabricante Por isso reescrevemos a Equação 313 em ordem ao atraso máximo de propagação através da lógica combinatória que normalmente é a única variável sob o controlo do projetista 𝑡𝑝𝑑 𝑇𝑐 𝑡𝑝𝑐𝑞 𝑡𝑠𝑒𝑡𝑢𝑝 314 O termo entre parênteses tpcq tsetup é chamado de sobrecarga de sequenciamento sequencing overhead Idealmente o tempo total de ciclo Tc estaria disponível para realizar cálculo útil na lógica combinatória tpd No entanto a sobrecarga de sequencial do flipflop reduz este tempo A Equação 314 é chamada de setup time constraint ou de maxdelay constraint porque depende do setup time e limita o atraso máximo através da lógica combinatória Figura 339 Maxdelay para o setup time constraint Se o atraso de propagação através da lógica combinatória é muito grande D2 pode não ser ter estabelecido no seu valor final no momento em que R2 precisa dele estável para que o possa amostrar Assim R2 pode amostrar um resultado incorreto ou mesmo um nível lógico ilegal num nível na região proibida Em tal caso o circuito terá um funcionamento incorreto O problema pode ser resolvido aumentando o período de relógio ou redesenhando a lógica combinatória para que tenha um atraso de propagação mais curto Capítulo três Projeto de Lógica Digital 191 Restrição do Hold Time O registro R2 na Figura 338 a também tem uma hold time constraint A sua entrada D2 não deve mudar até algum tempo thold após o flanco ascendente do relógio De acordo com a Figura 341 D2 pode mudar assim que tccq tcd a seguir ao flanco ascendente do relógio Assim encontramos 𝑡𝑐𝑐𝑞 𝑡𝑐𝑑 𝑡ℎ𝑜𝑙𝑑 315 Mais uma vez tccq e thold são características do flipflop que estão geralmente fora do controle do projetista Reorganizando podemos resolver para o mínimo de contamination delay através da lógica combinatória 𝑡𝑐𝑑 𝑡ℎ𝑜𝑙𝑑 𝑡𝑐𝑐𝑞 316 A equação 316 é também chamada de hold time constraint ou mindelay constraint porque limita o atraso mínimo através da lógica combinatória Assumimos que quaisquer elementos lógicos podem ser ligados uns aos outros sem a introdução de problemas de tempo Em particular seria de esperar que dois flipflops possam ser ligados diretamente em cascata como na Figura 340 sem causar problemas de hold time Em tal caso o tCd 0 porque não há nenhuma lógica combinatória entre os flipflops Substituindo na equação 316 produz o requisito de que 𝑡ℎ𝑜𝑙𝑑 𝑡𝑐𝑐𝑞 317 Capítulo três Projeto de Lógica Digital 192 Figura 341 Mindelay para o hold time constraint Por outras palavras um flipflop de confiança deve ter um hold time mais curto do que o seu contamination delay Muitas vezes os flipflops são projetados com thold 0 de modo que a Equação 317 é sempre satisfeita Salvo disposição em contrário vamos geralmente fazer essa suposição e ignorar a restrição do hold time neste livro No entanto as restrições do hold time são extremamente importantes Se violadas a única solução consiste em aumentar o contamination delay através da lógica o que exige o redesenho do circuito Ao contrário da restrição do setup time que não pode ser corrigido ajustando o período de relógio Projetar um circuito integrado e fabricar o projeto corrigido leva meses e milhões de dólares nas atuais tecnologias por isso assim os hold time violations devem ser levados muito a sério Juntando Tudo Os circuitos sequenciais têm restrições de setup e hold time e de espera que ditam os atrasos mínimos e máximos da lógica combinatória entre flipflops Os flipflops modernos são normalmente concebidos de modo a que o atraso mínimo através da lógica combinatória seja de 0 isto é os flipflops pode ser colocado backtoback A restrição de atraso máximo limita o número de portas consecutivas sobre o caminho crítico de um circuito de alta velocidade porque uma frequência elevada de relógio significada um curto período de relógio Figura 340 flipflops Backtoback Capítulo três Projeto de Lógica Digital 193 Exemplo 310 ANÁLISE TEMPORAL Ben Bitdiddle desenhou o circuito na Figura 342 De acordo com as folhas de dados para os componentes que ele está usando os flipflops têm um contamination delay de relógioparaQ de 30 ps e um atraso de propagação de 80 ps Eles têm um setup time de 50 ps e um hold time de 60 ps Cada porta lógica tem um atraso de propagação de 40 ps e um contamination delay de 25 ps Ajude o Ben a determinar a frequência máxima do relógio e se alguma violação do hold time poderá ocorrer Este processo é chamado de análise temporal timing analysis Figura 342 Circuito de exemplo para análise temporal Solução A Figura 343 a mostra as formas de onda que ilustram quando os sinais podem mudar As entradas A a D passam por registros então elas só se alteram um pouco depois do CLK subir O caminho crítico ocorre quando B 1 C 0 D 0 e A sobe de 0 a 1 levando n1 a subir X a subir e Y a descer conforme se mostra na Figura 343 b Este caminho envolve três atrasos de porta Para o caminho crítico assumimos que cada porta requer a totalidade do seu atraso de propagação Y deve estar preparado antes do próximo flanco ascendente do CLK Assim o tempo de ciclo mínimo é 𝑇𝑐 𝑡𝑝𝑐𝑞 3𝑡𝑝𝑑 𝑡𝑠𝑒𝑡𝑢𝑝 80 3 40 50 250𝑝𝑠 318 A frequência máxima de relógio é fc 1 Tc 4 GHz Figura 343 Diagrama temporal a caso geral b caminho crítico c caminho curto Capítulo três Projeto de Lógica Digital 194 Um caminho curto ocorre quando A 0 e C sobe fazendo com que X suba como se mostra na Figura 343 c Para o caminho curto assumimos que cada porta se altera após um contamination delay Este caminho envolve apenas um atraso de porta por isso pode ocorrer após tccq tcd 30 25 55 ps Mas lembrese de que o flipflop tem um tempo de espera de 60 ps o que significa que X deve permanecer estável durante 60 ps após o flanco ascendente do CLK para que o flipflop possa amostrar de forma confiável o seu valor Neste caso X 0 no primeiro flanco ascendente do CLK por isso queremos que o flipflop capture X 0 Porque X permanece estável o tempo suficiente o valor atual de X é imprevisível O circuito tem uma violação do hold time e pode comportarse de forma irregular a qualquer frequência de relógio Exemplo 311 RESOLUÇÃO DA VIOLAÇÃO DO HOLD TIME Alyssa P Hacker propõe para corrigir circuito do Ben adicionar buffers para abrandar o caminho curto como mostrado na Figura 344 Os buffers têm os mesmos atrasos que as outras portas Determine a frequência máxima do relógio e se será de esperar outros problemas de tempo Solução A Figura 345 mostra as formas de onda ilustrando quando os sinais podem mudar O caminho crítico de A a Y não é afetado uma vez que não passa através de qualquer buffer Portanto a frequência máxima de relógio ainda é de 4 GHz No entanto os caminhos curtos são retardados pelo atraso de contaminação do buffer Agora X não mudará até que tccq 2tcd 30 2 x 25 80 ps Isto é após que o hold time de 60 ps tenha decorrido de modo que o circuito opera agora corretamente Este exemplo tinha um hold time invulgarmente longo para evidenciar os problemas de hold time A maioria dos flipflops são projetados com thold tccq para evitar tais problemas Capítulo três Projeto de Lógica Digital 195 Figura 344 Circuito corrigido para resolver o problema do hold time Figura 345 Diagrama temporal com buffers para resolver o problema do hold time No entanto alguns microprocessadores de alto desempenho incluindo o Pentium 4 usam um elemento chamado uma pulsed latch em vez de um flipflop A pulsed latch comportase como um flipflop mas tem um pequeno atraso de relógioparaQ e um hold time longo Em geral a adição de buffers pode geralmente mas não sempre resolver problemas do hold time sem abrandar o caminho crítico 353 Skew do Relógio Na análise anterior assumiuse que o relógio atinge todos os registros exatamente ao mesmo tempo Na realidade há alguma variação deste instante Esta variação nos flancos do relógio é chamada de desenquadramento do relógio clock skew Por exemplo as pistas da fonte de relógio para diferentes registros podem ter diferentes comprimentos resultando em atrasos ligeiramente diferentes tal como Capítulo três Projeto de Lógica Digital 196 mostrado na Figura 346 O ruído também resulta em atrasos diferentes O clock gating descrito na Seção 325 atrasa ainda mais o relógio Se alguns relógios estão ativos e outros não haverá uma distorção substancial entre os relógios fechados e abertos Na Figura 346 CLK2 está em avanço em relação ao CLK1 porque a pista de relógio entre os dois registros segue uma rota cénica Se a pista do relógio tivesse sido encaminhada de forma diferente o CLK1 poderia estar em avanço Ao fazemos uma análise temporal consideramos o pior cenário possível para que possamos garantir que o circuito irá funcionar em todas as circunstâncias A Figura 347 acrescenta um skew no diagrama temporal da Figura 338 A linha cheia do relógio indica o último momento em que o sinal de relógio pode chegar a qualquer registro as linhas a traço interrompido mostram que o relógio pode chegar até tskew mais cedo Primeiro considere a restrição de setup time mostrada na Figura 348 No pior dos casos R1 recebe o relógio em atraso e R2 recebe o relógio em avanço deixando pouco tempo para que os dados se possam propagar entre os registros Figura 346 Skew do relógio provocado pelo atraso no condutor Capítulo três Projeto de Lógica Digital 197 Figura 347 Diagrama temporal com skew do relógio Os dados propagamse através do registro e da lógica combinatória e devem estabilizar antes que R2 os amostre Assim concluímos que 𝑇𝑐 𝑡𝑝𝑐𝑞 𝑡𝑝𝑑 𝑡𝑠𝑒𝑡𝑢𝑝 𝑡𝑠𝑘𝑒𝑤 319 𝑡𝑝𝑑 𝑇𝑐 𝑡𝑝𝑐𝑞 𝑡𝑠𝑒𝑡𝑢𝑝 𝑡𝑠𝑘𝑒𝑤 320 Figura 348 Restrição do setup time com skew do relógio Capítulo três Projeto de Lógica Digital 198 Em seguida considere a restrição de hold time mostrada na Figura 349 No pior dos casos R1 recebe um relógio em avanço CLK1 e R2 recebe um relógio em atraso CLK2 Os dados percorrem os registros e a lógica combinatória mas não devem chegar até um hold time após o último relógio Assim descobrimos que 𝑡𝑝𝑐𝑞 𝑡𝑐𝑑 𝑡ℎ𝑜𝑙𝑑 𝑡𝑠𝑘𝑒𝑤 321 𝑡𝑐𝑑 𝑡ℎ𝑜𝑙𝑑 𝑡𝑠𝑘𝑒𝑤 𝑡𝑐𝑐𝑞 322 Em resumo o skew do relógio efetivamente aumenta tanto o setup time e como o hold time Ele acrescenta uma sobrecarga ao sequenciamento reduzindo o tempo disponível para realizar trabalho útil na lógica combinatória Também aumenta o atraso mínimo exigido pela lógica combinatória Mesmo se thold 0 um par de flipflops backtoback irá violar a Equação 322 se tskew tccq Para evitar graves falhas de hold time os projetistas não devem permitir demasiada skew do relógio Às vezes os flipflops são intencionalmente concebidos para serem particularmente lentos isto é elevado tccq para evitar problemas de hold time mesmo quando o skew do relógio é substancial Figura 349 Restrição do hold time com skew do relógio Capítulo três Projeto de Lógica Digital 199 Exemplo 312 ANÁLISE TEMPORAL COM SKEW DO RELÓGIO Revisitar o Exercício 310 e assumir que o sistema tem 50 ps de skew do relógio Solução O caminho crítico continua a ser o mesmo mas o setup time é efetivamente aumentado pelo skew Assim o tempo de ciclo mínimo é 𝑇𝑐 𝑡𝑝𝑐𝑞 3𝑡𝑝𝑑 𝑡𝑠𝑒𝑡𝑢𝑝 𝑡𝑠𝑘𝑒𝑤 80 3 40 50 50 300𝑝𝑠 323 O caminho curto também permanece o mesmo em 55 ps O hold time é eficazmente aumentado pelo skew para 60 50 110 ps que é muito maior do que 55 ps Assim o circuito irá violar o hold time e terá um mau funcionamento a qualquer frequência O circuito viola a restrição do hold time mesmo sem skew O skew no sistema faz a violação ser pior Exemplo 313 SOLUCIONAR A VIOLAÇÃO DO TEMPO DE ESPERA Revisitar o Exercício 311 e assumir que o sistema tem 50 ps de skew do relógio Solução O caminho crítico não é afetado então a frequência máxima do relógio permanece 333 GHz O caminho curto aumenta para 80 ps Isto é ainda menos do que thold tskew 110 ps de modo que o circuito ainda viola a sua restrição de tempo de espera Para corrigir o problema ainda mais buffers podem ser inseridos Os buffers que têm que ser adicionados também no caminho crítico assim reduzindo a frequência de relógio Alternativamente um flipflop com um hold time mais curto poderia ser utilizado Capítulo três Projeto de Lógica Digital 200 354 Metaestabilidade Como observado anteriormente nem sempre é possível garantir que a entrada para um circuito sequencial é estável durante o aperture time especialmente quando a entrada chega do mundo exterior Considerese um botão ligado à entrada de um flipflop como mostrado na Figura 350 Quando o botão não está pressionado D 0 Quando o botão é pressionado D 1 Um macaco pressiona o botão num qualquer momento aleatório em relação ao flanco ascendente do CLK Queremos saber qual a saída Q após o flanco ascendente de CLK No Caso I quando o botão é pressionado muito antes de CLK Q 1 No Caso II quando o botão não é pressionado até muito tempo depois de CLK Q 0 Mas no Caso III quando o botão é pressionado em algum momento entre tsetup antes de CLK e thold depois de CLK a entrada viola a disciplina dinâmica e a saída é indefinida Estado Metaestável Quando um flipflop amostra uma entrada que está em mudança durante a sua abertura a saída Q pode assumir momentaneamente uma tensão entre 0 e VDD situada na zona proibida Isso é chamado um estado metaestável Eventualmente o flipflop vai estabelecer a saída num estado estável stable state de 0 ou 1 Contudo o resolution time necessário para alcançar o estado estável é ilimitado O estado metaestável de um flipflop é análogo a uma bola no cume de uma colina entre dois vales como mostrado na Figura 351 Os dois vales são estados estáveis porque uma bola no vale permanecerá lá desde que não seja perturbada O topo da colina é chamado metaestável porque a bola iria permanecer lá se fosse perfeitamente equilibrada Mas porque nada é perfeito a bola irá rolar eventualmente para um lado ou para o outro O tempo necessário para que essa alteração ocorra depende de como equilibrada a bola estava originalmente Cada dispositivo biestável tem um estado metaestável entre os dois estados estáveis Resolution Time Se uma entrada do flipflop muda num momento aleatório durante o ciclo de relógio o resolution time tres necessário para resolver para um estado estável também é uma variável aleatória Se a entrada muda fora da abertura então tres tpcq Mas se ocorre a entrada alterarse dentro da abertura tres pode Figura 350 Entrada modificase antes depois e durante o tempo de abertura Capítulo três Projeto de Lógica Digital 201 ser substancialmente mais longo As análises teóricas e experimentais ver Seção 356 mostram que a probabilidade de que o tempo de resolução tres exceda algum tempo arbitrário t diminui exponencialmente com t 𝑃𝑡𝑟𝑒𝑠 𝑡 𝑇0 𝑇𝑐 𝑒𝑡 𝜏 324 onde Tc é o período de relógio e T0 e τ são características do flipflop A equação é válida apenas para t substancialmente maior do que tpcq Intuitivamente T0 Tc descreve a probabilidade de que a entrada mude num momento inoportuno isto é durante o tempo de abertura esta probabilidade diminui com o tempo de ciclo Tc τ é uma constante de tempo indicadora do quão rápido o flipflop se afasta do estado metaestável ele está relacionado com o atraso através das portas do flipflop Em resumo se a entrada de um dispositivo biestável tal como um flipflop se altera durante o tempo de abertura a saída pode assumir um valor metaestável durante algum tempo antes de se resolver para o valor estável 0 ou 1 A quantidade de tempo necessário para resolver não tem limite porque para qualquer tempo finito t a probabilidade de que o flipflop ainda seja metaestável é diferente de zero No entanto essa probabilidade cai exponencialmente quando t aumenta Portanto se esperarmos o tempo suficiente muito mais do que tpcq podemos esperar com uma alta probabilidade elevada que o flipflop chegue a um nível lógico válido 355 Sincronizadores Entradas assíncronas do mundo real em sistemas digitais são inevitáveis A entrada humana é assíncrona por exemplo Se manuseado sem cuidado estas entradas assíncronas podem levar a tensões metaestáveis dentro do sistema causando falhas erráticos no sistema que são extremamente difíceis de rastrear e corrigir O objetivo de um projetista de um sistema digital deve ser o de assegurar que dada uma entrada assíncrona a probabilidade de encontrar uma tensão metaestável é suficientemente pequena Suficientemente depende do contexto Para um telefone celular talvez uma falha em 10 anos é aceitável porque o utilizador pode sempre desligar o telefone e voltar a ligar se este bloquear Figura 351 Estados estáveis e metaestáveis Capítulo três Projeto de Lógica Digital 202 Para um dispositivo médico um fracasso na vida esperada do universo 1010 anos é um alvo melhor Para garantir bons níveis de lógica todas as entradas assíncronas devem ser passadas através de sincronizadores Um sincronizador mostrado na Figura 352 é um dispositivo que recebe uma entrada D assíncrona e um relógio CLK Ela produz uma saída Q dentro de um período limitado de tempo a saída tem um nível lógico válido com probabilidade extremamente alta Se D é estável durante a abertura Q deve assumir o mesmo valor de D Se D se altera durante a abertura Q pode tomar um valor HIGH ou LOW mas não deve ser metaestável A Figura 353 mostra uma maneira simples de criar um sincronizador a partir de dois flipflops F1 amostra D no flanco ascendente do CLK Se D está a mudar naquele momento a saída D2 pode ser momentaneamente metaestável Se período do relógio da Figura 353 mostra uma maneira simples de criar um sincronizador de dois flipflops Amostras F1 D na borda de subida de CLK Se D está mudando naquele tempo a saída D2 pode ser momentaneamente metaestável Se o período do relógio for suficientemente longo D2 será com grande probabilidade resolvido para um nível lógico válido antes do final do período F2 em seguida amostra D2 que agora está estável produzindo uma boa saída Q Figura 353 Sincronizador simples Figura 352 Símbolo de um sincronizador Capítulo três Projeto de Lógica Digital 203 Dizemos que um sincronizador falha se Q a saída do sincronizador se torna metaestável Isso pode acontecer se D2 não se resolveu a um nível válido no momento em que se deve preparar em F2 isto é se tres Tc tsetup Segundo a Equação 324 a probabilidade de falha para uma única mudança da entrada num tempo aleatório é 𝑃𝑓𝑎𝑙ℎ𝑎 𝑇0 𝑇𝑐 𝑒 𝑇𝑐𝑡𝑠𝑒𝑡𝑢𝑝 𝜏 325 A probabilidade de falha P falha é a probabilidade de que a saída Q seja metaestável numa única mudança de D Se D muda uma vez por segundo a probabilidade de falha por segundo é apenas P falha No entanto se D muda N vezes por segundo a probabilidade de falha por segundo é N vezes tão grande como 𝑃𝑓𝑎𝑙𝑙ℎ𝑎𝑠𝑒𝑔 𝑁𝑇0 𝑇𝑐 𝑒 𝑇𝑐𝑡𝑠𝑒𝑡𝑢𝑝 𝜏 326 A fiabilidade do sistema geralmente é medida em tempo médio entre falhas MTBF mean time between failures Como o nome sugere MTBF é a quantidade média de tempo entre as falhas do sistema É o inverso da probabilidade de que o sistema irá falhar num dado segundo 𝑀𝑇𝐵𝐹 1 𝑃𝑓𝑎𝑙𝑙ℎ𝑎𝑠𝑒𝑔 𝑇𝑐𝑒 𝑇𝑐𝑡𝑠𝑒𝑡𝑢𝑝 𝜏 𝑁𝑇0 327 A Equação 327 mostra que o MTBF melhora exponencialmente à medida que o sincronizador de espera durante mais tempo Tc Para a maioria dos sistemas um sincronizador que espera por um ciclo de relógio proporciona um MTBF seguro Excepcionalmente em sistemas de alta velocidade a espera por mais ciclos pode ser necessária Exemplo 314 SINCRONIZADOR PARA ENTRADA DE FSM A FSM do controlador de semáforo da Seção 341 recebe entradas assíncronas a partir dos sensores de tráfego Suponhase que um sincronizador é usado para garantir entradas estáveis ao controlador O tráfego chega em média 02 vezes por segundo Os flipflops do sincronizador têm as seguintes Capítulo três Projeto de Lógica Digital 204 características τ 200 ps T0 150 ps e tsetup 500 ps Quanto tempo o período de relógio sincronizador deve ter para que o MTBF exceda 1 ano Solução 1 ano 107 segundos Resolvendo a equação 327 𝜋 107 𝑇𝑐𝑒 𝑇𝑐5001012 2001012 021501012 318 Esta equação não tem solução de forma fechada No entanto é bastante fácil de resolver por tentativa e erro Numa folha de cálculo tente alguns valores para Tc e calcule o MTBF até descobrir o valor de Tc que dá um MTBF de um ano Tc 3036 ns 356 Derivada do Resolution Time A Equação 324 pode ser obtida utilizando conhecimentos básicos de teoria de circuitos equações diferenciais e probabilidade Esta seção pode ser ignorada se você não está interessado na derivação ou se você não estiver familiarizado com a matemática A saída de um flipflop será metaestável depois de algum tempo t se o flipflop amostrar uma entrada em mudança causando uma condição metaestável e a saída não se resolve para um nível válido dentro desse tempo após o flanco do relógio Simbolicamente esta pode ser expressa como 𝑃𝑡𝑟𝑒𝑠 𝑡 𝑃𝑠𝑎𝑚𝑝𝑙𝑒𝑠 𝑐ℎ𝑎𝑛𝑔𝑖𝑛𝑔 𝑖𝑛𝑝𝑢𝑡 𝑃𝑢𝑛𝑟𝑒𝑠𝑜𝑙𝑣𝑒𝑑 329 Consideramos cada termo de probabilidade individualmente O sinal de entrada assíncrona comuta entre 0 e 1 em algum tempo tswitch tal como mostrado na Figura 354 A probabilidade de que a entrada se altere durante a abertura em torno do flanco do relógio é 𝑃𝑠𝑎𝑚𝑝𝑙𝑖𝑛𝑔 𝑐ℎ𝑎𝑛𝑔𝑖𝑛𝑔 𝑖𝑛𝑝𝑢𝑡 𝑡𝑠𝑤𝑖𝑡𝑐ℎ𝑡𝑠𝑒𝑡𝑢𝑝𝑡ℎ𝑜𝑙𝑑 𝑇𝑐 330 Se o flipflop entrar em metaestabilidade isto é com probabilidade Psamples changing input o tempo para resolver a metaestabilidade depende do funcionamento interno do circuito Este tempo de Capítulo três Projeto de Lógica Digital 205 resolução determina Punresolved a probabilidade de que o flipflop ainda não esteja resolvido para um nível lógico validade após um tempo t O restante desta secção analisa um modelo simples de um dispositivo biestável para estimar essa probabilidade Figura 354 Temporização da entrada Figura 355 Modelo do circuito de um dispositivo biestável Um dispositivo biestável usa armazenamento com realimentação positiva A Figura 355 a mostra esta realimentação implementada com dois inversores o comportamento deste circuito é representativo da maioria dos elementos biestáveis Um par de inversores comportase como um buffer Vamos modelalo como tendo as características simétrica de transferência DC mostradas na Figura 355 b com um declive G O buffer pode entregar apenas uma quantidade finita de corrente de saída podemos modelar isto como uma resistência de saída R Todos os circuitos reais também possuem alguma capacidade C que deve ser carregada Carregar o condensador através da resistência provoca um atraso RC impedindo o buffer de Capítulo três Projeto de Lógica Digital 206 comutar instantaneamente Por isso o modelo do circuito completo é mostrado na Figura 355 c onde Vout t é a tensão de interesse que transmite o estado do dispositivo biestável O ponto metaestável para este circuito é Vout t Vin t VDD2 se o circuito começasse exatamente nesse ponto ele permaneceria lá indefinidamente na ausência de ruído Porque as tensões são variáveis contínuas a probabilidade de que o circuito comece exatamente no ponto metaestável é muito pequena No entanto o circuito pode começar no tempo 0 perto da metaestabilidade em vout 0 VDD2 V para um pequeno desvio de V Em tal caso o feedback positivo irá eventualmente conduzir Vout t a VDD se V 0 e a 0 se V 0 O tempo necessário para atingir VDD ou 0 é o tempo de resolução do dispositivo biestável A característica de transferência DC é não linear mas parece linear perto do ponto metaestável que é a região de interesse para nós Especificamente se vin t VDD 2 V G então Vout t VDD 2 V para pequenos V A corrente através da resistência é i t Vout t Vin t R O condensador carrega a uma taxa dvin t dt i t C Colocando juntos todos os factos encontramos a equação que governa a tensão de saída 𝑑𝑣𝑜𝑢𝑡𝑡 𝑑𝑡 𝐺1 𝑅𝐶 𝑣𝑜𝑢𝑡𝑡 𝑉𝐷𝐷 2 331 Esta é uma equação diferencial linear de primeira ordem A resolução usando a condição inicial vout 0 VDD2 V dá 𝑣𝑜𝑢𝑡𝑡 𝑉𝐷𝐷 2 Δ𝑉𝑒 𝐺1𝑡 𝑅𝐶 332 A Figura 356 fornece várias trajetórias para vout t dados vários pontos de partida vout t desloca se exponencialmente para longe do ponto metaestável VDD2 até que satura em VDD ou 0 A saída eventualmente resolvese para 1 ou 0 A quantidade de tempo depende do desvio V a partir do ponto inicial de tensão metaestável VDD2 Resolvendo a equação 332 para o tempo de resolução tres de tal forma que vout tres VDD ou 0 dá Capítulo três Projeto de Lógica Digital 207 Δ𝑉𝑒 𝐺1𝑡𝑟𝑒𝑠 𝑅 𝐶 𝑉𝐷𝐷 2 333 𝑡𝑟𝑒𝑠 𝑅 𝐶 𝐺1 ln 𝑉𝐷𝐷 2Δ𝑉 334 Em resumo o tempo de resolução aumenta se o dispositivo biestável tem alta resistência ou capacidade o que faz com que a saída mude lentamente Ela diminui se o dispositivo biestável tem ganho elevado G O tempo de resolução também aumenta algoritmicamente com o circuito a começar mais próximo do ponto metaestável V 0 Definindo τ como RC G1 Resolvendo a equação 334 para V devolve o deslocamento inicial ΔVres que corresponde a um tempo de resolução em particular tres Δ𝑉𝑟𝑒𝑠 𝑉𝐷𝐷 2 𝑒𝑡𝑟𝑒𝑠 𝜏 335 Figura 356 Trajetórias de resolução Suponhase que um dispositivo biestável amostra uma entrada ao mesmo tempo que esta muda Ele mede a tensão vin 0 que assumimos estar uniformemente distribuída entre 0 e VDD A probabilidade de que a saída não se tenha resolvido para um valor legal depois do instante tres depende da probabilidade de que o deslocamento inicial seja suficientemente pequeno Especificamente o deslocamento inicial na Vout deve ser inferior a ΔVres de modo que o deslocamento inicial em Vin seja ser inferior a ΔVres G Então Capítulo três Projeto de Lógica Digital 208 a probabilidade de que o dispositivo biestável amostre a entrada num instante de tempo para obter um nível suficientemente pequeno do deslocamento inicial é 𝑃𝑢𝑛𝑟𝑒𝑠𝑜𝑙𝑣𝑒𝑑 𝑃 𝑣𝑖𝑛0 𝑉𝐷𝐷 2 ΔVres 𝐺 2Δ𝑉𝑟𝑒𝑠 𝐺 𝑉𝐷𝐷 336 Colocar tudo em conjunto a probabilidade de que o tempo de resolução seja superior a um tempo t é dado pela seguinte equação 𝑃𝑡𝑟𝑒𝑠 𝑡 𝑡𝑠𝑤𝑖𝑡𝑐ℎ𝑡𝑠𝑒𝑡𝑢𝑝𝑡ℎ𝑜𝑙𝑑 𝐺 𝑇𝑐 𝑒𝑡 𝜏 337 Observe que a Equação 337 possui a forma de equação 324 em que T0 tswitch tsetup tholdG e τ RCG1 Em resumo derivamos a Equação 324 e mostrámos como T0 e τ dependem das propriedades físicas do dispositivo biestável 36 PARALELISMO A velocidade de um sistema é caracterizada pela latência e pela taxa de transferência de informação throughput em movimento através dela Nós definimos um token como um grupo de entradas que são processadas para produzir um grupo de saídas A latência de um sistema é o tempo requerido para que um token passe através do sistema desde o início até ao fim A taxa de transferência de informação é determinada pelo número de tokens que podem ser processados por unidade de tempo Exemplo 315 BOLOS TAXA DE TRANSFERÊNCIA DE INFORMAÇÃO E LATÊNCIA Ben Bitdiddle está dando uma festa de leite e biscoitos para celebrar a instalação de seu controlador de semáforo Ele leva 5 minutos para moldar os biscoitos e colocálos na sua bandeja Em seguida são precisos 15 minutos para que os biscoitos possam cozer no forno Uma vez que os biscoitos estejam cozidos ele começa a preparar outra bandeja Qual é a taxa de transferência e latência de Ben para uma bandeja de biscoitos Capítulo três Projeto de Lógica Digital 209 Solução Neste exemplo uma bandeja de biscoitos é um token A latência é de 13 hora por bandeja A taxa de transferência é de 3 bandejas hora Como o leitor pode imaginar o rendimento pode ser melhorado através do processamento de vários token em simultâneo Isso é chamado de paralelismo e vem em duas formas espacial e temporal Com o paralelismo espacial múltiplas cópias do hardware são fornecidas de modo que múltiplas tarefas podem ser realizadas ao mesmo tempo Com o paralelismo temporal uma tarefa é dividida em etapas como uma linha de montagem Múltiplas tarefas podem ser distribuídas através das etapas Embora cada tarefa deva passar por todas as etapas uma tarefa diferente estará em cada etapa num dado instante para que várias tarefas se possam sobrepor O paralelismo temporal é normalmente chamado de pipelining O paralelismo espacial é às vezes chamado apenas de paralelismo mas vamos evitar essa convenção de nomenclatura porque é ambígua Exemplo 316 BISCOITOS E PARALELISMO Ben Bitdiddle tem centenas de amigos que vêm para a sua festa e precisa fazer biscoitos mais rápido Ele está a pensar em usar o paralelismo espacial eou temporal Paralelismo espacial Ben pede a Alyssa P Hacker para o ajudar Ela tem a sua própria bandeja de biscoitos e forno Paralelismo Temporal Ben recebe uma segunda bandeja de biscoitos Uma vez que ele coloca uma bandeja de biscoitos no forno ele começa a moldar os biscoitos no outro tabuleiro em vez de esperar que a primeira bandeja coza Qual é a taxa de transferência e latência usando paralelismo espacial Usando paralelismo temporal Usando ambos Solução A latência é o tempo necessário para concluir uma tarefa do início até ao fim Em todos os casos a latência é de 13 hora Se Ben começa sem biscoito a latência é o tempo necessário para ele produzir a primeira bandeja de biscoitos Capítulo três Projeto de Lógica Digital 210 A taxa de transferência é o número de tabuleiros de biscoito por hora Com o paralelismo espacial Ben e Alyssa cada um completa uma bandeja a cada 20 minutos Assim a taxa de transferência duplica 6 bandejashora Com o paralelismo temporal Ben coloca um novo tabuleiro no forno a cada 15 minutos alcançando uma taxa de transferência de 4 bandejashora Estas estão ilustradas na Figura 357 Se o Ben e a Alyssa usarem ambas as técnicas eles podem cozer 8 bandejashora Considerese uma tarefa com latência L Num sistema sem paralelismo a taxa de transferência é de 1L Num sistema com espacialidade paralela com N cópias do hardware a taxa de transferência é de NL Num sistema temporalmente paralelo a tarefa é idealmente dividida em N etapas ou estágios de igual comprimento Em tal caso a taxa de transferência é também NL e apenas uma cópia do hardware é requerida No entanto como o exemplo dos biscoitos demostrou encontrando N passos de igual comprimento é muitas vezes impraticável Se o passo mais longo tem uma latência de L1 a taxa de transferência do pipeline e de 1L1 Figura 357 Paralelismo espacial e temporal na cozinha dos biscoitos Capítulo três Projeto de Lógica Digital 211 O Pipelining paralelismo temporal é particularmente atraente porque acelera um circuito sem duplicar o hardware Em vez disso os registros são colocados entre os blocos de lógica combinatória para dividir a lógica em etapas mais curtas que podem ser executadas com um relógio mais rápido Os registros evitam que um token num estágio do pipeline alcance outro token e o corrompa A Figura 358 apresenta um exemplo de um circuito sem paralelismo Ele contém quatro blocos de lógica entre os registros O caminho crítico passa através de blocos 2 3 e 4 Suponha que o registro tem um atraso de propagação de 03 ns do relógioparaQ e um tempo de configuração de 02 ns Então o tempo de ciclo é Tc 03 3 2 4 02 95 ns O circuito tem uma latência de 95 ns e uma taxa de transferência de 195 ns 105 MHz Figura 358 Circuito sem pipeline Figura 359 Circuito com pipeline de dois estágios Capítulo três Projeto de Lógica Digital 212 Figura 360 Circuito com pipeline de três estágios A Figura 359 apresenta o mesmo circuito dividido por um pipeline de dois estágios através da adição de um registro entre os blocos 3 e 4 A primeira fase tem um período de relógio mínimo de 03 3 2 02 55 ns A segunda fase tem um período de relógio mínimo de 03 4 02 45 ns O relógio deve ser lento o suficiente para que todos os estágios possam trabalhar Assim Tc 55 ns A latência é de dois ciclos de relógio ou 11 ns A taxa de transferência é de 1 55 ns 182 MHz Este exemplo mostra que num circuito real usando um pipeline com dois estágios quase dobra a taxa de transferência e aumenta ligeiramente a latência Em comparação um pipeline ideal permitiria exatamente o dobro da taxa de transferência sem qualquer penalidade na latência A discrepância acontece porque o circuito não pode ser dividido em duas metades exatamente iguais e porque os registros introduzem mais sobrecarga de sequenciamento A Figura 360 apresenta o mesmo circuito dividida num pipeline de três estágios Notese que mais dois registros são necessários para armazenar os resultados dos blocos 1 e 2 no final do primeiro estágio do pipeline O tempo de ciclo é agora limitado pelo terceiro estágio em 45 ns A latência é de três ciclos ou 135 ns A taxa de transferência é de 145 ns 222 MHz Mais uma vez a adição de um estágio do pipeline melhora o rendimento à custa de alguma latência Embora estas técnicas sejam poderosas elas não se aplicam a todas as situações A desgraça do paralelismo são as dependências Se a tarefa atual é dependente do resultado de uma tarefa anterior ao invés de apenas os estágios anteriores da tarefa atual a tarefa não pode começar até que a tarefa anterior esteja concluída Por exemplo se o Ben quer verificar se a primeira bandeja de biscoitos tem um sabor bom antes que ele comece a preparar a segunda ele tem uma dependência que impede o Capítulo três Projeto de Lógica Digital 213 pipeline e a operação paralela O paralelismo é uma das técnicas mais importantes para a concepção de sistemas digitais de alto desempenho O Capítulo 7 discute a operação de pipeline e mostra exemplos de como manipular as dependências 37 SUMÁRIO Este Capítulo descreveu a análise e projeto de lógica sequencial Em contraste com a lógica combinatória cujas saídas dependem apenas das entradas correntes saídas lógicas sequenciais dependem de ambas as entradas corrente e anteriores Por outras palavras a lógica sequencial memoriza informações sobre entradas anteriores Esta memória é chamada de estado da lógica Os circuitos sequenciais podem ser difíceis de analisar e são fáceis de desenhar incorretamente por isso limitamonos a um pequeno conjunto de blocos de construção cuidadosamente projetados O elemento mais importante para os nossos propósitos é o flipflop que recebe um relógio e uma entrada D e produz uma saída Q O flipflop cópia D para Q no flanco ascendente do relógio e de outra forma recordase do antigo estado de Q Um grupo de flipflops que partilham de um relógio é geralmente chamado de registro Os flipflops podem também receber sinais de controlo de reset ou enable Embora existam muitas formas de lógica sequencial nós nos disciplinamos em usar circuitos sequenciais síncronos porque são fáceis de projetar Os circuitos sequenciais síncronos consistem em blocos de lógica combinatória separados por registros operados por relógios O estado do circuito é armazenado no registro e atualizado apenas nos flancos do relógio As máquinas de estados finitos são uma técnica poderosa para projetar circuitos sequenciais Para projetar uma FSM primeiro devemos identificar as entradas e as saídas da máquina e esboçar um diagrama de transição de estado indicando os estados e as transições entre eles Devemos selecionar uma codificação para os estados e reescrever o diagrama como uma tabela de transição de estado e tabela de saída indicando o próximo estado e de saída dado o estado atual e as entradas A partir dessas tabelas podemos projetar a lógica combinatória para determinar o próximo estado e a saída e em seguida podemos esboçar o circuito Quem conseguisse inventar lógica cujas saídas dependessem de entradas futuras seria fabulosamente rico Capítulo três Projeto de Lógica Digital 214 Os circuitos sequenciais síncronos possuem especificações temporais incluindo o tempo de propagação do relógioparaQ e os contamination delays tpcq e tccq e o setup time e hold time tsetup e thold Para uma operação correta as suas entradas devem estar estáveis durante um aperture time que começa um setup time antes do flanco ascendente do relógio e termina um hold time após o flanco ascendente do relógio O tempo de ciclo mínimo Tc do sistema é igual ao atraso de propagação tpd através da lógica combinatória mais tpcq tsetup do registro Para uma operação correta o contamination delay através do registro e da lógica de combinatória deve ser maior que thold Apesar da concepção errada o hold time não afeta o tempo de ciclo O desempenho geral do sistema é medido em latência e taxa de transferência A latência é o tempo necessário para que um token passe do início ao fim A taxa de transferência corresponde ao número de tokens que o sistema pode processar por unidade de tempo O paralelismo melhora a taxa de transferência do sistema Capítulo três Projeto de Lógica Digital 215 Exercícios Exercício 31 Dadas as formas de onda mostradas na Figura 361 esboçar a saída Q de uma báscula SR Figura 361 Formas de onda de entrada da báscula SR para o Exercício 31 Exercício 32 Dadas as formas de onda mostradas na Figura 362 esboçar a saída Q de uma báscula SR Figura 362 Formas de onda de entrada de báscula SR para o Exercício 32 Exercício 33 Dadas as formas de onda mostradas na Figura 363 esboçar a saída Q D de uma báscula Figura 363 Formas de onda de entrada da báscula D ou flipflop para os Exercício 33 e Exercício 35 Capítulo três Projeto de Lógica Digital 216 Exercício 34 Dadas as formas de onda mostradas na Figura 364 esboçar a saída Q de uma báscula D Figura 364 Formas de onda da entrada de D da báscula ou flipflop para os Exercício 34 e Exercício 36 Exercício 35 Tendo em conta as formas de onda mostradas na Figura 363 esboçar a saída Q de um flipflop D Exercício 36 Dadas as formas de onda mostradas na Figura 364 esboçar a saída Q de um flip flop D Exercício 37 O circuito na Figura 365 é de lógica combinatória ou de lógica sequencial Explicar de uma forma simples qual é a relação entre as entradas e saídas Como o leitor chamaria a este circuito Figura 365 Circuito mistério Capítulo três Projeto de Lógica Digital 217 Exercício 38 O circuito na Figura 366 é de lógica combinatória ou de lógica sequencial Explicar de uma forma simples qual é a relação entre as entradas e saídas Como o leitor chamaria a este circuito Figura 366 Circuito mistério Exercício 39 O flipflop toogle T tem uma entrada CLK e uma saída P A cada flanco ascendente do CLK Q alterna com o complemento do seu valor anterior Desenhe um esquema para um flipflop T usando um D flipflop e um inversor Exercício 310 Um flipflop JK recebe um relógio e duas entradas J e K No flanco ascendente do relógio ele atualiza a saída P Se J e K são ambos 0 Q mantém o seu valor antigo Se apenas J é 1 Q tornase 1 Se apenas K é 1 Q tornase 0 Se ambos J e K são 1 Q tornase o oposto do seu estado atual a Construa um flipflop JK usando um flipflop D e algumas combinações lógica b Construa um flipflop D usando um flipflop JK e algumas combinações lógica c Construir um flipflop T ver Exercício 39 usando um flipflop JK Capítulo três Projeto de Lógica Digital 218 Exercício 311 O circuito da Figura 367 é chamado de elemento CMuller Explique que forma simples qual é a relação entre as entradas e saída Figura 367 ElementoC de Muller Exercício 312 Projete uma báscula D resettable assíncrona usando portas lógicas Exercício 313 Projete um flipflop D resettable assíncrono usando portas lógicas Exercício 314 Projete um flipflop D settable síncrona configurável usando portas lógicas Exercício 315 Projete um flipflop D settable assíncrona usando portas lógicas Exercício 316 Suponha que um oscilador em anel é construído a partir de N inversores ligados num loop Cada inversor tem um atraso mínimo de tcd e um atraso máximo de tpd Se N é ímpar determine a gama de frequências em que o oscilador pode operar Exercício 317 Por que deve N ser impar no Exercício 316 Capítulo três Projeto de Lógica Digital 219 Exercício 318 Quais dos circuitos da Figura 368 são circuitos sequenciais síncronos Explique Figura 368 Circuitos Exercício 319 O leitor está a projetar um controlador para um elevador de um edifício de 25 andares O controlador possui duas entradas para cima e para baixo Ele produz uma saída que indica o andar que o elevador está ligado Não há piso 13 Qual é o número mínimo de bits de estado do controlador Exercício 320 leitor está a projetar uma FSM para acompanhar o humor dos quatro estudantes que trabalham no laboratório de projeto digital O humor de cada aluno é ou HAPPY o circuito funciona SAD o circuito explodiu BUSY trabalhando no circuito CLUELESS confuso sobre o circuito ou ASLEEP face para baixo na placa de circuito Quantos estados tem a FSM Qual é o número mínimo de bits necessários para representar estes estados Capítulo três Projeto de Lógica Digital 220 Exercício 321 Como realizar o factoring da FSM do Exercício 320 em várias máquinas mais simples Quantos estados cada máquina mais simples tem Qual é o número mínimo total de bits necessários neste projeto Exercício 322 Descreva por palavras o que faz a máquina de estado da Figura 369 Utilizando a codificação binária de estado complete uma tabela de transição de estado e uma tabela de saída para a FSM Escreva as equações Booleanas para o próximo estado e de saída e esboce um esquema da FSM Figura 369 Diagrama de transição de estados Exercício 323 Descreva por palavras suas o que faz a máquina de estado na Figura 370 Utilizando a codificação de estado binário complete uma tabela de transição de estado e uma tabela de saída para a FSM Escreva as equações Booleanas para o próximo estado e de saída e esboce um esquema da FSM Figura 370 Diagrama de transição de estados Capítulo três Projeto de Lógica Digital 221 Exercício 324 Os acidentes continuam a ocorrer no cruzamento da Avenida Académica e com o Boulevard Bravado A equipa de futebol corre para o cruzamento no momento em que a luz B fica verde Eles estão a chocar com os alunos de mestrado privados de sono que cambaleiam para o cruzamento um pouco antes da luz A ficar vermelha Estenda o controlador de semáforo da Seção 341 para que ambas as luzes sejam vermelhas por 5 segundos antes de qualquer luz ficar verde novamente Esboce o seu melhorou diagrama de transição de estados da máquina de Moore codificações de estados tabela de transição de estado tabela de saída equações de próximo estado e de saída e o esquema da sua FSM Exercício 325 O caracol da Alyssa P Hacker da Seção 343 tem uma filha cujo cérebro é uma máquina de Mealy A caracol filha sorri quando ela desliza sobre o padrão de 1101 ou o padrão 1110 Esboce o diagrama de transição de estado para este caracol feliz usando o menor número de estados possível Escolha uma codificação de estados e escreva uma tabela de transição de estado e de saída combinada usando as suas codificações Escreva as equações do próximo estado e de saída e esboce o esquema da sua FSM Exercício 326 O leitor foi convocado para projetar um distribuidor de máquina de refrigerante para a sala do departamento Os refrigerantes são parcialmente subsidiados pelo capítulo estudante do IEEE pelo que custam apenas 25 centavos A máquina aceita níqueis moedas de dez centavos e quartos Quando forem inseridas moedas suficientes ele dispensa o refrigerante e retorna o troco necessário Projete um controlador FSM para a máquina de refrigerante As entradas da FSM são Nickel Dime e Quarter indicando a moeda que foi inserido Suponha que uma moeda é inserida exatamente em cada ciclo As saídas são Dispense Return Nickel Return Dime e ReturnTwoDimes Quando a FSM chega a 25 centavos de dólar ativa o dispensador e as saídas Return devolvem o troco necessários Em seguida ela deve estar pronta para começar a aceitar moedas para outro refrigerante Capítulo três Projeto de Lógica Digital 222 Exercício 327 O código de Grey tem uma propriedade útil na qual os números consecutivos diferem apenas num bit de posição A Tabela 323 lista um código de Gray de 3bits que representa os números 0 a 7 Projete uma FSM de um contador de Gray de 3bit módulo 8 sem entradas e com três saídas Um contador módulo N conta de 0 a N1 repetidamente Por exemplo um relógio usa um contador de módulo 60 para os minutos e segundos que contam de 0 a 59 Quando reiniciado a saída deve ser 000 Em cada ciclo de relógio a saída deve avançar para o próximo código de Gray Depois de atingir 100 deve repetir com 000 Tabela 323 Código de Gray de 3bits Exercício 328 Estenda o seu contador de Gray módulo 8 do Exercício 327 para um contador UPDOWN adicionando uma entrada UP Se UP 1 o contador avança para a próxima série Se UP 0 o contador recua para o número anterior Capítulo três Projeto de Lógica Digital 223 Exercício 329 A sua empresa Detectorama gostaria de projetar uma FSM que leva duas entradas A e B e gera uma saída Z A saída no ciclo n Zn ou é o resultado booleano de AND ou OR da correspondente entrada An e da entrada anterior An1 dependendo a outra entrada Bn 𝑍𝑛 𝐴𝑛𝐴𝑛1 𝑠𝑒 𝐵𝑛 0 𝑍𝑛 𝐴𝑛 𝐴𝑛1 𝑠𝑒 𝐵𝑛 1 a Esboce a forma de onda para Z dadas as entradas mostrados na Figura 371 b É esta FSM uma máquina de Moore ou de Mealy c Projete a FSM Mostre o seu diagrama de transição de estado tabela de transição de estados codificados equações de próximo estado e de saída e esquemático Figura 371 Formas de onda das entradas da FSM Exercício 330 Projete uma FSM com uma entrada A e duas saídas X e Y X deve ser 1 se A tiver sido 1 por pelo menos durante três ciclos não necessariamente consecutivamente Y deve ser 1 se A tiver sido 1 por pelo menos dois ciclos consecutivos Mostre o seu diagrama de transição de estado tabela de transição de estados codificados equações do próximo estado e de saída e esquemático Exercício 331 Analise a FSM mostrada na Figura 372 Escreva as tabelas de transição de estados e de saída e esboce o diagrama de transição de estado Descrever em palavras o que a FSM faz Capítulo três Projeto de Lógica Digital 224 Figura 372 Esquemático da FSM Exercício 332 Repita o Exercício 331 para a FSM mostrada na Figura 373 Lembrese que as entradas s e r do registro indicam ligada e desligada respectivamente Figura 373 Esquemático da FSM Exercício 333 Ben Bitdiddle projetou o circuito da Figura 374 para calcular uma função com registro XOR de quatro entradas Cada porta XOR de duas entradas tem um atraso de propagação de 100 ps e um contamination delay de 55 ps Cada flipflop tem um tempo de configuração de 60 ps um hold time de 20 ps um atraso máximo de relógioparaQ de 70 ps e um atraso mínimo de relógioparaQ de 50 ps a Se não houver nenhum skew do relógio qual é a frequência máxima de funcionamento do circuito b Quanto skew do relógio pode tolerar o circuito se deve operar a 2 GHz c Quanto skew do relógio pode tolerar o circuito antes que ele possa experimentar uma violação do hold time d Alyssa P Hacker observa que ela pode redesenhar a lógica combinatória entre os registros para ser mais rápida e tolerar mais a skew do relógio O seu circuito melhorado também utiliza três Capítulo três Projeto de Lógica Digital 225 XOR de duas entradas mas eles estão dispostos de forma diferente Qual é o seu circuito Qual é a sua frequência máxima se não houver a skew do relógio Quanto skew do relógio pode tolerar o circuito antes que ele possa experimentar uma violação do hold time Figura 374 Circuito XOR de quatro entradas com registro Exercício 334 O leitor está a projetar um componente adicional para o extremamente rápido processador RePentium 2bits O somador é construído a partir de dois fulladders tal que o transporte para fora do primeiro somador é o transporte para o segundo somador como mostrado na Figura 375 O seu somador tem registros de entrada e saída e deve completar a soma num ciclo de relógio Cada fulladder possui os seguintes atrasos de propagação 20 ps de Cin para Cout ou para Sum S 25 ps de A ou B para Cout e 30 ps de A ou B para S O somador tem um contamination delay de 15 ps da Cin para qualquer saída e 22 ps de A ou B para qualquer saída Cada flipflop tem um setup time de 30 ps um hold time de 10 ps um atraso de propagação relógioparaQ de 35 ps e um contamination delay do relógioparaQ de 21 ps a Se não houver nenhum skew do relógio qual é a frequência máxima de funcionamento do circuito b Quanto skew do relógio pode tolerar o circuito se ele deve operar a 8 GHz c Quanto skew do relógio pode tolerar o circuito antes que ela possa experimentar uma violação hold time Capítulo três Projeto de Lógica Digital 226 Figura 375 Esquemático de um somador de 2bits Exercício 335 Uma FPGA Fields Programmable Gate Array usa CLB Configurable Logical Blocks em vez de portas lógicas para implementar a lógica combinatória A FPGA da Xilinx Spartan 3 tem atrasos de propagação e contaminantion delay de 061 e 030 ns respectivamente para cada CLB Ela também contém flipflops com atrasos de propagação e contaminantion delay de 072 e 050 ns e setup time e hold time de 053 e 0 ns respectivamente a Se o leitor está a construir um sistema que precisa operar a 40 MHz quantos CLB consecutivos pode usar entre dois flipflops Suponha que não há nenhum skew do relógio e nenhum atraso através dos condutores entre CLB b Suponha que todos os caminhos entre flipflops passam por pelo menos um CLB Quanto skew do relógio pode o FPGA ter sem violar o hold time Exercício 336 Um sincronizador é construído a partir de um par de flipflops com tsetup 50 ps T0 20 ps e τ 30 ps Amostra uma entrada assíncrona que muda 108 vezes por segundo Qual é o período mínimo de relógio do sincronizador para alcançar um tempo médio entre falhas MTBF de 100 anos Capítulo três Projeto de Lógica Digital 227 Exercício 337 O leitor gostaria de construir um sincronizador que pode receber entradas assíncronas com um MTBF de 50 anos O sistema opera a 1 GHz e são utilizados flipflops com amostragem τ 100 ps T0 110 ps e tsetup 70 ps O sincronizador recebe uma nova entrada assíncrona em média 05 vezes por segundo isto é uma vez a cada 2 segundos Qual é a probabilidade de falha requerida no cumprimento desta MTBF Quantos ciclos de relógio seriam necessários esperar antes de ler o sinal de entrada amostrado para obter essa probabilidade de erro Exercício 338 O leitor está andando pelo corredor quando você encontra o seu parceiro de laboratório caminhando em outra direção Os dois dão um primeiro passo para um lado e ainda assim estão no caminho um do outro Então ambos dão um passo para o outro lado e continuam no caminho um do outro Em seguida ambos esperam um pouco na expectativa de que a outra pessoa dê um passo para se afastar O leitor pode modelar esta situação como um ponto metaestável e aplicar a mesma teoria que tem sido aplicado a sincronizadores e flipflops Suponha que criar um modelo matemático para si e para o seu parceiro de laboratório Começa o infeliz encontro no estado metaestável A probabilidade de que você permanecer nesse estado após t segundos é 𝑒 𝑡 𝜏 Em que τ indica a sua taxa de resposta Hoje o seu cérebro foi afetado pela falta de sono e tem τ 20 segundos a Quanto tempo passará até que o leitor tenha 99 de certeza de que vai sair da metaestabilidade ie Descobrir como passar um ao outro b O leitor não está apenas sonolento mas também com uma fome voraz Na verdade vai morrer de fome se não começar a ir para o refeitório dentro de 3 minutos Qual é a probabilidade de que o seu parceiro de laboratório tenha que o arrastar até à morgue Exercício 339 O leitor construiu um sincronizador usando flipflops com T0 20 ps e τ 30 ps O seu chefe dizlhe que vai ser preciso aumentar o MTBF por um fator de 10 De quanto será preciso incrementar o período de relógio Capítulo três Projeto de Lógica Digital 228 Exercício 340 Ben Bitdiddle inventa o sincronizador novo e melhorado da Figura 376 que afirma eliminar a metaestabilidade num único ciclo Ele explica que o circuito na caixa M é um detector analógico de metaestabilidade que produz uma saída de tensão HIGH se a entrada está na zona proibida entre VIL e VIH O detector de metaestabilidade verifica para determinar se o primeiro flip flop produziu uma saída metaestável em D2 Se assim for realizada um reset assíncrono do flipflop para produzir um 0 bom em D2 O segundo flipflop em seguida amostra D2 produzindo sempre um nível lógico válido em Q Alyssa P Hacker diz a Ben que deve haver um erro no circuito porque eliminar a metaestabilidade é tão impossível quanto a construção de uma máquina de movimento perpétuo Quem está certo Explique mostrando o erro de Ben ou mostrando porque é que a Alyssa está errada Figura 376 Sincronizador novo e melhorado Capítulo três Projeto de Lógica Digital 229 Questões de entrevista Os exercícios seguintes apresentam perguntas que foram feitas em entrevistas para trabalhos de projeto digital Pergunta 31 Desenhar uma máquina de estados que poderia detectar quando ela recebesse a sequência série 01010 na entrada Pergunta 32 Projete uma FSM série um bit por vez complementar com duas entradas Start e A e uma saída Q Um número binário de comprimento arbitrário é fornecido na entrada A começando com o bit menos significativo O bit correspondente da saída aparece em Q no mesmo ciclo Start é cativado num ciclo para inicializar a FSM antes do bit menos significativo ser fornecido Pergunta 33 Qual é a diferença entre uma báscula e um flipflop Em que circunstâncias é preferível cada um Pergunta 34 desenhe um contador de 5bits finito com uma máquina de estados Pergunta 35 Projete um circuito detector de flanco A saída deve ir a HIGH um ciclo após a entrada fazer uma transição 0 1 Pergunta 36 Descreva o conceito de pipelining e por que ele é usado Capítulo três Projeto de Lógica Digital 230 Pergunta 37 Descreva o que significa para um flipflop ter um hold time negativo Pergunta 38 Dado sinal A mostrado na Figura 377 projete um circuito que produza sinal B Figura 377 Formas de onda dos sinais Pergunta 39 Considere um bloco de lógica entre dois registros Explicar as restrições de tempo Se for adicionado um buffer na entrada do relógio do receptor o segundo flipflop a restrição de setup time ficar melhor ou pior 231 4 Linguagens de Descrição de Hardware 41 INTRODUÇÃO Até agora temos focado o projeto de circuitos digitais combinatórios ou sequenciais a nível de diagramas esquemáticos O processo de encontrar um conjunto eficiente de portas lógicas para realizar uma dada função é trabalhoso e propenso a erros uma vez que são necessárias simplificações manuais de tabelas verdade ou de equações Booleanas e tradução manual de máquinas de estado finitos em portas Na década de 90 os projetistas descobriram que eram muito mais produtivos se trabalhassem num nível maior de abstração especificando apenas a função lógica e permitindo que uma ferramenta de projeto auxiliado por computador CAD computeraided design produzisse as portas otimizadas As especificações são de modo geral dadas numa linguagem de descrição de hardware HDL hardware descriprion language As duas principais linguagens de descrição de hardware são a SystemVerilog e a VHDL A SystemVerilog e VHDL são construídas sobre princípios similares mas possuem sintaxes diferentes As discussões destas linguagens neste Capítulo são divididas em duas colunas para comparação literal lado a lado com a SystemVerilog à esquerda e a VHDL à direita Quando ler este Capítulo pela primeira vez foque numa linguagem ou outra Uma vez que conheça alguma você poderá rapidamente aprender a outra caso precise Os Capítulos subsequentes mostram o hardware tanto na forma esquemática quanto na forma HDL Se você optar por pular este Capítulo e não aprender uma das HDL você ainda será capaz de dominar os Capítulo quatro Linguagens de Descrição de Hardware 232 princípios da organização computacional dos esquemáticos No entanto a grande maioria dos sistemas comerciais atualmente são construindos utilizandose HDL ao invés de esquemáticos Se você pretende ser um projetista de sistemas digitais em qualquer ponto de sua carreira profissional será aconselhado a aprender uma das HDL 411 Módulos Um bloco de hardware com entradas e saídas é chamado de módulo Uma porta AND um multiplexador e um circuito de prioridade são todos exemplos de módulos de hardware Os dois estilos gerais para a descrição da funcionalidade do módulo são a comportamental e a estrutural Modelos comportamentais descrevem o que o módulo faz Modelos estruturais descrevem como o módulo é construído a partir de partes simples é uma aplicação de hierarquia O código SystemVerilog e VHDL no Exemplo HDL 41 ilustram as descrições comportamentais de um módulo que determina a função lógica do exemplo 26 𝑌 𝐴𝐵𝐶 𝐴𝐵𝐶 𝐴𝐵𝐶 Em ambas as linguagens o módulo é chamado sillyfuction e tem três entradas a b e c e uma saída y Exemplo HDL 41 LÓGICA COMBINATÓRIA SystemVerilog Module sillyfunctioninput logic a b c output logic y assign a b c a b c a b c endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity sillyfunction is porta b c in STDLOGIC y out STDLOGIC end architecture synth of sillyfunction is begin y not a and not b and not c or a and not b and not c or a and not b and c end Capítulo quatro Linguagens de Descrição de Hardware 233 Um módulo SystemVerilog começa com o nome do módulo e uma lista de entradas e saídas A declaração assign descreve a lógica combinatória indica NOT indica AND e indica OR Sinais do tipo logic tais como entradas e saídas são variáveis Boolenanas 0 ou 1 Eles também podem ter valores flutuantes e indefinidos com discutido na seção 428 O tipo logic foi introduzido em SystemVerilog Ele substitui o tipo reg o qual era uma permanente fonte de confusão no Verilog logic deveria ser utilizado sempre exceto em sinais com múltiplos drivers Sinais com múltiplos drivers são chamados de nets e são explicados na seção 47 O código VHDL possui três partes a cláusula library use a declaração entity e o corpo architecture A cláusula library use será discutida na seção 472 a declaração entity lista o nome do módulo e as suas entradas e saídas O corpo architecture define o que o módulo faz Os sinais VHDL tais como entradas e saídas devem ter uma declaração de tipo Sinais digitais devem ser declarados como sendo do tipo STDLOGIC Sinais do tipo STDLOGIC podem ter valores 0 ou 1 assim como valores indefinidos e flutuantes que serão descritos na seção 428 O tipo STDLOGIC é definido na biblioteca IEEESTDLOGIC1164 e é por isso que essa biblioteca deve ser utilizada A VHDL necessita de uma boa ordem padrão de operações entre AND e OR por isso equações Booleanas devem estar entre parênteses Um módulo como o leitor poderia esperar é uma boa aplicação de modularidade Ele tem numa interface bem definida consistindo em entradas e saídas e realiza uma função O modo particular no qual ele é codificado não é importante para os outros que podem utilizar esse código contanto que ele execute a sua função 412 Origens das Linguagens As universidades estão quase igualmente divididas sobre qual dessas linguagens será apresentada num primeiro curso A indústria está tendendo para o SystemVerilog mas muitas companhias continuam utilizando o VHDL e muitos projetistas precisam ser fluentes em ambas Comparada à SystemVerilog a VHDL é mais prolixa e trabalhosa como o leitor poderia esperar de uma linguagem desenvolvida por um comitê O termo bug data da invenção do computador Thomas Edison chamava de bugs as pequenas falhas e dificuldades em suas invenções em 1878 Capítulo quatro Linguagens de Descrição de Hardware 234 SystemVerilog A Verilog foi desenvolvida pela Gateway Design Automation como uma linguagem proprietária para simulações lógicas em 1984 A Gateway foi adquirida pela Cadence em 1989 e a Verilog se tornou um padrão aberto em 1990 sob o controle da Open Verilog International A linguagem se tornou um padrão IEEE em 1995 A linguagem foi estendida em 1995 para simplificar idiossincrasias e para melhor suportar a modelagem e a verificação de sistemas Essas extensões foram fundidas num padrão único de linguagem o qual agora é chamado de SystemVerilog IEEE STD 18002009 Os nomes de arquivos em SystemVerilog normalmente terminam em sv VHDL A linguagem VHDL é um acrônimo para VHSIC Hardware Description Language A VHSIC é por sua vez um acrônimo para o programa Very High Speed Integrated Circuits do Departamento de Defesa dos EUA A VHDL foi originalmente desenvolvida em 1981 pelo Departamento de Defesa para descrever estruturas e funções de hardware Foi baseado na linguagem de programação Ada A linguagem foi inicialmente imaginada para documentação mas foi rapidamente adotada para simulação e síntese O IEEE a padronizou em 1987 e atualizou o padrão muitas vezes desde então Este Capítulo é baseado na revisão de 2008 do padrão VHDL IEEE STD 10762008 o que agiliza a linguagem em vários modos Na hora da escrita nem todas as características do VHDL 2008 são suportadas pelas ferramentas CAD este Capítulo usa apenas aquelas entendidas pelo Synplicity Altera Quartus e ModelSim Os arquivos VHDL têm os seus nomes normalmente terminados em vhd Ambas as linguagens são totalmente capazes de descrever qualquer sistema de hardware e ambas possuem as suas peculiaridades A melhor linguagem para se usar é aquela em uso no seu local de trabalho ou aquela que os seus clientes exigem A maioria das ferramentas CAD hoje em dia permitem que as duas linguagens sejam misturas de modo que diferentes módulos possam ser descritos em linguagens diferentes Capítulo quatro Linguagens de Descrição de Hardware 235 413 Simulação e Síntese Os dois maiores propósitos das HDL são a simulação e a síntese lógicas Durante a simulação as entradas são aplicadas ao módulo e as saídas são examinadas para verificar se o módulo opera corretamente Durante a síntese a descrição textual do módulo é transformada em portas lógicas Simulação Os humanos rotineiramente cometem erros Tais erros em projetos de hardware são chamados de bugs Eliminar os bugs de um sistema digital é obviamente importante especialmente quando os clientes estão pagando dinheiro e há vidas que dependem da correta operação Testar um sistema no laboratório é algo demorado Descobrir a causa dos erros no laboratório pode ser extremamente difícil pois apenas sinais encaminhados para o chip podem ser observados Não existe um modo para diretamente observar o que está acontecendo dentro de um chip Corrigir erros após a construção do sistema pode ser devastadoramente caro Por exemplo corrigir um erro num circuito integrado topo de gama custa mais de um milhão de dólares e leva muitos meses Um bug infame foi o FDIV divisão em vírgula flutuante num processador Pentium da Intel que forcou a companhia a substituir os chips após eles terem sido despachados com um custo total de U 475 milhões A simulação lógica é essencial para testar um sistema antes de que ele seja construído A Figura 41 mostra as formas de onda para uma simulação do módulo sillyfunction anterior demonstrando que o módulo funciona corretamente y é TRUE quando a b e c são 000 100 e 101 como especificado na equação Booleana Figura 41 Formas de onda de simulação O termo bug é anterior à invenção do computador Thomas Edison chamava de bugs em 1878 as pequenas falhas e dificuldades das suas invenções O primeiro bug real de computador foi uma mariposa descoberta entre os relés do computador eletromecânico Harvard Mark II em 1947 Ela foi encontrada por Grace Hopper que registrou o incidente comentando o primeiro caso verdadeiro de um bug sendo encontrado Capítulo quatro Linguagens de Descrição de Hardware 236 Síntese A síntese lógica transforma o código HDL numa netlist descrevendo o hardware isto é as portas lógicas e os fios que as conectam O sintetizador lógico pode realizar otimizações para reduzir a quantidade de hardware necessário A netlist pode ser um arquivo de texto ou pode ser desenhada como um esquemático para ajudar a visualizar o circuito A Figura 42 mostra o resultado da síntese do módulo sillyfunction Note como os três AND de três entradas são simplificados como dois AND de duas entradas como mostrado por nós no exemplo 26 utilizando álgebra Booleana Figura 42 Circuito Sintetizado A descrição de circuitos em HDL lembra os códigos de uma linguagem de programação No entanto você deve se lembrar que o código é projetado para representar hardware SystemVerilog e VHDL são linguagens ricas com muitos comandos Nem todos esses comandos podem ser sintetizados em hardware Por exemplo um comando para imprimir resultados na tela durante uma simulação não pode ser traduzido em hardware Devido ao nosso principal interesse ser construir hardware nós iremos enfatizar um subconjunto sintetizável das linguagens Especificamente iremos dividir o código HDL em módulos sintetizáveis e de testes Os módulos sintetizáveis descrevem o hardware Os códigos de teste contêm entradas para aplicar num módulo para verificar quando os resultados na saída estão corretos e imprimir discrepâncias entre saídas reais e esperadas O código de teste tem a intenção apenas de simulação e não pode ser sintetizado Um dos erros mais comuns dos iniciantes é pensar em HDL como sendo um programa de computador ao invés de uma abreviação para descrever hardware digital Se você não sabe aproximadamente que Capítulo quatro Linguagens de Descrição de Hardware 237 hardware deve ser sintetizado você provavelmente não gostará do que irá conseguir O leitor pode criar muito mais hardware do que o necessário ou então escrever códigos que são simulados corretamente mas não podem ser implementados em hardware Ao invés disso pense no seu sistema em termos de blocos combinatórios registradores e máquinas de estados finitos Esboce esses blocos num papel e então mostre como eles são conectados antes de começar a escrever o código Através da nossa experiência o melhor modo de aprender uma HDL é através de exemplos As HDL possuem meios específicos de descrever várias classes de lógica esses modos são chamados de idiomas Este Capítulo vai ensinálo a como escrever o idioma HDL adequado para cada tipo de bloco e em seguida como reunir esses blocos para produzir um sistema funcional Quando o leitor precisar descrever um tipo particular de hardware procure por um exemplo similar e adapteo para o seu propósito Não nos atentaremos a definir rigorosamente a sintaxe das HDL pois isso é mortalmente tedioso e porque isso tende a encorajar o pensamento das HDL como linguagens de programação e não abreviações para hardware As especificações da IEEE SystemVerilog e da VHDL e os seus manuais exaustivos e resumidos contém todos os detalhes se o leitor necessitar de mais informação num tópico particular Veja a seção de leituras complementares no final deste livro 42 LÓGICA COMBINATÓRIA Lembrese que nós estamos nos disciplinando para projetar circuitos sequenciais síncronos os quais consistem de lógica combinatória e registradores As saídas da lógica combinatória dependem apenas das entradas atuais Esta seção descreve como escrever modelos comportamentais de lógica combinatória utilizandose HDL 421 Operadores Bit a Bit Operadores bit a bit agem em sinais de bits individuais ou em barramentos multibit Por exemplo o módulo inv no Exemplo HDL 42 descreve quatro inversores conectados a barramentos de 4bits Capítulo quatro Linguagens de Descrição de Hardware 238 Exemplo HDL 42 INVERSORES SystemVerilog module invinput logic30 a output logic30 y assign ya endmodule a30 representa um barramento de 4bits Os bits do mais significativo para o menos significativo são a3 a2 a1 e a0 Essa é a chamada ordem de littleendian devido ao bit menos significativo ter o menor número de bit Nós poderíamos ter nomeado o barramento a41 caso em que a4 seria o mais significativo Ou então poderíamos ter usado a03 em cujo caso os bits do mais significativo para o menos significativo seriam a0 a1 a2 e a3 Isto é chamado big endian order VHDL library IEEE use IEEESTDLOGIC1164all entity inv is porta in STDLOGICVECTOR3 downto 0 y out STDLOGICVECTOR3 downto 0 end architecture synth of inv is begin t not a end VHDL utiliza STDLOGICVECTOR para indicar os barramentos de STDLOGIC STDLOGICVECTOR3 downto 0 representa um barramento de 4bits Os bits do mais significativo para o menos significativo são a3 a2 a1 e a0 Esta é a chamada little endian pois o bit menos significativo tem o menor número Nós poderíamos ter declarado o barramento como STDLOGICVECTOR4 downto 1 caso em que o bit 4 seria o mais significativo Ou nós poderíamos ter escrito STDLOGICVECTOR0 to 3 caso em que os bits do mais significativo para o menos significativo seriam a0 a1 a2 e a3 Esta é a chamada ordem bigendian Capítulo quatro Linguagens de Descrição de Hardware 239 Figura 43 Circuito inv sintetizado A ordenação de um barramento é puramente arbitrária De fato a ordenação é também irrelevante para este exemplo pois num banco de inversores não interessa qual a ordem em que os bits estão A ordenação apenas interessa para os operadores tais como adição onde a soma de uma coluna se transporta para a próxima Qualquer ordenação é aceitável desde que utilizada consistentemente Iremos consistentemente utilizar a ordem littleendian N10 em SystemVerilog e N1 downto 0 em VHDL para um barramento de Nbits Após cada código de exemplo neste Capítulo um esquemático é produzido a partir do código SystemVerilog através da ferramenta de síntese Synplify Premier A Figura 43 mostra que o módulo inv sintetiza um banco de quatro inversores conectados a barramentos de entrada e saída de 4bits Um hardware similar é produzido a partir do código VHDL sintetizado O módulo gates no Exemplo HDL 43 demonstra operações bit a bit em barramentos de 4bits para outras funções lógicas básicas Exemplo HDL 43 PORTAS LÓGICAS SystemVerilog module gatesinput logic 30 a b output logic 30 y1 y2 y3 y4 y5 five different twoinput logic gates acting on 4bit busses VHDL library IEEE use IEEESTDLOGIC1164all entity gates is porta b in STDLOGICVECTOR3 downto 0 y1 y2 y3 y4 y5 out STDLOGICVECTOR3 downto 0 end Capítulo quatro Linguagens de Descrição de Hardware 240 assign y1 a b AND assign y2 a b OR assign y3 a b XOR assign y4 a b NAND assign y5 a b NOR endmodule e são exemplos de operadores SystemVerilog onde a b e y1 são operandos Uma combinação de operadores e operandos como por exemplo ab ou ab é chamada de expressão Um comando completo como assign y4 ab é chamado declaração assign out in1 op in2 é chamado de declaração de atribuição contínua Atribuições contínuas terminam com um ponto e vírgula A qualquer momento que as entradas do lado direito de numa declaração de atribuição contínua mudam a saída do lado esquerdo é recalculada Desta maneira declarações de atribuições contínuas descrevem lógica combinatória architecture synth of gates is begin five different twoinput logic gates acting on 4bit busses y1 a and b y2 a or b y3 a xor b y4 a nand b y5 a nor b end not xor e or são exemplos de operadores VHDL onde a b e y1 são operandos Uma combinação de operadores e operandos como a and b ou a nor b é chamada de expressão Um comando completo como y4 a nand b é chamado de declaração out in1 op in2 é chamado de declaração de atribuição de sinal concorrente Declarações de atribuições VHDL terminam com um ponto e vírgula A qualquer momento que as entradas do lado direito de numa declaração de atribuição de sinal concorrente muda a saída ao lado esquerdo é recalculada Dessa maneira declarações de atribuição de sinais concorrentes descrevem lógica combinatória Capítulo quatro Linguagens de Descrição de Hardware 241 Figura 44 Circuito gates sintetizado 422 Comentários e Espaços em Branco O exemplo das portas mostrou como formatar comentários SystemVerilog e VHDL não são exigentes em relação ao uso de espaços em branco isto é espaços tabs e quebras de linha Mesmo assim uma indentação apropriada e o uso de linhas em branco são úteis para tornar projetos não triviais mais legíveis Seja consistente no uso de capitalização e underscores nos nomes dos módulos e dos sinais Este texto utiliza sempre letras minúsculas Nomes de sinais e de módulos não devem começar com um dígito SystemVerilog Os comentários em SystemVerilog são iguais aos do C ou Java Comentários que iniciam com continuarão possivelmente através de muitas linhas até o próximo Comentários iniciando com continuam até o final da mesma linha VHDL Comentários que se iniciam com continuam possivelmente através de múltiplas linhas até o próximo Comentários que se iniciam com continuam até o fim da mesma linha VHDL não é case sensitive y1 e Y1 são os mesmos sinais em VHDL No entanto outras ferramentas que podem ler o seu arquivo podem Capítulo quatro Linguagens de Descrição de Hardware 242 SystemVerilog é casesensitive y1 e Y1 são sinais diferentes em SystemVerilog No entanto é confuso utilizar múltiplos sinais que diferem apenas entre maiúsculas e minúsculas ser case sensitive levando a bugs desagradáveis se você despreocupadamente misturar letras maiúsculas e minúsculas 423 Operadores de Redução Operadores de redução implicam numa porta de múltiplas entradas atuando sobre um único barramento O Exemplo HDL 41 descreve uma porta AND de oito entradas a7 a6 a0 Operadores de redução análogos existem para portas OR XOR NAND NOR e XNOR Lembrese que uma porta XOR de múltiplas entradas realiza paridade retornando TRUE se um número ímpar de entradas é TRUE Exemplo HDL 44 AND DE OITO ENTRADAS SystemVerilog module and8input logic 70 a output logic y assign y a a is much easier to write than assign y a7 a6 a5 a4 a3 a2 a1 a0 endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity and8 is porta in STDLOGICVECTOR7 downto 0 y out STDLOGIC end architecture synth of and8 is begin y and a and a is much easier to write than y a7 and a6 and a5 and a4 and a3 and a2 and a1 and a0 end Capítulo quatro Linguagens de Descrição de Hardware 243 Figura 45 Circuito and8 sintetizado 424 Atribuição Condicional Atribuições condicionais selecionam a saída dentre alternativas baseadas numa entrada denominada condição O Exemplo HDL 45 ilustra um multiplexador 21 utilizando atribuição condicional Exemplo HDL 45 MULTIPLEXADOR 21 SystemVerilog O operador condicional escolhe baseado numa primeira expressão entre a segunda e a terceira expressão A primeira expressão é denominada condição Se a condição é 1 o operador escolhe a segunda expressão Se a condição é 0 o operador escolhe a terceira expressão é especialmente útil para descrever um multiplexador pois baseado na primeira entrada ele seleciona entre duas outras O código abaixo demostra a linguagem para um multiplexador 21 com entradas e saídas de 4bits utilizandose o operador condicional VHDL As atribuições condicionais de sinais realizam diferentes operações dependendo da condição Elas são especialmente úteis para se descrever um multiplexador Por exemplo um multiplexador 21 pode utilizar a atribuição condicional de sinais para selecionar uma de duas entradas de 4bits library IEEE use IEEESTDLOGIC1164all entity mux2 is portd0 d1 in STDLOGICVECTOR3 downto 0 s in STDLOGIC y out STDLOGICVECTOR3 downto 0 Capítulo quatro Linguagens de Descrição de Hardware 244 module mux2input logic 30 d0 d1 input logic s output logic 30 y assign y s d1 d0 endmodule Se s é 1 então y d1 Se s é 0 então y d0 é também chamado operador ternário pois recebe três entradas Ele é utilizado com o mesmo propósito nas linguagens de programação C e Java end architecture synth of mux2 is begin y d1 when s else d0 end A atribuição condicional de sinal define y como d1 se s é 1 De outra forma define y como d0 Note que antes da revisão de 2008 da VHDL tínhamos que escrever when s 1 ao invés de when s Figura 46 Circuito mux2 sintetizado O Exemplo HDL 46 mostra um multiplexador 41 baseado no mesmo princípio do multiplexador 21 do Exemplo HDL 45 A Figura 47 mostra o esquemático produzido pelo Sinplify Premier para o multiplexador 41 Os softwares usam um símbolo diferente para o multiplexador do que o que este texto tem mostrado até agora O multiplexador possui múltiplos dados d e uma entrada de ativação e Quando uma das entradas de ativação é acionada o dado associado passa para a saída Por exemplo quando s1 s0 0 a porta AND de baixo un1s5 produz um 1 ativando a entrada de baixo do multiplexador e o fazendo selecionar d030 Capítulo quatro Linguagens de Descrição de Hardware 245 Exemplo HDL 46 MULTIPLEXADOR 41 SystemVerilog Um multiplexador 41 pode selecionar uma de quatro entradas utilizando operadores condicionais aninhados module mux4input logic 30 d0 d1 d2 d3 input logic 10 s output logic 30 y assign y s1 s0 d3 d2 s0 d1 d0 endmodule Se s1 é 1 então o multiplexador escolhe a primeira expressão s0 d3 d2 Essa expressão por sua vez escolhe d3 ou d2 baseado em s0 y d3 se s0 é 1 e d2 se s0 é 0 Se s1 é 0 então o multiplexador similarmente escolhe a segunda expressão a qual transmite por sua vez d1 ou d0 baseado em s0 VHDL Um multiplexador pode selecionar uma de quatro entradas utilizando múltiplas cláusulas else na atribuição condicional de sinais library IEEE use IEEESTDLOGIC1164all entity mux4 is portd0 d1 d2 d3 in STDLOGICVECTOR3 downto 0 s in STDLOGICVECTOR1 downto 0 y out STDLOGICVECTOR3 downto 0 end architecture synth1 of mux4 is begin y d0 when s 00 else d1 when s 01 else d2 when s 10 else d3 end VHDL também suporta declarações de atribuição de sinais selecionados possibilitando assim uma abreviação quando são selecionadas uma ou mais possibilidades Estas declarações são análogas às declarações switchcase ao invés de múltiplos ifelse em algumas linguagens de programação O multiplexador 41 pode ser reescrito com atribuição de sinais selecionados como abaixo Capítulo quatro Linguagens de Descrição de Hardware 246 architecture synth2 of mux4 is begin with s select y d0 when 00 d1 when 01 d2 when 10 d3 when others end Figura 47 Circuito mux4 sintetizado Capítulo quatro Linguagens de Descrição de Hardware 247 425 Variáveis Internas Muitas vezes é conveniente quebrar uma função complexa em passos intermediários Por exemplo um full adder o qual será discutido na Seção 521 é um circuito com três entradas e duas saídas definido pelas seguintes equações 𝑆 𝐴𝐵𝐶𝑖𝑛 41 𝐶𝑜𝑢𝑡 𝐴𝐵 𝐴𝐶𝑖𝑛 𝐵𝐶𝑖𝑛 42 Se definirmos sinais intermediários P e G 𝑃 𝐴𝐵 43 𝐺 𝐴𝐵 44 Podemos reescrever o somador completo da maneira como se segue 𝑆 𝑃𝐶𝑖𝑛 46 𝐶𝑜𝑢𝑡 𝐺 𝑃𝐶𝑖𝑛 47 𝑃 e 𝐺 são chamadas variáveis internas devido ao fato de elas não serem nem entradas nem saídas mas apenas serem utilizadas internamente no módulo Elas são similares às variáveis locais nas linguagens de programação O Exemplo HDL 47 mostra como elas são utilizadas em HDL A declaração de atribuição em HDL assign em SystemVerilog e em VHDL ocorrem simultaneamente Isso é diferente nas linguagens de programação convencionais em que as declarações são avaliadas à medida que são escritas Numa linguagem convencional é importante que 𝑆 𝑃 𝐶𝑖𝑛 venha depois de 𝑃 𝐴 𝐵 pois as declarações são executadas sequencialmente Em HDL a ordem não importa Assim como no hardware as declarações de atribuição são executadas a qualquer momento que as entradas os sinais do lado direito modificam seu valor independente da ordem em que as declarações de atribuição aparecem no módulo Capítulo quatro Linguagens de Descrição de Hardware 248 Exemplo HDL 47 SOMADOR COMPLETO SystemVerilog Em SystemVerilog os sinais internos são normalmente declarados como logic module fulladderinput logic a b cin output logic s cout logic p g assign p a b assign g a b assign s p cin assign cout g p cin endmodule VHDL Em VHDL sinais são usados para representar variáveis interna cujos valores são definidos por declarações de atribuição de sinais concorrentes como p a xor b library IEEE use IEEESTDLOGIC1164all entity fulladder is porta b cin in STDLOGIC s cout out STDLOGIC end architecture synth of fulladder is signal p g STDLOGIC begin p a xor b g a and b s p xor cin cout g or p and cin end Figura 48 Circuito full adder sintetizado Capítulo quatro Linguagens de Descrição de Hardware 249 426 Precedência Note que nós colocamos entre parênteses a expressão cout no Exemplo HDL 47 para definir a ordem das operações como 𝐶𝑜𝑢𝑡 𝐺 𝑃 𝐶𝑖𝑛 ao invés de 𝐶𝑜𝑢𝑡 𝐺 𝑃 𝐶𝑖𝑛 Se nós não tivéssemos utilizado parênteses a ordem padrão de operação seria definida pela linguagem O Exemplo HDL 48 especifica a precedência do operador da maior para a menor para cada linguagem A tabela inclui operadores aritméticos de deslocamento e de comparação que serão definidos no Capítulo 5 Exemplo HDL 48 OPERADOR PRECEDÊNCIA SystemVerilog Tabela 41 Precedência de operadores em SystemVerilog VHDL Tabela 42 Precedência de operadores em VHDL Capítulo quatro Linguagens de Descrição de Hardware 250 A precedência de operadores para SystemVerilog é bem parecida com o que o leitor esperaria em outras linguagens de programação Em particular AND tem precedência sobre OR Nós podemos tirar vantagem dessa precedência para eliminar os parênteses assign cout g p cin A multiplicação tem precedência sobre adição em VHDL como o leitor poderia esperar No entanto diferente de SystemVerilog todas as operações lógicas and or etc possuem precedências iguais ao contrário do que você poderia esperar em álgebra Booleana Portanto os parênteses são necessários de outra forma cout g or p and cin poderia ser interpretado da esquerda para a direita como cout g or p and cin 427 Números Os números podem ser especificados em bases binária octal decimal ou hexadecimal bases 2 8 10 e 16 respectivamente O comprimento isto é o número de bits pode opcionalmente ser dado e então preenchido com zeros até atingir o comprimento Índices abaixo dos números são ignorados e podem ser úteis na quebra de grandes números em pedaços menores e mais legíveis O Exemplo HDL 49 explica como os números são escritos em cada linguagem Exemplo HDL 49 NÚMEROS SystemVerilog O formato de declaração de constantes é NBvalue onde N é o tamanho em bits B é uma letra especificando a base e value é o valor Por exemplo 9h25 é um número de 9bits com o valor de 2516 3710 0001001012 A SystemVerilog aceita b para binário o para octal d para decimal e h para hexadecimal Se a base é omitida é padronizada como sendo decimal Se o tamanho não é dado é considerado que o número tem tantos bits quanto a expressão no qual ele se encontra está utilizando Zeros são automaticamente adicionados à frente do número para deixalo com o comprimento total Por exemplo se w é um barramento de 6 bits assign w b11 dá a w o valor de 000011 É uma boa prática disponibilizar explicitamente o comprimento Uma exceção é VHDL Em VHDL números STDLOGIC são escritos em binário entre aspas simples 0 e 1 indicam nível lógico 0 e 1 O formato para a declaração de constantes STDLOGICVECTOR é NB value onde N é o comprimento em bits B é um indicador de base e value indica o valor Por exemplo 9X25 indica um número de 9bits com o valor de 2516 3710 0001001012 VHDL 2008 aceita B para binário O para octal D para decimal e X para hexadecimal Se a base é omitida é por padrão binária Se o comprimento não é dado o número é considerado como tendo o comprimento de acordo com o número de bits especificado em value A partir de outubro de 2011 o software Synplify Premier da Synopsys ainda não aceitava a especificação de comprimento Capítulo quatro Linguagens de Descrição de Hardware 251 que 0 e 1 são comandos em SystemVerilog que preenche num barramento todo com 0 e todo com 1 respectivamente Tabela 43 Números em SystemVerilog others 0 e others 1 são comandos em VHDL que preenchem todos os bits com 0 e 1 respectivamente Tabela 44 Números em VHDL Capítulo quatro Linguagens de Descrição de Hardware 252 428 Zs e Xs As HDL usam z para indicar um valor flutuante z é particularmente útil para descrever um buffer tristate com a saída flutuante quando a entrada de ativação é 0 Lembrese da Seção 262 em que um barramento podia ser acionado por muitos buffers tristate apenas um poderia estar ativado Exemplo HDL 410 mostra o comando para um buffer tristate Se o buffer está ativado a saída é a mesma que a entrada Se o buffer está desativado é atribuído à saída um valor flutuante z Similarmente as HDL usam x para indicar um nível lógico inválido Se um barramento é levado simultaneamente a 0 e 1 por dois buffers tristate ativados ou outras portas o resultado é x indicando contenção Se todos os buffers tristate que acionam o barramento estão simultaneamente desligados o valor no barramento irá flutuar indicado por z No início da simulação nós com estados tais como as saídas de flipflops são inicializadas com um valor desconhecido x em SystemVerilog e u em VHDL Isso é útil para procurar erros causados pelo esquecimento de reinicialização de flipflops antes dos mesmos serem utilizados Exemplo HDL 410 BUFFER TRISTATE SystemVerilog module tristateinput logic 30 a input logic en output tri 30 y assign y en a 4bz endmodule Note que y é declarado como tri ao invés de logic Sinais do tipo logic podem ter apenas um acionador Barramentos tristate podem ter múltiplos acionadores então eles devem ser declarados como uma net Dois dos tipos de nets em SystemVerilog são denominadas VHDL library IEEE use IEEESTDLOGIC1164all entity tristate is porta in STDLOGICVECTOR3 downto 0 en in STDLOGIC y out STDLOGICVECTOR3 downto 0 end architecture synth of tristate is begin y a when en else ZZZZ end Capítulo quatro Linguagens de Descrição de Hardware 253 tri e trireg Tipicamente exatamente um acionador por net está ativo por vez e a net toma aquele valor Se nenhum acionador está ativo tri flutua z enquanto trireg retém o valor anterior Se nenhum tipo for especificado para uma entrada ou saída é assumido que seja tri Note também que uma saída tri de um módulo pode ser utilizada como uma entrada logic para outro módulo A seção 47 discute melhor as nets e os acionadores múltiplos Figura 49 Circuito tristate sintetizado Se uma porta recebe uma entrada flutuante ela pode produzir uma saída x quando não puder determinar o valor correto da saída Similarmente se ela receber uma entrada de valor ilegal ou não inicializado pode produzir uma saída x O Exemplo HDL 411 mostra como SystemVerilog e VHDL combinam estes diferentes valores de sinal em portas lógicas Exemplo HDL 411 TABELAS VERDADE COM ENTRADAS INDEFINIDAS E FLUTUANTES SystemVerilog Valores de sinais em SystemVerilog são 0 1 z e x As restrições em SystemVerilog iniciamse com o fato de que z ou x são preenchidos com zs ou xs ao invés de 0 para atingir o comprimento total do dado quando necessário A Tabela 45 mostra uma tabela verdade para uma porta AND utilizando todos os quatro possíveis valores de sinal Note que a porta pode algumas vezes determinar a saída mesmo com algumas das VHDL Sinais do tipo VHDL STDLOGIC são 0 1 z x e u A Tabela 46 mostra uma tabela verdade para uma porta AND utilizando todos os cinco possíveis valores de sinal Note que a porta pode às vezes determinar a saída mesmo com algumas entradas sendo desconhecidas Por exemplo 0 and z retorna 0 pois a saída de uma porta AND é sempre 0 se alguma das entradas for 0 De outro modo entradas inválidas ou flutuantes causam saídas inválidas Capítulo quatro Linguagens de Descrição de Hardware 254 entradas sendo desconhecidas Por exemplo 0 z retorna 0 Pois a saída de uma porta AND é sempre 0 se alguma das entradas é 0 De outro modo entradas flutuantes ou inválidas causam saídas inválidas mostradas como x em SystemVerilog Tabela 45 Tabela verdade de uma porta AND com z e x em SystemVerilog mostradas como x em VHDL Entradas nãoinicializadas causam saídas nãoinicializadas mostradas como u em VHDL Tabela 46 Tabela verdade de uma porta AND com z x e u em VHDL Ver valores x ou u na simulação é quase sempre uma indicação de um bug ou de má prática de programação Num circuito sintetizado isso corresponde a uma entrada de porta flutuante estado não inicializado ou contenção O x ou u pode ser interpretado aleatoriamente pelo circuito como sendo 0 ou 1 levandoo a um comportamento imprevisível Capítulo quatro Linguagens de Descrição de Hardware 255 429 Reorganização de Bits Muitas vezes é necessário operar num subconjunto de um barramento ou então concatenar juntar sinais a fim de formar barramentos Estas operações são coletivamente denominadas reorganização de bits bit swizzling No Exemplo HDL 412 y é dado como um valor de 9bits 𝑐2𝑐1𝑑0𝑑0𝑑0𝑐0101 utilizando operações de reorganização de bits Exemplo HDL 412 REORGANIZAÇÃO DE BITS SystemVerilog assign y c21 3d0 c0 3b101 O operador é utilizado para concatenar barramentos 3d0 indica três cópias de d0 Não confunda a constante binária de 3bits 3b101 com um barramento denominado b Note que foi fundamental especificar o comprimento de 3bits na constante de outra forma poderia haver um número desconhecido de zeros que poderia aparecer no meio de y Se y fosse menor do que 9bits zeros poderiam ser colocados nos bits mais significativos VHDL y c2 downto 1 d0 d0 d0 c0 3B101 O operador de agregação é usado para concatenar barramentos y deve ser do tipo STDLOGICVECTOR de 9 bits Outro exemplo demonstra o poder das agregações VHDL Assumindo que z é um STDLOGICVECTOR de 8 bits a z é dado o valor 10010110 utilizandose o seguinte comando de agregação z 10 4 1 2 downto 1 1 others 0 O 10 é o primeiro par de bits São então colocados 1s no bit 4 e nos bits 2 e 1 Os outros bits são 0 Capítulo quatro Linguagens de Descrição de Hardware 256 4210 Atrasos As declarações HDL podem ser associadas a atrasos especificados em unidades arbitrárias Eles são úteis durante a simulação para prever o quão rápido um circuito vai funcionar se o leitor especificar os atrasos mais significativos e também para propósitos de debugging para entender a causa e o efeito seguir a fonte de uma saída ruim é complicado se todos os sinais mudam simultaneamente nos resultados de uma simulação Esses atrasos são ignorados durante a síntese o atraso de uma porta produzido pelo sintetizador depende das especificações 𝑡𝑝𝑑 e 𝑡𝑐𝑑 e não de números no código HDL O Exemplo HDL 413 adiciona atrasos à função original do Exemplo HDL 41 𝑦 𝑎𝑏𝑐 𝑎𝑏𝑐 𝑎𝑏𝑐 Ele assume que os inversores têm um atraso de 1 ns as portas AND de três entradas têm atrasos de 2 ns e as portas OR de três entradas possuem atrasos de 4 ns A Figura 410 mostra as formas de onda das simulações com y atrasado 7 ns depois das entradas Note que y é inicialmente desconhecido no começo da simulação Exemplo HDL 413 PORTAS LÓGICAS COM ATRASOS SystemVerilog timescale 1ns1ps module exampleinput logic a b c output logic y logic ab bb cb n1 n2 n3 assign 1 ab bb cb a b c assign 2 n1 ab bb cb assign 2 n2 a bb cb assign 2 n3 a bb c assign 4 y n1 n2 n3 endmodule Os arquivos em SystemVerilog podem incluir uma diretiva de escala de tempo que indica o valor de cada unidade de tempo A declaração VHDL library IEEE use IEEESTDLOGIC1164all entity example is porta b c in STDLOGIC y out STDLOGIC end architecture synth of example is signal ab bb cb n1 n2 n3 STDLOGIC begin ab not a after 1 ns bb not b after 1 ns cb not c after 1 ns n1 ab and bb and cb after 2 ns n2 a and bb and cb after 2 ns n3 a and bb and c after 2 ns Capítulo quatro Linguagens de Descrição de Hardware 257 é da forma timescale unidadeprecisão Neste arquivo cada unidade possui 1 ns e a simulação possui 1 ps de precisão Se nenhuma diretiva de escala de tempo é dada no arquivo a unidade padrão de precisão normalmente 1 ns para ambas é utilizada Em SystemVerilog o símbolo é utilizado para indicar o número de unidades do atraso Ele pode ser colocado na declaração assign assim como atribuições de bloco e nãoblocos como será discutido na Seção 454 y n1 or n2 or n3 after 4 ns end Em VHDL a cláusula after é utilizada para indicar atraso As unidades neste caso são especificadas em nanossegundos Figura 410 Exemplo de formas de onda com atrasos do simulador ModelSim 43 MODELAGEM ESTRUTURAL Foi discutida na seção anterior a modelagem comportamental descrevendo um módulo em termos das relações entre as entradas e as saídas Esta seção examina a modelagem estrutural descrevendo um módulo em termos de como ele é composto por módulos mais simples Por exemplo o Exemplo HDL 414 mostra como montar um multiplexador 41 a partir de três multiplexadores 21 Cada cópia do multiplexador 21 é chamada de instância Múltiplas instâncias de um Capítulo quatro Linguagens de Descrição de Hardware 258 mesmo módulo são distinguidas por nomes distintos nesse caso lowux highmux e finalmux Isso é um exemplo de regularidade no qual um multiplexador 21 é reutilizado muitas vezes Exemplo HDL 414 MODELO ESTRUTURAL DE UM MULTIPLEXADOR 41 SystemVerilog module mux4input logic 30 d0 d1 d2 d3 input logic 10 s output logic 30 y logic 30 low high mux2 lowmuxd0 d1 s0 low mux2 highmuxd2 d3 s0 high mux2 finalmuxlow high s1 y endmodule As três instâncias mux2 são denominadas lowmux highmux e finalmux O módulo mux2 deve ser definido num outro lugar no código SystemVerilog vide Exemplo HDL 45 Exemplo HDL 415 ou Exemplo HDL 434 VHDL library IEEE use IEEESTDLOGIC1164all entity mux4 is portd0 d1 d2 d3 in STDLOGICVECTOR3 downto 0 s in STDLOGICVECTOR1 downto 0 y out STDLOGICVECTOR3 downto 0 end architecture struct of mux4 is component mux2 portd0 d1 in STDLOGICVECTOR3 downto 0 s in STDLOGIC y out STDLOGICVECTOR3 downto 0 end component signal low high STDLOGICVECTOR3 downto 0 begin lowmux mux2 port mapd0 d1 s0 low highmux mux2 port mapd2 d3 s0 high finalmux mux2 port maplow high s1 y end A arquitetura deve primeiro declarar os portos mux2 utilizando a declaração component Isso permite às ferramentas VHDL verificar Capítulo quatro Linguagens de Descrição de Hardware 259 que os componentes que o leitor deseja utilizar possuem as mesmas portas que a entidade que foi declarada noutra declaração prevenindo erros causados pela mudança de entidade mas não da instância No entanto a declaração de componentes torna o código VHDL bastante trabalhoso Figura 411 Circuito mux4 sintetizado O Exemplo HDL 415 utiliza modelagem estrutural para construir um multiplexador 21 a partir de um par de buffers tristate Construir lógica a partir de tristates no entanto não é recomendado Exemplo HDL 415 MODELO ESTRUTURAL DE UM MULTIPLEXADOR 21 SystemVerilog module mux2input logic 30 d0 d1 input logic s output tri 30 y VHDL library IEEE use IEEESTDLOGIC1164all entity mux2 is portd0 d1 in STDLOGICVECTOR3 downto 0 Capítulo quatro Linguagens de Descrição de Hardware 260 tristate t0d0 s y tristate t1d1 s y endmodule Em SystemVerilog expressões como s são permitidas na lista de portos para uma instância Expressões arbitrariamente complicadas são permitidas mas desencorajadas pois elas deixam o código difícil de ler s in STDLOGIC y out STDLOGICVECTOR3 downto 0 end architecture struct of mux2 is component tristate porta in STDLOGICVECTOR3 downto 0 en in STDLOGIC y out STDLOGICVECTOR3 downto 0 end component signal sbar STDLOGIC begin sbar not s t0 tristate port mapd0 sbar y t1 tristate port mapd1 s y end Em VHDL expressões como not s não são permitidas no mapa de portos para uma instância Portanto sbar deve ser definido como um sinal separado Figura 412 Circuito mux2 sintetizado Capítulo quatro Linguagens de Descrição de Hardware 261 O Exemplo HDL 416 mostra como módulos podem acessar parte de um barramento Um multiplexador de 8bits é construído utilizandose dois multiplexadores 21 de 4bits já definidos operando cada um deles os 4bits mais e menos significativos respectivamente Em geral os sistemas complexos são projetados hierarquicamente O sistema como um todo é descrito estruturalmente instanciandose os seus componentes principais Cada um destes componentes é descrito estruturalmente a partir dos seus blocos lógicos e assim por diante recursivamente até que as partes sejam simples o suficiente para serem descritas de modo comportamental Este é um bom estilo para se evitar ou ao menos minimizar a confusão entre descrições estruturais e comportamentais dentro de um mesmo módulo Exemplo HDL 416 ACESSANDO PARTES DE BARRAMENTOS SystemVerilog module mux28input logic 70 d0 d1 input logic s output logic 70 y mux2 lsbmuxd030 d130 s y30 mux2 msbmuxd074 d174 s y74 endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity mux28 is portd0 d1 in STDLOGICVECTOR7 downto 0 s in STDLOGIC y out STDLOGICVECTOR7 downto 0 end architecture struct of mux28 is component mux2 portd0 d1 in STDLOGICVECTOR3 downto 0 s in STDLOGIC y out STDLOGICVECTOR3 downto 0 end component begin lsbmux mux2 port mapd03 downto 0 d13 downto 0 s y3 downto 0 msbmux mux2 port mapd07 downto 4 d17 downto 4 Capítulo quatro Linguagens de Descrição de Hardware 262 s y7 downto 4 end Figura 413 Circuito mux28 sintetizado 44 LÓGICA SEQUENCIAL Os sintetizadores de HDL reconhecem certas linguagens e as transformam em circuitos sequenciais Outros estilos de código podem simular corretamente os circuitos porém com erros flagrantes ou sutis Esta seção apresenta as linguagens apropriadas para descrever registradores e básculas 441 Registradores A grande maioria dos sistemas comerciais modernos são construídos com registradores utilizando flip flops D com disparo na borda positiva O Exemplo HDL 417 mostra como escrever tais flipflops Capítulo quatro Linguagens de Descrição de Hardware 263 Nas declarações always em SystemVerilog e process em VHDL os sinais mantêm o seu valor antigo até que um evento na lista de sensibilidade aconteça e explicitamente causem a sua mudança Consequentemente tais códigos com apropriadas listas de sensibilidade podem ser utilizados para descrever circuitos sequenciais com memória Por exemplo o flipflop possui apenas clk na sua lista de sensibilidade Ele guarda o último valor de q até à próxima borda de subida de clk mesmo se d muda temporariamente Em contraste declarações de atribuição contínua assign em SystemVerilog e declarações de atribuição simultânea em VHDL são reavaliadas a todo momento em que qualquer uma das entradas do lado direito muda Portanto seu código necessariamente descreve lógica combinatória Exemplo HDL 417 REGISTRADOR SystemVerilog module flopinput logic clk input logic 30 d output logic 30 q alwaysff posedge clk q d endmodule Em geral uma declaração always em SystemVerilog é escrita da seguinte foma always lista de sensibilidade declaração A declaração é executada apenas quando algum evento especificado na lista de sensibilidade ocorre Nesse exemplo a declaracao é q d Consequentemente o flipflop copia d para q na borda de subida VHDL library IEEE use IEEESTDLOGIC1164all entity flop is portclk in STDLOGIC d in STDLOGICVECTOR3 downto 0 q out STDLOGICVECTOR3 downto 0 end architecture synth of flop is begin processclk begin if risingedgeclk then q d end if end process end Uma declaração process em VHDL é escrita na forma Capítulo quatro Linguagens de Descrição de Hardware 264 do clock e em outro caso guarda o valor antigo de q Note que a lista de sensibilidade também é referida como lista de estímulos é chamado de declaração nonblocking Pense nela como sendo um sinal comum por enquanto nós retornaremos aos pontos mais sutis na Seção 454 Note que é usada ao invés de uma declaração assign dentro de uma always Assim como veremos nas seções subsequentes declarações always podem ser usadas para indicar flipflops básculas ou lógica combinatória dependendo da lista de sensibilidade e das declarações Devido a essa sensibilidade é fácil produzir inadvertidamente hardware errado SystemVerilog introduz as declarações alwaysff alwaysbáscula e alwayscomb a fim de reduzir o risco de erros comuns alwaysff se comporta como uma always mas é utilizada exclusivamente para indicar flipflops e permite às ferramentas produzirem mensagens de advertência se alguma outra coisa for indicada processlista de sensibilidade begin declaração end process A declaração statement é executada quando qualquer uma das variáveis na lista de sensibilidade muda Neste exemplo a declaração if verifica se a mudança ocorre no flanco ascendente do clk Se sim então q d Consequentemente o flipflop copia d para q na borda positiva do clock e noutro caso guarda o estado anterior de q Uma alternativa em VHDL para declarar flipflops é processclk begin if clkevent and clk 1 then q d end if end process risingedgeclk é sinônimo de clkevent and clk 1 Figura 414 Circuito flop sintetizado 442 Registradores Resettable Quando a simulação é iniciada ou quando o circuito é alimentado a saída de um flop ou registrador é desconhecida Isso é indicado por um x em SystemVerilog e por u em VHDL Geralmente é uma boa Capítulo quatro Linguagens de Descrição de Hardware 265 prática utilizar registradores resettable de modo que quando alimentado o leitor possa colocar o seu sistema num estado conhecido O reset pode ser tanto assíncrono como síncrono Lembrese que o reset assíncrono ocorre imediatamente enquanto o reset síncrono zera a saída apenas na borda de subida seguinte do clock O Exemplo HDL 418 demonstra o código para flipflops com resets assíncronos e síncronos Observe que distinguir um reset síncrono ou assíncrono num esquemático pode ser difícil O esquemático produzido pelo Synplify Premier coloca o reset assíncrono abaixo do flipflop e o reset síncrono no lado esquerdo Exemplo HDL 418 REGISTRADOR RESETTABLE SystemVerilog module floprinput logic clk input logic reset input logic 30 d output logic 30 q asynchronous reset alwaysff posedge clk posedge reset if reset q 4b0 else q d endmodule module floprinput logic clk input logic reset input logic 30 d output logic 30 q synchronous reset alwaysff posedge clk if reset q 4b0 else q d endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity flopr is portclk reset in STDLOGIC d in STDLOGICVECTOR3 downto 0 q out STDLOGICVECTOR3 downto 0 end architecture asynchronous of flopr is begin processclk reset begin if reset then q 0000 elsif risingedgeclk then q d end if end process end library IEEE use IEEESTDLOGIC1164all Capítulo quatro Linguagens de Descrição de Hardware 266 Sinais múltiplos numa lista de sensibilidade de declaração always são separados por uma vírgula ou pela palavra or Note que posedge reset está na lista de sensibilidade do flop resettable assincronamente mas não na lista do flop resettable de modo síncrono Portanto o flop resettable de modo assíncrono responde imediatamente ao flanco de subida em reset mas o flop resettable de modo síncrono responde a reset apenas no flanco de subida do clock Devido aos módulos terem o mesmo nome flopr o leitor pode incluir apenas um ou outro no seu projeto entity flopr is portclk reset in STDLOGIC d in STDLOGICVECTOR3 downto 0 q out STDLOGICVECTOR3 downto 0 end architecture synchronous of flopr is begin processclk begin if risingedgeclk then if reset then q 0000 else q d end if end if end process end Múltiplos sinais numa lista de sensibilidade process são separados por vírgula Note que o reset está dentro da lista de sensisbilidade no flop resettable assincronamente mas não na do flop resettable sincronamente Portanto o flop resettable assincronamente responde imediatamente no flanco ascendente do reset mas o flop resettable sincronamente responde ao reset apenas no flanco de subida do clock Lembrese que o estado do flop é inicializado com u durante a simulação VHDL Como mencionado anteriormente o nome da arquitetura assíncrona ou síncrona nesse exemplo é ignorado pelas ferramentas VHDL mas podem ser úteis para o humano lendo o código Devido a ambas as arquiteturas descreverem a entidade flopr o leitor pode incluir apenas uma ou outra no seu projeto Capítulo quatro Linguagens de Descrição de Hardware 267 Figura 415 Circuito flopr sintetizado a reset assíncrono b reset síncrono 443 Registradores Enabled Registradores enabled respondem ao clock apenas quando a liberação enable é confirmada O Exemplo HDL 419 mostra um registrador ativado enabled assincronamente que retém seu valor antigo se tanto reset quanto en são FALSE Exemplo HDL 419 REGISTRADOR REINICIÁVEL ENABLED SystemVerilog module flopenrinput logic clk input logic reset input logic en input logic 30 d output logic 30 q VHDL library IEEE use IEEESTDLOGIC1164all entity flopenr is portclk reset en in STDLOGIC d in STDLOGICVECTOR3 downto 0 Capítulo quatro Linguagens de Descrição de Hardware 268 asynchronous reset alwaysff posedge clk posedge reset if reset q 4b0 else if en q d endmodule q out STDLOGICVECTOR3 downto 0 end architecture asynchronous of flopenr is asynchronous reset begin processclk reset begin if reset then q 0000 elsif risingedgeclk then if en then q d end if end if end process end Figura 416 Circuito flopenr sintetizado Capítulo quatro Linguagens de Descrição de Hardware 269 444 Registradores Múltiplos Uma única declaração alwaysprocess pode ser utilizada para descrever múltiplas partes de hardware Por exemplo considere o sincronizador da Seção 355 feito a partir de dois flipflops backto back como mostrado na Figura 417 O Exemplo HDL 420 descreve o sincronizador No flanco ascendente clk d é copiado para n1 Ao mesmo tempo n1 é copiado para q Figura 417 Circuito sincronizador Exemplo HDL 420 SINCRONIZADOR SystemVerilog module syncinput logic clk input logic d output logic q logic n1 alwaysff posedge clk begin n1 d nonblocking q n1 nonblocking end endmodule Note que o construtor beginend é necessário pois declarações múltiplas aparecem na declaração always Isso é análogo às chaves VHDL library IEEE use IEEESTDLOGIC1164all entity sync is portclk in STDLOGIC d in STDLOGIC q out STDLOGIC end architecture good of sync is signal n1 STDLOGIC begin processclk begin if risingedgeclk then n1 d q n1 Capítulo quatro Linguagens de Descrição de Hardware 270 em C ou Java O beginend não seria necessário no exemplo flopr pois ifelse contam como apenas uma declaração end if end process end n1 deve ser declarado como signal pois ele é um sinal interno utilizado no módulo Figura 418 Circuito sync sintetizado 445 Básculas Lembrese da Seção 322 que uma báscula D está transparente quando o clock está a HIGH permitindo ao dado fluir da entrada para a saída A báscula se torna opaca quando o clock está a LOW retendo o seu estado antigo O Exemplo HDL 421 mostra o código para uma báscula D Nem todas as ferramentas de síntese aceitam as básculas convenientemente A não ser que o leitor saiba que a sua ferramenta aceita básculas e que tenha uma boa razão para usálas eviteas e ao invés deles utilize flipflops com disparo pelo flanco Além disso tome cuidado para que a sua HDL não recorra a uma báscula intencional algo que é fácil de ocorrer se caso o leitor não estiver atento Muitas ferramentas de síntese o advertem quando uma báscula é criada se você não esperava uma localize o bug na sua HDL E se o leitor não sabe se quer uma báscula ou não provavelmente está aproximando a HDL de uma linguagem de programação e nesse caso existem grandes problemas à espreita Capítulo quatro Linguagens de Descrição de Hardware 271 45 MAIS LÓGICA COMBINATÓRIA Na Seção 42 utilizamos declarações de atribuição para descrever lógica combinatória de modo comportamental As declarações always em SystemVerilog e process em VHDL são utilizadas para descrever circuitos sequenciais pois retêm o estado antigo quando nenhum estado novo é estabelecido No entanto as declarações alwaysprocess também podem ser usadas para descrever lógica combinatória de modo comportamental se a lista de sensibilidade for escrita para responder a mudanças em todas as entradas e o corpo estabelecer o valor da saída para cada possível combinação na entrada O Exemplo HDL 422 utiliza declarações alwaysprocess para descrever um banco de quatro inversores veja a Figura 43 para o circuito sintetizado Exemplo HDL 421 BÁSCULA D SystemVerilog module básculainput logic clk input logic 30 d output logic 30 q alwaysbáscula if clk q d endmodule alwayslatch é equivalente a alwaysclkd e é o modo preferido para se descrever uma báscula em SystemVerilog Ele é avaliado todas as vezes em que clk ou d muda de valor Se clk está HIGH d flui através de q Então este código descreve uma báscula sensível a um nível positivo De outro modo q mantém o seu valor anterior A SystemVerilog pode gerar uma advertência se o bloco alwayslatch não indicar uma báscula VHDL library IEEE use IEEESTDLOGIC1164all entity báscula is portclk in STDLOGIC d in STDLOGICVECTOR3 downto 0 q out STDLOGICVECTOR3 downto 0 end architecture synth of báscula is begin processclk d begin if clk 1 then q d end if end process end Capítulo quatro Linguagens de Descrição de Hardware 272 A lista de sensibilidade contém ambos clk e d então process é avaliado a qualquer momento em que clk ou d mudam de valor Se clk está HIGH d flui para q Figura 419 Circuito báscula sintetizado Exemplo HDL 422 INVERSOR UTILIZANDO ALWAYSPROCESS SystemVerilog module invinput logic 30 a output logic 30 y alwayscomb y a endmodule alwayscomb reavalia as declarações dentro da declaração always a qualquer momento que os sinais do lado direito de ou de mudem Nesse caso ele é equivalente a always a mas é melhor pois evita erros se os sinais da declaração always forem renomeados ou adicionados Se o código dentro do bloco always não é de lógica combinatória a SystemVerilog gera uma advertência VHDL library IEEE use IEEESTDLOGIC1164all entity inv is porta in STDLOGICVECTOR3 downto 0 y out STDLOGICVECTOR3 downto 0 end architecture proc of inv is begin processall begin y not a end process end Capítulo quatro Linguagens de Descrição de Hardware 273 alwayscomb é equivalente a always mas é preferível em SystemVerilog O sinal dentro da declaração always é chamado atribuição blocking em contraste com a atribuição Em SystemVerilog é uma boa prática utilizar atribuições blocking para logica combinatório e atribuições nonblocking para lógica sequencial Isso será discutido de forma detalhada na Seção 454 processall reavalia as declarações dentro de process a qualquer momento em que algum dos sinais em process mude de valor É equivalente a processa mas é melhor pois evita erros se os sinais em process forem renomeados ou adicionados As declarações begin e end são exigidas em VHDL apesar de process conter apenas uma declaração As HDL aceitam declarações blocking e nonblocking numa declaração alwaysprocess Um grupo de declarações blocking é avaliado na ordem em que aparecem no código do mesmo modo em que numa linguagem de programação padrão Um grupo de declarações nonblocking é avaliado simultaneamente todas as declarações são avaliadas antes de qualquer sinal do lado esquerdo seja atualizado O Exemplo HDL 423 define um full adder utilizando os sinais intermediários p e g para computar s e cout Ele produz o mesmo circuito da Figura 48 mas utiliza declarações alwaysprocess no lugar de declarações de atribuição Estes dois exemplos são aplicações ruins das declarações alwaysprocess para a modelagem de logica combinatória pois eles requerem mais linhas do que suas aproximações equivalentes com declarações de atribuição dos Exemplo HDL 42 e Exemplo HDL 47 No entanto as declarações case e if são convenientes para modelar lógica combinatória mais complexa Declarações case e if devem aparecer dentro de uma declaração alwaysprocess e serão examinadas nas próximas seções SystemVerilog Numa declaração always em SystemVerilog indica uma atribuição blocking e indica uma declaração nonblocking também chamada de declaração concorrente Não confunda nenhum tipo com atribuição contínua utilizando a declaração assign A declaração assign deve ser utilizada fora das declarações always e também são avaliadas simultaneamente VHDL Numa declaração process em VHDL indica uma declaração blocking e indica uma declaração nonblocking também chamada declaração simultânea Esta é a primeira seção onde é introduzido Declarações nonblocking são feitas para saídas e para sinais Declarações blocking são feitas para variáveis as quais são declaradas na declaração process veja Exemplo HDL 423 também pode Capítulo quatro Linguagens de Descrição de Hardware 274 aparecer fora de declarações process onde também é avaliado simultaneamente Exemplo HDL 423 FULL ADDER UTILIZANDO ALWAYSPROCESS SystemVerilog module fulladderinput logic a b cin output logic s cout logic p g alwayscomb begin p a b blocking g a b blocking s p cin blocking cout g p cin blocking end endmodule Nesse caso always a b cin poderia ser equivalente a alwayscomb No entanto alwayscomb é melhor pois evita erros comuns como o esquecimento de sinais na lista de sensibilidade Por razões que serão discutidas na Seção 454 é melhor utilizar declarações blocking para lógica combinatória Esse exemplo utiliza declarações blocking primeiro computando p depois g depois s e finalmente cout VHDL library IEEE use IEEESTDLOGIC1164all entity fulladder is porta b cin in STDLOGIC s cout out STDLOGIC end architecture synth of fulladder is begin processall variable p g STDLOGIC begin p a xor b blocking g a and b blocking s p xor cin cout g or p and cin end process end Nesse caso processa b cin poderia ser equivalente a processall No entanto processall é melhor pois evita erros comuns como o esquecimento de sinais na lista de sensibilidade Capítulo quatro Linguagens de Descrição de Hardware 275 Por razões que serão discutidas na Seção 454 é melhor utilizar declarações blocking para a lógica combinatória Este exemplo utiliza declarações blocking para p e g para que eles adquiram novos valores antes de serem utilizados para computar s e cout que dependem deles Devido a p e g aparecerem do lado esquerdo da declaração blocking em process eles devem ser declarados como sendo variable ao invés de signal A declaração de variáveis aparece antes de begin no processo onde a variável é usada 451 Declarações Case Uma boa aplicação do uso das declarações alwaysprocess para lógica combinatória é o decodificador de display de sete segmentos que tira vantagem da declaração case que por sua vez deve aparecer dentro da declaração alwaysprocess Como o leitor deve ter notado no decodificador de display de sete segmentos do exemplo 210 o processo de projeto para grandes blocos de lógica combinatória é tedioso e passível de erros As HDL oferecem uma grande melhora permitindo ao leitor especificar a função num nível de abstração maior e então automaticamente sintetizar a função em portas O Exemplo HDL 424 usa declarações case para descrever um decodificador de display de sete segmentos baseado em sua tabela verdade A declaração case realiza diferentes ações dependendo do valor de sua entrada Uma declaração case indica lógica combinatória se todas as possíveis combinações de entrada são definidas de outro modo ela indica lógica sequencial pois nos casos indefinidos a saída irá manter o seu antigo valor Exemplo HDL 424 DECODIFICADOR DE DISPLAY DE SETE SEGMENTOS SystemVerilog module sevenseginput logic 30 data output logic 60 segments VHDL library IEEE use IEEESTDLOGIC1164all entity sevensegdecoder is portdata in STDLOGICVECTOR3 downto 0 Capítulo quatro Linguagens de Descrição de Hardware 276 alwayscomb casedata abcdefg 0 segments 7b1111110 1 segments 7b0110000 2 segments 7b1101101 3 segments 7b1111001 4 segments 7b0110011 5 segments 7b1011011 6 segments 7b1011111 7 segments 7b1110000 8 segments 7b1111111 9 segments 7b1110011 default segments 7b0000000 endcase endmodule A declaração case verifica o valor de data Quando data é 0 a declaração realiza a ação depois da vírgula activando segments para 1111110 A declaração case similarmente verifica outros valores de dados maiores do que 9 sem uso para a base padrão 10 A cláusula default é um modo conveniente de definir as saídas para todos os casos não listados explicitamente garantindo combinação lógica Em SystemVerilog declarações case devem aparecer dentro de declarações always segments out STDLOGICVECTOR6 downto 0 end architecture synth of sevensegdecoder is begin processall begin case data is abcdefg when X0 segments 1111110 when X1 segments 0110000 when X2 segments 1101101 when X3 segments 1111001 when X4 segments 0110011 when X5 segments 1011011 when X6 segments 1011111 when X7 segments 1110000 when X8 segments 1111111 when X9 segments 1110011 when others segments 0000000 end case end process end A declaração case verifica o valor de data Quando data é 0 a declaração realiza a ação após activando segments para 1111110 A declaração case similarmente verifica outros valores de dados maiores do que 9 note o uso de X para números hexadecimais A cláusula others é um modo conveniente de definir a saída para todos os casos não listados explicitamente garantindo a lógica combinatória Diferente de SystemVerilog VHDL suporta declarações de atribuições de sinais selecionados veja o exemplo 46 as quais se parecem muito com declarações case mas podem aparecer fora dos processos Capítulo quatro Linguagens de Descrição de Hardware 277 Portanto existem menos razões para se utilizar processos para descrever lógica combinatória Figura 420 Circuito sevenseg sintetizado O software Synplify Premier sintetiza o decodificador de display de sete segmentos numa readonly memory ROM contendo 7 saídas para cada uma das 16 entradas possíveis As ROM são discutidas melhor na Seção 556 Se as cláusulas default ou others estiverem fora da declaração case o decodificador deveria lembrar o seu valor anterior de saída a qualquer momento em que o dado estiver na faixa de 1015 Isso é um comportamento estranho para um hardware Os decodificadores ordinários também são comumente escritos com declarações case O Exemplo HDL 425 descreve um decodificador 38 Exemplo HDL 425 DECODIFICADOR 38 SystemVerilog module decoder38input logic 20 a output logic 70 y alwayscomb casea 3b000 y 8b00000001 3b001 y 8b00000010 3b010 y 8b00000100 VHDL library IEEE use IEEESTDLOGIC1164all entity decoder38 is porta in STDLOGICVECTOR2 downto 0 y out STDLOGICVECTOR7 downto 0 end Capítulo quatro Linguagens de Descrição de Hardware 278 3b011 y 8b00001000 3b100 y 8b00010000 3b101 y 8b00100000 3b110 y 8b01000000 3b111 y 8b10000000 default y 8bxxxxxxxx endcase endmodule A declaração default não é estritamente necessária neste caso para a síntese lógica pois todas as possíveis combinações da entrada são definidas mas é prudente para a simulação no caso de uma das entradas ser x ou z architecture synth of decoder38 is begin processall begin case a is when 000 y 00000001 when 001 y 00000010 when 010 y 00000100 when 011 y 00001000 when 100 y 00010000 when 101 y 00100000 when 110 y 01000000 when 111 y 10000000 when others y XXXXXXXX end case end process end A declaração others não é estritamente necessária neste caso para a síntese lógica pois todas as possíveis combinações da entrada são definidas mas é prudente para a simulação no caso de uma das entradas ser x z ou u Capítulo quatro Linguagens de Descrição de Hardware 279 Figura 421 Circuito decoder38 sintetizado Capítulo quatro Linguagens de Descrição de Hardware 280 452 Declarações If Declarações alwaysprocess podem conter declarações if A declaração if pode ser seguida por uma declaração else Se todas as possíveis combinações de entrada estão cobertas a declaração indica lógica combinatória de outro modo ela produz lógica sequencial da mesma forma que a báscula na Seção 445 O Exemplo HDL 426 utiliza declarações if para descrever um circuito de prioridade definido na Seção 24 Lembrese que um circuito prioridade de Nentradas ativa a saída que corresponde à entrada mais significativa que está no nível TRUE Exemplo HDL 426 CIRCUITO PRIORIDADE SystemVerilog module prioritycktinput logic 30 a output logic 30 y alwayscomb if a3 y 4b1000 else if a2 y 4b0100 else if a1 y 4b0010 else if a0 y 4b0001 else y 4b0000 endmodule Em SystemVerilog declarações if devem aparecer dentro de declarações always VHDL library IEEE use IEEESTDLOGIC1164all entity priorityckt is porta in STDLOGICVECTOR3 downto 0 y out STDLOGICVECTOR3 downto 0 end architecture synth of priorityckt is begin processall begin if a3 then y 1000 elsif a2 then y 0100 elsif a1 then y 0010 elsif a0 then y 0001 else y 0000 end if end process end Capítulo quatro Linguagens de Descrição de Hardware 281 Ao contrário de SystemVerilog VHDL aceita declarações de atribuição de sinais condicionais vide exemplo HDL 46 onde há muito mais declarações if mas podem aparecer fora dos processos Portanto existem menos razões para se usar processos para descrever lógica combinatória Figura 422 Circuito priorityckt sintetizado 453 Tabelas Verdade com Dont Cares Como examinado na Seção 273 as tabelas verdade podem incluir dont cares permitindo assim uma maior simplificação da lógica O Exemplo HDL 427 mostra como descrever um circuito prioridade com dont cares Capítulo quatro Linguagens de Descrição de Hardware 282 O sintetizador Synplify Premier gera um circuito um pouco diferente para esse módulo mostrado na Figura 423 do que o circuito prioridade da Figura 422 No entanto os circuitos são logicamente equivalentes Exemplo HDL 427 CIRCUITO PRIORIDADE UTILIZANDO DONT CARES SystemVerilog module prioritycasezinput logic 30 a output logic 30 y alwayscomb caseza 4b1 y 4b1000 4b01 y 4b0100 4b001 y 4b0010 4b0001 y 4b0001 default y 4b0000 endcase endmodule A declaração casez age como uma declaração case exceto pelo fato de que também reconhece como dont care VHDL library IEEE use IEEESTDLOGIC1164all entity prioritycasez is porta in STDLOGICVECTOR3 downto 0 y out STDLOGICVECTOR3 downto 0 end architecture dontcare of prioritycasez is begin processall begin case a is when 1 y 1000 when 01 y 0100 when 001 y 0010 when 0001 y 0001 when others y 0000 end case end process end A declaração case age como uma declaração case exceto pelo fato de que também reconhece como dont care Capítulo quatro Linguagens de Descrição de Hardware 283 Figura 423 Circuito prioritycasez sintetizado 454 Atribuições Blocking e Nonblocking As orientações abaixo explicam quando e como utilizar cada tipo de atribuição Se essas orientações não forem seguidas é possível que o leitor escreva um código que aparentemente funciona na simulação mas sintetiza o hardware incorretamente O restante opcional desta seção explica os princípios por trás dessas orientações Capítulo quatro Linguagens de Descrição de Hardware 284 ORIENTAÇÕES PARA ATRIBUIÇÕES BLOCKING E NONBLOCKING SystemVerilog 1 Use alwaysff posedge clk e atribuições nonblocking para a modelagem de lógicas sequenciais síncronas alwaysff posedge clk begin n1 d nonblocking q n1 nonblocking end 2 Utilize atribuições contínuas para a modelagem de lógicas combinatórias simples assign y s d1 d0 3 Utilize alwayscomb e atribuições blocking para a modelagem de lógicas combinatórias mais complicadas onde a declaração always é útil alwayscomb begin p a b blocking g a b blocking s p cin cout g p cin end VHDL 1 Utilize processclk e atribuições nonblocking para a modelagem de lógicas sequenciais síncronas processclk begin if risingedgeclk then n1 d nonblocking q n1 nonblocking end if end process 2 Utilize atribuições concorrentes do lado de fora das declarações process para a modelagem de lógicas combinatórias simples y d0 when s 0 else d1 3 Utilize processall para a modelagem de lógicas combinatórias mais complicadas onde process é útil Utilize atribuições blocking para variáveis internas processall variable p g STDLOGIC begin p a xor b blocking g a and b blocking s p xor cin cout g or p and cin end process Capítulo quatro Linguagens de Descrição de Hardware 285 4 Não faça atribuições para o mesmo sinal em mais de uma declaração always ou em declarações de atribuição contínua 4 Não faça atribuições para a mesma variável em mais de um process ou em declarações de atribuições concorrentes Lógica Combinatória O full adder do Figura 423 é corretamente modelado utilizandose atribuições blocking Esta seção explora como funciona e como seria diferente se as atribuições nonblocking fossem utilizadas Imagine que a b e c possuem todos o valor inicial de 0 p g s e cout possuem então também o valor 0 Em algum momento a muda para 1 disparando a declaração alwaysprocess As quatro atribuições blocking são avaliadas na ordem mostrada aqui No código VHDL s e cout são declaradas concorrentemente Note que p e g recebem seus novos valores antes que s e cout sejam computados devido às atribuições blocking Isso é importante pois nós queremos computar s e cout utilizando os novos valores de p e g 1 𝑝 1 0 1 2 𝑔 1 0 0 3 𝑠 1 0 1 4 𝑐𝑜𝑢𝑡 0 1 0 0 Em contraste a Figura 428 ilustra o uso de atribuições nonblocking Agora considere o mesmo caso de uma mudança de 0 para 1 enquanto b e cin são 0 As quatro atribuições nonblocking são computadas concorrentemente 𝑝 1 0 1 𝑔 1 0 0 𝑠 0 0 0 𝑐𝑜𝑢𝑡 0 0 0 0 Capítulo quatro Linguagens de Descrição de Hardware 286 Exemplo HDL 428 FULL ADDER UTILIZANDO ATRIBUIÇÕES NONBLOCKING SystemVerilog nonblocking assignments not recommended module fulladderinput logic a b cin output logic s cout logic p g alwayscomb begin p a b nonblocking g a b nonblocking s p cin cout g p cin end endmodule VHDL nonblocking assignments not recommended library IEEE use IEEESTDLOGIC1164all entity fulladder is porta b cin in STDLOGIC s cout out STDLOGIC end architecture nonblocking of fulladder is signal p g STDLOGIC begin processall begin p a xor b nonblocking g a and b nonblocking s p xor cin cout g or p and cin end process end Devido a p e g aparecerem do lado esquerdo de uma atribuição nonblocking numa declaração process eles devem ser declarados como signal ao invés de variable A declaração signal aparece antes de begin em architecture não o process Capítulo quatro Linguagens de Descrição de Hardware 287 Observe que s é computado concorrentemente com p e consequentemente utiliza o valor antigo de p não o novo Portanto s continua 0 ao invés de se tornar 1 No entanto p muda de 0 para 1 Essa mudança dispara a declaração alwaysprocess para computar uma segunda vez como se segue 𝑝 1 0 1 𝑔 1 0 0 𝑠 1 0 1 𝑐𝑜𝑢𝑡 0 1 0 0 Desta vez p já está com valor 1 então s muda corretamente para 1 As atribuições nonblocking eventualmente alcançam a resposta correta mas a declaração alwaysprocess tem de ser computada duas vezes Isso torna a simulação lenta embora ela sintetize o mesmo hardware Outra desvantagem das atribuições nonblocking na modelagem de lógica combinatória é que o código HDL irá produzir o resultado errado se o leitor se esquecer de incluir as variáveis intermediárias na lista de sensibilidade Pior ainda algumas ferramentas de síntese irão sintetizar corretamente o hardware mesmo quando uma lista de sensibilidade falsa causar uma simulação incorreta Isso leva a uma confusão entre os resultados da simulação e o que o harware verdadeiramente faz SystemVerilog Se a lista de sensibilidade da declaração always na Figura 428 fosse escrita como always abcin ao invés de alwayscomb então a declaração poderia não computar novamente quando p ou g mudassem de valor Nesse caso s poderia ser deixado incorreto como 0 e não 1 VHDL Se a lista de sensibilidade de process na Figura 428 fosse escrita como processabcin ao invés de processall então a declaração poderia não computar novamente quando p ou g mudassem de valor Nesse caso s poderia ser deixado incorreto como 0 e não 1 Lógica Sequencial O sincronizador da Figura 420 é modelado corretamente utilizando declarações nonblocking Na borda de subida do clock d é copiado para n1 ao mesmo tempo em que n1 é copiado para q então o Capítulo quatro Linguagens de Descrição de Hardware 288 código descreve apropriadamente dois registradores Por exemplo suponha inicialmente que d 0 n1 1 e q 0 Na borda de subida do clock as duas atribuições seguintes ocorrem concorrentemente de modo que após a borda de clock n1 0 e q 1 𝑛1 𝑑 0 𝑞 𝑛1 1 O Figura 429 tenta descrever o mesmo módulo utilizando atribuições nonblocking No flanco asncendente do clock d é copiado para n1 Então o novo valor de n1 é copiado para q resultando em d aparecendo impropriamente tanto em n1 como em q As atribuições ocorrem uma após a outra de modo que após o flanco do clock qn10 1 𝑛1 𝑑 0 2 𝑞 𝑛1 0 Exemplo HDL 429 MAU SINCRONIZADOR COM ATRIBUIÇÕES BLOCKING SystemVerilog Bad implementation of a synchronizer using blocking assignments module syncbadinput logic clk input logic d output logic q logic n1 alwaysff posedge clk begin n1 d blocking q n1 blocking end endmodule VHDL Bad implementation of a synchronizer using blocking assignment library IEEE use IEEESTDLOGIC1164all entity syncbad is portclk in STDLOGIC d in STDLOGIC q out STDLOGIC end architecture bad of syncbad is begin processclk variable n1 STDLOGIC begin Capítulo quatro Linguagens de Descrição de Hardware 289 if risingedgeclk then n1 d blocking q n1 end if end process end Figura 424 Circuito syncbad sintetizado Devido a n1 ser invisível para o mundo externo e não ter influência no comportamento de q o sintetizador o otimiza inteiramente como mostrado na Figura 424 A moral dessa ilustração é a de utilizar atribuições nonblocking exclusivamente em declarações alwaysprocess quando modelar lógica sequencial Com habilidade suficiente com a inversão da ordem das atribuições você pode fazer atribuições blocking funcionarem corretamente mas atribuições blocking não oferecem vantagens e apenas introduzem o risco de um comportamento incompreensível Certos circuitos sequenciais não irão funcionar corretamente com atribuições blocking não importa a ordem 46 MÁQUINAS DE ESTADOS FINITOS Lembrese que uma máquina de estados finitos FSM consiste num registrador de estado e dois blocos de lógica combinatória para computar o próximo estágio e a saída dados o estado atual e a entrada como mostrado na Figura 422 As descrições HDL da máquinas de estado são correspondentemente divididas em três partes a modelagem do registrador de estado o próximo estado lógico e a saída lógica Capítulo quatro Linguagens de Descrição de Hardware 290 Exemplo HDL 430 MÁQUINA DE ESTADO FINITA DIVIDIR POR 3 SystemVerilog module divideby3FSMinput logic clk input logic reset output logic y typedef enum logic 10 S0 S1 S2 statetype statetype 10 state nextstate state register alwaysff posedge clk posedge reset if reset state S0 else state nextstate next state logic alwayscomb case state S0 nextstate S1 S1 nextstate S2 S2 nextstate S0 default nextstate S0 endcase output logic assign y state S0 endmodule A declaração typedef define statetype como sendo um valor do tipo logic de dois bits com três possibilidades S0 S1 ou S2 state e nexstate são sinais statetype VHDL library IEEE use IEEESTDLOGIC1164all entity divideby3FSM is portclk reset in STDLOGIC y out STDLOGIC end architecture synth of divideby3FSM is type statetype is S0 S1 S2 signal state nextstate statetype begin state register processclk reset begin if reset then state S0 elsif risingedgeclk then state nextstate end if end process next state logic nextstate S1 when state S0 else S2 when state S1 else S0 output logic y 1 when state S0 else 0 end Este exemplo define um novo tipo de dado de enumeração statetype com três possiblidades S0 S1 e S2 state e nextstate são Capítulo quatro Linguagens de Descrição de Hardware 291 As codificações padrão enumeram a ordem numérica S000 S101 S210 As codificações podem ser explicitamente definidas pelo usuário no entanto a ferramenta de síntese os vêem como sugestões não como requerimentos Por exemplo a parte de código abaixo codifica os estados como valores de 3bits onehot typedef enum logic 20 S0 3b001 S1 3b010 S2 3b100 statetype Note como a declaração case é utilizada para definir a tabela de transição de estados Como o próximo estado lógico deve ser combinatório default é necessário embora o estado 2b11 nunca deva mudar A saída y é 1 quando o estado é S0 A comparação de igualdade ab muda o valor para 1 se a é igual a b e 0 em qualquer outro caso A comparação de desigualdade ab realiza o inverso dando o valor de 1 se a for diferente de b sinais statetype Utilizando a enumeração ao invés de escolher a codificação do estado a VHDL dá liberdade ao sintetizador para explorar várias codificações de estado até encontrar a melhor A saída y é 1 quando o estado é S0 A comparação de desigualdade utiliza Para produzir uma saída 1 quando o estado for qualquer um exceto S0 mude a comparação para state S0 O Exemplo HDL 430 descreve a FMS divisão por 3 da Seção 342 Ela fornece um reset assíncrono para a inicialização da FSM O registrador de estado utiliza a linguagem padrão para flipflops O próximo estado e a saída são combinatórios A ferramenta de síntese Synplify Premier apenas produz um diagrama de blocos e um diagrama de transição de estados para máquinas de estado ela não mostra as portas lógicas ou as entradas nos arcos e estados Portanto tenha o cuidado de especificar corretamente a FSM no seu código HDL O diagrama de transição de estados na Figura 425 para a FSM de divisão por 3 é análogo ao diagrama da Figura 328 b O círculo duplo indica que S0 é o estado de reset As implementações a nível de porta para a FSM de divisão por 3 foram mostradas na Seção 342 Capítulo quatro Linguagens de Descrição de Hardware 292 Figura 425 Circuito divideby3fsm sintetizado Note que os estados são nomeados com um tipo de dado de enumeração ao invés de nos referirmos a eles em valores binários Isso deixa o código mais legível e mais fácil de mudar Se por alguma razão quiséssemos que a saída fosse HIGH nos estados S0 e S1 a saída lógica seria modificada como se segue SystemVerilog output logic assign y state S0 state S1 VHDL output logic y 1 when state S0 or state S1 else 0 Os dois próximos exemplos de código descrevem a FSM reconhecedora de padrão de caracol mostrada na Seção 343 O código mostra como utilizar declarações case e if para lidar com próximos estados e saídas lógicas que dependem tanto das entradas como dos estados atuais Mostramos tanto Capítulo quatro Linguagens de Descrição de Hardware 293 os módulos de Mealey como de Moore Na máquina de Moore Exemplo HDL 431 a saída depende apenas do estado atual enquanto a máquina de Mealy Exemplo HDL 432 a saída lógica depende tanto dos estados atuais como das entradas Exemplo HDL 431 FSM DE MOORE RECONHECEDORA DE PADRÃO SystemVerilog module patternMooreinput logic clk input logic reset input logic a output logic y typedef enum logic 10 S0 S1 S2 statetype statetype state nextstate state register alwaysff posedge clk posedge reset if reset state S0 else state nextstate next state logic alwayscomb case state S0 if a nextstate S0 else nextstate S1 S1 if a nextstate S2 else nextstate S1 S2 if a nextstate S0 else nextstate S1 default nextstate S0 endcase VHDL library IEEE use IEEESTDLOGIC1164all entity patternMoore is portclk reset in STDLOGIC a in STDLOGIC y out STDLOGIC end architecture synth of patternMoore is type statetype is S0 S1 S2 signal state nextstate statetype begin state register processclk reset begin if reset then state S0 elsif risingedgeclk then state nextstate end if end process next state logic processall begin case state is when S0 if a then nextstate S0 else nextstate S1 Capítulo quatro Linguagens de Descrição de Hardware 294 output logic assign y state S2 endmodule Note como as atribuições nonblocking são utilizadas nos registradores de estados para descrever lógica sequencial enquanto as atribuições blocking são utilizadas no estado lógico seguinte para descrever lógica combinatória end if when S1 if a then nextstate S2 else nextstate S1 end if when S2 if a then nextstate S0 else nextstate S1 end if when others nextstate S0 end case end process output logic y 1 when state S2 else 0 end Figura 426 Circuito patternMoore sintetizado Capítulo quatro Linguagens de Descrição de Hardware 295 Exemplo HDL 432 FSM DE MEALY RECONHECEDORA DE PADRÃO SystemVerilog module patternMealyinput logic clk input logic reset input logic a output logic y typedef enum logic S0 S1 statetype statetype state nextstate state register alwaysff posedge clk posedge reset if reset state S0 else state nextstate next state logic alwayscomb case state S0 if a nextstate S0 else nextstate S1 S1 if a nextstate S0 else nextstate S1 default nextstate S0 endcase output logic assign y a state S1 endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity patternMealy is portclk reset in STDLOGIC a in STDLOGIC y out STDLOGIC end architecture synth of patternMealy is type statetype is S0 S1 signal state nextstate statetype begin state register processclk reset begin if reset then state S0 elsif risingedgeclk then state nextstate end if end process next state logic processall begin case state is when S0 if a then nextstate S0 else nextstate S1 end if when S1 if a then nextstate S0 Capítulo quatro Linguagens de Descrição de Hardware 296 else nextstate S1 end if when others nextstate S0 end case end process output logic y 1 when a 1 and state S1 else 0 end Figura 427 Circuito patternMealy sintetizado Capítulo quatro Linguagens de Descrição de Hardware 297 47 TIPOS DE DADOS Esta seção explica mais a fundo algumas sutilezas a respeito dos tipos de dados em VHDL e SystemVerilog 471 SystemVerilog Anteriormente ao SystemVerilog a Verilog primeiramente utilizava dois tipos reg e wire Apesar do nome um sinal reg pode ser ou não associado a um registrador Isso era uma grande fonte de confusão para aqueles que estavam aprendendo a linguagem SystemVerilog introduziu o tipo logic para eliminar a confusão consequentemente este livro enfatiza o tipo logic Esta seção explica os tipos reg e wire com mais detalhes para aqueles que precisam ler algum velho código Verilog Em Verilog se um sinal aparece à esquerda de ou num bloco always deve ser declarado como reg De outra forma deveria ser declarado como wire Consequentemente um sinal reg pode ser a saída de um flipflop báscula ou lógica combinatória dependendo da lista de sensibilidade e da declaração de um bloco always Por padrão portas de entrada e de saída são do tipo wire a não ser que sejam explicitamente definidos como reg O exemplo seguinte mostra como um flipflop é descrito em Verilog convencional Note que clk e d são por padrão wire enquanto q é explicitamente definido como reg pois aparece à esquerda de no bloco always module flopinput clk input 30 d output reg 30 q always posedge clk q d endmodule Capítulo quatro Linguagens de Descrição de Hardware 298 A linguagem SystemVerilog introduz o tipo logc logic é um sinônimo para reg e evita enganos sobre qual é verdadeiramente um flipflop Mais ainda SystemVerilog diminui as regras em declarações assign e em instanciações hierárquicas de porta de modo que logic pode ser utilizada fora de um bloco always onde um wire tradicionalmente seria requerido Assim quase todos os sinais SystemVerilog podem ser logic A exceção é que sinais com drivers múltiplos por exemplo um buffer tristate devem ser declarados como net como descrito no Exemplo HDL 410 Essa regra permite à SystemVerilog gerar uma mensagem de erro ao invés de um valor x quando um sinal logic é acidentalmente conectado a múltiplos drivers O tipo mais comum de net é chamado de wire ou tri Estes dois tipos são sinônimos mas wire é utilizado convencionalmente quando um único driver está presente e tri é utilizado quando múltiplos drivers estão presentes Então wire está obsoleto em SystemVerilog pois logic é preferível para sinais com um único driver Quando uma net tri é levada a um mesmo valor por um ou mais drivers ela assume aquele valor Quando não é levada ela flutua z Quando é levada a um valor diferente 0 1 ou x por múltiplos drivers fica em contenção x Existem outros tipos de nets que atuam de forma diferente quando não guiadas ou guiadas por múltiplas fontes Estes outros tipos são raramente utilizados mas podem ser substituidos em qualquer lugar em que uma net tri normalmente apareceria por exemplo para sinais com múltiplos drivers Cada um deles é descrito na Tabela 47 Capítulo quatro Linguagens de Descrição de Hardware 299 Tabela 47 Resoluções de Nets 472 VHDL Ao contrário da SystemVerilog a VHDL faz cumprir um rigoroso sistema de tipo de dados que podem proteger o usuário de alguns erros mas que também é desajeitado algumas vezes Apesar de ser de fundamental importância o tipo STDLOGIG não é construído dentro da VHDL Ao invés disso ele é parte da biblioteca IEEESTDLOGIC1164 Então todos os arquivos devem conter as declarações da biblioteca mostradas nos exemplos anteriores Mais ainda a biblioteca IEEESTDLOGIC1164 carece de operações básicas como adição comparação deslocamentos e conversão para dados inteiros STDLOGICVECTOR Eles foram adicionados finalmente ao padrão VHDL 2008 na biblioteca IEEENUMERICSTDUNSIGNED A linguagem VHDL também possui um tipo BOOLEAN com dois valores true e false Valores BOOLEAN são retornados de comparações tais como comparações de igualdade s 0 e são utilizados em declarações condicionais tais como when e if Apesar da tentação em acreditar que um valor BOOLEAN true deve ser equivalente a um valor STDLOGIC 1 e um BOOLEAN FALSE deve ser equivalente a um STDLOGIC 0 esses tipos não eram intercambiáveis antes de VHDL 2008 Por exemplo num código VHDL antigo devemos escrever y d1 when s 1 else d0 Capítulo quatro Linguagens de Descrição de Hardware 300 enquanto no VHDL 2008 a declaração when automaticamente converte s de STDLOGIC para BOOLEAN Então podemos escrever simplesmente y d1 when s else d0 Mesmo no VHDL 2008 ainda é necessário escrever q 1 when state S2 else 0 ao invés de q state S2 pois state S2 retorna um resultado BOOLEAN o qual não pode ser atribuído diretamente ao sinal STDLOGIC y Apesar de não declararmos quaisquer sinais para serem BOOLEAN eles são automaticamente indicados por comparações e utilizados por declarações condicionais Similarmente a VHDL tem um tipo INTEGER que representa inteiros tanto positivos quanto negativos Sinais do tipo INTEGER abrangem os valores 231 1 a 231 1 pelo menos Valores inteiros são utilizados como índices de barramentos Por exemplo na declaração y a3 and a2 and a1 and a0 Os valores 0 1 2 e 3 são inteiros servindo como um índice para a escolha de bits no sinal a Não podemos indexar diretamente um barramento com um sinal STDLOGIC ou STDLOGICVECTOR Ao invés disso devemos converter o sinal para um INTEGER Isso é demonstrado no exemplo abaixo para um multiplexador 81 que seleciona um bit de um vetor utilizando um índice de 3bits A função T0INTEGER é definida na biblioteca IEEENUMERICSTDUNSIGNED e realiza a conversão de valores positivos sem sinal de STDLOGICVECTOR para INTEGER library IEEE use IEEESTDLOGIC1164all use IEEENUMERICSTDUNSIGNEDall Capítulo quatro Linguagens de Descrição de Hardware 301 entity mux8 is portd in STDLOGICVECTOR7 downto 0 s in STDLOGICVECTOR2 downto 0 y out STDLOGIC end architecture synth of mux8 is begin y dTOINTEGERs end A VHDL também é rigorosa a respeito das portas out sendo utilizadas exclusivamente para saída Por exemplo o seguinte código para portas AND de duas e três entradas é ilegal em VHDL pois v é uma saída e também é utilizada para computar w library IEEE use IEEESTDLOGIC1164all entity and23 is porta b c in STDLOGIC v w out STDLOGIC end architecture synth of and23 is begin v a and b w v and c end A VHDL define um tipo especial de porta buffer que resolve esse problema Um sinal conectado a uma porta buffer se comporta como uma saída mas também pode ser utilizado dentro do módulo A definição correta da entidade é como se segue Verilog e SystemVerilog não possuem essa limitação e Capítulo quatro Linguagens de Descrição de Hardware 302 não necessitam de portas buffer A VHDL 2008 eliminou essa restrição permitindo a portas out serem legíveis mas essa mudança não é suportada pela ferramenta CAD Synplify até ao momento da escrita deste livro entity and23 is porta b c in STDLOGIC v buffer STDLOGIC w out STDLOGIC end Figura 428 Circuito and23 sintetizado A maioria das operações como adição subtração e lógica Booleana são idênticas se um número possui ou não sinal No entanto a comparação de magnitude a multiplicação e deslocamentos aritméticos à direita são executadas de forma diferente em números com sinal em complemento2 Estas operações serão examinadas no Capítulo 5 O Exemplo HDL 433 descreve como indicar que um número possui sinal Exemplo HDL 433 A MULTIPLICADOR SEM SINAL B MULTIPLICADOR COM SINAL SystemVerilog 433a unsigned multiplier module multiplierinput logic 30 a b output logic 70 y assign y a b VHDL 433a unsigned multiplier library IEEE use IEEESTDLOGIC1164all use IEEENUMERICSTDUNSIGNEDall Capítulo quatro Linguagens de Descrição de Hardware 303 endmodule 433b signed multiplier module multiplierinput logic signed 30 ab output logic signed 70 y assign y a b endmodule Em SystemVerilog os sinais são considerados sem sinal por padrão Adicionando o modificador signed logic signed 30 a o sinal é então tratado como possuindo sinal entity multiplier is porta b in STDLOGICVECTOR3 downto 0 y out STDLOGICVECTOR7 downto 0 end architecture synth of multiplier is begin y a b end A VHDL utiliza a biblioteca NUMERICSTDUNSIGNED para realizar operações aritméticas e de comparação em STDLOGICVECTOR Os vetores são tratados como não possuindo sinal use IEEENUMERICSTDUNSIGNEDall A VHDL tambem define os tipos de dados UNSIGNED e SIGNED na biblioteca IEEENUMERICSTD mas isso envolve conversões de tipos de dados que estão além do escopo deste Capítulo Capítulo quatro Linguagens de Descrição de Hardware 304 48 MÓDULOS PARAMETRIZADOS Até agora todos os nossos módulos tiveram entradas e saídas de tamanho fixo Por exemplo tivemos de definir módulos separados para multiplexadores 21 de 4bits e 8bits de largura As HDL permitem a utilização de bits de tamanhos variáveis utilizandose módulos parametrizados O Exemplo HDL 434 declara um multiplexador 21 parametrizado com um tamanho padrão de 8 então utilizao para criar multiplexadores 41 de 8 e 12bits Exemplo HDL 434 MULTIPLEXADORES 21 PARAMETRIZADOS DE NBITS SystemVerilog module mux2 parameter width 8 input logic width10 d0 d1 input logic s output logic width10 y assign y s d1 d0 endmodule A SystemVerilog permite uma declaração parameter antes das entadas e saídas para definir parâmetros A declaração parameter inclui um valor padrão 8 do parâmetro nesse caso chamado width O número de bits nas entradas e nas saídas dependem desse parâmetro module mux48input logic 70 d0 d1 d2 d3 VHDL library IEEE use IEEESTDLOGIC1164all entity mux2 is genericwidth integer 8 portd0 d1 in STDLOGICVECTORwidth1 downto 0 s in STDLOGIC y out STDLOGICVECTORwidth1 downto 0 end architecture synth of mux2 is begin y d1 when s else d0 end A declaração generic inclui um valor padrão 8 para width Esse valor é um inteiro Capítulo quatro Linguagens de Descrição de Hardware 305 input logic 10 s output logic 70 y logic 70 low hi mux2 lowmuxd0 d1 s0 low mux2 himuxd2 d3 s0 hi mux2 outmuxlow hi s1 y endmodule O multiplexador 41 de 8bits instancia três multiplexadores 21 utilzando seus tamanhos padrão Em contraste um multiplexador 41 de 12bits mux412 necessitaria sobrepor o tamanho padrão utilizando antes do nome da instância como mostrado abaixo module mux412input logic 110 d0 d1 d2 d3 input logic 10 s output logic 110 y logic 110 low hi mux2 12 lowmuxd0 d1 s0 low mux2 12 himuxd2 d3 s0 hi mux2 12 outmuxlow hi s1 y endmodule Não confunda o uso de sinal indicando atrasos com o uso de na definição de sobreposição de parâmetros library IEEE use IEEESTDLOGIC1164all entity mux48 is portd0 d1 d2 d3 in STDLOGICVECTOR7 downto 0 s in STDLOGICVECTOR1 downto 0 y out STDLOGICVECTOR7 downto 0 end architecture struct of mux48 is component mux2 genericwidth integer 8 portd0 d1 in STDLOGICVECTORwidth1 downto 0 s in STDLOGIC y out STDLOGICVECTORwidth1 downto 0 end component signal low hi STDLOGICVECTOR7 downto 0 begin lowmux mux2 port mapd0 d1 s0 low himux mux2 port mapd2 d3 s0 hi outmux mux2 port maplow hi s1 y end O multiplexador 41 de 8bits mux48 instancia três multiplexadores 21 utilizando seus tamanhos padrão Em contraste um multiplexador 41 de 12 bits mux412 necessitaria da sobreposição do tamanho padrão utilizandose generic map como mostrado abaixo lowmux mux2 generic map12 port mapd0 d1 s0 low Capítulo quatro Linguagens de Descrição de Hardware 306 himux mux2 generic map12 port mapd2 d3 s0 hi outmux mux2 generic map12 port maplow hi s1 y Figura 429 Circuito mux412 sintetizado Exemplo HDL 435 DECODIFICADOR PARAMETRIZADO 𝑁 2𝑁 SystemVerilog module decoder parameter N 3 input logic N10 a VHDL library IEEE use IEEESTDLOGIC1164all use IEEE NUMERICSTDUNSIGNEDall Capítulo quatro Linguagens de Descrição de Hardware 307 output logic 2N10 y alwayscomb begin y 0 ya 1 end endmodule 2N indica 2𝑁 entity decoder is genericN integer 3 porta in STDLOGICVECTORN1 downto 0 y out STDLOGICVECTOR2N1 downto 0 end architecture synth of decoder is begin processall begin y OTHERS 0 yTOINTEGERa 1 end process end 2N indica 2𝑁 Capítulo quatro Linguagens de Descrição de Hardware 308 O Exemplo HDL 435 mostra um decodificador o qual é uma aplicação ainda melhor dos módulos parametrizados Um grande decodificador 𝑁 2𝑁 é complicado de se especificar em declarações case mas é simples utilizandose um código parametrizado que simplesmente leve o bit de saída apropriado para 1 Especificamente o decodificador utiliza atribuições blocking para colocar todos os bits a 0 e de seguida muda os bits apropriados para 1 As HDL também fornecem declarações generate para produzir uma quantidade variável de hardware dependendo do valor de um parâmetro generate suporta loops for e declarações if para determinar quantos de quais tipos de hardware produzir O Exemplo HDL 436 demonstra como utilizar declarações generate para produzir uma função AND de N entradas a partir de portas AND de duas entradas em cascata É claro um operador de redução seria mais limpo e mais simples para essa aplicação mas o exemplo ilustra o princípio geral dos geradores de hardware Use declarações generate com cautela é fácil produzir uma grande quantidade de hardware involuntariamente Exemplo HDL 436 PORTA AND PARAMETRIZADA DE N ENTRADAS SystemVerilog module andN parameter width 8 input logic width10 a output logic y genvar i logic width10 x generate assign x0 a0 fori1 iwidth ii1 begin forloop assign xi ai xi1 VHDL library IEEE use IEEESTDLOGIC1164all entity andN is genericwidth integer 8 porta in STDLOGICVECTORwidth1 downto 0 y out STDLOGIC end architecture synth of andN is signal x STDLOGICVECTORwidth1 downto 0 begin Capítulo quatro Linguagens de Descrição de Hardware 309 end endgenerate assign y xwidth1 endmodule A declaração for se repete através de i 1 2 width 1 para produzir muitas portas AND consecutivas O begin num loop for generate deve ser seguido por um e um rótulo arbitrário forloop nesse caso x0 a0 gen for i in 1 to width1 generate xi ai and xi1 end generate y xwidth1 end A variável geradora de loop i não precisa ser declarada Figura 430 Circuito andN sintetizado Capítulo quatro Linguagens de Descrição de Hardware 310 49 TESTBENCHES Um testbench bancada de testes em português é um módulo que é utilizado para testar outro módulo chamado de dispositivo sob teste device under test DUT O testbench contém declarações para aplicar entradas ao DUT e idealmente verificar se as saídas corretas são produzidas Os padrões de entrada e de saída desejados são chamados de vetores de teste Considere o teste do módulo sillyfunction da Seção 411 que computa a equação 𝑦 𝑎𝑏𝑐 𝑎𝑏𝑐 𝑎𝑏𝑐 Esse é um módulo simples então nós podemos realizar testes exaustivos aplicandose oito possíveis vetores de teste Exemplo HDL 437 TESTBENCH SystemVerilog module testbench1 logic a b c y instantiate device under test sillyfunction duta b c y apply inputs one at a time initial begin a 0 b 0 c 0 10 c 1 10 b 1 c 0 10 c 1 10 a 1 b 0 c 0 10 c 1 10 b 1 c 0 10 c 1 10 end endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity testbench1 is no inputs or outputs end architecture sim of testbench1 is component sillyfunction porta b c in STDLOGIC y out STDLOGIC end component signal a b c y STDLOGIC begin instantiate device under test dut sillyfunction port mapa b c y apply inputs one at a time process begin a 0 b 0 c 0 wait for 10 ns c 1 wait for 10 ns b 1 c 0 wait for 10 ns Algumas ferramentas também chamam o módulo a ser testado a unidade em ensaio ou unit under test UUT Capítulo quatro Linguagens de Descrição de Hardware 311 A declaração initial executa a declaração em seu corpo no início da simulação Nesse caso ela aplica o padrão de entrada 000 e aguarda 10 unidades de tempo Ela então aplica 001 e aguarda mais 10 unidades e assim por diante até todas as oito possíveis entradas terem sido aplicadas Declarações initial devem ser utilizadas apenas em testbenchs para simulação não em módulos que serão sintetizados em hardware de verdade O hardware não possui um modo mágico de executar uma sequência de passos especiais quando é ligado c 1 wait for 10 ns a 1 b 0 c 0 wait for 10 ns c 1 wait for 10 ns b 1 c 0 wait for 10 ns c 1 wait for 10 ns wait wait forever end process end A declaração process aplica primeiramente o padrão de entrada 000 e então aguarda 10 ns Ela então aplica 001 e aguarda por mais 10 ns e assim sucessivamente até que todas as oito possíveis entradas tenham sido aplicadas No final o processo aguarda indefinidamente De outro modo ele começaria novamente aplicando repetidamente o padrão de vetores de teste Exemplo HDL 438 TESTBENCH AUTOVERIFICÁVEL SystemVerilog module testbench2 logic a b c y instantiate device under test sillyfunction duta b c y apply inputs one at a time checking results initial begin a 0 b 0 c 0 10 VHDL library IEEE use IEEESTDLOGIC1164all entity testbench2 is no inputs or outputs end architecture sim of testbench2 is component sillyfunction porta b c in STDLOGIC Capítulo quatro Linguagens de Descrição de Hardware 312 assert y 1 else error000 failed c 1 10 assert y 0 else error001 failed b 1 c 0 10 assert y 0 else error010 failed c 1 10 assert y 0 else error011 failed a 1 b 0 c 0 10 assert y 1 else error100 failed c 1 10 assert y 1 else error101 failed b 1 c 0 10 assert y 0 else error110 failed c 1 10 assert y 0 else error111 failed end endmodule A instrução assert do SystemVerilog verifica se uma condição especificada é verdadeira Se não for ele executa a instrução else A tarefa do error na declaração else imprime uma mensagem de erro que descreve a falha de declaração Durante a síntese assert é ignorada Em SystemVerilog a comparação com ou é eficaz entre os sinais que não tomam valores de x e z Testbenches usam os operadores e para comparar igualdade e desigualdade respectivamente dado que esses operadores funcionam corretamente com operandos que podem ser x ou z y out STDLOGIC end component signal a b c y STDLOGIC begin instantiate device under test dut sillyfunction port mapa b c y apply inputs one at a time checking results process begin a 0 b 0 c 0 wait for 10 ns assert y 1 report 000 failed c 1 wait for 10 ns assert y 0 report 001 failed b 1 c 0 wait for 10 ns assert y 0 report 010 failed c 1 wait for 10 ns assert y 0 report 011 failed a 1 b 0 c 0 wait for 10 ns assert y 1 report 100 failed c 1 wait for 10 ns assert y 1 report 101 failed b 1 c 0 wait for 10 ns assert y 0 report 110 failed c 1 wait for 10 ns assert y 0 report 111 failed wait wait forever end process end A instrução assert verifica uma condição e imprime a mensagem dada na cláusula report se a condição não for satisfeita assert é significativa apenas na simulação e não na síntese Capítulo quatro Linguagens de Descrição de Hardware 313 O Exemplo HDL 437 demonstra um testbench simples Ela instancia o DUT então aplica as entradas Atribuições blocking e delays são utilizadas para aplicar as entradas na ordem apropriada O usuário deve visualizar os resultados da simulação e verificar por inspeção se a saída correta foi produzida Testbenches são simuladas da mesma forma em outros módulos HDL No entando elas não são sintetizáveis Verificar as saídas corretas é um trabalho tedioso e propenso a erros Mais ainda determinar as saídas corretas é muito mais fácil quando o projeto está ainda fresco na sua mente Se você fizer pequenas mudanças e precisar testar o projeto novamente semanas depois determinar as saídas corretas se torna um aborrecimento Uma abordagem muito melhor é escrever um testbench autochecável mostrado no Exemplo HDL 438 Escrever um código para cada vetor de testes também se torna tedioso especialmente para módulos que requerem um número muito grande de vetores Uma abordagem melhor é colocar os vetores num arquivo separado O testbench lê os vetores de teste do arquivo aplica o vetor de teste de entrada ao DUT espera verifica se os valores de saída do DUT são iguais aos do vetor de saída e repete o processo até alcançar o fim do arquivo de vetores de teste O Exemplo HDL 439 demonstra tal testbench O testbench gera um clock utilizando uma declaração alwaysprocess sem lista de sensibilidade então é continuamente reavaliada Ao início da simulação ela lê os vetores de teste a partir de um arquivo texto e pulsa o reset por dois ciclos Apesar de o clock e do reset não serem necessários para testar a lógica combinatória eles são incluídos pois podem ser importantes para testar um DUT sequencial O exampletv é um arquivo texto que contém as entradas e os valores esperados de saída em binário 0001 0010 0100 0110 1001 1011 1100 1110 Capítulo quatro Linguagens de Descrição de Hardware 314 Exemplo HDL 439 TESTBENCH COM ARQUIVO DE VETOR DE TESTES SystemVerilog module testbench3 logic clk reset logic a b c y yexpected logic 310 vectornum errors logic 30 testvectors100000 instantiate device under test sillyfunction duta b c y generate clock always begin clk 1 5 clk 0 5 end at start of test load vectors and pulse reset initial begin readmembexampletv testvectors vectornum 0 errors 0 reset 1 27 reset 0 end apply test vectors on rising edge of clk always posedge clk begin 1 a b c yexpected testvectorsvectornum VHDL library IEEE use IEEESTDLOGIC1164all use IEEESTDLOGICTEXTIOALL use STDTEXTIOall entity testbench3 is no inputs or outputs end architecture sim of testbench3 is component sillyfunction porta b c in STDLOGIC y out STDLOGIC end component signal a b c y STDLOGIC signal yexpected STDLOGIC signal clk reset STDLOGIC begin instantiate device under test dut sillyfunction port mapa b c y generate clock process begin clk 1 wait for 5 ns clk 0 wait for 5 ns end process at start of test pulse reset process begin reset 1 wait for 27 ns reset 0 wait Capítulo quatro Linguagens de Descrição de Hardware 315 end check results on falling edge of clk always negedge clk if reset begin skip during reset if y yexpected begin check result displayError inputs b a b c display outputs b b expected y yexpected errors errors 1 end vectornum vectornum 1 if testvectorsvectornum 4bx begin displayd tests completed with d errors vectornum errors finish end end endmodule readmemb carrega um arquivo de números binários num array de testvectors readmemh tem uma função similar mas para números hexadecimais O bloco seguinte de código espera uma unidade de tempo após o flanco ascendente do relógio para evitar qualquer confusão se o clock e os dados mudarem simultaneamente então as três entradas a b e c são activas e a saída esperada yexpected baseado nos quatro bits do vetor de testes atual O tesbench compara a saída gerada y com a saída esperada yexpected e imprime um erro se eles não forem iguais b e d indicam se o valor é impresso em binário e hexadecimal respectivamente display é uma tarefa do sistema para imprimir o valor na tela do simulador Por exemplo displayb b end process run tests process is file tv text variable L line variable vectorin stdlogicvector2 downto 0 variable dummy character variable vectorout stdlogic variable vectornum integer 0 variable errors integer 0 begin FILEOPENtv exampletv READMODE while not endfiletv loop change vectors on rising edge wait until risingedgeclk read the next line of testvectors and split into pieces readlinetv L readL vectorin readL dummy skip over underscore readL vectorout a b c vectorin2 downto 0 after 1 ns yexpected vectorout after 1 ns check results on falling edge wait until fallingedgeclk if y yexpected then report Error y stdlogicimagey errors errors 1 Capítulo quatro Linguagens de Descrição de Hardware 316 y yexpected imprime os dois valores y e yexpected em binário h imprime o valor em hexadecimal Este processo é repetido até não haver mais vetores de teste válidos no array testvectors finish encerra a simulação Note que mesmo que o SystemVerilog suporte até 10001 vetores de teste ele encerra a simulação depois de ter executado os oito vetores no arquivo end if vectornum vectornum 1 end loop summarize results at end of simulation if errors 0 then report NO ERRORS integerimagevectornum tests completed successfully severity failure else report integerimagevectornum tests completed errors integerimageerrors severity failure end if end process end O código VHDL utiliza comandos de leitura de arquivos que vão além do escopo desse Capítulo mas esse exemplo dá a sensação do que um tesbench autoverificável parece em VHDL Novas entradas são aplicadas no flanco ascendente do relógo e a saída é verificada no flanco descendente Os erros são reportados assim que ocorrem Ao fim da simulação o testbench imprime o número total de vetores de teste aplicados e o número de erros detectados O testbench do Exemplo HDL 439 é exagerada para um circuito tão simples No entanto ele pode ser facilmente modificado para testar circuitos mais complexos mudando o arquivo exampletv instanciando o novo DUT e mudando algumas linhas de código para ativar as entradas e verificar as saídas Capítulo quatro Linguagens de Descrição de Hardware 317 410 SUMÁRIO Linguagens de descrição de hardware HDL são ferramentas extremamente importantes para projetistas de sistemas digitais modernos Uma vez que o leitor tenha aprendido SystemVerilog ou VHDL será capaz de especificar sistemas digitais muito mais rápido do que se tivesse que desenhar os esquemáticos completos O ciclo de debug é também muito mais rápido pois as modificações requerem mudanças de código ao invés de tediosas religações no esquemático No entanto o ciclo de debug pode ser muito mais longo utilizandose HDL se o leitor não tiver uma boa ideia a respeito do hardware que o seu código implica As HDL são utilizadas tanto para simulação quanto para síntese A simulação lógica é um modo poderoso de testar um sistema num computador antes de transformálo em hardware Os simuladores permitem ao leitor verificar os valores dos sinais internos ao seu sistema que seriam impossíveis de medir numa implementação física de hardware A síntese lógica converte código em circuitos lógicos digitais A coisa mais importante a lembrar quando se está escrevendo um código HDL é que o leitor está descrevendo hardware real e não escrevendo um programa de computador O erro mais comum de iniciantes é escrever o código HDL sem pensar direito a respeito do hardware que se quer produzir Se você não conhece o hardware que está pretendendo ter esteja quase certo de não conseguir o que quer Ao invés disso começe esboçando um diagrama de blocos do seu sistema identificando quais porções são de lógica combinatória quais porções são circuitos sequenciais ou máquinas de estado finitas e assim por diante Então escreva o código HDL para cada porção utilizando as linguagens corretas para indicar o tipo de hardware que o leitor precisa Capítulo quatro Linguagens de Descrição de Hardware 318 Exercícios Os exercícios seguintes podem ser feitos utilizando a sua HDL favorita Se o leitor tem um simulador disponível teste o seu projeto Imprima as formas de onda e explique como pode provar que o circuito funciona Se possuir um sintetizador disponível sintetize o código Imprima o diagrama do circuito gerado e explique porque ele atende às suas expectativas Exercício 41 Esboce o esquemático do circuito descrito pelo seguinte código HDL Simplifique o esquemático para que ele tenha um número mínimo de portas lógicas SystemVerilog module exercise1input logic a b c output logic y z assign y a b c a b c a b c assign z a b a b endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity exercise1 is porta b c in STDLOGIC y z out STDLOGIC end architecture synth of exercise1 is begin y a and b and c or a and b and not c or a and not b and c z a and b or not a and not b end Exercício 42 Esboce o esquemático do circuito descrito pelo seguinte código HDL Simplifique o esquemático para que ele tenha um número mínimo de portas lógicas Capítulo quatro Linguagens de Descrição de Hardware 319 SystemVerilog module exercise2input logic 30 a output logic 10 y alwayscomb if a0 y 2b11 else if a1 y 2b10 else if a2 y 2b01 else if a3 y 2b00 else y a10 endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity exercise2 is porta in STDLOGICVECTOR3 downto 0 y out STDLOGICVECTOR1 downto 0 end architecture synth of exercise2 is begin processall begin if a0 then y 11 elsif a1 then y 10 elsif a2 then y 01 elsif a3 then y 00 else y a1 downto 0 end if end process end Exercício 43 Escreva um módulo HDL que compute uma função XOR de quatro entradas A entrada é 𝑎30 e a saída é 𝑦 Exercício 44 Escreva um tesbench autoverificável para o Exercício 43 Crie um arquivo vetor de testes contendo todos os 16 casos de teste Simule o circuito e mostre que ele funciona Introduza um erro no arquivo de vetor de testes e mostre que o tesbench reporta uma incompatibilidade Capítulo quatro Linguagens de Descrição de Hardware 320 Exercício 45 Escreva um módulo HDL chamado minority Ele recebe três entradas a b e c e produz uma saída y que é TRUE se ao menos duas das entradas são FALSE Exercício 46 Escreva um módulo HDL para um decodificador de display de sete segmentos hexadecimal O decodificador deve lidar com os dígitos A B C D E e F assim como de 0 a 9 Exercício 47 Escreva um tesbench autoverificável para o Exercício 46 Crie um arquivo vetor de testes contendo todos os 16 casos de teste Simule o circuito e mostre que ele funciona Introduza um erro no arquivo de vetor de testes e mostre que a tesbench reporta uma incompatibilidade Exercício 48 Escreva um módulo multiplexador 81 chamado mux8 com entradas 𝑠20 𝑑0 𝑑1 𝑑2 𝑑3 𝑑4 𝑑5 𝑑6 𝑑7 e a saída 𝑦 Exercício 49 Escreva um módulo estrutural para computar a função lógica 𝑦 𝑎𝑏 𝑏𝑐 𝑎𝑏𝑐 utilizando lógica de multiplexadores Utilize o multiplexador do Exercício 48 Exercício 410 Repita o Exercício 49 utilizando um multiplexador 41 e quantas portas NOT forem necessárias Exercício 411 Na Seção 454 foi mostrado que um sincronizador pode ser descrito corretamente com atribuições blocking se as atribuições forem dadas na ordem apropriada Pense num circuito sequencial simples que não possa ser descrito corretamente com atribuições blocking independentemente da ordem Capítulo quatro Linguagens de Descrição de Hardware 321 Exercício 412 Escreva um módulo HDL para um circuito prioridade de oito entradas Exercício 413 Escreva um módulo HDL para um decodificador 24 Exercício 414 Escreva um módulo HDL para um decodificador 664 utilizando três instâncias de decodificadores 24 do Exercício 413 e um grupo de portas AND de três entradas Exercício 415 Escreva um módulo HDL que implemente as equações Booleanas do Exercício 213 Exercício 416 Escreva um módulo HDL que implemente o circuito do Exercício 226 Exercício 417 Escreva um módulo HDL que implemente o circuito do Exercício 227 Exercício 418 Escreva um móduo HDL que implemente a função lógica do Exercício 228 Preste muita atenção no modo como lida com os dont cares Exercício 419 Escreva um módulo HDL que implemente as funções do Exercício 235 Exercício 420 Escreva um módulo HDL que implemente o codificador de prioridade do Exercício 236 Capítulo quatro Linguagens de Descrição de Hardware 322 Exercício 421 Escreva um módulo HDL que implemente o codificador de prioridade modificado do Exercício 237 Exercício 422 Escreva um módulo HDL que implemente o código binário para termômetro do Exercício 238 Exercício 423 Escreva um módulo HDL implementando a função dias no mês da questão 22 Exercício 424 Esboce o diagrama de transição de estados para a FSM descrita pelo código abaixo SystemVerilog module fsm2input logic clk reset input logic a b output logic y logic 10 state nextstate parameter S0 2b00 parameter S1 2b01 parameter S2 2b10 parameter S3 2b11 alwaysff posedge clk posedge reset if reset state S0 else state nextstate alwayscomb case state S0 if a b nextstate S1 else nextstate SO VHDL library IEEE use IEEESTDLOGIC1164all entity fsm2 is portclk reset in STDLOGIC a b in STDLOGIC y out STDLOGIC end architecture synth of fsm2 is type statetype is S0 S1 S2 S3 signal state nextstate statetype begin processclk reset begin if reset then state S0 elsif risingedgeclk then state nextstate end if Capítulo quatro Linguagens de Descrição de Hardware 323 S1 if a b nextstate S2 else nextstate SO S2 if a b nextstate S3 else nextstate SO S3 if a b nextstate S3 else nextstate SO endcase assign y state S1 state S2 endmodule end process processall begin case state is when S0 if a xor b then nextstate S1 else nextstate S0 end if when S1 if a and b then nextstate S2 else nextstate S0 end if when S2 if a or b then nextstate S3 else nextstate S0 end if when S3 if a or b then nextstate S3 else nextstate S0 end if end case end process y 1 when state S1 or state S2 else 0 end Exercício 425 Esboce o diagrama de transição de estados para a FSM descrita pelo seguinte código HDL Uma FSM desta natureza é utilizada num ramo preditor em alguns microprocessadores Capítulo quatro Linguagens de Descrição de Hardware 324 SystemVerilog module fsm1input logic clk reset input logic taken back output logic predicttaken logic 40 state nextstate parameter S0 5b00001 parameter SI 5b00010 parameter S2 5b00100 parameter S3 5b01000 parameter S4 5b10000 alwaysff posedge clk posedge reset if reset state S2 else state nextstate alwayscomb case state S0 if taken nextstate S1 else nextstate S0 S1 if taken nextstate S2 else nextstate S0 S2 if taken nextstate S3 else nextstate S1 S3 if taken nextstate S4 else nextstate S2 S4 if taken nextstate S4 else nextstate S3 default nextstate S2 endcase assign predicttaken state S4 state S3 VHDL library IEEE use IEEESTDLOGIC1164 all entity fsm1 is portclk reset in STDLOGIC taken back in STDLOGIC predicttaken out STDLOGIC end architecture synth of fsm1 is type statetype is S0 S1 S2 S3 S4 signal state nextstate statetype begin processclk reset begin if reset then state S2 elsif risingedgeclk then state nextstate end if end process processall begin case state is when S0 if taken then nextstate S1 else nextstate S0 end if when S1 if taken then nextstate S2 else nextstate S0 end if when S2 if taken then nextstate S3 else nextstate S1 end if when S3 if taken then Capítulo quatro Linguagens de Descrição de Hardware 325 state S2 back endmodule nextstate S4 else nextstate S2 end if when S4 if taken then nextstate S4 else nextstate S3 end if when others nextstate S2 end case end process output logic predicttaken 1 when state S4 or state S3 or state S2 and back 1 else 0 end Exercício 426 Escreva um módulo HDL para uma báscula SR Exercício 427 Escreva um módulo HDL para um flipflop JK O flipflop possui entradas clk J K e a saída Q No flanco ascendente do relógio Q mantém o antigo valor se JK0 Ele ativa 1 em Q se J1 limpa Q para 0 se K1 e inverte Q se JK1 Exercício 428 Escreva um módulo HDL para a báscula da Figura 318 Utilize uma declaração de atribuição para cada porta Especifique atrasos de 1 unidade de tempo ou 1 ns por porta Simule a báscula Capítulo quatro Linguagens de Descrição de Hardware 326 e mostra que ela opera corretamente Em seguida aumente o atraso do inversor O quão grande o atraso necessita ser antes que uma condição de corrida cause o mau funcionamento da báscula Exercício 429 Escreva um módulo HDL para o controlador do semáforo da Seção 341 Exercício 430 Escreva três módulos HDL para o factoring do controlador de semáforo em modo de parada do exemplo 38 Os módulos podem ser chamados de controlador modo e luzes e eles devem ter as entradas e as saídas como mostrado na Figura 333 b Exercício 431 Escreva um módulo HDL descrevendo o circuito na Figura 342 Exercício 432 Escreva um módulo HDL para a FSM com o diagrama de transição de estados dado na Figura 369 do Exercício 322 Exercício 433 Escreva um módulo HDL para a FSM com o diagrama de transição de estados dado na Figura 370 do Exercício 323 Exercício 434 Escreva um módulo HDL para o controlador melhorado do semáforo do Exercício 324 Exercício 435 Escreva um módulo HDL para o caracol do Exercício 325 Exercício 436 Escreva um módulo HDL para a máquina de refrigerantes do Exercício 326 Capítulo quatro Linguagens de Descrição de Hardware 327 Exercício 437 Escreva um módulo HDL para o contador de código Gray do Exercício 327 Exercício 438 Escreva um módulo HDL para o contador de código Gray UPDOWN do Exercício 328 Exercício 439 Escreva um módulo HDL para a FSM do Exercício 329 Exercício 440 Escreva um módulo HDL para a FSM do Exercício 330 Exercício 441 Escreva um módulo HDL para a série complemento2 da questão 32 Exercício 442 Escreva um módulo HDL para o circuito do Exercício 331 Exercício 443 Escreva um módulo HDL para o circuito do Exercício 332 Exercício 444 Escreva um módulo HDL para o circuito do Exercício 333 Exercício 445 Escreva um módulo HDL para o circuito do Exercício 434 O leitor poderá utilizar o full adder da Seção 425 Capítulo quatro Linguagens de Descrição de Hardware 328 Exercícios de SystemVerilog Os exercícios a seguir são específicos para SystemVerilog Exercício 446 Qual o significado para um sinal declarado tri em SystemVerilog Exercício 447 Reescreva o módulo syncbad do Exemplo HDL 429 Utilize atribuições nonblocking mas faça mudanças no código a fim de produzir um sincronizador correto com dois flipflops Exercício 448 Considere os dois módulos SystemVerilog abaixo Eles têm a mesma função Esboce o hardware que cada um desenvolve module code1input logic clk a b c output logic y logic x alwaysff posedge clk begin x a b y x c end endmodule module code2 input logic a b c clk output logic y logic x alwaysff posedge clk begin y x c x a b Capítulo quatro Linguagens de Descrição de Hardware 329 end endmodule Exercício 449 Repita o Exercício 448 substituindo por em cada atribuição Exercício 450 Os módulos SystemVerilog abaixo mostram erros que os estudantes cometem em laboratório Explique os erros em cada módulo e mostre como consertálos a module básculainput logic clk input logic 30 d output reg 30 q always clk if clk q d endmodule b module gatesinput logic 30 a b output logic 30 y1 y2 y3 y4 y5 always a begin y1 a b y2 a b y3 a b y4 a b y5 a b end endmodule c module mux2input logic 30 d0 d1 input logic s Capítulo quatro Linguagens de Descrição de Hardware 330 output logic 30 y always posedge s if s y d1 else y d0 endmodule d module twoflopsinput logic clk input logic d0 d1 output logic q0 q1 always posedge clk q1 d1 q0 d0 endmodule e module FSMinput logic clk input logic a output logic out1 out2 logic state next state logic and register sequential alwaysff posedge clk if state 0 begin if a state 1 end else begin if a state 0 end alwayscomb output logic combinational if state 0 out1 1 else out2 1 endmodule Capítulo quatro Linguagens de Descrição de Hardware 331 f module priorityinput logic 30 a output logic 30 y alwayscomb if a3 y 4b1000 else if a2 y 4b0100 else if a1 y 4b0010 else if a0 y 4b0001 endmodule g module divideby3FSMinput logic clk input logic reset output logic out logic 10 state nextstate parameter S0 2b00 parameter S1 2b01 parameter S2 2b10 State Register alwaysff posedge clk posedge reset if reset state S0 else state nextstate Next State Logic always state case state S0 nextstate S1 S1 nextstate S2 S2 nextstate S0 endcase Output Logic Capítulo quatro Linguagens de Descrição de Hardware 332 assign out state S2 endmodule h module mux2triinput logic 30 d0 d1 input logic s output tri 30 y tristate t0d0 s y tristate t1d1 s y endmodule i module floprseninput logic clk input logic reset input logic set input logic 30 d output logic 30 q alwaysff posedge clk posedge reset if reset q 0 else q d always set if set q 1 endmodule j module and3input logic a b c output logic y logic tmp always a b c begin tmp a b y tmp c Capítulo quatro Linguagens de Descrição de Hardware 333 end endmodule Exercícios de VHDL Os exercícios seguintes são específicos para VHDL Exercício 451 Em VHDL por que é necessário escrever q 1 when state S0 else 0 ao invés de simplesmente q state S0 Exercício 452 Cada um dos módulos VHDL abaixo contém um erro Por brevidade apenas a arquitetura é mostrada Assuma que a cláusula de uso library e a declaração entity estão corretas Explique os erros e mostre como consertálos a architecture synth of báscula is begin processclk begin if clk 1 then q d end if end process end b architecture proc of gates is begin processa begin Y1 a and b Capítulo quatro Linguagens de Descrição de Hardware 334 y2 a or b y3 a xor b y4 a nand b y5 a nor b end process end c architecture synth of flop is begin processclk if risingedgeclk then q d end d architecture synth of priority is begin processall begin if a3 then y 1000 elsif a2 then y 0100 elsif a1 then y 0010 elsif a0 then y 0001 end if end process end e architecture synth of divideby3FSM is type statetype is S0 S1 S2 signal state nextstate statetype begin processclk reset begin if reset then state S0 Capítulo quatro Linguagens de Descrição de Hardware 335 elsif risingedgeclk then state nextstate end if end process processstate begin case state is when S0 nextstate S1 when S1 nextstate S2 when S2 nextstate S0 end case end process q 1 when state S0 else 0 end f architecture struct of mux2 is component tristate porta in STDLOGICVECTOR3 downto 0 en in STDLOGIC y out STDLOGICVECTOR3 downto 0 end component begin t0 tristate port mapd0 s y t1 tristate port mapd1 s y end g architecture asynchronous of floprs is begin processclk reset begin Capítulo quatro Linguagens de Descrição de Hardware 336 if reset then q 0 elsif risingedgeclk then q d end if end process processset begin if set then q 1 end if end process end Capítulo quatro Linguagens de Descrição de Hardware 337 Questões de Entrevista Os exercícios abaixo apresentam questões que têm sido perguntadas em entrevistas de empregos para vagas em projetos digitais Pergunta 41 Escreva uma linha de código HDL que obtenha um barramento de 32bits chamado data com outro sinal chamado sel para produzir um resultado result de 32bits Se sel é TRUE resultdata De outro modo result deve ser sempre 0 Pergunta 42 Explique a diferença entre declarações blocking e nonblocking em SystemVerilog Dê exemplos Pergunta 43 O que a seguinte declaração em SystemVerilog faz result data150 16hC820 Capítulo quatro Linguagens de Descrição de Hardware 338 339 5 Blocos de Construção Digital 51 INTRODUÇÃO Até este momento examinámos o projeto de circuitos combinatórios e sequenciais utilizando equações Booleanas esquemáticos e HDL Este Capítulo apresenta blocos de construção sequenciais e combinatórios mais elaborados utilizados em sistemas digitais Esses blocos incluem circuitos aritméticos contadores registradores de deslocamento matrizes de memória e matrizes lógicas Esses blocos de construção não são úteis apenas por direito próprio mas também demonstram os princípios da hierarquia modularidade e regularidade Os blocos de construção são hierarquicamente montados a partir de componentes mais simples tais como portas lógicas multiplexadores e decodificadores Cada bloco de construção tem uma interface bem definida e pode ser tratado como uma caixa preta quando a implementação subjacente não é importante A estrutura regular de cada bloco de construção é facilmente estendida para diferentes tamanhos No Capítulo 7 usamos muitos desses blocos de construção para construir um microprocessador 52 CIRCUITOS ARITMÉTICOS Os circuitos aritméticos são os blocos de construção centrais dos computadores Computadores e lógica digital executam várias funções aritméticas adição subtração comparações deslocamentos multiplicação e divisão Esta Seção descreve as implementações de hardware para todas estas operações Capítulo cinco Blocos de Construção Digital 340 521 Adição A adição é uma das operações mais comuns em sistemas digitais Vamos primeiro considerar como adicionar dois números binários de 1bit Então vamos estender a números binários de Nbits Os somadores também ilustram compromisso entre velocidade e complexidade Half Adder Começamos por construir um half adder de 1bit Como mostrado na Figura 51 o half adder tem duas entradas A e B e duas saídas S e Cout S representa a soma de A e B Se A e B são ambos 1 S é 2 o que não pode ser representado com um único dígito binário Em vez disso é indicado com um transporte carry Cout na próxima coluna Este somador parcial pode ser construído a partir de uma porta XOR e uma porta AND Num somador multibit Cout é adicionado ou transportado para o próximo bit mais significativo Por exemplo na Figura 52 o bit de transporte mostrado em azul é a saída Cout da primeira coluna da adição de 1bit e a entrada Cin para a segunda coluna de adição No entanto o half adder carece de uma entrada Cin para aceitar o Cout da coluna anterior O full adder descrito na próxima seção resolve este problema Full Adder O full adder introduzido na Seção 21 aceita o transporte de entrada em Cin como mostrado na Figura 53 A figura também mostra as equações de saída para S e Cout Somador Carry Propagate Um somador de Nbits soma duas entradas de Nbits A e B e um transporte de entrada Cin para produzir um resultado S de Nbits e um transporte de saída Cout É normalmente designado de somador carry propagate CPA carry propagate adder porque o transporte de saída de um bit se propaga para o próximo bit O símbolo de um CPA é mostrado na Figura 54 ele é desenhado como um somador completo exceto que A B e S são barramentos em vez de bits únicos Três implementações CPA comuns são chamadas de somadores ripplecarry carrylookahead e prefix Figura 51 Half adder de 1bit Figura 52 Bit de transporte carry Figura 53 Full adder de 1bit Capítulo cinco Blocos de Construção Digital 341 Somador RippleCarry A maneira mais simples de construir um somador de Nbits com propagação do transporte é encadear N full adders O Cout de um estágio atua como o Cin do estágio seguinte como mostrado na Figura 55 para uma adição de 32bits Isso é chamado de somador ripple carry É uma boa aplicação da modularidade e regularidade o módulo full adder é reutilizado várias vezes para formar um sistema maior O somador ripple carry tem a desvantagem de ser muito lento quando N é elevado S31 depende de C30 que depende de C29 que depende de C28 e assim por diante todo o caminho até Cin como mostrado em azul na Figura 55 Dizemos que há um ripple do transporte ao longo da cadeia de transporte O atraso do circuito somador tripple aumenta diretamente com o número de bits conforme indicado na Equação 51 onde tFA é o atraso de um full adder Figura 54 Somador carry propagate Figura 55 Somador ripplecarry de 32bits 𝑡𝑟𝑖𝑝𝑝𝑙𝑒 𝑁𝑡𝐹𝐴 51 Somador CarryLookahead A razão fundamental pela qual os somadores ripplecarry de dimensão elevada são lentos é que os sinais de transporte devemse propagar através de cada bit no somador O somador carry lookahead CLA carry lookahead adder é outro tipo de somador com transporte que resolve este Os esquemas tipicamente mostram sinais que fluem da esquerda para a direita Os circuitos aritméticos quebram esta regra pois o transporte flui da direita para a esquerda da coluna menos significativa para a coluna mais significativa Ao longo dos séculos as pessoas têm usado muitos dispositivos para realizar aritmética As crianças contam pelos dedos e alguns adultos furtivamente também o fazem Os chineses e os babilónios inventaram o ábaco tão cedo quanto 2400 AC As réguas de cálculo inventadas em 1630 ainda eram usadas até à década de 1970 quando as calculadoras de mão científicas se tornaram predominantes Os computadores e as calculadoras digitais são hoje omnipresentes Qual será o próximo método Capítulo cinco Blocos de Construção Digital 342 problema dividindo o somador em blocos e fornecendo circuitos para determinar rapidamente o transporte de saída de um bloco assim que o transporte de entrada é conhecido Assim dizse que antecipa os blocos ao invés de esperar a propagação através de todos os full adders dentro de um bloco Por exemplo um somador de 32bits pode ser dividido em oito blocos de 4bits O CLA usa sinais de gerar G e propagar P que descrevem como uma coluna ou bloco determina o transporte de saída A coluna i de um somador é dito gerar um transporte se produz um transporte de saída independente do transporte de entrada A coluna i de um somador garante a geração de um transporte Ci se Ai e Bi são ambos 1 Assim Gi o sinal gerar da coluna i é calculado como Gi AiBi A coluna é dita propagar um transporte se produz um transporte de saída sempre que há um transporte de entrada A coluna i irá propagar um transporte de entrada Ci1 se Ai ou Bi é 1 Assim Pi Ai Bi Com base nestas definições podemos reescrever a lógica de transporte para uma determinada coluna do somador A coluna i de um somador irá gerar um transporte de saída Ci se gerar um transporte Gi ou se propagar um transporte de entrada PiCi1 Na forma de equação 𝐶𝑖 𝐴𝑖𝐵𝑖 𝐴𝑖 𝐵𝑖𝐶𝑖1 𝐺𝑖 𝑃𝑖𝐶𝑖1 52 As definições de gerar e propagar estendemse a blocos de múltiplos bits Um bloco é dito gerar um transporte de saída se produz um transporte de saída independente do transporte de entrada no bloco O bloco é dito propagar um transporte se produz um transporte de saída sempre que há um transporte de entrada no bloco Podemos definir Gij e Pij como sinais de gerar e propagar de blocos abrangendo as colunas i até j Um bloco gera um transporte se a coluna mais significativa gera um transporte ou se a coluna mais significativa propaga um transporte e a coluna anterior gera um transporte e assim por diante Por exemplo a lógica de geração para um bloco que se estende pelas colunas 3 até 0 é 𝐺30 𝐺3 𝑃3𝐺2 𝑃2𝐺1 𝑃1𝐺0 53 Um bloco propaga um transporte se todas as colunas do bloco propagam o transporte Por exemplo a lógica de propagação para um bloco que se estende pelas colunas de 3 até 0 é Capítulo cinco Blocos de Construção Digital 343 𝑃30 𝑃3𝑃2𝑃1𝑃0 54 Usando os sinais de gerar e propagar do bloco podemos rapidamente calcular o transporte de saída do bloco Ci usando o transporte no bloco Cj 𝐶𝑖 𝐺𝑖𝑗 𝑃𝑖𝑗𝐶𝑗 55 A Figura 56 a mostra um somador de 32bits carrylookahead composto por oito blocos de 4bits Cada bloco contém um somador ripplecarry de 4bits e alguma lógica lookahead para determinar o transporte de saída do bloco dado o transporte de entrada como mostrado na Figura 56 b As portas AND e OR necessárias para determinar os sinais gerar e propagar dos bits individuais Gi e Pi de Ai e Bi são deixadas de fora por questões de simplicidade Mais uma vez o somador carrylookahead demonstra modularidade e regularidade Todos os blocos do CLA determinam os sinais gerar e propagar dos bits individuais e do bloco em simultâneo O caminho crítico começa com a computação de G0 e G30 no primeiro bloco do CLA Cin em seguida avança diretamente para Cout através das portas ANDOR em cada bloco até o último Para um somador grande isto é muito mais rápido do que esperar que o transporta se propague através de cada bit consecutivo do somador Finalmente o caminho crítico através do último bloco contém um pequeno somador ripplecarry Assim um somador de Nbits dividido em blocos de kbits tem um atraso 𝑡𝐶𝐿𝐴 𝑡𝑝𝑔 𝑡𝑝𝑔𝑏𝑙𝑜𝑐𝑘 𝑁 𝑘 1 𝑡𝐴𝑁𝐷𝑂𝑅 𝑘𝑡𝐹𝐴 56 onde tpg é o atraso das portas indivíduo gerarpropagar uma porta AND ou OR para gerar Pi e Gi tpgblock é o atraso para encontrar sinais de gerarpropagar Pij e Gij para um bloco de kbits e tANDOR é o atraso de Cin até Cout através da lógica final ANDOR do bloco de kbits do CLA Para N 16 o somador carrylookahead é geralmente muito mais rápido do que o somador ripplecarry No entanto o atraso do somador ainda aumenta linearmente com N Capítulo cinco Blocos de Construção Digital 344 Figura 56 a Somador de 32bits carrylookahead CLA b bloco CLA de 4bits Exemplo 51 ATRASO DO SOMADOR RIPPLECARRY E DO SOMADOR CARRYLOOKAHEAD Compare os atrasos de um somador ripplecarry de 32bits e um somador carrylookahead de 32 bits com blocos de 4bits Suponha que o atraso de uma porta de duas entradas é de 100 ps e que o atraso do full adder é de 300 ps Solução De acordo com a Equação 51 o atraso de propagação do somador ripple carry é de 32 300 ps 96 ns Capítulo cinco Blocos de Construção Digital 345 O CLA tem tpg 100 ps tpgblock 6 100 ps 600 ps e tANDOR 2 100 ps 200 ps De acordo com a Equação 56 o atraso de propagação do somador carrylookahead de 32bits com blocos de 4bits é assim 100 ps 600 ps 324 1 x 200 ps 4 300 ps 33 ns quase três vezes mais rápido do que o somador ripplecarry Somadores Prefix Os somadores prefix estendem a lógica de gerar e propagar do somador carry lookahead para executar ainda mais rápido Primeiro calculam G e P para pares de colunas em seguida para blocos de 4 em seguida para os blocos de 8 em seguida 16 e assim por diante até que o sinal de gerar para cada coluna é conhecido As somas são calculadas a partir destes sinais Por outras palavras a estratégia do somador prefix é calcular o transporte em Ci1 para cada coluna i tão rapidamente quanto possível em seguida calcular a soma utilizando 𝑆𝑖 𝐴𝑖 𝐵𝑖 𝐶𝑖1 57 Define a coluna i 1 para manter Cin então G1 Cin e P1 0 Em seguida Ci1 Gi11 porque haverá um transporte de saída da coluna i1 se o bloco abrangendo i1 a 1 gerar um transporte O transporte produzido pode ser gerado na coluna de i1 ou gerada numa das colunas anteriores e propagado Assim reescrevemos a Equação 57 como 𝑆𝑖 𝐴𝑖 𝐵𝑖 𝐶𝑖11 58 Por isso o principal desafio é calcular rapidamente para todos os blocos os sinais gerar G11 G01 G11 G21 GN21 Estes sinais juntamente com P11 P01 P11 P21 PN21 são chamados prefixos A Figura 57 mostra um somador prefix de N 16bits O somador começa com uma precomputação para formar Pi e Gi para cada coluna de Ai e Bi usando portas AND e OR Em seguida usa log2N 4 níveis de células negras para formar os prefixos de Gij e Pij Uma célula negra aceita as entradas da parte superior de um bloco que abrange os bits ik e da parte inferior abrangendo bits k1j Combina estas partes para formar sinais gerar e propagar para todo o bloco que abrange os bits ij utilizando as equações Os primeiros computadores usavam somadores ripple carry porque os componentes eram caros e os somadores ripplecarry utilizavam menos hardware Praticamente todos os PC modernos usam somadores prefix em caminhos críticos porque os transístores são agora baratos e a velocidade é de grande importância Capítulo cinco Blocos de Construção Digital 346 𝐺𝑖𝑗 𝐺𝑖𝑘 𝑃𝑖𝑘𝐺𝑘1𝑗 59 𝑃𝑖𝑗 𝑃𝑖𝑘𝑃𝑘1𝑗 510 Por outras palavras um bloco abrangendo os bits ij irá gerar um transporte se a parte superior gerar um transporte ou se a parte superior propagar um transporte gerado na parte inferior O bloco irá propagar um transporte se ambas as partes superior e inferior propagarem o transporte Finalmente o somador prefix calcula as somas usando a equação 58 Em resumo o somador prefix atinge um atraso que tem um crescimento logarítmico em vez de linear com o número de colunas do somador Esta aceleração é significativa especialmente para somadores com 32 ou mais bits mas é obtida à custa de mais hardware do que um simples somador de carrylookahead A rede de células negras é chamada de prefix tree O princípio geral da utilização de prefix trees para realizar computações em que o tempo tem um crescimento logarítmico com o número de entradas é uma técnica poderosa Com alguma habilidade ela pode ser aplicada a muitos outros tipos de circuitos ver por exemplo o Exercício 57 O caminho crítico para um somador prefix de Nbits envolve a precomputação de Pi e Gi seguido por log2N estágios de células negras prefix para obter todos os prefixos Gi11 prossegue então através da porta XOR final em baixo para calcular Si Matematicamente o atraso de um somador prefix de Nbits é 𝑡𝑃𝐴 𝑡𝑝𝑔 log2𝑁𝑡𝑝𝑔𝑝𝑟𝑒𝑓𝑖𝑥 𝑡𝑋𝑂𝑅 511 onde tpgprefix é o atraso de uma célula negra prefix Capítulo cinco Blocos de Construção Digital 347 Figura 57 Somador prefix de 16bits Exemplo 52 ATRASO DE UM SOMADOR PREFIX Calcule o atraso de um somador prefix de 32bits Suponha que o atraso de cada porta de duas entradas é de 100 ps Capítulo cinco Blocos de Construção Digital 348 Solução O atraso de propagação de cada célula prefix negra tpgprefix é de 200 ps ou seja dois atrasos de porta Assim usando a Equação 511 o atraso de propagação do circuito somador prefix de 32bits é de 100 ps log232 200 ps 100 ps 12 ns que é cerca de três vezes mais rápido do que o somador carrylookahead e oito vezes mais rápido que o somador ripplecarry do Exemplo 51 Na prática os benefícios não são assim tão grandes mas os somadores prefix ainda são substancialmente mais rápidos do que as alternativas Colocando Tudo Junto Esta Seção apresenta o half adder full adder e três tipos de somadores por propagação do transporte ripplecarry carrylookahead e somadores prefix Os somadores mais rápidos exigem mais hardware e portanto são mais caros e apresentam um consumo energético maior Estes compromissos devem ser considerados ao escolher um somador apropriado para um projeto As linguagens de descrição de hardware fornecem a operação para especificar um CPA As ferramentas de síntese modernas selecionam entre muitas implementações possíveis escolhendo o projeto mais barato menor que atende aos requisitos de velocidade Isso simplifica muito o trabalho do projetista O Exemplo HDL 51 descreve um CPA com transportes de entrada e de saída Exemplo HDL 51 SOMADOR SystemVerilog module adder parameter N 8 input logic N10 a b input logic cin output logic N10 s output logic cout assign cout s a b cin endmodule VHDL library IEEE use IEEESTDLOGIC1164ALL use IEEENUMERICSTDUNSIGNEDALL entity adder is genericN integer 8 porta b in STDLOGICVECTORN1 downto 0 cin in STDLOGIC s out STDLOGICVECTORN1 downto 0 Capítulo cinco Blocos de Construção Digital 349 cout out STDLOGIC end architecture synth of adder is signal result STDLOGICVECTORN downto 0 begin result 0 a 0 b cin s resultN1 downto 0 cout end Figura 58 Somador sintetizado 522 Subtracção Lembrese da Seção 146 em os que somadores podiam adicionar números positivos e negativos utilizando a representação numérica de complemento2 A subtração é quase tão fácil inverter o sinal do segundo número em seguida adicionamse Inverter o sinal de um número em complemento2 é realizado invertendo os bits e adicionando 1 Para calcular Y A B primeiro produza o complemento2 de B Inverta os bits de B para obter 𝐵 e adicione 1 para obter B 𝐵 1 Adicione esta quantidade a A para obter Y A 𝐵 1 A B Esta soma pode ser realizada com um único CPA através da adição de A 𝐵 com Cin 1 A Figura 59 mostra o símbolo para um subtrator e o hardware para efetuar Y A B O Exemplo HDL 52 descreve um subtrator Figura 59 Subtrator a símbolo b implementação Capítulo cinco Blocos de Construção Digital 350 Exemplo HDL 52 SUBTRATOR SystemVerilog module subtractor parameter N 8 input logic N10 a b output logic N10 y assign y a b endmodule VHDL library IEEE use IEEESTDLOGIC1164ALL use IEEENUMERICSTDUNSIGNEDALL entity subtractor is genericN integer 8 porta b in STDLOGICVECTORN1 downto 0 y out STDLOGICVECTORN1 downto 0 end architecture synth of subtractor is begin y a b end Figura 510 Subtrator sintetizado 523 Comparadores Um comparador determina se dois números binários são iguais ou se um é maior ou menor do que o outro Um comparador recebe dois números binários A e B de Nbits Há dois tipos comuns de comparadores Capítulo cinco Blocos de Construção Digital 351 Figura 511 Comparador de 4bits igualdade a símbolo b implementação Um comparador de igualdade produz uma saída que indica se A é igual a B A B Um comparador de magnitude produz uma ou mais saídas indicando os valores relativos de A e B O comparador de igualdade é a peça mais simples de hardware A Figura 512 mostra o símbolo e a implementação de um comparador de igualdade de 4bits Primeiro verifica para determinar se os bits correspondentes em cada coluna de A e B são iguais usando portas XNOR Os números são iguais se todas as colunas forem iguais A comparação de magnitude geralmente é feita através da computação de A B e olhando para o sinal bit mais significativo do resultado como mostrado na Figura 511 Se o resultado for negativo isto é o bit de sinal é um então A é inferior a B Caso contrário A é maior do que ou igual a B O Exemplo HDL 53 mostra como utilizar as várias operações de comparação Exemplo HDL 53 COMPARADORES SystemVerilog module comparator parameter N 8 input logic N10 a b output logic eq neq lt lte gt gte assign eq a b assign neq a b VHDL library IEEE use IEEESTDLOGIC1164ALL entity comparators is genericN integer 8 porta b in STDLOGICVECTORN1 downto 0 eq neq lt lte gt gte out STDLOGIC Figura 512 Comparador de magnitude de 4bits Capítulo cinco Blocos de Construção Digital 352 assign lt a b assign lte a b assign gt a b assign gte a b endmodule end architecture synth of comparator is begin eq 1 when a b else 0 neq 1 when a b else 0 lt 1 when a b else 0 lte 1 when a b else 0 gt 1 when a b else 0 gte 1 when a b else 0 end Figura 513 Comparadores sintetizado Capítulo cinco Blocos de Construção Digital 353 524 ALU Uma unidade aritméticalógica ALU combina uma variedade de operações matemáticas e lógicas numa única unidade Por exemplo uma ALU típica pode realizar operações de adição subtração comparação de magnitude e operações AND e OR A ALU forma o coração da maioria dos sistemas de computadores A Figura 514 mostra o símbolo para uma ALU de Nbits com entradas e saídas de Nbit A ALU recebe um sinal F de controle que especifica qual a função a ser executada Os sinais de controle irão geralmente ser mostrados a azul para distinguilos dos sinais de dados A Tabela 51 lista as funções típicas que a ALU pode executar A função SLT é usada para a comparação de magnitude e será discutida mais adiante nesta seção Tabela 51 Operações da ALU A Figura 515 mostra uma implementação da ALU A ALU contém um somador de Nbits e N portas AND e OR de N entradas Ela também possui inversores e um multiplexador para inverter a entrada B quando o sinal de controlo F2 é ativado Um multiplexador 41 escolhe a função desejada com base nos sinais de controlo F10 Figura 514 Símbolo de uma ALU Capítulo cinco Blocos de Construção Digital 354 Mais especificamente os blocos lógicos e aritméticos na ALU operam em A e BB BB é B ou 𝐵 dependendo de F2 Se F10 00 o multiplexador de saída escolhe A AND BB Se F10 01 a ALU determina A OR BB Se F10 10 a ALU executa adição ou subtração Notese que F2 é também o transporte para o somador Também devemos relembrar que 𝐵 1 B na aritmética complemento 2 Se F2 0 a ALU calcula A B Se F2 1 a ALU calcula A 𝐵 1 A B Quando F20 111 a ALU executa a operação ativa se menor que SLT set if less than Quando A B Y 1 Caso contrário o Y 0 Por outras palavras Y é ativado a 1 se A for inferior a B A SLT é realizada através do cálculo de S A B Se S é negativo isto é o bit de sinal está ativo A é inferior a B A unidade de extensão do zero zero extend unit produz uma saída de Nbits concatenando a sua entrada de 1bit com zeros nos bits mais significativos O bit de sinal o bit N 1 de S é a entrada para a unidade de extensão de zero Exemplo 53 ATIVA SE MENOR QUE Configure uma ALU de 32bits para a operação SLT Suponha que A 2510 e B 3210 Mostre os sinais de controlo e de saída Y Solução Por causa de A B esperamos que Y seja 1 Para SLT F20 111 Com F2 1 isto configura a unidade somador como um subtrator com uma saída S de 2510 3210 710 1111 10012 Com F10 11 o multiplexador final estabelece Y S31 1 Algumas ALU produzem saídas extras chamadas de flags que fornecem informações sobre a saída da ALU Por exemplo uma flag de transbordo overflow indica que o resultado do somador transbordou Uma flag de zero indica que a saída da ALU é 0 O HDL para uma ALU de Nbits é deixado para o Exercício 59 Existem muitas variações sobre esta ALU básica que suportam outras funções tais como XOR ou a comparação de igualdade Figura 515 ALU de Nbits Capítulo cinco Blocos de Construção Digital 355 525 Shifters e Rotators Os shifters e rotators deslocam os bits e multiplicam ou dividem por potências de 2 Como o nome indica um shifter desloca um número binário para a esquerda ou para a direita um número especificado de posições Existem vários tipos de shifters normalmente utilizados O shifter lógico desloca o número à esquerda LSL ou à direita LSR e preenche os lugares vazios com 0 Ex 11001 LSR 2 00110 11001 LSL 2 00100 O shifter aritmético é o mesmo que um shifter lógico mas nos deslocamentos para a direita preenche os bits mais significativos com uma cópia do bit mais significativo msb Isso é útil para multiplicar e dividir números com sinal ver Seções 526 e 527 Nos deslocamentos aritméticos para a esquerda ASL é o mesmo que o shift lógico para a esquerda LSV Ex 11001 ASR 2 11110 11001 ASL 2 00100 O rotator circula o número tal que os lugares vazios são preenchidos com os bits que saem da outra extremidade Ex 11001 ROR 2 01110 11001 ROL 2 00111 Um shifter de Nbits pode ser construído a partir de N multiplexadores N1 A entrada é deslocada por 0 a N 1 bits dependendo do valor das log2N bits linhas de seleção A Figura 516 apresenta o símbolo e o hardware de shifter de 4bits Os operadores e normalmente indicam shift à esquerda shift lógico à direita e shift aritmético à direita respectivamente Dependendo do valor de 2bits da quantidade de deslocamento shamt10 a saída Y recebe a entrada A deslocada por 0 a 3 bits Para todos os shifter quando shmt10 00 Y A O Exercício 514 aborda o projeto de rotators Um shift à esquerda é um caso especial da multiplicação Um shift à esquerda de N bits multiplica o número por 2N Por exemplo 0000112 4 1100002 é equivalente a 310 x 24 4810 Capítulo cinco Blocos de Construção Digital 356 Figura 516 Shifters de 4bit a shift à esquerda b shift lógico à direita c shift aritmético à direita Um shift aritmético à direita é um caso especial de divisão Um shift aritmético à direita por N bits divide o número por 2N Por exemplo 111002 2 111112 é equivalente a 410 22 110 526 Multiplicação A multiplicação de números binários sem sinal é semelhante à multiplicação decimal mas envolve apenas 1 e 0 A Figura 517 compara a multiplicação em decimal e binário Em ambos os casos os produtos parciais são formados pela multiplicação de um único dígito do multiplicador com todo o multiplicando Os produtos parciais são deslocados e somados para formar o resultado Em geral um multiplicador N N multiplica dois números de Nbits e produz um resultado de 2N bits Os produtos parciais da multiplicação binária são ou o multiplicando ou 0 A multiplicação de Capítulo cinco Blocos de Construção Digital 357 números binários de 1bit é equivalente à operação AND de modo que portas AND são utilizadas para formar os produtos parciais A Figura 518 mostra o símbolo a função e a implementação de um multiplicador 4 4 O multiplicador recebe o multiplicando e o multiplicador A e B e produz o produto P A Figura 518 b mostra como os produtos parciais são formados Cada produto parcial é um único bit do multiplicador B3 B2 B1 ou B0 AND os bits do multiplicando A3 A2 A1 A0 Com operandos de Nbits existem N produtos parciais e N 1 estágio somadores de 1bit Por exemplo para um multiplicador 4 4 o produto parcial da primeira linha é B0 AND A3 A2 A1 A0 Este produto parcial é adicionado ao segundo produto parcial deslocado B1 e A3 A2 A1 A0 As linhas subsequentes de portas AND e somadores produzem e adicionam os produtos parciais restantes O HDL para um multiplicador é fornecido no Exemplo HDL 54 Tal como acontece com os somadores muitos projetos diferentes de multiplicadores com diferentes soluções de compromisso velocidadecusto existem As ferramentas de síntese podem escolher o projeto mais adequado tendo em conta as restrições de tempo Figura 517 Multiplicação a decimal b binária Capítulo cinco Blocos de Construção Digital 358 Figura 518 Multiplicador 4 4 a símbolo b função c implementação Exemplo HDL 54 MULTIPLICADOR SystemVerilog module multiplier parameter N 8 input logic N10 a b output logic 2N10 y assign y a b endmodule VHDL library IEEE use IEEESTDLOGIC1164ALL use IEEENUMERICSTDUNSIGNEDALL entity multiplier is genericN integer 8 porta b in STDLOGICVECTORN1 downto 0 y out STDLOGICVECTOR2N1 downto 0 end architecture synth of multiplier is begin y a end Capítulo cinco Blocos de Construção Digital 359 Figura 519 Multiplicador sintetizado 527 Divisão A divisão binária pode ser realizada utilizando o seguinte algoritmo para números sem sinal de N bits no intervalo 0 2N1 R 0 for i N1 to 0 R R 1 Ai D R B if D 0 then Qi 0 R R R B else Qi 1 R D R B R R O resto parcial R é inicializado a 0 O bit mais significativo do dividendo A tornase então o bit menos significativo de R O divisor B é repetidamente subtraído deste resto parcial para determinar se se encaixa Se a diferença D é negativa isto é o bit de sinal de D é 1 então o bit quociente Qi é 0 e a diferença é descartada Caso contrário Qi é 1 e o resto parcial é atualizado para ser a diferença Em qualquer caso o resto parcial é então dobrado shift à esquerda por uma coluna o próximo bit mais significativo de A tornase o bit menos significativo de R e o processo repetese O resultado satisfaz 𝐴 𝐵 𝑄 𝑅 𝐵 A Figura 520 apresenta um esquema de uma matriz divisora de 4 bits O divisor calcula AB e produz um quociente Q e um resto R A legenda mostra o símbolo e o esquema para cada bloco na matriz divisora O sinal N indica se R B é negativo Sendo obtido a partir da saída D do bloco mais à esquerda na fila que é o sinal da diferença O atraso de uma matriz divisora de Nbits aumenta proporcionalmente com N2 porque o transporte devese propagar ao longo de todos os N estágios numa linha antes do sinal ser determinado e o Capítulo cinco Blocos de Construção Digital 360 multiplexador selecionar R ou D Isso se repete para todas as N linhas A divisão é uma operação lenta e dispendiosa em hardware e portanto deve ser usada o menos frequentemente possível Figura 520 Matriz divisora 528 Leituras Adicionais A aritmética computacional poderia ser objeto de um texto inteiro Digital Arithmetic de Ercegovac e Lang é uma excelente visão geral desta temática CMOS VLSI Design de Weste e Harris abrange o projeto de circuitos de alto desempenho para operações aritméticas Capítulo cinco Blocos de Construção Digital 361 53 SISTEMAS NUMÉRICOS Os computadores operam números inteiros e fracções Até agora só foi considerada a representação de inteiros com e sem sinal introduzida na Seção 14 Esta Seção apresenta os sistemas numéricos de vírgula fixa e de vírgula flutuante que podem representar números racionais Os números de vírgula fixa são análogos aos decimais alguns dos bits representam a parte inteira e o resto representa a fracção Os números de vírgula flutuante são análogos à notação científica com uma mantissa e um expoente 531 Sistema Numérico de Vírgula Fixa A notação de vírgula fixa possui uma vírgula binária implícita entre os bits do número inteiro e a parte fraccionária análogo à vírgula decimal entre os dígitos inteiros e fraccionários de um número decimal ordinário Por exemplo a Figura 521 a mostra um número de vírgula fixa com quatro bits inteiros e quatro bits de fraccionários A Figura 521 b mostra a vírgula binária implícita em azul e a Figura 521 c mostra o valor decimal equivalente Os números de vírgula fixa com sinal podem usar a notação de complemento2 ou a notação sinalmagnitude A Figura 522 mostra a representação de vírgula fixa de 2375 usando ambas as notações com quatro bits inteiros e quatro bits fraccionários A vírgula binária implícita é mostrada em azul para maior clareza Na forma sinalmagnitude o bit mais significativo é usado para indicar o sinal A representação de complemento2 é formada invertendo os bits do valor absoluto e adicionando 1 ao bit menos significativo Neste caso a posição do bit menos significativo é na coluna 24 Como todas as representações de números binários os números de vírgula fixa são apenas uma coleção de bits Não há nenhuma maneira de saber da existência da vírgula binária exceto por acordo das pessoas que interpretam o número Exemplo 54 ARITMÉTICA COM NÚMEROS DE VÍRGULA FIXA Calcule 075 0625 usando números de vírgula fixa Solução Primeiro convertemos 0625 a magnitude do segundo número para a notação binária de vírgula fixa 0625 21 por isso há um 1 na coluna 21 resultando 062505 0125 Porque 0125 22 Figura 521 Notação de vírgula fixa de 675 com quatro bits inteiros e quatro bits de fraccionários Figura 522 Representação de vírgula fixa de 2375 a valor absoluto b sinal e magnitude c complemento 2 Capítulo cinco Blocos de Construção Digital 362 há um 0 na coluna 22 Porque 0125 23 existir um 1 na coluna 23 deixando 01250125 0 Assim deve existir um 0 na coluna 24 Colocando tudo isto junto 062510 00010102 Usamos a representação de complemento2 para números com sinal para que a adição funcione corretamente A Figura 523 mostra a conversão de 0625 para a notação de vírgula fixa de complemento2 A Figura 524 mostra a adição binária de vírgula fixa e o equivalente decimal para comparação Notese que o primeiro 1 na adição de vírgula fixa da Figura 524 a é ignorado a partir do resultado de 8bits Figura 523 Conversão de vírgula fixa em complemento2 Figura 524 Adição a vírgula fixa binária b equivalente decimal 532 Sistemas Numéricos de Virgula Flutuante Os números de vírgula flutuante são análogos à notação científica Eles contornam a limitação de ter um número constante de bits inteiros e fraccionários permitindo a representação de números muito grandes ou muito pequenos Tal como a notação científica os números de vírgula flutuante têm um sinal uma mantissa M uma base B e um expoente E como se mostra na Figura 525 Por exemplo o número 41 103 é a notação científica do decimal 4100 Ele tem uma mantissa de 41 uma base de 10 e um expoente 3 A vírgula decimal flutua para a posição logo após o dígito mais significativo Os números de vírgula flutuante têm base 2 com uma Os sistemas de números de vírgula fixa são comumente usados em aplicações bancárias e financeiras que necessitem de precisão mas não um grande intervalo de representação Capítulo cinco Blocos de Construção Digital 363 mantissa binária Os 32 bits são usados para representar um bit de sinal 8 bits de expoente e 23 bits mantissa Exemplo 55 NÚMEROS DE VÍRGULA FLUTUANTE DE 32BITS Apresente a representação de vírgula flutuante do número 228 Solução Primeiro convertemos o número decimal para binário 22810 111001002 1110012 27 A Figura 526 apresenta a codificação de 32 bits que será mais tarde modificado para eficiência O bit de sinal é positivo 0 os 8 bits de expoente tomam o valor 7 e os restantes 23bits estão a mantissa Figura 526 Vírgula flutuante de 32bits versão 1 No sistema binário de vírgula flutuante o primeiro bit da mantissa à esquerda da vírgula binária é sempre igual a 1 e portanto não precisa ser armazenado É chamado de implicit leading one A Figura 527 mostra a representação de vírgula flutuante modificada de 22810 111001002 20 1110012 27 O implicit leading one não está incluído na mantissa de 23bits por motivos de eficiência Apenas os bits fraccionários são armazenados Isso liberta um bit extra para os dados úteis Figura 527 Vírgula flutuante de 32bits versão 2 Figura 528 Notação vírgula flutuante IEEE 754 𝑴 𝑩𝑬 Figura 525 Número de vírgula flutuante Capítulo cinco Blocos de Construção Digital 364 Fazemos uma modificação final no campo do expoente O expoente deve representar valores positivos e negativos Para fazêlo a vírgula flutuante utiliza um expoente biased que é o expoente original mais um valor constante A vírgula flutuante de 32bits utiliza um valor constante de 127 Por exemplo para o expoente 7 o expoente biased é 7 127 134 100001102 Para o expoente 4 o expoente biased 4 127 123 011110112 A Figura 528 mostra 1110012 27 representado na notação de vírgula flutuante com implicit leading one e expoente biased de 134 7 127 Esta notação obedece ao standard de vírgula flutuante IEEE 754 Casos Especiais 0 NaN O standard de vírgula flutuante IEEE tem casos especiais para representar números como zero o infinito e os resultados ilegais Por exemplo a representação do número zero é problemática em notação de vírgula flutuante devido ao implicit leading one Códigos especiais com expoentes todos a 0 ou todos a 1 são reservados para estes casos especiais A Tabela 52 mostra as representações de vírgula flutuante de 0 e NaN Tal como acontece com números de sinal magnitude a vírgula flutuante tem representação positiva e negativa para o valor 0 O NaN é utilizado para números que não existem como 1 ou log25 Tabela 52 Notação IEEE 754 de vírgula flutuante para 0 e NaN Formatos de Precisão Simples e Dupla Até agora examinamos números de vírgula flutuante de 32bits Este formato também é chamado de precisão simples single precision single ou float O Standard IEEE 754 também define Como pode ser aparente há muitas maneiras razoáveis para representar números de vírgula flutuante Por muitos anos os fabricantes de computadores usaram formatos incompatíveis de vírgula flutuante Os resultados de um computador não podiam ser diretamente interpretado por um outro computador O Institut of Electrical and Electronics Engineers resolveu este problema criando o padrão de vírgula flutuante IEEE 754 em 1985 que define os números de vírgula flutuante Este formato de vírgula flutuante é agora utilizado quase universalmente e é discutido nesta seção Capítulo cinco Blocos de Construção Digital 365 os números de dupla precisão de 64bits também chamados de doubles que proporcionam maior precisão e maior alcance A Tabela 53 mostra o número de bits utilizados para os campos em cada um dos formatos Excluindo os casos especiais mencionados anteriormente os números normais de precisão simples abrangem uma gama de 1175494 1038 a 3402824 1038 Eles têm uma precisão de cerca de sete dígitos significativos decimais porque 224 107 Da mesma forma os números normais de precisão dupla abrangem uma gama de 222507385850720 10308 a 179769313486232 10308 e têm uma precisão de cerca de 15 dígitos significativos decimais Tabela 53 Formatos de precisão simples e dupla Arredondamento Os resultados aritméticos que caem fora da precisão disponível são arredondados para um número vizinho Os modos de arredondamento são arredondar para baixo arredondar para cima arredondar em direção a zero e arredondar para o mais próximo O modo de arredondamento normal é arredondar para o mais próximo No modo de arredondamento para o próximo se dois números estão igualmente perto o que tiver um 0 na posição menos significativa da parte fraccionária é o escolhido Recordese que um número transborda overflows quando a sua magnitude é demasiado grande para ser representada Da mesma forma pode ocorrer um underflow quando o número é demasiado pequeno para ser representado No modo de arredondamento para o mais próximo os overflows são arredondados até e os underflows são arredondados para baixo a 0 A aritmética de vírgula flutuante é geralmente realizada em hardware para tornala mais rápida Este hardware chamado de unidade de vírgula flutuante FPU floatingpoint unit é tipicamente distinto da unidade de processamento central CPU O infame bug de divisão de vírgula flutuante FDIV no Pentium FPU custou à Intel 475 milhões para chamar e substituir os chips defeituosos O erro ocorreu simplesmente porque uma tabela de pesquisa não foi carregado corretamente Capítulo cinco Blocos de Construção Digital 366 Adição de Vírgula Flutuante A adição de números de vírgula flutuante não é tão simples como a adição de dois números de complemento2 As etapas para adicionar os números de vírgula flutuante com o mesmo sinal são as seguintes 1 Extrair os bits de expoente e fraccionários 2 Acrescente o 1 para formar a mantissa 3 Comparar os expoentes 4 Desloque a mantissa menor se for necessário 5 Some as mantissas 6 Normalize a mantissa e ajuste o expoente se necessário 7 Arredonde o resultado 8 Construa o expoente e o fraccionário novamente num número de vírgula flutuante A Figura 529 mostra a adição de vírgula flutuante de 7875 111111 22 com 01875 11 2 3 O resultado é 80625 10000001 23 Após a extração dos bits de expoente e fraccionários o implicit leading one é incluído nos passos 1 e 2 os expoentes são comparados subtraindo o expoente menor do expoente maior O resultado é o número de bits pelo qual no passo 4 o menor número é deslocado para a direita para alinhar a vírgula binária implícita isto é para tornar os expoentes iguais Os números alinhados são adicionados Uma vez que a soma tem uma mantissa que é maior do que ou igual a 20 o resultado é normalizado deslocandoo para a direita 1bit e incrementando o expoente Neste exemplo o resultado é exato assim não é necessário fazer o arredondamento O resultado é armazenado na notação de vírgula flutuante removendo o implicit leading one da mantissa e acrescentando o bit de sinal A vírgula flutuante não pode representar alguns números com exatidão como por exemplo o 17 No entanto quando o leitor digita 17 na calculadora vai ver exatamente 17 não 169999 Para lidar com isso alguns aplicativos como calculadoras e softwares financeiros usam o formato BCD binary coded decimal ou formatos com um expoente de base 10 Os números BCD codificam cada dígito decimal usando quatro bits com um intervalo de 0 a 9 Por exemplo a notação BCD em vírgula fixa de 17 com quatro bits inteiros e quatro bits fraccionários seria 00010111 Claro nada é gratuito O custo seria o de uma maior complexidade no hardware da aritmética e desperdícios na codificação codificações AF não seriam utilizadas e portanto uma diminuição no desempenho Assim para aplicações de computação intensiva a vírgula flutuante é muito mais rápida Capítulo cinco Blocos de Construção Digital 367 Figura 529 Adição em vírgula flutuante Capítulo cinco Blocos de Construção Digital 368 54 BLOCOS DE CONSTRUÇÃO SEQUENCIAIS Esta Seção examina blocos sequenciais incluindo contadores e registros de deslocamento 541 Contadores Um contador binário de Nbits mostrado na Figura 530 é um circuito aritmético sequencial com entradas de relógio e de reset e uma saída Q de Nbits O reset repõe a saída a 0 O contador avança então ao longo de todas as 2N saídas possíveis numa ordem binária incremento no flanco ascendente do relógio A Figura 531 mostra um contador de Nbits composto por um somador e um registro resettable Em cada ciclo o contador adiciona 1 ao valor armazenado no registrador O Exemplo HDL 55 descreve um contador binário com reset assíncrono Outros tipos de contadores tais como contadores para cimabaixo são explorados do Exercício 543 até ao Exercício 546 542 Registradores de Deslocamento Um registrador de deslocamento tem um relógio uma entrada serie Sin uma saída série Sout e N saídas paralelas QN10 como mostrado na Figura 533 A cada borda ascendente do relógio um novo bit é deslocado da entrada Sin e todo o conteúdo anterior é deslocado para a frente O último bit no registrador de deslocamento está disponível em Sout Os registros de deslocamento podem ser vistos como conversores série para paralelo A entrada é fornecida em série um bit de cada vez no Sin Depois de N ciclos as últimas N entradas estão disponíveis em paralelo em Q Um registrador de deslocamento pode ser construído a partir de N flipflops ligados em série como mostrado na Figura 534 Alguns registradores de deslocamento também têm um sinal de reset para inicializar todos os flipflops Não confunda registros de deslocamento com os shifters da Seção 525 registradores de deslocamento são blocos lógicos sequenciais que deslocam um novo bit de entrada em cada flanco do relógio Shifters são blocos lógicos combinacionais sem sinal de relógio que deslocam uma entrada uma quantidade de vezes especificada Figura 530 Símbolo do contador Figura 531 Contador de Nbits Figura 532 Símbolo de um registro de deslocamento Capítulo cinco Blocos de Construção Digital 369 Exemplo HDL 55 CONTADOR SystemVerilog module counter parameter N 8 input logic clk input logic reset output logic N10 q alwaysff posedge clk posedge reset if reset q 0 else q q 1 endmodule VHDL library IEEE use IEEESTDLOGIC1164ALL use IEEENUMERICSTDUNSIGNEDALL entity counter is genericN integer 8 portclk reset in STDLOGIC q out STDLOGICVECTORN1 downto 0 end architecture synth of counter is begin processclk reset begin if reset then q OTHERS 0 elsif risingedgeclk then q q 1 end if end process end Figura 533 Contador sintetizado Capítulo cinco Blocos de Construção Digital 370 Um circuito relacionado é o conversor de paraleloparasérie que carrega N bits em paralelo e em seguida deslocaos para fora um de cada vez Um registrador de deslocamento pode ser modificado para realizar as duas operações de sérieparaparalelo e de paraleloparasérie adicionando uma entrada paralela DN10 e um sinal de controlo de carga conforme mostrado na Figura 535 Quando a carga é acivada os flipflops são carregados em paralelo a partir das entradas D Caso contrário o registrador de deslocamento opera normalmente O Exemplo HDL 56 descreve um tal registrador de deslocamento Scan Chains Os registradores de deslocamento são muitas vezes utilizados para testar circuitos sequenciais usando uma técnica chamada scan chains O teste de circuitos combinatórios é relativamente simples As entradas conhecidas chamadas de vectores de teste são aplicadas e as saídas são verificadas em relação ao resultado esperado O teste de circuitos sequenciais é mais difícil porque os circuitos têm estados A partir de um estado inicial conhecido pode ser necessário um grande número de ciclos de vectores de teste para colocar o circuito num estado desejado Por exemplo para testar se o bit mais significativo de um contador de 32bits avança de 0 para 1 requer a reposição do contador em seguida a aplicação de 231 cerca de dois bilhões impulsos de relógio Figura 534 Esquema de um registrador de deslocamento Figura 535 Registrador de deslocamento com carregamento paralelo Capítulo cinco Blocos de Construção Digital 371 Exemplo HDL 56 REGISTRADOR DE DESLOCAMENTO COM CARREGAMENTO PARALELO SystemVerilog module shiftreg parameter N 8 input logic clk input logic reset load input logic sin input logic N10 d output logic N10 q output logic sout alwaysff posedge clk posedge reset if reset q 0 else if load q d else q qN20 sin assign sout qN1 endmodule VHDL library IEEE use IEEESTDLOGIC1164ALL entity shiftreg is genericN integer 8 portclk reset in STDLOGIC load sin in STDLOGIC d in STDLOGICVECTORN1 downto 0 q out STDLOGICVECTORN1 downto 0 sout out STDLOGIC end architecture synth of shiftreg is begin processclk reset begin if reset 1 then q OTHERS 0 elsif risingedgeclk then if load then q d else q qN2 downto 0 sin end if end if end process sout qN1 end Capítulo cinco Blocos de Construção Digital 372 Figura 536 Registrador de deslocamento sintetizado Para resolver este problema os projetistas gostariam de ser capazes de observar e controlar todos os estados da máquina diretamente Isto é feito pela adição de um modo de teste em que o conteúdo de todos os flipflops pode ser lido ou carregado com os valores desejados A maioria dos sistemas tem muitos flipflops para que se possa dedicar pinos individuais para ler e escrever cada flipflop Em vez disso todos os flipflops no sistema estão ligados entre si em um registrador de deslocamento chamado de scan chain Em operação normal os flipflops carregam dados da sua entrada D e ignoram a scan chain No modo de teste os flipflops deslocam em série o seu conteúdo para fora e deslocam novos conteúdos usando Sin and Shout O multiplexador de carregamento é normalmente integrado no flipflop para produzir um scannable flipflop A Figura 537 mostra o esquema e o símbolo de um scannable flipflop e ilustra como os flops em cascata permitem construir um registro scannable de Nbit Figura 537 Scannable flipflop a esquemático b símbolo e c scannable register de Nbits Capítulo cinco Blocos de Construção Digital 373 Por exemplo o contador de 32bits pode ser testado dando entrada do padrão 011111111 em modo de teste conta um ciclo de contagem em modo normal em seguida devolve o resultado que deve ser 100000000 Isto requer apenas 32 1 32 65 ciclos 55 MATRIZES DE MEMÓRIA As seções anteriores introduziram a aritmética e os circuitos sequenciais para manipulação de dados Os sistemas digitais também necessitam de memórias para armazenar os dados utilizados e gerados por esses circuitos Os registros construídos a partir de flipflops são uma espécie de memória que armazena pequenas quantidades de dados Esta Seção descreve matrizes de memória que pode eficientemente armazenar grandes quantidades de dados A Seção começa com uma visão geral descrevendo as características compartilhadas por todas as matrizes de memória Em seguida introduz três tipos de matrizes de memória memórias dinâmicas de acesso aleatório DRAM memórias estáticas de acesso aleatório SRAM e memória só de leitura ROM Cada memória difere na forma como armazena os dados A Seção discute brevemente os compromissos de área e atraso e mostra como as matrizes de memória são usadas não só para armazenar dados mas também para realizar funções lógicas A Seção termina com o HDL de uma matriz de memória 551 Generalidades A Figura 538 apresenta um símbolo genérico para uma matriz de memória A memória está organizada como uma matriz bidimensional de células de memória A memória lê ou escreve o conteúdo de uma das linhas da matriz Esta linha é especificada por um endereço O valor lido ou escrito é chamado de dado Uma matriz com endereços de Nbits e dados de Mbits tem 2N linhas e M colunas Cada linha de dados é chamado de word Assim a matriz contém 2N words de Mbits A Figura 539 apresenta uma matriz de memória com dois bits de endereço e três bits de dados Os dois bits de endereço especificam uma das quatro linhas de dados word na matriz Cada word de dados possui três bits de largura A Figura 539 b mostra alguns dos possíveis conteúdos da matriz de memória Figura 538 Símbolo genérico de memória matricial Figura 539 Matriz de memória 4 x 3 a símbolo b função Capítulo cinco Blocos de Construção Digital 374 A profundidade depth de uma matriz é o número de linhas e a largura width é o número de colunas também chamado o tamanho da word O tamanho de uma matriz é dado como a profundidade x largura A Figura 539 é uma matriz de 4words x 3bit ou simplesmente uma matriz 4 3 O símbolo para uma matriz de 1024palavra 32bits é mostrado na Figura 540 O tamanho total deste conjunto é de 32 kilobits KB Células de Bit As matrizes de memória são construídas como uma matriz de células de bits cada uma das quais armazena 1bit de dados A Figura 541 mostra que cada célula de bit está ligada a uma wordline e a uma bitline Para cada combinação de bits de endereço a memória acede a uma única wordline que ativa as células de bit nessa linha Quando a wordline está a HIGH os bits armazenados são transferidos de ou para a bitline Caso contrário a bitline está desligada da célula de bit O circuito para armazenar os bits varia com o tipo de memória Para ler uma célula de bit a bitline é inicialmente deixada flutuante Z Em seguida a wordline é colocada a ON permitindo que o valor armazenado conduza a bitline a 0 ou 1 Para escrever uma célula de bit a bitline é colocada no valor desejado Em seguida a wordline é colocada a ON ligando a bitline ao bit armazenado O valor da bitline sobrepõese ao conteúdo da célula de bit escrevendo o valor desejado no bit Organização A Figura 542 mostra a organização interna de uma matriz de memória de 4 3 Naturalmente as memórias práticas são muito maiores mas o comportamento de matrizes maiores pode ser extrapolo a partir da matriz menor Neste exemplo a matriz armazena os dados a partir da Figura 539 b Figura 540 Matriz de 32kB depth 210 1024 words width 32 bits Figura 541 Célula de bit Capítulo cinco Blocos de Construção Digital 375 Figura 542 Matriz de memória 4 x 3 Durante uma leitura de memória uma wordline é acedida e a linha correspondente das células de bit coloca as bitlines a HIGH ou LOW Durante uma escrita na memória as bitlines são primeiro colocadas a HIGH ou LOW e depois uma wordline é acedida permitindo que os valores da bitline sejam armazenados na mesma linha de células de bit Por exemplo para ler o endereço 10 as bitlines são deixadas a flutuar o decodificador acede a wordline2 e o dado armazenado nessa linha de células de bit 100 é lido para a Data bitlines Para escrever o valor 001 no endereço 11 as bitlines são colocadas no valor 001 em seguida a wordline3 é acedida e o novo valor 001 é armazenado nas células de bit Portos de Memória Todas as memórias têm um ou mais portos Cada porto permite um acesso de leitura eou escrita a um endereço de memória Os exemplos anteriores consistiam em memórias de um porto único As memórias multiporto podem aceder a vários endereços simultaneamente A Figura 543 mostra uma memória de três portos com dois portos de leitura e um porto de escrita A porta 1 lê os dados do Figura 543 Memória de 3 portos Capítulo cinco Blocos de Construção Digital 376 endereço A1 para a saída de dados de leitura RD1 A porta 2 lê os dados do endereço A2 para RD2 A porta 3 escreve os dados a partir da entrada de dados WD3 no endereço A3 no flanco ascendente do relógio se o write enable WE3 for ativado Tipos de Memórias As matrizes de memória são especificadas pelo seu tamanho depth x width e número e tipo de portos Todas as matrizes de memória armazenam os dados como matrizes de células de bit mas elas diferem na forma como armazenam os bits As memórias são classificadas com base na forma como armazenam os bits na célula de bit A classificação mais ampla é a memória de acesso aleatório RAM random access memory versus memória apenas de leitura ROM read only memory A RAM é volátil o que significa que ela perde os seus dados quando a energia é desligada A ROM é não volátil o que significa que ela mantém os seus dados indefinidamente mesmo sem uma fonte de energia A RAM e a ROM receberam os seus nomes por razões históricas que não são já muito relevantes A RAM é chamada de memória de acesso aleatório porque todas as word de dados são acedidas com o mesmo atraso Em contraste uma memória de acesso sequencial tal como um gravador de fita acede a dados nas proximidades mais rapidamente do que a dados distantes por exemplo na outra extremidade da fita A ROM é chamada de memória apenas de leitura porque historicamente só podia ser lida mas não escrita Estes nomes são confusos porque as ROM são também acedidas aleatoriamente Pior ainda a maioria das ROM modernas podem ser não só lidas mas também escritas A distinção importante a lembrar é que as RAM são voláteis e as ROM são não voláteis Os dois principais tipos de RAM são a RAM dinâmica DRAM e RAM estática SRAM As RAM dinâmicas armazenam dados como carga num capacitor enquanto as RAM estáticas usam um par de inversores crosscoupled Há muitas variedades de ROM que mudam na forma como são escritas e apagadas Estes vários tipos de memórias são discutidos nas seções seguintes 552 Memória Dinâmica de Acesso Aleatório DRAM A RAM dinâmica DRAM pronunciase dêram armazena um bit como a presença ou ausência de carga num capacitor A Figura 544 apresenta uma célula de bit DRAM O valor do bit é armazenado Robert Dennard 1932 Inventou a DRAM em 1966 na IBM Embora muitos estavam cépticos de que a ideia iria funcionar em meados da década de 1970 as DRAM estavam praticamente em todos os computadores Ele alega ter feito pouco trabalho criativo até que chegado à IBM lhe entregaram um caderno de patentes e lhe disseram coloque todas as suas ideias aqui dentro Desde 1965 ele recebeu 35 patentes em semicondutores e microelectrónica Foto cedida pela IBM Figura 544 Célula de bit DRAM Capítulo cinco Blocos de Construção Digital 377 no capacitor O transistor nMOS comportase como um interruptor que liga ou desliga o capacitor da bitline Quando a worldline é acedida o transistor nMOS ligase e o valor do bit armazenado é transferido de ou para a bitline Como mostrado na Figura 545 a quando o capacitor é carregado a VDD o bit armazenado é 1 quando é descarregado a GND Figura 545 b o bit armazenado é 0 O nó do capacitor é dinâmico porque não é ativamente mantido HIGH ou LOW por um transistor amarrado a VDD ou a GND Figura 545 Armazenamento de valores em DRAM Após uma leitura os valores dos dados são transferidos a partir do capacitor para a bitline Após uma gravação os valores dos dados são transferidos a partir da bitline para o capacitor A leitura destrói o valor do bit armazenado no capacitor de modo que a word de dados deve ser restaurada reescrita depois de cada leitura Mesmo quando a DRAM não é lida o conteúdo deve ser refrescado leitura e reescrita a cada poucos milissegundos porque a carga do capacitor gradualmente sofre uma fuga 553 Memória Estática de Acesso Aleatório SRAM A RAM estática SRAM pronunciase esram é estático porque os bits armazenados não precisam ser atualizados A Figura 546 apresenta uma célula de bits SRAM O bit de dados é armazenado em inversores crosscoupled como os descritos na Seção 32 Cada célula tem duas saídas bitline e 𝑏𝑖𝑡𝑙𝑖𝑛𝑒 Quando a linha de wordline é acedida ambos os transistores nMOS entram em condução e os valores dos dados são transferidos para ou a partir dos bitlines Ao contrário das DRAM se o ruído degradar o valor do bit armazenado os inversores crosscoupled restauram o valor Figura 546 Célula de bit SRAM Capítulo cinco Blocos de Construção Digital 378 554 Área e Atraso Os flipflops as SRAM e as DRAM são todas memórias voláteis mas cada um tem diferentes características de área e atraso A Tabela 54 mostra uma comparação destes três tipos de memória volátil O bit de dados armazenado num flipflop está disponível imediatamente na sua saída Mas os flipflops requerem pelo menos 20 transistores na sua construção Geralmente quanto mais transistores um dispositivo tem mais espaço consumo e custo ele requer A latência de uma DRAM é maior do que a de uma SRAM porque a bitline não é acionada de forma ativa por um transístor A DRAM deve aguardar que a carga se mova lentamente relativamente do condensador para a bitline As DRAM também têm um rendimento fundamentalmente inferior às SRAM porque ela deve atualizar os dados periodicamente e depois de uma leitura As tecnologias DRAM tais como a synchronous DRAM SDRAM e double data rate SDRAM DDR têm sido desenvolvidas para ultrapassar este problema A SDRAM usa um relógio para fazer pipeline de acessos As DDR SDRAM às vezes chamadas simplesmente de DDR usam tanto a subida como a descida do relógio para aceder os dados duplicando assim a taxa de transferência para uma dada velocidade de relógio A DDR foi padronizada pela primeira vez em 2000 e funcionava de 100 a 200 MHz As normas posteriores DDR2 DDR3 e DDR4 aumentaram as velocidades de relógio com velocidades em 2012 acima de 1 GHz A latência da uma memória e a sua taxa de transferência também dependem do tamanho da memória memórias maiores tendem a ser mais lentas do que as menores se todo o resto é o mesmo O melhor tipo de memória para um projeto em particular depende das restrições de velocidade custo e potência Tabela 54 Comparação de memórias Capítulo cinco Blocos de Construção Digital 379 555 Banco de Registradores Os sistemas digitais costumam usar um número de registradores para armazenar variáveis temporárias Este grupo de registradores chamado de banco de registro normalmente é construído como uma matriz SRAM pequena multiporto porque é mais compacta do que um conjunto de flip flops A Figura 547 mostra um banco de registradores de 32 registros 32 bits com três portos construído a partir de uma memória com três portos semelhante ao da Figura 543 O banco de registradores tem dois portos de leitura A1RD1 e A2RD2 e uma porta de escrita A3WD3 Os endereços de 5bits A1 A2 e A3 podem aceder a todos aos 25 32 registros Então dois registradores podem ser lidos e um registro escrito simultaneamente 556 Read Only Memory As read only memory ROM armazenam um bit quanto na presença ou ausência de um transístor A Figura 548 mostra uma simples célula de bit ROM Para ler a célula a bitline é fracamente puxada a HIGH Em seguida a wordline é colocada a ON Se o transístor está presente ele puxa a bitline a LOW Se estiver ausente a bitline permanece HIGH Notese que a célula de bit ROM é um circuito combinatório e não tem estado a esquecer se a energia for retirada O conteúdo de uma ROM pode ser indicado usando a notação de ponto A Figura 549 mostra a notação de ponto para uma ROM de 4words 3bits contendo os dados da Figura 539 Um ponto na interseção de uma linha wordline e uma coluna bitline indica que o bit de dados está a 1 Por exemplo a wordline superior tem um único ponto em Dados1 de modo que a word de dados armazenada no endereço 11 é 010 Conceitualmente as ROM podem ser construídas usando lógica de dois níveis com um grupo de portas AND seguido por um grupo de portas OR As portas AND produzem todos os mintermos possíveis e portanto formam um decodificador A Figura 550 mostra a ROM da Figura 549 construída usando um decodificador e portas OR Cada linha pontilhada na Figura 549 é uma entrada para uma porta OR na Figura 550 Para os bits de dados com um único ponto neste caso DATA0 não é necessária uma porta OR Esta representação de uma ROM é interessante porque mostra como a Figura 547 Banco de registros 32 x 32 com dois portos de leitura e um porto de escrita Figura 548 Células de bit ROM contendo 0 e 1 Capítulo cinco Blocos de Construção Digital 380 ROM pode executar qualquer função lógica de dois níveis Na prática as ROM são construídas a partir de transístores em vez de portas lógicas para reduzir o seu tamanho e custo A Seção 563 explora mais a implementação a nível do transístor Figura 549 ROM 4 3 notação de ponto O conteúdo da célula de bit ROM na Figura 548 é especificado durante a fabricação pela presença ou ausência de um transistor em cada célula de bits A ROM programável PROM coloca um transistor em cada célula de bit mas fornece uma maneira de ligar ou desligar o transistor à terra Figura 550 ROM 4 3 implementação utilizando portas Fujio Masuoka 1944 Recebeu um PhD em engenharia elétrica pela Universidade de Tohoku no Japão Desenvolveu memórias e circuitos de alta velocidade para a Toshiba de 1971 a 1994 Inventou a memória flash como um projeto não autorizado realizado ao longo das noites e finsdesemana no final de 1970 A flash recebeu este nome porque o processo de apagar a memória lembra o flash de uma câmara A Toshiba foi lenta na comercialização desta ideia a Intel foi a primeira a comercializar em 1988 O mercado das flashs tem crescido em 25 bilhões US por ano O Dr Masuoka juntouse mais tarde à Universidade de Tohoku e está trabalhando para desenvolver um transístor tridimensional Capítulo cinco Blocos de Construção Digital 381 Figura 551 Célula de bit ROM programável por fusível A Figura 551 apresenta a célula de bit para uma ROM programável por fusível O utilizador programa a ROM através da aplicação de uma tensão elevada para queimar seletivamente os fusíveis Se o fusível está presente o transístor está ligado a GND e a célula contém um 0 Se o fusível é destruído o transístor é desligado da terra e a célula contém um 1 Isto é também chamado de ROM programável uma só vez porque o fusível não pode ser reparado uma vez que é queimado As ROM reprogramáveis fornecem um mecanismo reversível para ligar ou desligar o transístor a GND As erasable PROM EPROM substituem o transístor nMOS por um floatinggate transistor A porta flutuante não está fisicamente ligada a qualquer outro condutor Quando tensões elevadas adequadas são aplicadas os elétrons passam através de um isolador para a porta flutuante fechando o transístor e ligando a bitline à wordline saída do decodificador Quando a EPROM é exposta à radiação ultravioleta UV intensa por cerca de meia hora os elétrons são removidos da porta flutuante tornando o transístor aberto Essas ações são chamadas de programação e apagar respectivamente As PROM apagáveis eletricamente EEPROM e as memória flash usam princípios semelhantes mas contêm circuitos no chip para apagar bem como a programação assim nenhuma luz UV é necessária As células de bit EEPROM são individualmente apagáveis a memória flash apaga blocos maiores de bits e é mais barata porque são necessários menos circuitos de apagamento Em Os dispositivos Universal Serial Bus USB substituíram as disquetes e os CD para compartilhamento de arquivos porque os custos de Flash caíram de forma dramática Capítulo cinco Blocos de Construção Digital 382 2012 a memória flash custava cerca de 1 US por GB e o preço continua a cair em 30 a 40 ao ano A memória flash tornouse uma maneira extremamente popular para armazenar grandes quantidades de dados em sistemas portáteis alimentados por baterias como câmeras e leitores de música Em resumo as ROM modernas não são realmente apenas de leitura elas podem ser programadas escritas A diferença entre a RAM e ROM é que a ROM demora mais tempo para ser escrita mas são nãovoláteis 557 Lógica Usando Matrizes de Memória Embora elas sejam usadas principalmente no armazenamento de dados as matrizes de memória também podem executar funções de lógica combinatória Por exemplo a saída da ROM Data2 na Figura 549 é o XOR das duas entradas de endereços Da mesma forma DATA0 é a NAND das duas entradas A memória 2Nword Mbits pode executar qualquer função combinatória de N entradas e M saídas Por exemplo a ROM na Figura 549 executa três funções de duas entradas Figura 552 Matriz de memória 4word 1bit usada como lookup table As ROM programáveis podem ser programadas com um programador de dispositivo como o mostrado abaixo O dispositivo programador está ligado a um computador que determina o tipo de ROM e quais os dados a programar O dispositivo programador destrói os fusíveis ou injeta carga numa porta flutuante na ROM Assim o processo de programação é às vezes chamado queimar burning uma ROM Capítulo cinco Blocos de Construção Digital 383 As matrizes de memória usadas para executar lógica são chamadas de lookup tables LUT A Figura 552 apresenta uma matriz de memória de 4word 1 bit usada como uma lookup table para executar a função Y AB Usando a memória para executar a lógica o utilizador pode procurar o valor de saída para uma dada combinação de entrada endereço Cada endereço corresponde a uma linha na tabela verdade e cada bit de dados corresponde a um valor de saída 558 Memória HDL O Exemplo HDL 57 descreve uma RAM 2Nword Mbit A RAM tem um enable de escrita síncrono Por outras palavras a escrita ocorre no flanco ascendente do relógio se a permissão de escrita é acedida A leitura ocorre de imediato Quando a energia é aplicada pela primeira vez o conteúdo da RAM é imprevisível O Exemplo HDL 58 descreve uma ROM 4word 3bit O conteúdo da ROM é especificado na instrução case do HDL Uma ROM tão pequena como esta pode ser sintetizada com portas lógicas em vez de uma matriz Notese que o decodificador de sete segmentos do Exemplo HDL 424 sintetiza numa ROM na Figura 420 Exemplo HDL 57 RAM SystemVerilog module ram parameter N 6 M 32 input logic clk input logic we input logic N10 adr input logic M10 din output logic M10 dout logic M10 mem 2N10 alwaysff posedge clk if we mem adr din VHDL library IEEE use IEEESTDLOGIC1164ALL use IEEENUMERICSTDUNSIGNEDALL entity ramarray is genericN integer 6 M integer 32 portclk we in STDLOGIC adr in STDLOGICVECTORN1 downto 0 din in STDLOGICVECTORM1 downto 0 dout out STDLOGICVECTORM1 downto 0 end Capítulo cinco Blocos de Construção Digital 384 assign dout memadr endmodule architecture synth of ramarray is type memarray is array 2N1 downto 0 of STDLOGICVECTOR M1 downto 0 signal mem memarray begin processclk begin if risingedgeclk then if we then memTOINTEGERadr din end if end if end process dout memTOINTEGERadr end Figura 553 RAM sintetizada Capítulo cinco Blocos de Construção Digital 385 Exemplo HDL 58 ROM SystemVerilog module rominput logic 10 adr output logic 20 dout alwayscomb caseadr 2b00 dout 3b011 2b01 dout 3b110 2b10 dout 3b100 2b11 dout 3b010 endcase endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity rom is portadr in STDLOGICVECTOR1 downto 0 dout out STDLOGICVECTOR2 downto 0 end architecture synth of rom is begin processall begin case adr is when 00 dout 011 when 01 dout 110 when 10 dout 100 when 11 dout 010 end case end process end Capítulo cinco Blocos de Construção Digital 386 56 MATRIZES LÓGICAS Tal como as memórias as portas lógicas podem ser organizadas em matrizes regulares Se as ligações são realizadas de modo a poderem ser programadas estas matrizes lógicas podem ser configuradas para executar qualquer função sem que o utilizador tenha que efetuar ligações específicas A estrutura regular simplifica o projeto As matrizes lógicas são produzidas em massa em grandes quantidades pelo que são baratas As ferramentas de software permitem que os utilizadores realizem o mapeamento de projetos lógicos nessas matrizes A maioria das matrizes lógicas também é reconfigurável permitindo que o projeto possa ser modificado sem necessidade de substituir o hardware A configurabilidade é valiosa durante o processo de desenvolvimento e também é útil em campo porque um sistema pode ser atualizado basta simplesmente carregar uma nova configuração Esta Seção apresenta dois tipos de matrizes lógicas programmable logic arrays PLA e field programmable gate arrays FPGA As PLA a tecnologia mais antiga executam apenas funções lógicas combinatórias As FPGA podem executar tanto lógica combinatória e como sequencial 561 Programmable Logic Arrays As programmable logic arrays PLA implementam dois níveis lógicos de combinações na forma de soma de produtos SOP As PLA são construídas a partir de uma matriz AND seguida por uma matriz OR como se mostra na Figura 554 As entradas na forma verdadeira e complementar dão entrada na matriz AND que produz implicantes que por sua vez passam pelas portas OR em conjunto para formar as saídas Uma PLA M N Pbits tem M entradas N implicantes e P saídas Figura 554 PLA M N Pbit Capítulo cinco Blocos de Construção Digital 387 A Figura 555 mostra a notação de ponto para uma PLA 3 3 2bits que desempenha as funções 𝑋 𝐴𝐵𝐶 𝐴𝐵𝐶 e 𝑌 𝐴𝐵 Cada linha na matriz forma um implicante Os pontos em cada linha da matriz indicam que literais compreendem o implicante A matriz AND na Figura 555 forma três implicantes 𝐴𝐵𝐶 𝐴𝐵𝐶 e 𝐴𝐵 Os pontos na matriz OR indicam que implicantes fazem parte da função de saída A Figura 556 mostra como as PLA podem ser construídas usando dois níveis lógicos Uma implementação alternativa é dada na Seção 563 As ROM podem ser vistas como um caso especial de PLA Uma ROM de 2Mwords Nbits é simplesmente uma PLA M 2M Nbit O decodificador comportase como um plano AND que produz todos os 2M mintermos A matriz ROM comportase como um plano OR que produz as saídas Se a função não depende de todos os 2M mintermos é provável que uma PLA seja menor do que uma ROM Por exemplo uma ROM de 2word 8bits é necessária para executar as mesmas funções realizadas pela PLA 3 3 2bits mostrada nas Figura 555 e Figura 556 Figura 555 PLA 3 3 2bit notação de ponto Capítulo cinco Blocos de Construção Digital 388 As Simple programmable logic devices PLD são PLA melhoradas a que foram acrescentados registros e vários outros recursos aos planos de base AND e OR No entanto as PLD e as PLA têm sido largamente deslocadas pelas FPGAs que são mais flexíveis e eficientes na construção de sistemas de grande porte Figura 556 PLA 3 3 2bits utilizando lógica de dois níveis 562 Field Programmable Gate Array Uma field programmable gate array FPGA é uma matriz de portas reconfiguráveis Usando ferramentas de programação de software o utilizador pode implementar projetos na FPGA usando uma HDL ou um esquema As FPGA são mais poderosas e mais flexível do que as PLA por várias razões Elas podem implementar tanto lógica combinatória como lógica sequencial Elas também podem implementar funções lógicas multinível enquanto as PLA só podem implementar lógica de dois níveis As FPGA modernas integram outros recursos úteis como multiplicadores internos IO de alta velocidade conversores de dados incluindo conversores analógicodigitais matrizes grandes de RAM e processadores Capítulo cinco Blocos de Construção Digital 389 Figura 557 Layout genérico de uma FPGA As FPGA são construídas como uma matriz de elementos lógicos configuráveis LE logic elements também conhecidos como configurable logic blocks CLB Cada LE pode ser configurado para desempenhar funções combinatórias ou sequenciais A Figura 557 apresenta um diagrama de blocos geral de uma FPGA Os LE estão rodeados por elementos de entradasaída IOE input output elements para a interface com o mundo exterior Os IOE ligam as entradas e as saídas dos LE aos pinos de empacotamento de chip OS LE podemse ligarse a outros LE e IOE através de canais de encaminhamento programáveis Dois dos principais fabricantes de FPGA são a Altera Corp e a Xilinx Inc a Figura 558 mostra uma única LE da FPGA da Altera Cyclone IV introduzida em 2009 Os elementoschave do LE são uma lookup table de 4 entradas LUT e um registro de 1bit O LE também contém multiplexadores configuráveis para encaminhar os sinais através do LE A FPGA é configurada especificando o conteúdo das lookup tables e seleção dos sinais para os multiplexadores As FPGA são os cérebros de muitos produtos de consumo incluindo automóveis equipamentos médicos e dispositivos de mídia como MP3 players A série Mercedes Benz ClassS por exemplo tem mais de uma dúzia de Xilinx FPGA ou PLD para usos que vão desde do entretenimento passando pela navegação até aos sistemas de cruise control As FPGA permitem mais facilmente um tempo de mercado rápido e fazer a depuração ou adicionar recursos no final do processo de projeto Capítulo cinco Blocos de Construção Digital 390 O Cyclone IV LE tem uma LUT de 4 entradas e um flipflop Ao carregar os valores apropriados na lookup table a LUT pode ser configurada para executar qualquer função de até quatro variáveis A configuração da FPGA também envolve a escolha dos sinais de seleção que determinam como os multiplexadores roteiam os dados através do LE e quais os LE e IOE vizinhos Por exemplo dependendo da configuração do multiplexador a LUT pode receber uma das suas entradas a partir de dados 3 ou da saída do próprio registro do LE As outras três entradas sempre vêm de dados 1 dados 2 e dados 4 As entradas de dados 14 vêm das IOE ou das saídas de outros LE dependendo de encaminhamento externo para o LE A saída da LUT ou vai diretamente para a saída LE para funções combinatórias ou pode ser alimentada através do flipflop para funções de registros A entrada do flipflop vem da sua própria saída LUT entrada de dados 3 ou da saída do registro LE anterior O hardware adicional inclui suporte para a adição usando o hardware de carry chain outros multiplexadores para roteamento e flipflop enable e reset habilitar e redefinir A Altera agrupa 16 LE para criar um logic array block LAB e fornece ligações locais entre os LE com o LAB Capítulo cinco Blocos de Construção Digital 391 Figura 558 Elemento lógico LE do Cyclone IV Reproduzido com permissão da Altera Cyclone IV Handbook 2010 Altera Corporation Exemplo 56 CONSTRUÇÃO DE FUNÇÕES UTILIZANDO LE Explique como configurar uma ou mais LE da Cyclone IV para executar as seguintes funções a 𝑋 𝐴𝐵𝐶 𝐴𝐵𝐶 e 𝑌 𝐴𝐵 b 𝑌 𝐽𝐾𝐿𝑀𝑃𝑄𝑅 c um contador de divisão por 3 com codificação de estado binário ver Figura 329 a O leitor deve mostrar a interligação entre os LE conforme necessário Solução a configurar dois LE Uma LUT determina X e a outra LUT determina Y como é mostrado na Figura 559 Para o primeiro LE as entradas data 1 data 2 e data 3 são A B e C respectivamente estas ligações estão definidas através dos canais de encaminhamento O data 4 é um dont care mas deve estar vinculado a alguma coisa por isso está vinculado a 0 Para o segundo LE as entradas data 1 e data 2 são A e B as outras entradas da LUT são dont cares e estão vinculadas a 0 Configurase os Capítulo cinco Blocos de Construção Digital 392 multiplexadores finais para selecionar as saídas combinatórias das LUT para produzir X e Y Em geral um único LE pode calcular qualquer função de até quatro variáveis de entrada deste modo b Configure a LUT do primeiro LE para calcular X JKLM e a LUT do segundo LE para calcular Y XPQR Configure os multiplexadores finais para selecionar as saídas combinatórias X e Y de cada LE Esta configuração é mostrada na Figura 560 Os canais de encaminhamento entre os LE indicadas pelas linhas tracejadas a azul ligam a saída do LE 1 à entrada do LE 2 Em geral um grupo de LE pode calcular desta forma funções com N variáveis de entrada c A FSM tem dois bits de estado S1 0 e uma saída Y O próximo estado depende dos dois bits do estado atual Usar dois LE para calcular o próximo estado a partir do estado atual como mostrado na Figura 561 Dois flipflops um de cada LE são usados para manter este estado Os flipflops têm uma entrada de reset que pode ser ligada a um sinal externo de reset Os registros de saída são realimentados para as entradas das LTU usando o multiplexador do data 3 e os canais de encaminhamento entre LE como indicado pelas linhas tracejadas a azul Em geral um outro LE pode ser necessário para calcular a saída Y No entanto neste caso Y S0 por isso Y pode vir do LE 1 Assim toda a FSM fica contida em dois LE Em geral uma FSM requer pelo menos um LE para cada bit de estado e pode exigir LE adicionais para a saída ou lógica do próximo estado se são demasiado complexos para caber numa única LUT Capítulo cinco Blocos de Construção Digital 393 Figura 559 Configuração do LE para duas funções de até quatro entradas cada Figura 560 Configuração do LE para uma função de mais de quatro entradas Capítulo cinco Blocos de Construção Digital 394 Figura 561 Configuração do LE para uma FSM com dois bits de estado Em resumo o LE do Cyclone IV pode executar uma função combinatória eou registrada que pode envolver até quatro variáveis Outros fabricantes de FPGA usam uma organização um pouco diferente mas os mesmos princípios gerais se aplicam Por exemplo a Xilinx FPGAs 7series usa LUT de 6 entradas em vez de LUT de 4 entradas O projetista configura uma FPGA primeiro criando uma descrição esquemática ou HDL do projeto O desenho é então sintetizado na FPGA A ferramenta de síntese determina como as LUT os multiplexadores e os canais de encaminhamento devem ser configurados para desempenhar as funções especificadas Essa informação de configuração é então transferida para a FPGA Dado que a FPGA Cyclone IV armazena a sua informação de configuração na SRAM elas são facilmente reprogramadas A FPGA pode carregar o conteúdo da sua SRAM de um computador no laboratório ou a partir de um chip EEPROM quando o sistema arranca Alguns fabricantes incluem uma EEPROM diretamente na FPGA ou usam fusíveis de programação única para configurar a FPGA Exemplo 57 ATRASO DO LE Alyssa P Hacker está a construir uma máquina de estado finito que deve executar a 200 MHz Ela usa uma FPGA Cyclone IV GX com as seguintes especificações tLE 381 ps per LE tsetup 76 ps e tpcq 199 ps para todos os flipflops O atraso de condução entre LE é de 246 ps Suponha que o hold time para os flipflops é 0 Qual é o número máximo de LE que o seu projeto pode usar Capítulo cinco Blocos de Construção Digital 395 Solução Alyssa utiliza a Equação 313 para determinar o atraso de propagação máximo da lógica tpd Tc tpcq tsetup Assim o tpd 5 ns 0199 ns 0076 ns logo tpd 4725 ns O atraso de cada LE mais o atraso de condução entre LE tLEwire é de 381 ps 246 ps 627 ps O número máximo de LE N é NtLEwire 4725 ns Assim N 7 563 Implementação de Matrizes Para minimizar o seu tamanho e custo as ROM e as PLA usam normalmente pseudonMOS ou circuitos dinâmicos ver Seção 178 em alternativa às portas lógicas convencionais A Figura 562 a mostra a notação de ponto para uma ROM 4 3bits que executa as seguintes funções 𝑋 𝐴 𝐵 𝑌 𝐴 𝐵 e 𝑍 𝐴𝐵 Estas são as mesmas funções que as da Figura 549 com as entradas de endereço renomeado A e B e as saídas de dados renomeadas para X Y e Z A implementação pseudoMOS é dada na Figura 562 b Cada saída do decodificador está ligada às portas dos transístores nMOS da sua linha O leitor devese lembrar que nos circuitos pseudonMOS os weak transístores pMOS puxam a saída a HIGH somente se não há caminho para GND através do pulldown nMOS network Transístores pulldown são colocados em cada junção sem um ponto Os pontos do diagrama de notação de ponto da Figura 562 a ficam visíveis na Figura 562 b para facilitar a comparação Os weak transístores pullup puxam a saída a HIGH para cada wordline sem um transístor de pulldown Por exemplo quando AB 11 a 11 wordline está a HIGH e transístores em X e Z fecham e puxam essas saídas a LOW A saída Y não tem transístor ligando com o 11 wordline então Y é puxado a HIGH pelos weak pull up As PLA também podem ser construídas usando circuitos pseudonMOS como mostrado na Figura 563 para o PLA a partir da Figura 555 Os transístores pulldown nMOS são colocados no complemento de pontos literais na matriz AND e nas linhas pontilhadas da matriz OR As colunas na matriz OR são enviadas através de um inversor antes de serem alimentadas para as saídas dos bits Mais uma vez os pontos azuis do diagrama de notação de ponto da Figura 555 são deixados visíveis na Figura 563 para facilitar a comparação Capítulo cinco Blocos de Construção Digital 396 Figura 562 Implementação da ROM a notação de ponto b circuito pseudonMOS Figura 563 PLA 3 3 2bits utilizando circuito pseudonMOS Capítulo cinco Blocos de Construção Digital 397 57 SUMÁRIO Este Capítulo introduziu os blocos de construção digital utilizados em muitos sistemas digitais Esses blocos incluem circuitos aritméticos como somadores subtratores comparadores shifters multiplicadores e divisores circuitos sequenciais como contadores e registros de deslocamento e matrizes de memória e lógica O Capítulo também explorou as representações de vírgula fixa e de vírgula flutuante de números fraccionários No Capítulo 7 usamos esses blocos de construção para construir um microprocessador Os somadores formam a base da maioria dos circuitos aritméticos Um half adder adiciona duas entradas de 1bit A e B e produz uma soma e um transporte de saída Um full adder estende o half adder e aceita um transporte de entrada Uma cascata de N full adders podem ser interligados para formar um carry propagate adder CPA que adiciona dois números de Nbits Este tipo de CPA é chamado de ripple carry adder porque o transporte se propaga através de cada um dos full adders CPA mais rápidos podem ser construídos utilizando técnicas de lookahead ou prefix Um subtrator nega a segunda entrada e adicionaa ao primeiro Um comparador de magnitude subtrai um número de outro e determina o valor relativo com base no sinal do resultado Um multiplicador constitui produtos parciais usando portas AND em seguida adiciona esses bits usando full adders Um divisor subtrai repetidamente o divisor do restante parcial e verifica o sinal da diferença para determinar os bits do quociente Um contador usa um somador e um registro para incrementar a contagem em execução Os números fraccionários são representados utilizando formas de vírgula fixa ou vírgula flutuante Os números de vírgula fixa são análogos aos decimais e os números de pontos flutuante são análogos à notação científica Os números de vírgula fixa usam circuitos aritméticos comuns enquanto os números de vírgula flutuante requerem hardware mais elaborado para extrair e processar o sinal expoente e mantissa As grandes memórias são organizadas em conjuntos de words As memórias têm um ou mais portos de leitura eou escrita às palavras As memórias voláteis como as SRAM e as DRAM perdem o seu conteúdo quando a energia é desligada A SRAM é mais rápida do que a DRAM mas exige mais transístores Um Capítulo cinco Blocos de Construção Digital 398 banco de registro é uma pequena matriz SRAM multiporto As memórias não voláteis chamadas ROM mantêm seu estado indefinidamente Apesar dos nomes a maioria das ROM modernas pode ser escrita As matrizes são também uma forma comum de construir lógica As matrizes de memória podem ser usadas como lookup tables para realizar funções combinatórias As PLA são compostas de ligações dedicadas entre matrizes configuráveis de AND e OR elas só implementam lógica combinatória As FPGA são compostas de muitas pequenas lookup tables e registros elas implementam lógica combinatória e sequencial O conteúdo da lookup table e as suas interligações pode ser configurado para executar uma qualquer função lógica As FPGA modernas são fáceis de reprogramar e são grandes e baratas o suficiente para construir sistemas digitais altamente sofisticados por isso elas são amplamente utilizadas em produtos comerciais de médio e baixo volume assim como na educação Capítulo cinco Blocos de Construção Digital 399 Exercícios Exercício 51 Qual é o atraso para os seguintes tipos de somadores de 64bits Suponha que cada porta de duas entradas tem um atraso de 150 ps e que um atraso do full adder é de 450 ps a Um somador ripplecarry b Um somador carrylookahead com blocos de 4bits c Um somador prefix Exercício 52 Projete dois somadores um somador ripplecarry de 64bits e um somador carry lookahead de 64bits com blocos de 4bits Use apenas portas de duas entradas Cada porta de duas entradas tem 15 µm2 tem um atraso de 50 ps e tem 20 fF de capacidade total da porta O leitor pode assumir que a energia estática é insignificante a Compare a área o atraso e a potência dos somadores operando em 100 MHz e 12 V b Discuta o compromisso entre a potência a área e o atraso Exercício 53 Explique porque um projetista pode optar por usar um somador ripplecarry em alternativa a um somador carrylookahead Exercício 54 Projete o somador prefix de 16bits da Figura 57 em HDL Simule e teste o seu módulo para provar que ele funciona corretamente Exercício 55 A rede prefix mostrada na Figura 57 utiliza células negras para determinar todos os prefix Alguns do bloco de propagação dos sinais não são realmente necessários Projete uma célula cinzenta Capítulo cinco Blocos de Construção Digital 400 que receba os sinais G e P para bits ik e k1 j mas produza apenas Gij e não Pij Redesenhe a rede prefix substituindo células negras por células cinzentas sempre que possível Exercício 56 A rede prefix mostrada na Figura 57 não é a única maneira para calcular todos os prefixs num tempo logarítmico A rede KoggeStone é outra rede prefix comum que executa a mesma função usando diferentes ligações das células pretas Faça uma pesquisa relativa aos somadores KoggeStone e desenhe um esquema semelhante ao da Figura 57 que mostra a ligação de células negras num somador KoggeStone Exercício 57 Lembrese que um codificador de prioridade de Nentradas tem log2N saídas que codifica qual das N entradas recebe prioridade ver Exercício 236 a Projete um codificador de prioridade de Nentradas que tenha um atraso que aumenta algoritmicamente com N Esboce o seu projeto e forneça o atraso do circuito em termos de atraso de a seus elementos do circuito b Codifique o seu projeto em HDL Simule e teste o seu módulo para provar que ele funciona corretamente Exercício 58 Projete os seguintes comparadores para números de 32bits Esboce os esquemas a é igual a b maior que c inferior ou igual a Capítulo cinco Blocos de Construção Digital 401 Exercício 59 Projete a ALU de 32bits mostrado na Figura 515 usando a sua HDL favorita O leitor pode fazer o módulo de nível superior comportamental ou estrutural Exercício 510 Adicione uma saída de overflow à ALU de 32bits do Exercício 59 A saída é verdadeira quando o resultado do somador transborda Caso contrário ela é FALSE a Escreva uma equação Booleana para a saída de overflow b Desenhe o circuito de overflow c Criar a ALU modificada em HDL Exercício 511 Adicione uma saída de Zero à ALU de 32bits do Exercício 59 A saída é TRUE quando Y 0 Exercício 512 Escreva um testbench para testar a ALU de 32bits do Exercício 59 Exercício 510 ou Exercício 511 Em seguida deve usálo para testar a ALU Incluir se necessário test vector files Certifique se de testar casos suficientes para convencer um céptico razoável de que as funções da ALU funcionam corretamente Exercício 513 Projete um deslocador que sempre desloca por 2bits uma entrada de 32bits A entrada e a saída são ambas de 32bits Explique o projeto por palavras suas e esboce um esquema Implemente o seu projeto na sua HDL favorita Exercício 514 Projete rotators de 4bits para a esquerda e para a direita Esboce um esquema do seu projeto Implemente o seu projeto na sua HDL favorita Capítulo cinco Blocos de Construção Digital 402 Exercício 515 Projete um shifter de 8bits para a esquerda usando apenas 24 multiplexadores 21 O deslocador aceita uma entrada A de 8 bits e um valor de deslocamento de três bits shamt20 Uma saída Y de 8 bits é produzida Esboce o esquema Exercício 516 Explique como construir qualquer deslocador de Nbits ou rotator usando apenas log2 N multiplexadores 21 Exercício 517 O funnel shifter mostrado na Figura 564 pode executar qualquer deslocamento de Nbits ou operação de rotação Uma entrada de 2Nbits é deslocada de k bits A saída Y são os N bits menos significativos do resultado Os N bits mais significativos de entrada são chamados de B e os N bits menos significativos são chamados de C Ao escolher valores apropriados de B C e K o shifter funil pode executar qualquer tipo de deslocamento ou rotação Explique o que esses valores devem ser em termos de A shamt e N para a Shift lógico de A para a direita por shamt b Shift aritmético de A para a direita por shamt c Shift de A para a esquerda por shamt d Rotate de A para a direita por shamt e Rotate de A para esquerda por shamt Capítulo cinco Blocos de Construção Digital 403 Figura 564 Funnel shifter Exercício 518 Encontre o caminho crítico para o multiplicador 4 4 da Figura 518 em termos de atraso da porta AND TAND e um atraso do somador TFA Qual é o atraso de um multiplicador N N construído da mesma maneira Exercício 519 Encontre o caminho crítico para o divisor 4 x 4 da Figura 520 em termos do atraso de um multiplexar 21 tMUX de atraso de um somador TFA e de atraso de um inversor TINV Qual é o atraso de um divisor de N N construída da mesma maneira Exercício 520 Projete um multiplicador que opere com dois números em complemento2 Exercício 521 Uma unidade de extensão de sinal estende um número em complemento2 de M para N bits N H copiando o bit mais significativo da entrada para os bits mais significativos da saída ver Seção 146 Recebe uma entrada A de Mbits e produz uma saída Y de Nbits Esboce um circuito para uma unidade de extensão de sinal com uma entrada de 4bits e uma saída de 8bits Escreva o código HDL do seu projeto Capítulo cinco Blocos de Construção Digital 404 Exercício 522 Uma unidade de extensão de zero estende um número sem sinal de M para N bits N M colocando zeros nos bits mais significativos da saída Esboce um circuito para uma unidade de extensão zero com uma entrada de 4bits e uma saída de 8bits Escreva o HDL para seu projeto Exercício 523 Determine 1110010002 0011000002 em binário usando o algoritmo de divisão padrão da escola primária Mostre seu trabalho Exercício 524 Qual é o intervalo de números que podem ser representados pelos seguintes sistemas numéricos a números sem sinal de 24bits de vírgula fixa com 12bits inteiros e 12bits fraccionários b números de sinal e magnitude de 24bits de vírgula fixa com 12bits inteiros e 12bits fraccionários c números em complemento2 de 24bits de vírgula fixa com 12bits inteiros e 12bits fraccionários Exercício 525 Expresse os seguintes números de base decimal no formato de sinalmagnitude de 16bits usando vírgula fixa de 8bits inteiros e 8bits fraccionários Expresse a sua resposta em hexadecimal a 135625 b 423125 c 1715625 Capítulo cinco Blocos de Construção Digital 405 Exercício 526 Expresse os seguintes números de base decimal no formato de sinalmagnitude de 12 bits usando vírgula fixa de 6bits inteiros e 6bits fraccionários Expresse a sua resposta em hexadecimal a 305 b 1625 c 8078125 Exercício 527 Expresse os números de base decimal do Exercício 525 no formato complemento2 de 16bits com vírgula fixa com 8bits inteiros e 8bits fraccionários Expresse a sua resposta em hexadecimal Exercício 528 Expresse os números de base decimal do Exercício 526 no formato complemento2 de 12bits com vírgula fixa com 6bits inteiros e 8bits fraccionários Expresse a sua resposta em hexadecimal Exercício 529 Expresse os números de base decimal do Exercício 525 no formato de vírgula flutuante IEEE 754 de precisão simples Expresse a sua resposta em hexadecimal Exercício 530 Expresse os números de base decimal do Exercício 526 no formato de vírgula flutuante IEEE 754 de precisão simples Expresse a sua resposta em hexadecimal Exercício 531 Converta os seguintes números binários de complemento2 de vírgula fixa para a base decimal A vírgula binária implícita é mostrada explicitamente para ajudar na sua interpretação a 01011000 Capítulo cinco Blocos de Construção Digital 406 b 11111111 c 10000000 Exercício 532 Repita o Exercício 531 para os seguintes números binários em complemento2 de ponto a 01110110101 b 10011011010 c 10100000100 Exercício 533 Ao adicionar dois números de vírgula flutuante o número com o expoente menor é deslocado Qual a necessidade Explique por palavras suas e forneça um exemplo para justificar a sua explicação Exercício 534 Adicione os seguintes números de vírgula flutuante IEEE 754 de precisão simples a C0123456 81C564B7 b D0B10301 D1B43203 c 5EF10324 5E039020 Exercício 535 Adicione os seguintes números de vírgula flutuante IEEE 754 de precisão simples a C0D20004 72407020 b C0D20004 40DC0004 Capítulo cinco Blocos de Construção Digital 407 c 5FBE4000 3FF80000 DFDE4000 Porque é que o resultado é não intuitivo Explique Exercício 536 Expanda os passos seguido na Seção 532 para fazer com que a adição em vírgula flutuante funcione para números negativos e positivos de vírgula flutuante Exercício 537 Considere os números de vírgula flutuante IEEE 754 de precisão simples a Quantos números podem ser representados pelo formato IEEE 754 de precisão simples de vírgula flutuante O leitor não precisa contar ou NaN b Quantos números adicionais poderiam ser representados se e NaN não estavam representados c Explique porque a e a NaN são dadas representações especiais Exercício 538 Considere os seguintes números decimais 245 e 00625 a Escreva os dois números utilizando a notação de vírgula flutuante de precisão simples Dê suas respostas em hexadecimal b Realize uma comparação de magnitude dos dois números de 32bits da parte a Por outras palavras interprete os dois números de 32bits como números de complemento2 e compareos Será que a comparação de inteiros fornece um resultado correto c Você decide avançar com uma nova notação de vírgula flutuante de precisão simples Tudo é idêntico ao definido pela norma de vírgula flutuante IEEE 754 de precisão simples exceto que o leitor representa o expoente usando complemento2 em vez de usar uma bias Escreva os dois números utilizando a nova norma Dê as suas respostas em hexadecimal Capítulo cinco Blocos de Construção Digital 408 e Será que a comparação inteira trabalha com a sua nova notação de vírgula flutuante estabelecida em d f Porque é conveniente na comparação de inteiros trabalhar com números de vírgula flutuante Exercício 539 Projete um somador de precisão simples de vírgula flutuante usando o seu HDL favorito Antes de codificar o projeto em HDL esboce um esquema do seu projeto Simule e teste o seu somador para provar a um céptico que ele funciona corretamente O leitor pode considerar apenas os números positivos e utilize a aproximação para zero truncagem Também pode ignorar os casos especiais indicados na Tabela 52 Exercício 540 Neste problema o leitor irá explorar o desenho de um multiplicador de 32bits de vírgula flutuante O multiplicador tem duas entradas de vírgula flutuante de 32bits e produz uma saída de vírgula flutuante de 32bits O leitor pode considerar apenas os números positivos e utilize a aproximação para zero truncagem Também pode ignorar os casos especiais indicados na Tabela 52 a Escreva os passos necessários para executar a multiplicação de 32bits de vírgula flutuante b Esboce o esquema de um multiplicador de 32bits de vírgula flutuante c Projete um multiplicador de 32 bits de vírgula flutuante em HDL Simule e teste o seu multiplicador para provar a um céptico que ele funciona corretamente Exercício 541 Neste problema o leitor irá explorar o desenho de um somador prefix de 32bits a Desenhe um esquema de seu projeto b Projete o somador prefix de 32bits em HDL Simule e teste o seu somador para provar que ele funciona corretamente Capítulo cinco Blocos de Construção Digital 409 c Qual é o atraso do seu somador prefix de 32bits Suponha que cada porta de duas entradas tem um atraso de 100 ps d Projete uma versão do somador prefix de 32bits com pipeline Esboce o esquema de seu projeto Quão rápido o seu somador prefix com pipeline executa O leitor pode assumir uma sobrecarga de sequenciamento tpcq tsetup de 80 ps Faça o projeto de modo a funcionar tão rapidamente quanto possível e Projete o somador prefix de 32bits com pipeline em HDL Exercício 542 Um incrementador adiciona 1 a um número de Nbit Construa um incrementador de 8bits usando um full adder Exercício 543 Construa um contador síncrono updown de 32bit As entradas são Reset e Up Quando Reset for 1 as saídas são todas 0 Caso contrário quando Up 1 o circuito faz contagem progressiva e quando Up 0 o circuito faz contagem regressiva Exercício 544 Projete um contador de 32bits que adiciona 4 a cada flanco do relógio O contador tem entradas de reset e de clock Após a reinicialização a saída do contador é colocada a 0 Exercício 545 Modifique o contador do Exercício 544 tal que o contador seja incremento por quatro ou carregue um novo valor de 32bits D a cada flanco do relógio dependendo de um sinal de controlo load Quando a load 1 o contador carrega o novo valor D Capítulo cinco Blocos de Construção Digital 410 Exercício 546 Um contador Johnson de Nbits consiste num registro de deslocamento de Nbits com um sinal de reset A saída do registro de deslocamento Sout é invertido e alimentado de volta para a entrada Sin Quando o contador é reiniciado todos os bits são colocados a 0 a Mostre a sequência de saídas Q30 produzido por um contador Johnson de 4bits começando imediatamente após o contador tenha sido reinicializado b Quantos ciclos devem decorrer para que um contador Johnson de Nbits repita uma sequência Explique c Projete um contador decimal usando um contador Johnson de 5bit dez portas AND e inversores O contador decimal tem um clock um reset e nove saídas Y90 Quando o contador é reiniciado Y0 é ativado Em cada ciclo subsequente a próxima saída deve ser ativada Depois de dez ciclos o contador deve repetir Esboce um esquema do contador decimal d Quais as vantagens de um contador Johnson relativamente a um contador convencional Exercício 547 Escreva o HDL para um scannable flipflop de 4bits como o mostrado na Figura 537 Simule e teste o seu módulo HDL para provar que ele funciona corretamente Exercício 548 O idioma Inglês tem uma boa dose de redundância que nos permite reconstruir transmissões ilegíveis Os dados binários também podem ser transmitidos de forma redundante para permitir a correção de erros Por exemplo o número 0 poderia ser codificado como 00000 e o número 1 poderia ser codificado como 11111 O valor poderia então ser enviado através de um canal ruidoso que pode comutar dois dos bits O receptor pode reconstruir os dados originais porque um 0 terá pelo menos três dos cinco bits recebidos como 0 semelhante a 1 terá pelo menos três 1s a Proponha uma codificação para enviar 00 01 10 ou 11 codificados usando cinco bits de informação de tal forma que todos os erros que corrompem um bit dos dados codificados podem ser corrigidos Dica As codificações 00000 e 11111 para 00 e 11 respectivamente não vão funcionar Capítulo cinco Blocos de Construção Digital 411 b projete um circuito que recebe os dados de cinco bits codificados e os descodifique para 00 01 10 ou 11 mesmo se um bit dos dados transmitidos tenha sido alterado c Suponha que você queria mudar para uma codificação alternativa de 5bits Como você pode implementar seu projeto para ser mais fácil alterar a codificação sem ter que usar um hardware diferente Exercício 549 A memória Flash EEPROM simplesmente chamada de memória flash é uma invenção relativamente recente que revolucionou a electrónica de consumo Investigue e explique como funciona a memória flash Use um diagrama que ilustre a porta flutuante Descrever como um bit na memória é programado Cite corretamente as suas fontes Exercício 550 A equipe de projeto de vida extraterrestre acaba de descobrir extraterrestes que vivem no fundo do lago Mono Eles precisam construir um circuito para classificar os extraterrestres pelo potencial planeta de origem com base em características medidas disponíveis da sonda da NASA esverdeamento acastanhamento viscosidade e feiura A consulta cuidadosa de exobiólogo conduz às seguintes conclusões Se o extraterrestre é verde e viscoso ou feio castanho e viscoso ele poderia ser de Marte Se a criatura é feia castanha e viscosa ou verde e não é feia nem viscosa ela poderia ser de Vénus Se a besta é castanha e não é feia nem viscosa ou é verde e viscosa ela poderia ser de Júpiter Note que esta é uma ciência inexata por exemplo uma forma de vida que é manchada de verde e castanho e é viscosa mas não feia pode ser de Marte ou Júpiter a Programe uma PLA 4 4 3 para identificar o extraterrestre O leitor pode usar a notação de ponto b Programe uma ROM 16 3 para identificar o extraterrestre O leitor pode usar a notação de ponto Capítulo cinco Blocos de Construção Digital 412 c Implemente o seu projeto em HDL Exercício 551 Implemente as seguintes funções usando uma única ROM 16 3 Use a notação de ponto para indicar o conteúdo da ROM a 𝑋 𝐴 𝐵 𝐵𝐶𝐷 𝐴𝐵 b 𝑌 𝐴𝐵 𝐵𝐷 c 𝑍 𝐴 𝐵 𝐶 𝐷 Exercício 552 implemente as funções do Exercício 551 usando uma PLA 4 8 3 Você pode usar a notação de ponto Exercício 553 Especifique o tamanho de uma ROM que o leitor poderia usar para programar cada um dos seguintes circuitos combinatórios Usar uma ROM para implementar estas funções é uma boa escolha de projeto Explique porque sim ou porque não a um somadorsubtrator de 16bits com Cin e Cout b um multiplicador 8 8 c um codificador de prioridade de 16bits ver Exercício 236 Exercício 554 Considere os circuitos ROM da Figura 565 Para cada linha pode o circuito na coluna I ser substituído por um circuito equivalente na coluna II pela programação adequada da ROM deste último Capítulo cinco Blocos de Construção Digital 413 Figura 565 Circuitos ROM Exercício 555 Quantos LE da FPGA Cyclone IV são necessários para realizar cada uma das seguintes funções Mostrar como configurar um ou mais LE para executar a função O leitor deve ser capaz de fazer isso por inspeção sem a realização de síntese lógica a a função combinacional de Exercício 213 c b a função combinacional de Exercício 217c c a função de duas saídas do Exercício 224 d a função do Exercício 235 e um codificador de prioridade com quatroentradas ver Exercício 236 Capítulo cinco Blocos de Construção Digital 414 Exercício 556 Repita o Exercício 556 para as seguintes funções a um codificador de prioridade de oitoentradas ver Exercício 236 b um decodificador 38 c um somador de 4bits carry propagate sem transporte para dentro ou para fora d a FSM do Exercício 322 e o contador de código de Gray do Exercício 237 Exercício 557 Considere o LE do Cyclone IV mostrado na Figura 258 De acordo com a folha de dados tem as especificações de tempo indicados na Tabela 55 a Qual é o número mínimo de LE do Cyclone IV necessários para implementar a FSM da Figura 326 b Sem skew do relógio qual é a frequência máxima de relógio a que esta FSM será executada de forma confiável c Com 3 ns de skew do relógio qual é a frequência máxima de relógio a que esta FSM será executada de forma confiável Capítulo cinco Blocos de Construção Digital 415 Tabela 55 Cyclone IV temporização Exercício 558 Repita o Exercício 557 para a FSM da Figura 331 b Exercício 559 O leitor gostaria de usar uma FPGA para implementar um classificador de MM com um sensor de cor e motores para colocar os doces vermelhos num frasco e os doces verdes noutro O projeto deve ser implementado como uma FSM usando uma FPGA Cyclone IV De acordo com a folha de dados a FPGA tem as características de timing indicadas na Tabela 55 Você gostaria que a sua FSM fosse executada a 100 MHz Qual é o número máximo de LE no caminho crítico Qual é a velocidade mais rápida a que a FSM pode ser executada Capítulo cinco Blocos de Construção Digital 416 Questões de Entrevista Os exercícios seguintes apresentam perguntas que foram feitas em entrevistas para empregos em projeto digital Pergunta 51 Qual é o maior resultado possível se multiplicar dois números de Nbits sem sinal Pergunta 52 A representação em Binary Coded Decimal BCD usa quatro bits para codificar cada dígito decimal Por exemplo 4210 é representado como 01000010BCD Explique por palavras suas porque os processadores devem usar a representação BCD Pergunta 53 Projete hardware para adicionar dois números de 8bits sem sinal em BCD ver pergunta 52 Esboce um esquema para o seu projeto e escreva um módulo em HDL para o somador BCD As entradas são A B e Cin e as saídas são S e Cout Cin e Cout são o transporte de 1bit e A B e S são números BCD de 8bits 417 6 Arquitetura 61 INTRODUÇÃO Os Capítulos anteriores introduziram os conceitos de projeto digital e dos blocos de construção digital Neste Capítulo subiremos alguns níveis de abstração para definir a arquitetura de um computador A arquitetura é a visão que o programador tem do computador Ela é definida pelo conjunto de instruções linguagem e localizações dos operandos registradores e memória Existem muitas arquiteturas diferentes tais como x86 MIPS SPARC e PowerPC O primeiro passo no entendimento de qualquer arquitetura de computador é aprender a sua linguagem As palavras numa linguagem de computador são chamadas instruções O vocabulário do computador é chamado conjunto de instruções Todos os programas que rodam num computador utilizam um mesmo conjunto de instruções Mesmo aplicações complexas de software como o processamento de palavras e aplicativos de planilhas são eventualmente compilados numa série de instruções simples como adição subtração e saltos Instruções computacionais indicam tanto a operação a ser realizada quanto o operando a ser utilizado Os operandos podem vir da memória de registradores ou da instrução em si O hardware do computador entende apenas 0𝑠 e 1𝑠 logo as instruções são codificadas como números binários chamados linguagem de máquina Do mesmo modo que nós utilizamos letras para codificar a linguagem humana os computadores utilizam números binários para codificar a linguagem de máquina Microprocessadores são sistemas digitais que leem e executam instruções em linguagem de máquina No entanto os humanos consideram a leitura da linguagem de máquina tediosa então preferimos representar as instruções por um formato simbólico denominado linguagem assembly Capítulo seis Arquitetura 418 Os conjuntos de instruções de diferentes arquiteturas são mais parecidos com diferentes dialetos do que diferentes linguagens Quase todas as arquiteturas definem instruções básicas como adição subtração e saltos que operam em memórias ou registradores Uma vez que você tenha aprendido um conjunto de instruções entender outros é bastante simples Uma arquitetura de computador não define a implementação fundamental de hardware Frequentemente existem muitas implementações de hardware para uma mesma arquitetura Por exemplo empresas como a Intel ou a Advanced Micro Devices AMD vendem vários microprocessadores pertencentes à mesma arquitetura x86 Todos eles podem rodar os mesmos programas mas utilizam diferentes hardwares fundamentais e portanto oferecem alternativas em performance preço e potência Alguns microprocessadores são otimizados para servidores de alta performance enquanto outros são otimizados para a longa duração de baterias dos laptops O arranjo específico de registradores memórias ALU e outros blocos de construção digitais para formar um microprocessador é chamado de microarquitetura e será o assunto do Capítulo 7 Frequentemente existem muitas microarquiteturas diferentes para uma mesma arquitetura Neste texto introduziremos a arquitetura MIPS que foi desenvolvida primeiramente por John Hennessy e seus colegas em Stanford nos anos 80 Os processadores MIPS são utilizados por dentre outras pela Silicon Graphics Nintendo e Cisco Começaremos introduzindo as instruções básicas localização de operandos e formatos de linguagem de máquina Em seguida introduziremos mais instruções utilizadas em construções comuns de programas tais como ramos loops manipulações de arrays e chamadas de funções Ao longo deste Capítulo motivaremos o projeto da arquitetura MIPS utilizando quatro princípios articulados por Patterson e Hennessy 1 simplicidade favorece a regularidade 2 tornar o caso comum rápido 3 menor é mais rápido e 4 bons projetos demandam bons compromissos 62 LINGUAGEM ASSEMBLY A linguagem assembly é a representação legível para humanos da linguagem nativa dos computadores Cada instrução da linguagem assembly especifica tanto a operação a ser realizada Qual a melhor arquitetura para se estudar quando começar a aprender o assunto Arquiteturas comercialmente bem sucedidas como a x86 são satisfatórias para se estudar pois o leitor pode usálas para escrever programas em computadores reais Infelizmente muitas dessas arquiteturas estão cheias de rugas e idiossincrasias acumuladas ao longo de anos de desenvolvimento bagunçado por diferentes equipes de engenharia tornando as arquiteturas difíceis de entender e implementar Muitos manuais ensinam arquiteturas imaginárias que são simplificadas para ilustrar os conceitos chave Nós seguimos a liderança de David Patterson e John Hennessy no seu livro de texto Computer Organization and Design focando na arquitetura MIPS Centenas de milhões de microprocessadores MIPS têm sido vendidos tornando essa arquitetura muito importante comercialmente No entanto é uma arquitetura limpa com um comportamento um pouco diferente Ao final deste capítulo visitaremos brevemente a arquitetura x86 para comparála e contrastála com a MIPS Capítulo seis Arquitetura 419 quanto o operando sobre o qual opera Introduziremos instruções aritméticas simples e mostraremos como essas operações são escritas em linguagem assembly Em seguida definiremos os operandos de instruções MIPS registradores memória e constantes Este Capítulo assume que o leitor já tenha alguma familiaridade com uma linguagem de programação de alto nível como C C ou Java Essas linguagens são praticamente idênticas para a maioria dos exemplos neste Capítulo mas quando elas forem diferentes nós utilizaremos C O Apêndice C disponibiliza uma introdução à linguagem C para aqueles com pouco ou nenhuma experiência anterior em programação 621 Instruções A operação mais comum que um computador realiza é adição O Exemplo de Código 61 mostra o código para somar duas variáveis b e c e escrever o resultado em a O código é mostrado na esquerda numa linguagem de alto nível utilizando a sintaxe de C C e Java e então reescrito do lado direito em linguagem assembly MIPS Note que as declarações num programa em C terminam com um ponto e vírgula Exemplo de Código 61 ADIÇÃO Linguagem de alto nível a b c Código assembly MIPS add a b c Exemplo de Código 62 SUBTRAÇÃO Linguagem de alto nível a b c Código assembly MIPS sub a b c Capítulo seis Arquitetura 420 A primeira parte numa instrução assembly add é chamada de mnemônico e indica qual a operação a ser realizada A operação é realizada em b e c os operandos fonte e o resultado é escrito em a o operando destino O Exemplo de Código 62 mostra que a subtração é similar à adição O formato de instrução é o mesmo que na instrução add exceto pela especificação da operação sub Esse formato consistente de informação é um exemplo do primeiro princípio de projeto Princípio de Projeto 1 Simplicidade favorece a regularidade Instruções com um número consistente de operandos neste caso duas fontes e um destino são mais fáceis de codificar e manipular em hardware Códigos de alto nível mais complexos são traduzidos em múltiplas instruções MIPS como mostrado no Exemplo de Código 63 Nos exemplos com linguagens de alto nível comentários de uma linha iniciamse com e continuam até o final da linha Comentários de múltiplas linhas iniciamse com e terminam com Na linguagem assembly apenas comentários de uma única linha são utilizados Eles iniciamse com e continuam até ao final da linha O programa em linguagem assembly no Exemplo de Código 63 requer uma variável temporária t para armazenar o resultado intermediário Utilizar múltiplas instruções em linguagem assembly para realizar operações mais complexas é um exemplo do segundo princípio de projeto de arquitetura computacional Princípio de Projeto 2 Tornar o caso comum rápido Exemplo de Código 63 CÓDIGO MAIS COMPLEXO Linguagem de alto nível a b c d comentário de linha única comentário de linha múltipla Código assembly MIPS sub t c d t c d add a b t a b t O mnemônico pronuncianimonik vem da palavra grega μιμνΕσκεστηαι para se lembrar O mnemónico de linguagem de montagem é mais fácil de lembrar do que um padrão de linguagem de máquina de 0 e 1 Representando a mesma operação Capítulo seis Arquitetura 421 O conjunto de instruções MIPS faz o caso comum rápido incluindo apenas instruções simples comumente utilizadas O número de instruções é mantido pequeno para que o hardware necessário para decodificar as instruções e seus operandos possa ser simples pequeno e rápido Operações mais elaboradas que são menos comuns são desenvolvidas utilizando sequências de múltiplas instruções simples Portanto a MIPS possui uma arquitetura de computadores com conjunto de instruções reduzido reduced instruction set computer RISC As arquiteturas com muitas instruções mais complexas como a arquitetura x86 da Intel são computadores com conjunto complexo de instruções complex instruction set computers CISC Por exemplo na x86 é definida uma instrução de movimento de string que copia uma string uma série de caracteres de uma parte da memória para outra Tal operação requer muitas possivelmente centenas de instruções simples numa máquina RISC No entanto o custo de implementação de instruções complexas numa arquitetura CISC é somado ao hardware e o sobrecarrega tornando mais lentas as instruções mais simples Uma arquitetura RISC minimiza a complexidade de hardware e as codificações de instrução necessárias mantendo o conjunto de instruções pequeno Por exemplo um conjunto de instruções com 64 instruções simples precisaria de log2 64 6 bits para codificar a operação Um conjunto de instruções com 256 instruções complexas precisaria de log2 256 8 bits de codificação por instrução Numa máquina CISC mesmo que as instruções mais complexas sejam utilizadas apenas raramente elas sobrecarregam todas as instruções mesmo as mais simples 622 Operandos Registradores Memória e Constantes Uma instrução opera sobre os operandos No Exemplo de Código 61 as variáveis a b e c são todas operandos Mas computadores operam com 1𝑠 e 0𝑠 não com nomes de variáveis As instruções necessitam de uma localização física de onde se possam recuperar os dados binários Operandos podem ser armazenados em registradores ou memória ou podem ser constantes armazenadas na própria instrução Computadores utilizam vários locais para colocar os operandos de modo a otimizar a velocidade e a capacidade de dados Operandos armazenados como constantes ou em registradores são acessados rapidamente porém suportam apenas uma quantidade pequena de dados Dados adicionais devem ser acessados da memória que é grande Capítulo seis Arquitetura 422 mas lenta A arquitetura MIPS é dita de 32bits pois ela opera com dados de 32 𝑏𝑖𝑡𝑠 a MIPS tem sido estendida para 64bits em produtos comerciais mas consideraremos apenas a forma de 32 𝑏𝑖𝑡𝑠 neste livro Registradores Instruções precisam acessar os operandos rapidamente para que eles possam rodar rápido Porém operandos armazenados na memória levam um longo tempo para serem recuperados Portanto a maioria das arquiteturas específica um pequeno número de registradores que podem manter operandos comumente utilizados A arquitetura MIPS utiliza 32 registradores chamados de conjunto de registradores ou banco de registradores Quanto menores os registradores mais rápido eles podem ser acessados Isso leva ao terceiro princípio de projeto Princípio de Projeto 3 Menor é mais rápido Procurar informações num número pequeno de livros relevantes na sua mesa é muito mais rápido do que procurar nas prateleiras de uma biblioteca Da mesma forma ler o dado de um conjunto pequeno de registradores por exemplo 32 é mais rápido do que lêlos de 1000 registradores ou de uma grande memória Um pequeno banco de registradores é tipicamente construído a partir de um pequeno array SRAM vide Seção 553 O array SRAM utiliza um pequeno decodificador e linhas de bits conectadas a relativamente poucas células de memória criando assim um caminho crítico menor do que as grandes memórias possuem O Exemplo de Código 64 mostra a instrução add com operandos registradores Os nomes dos registradores MIPS são precedidos pelo símbolo As variáveis a b e c são arbitrariamente colocadas em s0 s1 e s2 O nome s1 é pronunciado como registrador s1 ou dólar s1 A instrução adiciona os valores de 32 𝑏𝑖𝑡𝑠 contidos em s1 b e s2 c e escreve o resultado de 32 𝑏𝑖𝑡𝑠 em s0 a A arquitetura MIPS geralmente armazena variáveis em 18 dos 32 registradores s0 s7 e t0 t9 Os registradores com o nome começando com s são chamados registradores saved De acordo com a convenção MIPS esses registradores armazenam variáveis como a b e c Registradores saved possuem conotações especiais quando são utilizados em chamadas de função Capítulo seis Arquitetura 423 vide Seção 646 Registradores com o nome começando com t são chamados de registradores temporários Eles são utilizados para o armazenamento de variáveis temporárias O Exemplo de Código 65 mostra o código em assembly MIPS um registrador temporário t0 para armazenar o cálculo intermediário de c d Exemplo de Código 64 OPERANDOS REGISTRADORES Linguagem de alto nível a b c Código assembly MIPS s0 a s1 b s2 c add s0 s1 s2 a b c Exemplo de Código 65 REGISTRADORES TEMPORÁRIOS Linguagem de alto nível a b c d comentário de linha única comentário de linha múltipla Código assembly MIPS s0 a s1 b s2 c s3 d sub t0 s2 s3 t c d add s0 s1 t0 a b t Exemplo 61 TRADUZINDO CÓDIGO DE ALTO NÍVEL PARA LINGUAGEM ASSEMBLY Traduza o seguinte código de alto nível em linguagem assembly Assuma que as variáveis a c estão mantidas nos registradores s0 s2 e f j estão em s3 s7 a b c f g h i j Capítulo seis Arquitetura 424 Solução O programa utiliza quatro instruções em linguagem assembly código assembly MIPS s0 a s1 b s2 c s3 f s4 g s5 h s6 i s7 j sub s0 s1 s2 a b c add t0 s4 s5 t0 g h add t1 s6 s7 t1 i j sub s3 t0 t1 f g h i j O Conjunto de Registradores A arquitetura MIPS define 32 registradores Cada registrador possui um nome e um número na faixa de 0 a 31 A Tabela 61 lista o nome o número e o uso de cada registrador 0 sempre contém o valor 0 pois essa constante é utilizada muito frequentemente em programas de computador Nós também discutiremos os registradores s e t Os registradores restantes serão descritos ao longo deste Capítulo Figura 61 Memória endereçável por palavra Capítulo seis Arquitetura 425 Tabela 61 Conjunto de registradores MIPS Memória Se os registradores fossem o único espaço de armazenamento de operandos ficaríamos confinados a simples programas com não mais de 32 variáveis No entanto os dados também podem ser armazenados na memória Quando comparada com o banco de registradores a memória possui muito mais locais de dados mas acessálos leva uma grande quantidade de tempo Enquanto o banco de registradores é pequeno e rápido a memória é grande e lenta Por essa razão variáveis comumente utilizadas são mantidas em registradores Através do uso combinado de memória e registradores um programa pode acessar uma grande quantidade de dados bem rápido Como descrito na Seção 55 as memórias são organizadas num array de palavras de dados A arquitetura MIPS utiliza endereços de memória de 32bits e palavras de 32bits Capítulo seis Arquitetura 426 A MIPS utiliza memória endereçável por byte Isto é cada byte na memória possui um único endereço No entanto apenas para propósitos de explicação primeiro introduziremos uma memória endereçável por palavra e mais tarde descreveremos a memória endereçável por byte da MIPS A Figura 61 mostra um array de memória que é endereçável por palavra Isto é cada dado de 32 bits possui um único endereço de 32bits Tanto a palavra de endereço de 32bits quanto o dado de 32bits são escritos em hexadecimal na Figura 61 Por exemplo o dado 0𝑥𝐹2𝐹1𝐴𝐶07 é armazenado no endereço de memória 1 Constantes hexadecimais são escritas com o prefixo 0𝑥 Por convenção a memória é escrita com os endereços mais baixos da memória na parte de baixo e os endereços maiores para cima A MIPS utiliza a instrução de carregamento de palavra load word lw para ler uma palavra de dado da memória num registrador O Exemplo de Código 66 carrega a palavra de memória 1 em s3 A instrução lw especifica o endereço efetivo na memória como a soma de um endereço de base e um offset O endereço de base escrito entre parênteses na instrução é um registrador O offset é uma constante escrita antes dos parênteses No Exemplo de Código 66 o endereço de base é 0 que mantém o valor 0 e o offset é 1 então a instrução lw lê do endereço de memória 01 1 Após a instrução de carregamento de palavra lw ser executada s3 mantém o valor 0𝑥𝐹2𝐹1𝐴𝐶07 o qual é o valor do dado armazenado no endereço de memória 1 da Figura 61 Exemplo de Código 66 LENDO UMA MEMÓRIA ENDEREÇÁVEL POR PALAVRA Código Assembly Este código assembly diferente de MIPS assume uma memória endereçável por palavra lw s3 10 lê a palavra de memória 1 dentro de s3 Capítulo seis Arquitetura 427 Exemplo de Código 67 ESCREVENDO NUMA MEMÓRIA ENDEREÇÁVEL POR PALAVRA Código Assembly Este código assembly diferente de MIPS assume uma memória endereçável por palavra sw s7 50 escreve s7 na palavra de memória 5 Figura 62 Memória endereçável por byte Similarmente a MIPS utiliza a instrução de armazenamento de palavra sw para escrever uma palavra de dado de um registrador na memória O Exemplo de Código 67 escreve o conteúdo do registrador s7 na palavra de memória 5 Estes exemplos têm utilizado 0 como endereço de base por simplicidade mas lembrese que qualquer registrador pode ser utilizado para alimentar o endereço de base Os dois exemplos de código anteriores têm mostrado uma arquitetura computacional com uma memória endereçável por palavra O modelo de memória MIPS é no entanto endereçável por byte e não endereçável por palavra Cada byte de dado possui um único endereço Uma palavra de 32 Capítulo seis Arquitetura 428 bits consiste em quatro bytes de 8bits Então cada palavra de endereço é um múltiplo de 4 como mostrado na Figura 62 Novamente tanto a palavra de endereço de 32 𝑏𝑖𝑡𝑠 quanto o valor do dado são dados em hexadecimal O Exemplo de Código 68 mostra como ler e escrever palavras numa memória MIPS endereçável por byte A palavra de endereço é igual a quatro vezes o número da palavra O código assembly MIPS lê as palavras 0 2 e 3 e escreve as palavras 1 8 e 100 O offset pode ser escrito em decimal ou em hexadecimal A arquitetura MIPS também fornece as instruções lb e sb que carregam e armazenam bytes individuais na memória ao invés de palavras Eles são similares a lw e sw e serão discutidos mais profundamente na Seção 645 Memórias endereçáveis por byte são organizadas nos estilos bigendian e littleendian como mostrado na Figura 63 Em ambos os formatos o byte mais significativo MSB está à esquerda e o byte menos significativo LSB está à direita Em máquinas bigendian os bytes são numerados começando com 0 no byte mais significativo big end Em máquinas littleendian os bytes são numerados partindo do zero no menos significativo little end Os endereços de palavras são os mesmos em ambos os formatos e referemse aos mesmos quatro bytes Apenas os endereços dos bytes dentro de uma mesma palavra diferem Exemplo de Código 68 ACESSANDO A MEMÓRIA ENDEREÇÁVEL POR BYTE Código assembly MIPS lw s0 00 lê a palavra de dado 0 0xABCDEF78 em s0 lw s1 80 lê a palavra de dado 2 0x01EE2842 em s1 lw s2 OxC0 lê a palavra de dado 3 0x40F30788 em s2 sw s3 40 escreve s3 para a palavra de dado 1 sw s4 0x200 escreve s4 para a palavra de dado 8 sw s5 4000 escreve s5 para a palavra de dado 100 Figura 63 Endereçamentos de memória big e littleendian Capítulo seis Arquitetura 429 Exemplo 62 MEMÓRIAS BIG E LITTLEENDIAN Suponha que s0 inicialmente contém 0𝑥23456789 Após rodar o programa a seguir num sistema bigendian qual o valor contido em s0 E num sistema littleendian lb s0 10 carrega o dado do byte de endereçamento 10 1 para o byte menos significativo de s0 lb será discutido em detalhes na Seção 645 sw s0 00 lb s0 10 Solução A Figura 64 mostra como as máquinas big e littleendian armazenam o valor 0𝑥23456789 na palavra de memória 0 Após a instrução de carregamento de byte lb s0 1 0 s0 deveria conter 0𝑥00000045 num sistema bigendian e 0𝑥00000067 num sistema littleendian Figura 64 Armazenamento de dados big e Littleendian A PowerPC da IBM antigamente encontrada em computadores Macintosh utiliza endereçamento bigendian A arquitetura Intel x86 encontrada em PC utiliza endereçamento little endian Alguns processadores MIPS são littleendian e alguns são bigendian A escolha é completamente arbitrária mas leva a dificuldades quando dados são compartilhados entre computadores bigendian e littleendian Nos exemplos deste texto utilizaremos o formato little endian sempre que a ordem dos bytes for importante Os termos bigendian e littleendian vêm das Viagens de Gulliver de Jonathan Swift publicadas pela primeira vez em 1726 sob o pseudónimo de Isaac Bickerstaff Em suas histórias o rei Lilliputian exigia que os seus cidadãos os LittleEndians quebrassem os ovos do lado pequeno Os bigendians eram os rebeldes que quebravam os seus ovos do lado grande Os termos foram usados pela primeira vez na arquiteturas de computadores por Danny Cohen no seu artigo On Holy Wars and a Plea for Peace publicado em Abril de 1980 USC ISI IEN 137 Foto cedida por The Brotherton Collection IEEDS University Library Capítulo seis Arquitetura 430 Na arquitetura MIPS os endereços para lw e sw devem ser alinhados Ou seja o endereço deve ser divisível por 4 Assim a instrução lw s0 7 0 é uma instrução ilegal Algumas arquiteturas como a x86 permitem a leitura e escrita de dados de palavras não alinhadas mas a MIPS requer um rigoroso alinhamento por simplicidade É claro bytes de endereços para carregar um byte ou armazenar um byte lb e sb não precisam ser alinhados Constantes Imediatos As instruções de carregamento e armazenamento de palavras lw e sw também ilustram o uso de constantes em instruções MIPS Essas constantes são chamadas de imediatos pois seus valores estão imediatamente disponíveis a partir da instrução e não é necessário nenhum registrador ou acesso à memória Adicionar imediato addi é outra instrução MIPS comum que utiliza um operando imediato addi adiciona o imediato especificado na instrução ao valor num registrador como mostrado no Exemplo de Código 69 Exemplo de Código 69 OPERANDOS IMEDIATOS Código de Alto nível a a 4 b a 12 Código assembly MIPS s0 a s1 b addi s0 s0 4 a a 4 addi s1 s0 12 b a 12 O imediato especificado numa instrução é um número de 16bits complemento2 na faixa entre 32768 a 32767 A subtração é equivalente à adição de um número negativo então no interesse da simplicidade não existe uma instrução subi na arquitetura MIPS Lembrese que as instruções add e sub utilizam três operandos registradores Mas as instruções lw sw e addi utilizam dois operandos registradores e uma constante Devido aos formatos das instruções serem diferentes as instruções lw e sw violam o princípio de projeto 1 simplicidade favorece regularidade No entanto este problema permite introduzir o próximo princípio de projeto Capítulo seis Arquitetura 431 Princípio de projeto 4 Bons projetos demandam bons compromissos Um único formato de instrução poderia ser simples mas não flexível O conjunto de instruções MIPS faz o compromisso de suportar três formatos de instrução Um formato utilizado por instruções como add e sub possui três operandos registradores Outra utilizada por instruções como lw e addi possui dois operandos registradores e um imediato de 16bits Uma terceira que será discutida posteriormente possui um imediato de 26bits e não possui registradores A próxima Seção discute os três formatos de instrução MIPS e mostra como eles são codificados em binário 63 LINGUAGEM DE MÁQUINA A linguagem assembly é conveniente para ser lida por seres humanos No entanto circuitos digitais entendem apenas 1𝑠 e 0𝑠 Portanto um programa escrito em linguagem assembly é traduzido de mnemônicos para uma representação utilizando apenas 0𝑠 e 1𝑠 denominada linguagem de máquina A arquitetura MIPS utiliza instruções de 32bits Novamente simplicidade favorece a regularidade e a escolha mais regular é a de codificar todas as instruções em palavras que possam ser armazenadas na memória Apesar de algumas instruções não necessitarem de 32bits de codificação instruções de comprimento variável podem adicionar muita complexidade A simplicidade também encoraja um formato de instrução individual mas como mencionado anteriormente isso é muito restritivo A MIPS faz o compromisso de definir três formatos de instrução TipoR TipoI e TipoJ Esse pequeno número de formatos proporciona certa regularidade entre todos os tipos e portanto um hardware mais simples e ao mesmo tempo incorporam diferentes necessidades de instrução como a de codificar grandes constantes na instrução Instruções tipoR operam em três registradores Instruções tipoI operam em dois registradores e um imediato de 16bits Instruções tipoJ jump operam num imediato de 26bits Introduziremos todos os três formatos nessa Seção mas deixaremos a discussão das instruções tipoJ para a Seção 642 Capítulo seis Arquitetura 432 631 Instruções TipoR O nome tipoR é uma abreviação para tipo registrador Instruções tipoR utilizam três registradores como operandos dois como fonte e um como destino A Figura 65 mostra o formato de instrução de máquina tipoR a instrução de 32bits possui seis campos op rs rt rd shamt e funct Cada campo é de cinco ou seis bits como indicado Figura 65 Formato de instrução de máquina A operação que a instrução realiza é codificada nos dois campos destacados em azul op também chamado opcode ou código de operação e funct também chamado de função Todas as instruções tipoR possuem um opcode de 0 A operação específica tipoR é determinada pelo campo field Por exemplo os campos opcode e funct para a instrução add são 0 0000002 e 32 1000002 respectivamente Similarmente a instrução sub possui os campos opcode e funct de 0 e 34 Os operandos são codificados em três campos rs rt e rd Os primeiros dois registradores rs e rt são os registradores fonte rd é o registrador de destino Os campos contêm o número de registradores que foram dados na Tabela 61 Por exemplo s0 é o registrador 16 O quinto campo shamt é utilizado apenas em operações de deslocamento Nestas instruções o valor binário armazenado no campo de 5bits shamt indica a quantidade do deslocamento Para todas as outras instruções tipoR shamt é 0 A Figura 66 mostra o código de máquina para as instruções tipoR add e sub Note que o destino é o primeiro registrador numa instrução de linguagem assembly mas é o terceiro campo numa instrução de linguagem de máquina Por exemplo a instrução em assembly add s0 s1 s2 tem rs s1 17 rt s2 18 e rd s0 16 Capítulo seis Arquitetura 433 Para as instruções MIPS utilizadas neste livro as Tabela B1 e Tabela B2 no apêndice Erro A origem da referência não foi encontrada definem os valores dos opcodes para todas as instruções e os valores do campo funct para instruções tipoR Figura 66 Código de máquina para instruções TipoR Exemplo 63 TRADUZINDO LINGUAGEM ASSEMBLY EM LINGUAGEM DE MÁQUINA Traduza em linguagem de máquina a seguinte declaração em linguagem assembly add t0 s4 s5 Solução De acordo com a Tabela 61 t0 s4 e s5 são os registradores 8 20 e 21 De acordo com as Tabela B1 e Tabela B2 add possui um opcode de 0 e um código funct de 32 Assim os campos e o código de máquina são dados na Figura 67 O modo mais fácil de escrever a linguagem de máquina em hexadecimal é primeiro escrevêla em binário e então separála em grupos consecutivos de 4bits os quais correspondem a dígitos hexadecimais indicados em azul Consequentemente a instrução em linguagem de máquina é 0𝑥02954020 Figura 67 Código de máquina para instruções tipoR do Exemplo 63 632 Instruções TipoI O nome TipoI é uma abreviação para tipo imediato Instruções tipoI utilizam dois operandos registradores e um operando imediato A Figura 68 mostra o formato de instrução de máquina tipoI Capítulo seis Arquitetura 434 A instrução de 32bits possui quatro campos op rs rt e imm Os primeiros três campos op rs e rt são como aquelas instruções do tipoR o campo imm mantém um imediato de 16 𝑏𝑖𝑡𝑠 A operação é determinada exclusivamente pelo opcode destacado em azul Os operandos são especificados em três campos rs rt e imm rs e imm são sempre utilizados como operandos fonte rt é utilizado como destino por algumas instruções como addi e lw mas também como outra fonte por outras como sw A Figura 69 mostra muitos exemplos de codificação de instruções tipoI Lembrese que valores negativos em imediatos são representados utilizandose notação de 16bits com complemento2 Numa instrução de linguagem assembly rt é listado primeiro quando utilizado como destino mas é o segundo campo de registrador numa instrução de linguagem de máquina Figura 68 Formato de instrução tipoI Figura 69 Código de máquina para instruções tipoI rs é uma abreviação para register source rt vem alfabeticamente após rs e usualmente indica o segundo registrador fonte Capítulo seis Arquitetura 435 Exemplo 64 TRADUZINDO INSTRUÇÕES ASSEMBLY TIPOI EM CÓDIGO DE MÁQUINA Traduza a seguinte instrução tipoI em código de máquina lw s3 24 s4 Solução De acordo com a Tabela 61 s3 e s4 são os registradores 19 e 20 respectivamente A Tabela B1 indica que lw possui um opcode de 35 rs especifica o endereço de base s4 e rt especifica o registrador de destino s3 O imediato imm codifica o offset de 16bits 24 Os campos e os códigos de máquina são dados na Figura 610 Figura 610 Código de máquina para uma instrução tipoI Instruções tipoI possuem um campo de imediato de 16bits mas os imediatos são utilizados em operações de 32 𝑏𝑖𝑡𝑠 Por exemplo lw adiciona um offset de 16bits a um registrador de base de 32 bits O que deveria ir à parte superior dos 32bits Para imediatos positivos a parte superior deveria estar toda de 1𝑠 Lembrese da Seção 146 que isso é chamado de extensão de sinal Um número de Nbits em complemento2 tem o sinal estendido para um número de Mbits M N copiandose o bit de sinal bit mais significativo do número de Nbits para todos os bits superiores do número de Mbits Estendendose o sinal de um número em complemento2 não muda o seu valor A maioria das instruções MIPS estende o sinal do imediato Por exemplo addi lw e sw fazem extensão de sinal para suportar tanto imediatos positivos quanto negativos Uma exceção a essa regra é que operações lógicas andi ori xori põem 0𝑠 na parte superior isso é chamado extensão de zeros ao invés de extensão de sinal Operações lógicas serão melhor discutidas na Seção 641 Capítulo seis Arquitetura 436 633 Instruções TipoJ O nome tipoJ é uma abreviação para tipo salto jump Esse formato é utilizado apenas em instruções de salto vide Seção 642 Esse formato de instrução utiliza um único operando de endereço de 26bits addr como mostrado na Figura 611 Assim como outros formatos as instruções tipoJ iniciamse com um opcode de 6 bits Os bits remanescentes são utilizados para especificar o endereço addr Uma discussão mais profunda e alguns exemplos e códigos de máquina de instruções tipoJ serão dados nas Seções 642 e 65 634 Interpretando Códigos em Linguagem de Máquina Para interpretar linguagem de máquina primeiro devemse decifrar os campos em cada palavra de instrução de 32bits Diferentes instruções utilizam diferentes formatos mas todos os formatos iniciamse com um campo de opcode de 6bits Se ele é 0 a instrução é do tipoR Caso contrário ele é do tipoI ou do tipoJ Exemplo 65 TRADUZINDO LINGUAGEM DE MÁQUINA EM LINGUAGEM ASSEMBLY Traduza o seguinte código em linguagem de máquina para linguagem assembly 0𝑥2237𝐹𝐹𝐹1 0𝑥02𝐹34022 Solução Primeiramente nós representamos cada instrução em binário e então olhamos os seis bits mais significativos para encontrar o opcode de cada instrução como mostrado na Figura 612 O opcode determina como interpretar os bits restantes Os opcodes são 0010002 810 e 0000002 010 indicando uma instrução addi e uma instrução tipoR respectivamente O campo funct da instrução tipoR é 1000102 3410 indicando uma instrução sub A Figura 612 mostra o código assembly equivalente para as duas instruções de máquina 635 A Potência do Programa Armazenado Um programa escrito em linguagem de máquina é uma série de números de 32bits que representam as instruções Assim como outros números binários essas instruções podem ser armazenadas na memória Esse é o conceito de programa armazenado e é uma razão chave do Capítulo seis Arquitetura 437 porquê de os computadores serem tão poderosos Rodar um programa diferente não requer grandes quantidades de tempo e esforço para reconfigurar ou remontar o hardware apenas requer a escrita de um novo programa na memória Ao invés de hardware dedicado o programa armazenado oferece computação de propósito geral Desse modo um computador consegue executar aplicações que vão de uma calculadora a um processador de texto ou a um player de vídeo apenas mudando o programa armazenado Instruções num programa armazenado são recuperadas ou buscadas na memória e executadas no processador Mesmo programas grandes e complexos são simplificados numa série de leituras de memória e execução de instruções Figura 611 Formato de instrução tipoJ Figura 612 Tradução de código de máquina para código assembly A Figura 613 mostra como as instruções de máquina são armazenadas na memória Em programas MIPS as instruções são normalmente armazenadas partindo do endereço 0𝑥00400000 Lembrese que a memória MIPS é endereçável por byte então instruções de 32bits 4bytes avançam 4 bytes não 1 Capítulo seis Arquitetura 438 Para rodar ou executar o programa armazenado o processador busca as instruções na memória sequencialmente As instruções buscadas são então descodificadas e executadas pelo hardware digital O endereço da instrução atual é mentido num registrador de 32 𝑏𝑖𝑡𝑠 chamado contador de programa program counter PC O PC é separado dos 32registradores mostrados anteriormente na Tabela 61 Para executar o código na Figura 613 o sistema operacional coloca no PC o endereço 0𝑥00400000 O processador lê a instrução naquele endereço de memória e executa a instrução 0𝑥8𝐶0𝐴0020 O processador então incrementa o PC em 4 para 0𝑥00400004 recuperando e executando aquela instrução e se repete O estado arquitetural de um microprocessador mantém o estado de um programa Para a MIPS o estado arquitetural consiste num banco de registradores e o PC Se o sistema operacional salva o estado arquitetural em algum ponto de um programa ele pode interromper o programa fazer outra coisa e em seguida retornar ao estado tal que o programa continue corretamente sem notar que ele tenha sido interrompido alguma vez O estado arquitetural será também de grande importância quando nós construirmos um microprocessador no Capítulo 7 Figura 613 Programa armazenado Capítulo seis Arquitetura 439 64 PROGRAMANDO Linguagens de software tais como C ou Java são chamadas linguagens de programação de alto nível pois são escritas num nível maior de abstração do que a linguagem assembly Muitas linguagens de alto nível utilizam construtores de software comuns como operações lógicas e aritméticas declarações ifelse loops for e while indexação de arrays e chamadas de função Veja o Apêndice C para mais exemplos desses construtores em C Nesta Seção exploraremos como traduzir esses construtores de alto nível em código assembly MIPS 641 Instruções AritméticasLógicas A arquitetura MIPS define uma variedade de instruções lógicas e aritméticas Definimos brevemente essas instruções aqui pois elas são necessárias para implementar construtores de níveis mais altos Instruções Lógicas Operações lógicas MIPS incluem and or xor e nor Essas instruções tipoR operam bit a bit em dois registradores fonte e escrevem o resultado num registrador destino A Figura 614 mostra exemplos dessas operações com os dois valores fonte 0𝑥𝐹𝐹𝐹𝐹0000 e 0𝑥46𝐴1𝐹0𝐵7 A figura mostra os valores armazenados no registrador destino rd após a execução da instrução A instrução and é útil para mascarar os bits isto é forçar bits indesejados para o valor 0 Por exemplo na Figura 614 0𝑥𝐹𝐹𝐹𝐹0000 𝐴𝑁𝐷 0𝑥46𝐴1𝐹0𝐵7 0𝑥46𝐴10000 A instrução and mascara os dois bytes inferiores e coloca os dois bytes superiores de s2 0𝑥46𝐴1 em s3 Qualquer subconjunto de bits de registradores pode ser mascarado A instrução or é útil para combinar bits de dois registradores Por exemplo 0𝑥347𝐴0000 OR 0𝑥000072𝐹𝐶 0𝑥347𝐴72𝐹𝐶 uma combinação dois dois valores A arquitetura MIPS não disponibiliza uma instrução 𝑁𝑂𝑇 mas 𝐴 𝑁𝑂𝑅 0 𝑁𝑂𝑇 𝐴 então a instrução 𝑁𝑂𝑅 pode ser uma substituta Ada Lovelace 1815 1852 Escreveu o primeiro programa de computador que calculava os números de Bernoulli utilizando a máquina analítica de Charles Babbage Ela foi a única criança legítima do poeta Lord Byron Capítulo seis Arquitetura 440 Figura 614 Programa armazenado Operações lógicas também podem ser operadas em imediatos As instruções do tipoI são andi ori e xori A instrução nori não é disponibilizada pois essa mesma função pode ser facilmente implementada utilizandose outras instruções como será explorado no Exercício 616 A Figura 615 mostra exemplos das instruções andi ori e xori A figura dá os valores do registrador fonte e imediato e o valor do registrador destino rt após a instrução ser executada Devido a estas instruções operarem num valor de 32bits vindo de um registrador e um imediato de 16bits elas primeiro estendem em zeros o imediato para 32bits Figura 615 Operações lógicas com imediatos Capítulo seis Arquitetura 441 Instruções de Deslocamento Instruções de deslocamento deslocam o valor de um registrador para a esquerda ou para a direita em até 31bits Operações de deslocamento multiplicam ou dividem por potências de dois As operações MIPS de deslocamento são sll shift left logical deslocamento lógico à esquerda srl shift right logical deslocamento lógico à direita e sra shift right aritmetic deslocamento aritmético à direita Como discutido na Seção 525 deslocamentos à esquerda sempre preenchem os bits menos significativos com 0𝑠 No entanto deslocamentos à direita podem ser tanto lógicos deslocamento de 0𝑠 para os bits mais significativos ou aritméticos o bit de sinal se desloca para os bits mais significativos A Figura 616 mostra o código de máquina para as instruções tipoR sll srl e sra rt isto é s1 mantém o valor de 32bits a ser deslocado e shamt dá o valor do deslocamento 4 O valor deslocado é colocado em rd A Figura 617 mostra os valores de registradores para as instruções de deslocamento sll srl e sra Deslocando um valor de N à esquerda é equivalente a multiplicalo por 2𝑁 Do mesmo modo deslocar aritmeticamente um valor para N posições à direita é equivalente a dividilo por 2𝑁 como discutido na Seção 525 A arquitetura MIPS também possui instruções de deslocamento de variáveis sllv shift left logical variable deslocamento de variável lógica à esquerda srlv shift right logical variable deslocamento de variável lógica à direita e srav shift right arithmetic variable deslocamento aritmético de variável à direita A Figura 618 mostra o código de máquina para essas instruções Instruções em assembly de deslocamento de variáveis são da forma sllv rd rt rs A ordem de rt e rs é invertida em comparação à maioria das instruções tipoR rt s1 mantém o valor a ser deslocado e os quatro bits menos significativos de rs s2 dão o tamanho do deslocamento O resultado deslocado é colocado em rd como antes O campo shamt é ignorado e deve ser todo composto por 0𝑠 A Figura 619 mostra os valores de registradores para cada tipo de instrução de deslocamento de variável Capítulo seis Arquitetura 442 Figura 616 Códigos de máquina da instrução de deslocamento Figura 617 Operações de deslocamento Figura 618 Código de máquina para instrução de deslocamento variável Capítulo seis Arquitetura 443 Figura 619 Operações de deslocamento variável Gerando Constantes A instrução addi é útil para atribuir constantes de 16bits como mostrado no Exemplo de Código 610 Exemplo de Código 610 CONSTANTE DE 16BITS Código de Alto Nível int a 0x4f3c Código assembly MIPS s0 a addi s0 0 0x4f3c a 0x4f3c Para atribuir constantes de 32bits é utilizada uma instrução de carregamento do imediato superior load upper imediate lui seguida por uma instrução do imediato ori como mostrado no Exemplo de Código 611 A instrução lui carrega um imediato de 16bits na metade superior de um registrador e coloca a metade inferior a 0 Como mencionado anteriormente ori funde um imediato de 16bits com a metade superior o tipo de dado int em C referese a uma palavra com representação de dados inteiros em complemento2 a MIPS utiliza palavras de 32bits então um int representa um número na faixa 231 231 1 Capítulo seis Arquitetura 444 Exemplo de Código 611 CONSTANTE DE 32BITS Código de Alto Nível int a 0x6d5e4f3c Código assembly MIPS s0 a lui s0 0x6d5e a 0x6d5e0000 ori s0 s0 0x4f3x a 0x6d5e4f3c Instruções de Multiplicação e Divisão A multiplicação e a divisão são um pouco diferentes de outras operações aritméticas Multiplicandose dois números de 32 𝑏𝑖𝑡𝑠 é produzido um quociente de 32bits e um resto de 32bits A arquitetura MIPS possui dois registradores de propósitos especiais hi e lo os quais são utilizados para manter os resultados das multiplicações e divisões A instrução mult s0 s1 multiplica os valores em s0 e s1 Os 32bits mais significativos do produto são colocados em hi e os 32bits menos significativos são colocados em lo Similarmente div s0 s1 computa s0s1 O quociente é colocado em lo e o resto é colocado em hi A MIPS disponibiliza outra instrução de multiplicação que produz um resultado de 32bits em um registrador de propósito geral mul s1s2s3 multiplica os valores em s2 e s3 e coloca o resultado de 32 𝑏𝑖𝑡𝑠 em s1 Capítulo seis Arquitetura 445 642 Desvios Branching Uma vantagem de um computador sobre uma calculadora é sua habilidade de tomar decisões Um computador realiza diferentes tarefas dependendo da entrada Por exemplo declarações ifelse declarações switchcase loops while e loops for todos eles executam condicionalmente um código dependendo de algum teste Para executar instruções sequencialmente o contador de programa é incrementado em 4 após cada instrução Instruções do tipo branch ramificação modificam o contador de programa a fim de pular seções de código ou repetir códigos anteriores Instruções de branch condicional realizam um teste e o programa é desviado se o teste for TRUE Instruções de branch incondicional chamadas jumps ou saltos sempre fazem o programa ser desviado Desvios Condicionais O conjunto de instruções MIPS possui duas instruções de desvios condicionais desviar se igual branch if equal beq e desviar se não igual branch if note qual bne A instrução beq desvia o programa quando os valores nos dois registradores são iguais e a instrução bne desvia quando eles não são iguais O Exemplo de Código 612 ilustra o uso da instrução beq Note que os desvios são escritos como beq rs rt imm onde rs é o primeiro registrador fonte Para a maioria das instruções tipoI essa ordem é invertida Quando o programa do Exemplo de Código 612 alcança o desvio da instrução se igual beq o valor em s0 é igual ao valor em s1 então o desvio é realizado Isto é a próxima instrução a ser executada é a instrução add logo após o label rótulo chamado target As duas instruções diretamente após o desvio e antes da label não são executadas O código assembly utiliza labels para indicar as localizações das instruções no programa Quando o código assembly é traduzido em linguagem de máquina essas labels são traduzidos em endereços de instruções veja a Seção 55 As labels da linguagem assembly são seguidas de dois pontos e não podem utilizar palavras reservadas como mnemônicos de instrução A maioria dos programadores indenta as suas instruções mas não as labels para ajudar a destacalas hi and lo não estão entre os 32 registradores MIPS usuais então instruções especiais são necessárias para acessálos mfhi s2 move de hi copia o valor em hi para s2 mflo s3 move de lo copia o valor em lo para s3 hi e lo são tecnicamente parte do estado arquitetural No entanto nós geralmente ignoramos esses registradores neste livro Capítulo seis Arquitetura 446 O Exemplo de Código 613 mostra um exemplo de utilização do desvio com a instrução se não igual bne Nesse caso o desvio não é feito pois s0 é igual a s1 e o código continua a ser executado diretamente após a instrução bne Todas as instruções nesse fragmento de código são executadas Exemplo de Código 612 DESVIO CONDICIONAL UTILIZANDO BEQ Código assembly MIPS addi s0 0 4 s0 0 4 4 addi s1 0 1 s1 0 1 1 sll s1 s1 2 s1 1 2 4 beq s0 s1 target s0 s1 o desvio é tomado addi s1 s1 1 não executado sub s1 s1 s0 não executado target add s1 s1 s0 s1 4 4 8 Exemplo de Código 613 DESVIO CONDICIONAL UTILIZANDO BNE Código assembly MIPS addi s0 0 4 s0 0 4 4 addi s1 0 1 s1 0 1 1 s11 s1 s1 2 s1 1 2 4 bne s0 s1 target s0 s1 o desvio não é tomado addi s1 s1 1 s1 4 1 5 sub s1 s1 s0 s1 5 4 1 Capítulo seis Arquitetura 447 target add s1 s1 s0 s1 1 4 5 Salto Um programa pode incondicionalmente fazer um salto utilizando os três tipos de instruções salto jump j salto e ligação jump and link jal e salto e registro jump and register jr A instrução jump j salta diretamente para a instrução especificada na label A instrução jal é similar à j mas é utilizada por funções para salvar um endereço de retorno como será discutido na Seção 646 A instrução jr salta para o endereço mantido no registrador O Exemplo de Código 614 mostra o uso da instrução jump j Após a instrução j target o programa no Exemplo de Código 614 incondicionalmente continua a executar a instrução add no label target Todas as instruções entre o salto e o label são ignoradas Exemplo de Código 614 DESVIO INCONDICIONAL UTILIZANDO J Código assembly MIPS addi s0 0 4 s0 4 addi s1 0 1 s1 1 j target salta para target addi s1 s1 1 não executado sub s1 s1 s0 não executado target add s1 s1 s0 s1 1 4 5 j e jal são instruções do tipoJ jr é uma instrução do tipoR que utiliza apenas o operando rs Capítulo seis Arquitetura 448 Exemplo de Código 615 DESVIO INCONDICIONAL UTILIZANDO JR Código assembly MIPS 0x00002000 addi s0 0 0x2010 s0 0x2010 0x00002004 jr s0 jump to 0x00002010 0x00002008 addi s1 0 1 não executado 0x0000200c sra s1 s1 2 não executado 0x00002010 lw s3 44s1 executado após instrução jr O Exemplo de Código 615 mostra o uso da instrução de salto de registrador jr Os endereços das instruções são dados à esquerda de cada instrução jr s0 salta para o endereço armazenado em s0 0𝑥00002010 643 Declarações Condicionais Declarações if ifelse e switchcase são declarações condicionais comumente utilizadas em linguagens de altonível Cada uma delas executa um bloco de código consistindo de uma ou mais declarações Esta Seção mostra como traduzir essas construções de alto nível em linguagem assembly MIPS Declarações If Uma declaração if executa um bloco de código o bloco if apenas se uma condição é alcançada O Exemplo de Código 616 mostra como traduzir uma declaração if em código assembly MIPS Capítulo seis Arquitetura 449 Exemplo de Código 616 DECLARAÇÃO IF Linguagem de Alto Nível if i j f g h f f i Código assembly MIPS s0 f s1 g s2 h s3 i s4 j bne s3 s4 L1 se i j salta bloco if add s0 s1 s2 bloco if f g h L1 sub s0 s0 s3 f f i O código assembly para a declaração if testa a condição oposta àquela no código de alto nível No Exemplo de Código 616 a linguagem de alto nível testa se i j e o código assembly testa se i j A instrução bne desvia ignora o bloco if quando i j Caso contrário i j o desvio não é realizado e o bloco if é executado como desejado Declarações Ifelse Declarações ifelse executam um dos dois blocos de código dependendo de uma condição Quando a condição na declaração if é alcançada o bloco if é executado De outro modo o bloco else é executado O Exemplo de Código 617 mostra um exemplo de declarações ifelse Assim como as declarações if o código assembly para ifelse testa a condição oposta àquela no código de alto nível Por exemplo no Exemplo de Código 617 o código de alto nível testa se ij O código assembly testa a condição contrária i j Se a condição oposta é TRUE a instrução bne ignora o bloco if e executa o bloco else Caso contrário o bloco if é executado e termina com a instrução de salto j para pular o bloco else Capítulo seis Arquitetura 450 Exemplo de Código 617 DECLARAÇÃO IFELSE Código de Alto Nível if i j f g h else f f i Código assembly MIPS s0 f s1 g s2 h s3 i s4 j bne s3 s4 else se i j salta para else add s0 s1 s2 bloco if f g h j L2 pula o bloco else else sub s0 s0 s3 bloco else f f i L2 Declarações switchcase Declarações switchcase executam um bloco de código dentre muitos dependendo das condições Se nenhuma condição foi alcançada o bloco default é executado Uma declaração case é equivalente a uma série de declarações ifelse umas dentro das outras O Exemplo de Código 618 mostra dois fragmentos de códigos de alto nível com a mesma funcionalidade eles calculam a taxa de um caixa eletrônico para saques de 20 50 ou 100 como definido por amount A implementação em assembly MIPS é a mesma para ambos os fragmentos de código de alto nível Exemplo de Código 618 DECLARAÇÃO SWITCHCASE Código de Alto Nível switch amount case 20 fee 2 break Código assembly MIPS s0 amount s1 fee case20 Capítulo seis Arquitetura 451 case 50 fee 3 break case 100 fee 5 break default fee 0 função equivalente utilizando declarações ifelse if amount 20 fee 2 else if amount 50 fee 3 else if amount 100 fee 5 else fee 0 addi t0 0 20 t0 20 bne s0 t0 case50 amount 20Se não pular para case50 addi s1 0 2 Se sim fee 2 j done e sai do bloco case case50 addi t0 0 50 t0 50 bne s0 t0 case100 amount 50 Se não pula para case100 addi s1 0 3 se sim fee 3 j done e sai do bloco case case100 addi t0 0 100 t0 100 bne s0 t0 default amount 100Se não pula para default addi s1 0 5 se sim fee 5 j done e sai do bloco case default add s1 0 0 fee 0 done 644 Entrar em Ciclo Os ciclos repetidamente executam um bloco de código dependendo de uma condição Os loops e loops while são construções de ciclo comuns usadas por linguagens de alto nível Esta Seção mostra como traduzilas em linguagem assembly MIPS Capítulo seis Arquitetura 452 Loops While Loops while executam repetidamente um bloco de código até que uma condição seja não satisfeita O loop while no Exemplo de Código 619 determina o valor de x tal que 2𝑥 128 Ele é executado sete vezes até pow 128 Assim como declarações ifelse o código assembly para loops while testa a condição oposta à uma fornecida num código de alto nível Se aquela condição é TRUE o loop while é terminado Exemplo de Código 619 LOOP WHILE Código de Alto nível int pow 1 int x 0 while pow 128 pow pow 2 x x 1 Código assembly MIPS s0 pow s1 x addi s0 0 1 pow 1 addi s1 0 0 x 0 addi t0 0 128 t0 128 for comparison while beq s0 t0 done se pow 128 sair while loop sll s0 s0 1 pow pow 2 addi s1 s1 1 x x 1 j while done No Exemplo de Código 619 o loop while compara pow a 128 e sai do loop se existe igualdade Caso contrário ele dobra pow utilizando o deslocamento à esquerda incrementa x e volta para o início do loop while Capítulo seis Arquitetura 453 Loops for Os loops for assim como loops while executam repetidamente um bloco de código até que uma condição não seja aceite No entanto os loops for possuem suporte para uma variável de loop que tipicamente mantém o controle do número de execuções do loop Uma forma geral para o loop for é for initialization condition loop operation statement O código initialization é executado antes do loop for começar A condition é testada no início de cada loop Se a condição não é verificada o loop termina A loop operation é executada ao final de cada loop O Exemplo de Código 620 adiciona os números de 0 a 9 A variável de loop neste caso i é inicializada com valor 0 e é incrementada no final de cada iteração No início de cada iteração o loop for é executado apenas quando i é diferente de 10 Caso contrário o loop é finalizado Neste caso o loop for é executado 10 vezes Os loops for podem ser implementados utilizandose loops while mas o loop for é muitas vezes mais conveniente Comparação de Magnitude Até aqui os exemplos têm utilizado beq e bne para realizar comparações de igualdade ou desigualdade e desvios A arquitetura MIPS disponibiliza a instrução set less than a menos de slt para comparação de magnitude A instrução slt coloca rd a 1 quando rs rt Caso contrário rd é 0 Exemplo de Código 620 LOOP FOR Código de Alto Nível int sum 0 Código assembly MIPS s0 i s1 sum add s1 0 0 sum 0 addi s0 0 0 i 0 Os loops do while são similares aos loops while exceto que eles executam o corpo do loop uma vez antes de verificar a condição Eles são da forma do statement while condition Capítulo seis Arquitetura 454 for i 0 i 10 i i 1 sum sum i equivalent to the following while loop int sum 0 int i 0 while i 10 sum sum i i i 1 addi t0 0 10 t0 10 for beq s0 t0 done se i 10 pula para fim add s1 s1 s0 sum sum i addi s0 s0 1 incrementa i j for done Exemplo 66 LOOPS UTILIZANDO SLT O código de alto nível abaixo soma as potências de 2 de 1 até 100 Traduzao para linguagem assembly código de alto nível int sum 0 for i 1 i 101 i i 2 sum sum i Solução O código em linguagem assembly utiliza a instrução slt para realizar a comparação de menor que no loop for código assembly MIPS s0 i s1 sum addi s1 0 0 sum 0 addi s0 0 1 i 1 addi t0 0 101 t0 101 Capítulo seis Arquitetura 455 loop slt t1 s0 t0 if i 101 t1 1 else t1 0 beq t1 0 done if t1 0 i 101 pula para fim add s1 s1 s0 sum sum i sll s0 s0 1 i i 2 j loop done O Exercício 617 explora como utilizar a instrução slt para outras comparações de magnitude incluindo maior maior ou igual e menor ou igual 645 Arrays Os arrays são úteis para se acessar grandes quantidades de dados similares Um array é organizado como endereços sequenciais de dados na memória Cada elemento do array é identificado por um número chamado de index O número de elementos de um array é chamado dimensão do array Esta Seção mostra como acessar elementos de array na memória Indexação de Arrays A Figura 620 mostra um array de cinco elementos armazenados na memória O index varia de 0 a 4 Nesse caso o array é armazenado na memória principal do processador começando do endereço base 0𝑥10007000 O endereço base corresponde ao endereço do primeiro elemento do array array0 O Exemplo de Código 621 multiplica os dois primeiros elementos do array por 8 e os armazena novamente no array Capítulo seis Arquitetura 456 Figura 620 Array de cinco elementos com endereço de base 0x10007000 Exemplo de Código 621 ACESSANDO ARRAYS Código de Alto Nível int array5 array0 array0 8 array1 array1 8 Código assembly MIPS s0 base address of array lui s0 0x1000 s0 0x10000000 ori s0 s0 0x7000 s0 0x10007000 lw t1 0s0 t1 array0 sll t1 t1 3 t1 t1 3 t1 8 sw t1 0s0 array0 t1 Iw t1 4s0 t1 array1 sll t1 t1 3 t1 t1 3 t1 8 sw t1 4s0 array1 t1 Capítulo seis Arquitetura 457 O primeiro passo para o acesso de um elemento de array é carregar o endereço base do array num registrador O Exemplo de Código 621 carrega o endereço base em s0 Lembrese que as instruções lui carregar imediato superior e ori or imediato podem ser utilizadas para carregar uma constate de 32 𝑏𝑖𝑡𝑠 num registrador O Exemplo de Código 621 também ilustra o porquê de lw tomar um endereço de base e um offset O endereço de base é o ponto de partida do array Por exemplo array1 é armazenado no endereço de memória 0𝑥10007004 uma palavra de quatro bytes após array0 então é acessada por um offset de 4 após o endereço de base O leitor deve ter notado que o código para manipular cada um dos dois elementos de array no Exemplo de Código 621 é essencialmente o mesmo exceto pelo index Duplicar o código não é um problema quando dois elementos array são acessados mas isso pode se tornar terrivelmente ineficiente para acessar todos os elementos num array grande O Exemplo de Código 622 utiliza um loop for para multiplicar por 8 todos os 1000 elementos de um array armazenado no endereço base 0𝑥23𝐵8𝐹000 A Figura 621 mostra o array de 1000 elementos na memória O index do array é agora uma variável i ao invés de uma constante então não podemos tirar vantagem do offset imediato em lw Ao invés disso nós computamos o endereço do iésimo elemento e o armazenamos em t0 Lembrese que cada elemento de array é uma palavra mas a memória é endereçável por byte então o offset do endereço de base é i 4 Deslocar de 2 para a esquerda é um modo conveniente de multiplicação por 4 na linguagem assembly MIPS Esse exemplo pode ser estendido prontamente para um array de qualquer dimensão Exemplo de Código 622 ACESSANDO ARRAYS UTILIZANDO UM LOOP FOR Código de Alto Nível int i int array1000 Código assembly MIPS s0 enredeço de base do array s1 i código de inicialização lui s0 0x23B8 s0 0x23B80000 Capítulo seis Arquitetura 458 for i 0 i 1000 i i 1 arrayi arrayi 8 ori s0 s0 0xF000 s0 0x23B8F000 addi s1 0 0 i 0 addi t2 0 1000 t2 1000 loop slt t0 s1 t2 i 1000 beq t0 0 done se não então fim sll t0 s1 2 t0 i4 byte offset add t0 t0 s0 endereço de arrayi lw t1 0t0 t1 arrayi sll t1 t1 3 t1 arrayi 8 sw t1 0t0 arrayi arrayi 8 addi s1 s1 1 i i 1 j loop repete done Figura 621 Mantendo o elemento array1000 em memória partindo do endereço base 0x23B8F000 Capítulo seis Arquitetura 459 Bytes e Caracteres Os números na faixa de 128 a 127 podem ser armazenados num único byte ao invés de numa palavra inteira Como existem muito menos do que 256 caracteres na língua inglesa caracteres ingleses são frequentemente representados por bytes A linguagem C utiliza o tipo char para representar um byte ou caractere Os primeiros computadores careciam de um mapeamento padrão entre bytes e caracteres da língua inglesa então trocar textos entre computadores era uma tarefa difícil Em 1963 a Associação Americana de Padronização publicou o Código Padrão Americano para o Intercâmbio de Informação American Standard Code for Information Interchange ASCII o qual atribuía a cada caractere de texto um valor único de byte A Tabela 62 mostra essa codificação de caracteres para caracteres imprimíveis Os valores ASCII são dados em hexadecimal Letras em caixa alta e caixa baixa diferem de 0x20 32 A linguagem assembly MIPS disponibiliza instruções de carregar byte e armazenar byte para manipular bytes ou caracteres de dados carregar byte sem sinal load byte unsigned lbu carregar byte load byte lb e armazenar byte store byte sb Todos os três estão ilustrados na Figura 622 A instrução carregar byte sem sinal lbu estende o byte em zeros e a instrução carregar byte lb estende o byte em sinal para completar todo o registrador de 32 𝑏𝑖𝑡𝑠 A instrução armazenar byte sb armazena o byte menos significativo do registrador de 32 𝑏𝑖𝑡𝑠 no endereço de memória especificado pelo byte Na Figura 622 lbu carrega o byte do endereço de memória 2 para o byte menos significativo de s1 e completa os bits dos registradores remanescentes com 0 Lb carrega o byte estendido em sinal no endereço de memória 2 em s2 sb armazena o byte menos significativo de s3 na memória do byte 3 isso substitui 0𝑥𝐹7 por 0𝑥9𝐵 Os bytes mais significativos de s3 são ignorados Outras linguagens de programação como Java usam diferentes codificações de caracteres como o Unicode O Unicode utiliza 16bits para representar cada caractere suportando acentos tremas e caracteres asiáticos Para mais informação veja wwwunicodeorg Capítulo seis Arquitetura 460 Tabela 62 Codificação ASCII O código ASCII foi desenvolvido a partir a partir de formas anteriores de codificação de caracteres A partir de 1838 máquinas de telégrafo utilizavam o código Morse uma série de pontos e traços para representar caracteres Por exemplo as letras A B C e D eram representadas como e respectivamente O número de pontos e traços variava com cada letra Para eficiência em cartas comuns eram utilizados códigos curtos Em 1874 Jean Maurice Emile Baudot inventou um código de 5bits chamado código Baudot Por exemplo A B C e D eram representadas como 00011 11001 01110 e 01001 No entanto as 32 possíveis codificações desse código de 5bits não eram suficientes para todos os caracteres em inglês Mas uma codificação de 8bits seria Assim como a comunicação eletrônica tornouse predominante a codificação ASCII de 8 bits emergiu como padrão Capítulo seis Arquitetura 461 Figura 622 Instruções para carregar e armazenar bytes Exemplo 67 UTILIZANDO LB E SB PARA ACESSAR UM ARRAY DE CARACTERES O código de alto nível abaixo converte um array de caractere de dez entradas de letras minúsculas para letras maiúsculas através da subtração de 32 a cada entrada do array Traduza o código em linguagem assembly MIPS Lembrese que a diferença de endereços entre arrays de elementos é agora de 1 byte não 4 bytes Assuma que s0 mantenha o endereço de base para chararray código de alto nível char chararray10 int i for i 0 i 10 i i 1 chararrayi chararrayi 32 Capítulo seis Arquitetura 462 Solução código assembly MIPS s0 endereço de base de chararray s1 i addi s1 0 0 i 0 addi t0 0 10 t0 10 loop beq t0 s1 done if i 10 sai do loop add t1 s1 s0 t1 address of chararrayi lb t2 0t1 t2 arrayi addi t2 t2 32 converte para caixa alta t2 t2 32 sb t2 0t1 armazena o novo valor em array chararrayi t2 addi s1 s1 1 i i1 j loop repete done Uma serie de caracteres é chamada de string As strings possuem comprimento variável logo as linguagens de programação devem oferecer um modo de determinar o comprimento ou o fim da string Em C o caractere null 0𝑥00 significa o fim de uma string Por exemplo Figura 623 mostra a string Hello 0𝑥48 65 6𝐶 6𝐶 6𝐹 21 00 armazenada na memória A string possui o comprimento de sete bytes e se estende do endereço 0𝑥1522𝐹𝐹𝐹0 ao 0𝑥1522𝐹𝐹𝐹6 O primeiro caractere da string H 0𝑥48 é armazenado no byte de endereço mais baixo 0𝑥1522𝐹𝐹𝐹0 Figura 623 String Hello armazenada na memória Capítulo seis Arquitetura 463 646 Chamada de Funções Linguagens de alto nível frequentemente utilizam funções também chamadas procedimentos para reutilizar códigos frequentemente acessados e também para fazer um programa mais modular e legível As funções possuem entradas chamadas argumentos e uma saída chamada valor de retorno As funções calculam o valor de retorno e não causam outros efeitos colaterais indesejáveis Quando uma função chama outra a função chamadora e a função chamada devem concordar em onde colocar os argumentos e os valores de retorno Em MIPS a chamadora convencionalmente coloca até quatro argumentos nos registradores a0 a3 antes de fazer a chamada de função e a função chamada coloca o valor de retorno em registradores v0 v3 antes do final Seguindo essa convenção ambas as funções sabem onde encontrar os argumentos e o valor de retorno mesmo se a chamadora e a chamada foram escritas por diferentes pessoas A função chamada não deve interferir na função chamadora De forma breve isso significa que a chamada deve saber onde retornar depois de completa e ela não deve passar por cima de qualquer registrador ou memória que seja necessário à função chamadora A chamadora armazena o endereço de retorno em ra e ao mesmo tempo salta para a função chamada utilizando a instrução de salto e conexão jal A função chamada não deve sobrescrever nenhum estado arquitetural ou memória a qual a função chamadora dependa Especificamente a função chamada deve deixar os registradores salvos s0 s7 ra e a pilha uma porção de memória utilizada por variáveis temporárias intacta Esta Seção mostra como chamar e retornar valores de uma função Ela também mostra como as funções acessam os argumentos de entrada e retornam valores e como eles utilizam a pilha para armazenar variáveis temporárias Chamadas de Funções e Retornos Em MIPS a instrução salto com conexão jump and link jal é utilizada para chamar uma função e a instrução salto de registrador jump register jr para retornar de uma função O Exemplo de Código Capítulo seis Arquitetura 464 623 mostra a função main chamando a função simple main é a chamadora e simple é a chamada A função simple é chamada sem argumentos e não é gerado valor de retorno ela simplesmente retorna à chamadora No Exemplo de Código 623 os endereços de instrução são dados à esquerda de cada instrução MIPS em hexadecimal Exemplo de Código 623 CHAMADA DE FUNÇÃO SIMPLE Código de Alto Nível int main simple void significa que a função não retorna valores void simple return Código assembly MIPS 0x00400200 main jal simple chamar função 0x00400204 0x00401020 simple jr ra return As instruções salto com conexão jal e salto de registrador jr ra são as duas instruções essenciais necessárias para uma chamada de função jal realiza duas operações armazena o endereço da próxima instrução a instrução após jal no registrador de retorno de endereço e salta para a função alvo No Exemplo de Código 623 a função main chama a função simple através da execução da instrução salto com conexão jal Essa instrução salta para o label simple e armazena 0𝑥00400204 em rs A função simple retorna imediatamente através da execução da instrução jr ra saltando para o endereço de instrução armazenado em ra A função main então continua executando a partir do endereço 0𝑥00400204 Capítulo seis Arquitetura 465 Argumentos de Entrada e Valores de Retorno A função simple no Exemplo de Código 623 não é muito útil pois ela não recebe nenhuma entrada da função chamadora main e não retorna nenhuma saída Pela convenção MIPS funções utilizam a0 a3 para argumentos de entrada e v0 v1 para o valor de retorno No Exemplo de Código 624 a função diffofsums é chamada com quatro argumentos e retorna um resultado De acordo com a convenção MIPS a função chamadora main coloca os argumentos da função da esquerda para a direita nos registradores de entrada a0 a3 A função chamada diffofsums armazena o valor de retorno no registrador de retorno v0 Uma função que retorna um valor de 64bits tal como um número em vírgula flutuante de precisão dupla double utiliza os dois registradores de retorno v0 e v1 Quando uma função com mais de quatro argumentos é chamada os argumentos adicionais de entrada são colocados na pilha como discutiremos adiante Exemplo de Código 624 CHAMADA DE FUNÇÃO COM ARGUMENTOS E VALORES DE RETORNO Código de Alto Nível int main int y y diffofsums2 3 4 5 int diffofsumsint f int g int h int i Código assembly MIPS s0 y main addi a0 0 2 argumento 0 2 addi a1 0 3 argumento 1 3 addi a2 0 4 argumento 2 4 addi a3 0 5 argumento 3 5 jal diffofsums chamada de função add s0 v0 0 y valor de retorno s0 resultado Capítulo seis Arquitetura 466 int result result f g h i return result diffofsums add t0 a0 a1 t0 f g add t1 a2 a3 t1 h i sub s0 t0 t1 resultadof gh i add v0 s0 0 põe valor de retorno em v0 jr ra retorna à chamadora A Pilha A pilha é uma memória utilizada para salvar variáveis locais dentro de uma função A pilha se expande utiliza mais memória conforme o processador precise de mais espaço de trabalho e se contrai utiliza menos memória quando o processador não precisa utilizar mais as variáveis lá armazenadas Antes de explicar como as funções utilizam a pilha para armazenar variáveis locais explicaremos como a pilha funciona A pilha é uma fila do tipo último a entrar primeiro a sair lastinfirstout LIFO Assim como uma pilha de pratos o último item empurrado pushed para a pilha o prato de cima é o primeiro que pode ser retirado popped Cada função pode alocar espaço na pilha para armazenar variáveis locais mas deve libertalo antes do retorno O topo da pilha é o espaço alocado mais recentemente Enquanto uma pilha de pratos cresce em espaço a pilha MIPS decresce em memória A pilha se expande para os menores endereços de memória quando um programa precisa de mais espaço de trabalho A Figura 624 mostra uma foto da pilha O apontador de pilha stack pointer sp é um registrador MIPS especial que aponta para o topo da pilha Um apontador é um nome ilustrativo para um endereço de memória Ele aponta para dado o endereço o dado Por exemplo na Figura 624 a o Capítulo seis Arquitetura 467 apontador de pilha sp mantém o valor de endereço 0𝑥7𝐹𝐹𝐹𝐹𝐹𝐹𝐶 e aponta para o valor de dado 0𝑥12345678 sp aponta para o topo da pilha a memória mais baixa acessível na pilha Assim na Figura 624 a a pilha não pode acessar memórias abaixo da palavra de memória 0𝑥7𝐹𝐹𝐹𝐹𝐹𝐹𝐶 O apontador de pilha sp parte de um endereço de memória alto e o decrementa para se expandir como for necessário A Figura 624 b mostra a expansão de pilha para permitir o armazenamento temporário de mais duas palavras de dados Ao fazer isso sp é decrementado de 8 para se tornar 0𝑥7𝐹𝐹𝐹𝐹𝐹𝐹4 Duas palavras de dados adicionais 0𝑥𝐴𝐴𝐵𝐵𝐶𝐶𝐷𝐷 e 0𝑥11223344 são temporariamente armazenadas na pilha Um dos usos mais importantes da pilha é o de salvar e recuperar registradores que estão sendo utilizados por uma função Lembrese que uma função deve calcular o valor de retorno mas não deve ter nenhum outro efeito colateral não intencional Em particular ela não deve modificar nenhum registrador além daquele que contém o valor de retorno v0 A função diffofsums no Exemplo de Código 624 viola essa regra pois modifica t0 t1 e s0 Se a função main estivesse utilizando t0 t1 ou s0 antes da chamada de diffofsums o conteúdo desses registradores seria corrompido pela chamada de função Para resolver esse problema uma função salva os registradores na pilha antes de os modificar e logo os recupera da pilha antes de retornar os valores Especificamente ela realiza os seguintes passos 1 Abre espaço na pilha para armazenar os valores de um ou mais registradores 2 Armazena os valores dos registradores na pilha 3 Executa as funções utilizando os registradores 4 Recupera os valores originais dos registradores na pilha 5 Liberta o espaço na pilha Figura 624 A pilha Capítulo seis Arquitetura 468 Figura 625 A pilha a antes b depois e c após a chamada da função diffofsums O Exemplo de Código 625 mostra uma versão melhorada de diffofsums que salva e recupera t0 t1 e s0 As novas linhas são indicadas em azul A Figura 625 mostra a pilha antes durante e depois da chamada da função diffofsums do Exemplo de Código 625 diffofsums abre espaço para três palavras na pilha decrementando o apontador de pilha sp em 12 Ela então armazena os valores atuais de s0 t0 e t1 no novo espaço alocado Ela executa o resto da função mudando os valores nesses três registradores Ao final da função diffofsums recupera os valores de s0 t0 e t1 e sp possui os mesmos valores que tinha antes da chamada de função O espaço de pilha que uma função aloca por si só é chamado quadro de pilha stack frame A stack frame de diffofsums contém três palavras O princípio da modularidade diz que cada função deve acessar apenas a seu próprio stack frame e não as frames pertencentes a outras funções Exemplo de Código 625 FUNÇÃO SALVANDO REGISTRADORES NA PILHA Código assembly MIPS s0 result diffofsums Capítulo seis Arquitetura 469 addi sp sp 12 abre espaço na pilha para armazenar três registradores sw s0 8sp salva s0 na pilha sw t0 4sp salva t0 na pilha sw t1 0sp salva t1 na pilha add t0 a0 a1 t0 f g add t1 a2 a3 t1 h i sub s0 t0 t1 result f g h i add v0 s0 0 põe o valor de retorno em v0 lw t1 0sp recupera t1 da pilha lw t0 4sp recupera t0 da pilha lw s0 8sp recupera s0 da pilha addi sp sp 12 liberta espaço na pilha jr ra retorna à chamadora Registradores Preservados O Exemplo de Código 625 assume que registradores temporários t0 e t1 devem ser salvos e recuperados Se as funções chamadoras não utilizarem esses registradores o esforço para salvá los e recuperálos é desperdiçado Para evitar esse desperdício o MIPS divide os registradores nas categorias preservado e não preservado Os registradores preservados incluem s0 s7 daí seus nomes salvos Os registradores não preservados incluem t0 t9 daí seus nomes temporários Uma função deve salvar e recuperar qualquer um dos registradores preservados que ela deseje usar mas pode mudar os registradores não preservados livremente O Exemplo de Código 626 mostra uma versão ainda mais melhorada de diffofsums que salva apenas s0 na pilha t0 e t1 são registradores não preservados então não é necessário que sejam salvos Capítulo seis Arquitetura 470 Lembrese que quando uma função chama outra a última é a chamadora e a nova é a chamada A chamada deve salvar e recuperar qualquer registrador preservado que deseje utilizar A chamada pode mudar qualquer registrador não preservado Consequentemente se a chamadora está mantendo dados ativos num registrador não preservado a chamadora precisa salvar aquele registrador não preservado antes de fazer a chamada de função e então precisa recuperálo posteriormente Por essas razões registradores preservados são também chamados calleesaved e registradores não preservados são chamados callersaved Exemplo de Código 626 FUNÇÃO SALVANDO REGISTRADORES PRESERVADOS NA PILHA Código assembly MIPS s0 result diffofsums addi sp sp 4 abre espaço na pilha para armazenar um registrador sw s0 0sp salva s0 na pilha add t0 a0 a1 t0 f g add t1 a2 a3 t1 h i sub s0 t0 t1 result f g h i add v0 s0 0 põe o valor de retorno em v0 lw s0 0sp recupera s0 da pilha addi sp sp 4 liberta espaço da pilha jr ra retorna à chamadora A Tabela 63 resume quais os registradores preservados s0 s7 são geralmente utilizados para manter os valores de variáveis locais dentro de uma função então eles devem ser salvos ra também deve ser salvo de modo que a função saiba onde retornar t0 t9 são utilizados para manter os resultados temporários antes de eles serem atribuídos como variáveis locais Estes cálculos são tipicamente completados antes que uma chamada de função seja feita logo não são preservados e raramente e função chamadora precisa salválos a0 a3 são frequentemente Capítulo seis Arquitetura 471 sobrescritos no processo de chamada de função Consequentemente eles devem ser salvos por uma função chamadora se a mesma depender de algum de seus próprios argumentos após o retorno da função chamada v0 v1 certamente não deveriam ser preservados pois a função chamada retorna seus resultados nesses registradores A pilha acima do apontador de pilha é automaticamente preservada desde que a função chamadora não escreva em endereços de memória acima de sp Desse modo ela não modifica o stack frame de nenhuma outra função O apontador de pilha em si é preservado pois a função chamada liberta o seu stack frame antes do retorno através da adição da mesma quantidade que foi subtraída de sp no início da função Tabela 63 Registradores preservados e não preservados Chamadas Recursivas de Função Uma função que não chama outras é chamada função folha leaf um exemplo é a função diffofsums Uma função que chama outras é chamada função nonleaf Como mencionado anteriormente funções nonleaf são de certo modo mais complicadas pois elas podem precisar salvar registradores não preservados na pilha antes de chamarem outra função e em seguida recuperar esses valores posteriormente Especificamente a função chamadora salva qualquer registador não preservado t0 t9 e a0 a3 que for utilizado após a chamada A função chamada salva qualquer um dos registradores preservados s0 s7 e ra que tiver pretensão de modificar Capítulo seis Arquitetura 472 Uma função recursiva é uma função nonleaf que se chama a si mesma A função fatorial pode ser escrita como uma chamada de função recursiva Lembrese que 𝑓𝑎𝑡𝑜𝑟𝑖𝑎𝑙 𝑛 𝑛 𝑛 1 𝑛 2 2 1 A função fatorial pode ser reescrita recursivamente como 𝑓𝑎𝑡𝑜𝑟𝑖𝑎𝑙 𝑛 𝑛 𝑓𝑎𝑡𝑜𝑟𝑖𝑎𝑙 𝑛 1 O fatorial de 1 é simplesmente 1 O Exemplo de Código 627 mostra a função fatorial escrita como uma função recursiva Para atribuir corretamente os endereços de programas assumimos que o programa tem início no endereço 0𝑥90 A função fatorial modifica a0 e ra e por isso salvaos na pilha Ela então verifica se n 2 Se sim coloca o valor de retorno 1 em v0 restaura o apontador de pilha e retorna para a função chamadora Ela não tem que recarregar ra e a0 nesse caso pois eles nunca foram modificados Se n 1 a função recursivamente chama a factorialn1 Ela então recupera o valor de n a0 e o endereço de retorno ra da pilha realiza a multiplicação e retorna o resultado A instrução de multiplicação mul v0 a0 v0 multiplica a0 e v0 e coloca o resultado em v0 Exemplo de Código 627 Chamada de função recursiva fatorial Código de Alto Nível int factorialint n if n 1 return 1 Código assembly MIPS 0x90 factorial addi sp sp 8 abreespaço na pilha 0x94 sw a0 4sp guarda a0 0x98 sw ra 0sp guarda ra 0x9C addi t0 0 2 t0 2 OxAO slt t0 a0 t0 n 1 0xA4 beq t0 0 else não goto else 0xA8 addi v0 0 1 sim return 1 OxAC addi sp sp 8 recupera sp OxBO jr ra return Capítulo seis Arquitetura 473 else return n factorialn 1 0xB4 else addi a0 a0 1 n n 1 0xB8 jal factorial chamada recursiva OxBC Iw ra 0sp recupera ra OxCO Iw a0 4sp recupera a0 0xC4 addi sp sp 8 recupera sp 0xC8 mul v0 a0 v0 n factorialn1 OxCC jr ra return A Figura 626 mostra a pilha quando é executada a função fatorial3 Assumimos que sp inicialmente aponta para 0𝑥𝐹𝐶 como mostrado na Figura 626 a A função cria uma stack frame de duas palavras para manter a0 e ra Na primeira invocação fatorial salva a0 mantendo n 3 em 0𝑥𝐹8 e ra em 0𝑥𝐹4 como mostrado na Figura 626 b A função então muda a0 para n 2 e recursivamente chama fatorial2 fazendo com que ra mantenha 0𝑥𝐵𝐶 Na segunda invocação ela salva a0 mantendo n 2 em 0𝑥𝐹0 e ra em 0𝑥𝐸𝐶 Dessa vez nós sabemos que ra contém 0𝑥𝐵𝐶 A função então muda a0 para n 1 e recursivamente chama fatorial1 Na terceira invocação ela salva a0 mantendo n 1 em 0𝑥𝐸8 e ra em 0𝑥𝐸4 Dessa vez ra novamente contém 0𝑥𝐵𝐶 A terceira invocação de fatorial retorna o valor 1 em v0 e liberta a stack frame antes de retornar à segunda invocação A segunda invocação restaura n para 2 restaura ra para 0𝑥𝐵𝐶 aconteceu de já estar com este valor liberta a stack frame e devolve v0 2 𝑥 1 2 para a primeira invocação A primeira invocação restaura n para 3 ra para o endereço de retorno da função chamadora liberta a stack frame e retorna v0 3 𝑥 2 6 A Figura 626 c mostra a pilha como um retorno de função chamada recursivamente Quando fatorial retorna Capítulo seis Arquitetura 474 à função chamadora o apontador de pilha está na sua posição original 0𝑥𝐹𝐶 nenhum dos conteúdos da pilha acima do apontador mudou e todos os registradores preservados mantém seus valores originais v0 mantém o valor de retorno 6 Figura 626 Pilha durante a chamada da função factorial quando n 3 a antes de chamada b após a última chamada recursiva c após o retorno Argumentos Adicionais e Variáveis Locais As funções podem ter mais de quatro argumentos de entrada e variáveis locais A pilha é utilizada para armazenar estes valores temporários Pela convenção MIPS se uma função possui mais de quatro argumentos os primeiros quatro são transmitidos para registradores de argumento como normalmente Os argumentos adicionais são transmitidos para a pilha logo acima de sp A função chamadora deve expandir a sua pilha para abrir espaço para os argumentos adicionais A Figura 627 a mostra a pilha da função chamadora para quando ela possui mais do que quatro argumentos Capítulo seis Arquitetura 475 Uma função também pode declarar variáveis locais ou arrays Variáveis locais são declaradas dentro de uma função e podem ser acessadas apenas dentro daquela função As variáveis locais são armazenadas em s0 s7 Se existem muitas variáveis locais elas podem ser armazenadas no stack frame da função Em particular arrays locais são armazenados na pilha A Figura 627 b mostra a organização de uma stack frame da função chamada A stack frame mantém os próprios argumentos das funções e retorna os endereços e qualquer um dos registradores salvos que a função irá modificar Isso também mantém os valores dos arrays locais e quaisquer variáveis locais adicionais Se a função chamada possui mais de quatro argumentos ela os encontra na stack frame da função chamadora O acesso a argumentos de entradas adicionais é uma exceção na qual uma função pode acessar os dados da pilha fora da sua própria stack frame Figura 627 Uso de pilha a antes da chamada b após a chamada Capítulo seis Arquitetura 476 65 MODOS DE ENDEREÇAMENTO O MIPS utiliza cinco modos de endereçamento registeronly imediato base relativo ao PC e pseudodireto Os primeiros três métodos registeronly imediato e endereçamento de base definem modos de leitura e de escrita de operandos Os últimos dois relativo ao PC e endereçamento pseudodireto definem modos de escrita no contador de programa o PC Endereçamento RegisterOnly O endereçamento registeronly utiliza registradores para todos os operandos fonte e destino Todas as instruções tipoR utilizam endereçamento registeronly Endereçamento Imediato O endereçamento imediato utiliza os 16 𝑏𝑖𝑡𝑠 do imediato juntamente com os registradores como operandos Algumas instruções tipoI como adicionar imediato addi e carregar imediato superior lui utilizam endereçamento imediato Endereçamento de Base Instruções de acesso à memória como carregar palavra lw e armazenar palavra sw utilizam endereçamento de base O endereço efetivo do operando de memória é encontrado adicionando se o endereço de base no registrador com o offset de 16 𝑏𝑖𝑡𝑠 estendido em sinal encontrado no campo do imediato Endereçamento Relativo ao PC Instruções de branch condicional utilizam endereçamento relativo ao PC para especificar um novo valor para o PC se o desvio é realizado O offset com sinal no campo do imediato é adicionado ao PC para obter um novo PC consequentemente o endereço de destino do branch é dito como sendo relativo ao PC atual Capítulo seis Arquitetura 477 O Exemplo de Código 628 mostra parte da função factorial do Exemplo de Código 627 A Figura 628 mostra o código de máquina para a instrução beq O endereço de destino do branch branch target address BTA é o endereço da próxima instrução a ser executada caso o desvio seja efectuado A instrução beq na Figura 628 possui o BTA de 0𝑥𝐵4 o endereço de instrução do label else O campo de imediato de 16 𝑏𝑖𝑡𝑠 dá o número de instruções entre o BTA e a instrução após a instrução de branch a instrução em 𝑃𝐶 4 Nesse caso o valor do campo intermediário de beq é 3 pois o BTA 0𝑥𝐵4 está 3 instruções após 𝑃𝐶 4 0𝑥𝐴8 O processador calcula o BTA a partir da instrução fazendo uma extensão de 16 𝑏𝑖𝑡𝑠 do sinal do imediato multiplicandoo por 4 para converter as palavras em bytes e adicionandoo a 𝑃𝐶 4 Exemplo de Código 628 CALCULANDO O ENDEREÇO DESTINO DO BRANCH Código assembly MIPS 0xA4 beq t0 0 else 0xA8 addi v0 0 1 0xAC addi sp sp 8 0xBO jr ra 0xB4 else addi a0 a0 1 0xB8 jal factorial Figura 628 Código de máquina para beq Capítulo seis Arquitetura 478 Exemplo 68 CALCULANDO O CAMPO DE IMEDIATO PARA O ENDEREÇAMENTO RELATIVO AO PC Calcule o campo de imediato e mostre o código de máquina para a instrução branch não igual bne no programa abaixo MIPS assembly code 0x40 loop add t1 a0 s0 0x44 lb t1 0t1 0x48 add t2 a1 s0 0x4C sb t1 0t2 0x50 addi s0 s0 1 0x54 bne t1 0 loop 0x58 lw s0 0sp Solução A Figura 629 mostra o código de máquina para a instrução bne Seu endereço destino de branch 0𝑥40 está 6 instruções atrás de 𝑃𝐶 4 0𝑥58 então o campo de imediato é 6 Figura 629 Código de máquina para bne Endereçamento Pseudodireto No endereçamento direto um endereço é especificado na instrução Os saltos de instruções j e jal deveriam idealmente utilizar endereçamento direto para especificar um endereço alvo de salto jump target address JTA para indicar o endereço de instrução a ser executado em seguida Infelizmente a codificação de instruções do tipoJ não possui bits suficientes para especificar um JTA de 32bits Seis bits de instrução são utilizados pelo opcode então apenas 26bits são deixados Capítulo seis Arquitetura 479 para codificar o JTA Felizmente os dois bits menos significativos JTA10 deve sempre ser 0 pois as instruções são alinhadas em palavra Os próximos 26bits JTA272 são tomados do campo addr da instrução Os quatro bits mais significativos JTA3128 são obtidos dos quatro bits mais significativos de 𝑃𝐶 4 Esse modo de endereçamento é chamado pseudodireto Exemplo de Código 629 CALCULANDO O ENDEREÇO DESTINO DO JUMP Código assembly MIPS 0x0040005C jal sum 0x004000A0 sum add v0 a0 a1 O Exemplo de Código 629 ilustra a instrução jal utilizando o endereçamento pseudodireto O JTA da instrução jal é 0𝑥004000𝐴0 A Figura 630 mostra o código de máquina para a instrução jal Os quatro bits superiores e dois bits inferiores do JTA são descartados Os bits remanescentes são armazenados no campo de endereço de 26bits addr O processador calcula o JTA a partir da instrução tipoJ acrescentando dois 0𝑠 no final e os dois bits mais significativos de 𝑃𝐶 4 no início do campo de endereços de 26bits addr Devido aos quatro bits mais significativos do JTA serem tomados de 𝑃𝐶 4 a amplitude do salto é limitada A faixa limite do branch e as instruções de salto são exploradas do Exercício 629 ao Exercício 632 Todos as instruções do tipoJ j e jal utilizam endereçamento pseudodireto Note que a instrução de salto de registrador jr não é uma instrução tipoJ É uma instrução tipoR que salta para o valor de 32bits mantido no registrador rs Capítulo seis Arquitetura 480 Figura 630 Código de máquina para jal 66 LUZ CÂMERA AÇÃO COMPILANDO MONTANDO E CARREGANDO Até agora temos mostrado como traduzir fragmentos curtos de código de alto nível em linguagem de máquina e assembly Esta Seção descreve como compilar e montar um programa de alto nível completo e como carregar o programa na memória para a execução Começaremos introduzindo o mapa de memória MIPS que define onde códigos dados e pilha são localizados Em seguida mostraremos os passos para a execução de código para um programa de exemplo 661 O Mapa de Memória Com endereços de 32bits o espaço de endereços MIPS alcança 232 bytes 4 Gigabytes GB Os endereços de palavras são divisíveis por 4 e vão de 0 a 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐶 A Figura 631 mostra o mapa de memória MIPS A arquitetura MIPS divide o espaço de endereços em quatro partes ou segmentos o segmento de texto o segmento de dados globais o segmento de dados dinâmicos e o segmento reservado As seguintes seções descrevem cada segmento Capítulo seis Arquitetura 481 O Segmento de Texto O segmento de texto armazena o programa em linguagem de máquina Ele é grande o suficiente para acomodar quase 256 MB de código Note que os quatros bits mais significativos de endereço no espaço de texto são todos 0 logo a instrução j pode saltar diretamente para qualquer endereço no programa Figura 631 Mapa de memória MIPS O Segmento de Dados Globais O segmento de dados globais armazena variáveis globais que em contraste com as variáveis locais podem ser vistas por todas as funções num programa Variáveis globais são definidas pelo startup Capítulo seis Arquitetura 482 antes do programa começar a ser executado Essas variáveis são declaradas fora da função principal num programa em C e podem ser acessadas por qualquer função O segmento de dados globais é grande o suficiente para armazenar 64 kB de variáveis globais As variáveis globais são acessadas utilizandose o ponteiro global gp o qual é inicializado em 0𝑥00080000 Ao contrário do ponteiro de pilha sp o gp não muda durante a execução do programa Qualquer variável global pode ser acessada com um offset de 16bits positivo ou negativo em gp O offset é conhecido no momento de assemblagem então as variáveis podem ser eficientemente acessadas utilizando o modo de endereçamento de base com offsets constantes O Segmento de Dados Dinâmicos O segmento de dados dinâmicos mantém a pilha e o heap monte O dado nesse segmento não é conhecido no startup mas é dinamicamente alocado e libertado durante a execução do programa Este é o maior segmento de memória utilizado por um programa contendo quase 2 GB de espaço de endereços Como discutido na Seção 646 a pilha é utilizada para salvar e recuperar registradores utilizados por funções e para manter variáveis locais como arrays A pilha cresce de cima para baixo no segmento de dados dinâmicos 0𝑥7𝐹𝐹𝐹𝐹𝐹𝐹𝐶 e cada stack frame é acessada na ordem LIFO último a entrar primeiro a sair O heap armazena dados que são alocados pelo programa durante o seu tempo de execução Em C as alocações são feitas pela função malloc em C e Java a função new é utilizada na alocação de memória Do mesmo modo que um amontoado de sapatos no chão da sala de um alojamento os dados do heap podem ser utilizados e descartados em qualquer ordem O heap cresce de baixo para cima no segmento de dados dinâmicos Se a pilha e o heap sempre crescem os dados do programa podem ser corrompidos O alocador de memória tenta se certificar de que isso nunca aconteça retornando um erro de memória se houver espaço insuficiente para alocar mais dados dinâmicos Grace Hopper 1906 1992 Graduada pela Universidade de Yale com PhD em matemática Desenvolveu o primeiro compilador enquanto trabalhava na Remington Rand Corporation e foi fundamental no desenvolvimento da linguagem de programação COBOL Como oficial naval recebeu muitos prêmios inclusive uma Medalha de Vitória da Segunda Guerra Mundial e a Medalha de Serviço à Defesa Nacional Capítulo seis Arquitetura 483 Os Segmentos Reservados Os segmentos reservados são utilizados pelo sistema operacional e não podem ser utilizados diretamente pelo programa Parte da memória reservada é utilizada para interrupções veja Seção 77 e para IO de memória mapeada veja Seção 85 662 Traduzindo e Iniciando um Programa A Figura 632 mostra os passos necessários para se traduzir um programa de uma linguagem de alto nível em linguagem de máquina e para iniciar a execução desse programa Primeiramente o código de alto nível é compilado para código assembly O código assembly é montado em linguagem de máquina num arquivo objeto O linker combina o código de máquina com o código objeto das bibliotecas e outros arquivos para produzir um programa inteiramente executável Na prática a maioria dos compiladores realizam todos os três passos de compilar montar e linkar Finalmente o loader carrega o programa na memória e inicia a execução O restante desta Seção realiza esses três passos para um programa simples Passo 1 Compilação Um compilador traduz o código de alto nível em linguagem assembly O Exemplo de Código 630 mostra um programa simples em linguagem de alto nível com três variáveis globais e duas funções juntamente com o código assembly produzido por um compilador típico As expressões data e text são diretivas que indicam onde os textos e os segmentos de dados iniciam As labels são utilizadas para as variáveis globais f g e y Seus locais de armazenamento serão determinados pelo assembler por agora eles são deixados como símbolos no código Exemplo de Código 630 COMPILANDO UM PROGRAMA DE ALTO NÍVEL Código de Alto Nível int f g y global variables Código assembly MIPS data f g y Figura 632 Passos para traduzir e rodar um programa Capítulo seis Arquitetura 484 int mainvoid f 2 g 3 y sumf g return y int sumint a int b return a b text main addi sp sp 4 faz stack frame sw ra 0sp guarda ra na pilha addi a0 0 2 a0 2 sw a0 f f 2 addi a1 0 3 a1 3 sw a1 g g 3 jal sum chama função sum sw v0 y y sumf g Iw ra 0sp recupera ra da pilha addi sp sp 4 recupera apontador de pilha jr ra retorna ao SO sum add v0 a0 a1 v0 a b jr ra returna à chamadora Passo 2 Montagem O assembler transforma o código em linguagem assembly num arquivo objeto contendo código de linguagem de máquina O assembler faz duas passagens para o código assembly Na primeira passagem o assembler atribui os endereços de instruções e encontra todos os símbolos como labels e nomes de variáveis globais O código após a primeira passagem do assembler é mostrado aqui 0x00400000 main addi sp sp 4 0x00400004 sw ra 0sp 0x00400008 addi a0 0 2 0x0040000C sw a0 f 0x00400010 addi a1 0 3 0x00400014 sw a1 g Capítulo seis Arquitetura 485 0x00400018 jal sum 0x0040001C sw v0 y 0x00400020 lw ra 0sp 0x00400024 addi sp sp 4 0x00400028 jr ra 0x0040002C sum add v0 a0 a1 0x00400030 jr ra Os nomes e endereços dos símbolos são mantidos numa tabela de símbolos como mostrado na Tabela 64 para esse código Os endereços dos símbolos são preenchidos após a primeira passagem quando os endereços das labels são conhecidos Variáveis globais são atribuídas em locais de armazenamento no segmento de dados globais da memória partindo do endereço 0𝑥10000000 Na segunda passagem pelo código o assembler produz o código de linguagem de máquina Os endereços para as variáveis globais e labels são tomados da tabela de símbolos O código em linguagem de máquina e a tabela de símbolos são armazenados no arquivo objeto Tabela 64 Tabela de símbolos Passo 3 Ligando A maioria dos programas grandes contém mais de um arquivo Se o programador muda apenas um dos arquivos seria desperdício recompilar e remontar os outros arquivos Em particular programas frequentemente chamam funções em arquivos de bibliotecas esses arquivos de bibliotecas quase Capítulo seis Arquitetura 486 nunca mudam Se um arquivo de código de alto nível não é alterado o arquivo objeto associado a ele não precisa ser atualizado O trabalho do linker é combinar todos os arquivos objetos num arquivo de linguagem de máquina denominado executável O linker realoca os dados e as instruções nos arquivos objetos de modo que eles não fiquem uns sobre os outros Ele utiliza as informações na tabela de símbolos para ajustar os endereços das variáveis globais e dos labels que foram realocados No nosso exemplo existe apenas um arquivo objeto então nenhuma realocação é necessária A Figura 633 mostra o arquivo executável Ele possui três seções O cabeçalho header o segmento de texto e o segmento de dados O header do arquivo executável informa o tamanho do texto tamanho do código e o tamanho do dado quantidade de dados declarados globalmente Ambos são dados em unidades de bytes O segmento de texto dá as instruções para que eles sejam armazenados na memória A figura mostra as instruções num formato legível próximo ao código de máquina para facilidade de interpretação mas o arquivo executável inclui apenas instruções de máquina O segmento de dados dá o endereço de cada variável global As variáveis globais são endereçadas com respeito ao endereço de base dado pelo ponteiro globa gp Por exemplo a primeira instrução de armazenamento sw a0 0x8000gp armazena o valor na variável global f que está localizada no endereço de memória 0x10000000 Lembrese que o offset 0𝑥8000 é um número de 16bits com sinal que é estendido em sinal e somado ao endereço de base gp Então gp 0𝑥8000 0𝑥10008000 0𝑥𝐹𝐹𝐹𝐹8000 0𝑥10000000 o endereço de memória da variável f Capítulo seis Arquitetura 487 Figura 633 Executável Passo 4 Carregando O sistema operacional carrega um programa lendo o segmento de texto de um arquivo executável a partir de um dispositivo de armazenamento geralmente um disco rígido para o próximo segmento de memória O sistema operacional carrega em gp o valor 0𝑥10008000 a metade do segmento de dados globais e em sp o valor 0𝑥7𝐹𝐹𝐹𝐹𝐹𝐹𝐶 o topo do segmento de dados dinâmicos e em seguida executa a instrução jal 0𝑥00400000 para saltar para o início do programa A Figura 634 mostra o mapa de memória no início da execução do programa Capítulo seis Arquitetura 488 Figura 634 Executável carregado na memória Capítulo seis Arquitetura 489 67 MISCELÂNEA Esta Seção cobre alguns tópicos opcionais que não se encaixam naturalmente em outros lugares do Capítulo Esses tópicos incluem pseudoinstruções exceções instruções aritméticas com sinal e sem sinal e instruções de vírgula flutuante 671 Pseudoinstruções Se uma instrução não está disponível no conjunto de instruções MIPS é porque provavelmente a mesma operação pode ser realizada utilizando uma ou mais instruções MIPS existentes Lembrese que o MIPS é um computador de conjunto reduzido de instruções RISC reduced instruction set computer onde o tamanho das instruções e a complexidade de hardware são minimizados mantendose o número de instruções pequeno No entanto o MIPS define pseudoinstruções que não são verdadeiramente parte do conjunto de instruções mas são comumente utilizados por programadores e compiladores Quando convertidos em código de máquina as pseudoinstruções são traduzidas numa ou mais instruções MIPS A Tabela 65 dá exemplos de pseudoinstruções e as instruções MIPS utilizadas para implementálos Por exemplo a pseudoinstrução carregar imediato li carrega uma constante de 32bits usando uma combinação das instruções lui e ori A pseudoinstrução de não operação nop pronunciada no op não realiza operações O PC é incrementado em 4 na sua execução Nenhum outro valor de registrador ou memória é alterado O código de máquina para a instrução nop é 0𝑥00000000 Algumas pseudoinstruções requerem um registrador temporário para cálculos intermediários Por exemplo a pseudoinstrução beq t2 imm150 compara em Loop t2 a um imediato de 16bits imm150 Esta pseudoinstrução requer um registrador temporário para armazenar o imediato de 16 bits Os assemblers utilizam o registrador assembler at para tais propósitos A Tabela 66 mostra como o assembler usa at na conversão de uma pseudoinstrução para instruções MIPS reais Deixamos isso como os Exercício 638 e Exercício 639 para o leitor implementar outras pseudo instruções como rodar à esquerda rol e rodar à direita ror Capítulo seis Arquitetura 490 Tabela 65 Pseudoinstruções Tabela 66 Pseudoinstruções utilizando at 672 Exceções Uma exceção é como uma chamada de função sem marcação que salta para um novo endereço Exceções podem ser causadas por hardware ou software Por exemplo o processador pode receber notificações de que o usuário pressionou uma tecla no teclado O processador pode parar o que está fazendo determinar qual tecla pressionada salvála para uma futura referência e então voltar ao programa que estava sendo executado Uma exceção de hardware disparada por um dispositivo de entradasaída InputOutput IO tal como um teclado é frequentemente chamada de interrupção Alternativamente o programa pode encontrar uma condição de erro como uma instrução indefinida O programa então salta para o código no sistema operacional OS que pode Capítulo seis Arquitetura 491 escolher encerrar o programa problemático Exceções de software são às vezes chamadas traps Outras causas de exceção incluem divisão por zero tentativa de leitura de memória inexistente mal funcionamento de hardware interrupções do depurador e overflow aritmético ver Seção 673 O processador grava a causa de uma exceção e o valor do PC no momento em que a exceção ocorre Ele então salta para a função de tratamento de exceção A função de tratamento de exceção é um código usualmente do sistema operacional que examina a causa da exceção e responde apropriadamente lendo o teclado numa interrupção de hardware por exemplo Ela então retorna ao programa que estava executando antes da exceção aparecer No MIPS a função de tratamento de exceção está sempre localizada em 0𝑥80000180 Quando uma exceção ocorre o processador sempre salta para esse endereço de instrução independentemente da causa Tabela 67 Códigos de causa de exceções A arquitetura MIPS utiliza um registrador de propósito especial chamado registrador cause para gravar a causa da exceção Códigos diferentes são utilizados para gravar diferentes causas de exceção como mostrado na Tabela 67 O código de tratamento de exceção lê o registrador cause para determinar como tratar a exceção Algumas outras arquiteturas saltam para uma função de tratamento de exceções diferente para cada causa diferente ao invés de utilizar um registrador cause Capítulo seis Arquitetura 492 O MIPS utiliza outro registrador de propósito especial denominado Contador de programa de exceção Exception Program Counter EPC para armazenar o valor do PC no momento em que a exceção acontece O processador retorna ao endereço em EPC após tratar a exceção Isso é análogo a utilizar ra para armazenar o valor antigo do PC numa instrução jal Os registradores EPC e cause não são parte do banco de registradores MIPS A instrução mfc0 mover do coprocessador 0 copia estes e outros registradores de propósito especial para os registradores de propósito geral O Coprocessador 0 é chamado de controle do processador MIPS ele trata as interrupções e o diagnóstico do processador Por exemplo mfc0 t0 cause copia o registrador cause para t0 As instruções syscall e break causam traps para realizar chamadas de sistema ou pontos de interrupção do depurador A função de tratamento de exceções utiliza o EPC para procurar a instrução e determinar a natureza da chamada de função ou ponto de interrupção procurando nos campos da instrução Em resumo uma exceção faz com que o processador salte para a função de tratamento de exceções A função de tratamento de exceções salva os registradores na pilha em seguida utiliza mfc0 para procurar a causa e responder de acordo Quando o tratamento é terminado ela recupera os registradores da pilha copia os endereços de retorno de EPC para k0 e retorna utilizando jr k0 673 Instruções com Sinal e sem Sinal Lembrese que um número binário pode ser com sinal ou sem sinal A arquitetura MIPS utiliza a representação em complemento2 para números com sinal O MIPS possui certas instruções que vêm na variante sinalizados e sem sinals incluindo adição e subtração multiplicação e divisão ativar menor que e carregar palavras parcialmente Adição e Subtração A adição e a subtração são realizadas identicamente se o número possui ou não sinal No entanto a interpretação dos resultados é diferente 0 e k1 são incluídos no conjunto de registradores MIPS Eles são reservados pelo SO para tratamento de exceções Eles não precisam ser salvos e recuperados durante as exceções Capítulo seis Arquitetura 493 Como mencionado na Seção 146 se dois números grandes com sinal são adicionados o resultado pode incorretamente produzir o sinal oposto Por exemplo somar os números positivos abaixo resulta num resultado negativo 0𝑥7𝐹𝐹𝐹𝐹𝐹𝐹𝐹 0𝑥7𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐸 2 Similarmente somar dois números grandes e negativos resulta num número positivo 0𝑥80000001 0𝑥80000001 0𝑥00000002 Isso é chamado de overflow aritmético A linguagem C ignora os overflows aritméticos mas outras linguagens como Fortran requerem que o programa seja notificado Como mencionado na Seção 672 o processador MIPS põe uma exceção num overflow aritmético O programa pode decidir o que fazer a respeito do overflow por exemplo repetir o cálculo com números de maior precisão então retornar de onde o programa foi parado O MIPS fornece versões com e sem sinal de adição e subtração As versões com sinal são add addi e sub As versões sem sinal são addu addiu e subu As duas versões são idênticas exceto que nas versões com sinal disparam uma exceção de overflow enquanto nas versões sem sinal não disparam Como o C ignora exceções programas em C tecnicamente utilizam as versões sinalizadas dessas instruções Multiplicação e Divisão Multiplicação e divisão se comportam de modo diferente para números com sinal e sem sinal Por exemplo com um número sem sinal 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹 representa um número grande mas um número com sinal representa 1 Consequentemente 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹 X 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹 seria igual a 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐸00000001 se os números fossem sem sinal mas igual a 0𝑥0000000000000001 se os números tivessem sinal Portanto a multiplicação e a divisão estão disponíveis em ambas as variantes com e sem sinal mult e div tratam os operados como números sinalizados multu e divu tratam os operandos como números sem sinal Capítulo seis Arquitetura 494 Ativar Menor que Instruções ativar menor que podem comparar tanto dois registradores slt ou um registrador e um imediato slti Ela também vem em versões para números com sinal slt e slti e sem sinal sltu e sltiu Numa comparação 0𝑥80000000 é menor do que qualquer outro número pois é o maior número negativo em complemento2 Numa comparação sem sinal 0𝑥80000000 é maior que 0𝑥7𝐹𝐹𝐹𝐹𝐹𝐹𝐹 mas menor que 0𝑥80000001 pois todos os números são positivos Tome cuidado pois sltiu estende em sinal o imediato antes de tratalo como um número sem sinal Por exemplo sltiu s0 s1 0x8042 compara s1 a 0𝑥𝐹𝐹𝐹𝐹8042 tratando o imediato como um grande número positivo Carregamentos Como descrito na Seção 645 o carregamento de bytes está disponível nas versões com sinal lb e sem sinal lbu A função lb estende o byte em sinal e lby estende em zeros o byte para completar inteiramente o registrador de 32bits Similarmente o MIPS fornece instruções de carregamento de meias palavras sem e com sinal lh e lhu que carregam dois bytes na metade inferior da palavra e a estende em sinal ou zero à metade superior 674 Instruções em Vírgula Flutuante A arquitetura MIPS define um coprocessador opcional de vírgula flutuante conhecido como coprocessador Nas primeiras implementações MIPS o coprocessador de vírgula flutuante era um chip separado que os usuários poderiam comprar caso necessitassem de operações matemáticas rápidas em vírgula flutuante Nas implementações MIPS mais recentes o coprocessador de vírgula flutuante é construído bem ao lado do processador principal O MIPS define trinta e dois registradores de 32bits de vírgula flutuante f0 f31 Esses registradores são separados dos registradores normais utilizados até agora O MIPS suporta tanto a aritmética IEEE de vírgula flutuante de precisão simples quanto a de precisão dupla Números com Capítulo seis Arquitetura 495 precisão dupla 64bits são armazenados em pares de registradores de 32bits e então apenas os 16 registradores pares f0 f2 f4 f30 são utilizados para especificar operações com precisão dupla Por convenção certos registradores são reservados para certos propósitos como fornecido na Tabela 68 Figura 635 Formato de instrução de máquina TipoF Tabela 68 Conjunto de instruções MIPS vírgula flutuante Instruções em vírgula flutuante possuem um opcode de 17 100012 Elas necessitam tanto de um campo funct quanto de um campo cop coprocessador para indicar o tipo de instrução Consequentemente a MIPS define o formato de instrução tipoF para instruções de vírgula flutuante mostrado na Figura 635 Instruções em vírgula flutuante estão disponíveis tanto com precisão simples quanto com precisão dupla Para instruções de precisão simples cop 16 100002 ou Capítulo seis Arquitetura 496 17 100012 para instruções de precisão dupla Assim como as instruções do tipoR instruções do tipoF possuem dois operandos fonte fs e ft e um destino fd A precisão da instrução é indicado por s e d no mnemônico Instruções de aritmética de vírgula flutuante incluem adição adds addd subtração subs subd multiplicação muls muld e divisão divs divd assim como negação negs negd e valor absoluto abss absd O branch em vírgula flutuante possui duas partes Primeiro uma instrução de comparação é utilizada para ativar ou limpar a flag de condição de vírgula flutuante fpcond Em seguida um branch condicional verifica o valor da flag As instruções de comparação incluem igualdade cseqscseqd menor que cltscltd e menor ou igual clescled As instruções de branch condicional são bc1f e bc1t que desviam se fpcond é FALSE ou TRUE respectivamente As comparações de desigualdade maior que maior ou igual são realizadas com seq lt e le seguidas por bc1f Registradores de vírgula flutuante são carregados e armazenados na memória utilizando lwc1 e swc1 Essas instruções movem 32bits logo duas instruções são necessárias para manipular um número de precisão dupla 68 PERSPECTIVA DO MUNDO REAL ARQUITETURA X86 Quase todos os computadores pessoais hoje em dia utilizam microprocessadores com arquitetura 𝑥86 A arquitetura 𝑥86 também chamada de IA32 é uma arquitetura de 32bits originalmente desenvolvida pela Intel A AMD também vende microprocessadores compatíveis com 𝑥86 A arquitetura 𝑥86 tem uma longa e complicada historia datando do ano de 1978 quando a Intel anunciou o microprocessador de 16bits 8086 e seu primo o 8088 para o primeiro computador pessoal feito pela IBM Em 1985 a Intel introduziu o microprocessador de 32bits 80386 que era compatível com o 8086 e então podia rodar softwares desenvolvidos para PC Capítulo seis Arquitetura 497 anteriores Processadores com arquiteturas compatíveis com o 80386 são chamados processadores 𝑥86 O Pentium Core e Athlon são alguns processadores 𝑥86 bem conhecidos A Seção 79 descreve a evolução dos microprocessadores com mais detalhes Vários grupos da Intel e da AMD através de muitos anos foram encaixando mais instruções e capacidades na antiquada arquitetura O resultado é muito menos elegante que o MIPS Como Patterson e Hennessy explicam essa linhagem ancestral levou a uma arquitetura que é difícil de explicar e impossível de amar No entanto a compatibilidade de software é mais importante que a elegância técnica então a 𝑥86 tem sido de fato a arquitetura padrão de PC há mais de duas décadas Mais de 100 milhões de processadores 𝑥86 são vendidos todo ano Esse grande mercado justifica os mais de 5 bilhões em pesquisa e desenvolvimento que anualmente continuam melhorando os processadores Tabela 69 Principais diferenças entre as arquiteturas MIPS e x86 A arquitetura 𝑥86 é um exemplo de um Computador com arquitetura CISC Conjunto de Instruções Complexo Complex Instruction Set Computer Em contraste com as arquiteturas RISC como MIPS cada instrução CISC pode fazer mais Programas para arquiteturas CISC usualmente requerem menos instruções As codificações de instruções foram selecionadas para serem mais compactas de modo a Figura 636 Registro do x86 Capítulo seis Arquitetura 498 poupar memória quando a RAM era bem mais cara do que é hoje as instruções possuem comprimento variável e frequentemente têm menos de 32bits Em compensação as instruções complicadas são mais difíceis de decodificar e tendem a ser executadas mais lentamente Esta Seção introduz a arquitetura 𝑥86 O objetivo não é transformar o leitor num programador de linguagem assembly x86 mas apenas ilustrar algumas das similaridades e diferenças entre 𝑥86 e MIPS Pensamos que é interessante ver como um 𝑥86 funciona No entanto nenhum dos materiais nesta Seção é necessário para entender o resto do livro As principais diferenças entre 𝑥86 e MIPS são resumidas na Tabela 69 681 Registradores x86 O microprocessador 8086 fornecia oito registradores de 16bits o que podia separadamente acessar os oito bis superiores e inferiores de alguns desses registradores Quando o 80386 foi introduzido os registradores foram estendidos para 32bits Esses registradores eram chamados EAX ECX EDX EBX ESP EBP ESI e EDI Para compatibilidade com versões anteriores os 16 bits inferiores e algumas porções de 8bits são também utilizáveis como mostrado na Figura 636 Os oito registradores são quase mas não muito de propósito geral Certas instruções não podem utilizar certos registradores Outras instruções sempre colocam seus resultados em certos registradores Assim como sp em MIPS ESP é normalmente reservado para o apontador de pilha O contador de programa da 𝑥86 é chamado EIP extended instruction pointer apontador de instrução estendido Assim como o PC do MIPS ele avança de uma instrução a outra e pode ser mudado com branch saltos e instruções de chamadas de função 682 Operandos x86 Instruções MIPS sempre operam em registradores ou imediatos Instruções explícitas de carregamento e armazenamento são necessárias para mover dados entre a memória e os registradores Em contraste instruções 𝑥86 podem operar em registradores imediatos ou memória Isto compensa parcialidade o pequeno conjunto de registradores Capítulo seis Arquitetura 499 Tabela 610 Localização de operandos Tabela 611 Modos de endereçamento de memória As instruções MIPS geralmente especificam três operandos duas fontes e um destino Instruções 𝑥86 especificam apenas dois operandos O primeiro é a fonte O segundo é tanto uma fonte quanto um destino Consequentemente instruções 𝑥86 sempre sobrescrevem uma de suas fontes com o resultado A Tabela 610 lista as combinações de localizações de operandos em 𝑥86 Todas as combinações são possíveis exceto memória para memória Assim como MIPS 𝑥86 possui um espaço de memória de 32bits que é endereçável por byte No entanto 𝑥86 também suporta uma variedade muito grande de modos de endereçamento de Capítulo seis Arquitetura 500 memória Os locais de memória são especificados com qualquer combinação de um registrador de base deslocamento e um registrador de índice escalado A Tabela 611 ilustra essas combinações O deslocamento pode ser um valor de 8 16 ou 32bits A escala multiplicando o índice do registrador pode ser 1 2 4 ou 8 A base modo de desvio são equivalentes ao modo de endereçamento de base no MIPS para carregamentos e armazenamentos O índice deslocado fornece um modo simples para acessar arrays de estruturas de elementos de 2 4 ou 8bytes sem ter que emitir uma sequência de instruções para gerar o endereço Enquanto o MIPS sempre opera em palavras de 32bits as instruções da 𝑥86 podem operar em dados de 8 16 ou 32bits A Tabela 612 ilustra essas variações Tabela 612 Instruções sobre dados de 8 16 ou 32bits 683 Flags de Status A 𝑥86 assim como muitas arquiteturas CISC utiliza flags de status também chamadas códigos de condição para tomar decisões a respeito de branches e para manter o controle dos transbordos e de overflow aritmético A 𝑥86 utiliza um registrador de 32bits chamado EFLAGS que armazena as flags de status Alguns dos bits do registrador EFLAGS são dados na Tabela 613 Outros bits são utilizados pelo sistema operacional O estado arquitetural de um processador 𝑥86 inclui a EFLAGS assim como os oito registradores e o EIP Capítulo seis Arquitetura 501 684 Instruções x86 A arquitetura 𝑥86 possui um conjunto de instruções maior do que a MIPS A Tabela 614 descreve algumas instruções de propósito geral A 𝑥86 também tem instruções para aritmética de vírgula flutuante e para aritmética de múltiplos elementos de dados compactados numa palavra maior D indica o destino um registro ou localização de memória e S indica a fonte um registrador localização de memória ou imediato Tabela 613 EFLAGS selecionadas Capítulo seis Arquitetura 502 Tabela 614 Instruções selecionadas x86 Capítulo seis Arquitetura 503 Tabela 615 Condições de branch selecionadas Note que algumas instruções sempre operam sobre registradores específicos Por exemplo uma multiplicação de 32 por 32bits sempre toma uma das fontes de EAX e sempre coloca o resultado de 64bits em EDX e EAX LOOP sempre armazena o contador de loop em ECX PUSH POP CALL e RET utilizam o apontador de pilha ESP Saltos condicionais verificam as flags e desviam se a condição apropriada é atingida Eles estão disponíveis em diferentes formas Por exemplo JZ salta se a flag de zero ZF é 1 JNZ salta se a flag de zero é 0 O salto usualmente segue uma instrução como a instrução de comparação CMP que seta as flags A Tabela 615 lista alguns dos saltos condicionais e como eles dependem da ativação de uma flag por uma operação de comparação Capítulo seis Arquitetura 504 Figura 637 Instruções de codificação x86 685 Codificação de Instruções x86 As codificações de instruções 𝑥86 são realmente confusas um legado de décadas de mudanças fragmentadas Ao contrário da MIPS na qual as instruções possuem uniformemente 32bits as instruções 𝑥86 variam de 1 a 15 bytes como mostrado na Figura 637 O opcode pode ser de 1 2 ou 3 bytes e é seguido por quatro campos opcionais Mod RM SIB Displacement e Immediate Mod RM especifica um modo de endereçamento SIB especifica a escala index e registradores de base em certos modos de endereçamento Displacement indica um deslocamento de 1 2 ou 4 bytes em certos modos de endereçamento E Immediate é uma constante de 1 2 ou 4bytes para instruções que utilizam um imediato como operando fonte Mais ainda uma instrução pode ser precedida por até quatro prefixos opcionais em bytes tipo long que modificam o seu comportamento O byte Mod RM usa o campo de 2bits Mod e o de 3bits RM para especificar o modo de endereçamento para um dos operandos O operando pode vir de um dos oito registradores ou de um dos 24 modos de endereçamento Devido aos artefatos nas codificações os registradores ESP e EBP não estão disponíveis para uso como registradores de base ou index em certos modos Capítulo seis Arquitetura 505 de endereçamento O campo Reg especifica o registrador usado como outro operando Para certas instruções que não requerem um segundo operando o campo Reg é utilizado para especificar mais três bytes do opcode Em modos de endereçamento que utilizam um registrador de índice escalado o byte SIB especifica o registrador de index e a escala 1 2 4 ou 8 Se tanto a base quanto o index são utilizados o byte SIB também especifica o registrador de base A MIPS especifica totalmente a instrução no opcode e no campo funct da instrução A arquitetura 𝑥86 utiliza um número variável de bits para especificar diferentes instruções Ela utiliza menos bits para especificar instruções mais comuns decrementando o comprimento médio das instruções Algumas instruções ainda possuem múltiplos opcodes Por exemplo add AL imm8 realiza uma soma de 8bits entre um imediato e AL Isso é representado pelo opcode de 1byte 0𝑥04 seguido por um imediato de 1byte O registrador A AL AX ou EAX é chamado de acumulador Por outro lado add D imm8 realizam uma soma de 8bits entre um imediato e um destino arbitrário D memória ou registrador É representado pelo opcode de 1byte 0𝑥80 seguido por um ou mais bytes especificando D seguido por um imediato de 1 byte Muitas instruções possuem codificações reduzidas quando o destino é o acumulador No 8086 original o opcode especificava se a instrução atuava sobre operandos de 8 ou 16bits Quando o 80386 introduziu os operandos de 32bits não existiam novos opcodes disponíveis para especificar a forma de 32bits Ao invés disso o mesmo opcode foi utilizado por ambas as formas de 16bits e 32bits Um bit adicional no descritor de segmento de código utilizado pelos Sistemas Operacionais especificava qual a forma que o processador deveria escolher O bit é colocado a 0 para compatibilidade com versões anteriores com programas do 8086 padronizando o opcode para operandos de 16bits Ele é colocado a 1 para programas com operandos com padrão de 32bits Mais ainda o programador pode especificar prefixos para mudar a forma de uma instrução particular Se o prefix 0𝑥66 aparece antes do opcode o tamanho alternativo de operando é utilizado 16bits em modo de 32bits ou 32bits em modo de 16bits Capítulo seis Arquitetura 506 686 Outras Peculiaridades da x86 O 80826 introduziu segmentações para dividir a memória em segmentos de até 64 kB de comprimento Quando o SO ativa a segmentação os endereços são computados relativamente ao início do segmento O processador verifica para endereços que vão além do fim do segmento e indica um erro prevenindo assim os programas de acessarem memória fora de seu próprio segmento A segmentação provou ser um incômodo para os programadores e não é utilizada em versões modernas dos sistemas operacionais Windows A x86 contém instruções de strings que operam em strings inteiras de bytes ou palavras As operações incluem o movimento comparação e o varrimento para a procura de um valor específico Nos processadores modernos estas instruções são normalmente mais lentas do que realizar a operação equivalente com uma série de instruções mais simples então é melhor evitalas Como mencionado anteriormente o prefixo 0𝑥66 é utilizado para escolher entre tamanhos de operandos de 16 e 32bits Outros prefixos incluem aqueles utilizados para bloquear o barramento para controlar o acesso a variáveis compartilhadas num sistema multiprocessador para prever se um branch vai ou não ser realizadp e para repetir a instrução durante um movimento de string A ruína de qualquer arquitetura é rodar fora de sua capacidade de memória Com endereços de 32 bits a 𝑥86 pode acessar 4 GB de memória Isso era bem mais do que os maiores computadores possuíam em 1985 mas no início dos anos 2000 ela se tornou limitada Em 2003 a AMD estendeu o espaço de endereços e o tamanho dos registradores para 64 bits chamando a arquitetura melhorada de AMD64 A AMD64 possui um modo de compatibilidade que permite rodar programas de 32bits não modificados enquanto o SO toma vantagem do maior espaço de endereços Em 2004 a Intel cedeu e adotou as extensões de 64 bits as renomeou para Extended Memory 64 Technology EM64T Com endereços de 64 bits os computadores podem acessar 16exabytes 16 milhões de GB de memória Para aqueles curiosos a respeito de mais detalhes da arquitetura 𝑥86 o Manual do Desenvolvedor de Software em Arquitetura Intel 𝑥86 está disponível gratuitamente no website da Intel Capítulo seis Arquitetura 507 687 A Big Picture Esta Seção tem dado uma ideia de algumas das diferenças entre a arquitetura RISC MIPS e a arquitetura CISC 𝑥86 A 𝑥86 tende a ter programas mais curtos pois uma instrução complexa é equivalente a uma série de instruções MIPS simples e porque as instruções são codificadas para minimizar o uso de memória No entanto a arquitetura 𝑥86 é uma mistura de características acumuladas ao longo dos anos algumas das quais não são mais úteis mas devem ser mantidas para a compatibilidade com programas antigos Ela tem bem menos registradores e as instruções são difíceis de decodificar Mesmo explicar o conjunto de instruções é difícil Apesar de todas essas imperfeições a 𝑥86 está firmemente enraizada como a arquitetura dominante de PC pois o valor da compatibilidade de software é muito grande e porque o grande mercado justifica o esforço requerido em construir microprocessadores 𝑥86 rápidos 69 SUMÁRIO Para comandar um computador você deve falar sua linguagem Uma arquitetura de computador define como comandar o processador Muitas arquiteturas diferentes de computadores estão difundidas comercialmente hoje em dia mas uma vez que o leitor entenda uma delas aprender outras é muito mais fácil As questões chave a serem perguntadas quando nos aproximamos de uma nova arquitetura são Qual é o comprimento das palavras de dados Quais são os registradores Como a memória é organizada Quais são as instruções A MIPS é uma arquitetura de 32bits pois opera em dados de 32bits A arquitetura MIPS possui 32 registradores de propósito geral No entanto por convenção alguns registradores são reservados para certos propósitos para facilitar a programação de modo que funções escritas por diferentes programadores possam se comunicar facilmente Por exemplo o registrador 0 0 sempre mantém a constante 0 ra mantém o endereço de retorno após uma instrução jal e a0 a3 e v0 Intel e HP conjuntamente desenvolveram uma nova arquitetura de 64 bits chamada IA64 em meados de 1990 Ela foi projetada baseada em um desenho limpo ignorando a complicada história da x86 tirando vantagem de 20 anos de pesquisa em arquitetura de computadores e fornecendo um espaço de endereçamento de 64 bits No entanto a IA64 ainda tem o que fazer para se tornar um sucesso comercial A maioria dos computadores que necessita de grandes espaços de endereçamento utilizam extensões da arquitetura x86 Capítulo seis Arquitetura 508 v1 mantém os argumentos e valores de retorno de uma função A MIPS possui um sistema de memória endereçável por byte com endereços de 32bits O mapa de memória foi descrito na Seção 661 As instruções possuem 32bits e devem ser alinhadas por palavra Este Capítulo discutiu as instruções MIPS mais comumente utilizadas O poder de definir uma arquitetura de computador é que um programa escrito para qualquer dada arquitetura pode rodar em muitas diferentes implementações dessa arquitetura Por exemplo programas escritos para o processador Intel Pentium em 1993 irão geralmente continuar rodando e muito mais rápido no Intel Xeon ou no AMD Phenom processadores de 2012 Na primeira parte deste livro o leitor aprendeu sobre os circuitos níveis lógicos de abstração Neste Capítulo saltamos para o nível da arquitetura No próximo Capítulo estudaremos a microarquitetura o arranjo de blocos digitais que implementam a arquitetura de um processador A microarquitetura é a ligação entre a engenharia de hardware e de software E mais acreditamos que ele é um dos tópicos mais excitantes em toda a engenharia o leitor irá aprender a construir seu próprio microprocessador Capítulo seis Arquitetura 509 Exercícios Exercício 61 Dê três exemplos na arquitetura MIPS de cada um dos princípios de projeto de arquitetura 1 simplicidade favorece regularidade 2 fazer o caso comum rápido 3 menor é mais rápido e 4 bons projetos demandam bons compromissos Explique como cada um dos seus exemplos exibe esses princípios Exercício 62 A arquitetura MIPS possui um conjunto de registradores que consiste em registradores de 32bits É possível projetar uma arquitetura computacional sem um conjunto de registradores Se sim descreva brevemente a arquitetura incluindo o conjunto de instruções Quais são as vantagens e desvantagens dessa arquitetura sobre a arquitetura MIPS Exercício 63 Considere o armazenamento em memória de uma palavra de 32bits armazenada na palavra de memória 42 numa memória endereçável por byte a Qual é o byte de endereço da palavra de memória 42 b Qual é o byte de endereço que a palavra de memória 42 alcança c Represente o número 0𝑥𝐹𝐹223344 armazenado na palavra 42 em máquinas big endian e little endian A sua representação deve ser similar à da Figura 64 Claramente rotule o byte de endereço correspondente a cada valor de byte de dados Exercício 64 Repita o Exercício 63 para um armazenamento de memória de uma palavra de 32 bits armazenada na palavra de memória 15 numa memória endereçável por byte Capítulo seis Arquitetura 510 Exercício 65 Explique como o programa abaixo pode ser utilizado para determinar se um computador é big endian ou little endian li t0 0xABCD9876 sw t0 1000 lb s5 1010 Exercício 66 Escreva as seguintes strings utilizando codificação ASCII Escreva sua resposta final em hexadecimal a SOS b Cool c Seu próprio nome Exercício 67 Repita o Exercício 66 para as seguintes strings a howdy b lions c To the rescue Exercício 68 Mostre como as strings no Exercício 66 são armazenadas numa memória endereçável por byte em a uma máquina big endian e b uma máquina little endian partindo do endereço de memória 0𝑥10000100𝐶 Utilize um diagrama de memória similar à Figura 64 Indique claramente o endereço de memória de cada byte em cada máquina Exercício 69 Repita o Exercício 68 para as strings do Exercício 67 Capítulo seis Arquitetura 511 Exercício 610 Converta o seguinte código assembly MIPS em linguagem de máquina Escreva as instruções em hexadecimal add t0 s0 s1 lw t0 0x20t7 addi s0 0 10 Exercício 611 Repita o Exercício 610 para o seguinte código assembly MIPS addi s0 0 73 sw t1 7t2 sub t1 s7 s2 Exercício 612 Considere instruções tipoI a Quais instruções do Exercício 610 são do tipoI b Estenda em sinal o imediato de 16bits de cada instrução da parte a de modo que se torne um número de 32bits Exercício 613 Repita o Exercício 612 para as instruções no Exercício 611 Exercício 614 Converta o seguinte programa de linguagem de máquina para linguagem assembly MIPS Os números à esquerda são endereços de instrução na memória e os números à direita dão a instrução naquele endereço Então utilize engenharia reversa num programa de alto nível que compilaria isso numa rotina de linguagem assembly e o escreva Explique em palavras como esse programa funciona a0 é a entrada e ela inicialmente contém um número positivo n v0 é a saída Capítulo seis Arquitetura 512 0x00400000 0x20080000 0x00400004 0x20090001 0x00400008 0x0089502A 0x0040000C 0x15400003 0x00400010 0x01094020 0x00400014 0x21290002 0x00400018 0x08100002 0x0040001C 0x01001020 0x00400020 0x03E00008 Exercício 615 Repita o Exercício 614 para o código de máquina abaixo a0 e a1 são entradas a0 contém um número de 32 bits e a1 é o endereço de um array de 32 elementos de caracteres char 0x00400000 0x2008001F 0x00400004 0x01044806 0x00400008 0x31290001 0x0040000C 0x0009482A 0x00400010 0xA0A90000 0x00400014 0x20A50001 0x00400018 0x2108FFFF 0x0040001C 0x0501FFF9 0x00400020 0x03E00008 Exercício 616 A instrução nori não faz parte do conjunto de instruções MIPS pois a mesma funcionalidade pode ser implementada utilizando funções existentes Escreva um pequeno fragmento de código assembly que tenha a seguinte funcionalidade t0 t1 NOR 0xF234 Utiliza o mínimo de instruções possível Capítulo seis Arquitetura 513 Exercício 617 Implemente o seguinte segmento de código de alto nível utilizando a instrução slt Assuma as variáveis inteiras g e h como sendo os registradores s0 e s1 respectivamente a if g h g g h else g g h b if g h g g 1 else h h 1 c if g h g 0 else h 0 Exercício 618 Escreva uma função numa linguagem de alto nível para int find42int array int size O número de elementos em array é especificado por size e array especifica os endereços de base do array A função deve retornar o index da primeira entrada do array que mantenha o valor 42 Caso nenhuma entrada do array seja 42 o valor retornado deve ser 1 Exercício 619 A função de alto nível strcpy copia a string de caracteres src para a string de caracteres dst código em C void strcpychar dst char src int i 0 Capítulo seis Arquitetura 514 do dsti srci while srci a Implemente a função strcpy em código assembly MIPS Utilize s0 para i b Desenhe uma imagem da pilha antes durante e depois da chamada da função strcpy Assuma que sp 0x7FFFF00 antes de strcpy ser chamada Exercício 620 Converta a função de alto nível do Exercício 618 em código assembly MIPS Exercício 621 Considere o código assembly MIPS dado abaixo func1 func2 e func3 são funções nonleaf A func4 é uma função leaf O código não é mostrado para cada função mas os comentários indicam quais registradores utilizados em cada função 0x00401000 func1 func1 uses s0s1 0x00401020 jal func2 0x00401100 func2 func2 uses s2s7 0x0040117C jal func3 0x00401400 func3 func3 uses s1s3 0x00401704 jal func4 0x00403008 func4 func4 uses no preserved 0x00403118 jr ra registers a Quantas palavras têm as stack frames de cada função Capítulo seis Arquitetura 515 b Esboce a pilha depois que func4 é chamada Indique claramente onde cada registrador é armazenado na pilha e marque cada uma das stack frames Dê os valores onde for possível Exercício 622 Cada número na série de Fibonacci é a soma dos dois números anteriores A Tabela 616 lista os primeiros números na série fibn Tabela 616 Série de Fibonacci a Qual é o valor de fibn para n 0 e n 1 b Escreva uma função chamada fib numa linguagem de alto nível que retorna o número de Fibonacci para qualquer valor não negativo de n Dica Você provavelmente vai querer usar um loop Comente claramente o seu código c Converta a função de alto nível de b em código assembly MIPS Adicione comentários após cada linha de código que expliquem claramente o que elas fazem Utilize o simulador SPIM para testar o seu código em fib9 Veja no prefácio como instalar o simulador SPIM Exercício 623 Considere o código C do Exemplo 627 Para esse exercício assuma que fatorial é chamada com um argumento de entrada n 5 a Qual o valor em v0 quando fatorial retorna à função chamadora b Suponha que o leitor apaga as instruções dos endereços 0𝑥98 e 0𝑥𝐵𝐶 que salvam e recuperam ra O programa 1 entrará num loop infinito mas não travará 2 Travará pois faz com que a pilha cresça além do segmento de dados dinâmicos ou do PC saltando para uma Capítulo seis Arquitetura 516 localização fora do programa 3 produz um valor incorreto em v0 quando o programa retorna para o loop se sim qual o valor ou 4 roda corretamente apesar das linhas apagadas c Repita a parte b quando as instruções nos seguintes endereços de instrução são apagadas i 0𝑥94 e 0𝑥𝐶0 instruções que salvam e recuperam a0 ii 0𝑥90 e 0𝑥𝐶4 instruções que salvam e recuperam sp Nota a label fatorial não é apagada iii 0𝑥𝐴𝐶 uma instrução que recupera sp Exercício 624 Bem Bitdiddle está tentando computar a função 𝑓𝑎 𝑏 2𝑎 3𝑏 para um b não negativo Ele passou dos limites no uso das chamadas de funções e recursões e produziu o seguinte código de alto nível para funções f e f2 códigos de alto nível para as funções f e f2 int fint a int b int j j a return j a f2b int f2int x int k k 3 if x 0 return 0 else return k f2x l Ben então traduziu as duas funções em linguagem assembly como se segue Ele também escreveu uma função test que chama a função f53 Capítulo seis Arquitetura 517 0x00400000 test addi a0 0 5 a0 5 a 5 0x00400004 addi a1 0 3 a1 3 b 3 0x00400008 jal f call f5 3 0x0040000C loop j loop and loop forever 0x00400010 f addi sp sp 16 make room on the stack for s0 a0 a1 and ra 0x00400014 sw a1 12sp save a1 b 0x00400018 sw a0 8sp save a0 a 0x0040001C sw ra 4sp save ra 0x00400020 sw s0 0sp save s0 0x00400024 add s0 a0 0 s0 a0 j a 0x00400028 add a0 a1 0 place b as argument for f2 0x0040002C jal f2 call f2b 0x00400030 lw a0 8sp restore a0 a after call 0x00400034 lw a1 12sp restore a1 b after call 0x00400038 add v0 v0 s0 v0 f2b j 0x0040003C add v0 v0 a0 v0 f2b j a 0x00400040 lw s0 0sp restore s0 0x00400044 lw ra 4sp restore ra 0x00400048 addi sp sp 16 restore sp stack pointer 0x0040004C jr ra return to point of call 0x00400050 f2 addi sp sp 12 make room on the stack for s0 a0 and ra 0x00400054 sw a0 8sp save a0 x 0x00400058 sw ra 4sp save return address 0x0040005C sw s0 0sp save s0 0x00400060 addi s0 0 3 k 3 0x00400064 bne a0 0 else x 0 0x00400068 addi v0 0 0 yes return value should be 0 0x0040006C j done and clean up 0x00400070 else addi a0 a0 1 no a0 a0 1 x x 1 0x00400074 jal f2 call f2x 1 Capítulo seis Arquitetura 518 0x00400078 lw a0 8sp restore a0 x 0x0040007C add v0 v0 s0 v0 f2x 1 k 0x00400080 done lw s0 0sp restore s0 0x00400084 lw ra 4sp restore ra 0x00400088 addi sp sp 12 restore sp 0x0040008C jr ra return to point of call O leitor provavelmente achará interessante fazer desenhos da pilha similares àquele da Figura 626 para ajudalo a responder as seguintes questões a Se o código roda partindo de test qual valor está em v0 quando o programa chega a loop O programa computa corretamente a expressão 2𝑎 3𝑏 b Suponha que Ben apaga as instruções nos endereços 0𝑥0040001𝐶 e 0𝑥00400044 que salvam e recuperam ra O programa irá 1 entrar num loop infinito mas não trava 2 trava faz com que a pilha cresça além do segmentos de dados dinâmicos ou o PC salta para uma localização fora do programa 3 produz um valor incorreto em v0 quando o programa retorna do loop se sim qual valor ou 4 roda corretamente apesar das linhas apagadas c Repita a parte b quando as instruções nos endereços de instrução seguintes são apagadas Note que as labels não foram apagadas apenas as instruções i 0x00400018 e 0x00400030 instruções que salvam e recuperam a0 ii 0x00400014 and 0x00400034 instruções que salvam e recuperam a1 iii 0x00400020 and 0x00400040 instruções que salvam e recuperam s0 iv 0x00400050 and 0x00400088 instruções que salvam e recuperam sp v 0x0040005C and 0x00400080 instruções que salvam e recuperam s0 vi 0x00400058 and 0x00400084 instruções que salvam e recuperam ra Capítulo seis Arquitetura 519 vii 0x00400054 and 0x00400078 instruções que salvam e recuperam a0 Exercício 625 Converta as seguintes instruções assembly beq j e jal em código de máquina Os endereções das instruções são dados à esquerda de cada instrução a 0x00401000 beq t0 s1 Loop 0x00401004 0x00401008 0x0040100C Loop b 0x00401000 beq t7 s4 done 0x00402040 done c 0x0040310C back 0x00405000 beq t9 s7 back d 0x00403000 jal func 0x0041147C func e 0x00403004 back 0x0040400C j back Exercício 626 Considere o seguinte fragmento de linguagem assembly MIPS Os números à esquerda de cada instrução indicam o endereço da instrução Capítulo seis Arquitetura 520 0x00400028 add a0 a1 0 0x0040002C jal f2 0x00400030 f1 jr ra 0x00400034 f2 sw s0 0s2 0x00400038 bne a0 0 else 0x0040003C j f1 0x00400040 else addi a0 a0 1 0x00400044 j f2 a Traduza a sequência da instrução em linguagem de máquina Escreva as instruções do código de máquina em hexadecimal b Liste o modo de endereçamento utilizado em cada linha do código Exercício 627 Considere o seguinte fragmento de código em C C code void setArrayint num int i int array10 for i 0 i 10 i i 1 arrayi comparenum i int compareint a int b if suba b 0 return 1 else return 0 int subint a int b Capítulo seis Arquitetura 521 return a b a Implemente o fragmento de código em C em linguagem assembly MIPS Utilize s0 para manter a variável i Tenha certeza de manipular o apontador de pilha apropriadamente O array é armazenado na pilha antes da função setArray veja Seção 646 b Assuma setArray como sendo a primeira função chamada Desenhe o status da pilha antes da chamada de setArray e durante cada chamada de função Indique os nomes dos registradores e das variáveis armazenadas na pilha marque a localização de sp e marque claramente cada fragmento de pilha c Como o seu código funcionaria se você falhasse em armazenar ra na pilha Exercício 628 Considere a seguinte função de alto nível código em C int fint n int k int b b k 2 if n 0 b 10 else b b n n fn 1 k 1 return b k a Traduza a função de alto nível f em linguagem assembly MIPS Preste particular atenção em como salvar apropriadamente e recuperar os registradores através das chamadas de funções utilizando as convenções MIPS para os registradores preservados Comente com clareza o seu código Você pode utilizar a instrução MIPS mul A função iniciase no endereço 0𝑥00400100 Mantenha a variável local b em s0 Capítulo seis Arquitetura 522 b Passe através da sua função da parte a para o caso de f24 Desenhe uma figura da pilha similar àquela na Figura 626 c Escreva o nome do registrador e o valor do dado armazenado em cada localização na pilha e continue acompanhando o valor do apontador de pilha sp Marque claramente cada fragmento de pilha O leitor pode também achar útil ficar de olho nos valores a0 a1 v0 e s0 durante a execução Assuma que quando f é chamada s0 0xABCD e ra 0x400004 Qual é o valor final de v0 Exercício 629 Qual é a faixa dos endereços de instrução para que cada desvio condicional como beq e bne possam ser desviados em MIPS Dê sua resposta em número de instruções relativos para a instrução de desvio condicional Exercício 630 As seguintes questões examinam as limitações de salto de instrução j Dê sua resposta em número de instruções relativas ao salto de instrução a No pior caso o quão longe a instrução jump pode saltar para frente isto é para endereços maiores o pior caso é quando a instrução de salto não pode saltar longe Explique utilizando palavras e exemplos se necessário b No melhor caso o quão longe a instrução de salto pode saltar para a frente o melhor caso é quando a instrução de salto pode saltar o mais longe possível Explique c No pior caso o quão longe a instrução de salto j pode saltar para trás para endereços menores Explique d No melhor caso o quão longe a instrução de salto pode saltar para trás Explique Exercício 631 Explique por que é vantajoso ter um grande campo de endereços addr no formato de máquina para as instruções de salto j e jal Capítulo seis Arquitetura 523 Exercício 632 Escreva um código assembly que salte para uma instrução a 64 Minstructions da primeira instrução Lembrese que 1 Minstruction 220 instruções 1048576 instruções Assuma que o seu código inicie no endereço 0𝑥00400000 Utilize o mínimo de instruções possível Exercício 633 Escreva uma função em código de alto nível que receba um array com 10 elementos de 32 𝑏𝑖𝑡𝑠 armazenados no formato little endian e convertao para o formato big endian Após escrever o código de alto nível convertao para código assembly MIPS Comente todo o seu código e utilize o mínimo de instruções possível Exercício 634 Considere duas strings string1 e string2 a Escreva um código de alto nível para uma função chamada contat que concatena junta as duas strings void concatchar string1 char string2 char stringconcat A função não retorna nenhum valor Ela concatena string1 e string2 e põe a string resultante em stringconcat Assuma que o array de caracteres stringconcat é grande o suficiente para acomodar a string concatenada b Converta a função da parte a em código assembly MIPS Exercício 635 Escreva um programa em assembly MIPS que adicione dois números de precisão única e vírgula flutuante armazenados em s0 e s1 Não utilize nenhuma instrução MIPS para vírgula flutuante Você não precisa se preocupar com nenhuma codificação reservada para propósitos especiais 0 NANs etc ou números com overflow ou underflow Utilize o simulador SPIM para testar seu código Você precisará activar manualmente os valores de s0 e s1 para testar seu código Demostre que seu código funciona de forma confiável Capítulo seis Arquitetura 524 Exercício 636 Mostre como o seguinte programa MIPS poderia ser carregado na memória e executado código assembly MIPS main addi sp sp 4 sw ra 0sp lw a0 x lw a1 y jal diff lw ra 0sp addi sp sp 4 jr ra diff sub v0 a0 a1 jr ra a Primeiramente mostre o endereço de instrução próximo a cada instrução assembly b Desenhe a tabela de símbolos mostrando as labels e seus endereços c Converta todas as instruções em código de máquina d Qual o tamanho quantos bytes dos segmentos de dados e textos e Esboce um mapa de memória mostrando onde os dados e as instruções estão armazenados Exercício 637 Repita o Exercício 636 para o seguinte código assembly MIPS código assembly MIPS main addi sp sp 4 sw ra 0sp Capítulo seis Arquitetura 525 addi t0 0 15 sw t0 a addi a1 0 27 sw a1 b lw a0 a jal greater lw ra 0sp addi sp sp 4 jr ra greater slt v0 a1 a0 jr ra Exercício 638 Mostre as instruções MIPS que implementam as seguintes pseudoinstruções Você pode utilizar o registrador do assembler at mas você não deve corromper sobrescrever nenhum outro registrador a addi t0 s2 imm310 b rol t0 t1 5 rotacionar t1 em 5 à esquerda e colocar o resultado em t0 c ror s4 t6 31 rotacionar t6 em 31 à direita e colocar o resultado em s4 Exercício 639 Repita o Exercício 638 para as seguintes pseudoinstruções a beq t1 imm310 L b ble t3 t5 L c bgt t3 t5 L d bge t3 t5 L Capítulo seis Arquitetura 526 Questões de Entrevista Os exercícios a seguir apresentam questões que têm sido perguntadas em entrevistas para empregos em projetos digitais mas são usualmente abertas para qualquer linguagem assembly Pergunta 61 Escreva um código assembly MIPS para a troca do conteúdo de dois registradores t0 e t1 Não deve utilizar nenhum outro registrador Pergunta 62 Suponha que lhe é dado um array tanto de inteiros positivos quanto negativos Escreva um código assembly MIPS que encontre o subconjunto do array com a maior soma Assuma que o endereçamento de base do array e o número de elementos do array estão em a0 e em a1 respectivamente O seu código deve colocar o subconjunto resultante do array começando do endereço de base a2 Escreva um código que seja o mais rápido possível Pergunta 63 Élhe dado um array que mantém uma string em C A string forma uma frase Projete um algoritmo para reverter as palavras nessa sentença e armazenar a nova sentença de volta no array Implemente seu algoritmo utilizando código assembly MIPS Pergunta 64 Projete um algoritmo para contar o número de 1𝑠 num número de 32bits Implemente o seu algoritmo utilizando código assembly MIPS Pergunta 65 Escreva um código assembly MIPS para reverter os bits num registrador Utilize o menor número de instruções possível Assuma que o registrador de interesse é o t3 Capítulo seis Arquitetura 527 Pergunta 66 Escreva um código assembly MIPS para testar se ocorre overflow quando t2 e t3 são somados Utilize o menor número possível de instruções Pergunta 67 Projete um algoritmo para testar quando uma dada string é um palíndromo Lembrese que um palíndromo é uma palavra que é a mesma lendose tanto num sentido quanto em outro Por exemplo as palavras osso e reger são palíndromos Implemente o seu algoritmo utilizando código assembly MIPS Capítulo seis Arquitetura 528 Com a contribuição de Matthew Watkins 529 7 Microarquitetura 71 INTRODUÇÃO Neste Capítulo o leitor vai aprender a criar um microprocessador MIPS Na verdade vai construir três versões diferentes cada uma com diferentes soluções de compromisso entre desempenho custo e complexidade Para os não iniciados construir um microprocessador pode parecer magia negra Mas na verdade é relativamente simples e até aqui o leitor já aprendeu tudo o que precisa saber Especificamente aprendeu a desenhar combinações lógicas e sequenciais dadas as especificações funcionais e temporais Está familiarizado com os circuitos de aritmética e de memória E aprendeu relativamente à arquitetura MIPS que especifica o ponto de vista do programador do processador MIPS em termos de registros instruções e memória Este Capítulo abrange a microarquitetura que é a ligação entre a lógica e a arquitetura A microarquitetura consiste no arranjo específico de registros ALU máquinas de estados finitos FSM memórias e outros blocos de construção lógica necessários para implementar uma arquitetura A arquitetura em particular como a MIPS pode ter muitas microarquiteturas diferentes cada uma com diferentes vantagens e desvantagens de desempenho custo e complexidade Todas elas executam os mesmos programas mas as suas estruturas internas variam amplamente Vamos projetar três microarquiteturas diferentes neste Capítulo para ilustrar os compromissos Este Capítulo baseiase fortemente nos projetos clássicos MIPS de David Patterson e John Hennessy do seu livro de texto Computer Organization and Design Eles generosamente Capítulo sete Microarquitetura 530 compartilharam os seus elegantes projetos que têm a virtude de ilustrar uma arquitetura comercial real mas que é ao mesmo tempo relativamente simples e fácil de entender 711 Architectural State e Instruction Set Lembrese que a arquitetura de computador é definida pelo seu conjunto de instruções instruction set e estado arquitetural architectural state O estado arquitetural para o processador MIPS consiste no contador de programa program counter e nos 32 registros Qualquer microarquitetura MIPS deve conter tudo destes estados Com base no estado arquitetural atual o processador executa uma instrução em particular com um determinado conjunto de dados para produzir um novo estado arquitetural Algumas microarquiteturas contêm estados arquiteturais adicionais nonarchitectural state seja para simplificar a lógica ou melhorar o desempenho vamos evidenciar isso quando surgir Para manter as microarquiteturas fáceis de entender vamos considerar apenas um subconjunto do conjunto de instruções MIPS Especificamente vamos lidar com as seguintes instruções Instruções aritméticaslogicas do tipoR add sub and or slt Instruções de memória lw sw Instruções de branching beq Depois de construir as microarquiteturas com essas instruções vamos estendêlas para suportarem addi e j Estas instruções foram escolhidas em particular porque elas são suficientes para escrever muitos programas interessantes Depois de o leitor entender como implementar essas instruções pode expandir o hardware para lidar com as outras 712 Processo de Projeto Vamos dividir as nossas microarquiteturas em duas partes que interagem o caminho de dados datapath e de controlo control O caminho de dados opera as words de dados Ele possui estruturas tais como memórias registros ALU e multiplexadores A MIPS é uma arquitetura de 32 bits por isso vamos usar um caminho de dados de 32bits A unidade de controlo recebe a instrução David Patterson foi o primeiro de sua família a se formar na faculdade UCLA 1969 Ele tem sido professor de Ciência da Computação na Universidade de Berkeley desde 1977 onde ele co inventou a arquitectura RISC Reduced Instruction Set Computer Em 1984 ele desenvolveu a arquitetura SPARC usada pela Sun Microsystems Ele também é o pai das tecnologias RAID Redundant Array of Inexpensive Disks e NOW Rede de Estações de Trabalho John Hennessy é presidente da Universidade de Stanford e tem aí sido professor de Engenharia Eléctrica e de Ciência da Computação desde 1977 Co inventou a arquitetura RISC Ele desenvolveu a arquitetura MIPS em Stanford em 1984 e é cofundador da MIPS Computer Systems A partir de 2004 mais de 300 de milhões de microprocessadores MIPS foram vendidos No seu tempo livre estes dois paradigmas modernos escrevem livros de texto por lazer e relaxamento Capítulo sete Microarquitetura 531 atual a partir do caminho de dados e informa o caminho de dados como executar essa instrução Especificamente a unidade de controlo produz os sinais de seleção do multiplexador enable dos registros e escrita da memória para controlar o funcionamento do caminho de dados Uma boa forma de projetar um sistema complexo é começar com o hardware que contém os elementos de estado Esses elementos incluem as memórias e o estado arquitetural o contador de programa e registros Em seguida adicionamse os blocos de lógica combinatória entre os elementos de estado para calcular o novo estado com base no estado atual Uma instrução é lida de um local da memória as instruções de carga e armazenamento em seguida leem ou escrevem os dados depara outra parte da memória Por isso muitas vezes é conveniente particionar a memória geral em duas memórias menores uma contendo as instruções e outra os dados A Figura 71 mostra um diagrama de blocos com os quatro elementos de estado o contador de programa o banco de registros e as memórias de instruções e de dados Figura 71 Elementos de estado do processador MIPS Na Figura 71 as linhas grossas são utilizadas para indicar os barramentos de dados de 32bits As linhas médias são usadas para indicar barramentos mais estreitos como os barramentos de 5bits para endereçamento do banco de registros As linhas azuis estreitas são utilizadas para indicar sinais de controlo como a permissão de escrita no banco de registros Usaremos esta convenção em todo o Capítulo para evitar sobrecarregar os diagramas com a largura dos barramentos Além disso os elementos de estado têm geralmente uma entrada de reset para colocálos num estado conhecido no arranque Mais uma vez para evitar carregar os diagramas esta entrada de reset não é mostrada Reiniciar o PC No mínimo o contador de programa deve ter um sinal de reset para inicializar o seu valor quando o processador é ligado Os processadores MIPS inicializam o PC para 0xBFC00000 no arranque e começam a executar o código para iniciar o sistema operativo OS Operating System O sistema operativo em seguida carrega um programa de aplicação em 0x00400000 e começa a executálo Por simplicidade neste capítulo vamos redefinir o PC para 0x00000000 e colocar lá os nossos programas Capítulo sete Microarquitetura 532 O contador de programa é um registro de 32bits comum A sua saída PC aponta para a instrução atual A sua entrada PC indica o endereço da próxima instrução a ser executada A memória de instrução tem uma única porta de leitura Recebe uma entrada de endereço de instruções de 32bits A e lê os dados de 32 bits ou seja de instrução a partir desse endereço para a saída de dados de leitura RD O banco de registros de 32elementos 32bits tem dois portos de leitura e um porto de escrita Os portos de leitura têm entradas de endereço de 5bits A1 e A2 cada uma especificando um dos 25 32 registros como o operando de origem Eles leem os valores de 32bits do registro para as saídas de dados lidos RD1 e RD2 respectivamente O porto de escrita recebe uma entrada de endereço de 5bits A3 uma entrada de escrita de dados de 32bits WD a entrada de enable de escrita WE3 e um relógio Se o enable de escrita estiver a 1 o banco de registros escreve os dados no registro especificado no flanco ascendente do relógio A memória de dados tem um único porto de leituraescrita Se o enable de escrita WE estiver a 1 escreve os dados WD no endereço A no flanco ascendente do relógio Se o enable de escrita estiver a 0 ele lê o endereço A para RD A memória de instruções o banco de registros e a memória de dados são lidos através de combinações Por outras palavras se o endereço muda os novos dados aparecem em RD depois de algum atraso de propagação sem que o relógio esteja envolvido Eles são escritos apenas no flanco ascendente do relógio Desta forma o estado do sistema é alterado apenas no flanco do relógio O endereço os dados e o enable de escrita devem estar estabelecidos algum momento antes do flanco do relógio e devem permanecer estáveis até um tempo de hold após o flanco do relógio Porque os elementos de estado alteram o seu estado somente no flanco ascendente do relógio eles são circuitos sequenciais síncronos O microprocessador é constituído por elementos de estado chaveados e lógica combinatória por isso também é um circuito sequencial síncrono Com efeito o processador pode ser visto como uma máquina de estado finito gigante ou como um conjunto de máquinas de estado mais simples que interagem Capítulo sete Microarquitetura 533 713 Microarquitetura MIPS Neste Capítulo desenvolvemos três microarquiteturas de cicloúnico multiciclo e pipeline Elas diferem na forma em que os elementos de estado são ligados entre si e na quantidade de estados arquiteturais adicionais A microarquitetura de cicloúnico singlecycle microarchitecture executa uma instrução inteira em cada ciclo É fácil de explicar e tem uma unidade de controlo simples Porque ela completa a operação num ciclo não requer qualquer estado arquitetural adicional No entanto o tempo de ciclo é limitado pela instrução mais lenta A microarquitetura multiciclo multicycle microarchitecture executa instruções numa série de ciclos mais curtos As instruções mais simples executam em menos ciclos do que as mais complicadas Além disso a microarquitetura multiciclo reduz o custo do hardware através da reutilização de blocos de hardware caros como somadores e memórias Por exemplo o somador pode ser usado em vários ciclos diferentes para vários fins durante a realização de uma única instrução Para isso o microprocessador multiciclo acrescenta vários registros de estados arquiteturais adicionais para manter os resultados intermediários O processador multiciclo executa somente uma instrução de cada vez mas cada instrução leva vários ciclos de relógio A microarquitetura com pipeline aplica o pipelining à microarquitetura de cicloúnico Por conseguinte é possível executar várias instruções simultaneamente melhorando significativamente o rendimento O pipelining requer a adição de lógica para lidar com as dependências entre instruções executadas simultaneamente Também requer registros de pipelining arquiteturais adicionais A lógica e os registros adicionados valem a pena hoje todos os processadores de alto desempenho comerciais usam pipelining Exploramos os detalhes e os compromissos destas três microarquiteturas nas secções subsequentes No final do Capítulo mencionamos brevemente as técnicas adicionais que são usadas para obter ainda maior velocidade nos microprocessadores modernos de alto desempenho Capítulo sete Microarquitetura 534 72 ANÁLISE DE DESEMPENHO Como já mencionamos uma arquitetura de processador em particular pode ter muitas microarquiteturas com diferentes vantagens e desvantagens de custo e desempenho O custo depende da quantidade de hardware requerida e a tecnologia de implementação A cada ano os processos CMOS permitem empacotar mais transístores num chip pela mesma quantidade de dinheiro e os processadores tiram proveito desses transístores adicionais oferecendo maior desempenho Os cálculos detalhados dos custos exigem um conhecimento detalhado da tecnologia de implementação mas em geral mais portas e mais memória significam mais dólares Esta seção estabelece as bases para analisar o desempenho Há muitas formas de medir o desempenho de um sistema computacional e os departamentos de marketing são infames por escolherem o método que faz com que o seu computador pareça mais rápido independentemente se a medida tem qualquer correlação com o desempenho no mundo real Por exemplo a Intel e a Advanced Micro Devices AMD ambas vendem microprocessadores compatíveis em conformidade com a arquitetura x86 Os microprocessadores Intel Pentium III e Pentium 4 foram amplamente anunciados de acordo com a frequência do relógio no final de 1990 e início de 2000 porque a Intel oferecia frequências de relógio mais altas do que os seus concorrentes No entanto o principal concorrente da Intel a AMD vendia o microprocessador Athlon que executava programas mais rápido do que os chips da Intel com a mesma frequência de relógio O que deve um consumidor fazer A única maneira livre de chamariz para medir o desempenho é através da medição do tempo de execução de um programa que interesse ao leitor O computador que executar mais rápido o seu programa tem a performance mais alta A próxima melhor opção é medir o tempo total de execução de um conjunto de programas que são semelhantes aos que o leitor pretende executar isso pode ser necessário se o leitor não tiver ainda escrito o programa ou se outra pessoa que não tem o seu programa está fazendo as medições Tais coleções de programas são chamados de benchmarks e os tempos de execução destes programas são comumente publicados para dar alguma indicação de como um processador executa Capítulo sete Microarquitetura 535 O tempo de execução de um programa medido em segundos é dado pela equação 71 𝑡𝑒𝑚𝑝𝑜 𝑑𝑒 𝑒𝑥𝑒𝑐𝑢çã𝑜 𝑖𝑛𝑠𝑡𝑟𝑢çõ𝑒𝑠 𝑐𝑖𝑐𝑙𝑜𝑠 𝑖𝑛𝑠𝑡𝑟𝑢çõ𝑒𝑠 𝑠𝑒𝑔𝑢𝑛𝑑𝑜𝑠 𝑐𝑖𝑐𝑙𝑜 71 O número de instruções num programa depende da arquitetura do processador Algumas arquiteturas têm instruções complicadas que fazem mais trabalho por instrução reduzindo assim o número de instruções de um programa No entanto estas instruções complicadas são muitas vezes mais lentas para executar em hardware O número de instruções também depende enormemente da destreza do programador No final deste Capítulo vamos assumir que estamos executando programas conhecidos num processador MIPS de modo que o número de instruções para cada programa é constante independente da microarquitetura O número de ciclos por instrução muitas vezes chamado de CPI cycles per instruction é o número de ciclos de relógio necessários para executar uma instrução média É o inverso da taxa de transferência instruções por ciclo ou IPC instruction per cycles Diferentes microarquiteturas têm diferentes CPI Neste Capítulo vamos supor que temos um sistema de memória ideal que não afeta o CPI No Capítulo 8 examinamos como o processador por vezes tem que esperar pela memória o que aumenta o CPI O número de segundos por ciclo é o período de relógio Tc O período de relógio é determinado pelo caminho crítico através da lógica do processador Diferentes microarquiteturas têm diferentes períodos de relógio O projeto da lógica e dos circuitos também afetam significativamente o período de relógio Por exemplo um somador carrylookahead é mais rápido do que um somador ripplecarry Historicamente os avanços na fabricação duplicaram a velocidade dos transístores a cada 46 anos então um microprocessador construído hoje será muito mais rápido do que um da última década mesmo se a microarquitetura e a lógica não tenham sido alteradas O desafio do microarquiteto é escolher o projeto que minimize o tempo de execução desde que satisfaça as restrições sobre o custo eou o consumo de energia Como as decisões microarquiteturas afetam tanto o CPI como o Tc e são influenciadas pelo projeto da lógica e dos circuitos determinar a melhor escolha exige uma análise cuidadosa Capítulo sete Microarquitetura 536 Há muitos outros fatores que afetam o desempenho geral do computador Por exemplo o disco rígido a memória o sistema gráfico e a ligação de rede podem ser fatores limitadores que tornam o desempenho do processador irrelevante O microprocessador mais rápido do mundo não ajuda a navegar na Internet com uma ligação dialup Mas esses outros fatores estão além do objetivo deste livro 73 PROCESSADORES DE CICLOÚNICO Em primeiro lugar criamos uma microarquitetura MIPS que executa instruções num único ciclo Vamos começar por construir o caminho de dados ligando os elementos de estado da Figura 71 com a lógica combinatória que podem executar as várias instruções Os sinais de controlo determinam que instrução específica é levada a cabo pelo caminho de dados a qualquer momento O controlador contém lógica combinatória que gera os sinais de controlo adequados com base na instrução atual Concluímos analisando o desempenho do processador de cicloúnico 731 Caminho de Dados de Cicloúnico Esta seção desenvolve gradualmente o caminho de dados de cicloúnico acrescentando uma peça de cada vez aos elementos de estado da Figura 71 As novas ligações são enfatizadas a preto ou a azul para os novos sinais de controlo enquanto o hardware já estudado é mostrado a cinza O registro contador de programa PC contém o endereço da instrução a executar O primeiro passo é ler esta instrução da memória de instruções A Figura 72 mostra que o PC está simplesmente ligado à entrada de endereço da memória de instruções A memória de instruções lê ou fetches a instrução de 32bits identificada como Instr As ações do processador dependem da instrução específica que foi lida Primeiro vamos trabalhar as ligações do caminho de dados para a instrução lw Em seguida vamos considerar como generalizar o caminho de dados para lidar com as outras instruções Capítulo sete Microarquitetura 537 Figura 72 Leitura fetch de instrução da memória Para uma instrução lw o próximo passo é ler o registro de origem que contém o endereço de base Este registro é especificado no campo rs da instrução Instr2521 Estes bits da instrução estão ligados à entrada de endereço de um dos portos de leitura do banco de registros A1 tal como mostrado na Figura 73 O banco de registros lê o valor de registro em RD1 A instrução lw também requer um offset O offset é armazenado no campo imediato da instrução Instr150 Uma vez que o 16bit imediato pode ser positivo ou negativo ele deve ter o sinal estendido para 32 bits como mostrado na Figura 74 O valor de 32 bits de sinal estendido é chamado SignImm Lembrese da Seção 146 que a extensão do sinal simplesmente copia o bit de sinal bit mais significativo de uma entrada para todos os bits superiores da saída Especificamente SignImm150 Instr15 0 e SignImm3116 Instr15 Figura 73 Leitura do operando de origem do banco de registros Capítulo sete Microarquitetura 538 Figura 74 Extensão de sinal imediato O processador deve adicionar o endereço de base ao offset para encontrar o endereço a ler a partir da memória A Figura 75 introduz uma ALU para realizar esta adição A ALU recebe dois operandos SrcA e SrcB O SrcA vem do banco de registros e o SrcB vem do imediato com extensão de sinal A ALU pode realizar várias operações como foi descrito no Seção 524 O sinal de 3bits de controlo da ALU especifica a operação A ALU gera um ALUResult de 32bits e uma flag Zero que indica se ALUResult 0 Para uma instrução lw o sinal de controlo da ALU deve ser definido como 010 para adicionar o endereço de base e o offset O ALUResult é enviado para a memória de dados como o endereço da instrução de carregamento conforme mostrado na Figura 75 Os dados são lidos a partir da memória de dados para o ReadBus em seguida é escrita de volta para o registro de destino no banco de registros no final do ciclo como mostrado na Figura 76 O Porto 3 do banco de registros é o porto de escrita Capítulo sete Microarquitetura 539 Figura 75 Endereçamento de memória do computador Figura 76 Escrita de retorno dos dados no registro Capítulo sete Microarquitetura 540 O registro de destino para a instrução lw é especificado no campo rt Instr2016 o qual está ligado à entrada de endereço do porto 3 A3 do banco de registros Em seguida o barramento de leitura de dados ReadData está ligado à entrada de escrita de dados do porto 3 WD3 do banco de registros Um sinal de controlo chamado de RegWrite está ligado à entrada de enable de escrita do porto 3 WE3 e é ativado durante uma instrução lw para que o valor do dado seja escrito no banco de registros A escrita ocorre no flanco ascendente do relógio no final do ciclo Enquanto a instrução está a ser executada o processador deve calcular o endereço da próxima instrução PC Porque as instruções têm 32 bits 4 bytes a próxima instrução está em PC 4 A Figura 77 utiliza outro somador para incrementar o PC de 4 O novo endereço é escrito no contador de programa no próximo flanco ascendente do relógio Isto completa o caminho de dados para a instrução lw Figura 77 Determinação do endereço da próxima instrução para o PC Capítulo sete Microarquitetura 541 Figura 78 Escrita de dados na memória para a instrução sw Em seguida vamos estender o caminho de dados para lidar também com a instrução sw Tal como a instrução lw a instrução sw lê um endereço base do porto 1 do banco de registros e estende o sinal do imediato A ALU soma ao endereço de base ao imediato para encontrar o endereço de memória Todas estas funções já são suportadas pelo caminho de dados A instrução sw também lê um segundo registro do banco de registros e escreveo para a memória de dados A Figura 78 mostra as novas ligações para esta função O registro é especificado em rt no campo Instr2016 Estes bits da instrução estão ligados ao segundo porto de leitura do banco de registros A2 O valor do registro é lido para o porto RD2 Ele está ligado ao porto de escrita de dados da memória de dados O porto de enable de escrita da memória de dados WE é controlado por MemWrite Para uma instrução de sw MemWrite 1 para escrever os dados para a memória ALUControl 010 para adicionar o endereço de base ao offset e RegWrite 0 porque nada deve ser escrito para o banco de registro Notese que os dados ainda são lidos a partir do endereço fornecido à memória de dados mas este ReadData é ignorado porque RegWrite 0 Capítulo sete Microarquitetura 542 Em seguida vamos considerar o alargamento do caminho de dados para lidar com as instruções do tipoR add sub and or e slt Todas estas instruções leem dois registros do banco de registro executam alguma operação da ALU sobre eles e escrevem o resultado de volta para um terceiro registro do banco de registros Elas diferem apenas na operação específica da ALU Assim elas podem ser tratadas com o mesmo hardware através de sinais diferentes de controlo da ALU A Figura 79 mostra o caminho de dados melhorada para manipulação de instruções do tipoR O banco de registros lê dois registros A ALU executa uma operação nesses dois registros Na Figura 78 a ALU recebe sempre o seu operando SrcB do imediato com extensão de sinal SignImm Agora acrescentemos um multiplexador para escolher o SrcB a partir do porto RD2 do banco de registros ou de SignImm O multiplexador é controlado por um novo sinal ALUSrc O ALUSrc é 0 para as instruções do tipo R para escolher SrcB a partir do banco de registros é 1 para lw e sw para escolher SignImm Este princípio de melhorar as capacidades do caminho de dados através da adição de um multiplexador para escolher as entradas de entre as várias possibilidades é extremamente útil Na verdade vamos aplicálo mais duas vezes para completar o tratamento de instruções do tipoR Na Figura 78 o banco de registro tem sempre os seus dados escritos da memória de dados No entanto as instruções do tipoR escrevem o ALUResult para o banco de registros Portanto adicionamos outro multiplexador para escolher entre ReadData e ALUResult Chamamos à saída Result Este multiplexador é controlado por um outro sinal novo MemtoReg O MemtoReg está a 0 para as instruções do tipoR para escolher Result de ALUResult é 1 para lw para escolher ReadData Não nos preocupamos com o valor de MemtoReg de sw porque sw não escreve para o banco de registros Da mesma forma na Figura 78 o registro de escrita foi especificado pelo campo rt da instrução Instr2016 No entanto para obter instruções do tipoR o registro é especificado pelo campo rd Instr1511 Assim acrescentamos um terceiro multiplexador para escolher WriteReg do campo apropriado da instrução O multiplexador é controlado por RegDst RegDst é de 1 para instruções do tipoR para escolher WriteReg do campo rd Instr1511 é 0 para lw para escolher o campo certo Instr Capítulo sete Microarquitetura 543 2016 Não nos preocupamos com o valor de RegDst de sw porque sw não escreve para o banco de registros Figura 79 Caminho de dados melhorado para instruções do tipoR Finalmente vamos estender o caminho de dados para lidar com a instrução beq A instrução beq compara dois registros Se eles forem iguais o branch é obtido adicionando o offset ao contador de programa Recordese que o offset é um número positivo ou negativo armazenado no campo imm da instrução Instr150 O offset indica o número de instruções para o branch passar Por isso o imediato deve ter o sinal estendido e multiplicado por 4 para obter o novo valor do contador de programa PC PC 4 SignImm 4 A Figura 710 apresenta as modificações do caminho de dados O próximo valor do PC para um branch PCBranch é calculado deslocando SignImm para a esquerda por 2 bits para em seguida adicionálo ao Capítulo sete Microarquitetura 544 PCPlus4 O deslocamento para a esquerda por 2 é uma maneira fácil de multiplicar por 4 porque um deslocamento por um valor constante envolve apenas fios Os dois registros são comparados por cálculo de SrcA SrcB usando a ALU Se o ALUResult é 0 como indicado pela flag Zero da ALU os registros são iguais Adicionamos um multiplexador para escolher PC a partir de PCPlus4 ou de PCBranch O PCBranch é selecionado se a instrução é um branch e a flag Zero está ativada Assim Branch é 1 para beq e 0 para as outras instruções Para beq ALUControl 110 de modo que a ALU efectua uma subtracção ALUSrc 0 para escolher SrcB a partir do banco de registros RegWrite e MemWrite são 0 porque um branch não escreve para o banco de registros ou para a memória Não nos preocupamos com os valores de RegDst e MemtoReg porque o banco de registros não é escrito Isto completa o projeto do processador MIPS de caminho de dados de cicloúnico Ilustrámos não só o projeto em si mas também o processo de projeto em que os elementos de estado são identificados e a lógica combinatória que liga os elementos de estado é sistematicamente acrescentada Na próxima seção abordamos como determinar os sinais de controlo que dirigem a operação do nosso caminho de dados Figura 710 Caminho de dados melhorado para a instrução beq Capítulo sete Microarquitetura 545 732 Controlo de CicloÚnico A unidade de controlo determina os sinais de controlo com base nos campos do opcode e funct da instrução Instr3126 e Instr50 A Figura 711 apresenta todo o processador MIPS de cicloúnico com a unidade de controlo ligada ao caminho de dados A maior parte da informação de controlo vem do código do opcode mas as instruções do tipoR também usar o campo func para determinar a operação ALU Assim vamos simplificar a nossa concepção decompondo a unidade de controlo em dois blocos de lógica combinatória como mostrado na Figura 712 Estrutura interna da unidade de controlo O decodificador principal determina a maior parte das saídas do opcode Ele determina também o sinal de 2bits OpALU O decodificador da ALU utiliza este sinal OpALU em conjunto com o campo func para calcular ALUcontrol O significado do sinal OpALU é dado na Tabela 71 Figura 711 Processador MIPS complete de Cicloúnico Capítulo sete Microarquitetura 546 Tabela 71 Codificação do ALUop A Tabela 72 é uma tabela verdade para o decodificador da ALU Recordese que os significados dos três sinais de controlo da ALU foram dados na Tabela 51 Porque OpALU nunca é 11 a tabela verdade pode usar dont care X1 e 1X em vez de 01 e 10 para simplificar a lógica Quando o OpALU é 00 ou 01 a ALU deve adicionar ou subtrair respectivamente Quando OpALU é 10 o decodificador examina o campo funct para determinar o controlo da ALU Notese que para as instruções do tipo R que implementamos os dois primeiros bits do campo funct são sempre 10 portanto podem ser ignoradas para simplificar o decodificador Os sinais de controlo para cada instrução foram descritos enquanto construímos o caminho de dados A Tabela 73 é uma tabela verdade para o decodificador principal que resume os sinais de controlo em função do opcode Todas as instruções do tipoR usam os mesmos valores do decodificador principal eles diferem apenas na saída do decodificador da ALU Lembrese que para instruções que não escrevam para o banco de registros por exemplo sw e beq os sinais de controlo RegDst e MemtoReg são dont care X o endereço e os dados para o porto de escrita do registro não importam porque RegWrite não está ativo A lógica para o decodificador pode ser projetada usando as suas técnicas favoritas para o projeto de lógica combinatória Figura 712 Estrutura interna da unidade de controlo Capítulo sete Microarquitetura 547 Tabela 72 Tabela de descodificação da ALU Tabela 73 Tabela verdade do decodificador principal Exemplo 71 OPERAÇÃO DO PROCESSADOR DE CICLOÚNICO Determinar os valores dos sinais de controlo e as porções do caminho de dados que são usadas durante a execução de uma instrução or Solução A Figura 713 ilustra os sinais de controlo e fluxo de dados durante a execução da instrução OR O PC aponta para a localização de memória que contém a instrução e a memória de instruções recolhe a instrução O fluxo de dados principal entre o banco de registros e a ALU é representado com uma linha tracejada azul O banco de registros lê os dois operandos de origem especificados pelo Instr2521 e Capítulo sete Microarquitetura 548 Instr2016 O SrcB deve vir da segunda porta do banco de registros NOT SignImm de modo que ALUSrc deve ser 0 O or é uma instrução do tipoR de modo que OpALU é 10 indicando que ALUControl deve ser determinado a partir do campo funct para ser 001 O Result é obtido da ALU logo MemtoReg é 0 O resultado é escrito para o banco de registros de modo que RegWrite é 1 A instrução não escreve na memória assim MemWrite 0 A seleção do registro de destino também é mostrada com uma linha tracejada azul O registro de destino é especificado no campo rd Instr1511 portanto RegDst 1 A atualização do PC é mostrada com a linha cinza tracejada A instrução não é um branch de logo teremos branch 0 e por conseguinte também PCSrc é 0 O PC recebe o próximo valor de PCPlus4 Figura 713 Sinais de controlo e fluxo de dados no decorrer da execução de uma instrução or Capítulo sete Microarquitetura 549 Notese que os dados certamente se escoam através dos caminhos não destacados mas o valor destes dados não é importante para esta instrução Por exemplo o imediata tem o sinal estendido e os dados são lidos a partir da memória mas estes valores não influenciam o estado seguinte do sistema 733 Mais Instruções Considerámos um subconjunto limitado de todo o conjunto de instruções MIPS Adicionando suporte para as instruções addi e j ilustra o princípio de como lidar com as novas instruções e também nos dá uma instrução suficientemente rica para escrever muitos programas interessantes Veremos que para apoiar algumas instruções simplesmente é necessário melhorar o decodificador principal enquanto que apoiar outras também requer mais hardware no caminho de dados Exemplo 72 INSTRUÇÃO ADDI A instrução imediata de soma addi adiciona o valor de um registro ao valor imediato e escreve o resultado para outro registro O caminho de dados já é capaz de realizar esta tarefa Determine as mudanças necessárias para que o controlador para que possa suportar addi Solução Tudo o que precisamos fazer é adicionar uma nova linha à tabela verdade do decodificador principal mostrando os valores do sinal de controlo para addi tal como consta da Tabela 74 O resultado deve ser escrito para o banco de registros de modo que RegWrite 1 O registro de destino é especificado no campo rt da instrução de modo que RegDst 0 O SrcB vem do imediato assim ALUSrc 1 A instrução não é um branch nem escreve na memória assim Branch MemWrite 0 O resultado vem da ALU não da memória de modo que MemtoReg 0 Finalmente a ALU deve adicionar por isso ALUOp 00 Capítulo sete Microarquitetura 550 Tabela 74 Tabela verdade do decodificador principal melhorado para suportar addi Exemplo 73 Instrução j A instrução de salto j escreve um novo valor para o PC Os dois bits menos significativos do PC estão sempre 0 porque o PC está alinhado com a palavra isto é sempre um múltiplo de 4 Os próximos 26 bits são retirados do campo de endereço de salto em Instr250 Os quatro bits superiores são retirados do valor antigo do PC O caminho de dados existente carece de hardware para calcular PC desta forma Determine as mudanças necessárias tanto para o caminho de dados como para o controlador para lidar com j Solução Em primeiro lugar é preciso acrescentar o hardware para calcular o próximo valor do PC PC no caso de uma instrução J e de um multiplexador para selecionar o próximo PC como mostrado na Figura 714 O novo multiplexador usa o novo sinal de controle Jump Agora temos de adicionar uma linha à tabela verdade do decodificador principal para a instrução j e uma coluna para o sinal Jump como mostra a Tabela 75 O sinal de controlo Jump está a 1 para a instrução j e a 0 para todos as outras A Instrução J não escreve no banco de registros ou na memória de modo que RegWrite MemWrite 0 Portanto não nos preocupamos com os cálculos realizados no caminho de dados e RegDst ALUSrc Branch MemtoReg ALUOp X Capítulo sete Microarquitetura 551 Figura 714 Caminho de dados MIPS de cicloúnico melhorado para suportar a instrução j Capítulo sete Microarquitetura 552 Tabela 75 Tabela verdade do decodificador melhorado para suportar j 734 Análise de Desempenho Cada instrução no processador de cicloúnico requer um ciclo de relógio de modo que o CPI é 1 O caminho crítico para a instrução lw é mostrado na Figura 715 com uma linha tracejada azul escura Ele começa com o PC a carregar um novo endereço no flanco de subida do relógio A memória de instrução lê a próxima instrução O banco de registros lê SrcA Enquanto o banco de registros faz a leitura é realizada a extensão do sinal do campo imediato e selecionado no multiplexor ALUSrc para determinar SrcB A ALU acrescenta SrcA e SrcB para encontrar o endereço efetivo A memória de dados lê a partir deste endereço O multiplexador MemtoReg seleciona ReadData Finalmente o Result deve preparar o banco de registros antes da próxima transição de flanco ascendente do relógio de modo que ele possa ser devidamente escrito Assim o tempo de ciclo é 𝑇𝑐 𝑡𝑝𝑐𝑞𝑃𝐶 𝑡𝑚𝑒𝑚 max𝑡𝑅𝐹𝑟𝑒𝑎𝑑 𝑡𝑠𝑒𝑥𝑡 𝑡𝑚𝑢𝑥 𝑡𝐴𝐿𝑈 𝑡𝑚𝑒𝑚 𝑡𝑚𝑢𝑥 𝑡𝑅𝐹𝑠𝑒𝑡𝑢𝑝 72 Na maioria das tecnologias de implementação os acessos à ALU memória e banco de registros são substancialmente mais lentos do que as outras operações Portanto o tempo de ciclo é simplificado para 𝑇𝑐 𝑡𝑝𝑐𝑞𝑃𝐶 2𝑡𝑚𝑒𝑚 𝑡𝑅𝐹𝑟𝑒𝑎𝑑 𝑡𝐴𝐿𝑈 𝑡𝑚𝑒𝑚 𝑡𝑚𝑢𝑥 𝑡𝑅𝐹𝑠𝑒𝑡𝑢𝑝 73 Os valores numéricos destes tempos irão depender da tecnologia de implementação específica Capítulo sete Microarquitetura 553 Outras instruções têm caminhos críticos mais curtos Por exemplo as instruções tipoR não precisa aceder à memória de dados No entanto disciplinamonos à concepção sequencial síncrona de modo que o período de relógio é constante e deve ser longo o suficiente para acomodar a instrução mais lenta Figura 715 Caminho crítico da instrução lw Exemplo 74 DESEMPENHO DE UM PROCESSADOR DE CICLOÚNICO Ben Bitdiddle está contemplando a construção do processador MIPS de cicloúnico num processo de fabricação CMOS de 65 nm Ele concluiu que os elementos lógicos têm os atrasos apresentados na Tabela 76 Ajude a calcular o tempo de execução de um programa com 100 bilhões de instruções Solução De acordo com a Equação 73 o tempo de ciclo do processador de cicloúnico é Tc1 2 30 250 150 200 25 20 925 ps Usamos o índice 1 para distinguilo dos modelos de processador subsequentes De acordo com a Equação 71 o tempo total de execução é T1 100 109 instruções 1 ciclo instrução 925 1012 s ciclo 925 segundos Capítulo sete Microarquitetura 554 Tabela 76 Atrasos dos elementos do circuito 74 PROCESSADOR MULTICICLO O processador de cicloúnico tem três fraquezas principais Em primeiro lugar requer um ciclo de relógio longo o suficiente para suportar a instrução mais lenta lw embora a maioria das instruções sejam mais rápidas Em segundo lugar exige três somadores um na ALU e dois na lógica de PC os somadores são circuitos relativamente caros especialmente se eles devem ser rápidos E em terceiro lugar tem memórias de instrução e de dados separadas o que pode não ser realista A maioria dos computadores tem uma única memória grande que mantém as instruções e os dados e que podem ser lidas e escritas O processador multiciclo aborda estas deficiências quebrando uma instrução em vários passos mais curtos Em cada pequeno passo o processador pode ler ou escrever na memória ou banco de registros ou usar a ALU Diferentes instruções usam diferentes números de passos de modo que as instruções mais simples podem ser executadas mais rapidamente do que as mais complexas O processador precisa de apenas um somador este componente é reutilizado para diferentes fins nos diversos estágios E o processador usa uma memória combinada para instruções e dados A instrução Capítulo sete Microarquitetura 555 é obtida a partir da memória no primeiro passo e os dados podem ser lidos ou escritos nos estágios posteriores Projetamos um processador multiciclo seguindo o mesmo procedimento que foi utilizado para o processador de cicloúnico Em primeiro lugar construir um caminho de dados ligando os elementos de estado de arquitetura e as memórias com a lógica combinatória Mas desta vez também devemos adicionar os elementos de estado nãoarquitetural para manter os resultados intermediários entre os passos Projetamos então o controlador O controlador produz sinais diferentes em diferentes estágios durante a execução de uma única instrução por isso agora é uma máquina de estado finita em vez de lógica combinatória Voltamos a analisar a forma de adicionar novas instruções ao processador Finalmente analisamos o desempenho do processador multiciclo e comparamolo com o processador de cicloúnico 741 Caminho de Dados Multiciclo Mais uma vez começamos o nosso projeto com a memória e o estado de arquitetura do processador MIPS mostrada na Figura 716 Na concepção de cicloúnico usamos memórias de instruções e dados separadas porque é necessário ler a memória de instrução e ler ou escrever a memória de dados num ciclo Agora optamos por usar uma memória combinada para ambas as instruções e dados Isto é mais realista e é viável porque podemos ler a instrução num ciclo em seguida ler ou escrever os dados num ciclo separado O PC e o banco de registros permanecem inalterados Gradualmente construímos o caminho de dados através da adição de componentes para lidar com cada estágio de cada instrução As novas ligações são enfatizadas em preto ou azul para os novos sinais de controle enquanto o hardware que já foi estudado é mostrado em cinza O PC contém o endereço da instrução a executar O primeiro passo é ler esta instrução da memória de instruções A Figura 717 mostra que o PC está simplesmente ligado à entrada de endereço da memória de instruções A instrução é lida e armazenada num novo Registro de Instrução não arquitetural de modo a que esteja disponível para ciclos futuros O Registro de Instrução recebe um sinal de habilitação chamado IRWrite que é ativado quando deve ser atualizado com uma nova instrução Capítulo sete Microarquitetura 556 Figura 716 Elementos de estado com memória unificada de instruçõesdados Figura 717 Obtendo a instrução da memória Como fizemos com o processador de cicloúnico vamos trabalhar as conexões do caminho de dados para a instrução lw Então vamos melhorar o caminho de dados para lidar com as outras instruções Para uma instrução lw o próximo passo é ler o registro de origem que contém o endereço de base Este registro é especificado no campo rs da instrução Instr2521 Estes bits da instrução são conectados a uma das entradas de endereços A1 do banco de registros como mostrado na Figura 718 O banco de registros lê o registro para RD1 Este valor é armazenado noutro registro não arquitetural A A instrução lw também requer um deslocamento O deslocamento é armazenado no campo imediato da instrução Instr150 e deve ter o sinal estendido para 32bits como mostrado na Figura 719 O valor de 32bits de sinal estendido é chamado de SignImm Para ser coerente podemos armazenar SignImm noutro registro não arquitetural No entanto SignImm é uma função Capítulo sete Microarquitetura 557 combinatória de Instr e não vai mudar enquanto a instrução atual está sendo processada por isso não há necessidade de dedicar um registro para manter o valor constante O endereço da carga é a soma do endereço de base e do deslocamento Usamos uma ALU para calcular esta soma como mostrado na Figura 720 O ALUControl deve ser definido como 010 para executar uma soma O ALUResult é armazenado num registro não arquitetural chamado ALUOut Figura 718 Leitura do operando fonte do banco de registros O próximo passo é carregar os dados do endereço calculado na memória Adicionamos um multiplexador em frente da memória para escolher o endereço de memória Adr seja a partir do PC ou do ALUOut como mostrado na Figura 721 O sinal de seleção do multiplexador é chamado IorD para indicar tanto um endereço de instrução como de dados Os dados lidos a partir da memória são armazenados noutro registro não arquitetural chamada de Data Observe que o multiplexador de endereços permite reutilizar a memória durante a instrução lw No primeiro passo o endereço é tomado a partir do PC para obter a instrução Num passo posterior o endereço é obtido a partir de ALUOut para carregar os dados Assim IorD deve ter valores diferentes em diferentes estágios Na Seção 742 desenvolvemos o controlador FSM que gera essas sequências de sinais de controlo Capítulo sete Microarquitetura 558 Figura 719 Extensão do sinal do imediato Figura 720 Adição do endereço de base ao offset Figura 721 Carregamento de dados da memória Capítulo sete Microarquitetura 559 Finalmente os dados são gravados de volta para o banco de registros como mostrado na Figura 722 O registro de destino é especificado pelo campo rt da instrução Instr2016 Enquanto tudo isso está acontecendo o processador deve atualizar o contador de programa adicionando 4 para o PC antigo No processador de cicloúnico era necessário um somador em separado No processador multiciclo podemos utilizar a ALU existente num dos passos quando não está ocupada Para fazer isso devemos inserir multiplexadores de origem para escolher o PC e a constante 4 como entradas da ULA como mostrado na Figura 723 Um multiplexador de duas entradas controladas por ALUSrcA escolhe o PC ou o registro A como SrcA Um multiplexador de quatro entradas controladas por ALUSrcB escolhe 4 ou SignImm como SrcB Usamos as outras duas entradas do multiplexador mais tarde quando estendemos o caminho de dados para lidar com outras instruções A numeração das entradas para o multiplexador é arbitrária Para atualizar o PC a ALU soma SrcA PC a SrcB 4 e o resultado é escrito no registro contador de programa O sinal de controlo PCWrite permite que o registro PC seja escrito apenas em determinados ciclos Figura 722 Escrita de dados no banco de registros Capítulo sete Microarquitetura 560 Figura 723 Incrementado o PC de 4 Isso completa o caminho de dados para a instrução lw Em seguida vamos estender o caminho de dados para lidar também com a instrução sw Como a instrução lw a instrução sw lê um endereço base da porta 1 do banco de registros e estende o sinal do imediato A ALU soma o endereço de base ao imediato para encontrar o endereço de memória Todas estas funções já são suportadas pelo hardware existente no caminho de dados A única característica nova da sw é que devemos ler um segundo registro do banco de registros e escrevêlo para a memória como mostrado na Figura 724 O registro é especificado no campo de rt de instruções Instr2016 o qual está ligado à segunda porta do banco de registros Quando o registro é lido ele é armazenado num registro não arquitetural B No passo seguinte ele é enviado para a porta de escrita de dados WD da memória de dados a ser escrita A memória recebe um sinal de controlo MemWrite adicional para indicar que a escrita deve ocorrer Capítulo sete Microarquitetura 561 Figura 724 Caminho de dados melhorado para suportar a instrução sw Figura 725 Caminho de dados melhorado para instruções do tipoR Para obter instruções do tipoR a instrução é novamente obtida e os dois registros de origem são lidos a partir do banco de registros A ALUSrcB10 a entrada de controle do multiplexador SrcB é utilizado para escolher o registro B como o segundo registro de origem para a ALU como mostrado na Figura 725 A ALU executa a operação apropriada e armazena o resultado em ALUOut No próximo estágio ALUOut é escrito de volta para o registro especificado pelo campo rd da instrução Instr1511 Isto requer dois novos multiplexadores O multiplexador MemtoReg selecciona se WD3 vem de ALUOut para instruções tipoR ou de Data para lw A instrução RegDst selecciona se o registro de destino é especificado no campo rt ou rd da instrução Capítulo sete Microarquitetura 562 Figura 726 Caminho de dados melhorado para a instrução beq Para as instruções beq a instrução é outra vez obtida e os dois registros de fonte são lidos do banco de registros Para determinar se os registros são iguais a ALU subtrai os registros e quando o resultado é zero a flag Zero é ativada Entretanto o caminho de dados deve determinar o próximo valor do PC se o branch for necessário PC PC SignImm 4 No processador de cicloúnico de instrução foi acrescentado outro somador destinado a determinar o endereço de branch No processador multiciclo a ALU pode ser utilizada novamente para economizar hardware No primeiro passo a ALU determina PC 4 e coloca o resultado no program counter como é realizado para as outras instruções Noutro passo a ALU utiliza este valor atualizado do PC para determinar PC Sign Imm 4 SignImm é deslocado 2 vezes para a direita para o multiplicar por 4 como demonstrado na Figura 726 O multiplexador SrcB escolhe este valor e somao ao PC Esta soma representa o destino do Branch e é armazenado no ALUOut Outro multiplexar controlado pelo PCScr escolhe que sinal deve ser enviado para o PC O program counter deve ser escrito quando o PCWriter é ativado ou quando um Branch é executado Um novo sinal de controlo Branch indica quando a instrução beq está a ser executada O Branch é executado se Zero é também ativado Assim o caminho de dados determina uma nova permissão de escrita em PC chamada PCEn que está a TRUE se o PCWrite é acedido ou quando ambos os Branch e Zero são acedidos Capítulo sete Microarquitetura 563 Isto completa o projeto do caminho de dados dos processadores multiciclo MIPS O processo de projeto é muito semelhante ao dos processadores de cicloúnico em que o hardware é sistematicamente ligado entre os elementos de estado para manipular cada uma das instruções A diferença é que a instrução é executada em diferentes passos consecutivos Registros não arquiteturais são introduzidos para armazenar os resultados dos diferentes passos Deste modo a ALU pode ser reutilizada permitindo economizar o custo de somadores extra Do mesmo modo instruções e dados podem ser armazenados numa memória partilhada Na próxima seção desenvolvemos o controlador de uma FSM que devolve a sequência apropriada de sinais de controlo ao caminho de dados em cada passo de execução de uma instrução 742 Controlo Multiciclo Como no processador de cicloúnico a unidade de controle determina os sinais de controle com base nos campos opcode e funct da instrução Instr3126 e Instr50 A Figura 727 apresenta todo o processador multiciclo MIPS com a unidade de controlo ligado ao caminho de dados O caminho de dados é mostrado em preto e a unidade de controle é mostrado em azul Como no processador de cicloúnico a unidade de controlo é dividida num controlador principal e num decodificador ALU como mostrado na Figura 728 O decodificador ALU mantémse inalterada e segue a tabela verdade da Tabela 72 Agora no entanto o controlador principal é uma FSM que aplica os sinais de controlo adequados sobre aos ciclos ou passos A sequência de sinais de controlo Capítulo sete Microarquitetura 564 depende da instrução a ser executada No restante desta seção iremos desenvolver o diagrama de transição de estado da FSM para o controlador principal Figura 727 Processador multiciclo completo O controlador principal produz os sinais de seleção do multiplexador e de ativação dos registros para o caminho de dados Os sinais de seleção são MemtoReg RegDst IorD PCSrc ALUSrcB e ALUSrcA Os sinais de ativação são IRWrite MemWrite PCWrite Branch e RegWrite Para manter os diagramas de transição de estado legíveis apenas os sinais de controlo relevantes são listados Os sinais de seleção são listados apenas quando são relevantes caso contrário são não relevantes Os sinais de ativação são listados apenas quando eles são acedidos Caso contrário são 0 Capítulo sete Microarquitetura 565 Figura 728 Estrutura interna da unidade de controlo O primeiro passo para qualquer instrução é obter a instrução da memória no endereço contido no PC A FSM entra neste estado após reset Para ler a memória IorD 0 de modo que o endereço é tomado a partir do PC IRWrite é ativado para escrever a instrução no registro de instrução IR Enquanto isso o PC deve ser incrementado de 4 para apontar para a próxima instrução Porque a ALU não está a ser usada para qualquer outra coisa o processador pode usála para calcular PC 4 ao mesmo tempo que se obtém a instrução ALUSrcA 0 então SrcA vem do PC ALUSrcB 01 então SrcB é a constante 4 ALUOp 00 então o decodificador da ALU produz ALUControl 010 para fazer a ALU adicionar Para atualizar o PC com este novo valor PCSrc 0 e PCWrite é ativado Estes sinais de controlo são apresentados na Figura 729 O fluxo de dados neste passo é mostrado na Figura 730 com a obtenção de instruções demonstrada utilizando a linha tracejada azul e o incremento do PC demonstrado utilizando a linha tracejada cinzento O próximo passo é ler o banco de registros e decodificar a instrução O banco de registros lê sempre as duas fontes especificadas pelos campos rs e rt da instrução Enquanto isso o sinal do imediato A descodificação envolve examinar o opcode da instrução para determinar o que fazer a seguir Não são necessários sinais de controlo para descodificar a instrução mas a FSM deve esperar Figura 729 Obter a instrução fetch Capítulo sete Microarquitetura 566 um ciclo para que a leitura e a descodificação se completem conforme mostrado na Figura 731 O novo estado é destacada em azul O fluxo de dados é mostrado na Figura 732 Figura 730 Fluxo de dados no decorrer do passo de obtenção da instrução Figura 731 Descodificação Capítulo sete Microarquitetura 567 Figura 732 Fluxo de dados no decorrer do passo de descodificação Agora a FSM prossegue para um dos vários estados possíveis dependendo do opcode Se a instrução é um carregamento de ou para a memória lw ou sw o processador multiciclo determina o endereço adicionando o endereço base ao imediato com sinal estendido Isso requer que ALUSrcA 1 para seleccionar o registro A e que ALUSrcB 10 para seleccionar SignImm ALUOp 00 assim a ALU adiciona O endereço efectivo é armazenado no registro ALUOut para uso no passo seguinte Este passo da FSM é mostrado na Figura 733 e o fluxo de dados é mostrado na Figura 734 Se a instrução é lw o processador multiciclo deve de seguida ler os dados da memória e escrevêlos para o banco de registros Estes dois passos são mostrados na Figura 735 Para ler a partir da memória IorD 1 para seleccionar o endereço de memória que acabou de ser determinado e guardado em ALUOut Este endereço na memória é lido e guardado no registro de dados durante o estágio S3 No próximo estágio S4 os dados são gravados no banco de registros Capítulo sete Microarquitetura 568 MemtoReg 1 para selecionar Data e RegDst 0 para puxar o registro de destino do campo rt da instrução RegWrite é activado para executar a gravação completando a instrução lw Finalmente a FSM retorna ao estado inicial S0 para obter a próxima instrução Para este e subsequentes estágios tente visualizar o fluxo de dados sozinho Do estado S2 se a instrução for sw os dados lidos a partir da segunda porta do banco de registros são simplesmente escritos na memória No S3 estado IorD 1 para selecionar o endereço calculado em S2 e guardados em ALUOut MemWrite é ativado para escrever na memória Novamente a FSM volta a S0 para obter a próxima instrução O passo acrescentado é mostrado na Figura 736 Figura 733 Determinação do endereço de memória Capítulo sete Microarquitetura 569 Figura 734 Fluxo de dados no decorre da determinação do endereço de memória Se o opcode indica uma instrução do tipoR o processador multiciclo deve determinar o resultado usando a ALU e escrever esse resultado para no banco de registros A Figura 737 apresenta estes dois passos Em S6 a instrução é executada através da selecção dos registros A e B ALUSrcA 1 ALUSrcB 00 e realizando a operação da ALU indicada pelo campo funct da instrução ALUOp 10 para todas as instruções do tipoR O ALUResult é armazenado em ALUOut Em S7 ALUOut é gravado no banco de registros RegDst 1 porque o registro de destino é especificado no campo rd da instrução MemtoReg 0 porque os dados de gravação WD3 vem de ALUOut RegWrite é activado para gravar o banco e registros Para uma instrução beq o processador deve determinar o endereço de destino e comparar os dois registros fonte para determinar se o branch deve ser realizado Isto requer dois usos da ALU e portanto pode exigir dois novos estados Observe no entanto que a ALU não foi usada durante S1 Capítulo sete Microarquitetura 570 quando os registros estavam a ser lido O processador pode também usar a ALU nessa altura para calcular o endereço de destino adicionando ao PC incrementado PC 4 para SignImm 4 como mostrado na Figura 738 ALUSrcA 0 para selecionar o PC incrementado ALUSrcB 11 para selecionar SignImm 4 e ALUOp 00 para somar O endereço de destino é armazenado em ALUOut Se a instrução não é beq o endereço calculado não será utilizado nos ciclos subsequentes mas a sua computação foi inofensiva Em S8 o processador compara os dois registros subtraindoos e verificando se o resultado é 0 Se assim for o processador passa para o endereço que acabou de ser determinado ALUSrcA 1 para selecionar o registro A ALUSrcB 00 para selecionar o registro B ALUOp 01 para subtrair PCSrc 1 para tomar o endereço de destino de ALUOut e Branch 1 para atualizar o PC com este endereço se o resultado da ALU é de 0 Figura 735 Leitura da memória Capítulo sete Microarquitetura 571 Colocando estes passos juntos a Figura 739 mostra o diagrama de transição de estado completo para o controlador principal do processador multiciclo Converter em hardware é uma tarefa simples mas tediosa usando as técnicas do Capítulo 3 Melhor ainda a FSM pode ser codificada em um HDL e sintetizada utilizando as técnicas do Capítulo 4 Figura 736 Escrita da memória Capítulo sete Microarquitetura 572 Figura 737 Execução de uma operação do tipoR Capítulo sete Microarquitetura 573 743 Mais Instruções Como fizemos na Seção 733 para o processador de cicloúnico vamos agora estender o processador multiciclo para suportar as instruções Addi e j Os dois exemplos seguintes ilustram o processo de projeto geral para suportar as novas instruções Exemplo 75 INSTRUÇÃO ADDI Modificar o processador multiciclo para suportar addi Figura 738 Branch Capítulo sete Microarquitetura 574 Solução O caminho de dados já é capaz de adicionar registros a imediatos então tudo o que precisamos fazer é adicionar novos estados à FSM do controlador principal para addi como mostrado na Figura 741 Os estados são semelhantes aos das instruções do tipoR Em S9 o registro A adicionado a SignImm ALUSrcA 1 ALUSrcB 10 ALUOp 00 e o resultado ALUResult é armazenado em ALUOut Em S10 ALUOut é escrito no registro especificado pelo campo de rt da instrução RegDst 0 MemtoReg 0 RegWrite são activados O leitor astuto pode perceber que S2 e S9 são idênticos e podem ser fundidos num único estado Exemplo 76 INSTRUÇÃO J Modificar o processador multiciclo para suportar j Solução Em primeiro lugar temos de modificar o caminho de dados para calcular o próximo valor do PC no caso de uma instrução j Em seguida devemos adicionar um estado ao controlador principal para lidar com a instrução A Figura 742 mostra o caminho de dados melhorado O endereço de destino do salto é formado deslocando para a esquerda por dois o campo de endereço addr de 26bits da instrução em seguida antecedendo os quatro bits mais significativos da PC já incrementado O multiplexador PCSrc será estendido para ocupar esse endereço como uma terceira entrada A Figura 743 mostra o controlador principal melhorado O novo estado S11 simplesmente seleciona o PC como o valor PCJump PCSrc 10 e escreve no PC Notese que o sinal de seleção PCSrc é alargado para dois bits também em S0 e S8 Capítulo sete Microarquitetura 575 Figura 739 SFM de controlo multiciclo 744 Análise de Desempenho O tempo de execução de uma instrução depende tanto do número de ciclos que ela utiliza como do tempo de ciclo Considerando que o processador de cicloúnico realiza todas as instruções num ciclo o processador multiciclo utiliza números variáveis de ciclos para as várias instruções No entanto o processador multiciclo faz menos trabalho por ciclo e assim tem um tempo de ciclo mais curto O processador multiciclo requer três ciclos para as instruções beq e j quatro ciclos para sw addi e instruções do tipoR e cinco ciclos para instruções lw O CPI depende da probabilidade relativa de que cada instrução seja usada Capítulo sete Microarquitetura 576 Figura 740 Estados do controlador principal para addi Exemplo 77 CPI DO PROCESSADOR MULTICICLO O benchmark SPECint2000 consiste em aproximadamente 25 cargas 10 armazenamentos 11 branchs 2 jumps e 52 de instruções do tipoR Determine o CPI médio para este benchmark Solução O CPI médio é a soma ao longo de cada instrução do CPI para cada instrução multiplicado pela fracção de tempo que a instrução é usada Para este valor de referência o CPI média 011 002 3 052 010 4 025 5 412 Isto é melhor que o pior caso de CPI de 5 o que seria exigido se todas as instruções levassem o mesmo tempo Capítulo sete Microarquitetura 577 Figura 741 Caminho de dados MIPS multiciclo melhorado para suportar a instrução j Lembrese que projetámos o processador multiciclo de modo que cada ciclo envolvia uma operação da ALU acesso à memória ou acesso ao banco de registros Vamos supor que o banco de registros é mais rápido do que a memória e que a escrita de memória é mais rápida do que a leitura de memória Uma análise ao caminho de dados revela dois possíveis caminhos críticos que limitam o tempo de ciclo 𝑇𝑐 𝑡𝑝𝑐𝑞 𝑡𝑚𝑢𝑥 max𝑡𝐴𝐿𝑈 𝑡𝑚𝑢𝑥 𝑡𝑚𝑒𝑚 𝑡𝑠𝑒𝑡𝑢𝑝 74 Os valores numéricos destes tempos dependem da tecnologia de implementação específica Capítulo sete Microarquitetura 578 Exemplo 78 COMPARAÇÃO DO DESEMPENHO DO PROCESSADOR Ben Bitdiddle está se perguntando se seria melhor ele construir o processador multiciclo em vez do processador de cicloúnico Para ambos os projetos ele planeja usar um processo de fabricação CMOS 65 nm com os atrasos apresentados na Tabela 76 Ajude a comparar o tempo de execução de cada processador para 100 bilhões de instruções da referência SPECint2000 ver Exemplo 77 Figura 742 Estado do controlador principal para j Capítulo sete Microarquitetura 579 Solução De acordo com a Equação de 74 o tempo de ciclo do processador multiciclo é Tc2 30 25 250 20 325 ps Usando o CPI de 412 do Exemplo 77 o tempo total de execução é Τ2 100 109 instruções 412 ciclosinstrução 325 1012 sciclo 1339 segundos De acordo com o Exemplo 74 o processador de cicloúnico teve um tempo de ciclo de Tc1 925 ps um CPI de 1 e um tempo total de execução de 925 segundos Uma das motivações originais para a construção de um processador multiciclo é evitar que todas as instruções demorarem tanto tempo como a mais lenta Infelizmente este exemplo mostra que o processador multiciclo é mais lento do que o processador de cicloúnico dadas as premissas do CPI e os atrasos dos elementos do circuito O problema fundamental é que embora a instrução mais lenta lw tenha sido dividida em cinco estágios o tempo de ciclo do processador multiciclo não foi melhorado quase cinco vezes Isto em parte porque nem todos os passos têm exatamente o mesmo comprimento e em parte porque a sobrecarga de sequenciamento de 50 ps e o tempo de setup devem agora ser pago a cada passo não apenas uma só vez para toda a instrução Em geral os engenheiros têm aprendido que é difícil explorar o fato de que alguns cálculos são mais rápidos do que outros a menos que as diferenças sejam grandes Comparando com o processador de cicloúnico o processador multiciclo é provável que seja menos dispendioso pois elimina dois somadores e combina as memórias de dados e de instruções numa única unidade Ele no entanto exigem cinco registros não arquiteturais e multiplexadores adicionais 75 PROCESSADOR COM PIPEPLINE O pipeline introduzido na Seção 36 é uma forma poderosa de melhorar a taxa de transferência de um sistema digital Projetamos um processador com pipeline subdividindo o processador de ciclo único em cinco estágios de pipeline Assim cinco instruções podem ser executadas simultaneamente uma em cada estágio Uma vez que cada estágio tem apenas um quinto de toda a lógica a frequência do relógio é quase cinco vezes mais rápida Logo a latência de cada instrução é idealmente inalterada mas o rendimento é idealmente cinco vezes melhor Os microprocessadores executam milhões ou bilhões de instruções por segundo de modo que o rendimento é mais importante do que Capítulo sete Microarquitetura 580 a latência O pipelining introduz alguma sobrecarga de modo que o rendimento não será tão elevado como poderíamos idealmente desejar mas o pipelining no entanto proporciona uma tal vantagem com um custo reduzido que todos os modernos microprocessadores de alto desempenho possuem um pipeline Ler e escrever na memória e no banco de registros e usar a ALU normalmente constitui um dos maiores atrasos no processador Escolhemos um pipeline de cinco estágios para que cada estágio envolva exatamente um desses passos lentos Especificamente chamamos os cinco estágios fetch descodificar executar memória e writeback Eles são semelhantes aos cinco passos que o processador multiciclo utiliza para executar lw No estágio de fetch o processador lê as instruções a partir da memória de instruções No estágio de decodificação o processador lê os operandos do banco de registros de origem e decodifica a instrução para produzir os sinais de controle No estágio de execução o processador executa um cálculo com a ALU No estágio de memória o processador lê ou escreve na memória de dados Finalmente no estágio de writeback o processador escreve o resultado para o banco de registros quando aplicável A Figura 743 mostra um diagrama de tempo comparando o processado de cicloúnico com o processador com pipeline O tempo está no eixo horizontal e as instruções estão no eixo vertical O diagrama assume os atrasos dos elementos lógicos da Tabela 76 mas ignora os atrasos de multiplexadores e registros No processador de cicloúnico Figura 743 a a primeira instrução é lida a partir da memória no instante 0 em seguida os operadores são lidos a partir do banco de registros e em seguida a ALU executa o cálculo necessária Finalmente a memória de dados pode ser acedida e o resultado é escrito de volta para o banco de registros em 950 ps A segunda instrução começa quando o primeiro termina Assim neste diagrama o processador de cicloúnico tem uma latência de instrução de 250 150 200 250 100 950 ps e um caudal de 1 instrução por 950 ps 105 bilhões de instruções por segundo Capítulo sete Microarquitetura 581 Figura 743 Diagrama temporal a processador de cicloúnico b processador com pipeline No processador com pipeline Figura 743 b o comprimento de um estágio do pipeline é de 250 ps definida pelo estágio mais lento o acesso à memória nos estágios de fetch ou memória No instante 0 a primeira instrução é obtida a partir da memória Após 250 ps a primeira instrução entra no estágio de decodificação e a segunda instrução é obtida fetched Após 500 ps a primeira instrução é executada a segunda instrução entra no estágio de decodificação e uma terceira instrução é obtida E assim por diante até que todas as instruções são terminadas A latência de instrução é de 5 250 1250 ps A taxa de transferência é de 1 instrução por 250 ps 4 bilhões de instruções por segundo Uma vez que os estágios não são perfeitamente equilibrados com quantidades iguais de lógica a latência é ligeiramente mais longa para o processador com pipeline de que o de cicloúnico Da mesma forma a taxa de transferência não é cinco vezes maior para um pipeline de cinco estágios como para o processador de cicloúnico No entanto a vantagem de transferência é substancial Capítulo sete Microarquitetura 582 Figura 744 Visão abstrata da operação do pipeline A Figura 744 fornece uma visão abstrata do pipeline em operação na qual cada estágio é representado pictoricamente Cada estágio do pipeline é representado com os seus componentes principais memória de instrução IM leitura do banco de registros RF execução na ALU memória de dados DM e writeback no banco de registros para ilustrar o fluxo de instruções através do pipeline A leitura através de uma linha mostra os ciclos de relógio em que uma instrução específica está em cada estágio Por exemplo a instrução sub é obtida no ciclo 3 e executada no ciclo 5 Lendo para baixo numa coluna mostra o que os vários estágios do pipeline estão fazendo num determinado ciclo Por exemplo no ciclo 6 a instrução or é obtida da memória de instruções enquanto s1 está a ser lido a partir do banco de registros a ALU está computa T5 and t6 a memória de dados está ociosa e o banco de registros está a escrever uma soma para s3 Os estágios estão sombreados para indicar quando são utilizados Por exemplo a memória de dados é utilizada por lw no ciclo 4 e por sw no ciclo 8 A memória de instruções e a ALU são utilizadas em todos os ciclos O banco de registros é escrito por todas as instruções exceto sw No processador com pipeline o banco de registros é escrito na primeira parte de um ciclo e lido na segunda parte tal como sugerido pelo sombreamento Desta forma os dados podem ser lidos e escritos de volta dentro de um único ciclo Capítulo sete Microarquitetura 583 Um desafio central em sistemas com pipeline está em lidar com os conflitos hazards que ocorrem quando os resultados de uma instrução são necessários por uma instrução posterior antes de que essa instrução esteja concluída Por exemplo se o add na Figura 744 usa s2 em vez de t2 existe o perigo de que o registro s2 não tenha sido escrito pelo lw no momento em que é lido pelo add Esta seção explora o forwarding stalls e flushes como métodos para resolver estes perigos Finalmente esta seção revisita a análise de desempenho considerando a sobrecarga de sequenciamento e o impacto de hazards 751 Caminho de Dados do Pipeline O caminho de dados do pipeline é formado cortando o caminho de dados de cicloúnico em cinco estágios separados por registros do pipeline A Figura 745 a mostra o caminho de dados de ciclo único esticado para deixar espaço para os registros do pipeline A Figura 745 b mostra o caminho de dados do pipeline formado pela inserção de quatro registros de pipeline para separar o caminho de dados em cinco estágios Os estágios e os seus limites são indicados em azul Aos sinais é dado um sufixo F D E H ou W para indicar a fase em que residem O banco de registros é peculiar porque é lido na fase de decodificação e escrito na fase Writeback É obtido na fase de decodificação mas o endereço de escrita e os dados vêm do estágio Writeback Este feedback vai levar a hazards de pipeline que são discutidas na Seção 753 O banco de registros no processador com pipeline escreve no flanco descendente do CLK quando WD3 está estável Uma questão subtil mas crítica em pipelining é que todos os sinais associados a uma instrução em particular devem avançar através do pipeline em uníssono A Figura 745 b tem um erro relacionado com esta questão O leitor consegue encontrálo O erro está na lógica de escrita do banco de registros que deve operar no estágio de Writeback Os dados vêm de ResultW um sinal do estágio Writeback Mas o endereço vem de WriteRegE um sinal do estágio executar No diagrama do pipeline da Figura 744 durante o ciclo 5 o resultado da instrução lw seria escrito incorretamente para S4 em vez de s2 Capítulo sete Microarquitetura 584 A Figura 746 apresenta um caminho de dados corrigido O sinal WriteReg é agora canalizado ao longo dos estágios de Memória e Writeback por isso permanece em sincronia com o resto da instrução WriteRegW e ResultW são alimentados de volta em conjunto para o banco de registros no estágio de Writeback O leitor astuto pode perceber que a lógica do PC também é problemática porque pode ser atualizada com um sinal dos estágios de memória ou de fetch PCPlus4F ou PCBranchM Este hazard de controle será resolvido no Seção 753 Figura 745 Caminho de dados de cicloúnico e de pipeline Capítulo sete Microarquitetura 585 752 Controlo do Pipeline O processador com pipeline toma os mesmos sinais de controle que o processador de cicloúnico e portanto usa a mesma unidade de controle A unidad e de controlo examina os campos opcode e funct da instrução no estágio de decodificação para produzir os sinais de controlo como foi descrito na Seção 732 Estes sinais de controle devem ser canalizados em conjunto com os dados para que eles permaneçam sincronizados com a instrução O processador com pipeline e controlo é mostrado na Figura 747 RegWrite deve ser canalizado para o estágio Writeback antes que seja realimentado para o banco de registros assim como WriteReg foi canalizado na Figura 746 Figura 746 Caminho de dados corregido Capítulo sete Microarquitetura 586 Figura 747 Processador com pipeline e controlo 753 Hazards Num sistema COM pipeline múltiplas instruções são tratadas simultaneamente Quando uma instrução é dependente dos resultados de uma outra que ainda não tenha sido completada ocorre um hazard Figura 748 Abstração do diagrama do pipeline ilustrando hazards Capítulo sete Microarquitetura 587 O banco de registros pode ser lido e gravado no mesmo ciclo A gravação ocorre durante a primeira metade do ciclo e a leitura ocorre durante a segunda metade do ciclo portanto um registro pode ser escrito e lido de volta no mesmo ciclo sem a introdução de um hazard A Figura 748 ilustra os hazards que ocorrem quando uma instrução escreve um registro s0 e as instruções subsequentes leem esse registro Isto é designado por hazard de leitura seguido de escrita RAW ready after writer A instrução add escreve resultado em s0 na primeira metade do ciclo 5 No entanto a instrução and lê s0 no ciclo 3 obtendose um valor errado A instrução or lê s0 no ciclo de 4 mais uma vez obtendo o valor errado A instrução sub lê s0 na segunda metade do ciclo 5 obtendose o valor correto que foi escrito na primeira metade do ciclo 5 As instruções subsequentes leem também o valor correto de s0 O diagrama mostra que os hazards podem ocorrer neste pipeline quando uma instrução escreve um registro e uma das duas instruções subsequentes lê esse registro Sem tratamento especial o pipeline iria calcular o resultado errado Uma inspeção mais próxima no entanto permite observar que a soma da instrução add é calculado pela ALU no ciclo 3 e não é estritamente necessária pela instrução and até que a ALU a usa no ciclo 4 Em princípio devemos ser capazes de encaminhar o resultado de uma instrução para outra para resolver o hazard RAW sem ter que abrandar o pipeline Noutras situações exploradas mais adiante nesta seção podemos ter que parar o pipeline para dar tempo para que um resultado seja produzido antes da instrução subsequente utiliza esse resultado Em qualquer caso algo deve ser feito para resolver os hazards de modo que o programa é executado corretamente apesar do pipeline Os hazards são classificados como de dados ou de controlo Um hazard de dados ocorre quando uma instrução tenta ler um registro que ainda não foi escrito por uma instrução anterior Um hazard de controle ocorre quando a decisão de qual a próxima instrução não foi tomada no momento em que o fetch ocorre No restante desta seção vamos melhorar o processador com pipeline com uma unidade de hazard que detecta riscos e os trata adequadamente de modo que o processador executa o programa correctamente Capítulo sete Microarquitetura 588 Resolver hazards de dados com encaminhamento Alguns hazards de dados podem ser resolvidos por meio do encaminhamento também chamado de bypass um resultado do estágio de memória ou writeback para uma instrução dependente no estágio de execução Isto requer a adição de multiplexadores na frente da ALU para selecionar o operando a partir do banco de registros ou dos estágios de memória ou writeback A Figura 749 ilustra esse princípio No ciclo 4 s0 é encaminhada a partir do estágio de memória da instrução add para o estágio de execução da instrução add dependente No ciclo 5 s0 é encaminhada a partir do estágio writeback da instrução add para o estágio de execução instrução or dependente O encaminhamento é necessário quando uma instrução no estágio de execução tem um registro fonte correspondente ao registrador de destino de uma instrução nos estágios de memória ou writeback A Figura 750 modifica o processador com pipeline para suportar o encaminhamento Uma unidade de detecção de hazard e dois multiplexadores de encaminhamento são adicionados A unidade de detecção de hazard recebe os dois registros de origem da instrução na fase de execução e os registros de destino das instruções nos estágios de memória e de writeback Também recebe os sinais RegWrite dos estágios de memória e writeback para saber se o registro de destino vai realmente ser escrito por exemplo as instruções sw e beq não escrevem os resultados no banco de registros e portanto não precisam ter seus resultados encaminhados Notese que os sinais RegWrite são conectados por nome Por outras palavras em vez de atravancar o diagrama com longos fios correndo a partir dos sinais de controlo na parte superior para a unidade de harzard na parte inferior as conexões são indicadas por uma etiqueta marcada com o nome do sinal de controlo ao qual ele está ligado A unidade de detecção de hazards determina os sinais de controle para os multiplexadores de encaminhamento para escolher os operandos do banco de registros ou a partir dos resultados no estágio de memória ou de writeback Deve encaminhar a partir de um estágio se esse estágio vai escrever num registro de destino e o registro de destino corresponde ao registro de origem No entanto 0 é programado para 0 e nunca deve ser encaminhada Se tanto os estágios de memória e de writeback contêm registros de destino correspondentes o estágio de memória deve ter Capítulo sete Microarquitetura 589 prioridade pois contém a instrução mais recentemente executada Em resumo a função da lógica de encaminhamento para SrcA é dada abaixo A lógica de encaminhamento para SrcB ForwardBE é idêntica excepto que verifica rt em vez de rs if rsE 0 AND rsE WriteRegM AND RegWriteM then ForwardAE 10 else if rsE 0 AND rsE WriteRegW AND RegWriteW then ForwardAE 01 else ForwardAE 00 Figura 749 Abstração do diagrama do pipeline ilustrando o encaminhamento Capítulo sete Microarquitetura 590 Figura 750 Processador com pipeline com encaminhamento para resolver hazards Capítulo sete Microarquitetura 591 Resolver hazards de dados com stalls O encaminhamento é suficiente para resolver os hazards de dados RAW quando o resultado é calculado no estágio de execução de uma instrução porque o seu resultado pode então ser encaminhado para o estágio de execução da próxima instrução Infelizmente a instrução lw não termina a leitura de dados até o final do estágio de memória portanto o seu resultado não pode ser encaminhado para o estágio de execução da próxima instrução Dizemos que a instrução lw tem uma latência de dois ciclos pois uma instrução dependente não pode usar o seu resultado até dois ciclos mais tarde A Figura 751 apresenta este problema A instrução lw recebe dados da memória no final do ciclo 4 Mas a instrução and precisa dos dados como operandos de origem no início do ciclo 4 Não há forma de resolver este hazard com encaminhamento Figura 751 Abstração do diagrama do pipeline ilustrando os problemas de encaminhamento com lw A solução alternativa é parar o pipeline segurando a operação até que os dados fiquem disponíveis A Figura 752 mostra o stall da instrução dependente and no estágio de descodificação O and entra no estágio de descodificação no ciclo 3 onde o stall ocorre através do ciclo 4 A instrução seguinte or deve também permanecer no estágio de fetch durante ambos os ciclos porque o estágio descodificação está cheio Capítulo sete Microarquitetura 592 No ciclo 5 o resultado pode ser encaminhado a partir do estágio writeback de lw para o estágio de execução de and No ciclo 5 a fonte s0 da instrução or é lida diretamente do banco de registros sem a necessidade de encaminhamento Observe que o estágio de execução não é utilizado no ciclo 4 Da mesma forma o estágio de memória é não utilizado no ciclo 5 e o de writeback não é utilizado no ciclo 6 À propagação de estágios utilizados através do pipeline chamase bolha e comportase como uma instrução nop A bolha é introduzida zerando os sinais do estágio de execução durante o stall do estado de descodificação para que a bolha não execute uma ação e altere o estado arquitetônico Em resumo a paragem de um estágio é realizada desativando o registro pipeline de modo que o conteúdo não seja alterado Quando um estágio é parado todas os estágios anteriores também devem são parados de modo que não haja instruções subsequentes perdidas O registro de pipeline diretamente após paragem do estágio deve ser limpo para evitar a propagação para a frente de informação falsa O stall degrada o desempenho de modo que só deve ser usado quando necessário A Figura 753 modifica o processador com pipeline para adicionar stalls para a dependência de dados de lw A unidade de hazards examina a instrução no estágio de execução Se for lw e se o seu registro de destino rtE corresponde a qualquer operando fonte da instrução no estágio de descodificação rsD ou rtD essa instrução deve ser bloqueada no estágio de descodificação até que o operando fonte esteja pronto Figura 752 Abstração do diagrama do pipeline ilustrando stall para resolver hazards Capítulo sete Microarquitetura 593 Figura 753 Processador com pipeline com stalls para resolver o hazard de dados Capítulo sete Microarquitetura 594 Os stalls são suportados pela adição de entradas EN aos registros de fetch e descodificação do pipeline e uma entrada de reset síncronoclear CLR ao registro de execução do pipeline Quando um stall de lw ocorre StallD e StallF são ativados para forçar os registros dos estágios de descodificação e de fetch do pipeline a manter os seus valores antigos FlushE também é ativado para limpar o conteúdo do registro de estágio de execução do pipeline introduzindo uma bolha O sinal MemtoReg é ativado pela instrução lw Assim a lógica para computar os stalls e flushes é lwstall rsD rtE OR rtD rtE AND MemtoRegE StallF StallD FlushE lwstall Resolver Hazards de Controlo A instrução beq apresenta um hazard de controle o processador com pipeline não sabe que instrução obter em seguida porque a decisão branch não foi ainda tomada no momento em que o fetch da próxima instrução é realizado Um mecanismo para lidar com o hazard de controle é parar o pipeline até que a decisão de branch seja tomada isto é PCSrc seja computado Porque a decisão é tomada no estágio de memória o pipeline teria de ser parado por três ciclos a cada branch Isto iria degradar severamente o desempenho do sistema Uma alternativa consiste em prever se o branch será realizado e começar a executar as instruções baseadas na previsão Uma vez que a decisão de branch esteja disponível o processador pode jogar fora as instruções se a previsão estava errada Em particular suponha que prevemos que o branch não será realizado e simplesmente continuamos a executar o programa em sequência Se o branch for realizado as três instruções a seguir ao branch devem ser descartadas limpando os registros de pipeline para essas instruções Estes ciclos de instrução desperdiçados são chamados de branch misprediction penalty A Figura 754 mostra um esquema deste tipo em que um branch do endereço 20 para 64 é executado A decisão de branch não é tomada até ao ciclo 4 pelo que as instruções and or e sub Capítulo sete Microarquitetura 595 nos endereços 24 28 e 2C já tenham sido lidas Estas instruções devem ser descartadas e a instrução slt é obtida do endereço 64 no ciclo 5 Isto é uma melhoria mas descartando assim tantas instruções quando o branch é executado ainda degrada a performance Poderíamos reduzir a branch misprediction penalty se a decisão fosse feita mais cedo Tomar a decisão requer simplesmente comparar os valores de dois registros Usando um comparador igualdade dedicado é muito mais rápido do que realizar uma subtração e detecção de zero Se o comparador é suficientemente rápido poderia ser movida para trás para o estágio de descodificação de modo que os operandos sejam lidos do banco de registros e comparados para determinar o próximo PC até ao final da fase de descodificação A Figura 755 ilustra o funcionamento do pipeline com a previsão de branch a ser tomada no ciclo 2 No ciclo 3 a instrução and é descartada e a instrução slt é obtida Agora a branch misprediction penalty é reduzida para apenas uma instrução em vez de três Figura 754 Abstração do diagrama do pipeline ilustrando o flushing quando um branch é executado Capítulo sete Microarquitetura 596 Figura 755 Abstração do diagrama do pipeline ilustrando a antecipação da tomada de decisão de um branch A Figura 756 modifica o processador com pipeline para mover a decisão de branch para mais cedo e lidar com hazards de controle Um comparador de igualdade é adicionado ao estágio de descodificação e a porta AND PCSrc é antecipada de modo que PCSrc pode ser determinado no estágio de descodificação em vez de no estágio de memória O somador PCBranch também deve ser levado para o estágio de decodificação de modo a que o endereço de destino possa ser calculado a tempo A entrada limpeza síncrona CLR conectada a PCSrcD é adicionada ao registro de pipeline do estágio de descodificação para que a instrução obtida incorretamente possa ser descartada quando um branch é executado Infelizmente o hardware de antecipação da decisão de branch introduz um novo hazard de dados RAW Especificamente se um dos operandos de origem para o branch foi calculado por uma instrução anterior e ainda não foi gravado no banco de registros o branch irá ler o valor do operando errado a partir do banco de registros Como antes podemos resolver o hazard de dados enviando o valor correto se estiver disponível ou atrasando o pipeline até que os dados estejam disponíveis A Figura 757 mostra as modificações necessárias para o processador com pipeline lidar com a dependência dos dados no estágio de descodificação Se existir um resultado no estágio writeback Capítulo sete Microarquitetura 597 será escrito na primeira metade do ciclo e lido durante a segunda parte do ciclo por isso não existe nenhum hazard Se o resultado de uma instrução na ALU está no estágio de memória pode ser encaminhado para o comparador de igualdade através de dois novos multiplexadores Se o resultado de uma instrução na ALU está no estágio de execução ou o resultado de uma instrução lw está no estágio de memória o pipeline tem de ser imobilizado no estágio de descodificação até que o resultado esteja pronto A função da lógica de encaminhamento do estágio de descodificação é dada abaixo ForwardAD rsD 0 AND rsD WriteRegM AND RegWriteM ForwardBD rtD 0 AND rtD WriteRegM AND RegWriteM A função da lógica de detecção de stall para um branch é dada abaixo O processador deve tomar uma decisão de branch no estágio de descodificação Se as fontes do branch dependem de uma instrução na ALU no estágio de execução ou de uma instrução lw na fase de memória o processador deve esperar que as fontes estejam disponíveis branchstall BranchD AND RegWriteE AND WriteRegE rsD OR WriteRegE rtD OR BranchD AND MemtoRegM AND WriteRegM rsD OR WriteRegM rtD Agora o processador pode parar devido a um hazard de carga ou de branch StallF StallD FlushE lwstall OR branchstall Capítulo sete Microarquitetura 598 Figura 756 Processador com pipeline com controlo de hazard de branch Capítulo sete Microarquitetura 599 Figura 757 Processador com pipeline lida com a dependência dos dados nas instruções de branch Capítulo sete Microarquitetura 600 Sumário de Hazards Em resumo os hazards de dados RAW ocorrem quando uma instrução depende do resultado de uma outra instrução que ainda não foi escrita no banco de registros Os hazards de dados podem ser resolvidos por encaminhamento se o resultado é calculado em breve caso contrário eles exigem a paragem do pipeline até que o resultado esteja disponível Os hazards de controle ocorrem quando a decisão de qual a instrução a obter ainda não foi tomada no momento em que a próxima instrução deve ser obtida Os hazards de controlo são resolvidos com a previsão de qual a instrução a ser obtida e o esvaziamento do pipeline se a previsão estiver errada Antecipando a decisão o mais cedo possível minimiza o número de instruções que são descartadas num erro de previsão O leitor pode ter observado até agora que um dos desafios de projetar um processador com pipeline é entender todas as possíveis interações entre as instruções e descobrir todos os harzards que possam existir A Figura 758 mostra a tratamento completo de hazards por processador com pipeline 754 Mais Instruções O suporte de novas instruções pelo processador com pipeline é muito parecido com o suporte no processador de cicloúnico No entanto as novas instruções podem introduzir hazards que devem ser detectados e resolvidos Em particular o suporte de instruções addi e j no processador com pipeline requer a melhoria do controlador exatamente como foi descrito na Seção 733 e a adição de um multiplexador de jump ao caminho de dados a seguir ao multiplexador de branch Como um branch o jump ocorre no estágio de descodificação logo a instrução seguinte na fase de fetch deve ser descartada O projeto desta lógica de descarte é deixado para o Exercício 735 755 Análise de Desempenho O processador com pipeline idealmente teria um CPI de 1 porque uma nova instrução é obtida a cada ciclo No entanto um stall ou um flush desperdiça um ciclo de modo que o CPI é um pouco maior e depende do programa específico a ser executado Capítulo sete Microarquitetura 601 Exemplo 79 CPI DO PROCESSADOR COM PIPELINE O benchmark SPECint2000 considerado no Exemplo 77 é composto de aproximadamente 25 cargas 10 armazenamentos 11 branch 2 jumps e 52 instruções do tipoR Suponha que 40 das cargas são imediatamente seguidas por uma instrução que usa o resultado exigindo um stall e que um quarto dos branchs são erradamente previstos exigindo um flush Suponha que os jumps sempre descartam as instruções subsequentes Ignorar outros harzards Calcular o CPI médio do processador com pipeline Solução O CPI médio é a soma ao longo de cada instrução do CPI para essa instrução multiplicada pela fração de tempo em que a instrução é usada As cargas requerem um ciclo de relógio quando não há nenhuma dependência e dois ciclos quando o processador deve imobilizarse durante uma dependência de modo que têm um CPI de 06 1 04 2 14 Os branchs requerem um ciclo de relógio quando eles são previstos corretamente e dois quando não são por isso têm um CPI de 075 1 025 2 125 Os jumps têm sempre um CPI de 2 Todas as outras instruções têm um CPI de 1 Assim para este benchmark o CPI médio 025 14 01 1 011 125 002 2 052 1 115 Capítulo sete Microarquitetura 602 Figura 758 Processador com pipeline com tratamento completo de hazards Capítulo sete Microarquitetura 603 Podemos determinar o tempo de ciclo considerando o caminho crítico em cada um dos cinco estágios do pipeline mostrados na Figura 758 Lembrese que o banco de registros é escrito na primeira metade do ciclo writeback e lido na segunda metade do estágio de descodificação Portanto o tempo de ciclo dos estágios de descodificação e de writeback é duas vezes o tempo necessário para fazer o meio ciclo de trabalho 𝑡𝑐 max 𝑡𝑝𝑐𝑞 𝑡𝑚𝑒𝑚 𝑡𝑠𝑒𝑡𝑢𝑝 2𝑡𝑅𝐹𝑟𝑒𝑎𝑑 𝑡𝑚𝑢𝑥 𝑡𝑒𝑞 𝑡𝐴𝑁𝐷 𝑇𝑚𝑢𝑥 𝑡𝑠𝑒𝑡𝑢𝑝 𝑡𝑝𝑐𝑞 𝑡𝑚𝑢𝑥 𝑡𝑚𝑢𝑥 𝑡𝐴𝐿𝑈 𝑡𝑠𝑒𝑡𝑢𝑝 𝑡𝑝𝑐𝑞 𝑡𝑚𝑒𝑚𝑤𝑟𝑖𝑡𝑒 𝑡𝑠𝑒𝑡𝑢𝑝 2𝑡𝑝𝑐𝑞 𝑡𝑚𝑢𝑥 𝑡𝑅𝐹𝑤𝑟𝑖𝑡𝑒 𝑓𝑒𝑡𝑐ℎ 𝑑𝑒𝑠𝑐𝑜𝑑𝑖𝑓𝑖𝑐𝑎çã𝑜 𝑒𝑥𝑒𝑐𝑢çã𝑜 𝑚𝑒𝑚ó𝑟𝑖𝑎 𝑤𝑟𝑖𝑡𝑒𝑏𝑎𝑐𝑘 75 Exemplo 710 COMPARAÇÃO DO DESEMPENHO DE PROCESSADORES Ben Bitdiddle precisa comparar o desempenho do processador com pipeline com os processadores de cicloúnico e multiciclo considerados no Exemplo 78 A maioria dos atrasos lógicas foram fornecidos na Tabela 76 Os outros atrasos dos elementos são de 40 ps para um comparador de igualdade de 15 ps para uma porta AND 100 ps para uma escrita no banco de registros e 220 ps para uma escrita na memória Ajude o Ben a comparar o tempo de execução de 100 bilhões de instruções utilizando o benchmark SPECint2000 para cada processador Solução De acordo com a Equação de 75 o tempo de ciclo do processador com pipeline é Tc3 max 30 250 20 2 150 25 40 15 25 20 30 25 25 200 20 30 220 20 2 30 25 100 550 ps De acordo com a Equação 71 o tempo total de execução é T3 100 109 instruções 115 ciclos instrução 550 1012 s ciclo 633 segundos Isso se compara a 925 segundos para o processador de cicloúnico e 1339 segundos para o processador multiciclo O processador com pipeline é substancialmente mais rápido do que os outros No entanto a sua vantagem sobre o processador de cicloúnico não fica perto do aumento de velocidade em cinco vezes como seria de esperar de um pipeline de cinco estágios Os hazards de pipeline introduzem Capítulo sete Microarquitetura 604 uma pequena penalidade CPI Mais significativamente a sobrecarga de sequenciamento dos registros aplicase a cada estágio do pipeline não apenas uma vez para o caminho de dados em geral A sobrecarga de sequenciamento limita os benefícios que se podem esperar alcançar com o pipelining O leitor atento pode observar que o estágio de decodificação é substancialmente mais lento do que os outros porque a leitura do banco de registros e a comparação do branch devem ambos acontecer na metade de um ciclo Talvez movendo a comparação do branch para o estágio de decodificação não seja uma boa ideia Se os branchs em alternativa forem resolvidos no estágio de execução o CPI iria aumentar ligeiramente porque um erro de previsão iria descartar duas instruções mas o tempo de ciclo diminuiria substancialmente dando um aumento de velocidade total O processador com pipeline é similar em requisitos de hardware ao processador de cicloúnico mas acrescenta um número significativo de registros de pipeline juntamente com multiplexadores e lógica de controle para resolver hazards 76 REPRESENTAÇÃO HDL Esta seção apresenta o código HDL para o processador MIPS de cicloúnico suportando todas as instruções discutidas neste Capítulo incluindo addi e j O código ilustra as boas práticas de codificação para um sistema moderadamente complexa O código HDL para o processador multiciclo e o processador com pipeline são deixados para os Exercício 725 e Exercício 740 Nesta seção as memórias de instruções e de dados são separadas do processador principal e ligadas por barramentos de endereços e de dados Isto é mais realista porque a maioria dos processadores reais têm memória externa Também ilustra como o processador pode comunicar com o mundo exterior O processador é composto por um caminho de dados e um controlador O controlador por sua vez é composto por o decodificador principal e o decodificador da ALU A Figura 759 apresenta um diagrama de blocos do processador MIPS de cicloúnico ligado a memórias externas Capítulo sete Microarquitetura 605 O código HDL é dividido em várias seções A seção 761 fornece o HDL para o caminho de dados do processador de cicloúnico e controlador A seção 762 apresenta os módulos genéricos como os registros e os multiplexadores que são usados por qualquer microarquitetura A seção 763 introduz o testbench e as memórias externas O HDL está disponível em formato electrónico no site do livro veja o prefácio Figura 759 Processador MIPS de cicloúnico ligado a memória externa 761 Processador de cicloúnico Os módulos principais do processador MIPS de cicloúnico são dados nos seguintes exemplos HDL Capítulo sete Microarquitetura 606 Exemplo HDL 71 MICROPROCESSADOR MIPS DE CICLOÚNICO SystemVerilog module mipsinput logic clk reset output logic 310 pc input logic 310 instr output logic memwrite output logic 310 aluout writedata input logic 310 readdata logic memtoreg alusrc regdst regwrite jump pcsrc zero logic 20 alucontrol controller cinstr3126 instr50 zero memtoreg memwrite pcsrc alusrc regdst regwrite jump alucontrol datapath dpclk reset memtoreg pcsrc alusrc regdst regwrite jump alucontrol zero pc instr aluout writedata readdata endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity mips is single cycle MIPS processor portclk reset in STDLOGIC pc out STDLOGICVECTOR31 downto 0 instr in STDLOGICVECTOR31 downto 0 memwrite out STDLOGIC aluout writedata out STDLOGICVECTOR31 downto 0 readdata in STDLOGICVECTOR31 downto 0 end architecture struct of mips is component controller portop funct in STDLOGICVECTOR5 downto 0 zero in STDLOGIC memtoreg memwrite out STDLOGIC pcsrc alusrc out STDLOGIC regdst regwrite out STDLOGIC jump out STDLOGIC alucontrol out STDLOGICVECTOR2 downto 0 end component component datapath portclk reset in STDLOGIC memtoreg pcsrc in STDLOGIC alusrc regdst in STDLOGIC regwrite jump in STDLOGIC alucontrol in STDLOGICVECTOR2 downto 0 zero out STDLOGIC pc buffer STDLOGICVECTOR31 downto 0 instr in STDLOGICVECTOR31 downto 0 aluoutwritedata buffer STDLOGICVECTOR31 downto 0 readdata in STDLOGICVECTOR31 downto 0 end component signal memtoreg alusrc regdst regwrite jump pcsrc STDLOGIC signal zero STDLOGIC signal alucontrol STDLOGICVECTOR2 downto 0 begin cont controller port mapinstr31 downto 26 instr5 downto 0 zero memtoreg memwrite pcsrc alusrc regdst regwrite jump alucontrol dp datapath port mapclk reset memtoreg pcsrc alusrc regdst regwrite jump alucontrol zero pc instr aluout writedatareaddata end Capítulo sete Microarquitetura 607 Exemplo HDL 72 CONTROLADOR SystemVerilog module mipsinput logic clk reset module controllerinput logic 50 op funct input logic zero output logic memtoreg memwrite output logic pcsrc alusrc output logic regdst regwrite output logic jump output logic 20 alucontrol logic 10 aluop logic branch maindec mdop memtoreg memwrite branch alusrc regdst regwrite jump aluop aludec adfunct aluop alucontrol assign pcsrc branch zero endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity controller is single cycle control decoder portop funct in STDLOGICVECTOR5 downto 0 zero in STDLOGIC memtoreg memwrite out STDLOGIC pcsrc alusrc out STDLOGIC regdst regwrite out STDLOGIC jump out STDLOGIC alucontrol out STDLOGICVECTOR2 downto 0 end architecture struct of controller is component maindec portop in STDLOGICVECTOR5 downto 0 memtoreg memwrite out STDLOGIC branch alusrc out STDLOGIC regdst regwrite out STDLOGIC jump out STDLOGIC aluop out STDLOGICVECTOR1 downto 0 end component component aludec portfunct in STDLOGICVECTOR5 downto 0 aluop in STDLOGICVECTOR1 downto 0 alucontrol out STDLOGICVECTOR2 downto 0 end component signal aluop STDLOGICVECTOR1 downto 0 signal branch STDLOGIC begin md maindec port mapop memtoreg memwrite branch alusrc regdst regwrite jump aluop ad aludec port mapfunct aluop alucontrol pcsrc branch and zero end Capítulo sete Microarquitetura 608 Exemplo HDL 73 DECODIFICADOR PRINCIPAL SystemVerilog module maindecinput logic 50 op output logic memtoreg memwrite output logic branch alusrc output logic regdst regwrite output logic jump output logic 10 aluop logic 80 controls assign regwrite regdst alusrc branch memwrite memtoreg jump aluop controls alwayscomb caseop 6b000000 controls 9b110000010 RTYPE 6b100011 controls 9b101001000 LW 6b101011 controls 9b001010000 SW 6b000100 controls 9b000100001 BEQ 6b001000 controls 9b101000000 ADDI 6b000010 controls 9b000000100 J default controls 9bxxxxxxxxx illegal op endcase endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity maindec is main control decoder portop in STDLOGICVECTOR5 downto 0 memtoreg memwrite out STDLOGIC branch alusrc out STDLOGIC regdst regwrite out STDLOGIC jump out STDLOGIC aluop out STDLOGICVECTOR1 downto 0 end architecture behave of maindec is signal controls STDLOGICVECTOR8 downto 0 begin processall begin case op is when 000000 controls 110000010 RTYPE when 100011 controls 101001000 LW when 101011 controls 001010000 SW when 000100 controls 000100001 BEQ when 001000 controls 101000000 ADDI when 000010 controls 000000100 J when others controls illegal op end case end process regwrite regdst alusrc branch memwrite memtoreg jump aluop1 downto 0 controls end Capítulo sete Microarquitetura 609 Exemplo HDL 74 DECODIFICADOR D A ALU SystemVerilog module aludecinput logic 50 funct input logic 10 aluop output logic 20 alucontrol alwayscomb casealuop 2b00 alucontrol 3b010 add for lwswaddi 2b01 alucontrol 3b110 sub for beq default casefunct Rtype instructions 6b100000 alucontrol 3b010 add 6b100010 alucontrol 3b110 sub 6b100100 alucontrol 3b000 and 6b100101 alucontrol 3b001 or 6b101010 alucontrol 3b111 slt default alucontrol 3bxxx endcase endcase endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity aludec is ALU control decoder portfunct in STDLOGICVECTOR5 downto 0 aluop in STDLOGICVECTOR1 downto 0 alucontrol out STDLOGICVECTOR2 downto 0 end architecture behave of aludec is begin processall begin case aluop is when 00 alucontrol 010 add for 1wswaddi when 01 alucontrol 110 sub for beq when others case funct is Rtype instructions when 100000 alucontrol 010 add when 100010 alucontrol 110 sub when 100100 alucontrol 000 and when 100101 alucontrol 001 or when 101010 alucontrol 111 slt when others alucontrol end case end case end process end Capítulo sete Microarquitetura 610 Exemplo HDL 75 CAMINHO DE DADOS SystemVerilog module datapathinput logic clk reset input logic memtoreg pcsrc input logic alusrc regdst input logic regwrite jump input logic 20 alucontrol output logic zero output logic 310 pc input logic 310 instr output logic 310 aluout writedata input logic 310 readdata logic 40 writereg logic 310 pcnext pcnextbr pcplus4 pcbranch logic 310 signimm signimmsh logic 310 srca srcb logic 310 result next PC logic flopr 32 pcregclk reset pcnext pc adder pcadd1pc 32b100 pcplus4 sl2 immshsignimm signimmsh adder pcadd2pcplus4 signimmsh pcbranch mux2 32 pcbrmuxpcplus4 pcbranch pcsrc pcnextbr mux2 32 pcmuxpcnextbr pcplus43128 instr250 2b00 jump pcnext register file logic regfile rfclk regwrite instr2521 instr2016 writereg result srca writedata mux2 5 wrmuxinstr2016 instr1511 regdst writereg mux2 32 resmuxaluout readdata memtoreg result signext seinstr150 signimm ALU logic mux2 32 srcbmuxwritedata signimm alusrc srcb alu alusrca srcb alucontrol aluout zero endmodule VHDL library IEEE use IEEESTDLOGIC1164all use IEEESTDLOGICARITHall entity datapath is MIPS datapath portclk reset in STDLOGIC memtoreg pcsrc in STDLOGIC alusrc regdst in STDLOGIC regwrite jump in STDLOGIC alucontrol in STDLOGICVECTOR2 downto 0 zero out STDLOGIC pc buffer STDLOGICVECTOR31 downto 0 instr in STDLOGICVECTOR31 downto 0 aluout writedata buffer STDLOGICVECTOR31 downto 0 readdata in STDLOGICVECTOR31 downto 0 end architecture struct of datapath is component alu porta b in STDLOGICVECTOR31 downto 0 alucontrol in STDLOGICVECTOR2 downto 0 result buffer STDLOGICVECTOR31 downto 0 zero out STDLOGIC end component component regfile portclk in STDLOGIC we3 in STDLOGIC ra1 ra2 wa3 in STDLOGICVECTOR4 downto 0 wd3 in STDLOGICVECTOR31 downto 0 rd1 rd2 out STDLOGICVECTOR31 downto 0 end component component adder porta b in STDLOGICVECTOR31 downto 0 y out STDLOGICVECTOR31 downto 0 end component component sl2 porta in STDLOGICVECTOR31 downto 0 y out STDLOGICVECTOR31 downto 0 end component component signext porta in STDLOGICVECTOR15 downto 0 y out STDLOGICVECTOR31 downto 0 end component component flopr genericwidth integer portclk reset in STDLOGIC Capítulo sete Microarquitetura 611 d in STDLOGICVECTORwidth1 downto 0 q out STDLOGICVECTORwidth1 downto 0 end component component mux2 genericwidth integer portd0 d1 in STDLOGICVECTORwidth1 downto 0 s in STDLOGIC y out STDLOGICVECTORwidth1 downto 0 end component signal writereg STDLOGICVECTOR4 downto 0 signal pcjump pcnext pcnextbr pcplus4 pcbranch STDLOGICVECTOR31 downto 0 signal signimm signimmsh STDLOGICVECTOR31 downto 0 signal srca srcb result STDLOGICVECTOR31 downto 0 begin next PC logic pcjump pcplus431 downto 28 instr25 downto 0 00 pcreg flopr generic map32 port mapclk reset pcnext pc pcadd1 adder port mappc X00000004 pcplus4 immsh sl2 port mapsignimm signimmsh pcadd2 adder port mappcplus4 signimmsh pcbranch pcbrmux mux2 generic map32 port mappcplus4 pcbranch pcsrc pcnextbr pcmux mux2 generic map32 port mappcnextbr pcjump jump pcnext register file logic rf regfile port mapclk regwrite instr25 downto 21 instr20 downto 16 writereg result srca writedata wrmux mux2 generic map5 port mapinstr20 downto 16 instr15 downto 11 regdst writereg resmux mux2 generic map32 port mapaluout readdata memtoreg result se signext port mapinstr15 downto 0 signimm ALU logic srcbmux mux2 generic map32 port mapwritedata signimm alusrc srcb mainalu alu port mapsrca srcb alucontrol aluout zero end Capítulo sete Microarquitetura 612 762 Blocos de Construção Genéricos Esta seção contém blocos genéricos de construção que podem ser úteis em qualquer microarquitetura MIPS incluindo um banco de registros somador unidade de deslocamento para a esquerda unidade de extensão de sinal flipflop resettable e multiplexador O HDL para a ALU é deixado para o Exercício 59 Exemplo HDL 76 BANCO DE REGISTROS SystemVerilog module regfileinput logic clk input logic we3 input logic 40 ra1 ra2 wa3 input logic 310 wd3 output logic 310 rd1 rd2 logic 310 rf310 three ported register file read two ports combinationally write third port on rising edge of clk register 0 hardwired to 0 note for pipelined processor write third port on falling edge of clk alwaysff posedge clk if we3 rfwa3 wd3 assign rd1 ra1 0 rfra1 0 assign rd2 ra2 0 rfra2 0 endmodule VHDL library IEEE use IEEESTDLOGIC1164all use IEEENUMERICSTDUNSIGNEDall entity regfile is threeport register file portclk in STDLOGIC we3 in STDLOGIC ra1 ra2 wa3 in STDLOGICVECTOR4 downto 0 wd3 in STDLOGICVECTOR31 downto 0 rd1 rd2 out STDLOGICVECTOR31 downto 0 end architecture behave of regfile is type ramtype is array 31 downto 0 of STDLOGICVECTOR31 downto 0 signal mem ramtype begin threeported register file read two ports combinationally write third port on rising edge of clk register 0 hardwired to 0 note for pipelined processor write third port on falling edge of clk processclk begin if risingedgeclk then if we3 1 then memtointegerwa3 wd3 end if end if end process processall begin if tointegerra1 0 then rd1 X00000000 register 0 holds 0 else rd1 memtointegerra1 end if if tointegerra2 0 then rd2 X00000000 else rd2 memtointegerra2 end if end process end Capítulo sete Microarquitetura 613 Exemplo HDL 77 SOMADOR SystemVerilog module adderinput logic 310 a b output logic 310 y assign y a b endmodule VHDL library IEEE use IEEESTDLOGIC1164all use IEEENUMERICSTDUNSIGNEDall entity adder is adder porta b in STDLOGICVECTOR31 downto 0 y out STDLOGICVECTOR31 downto 0 end architecture behave of adder is begin y ab end Exemplo HDL 78 DESLOCAMENTO PARA A ESQUERDA MULTIPLICA POR 4 SystemVerilog module sl2input logic 310 a output logic 310 y shift left by 2 assign y a290 2b00 endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity sl2 is shift left by 2 porta in STDLOGICVECTOR31 downto 0 y out STDLOGICVECTOR31 downto 0 end architecture behave of sl2 is begin y a29 downto 0 00 end Capítulo sete Microarquitetura 614 Exemplo HDL 79 EXTENSÃO DE SINAL SystemVerilog module signextinput logic 150 a output logic 310 y assign y 16a15 a endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity signext is sign extender porta in STDLOGICVECTOR15 downto 0 y out STDLOGICVECTOR31 downto 0 end architecture behave of signext is begin y Xffff a when a15 else X0000 a end Exemplo HDL 710 FLIPFLOP RESETTABLE SystemVerilog module flopr parameter WIDTH 8 input logic clk reset input logic WIDTH10 d output logic WIDTH10 q alwaysff posedge clk posedge reset if reset q 0 else q d endmodule VHDL library IEEE use IEEESTDLOGIC1164all use IEEESTDLOGICARITHall entity flopr is flipflop with synchronous reset generic width integer portclk reset in STDLOGIC d in STDLOGICVECTORwidth1 downto 0 q out STDLOGICVECTORwidth1 downto 0 end architecture asynchronous of flopr is begin processclk reset begin if reset then q others 0 elsif risingedgeclk then q d end if end process end Capítulo sete Microarquitetura 615 Exemplo HDL 711 MULTIPLEXADOR SystemVerilog module mux2 parameter WIDTH 8 input logic WIDTH10 d0 d1 input logic s output logic WIDTH10 y assign y s d1 d0 endmodule VHDL library IEEE use IEEESTDLOGIC1164all entity mux2 is twoinput multiplexer genericwidth integer 8 portd0 d1 in STDLOGICVECTORwidth1 downto 0 s in STDLOGIC y out STDLOGICVECTORwidth1 downto 0 end architecture behave of mux2 is begin y d1 when s else d0 end 763 Testbench O testbench MIPS carrega um programa nas memórias O programa na Figura 760 exercita todas as instruções através da realização de um cálculo que deve produzir a resposta correta somente se todas as instruções estão funcionando corretamente Especificamente o programa irá escrever o valor 7 para o endereço 84 se ele é executado corretamente e é improvável que o faça se o hardware tiver algum problema Este é um exemplo de teste ad hoc O código de máquina é armazenado num ficheiro chamado memfiledat hexadecimal ver Figura 761 que é carregado pelo testbench durante a simulação O arquivo consiste no código de máquina para as instruções uma instrução por linha O código VHDL do testbench do módulo de alto nível MIPS e da memória externa são dados nos seguintes exemplos As memórias neste exemplo armazenam 64 palavras cada Capítulo sete Microarquitetura 616 mipstestasm DavidHarrishmcedu SarahHarrishmcedu 31 March 2012 Test the MIPS processor add sub and or slt addi lw sw beq j If successful it should write the value 7 to address 84 Assembly Description Address Machine main addi 2 0 5 initialize 2 5 0 20020005 addi 3 0 12 initialize 3 12 4 2003000c addi 7 3 9 initialize 7 3 8 2067fff7 or 4 7 2 4 3 OR 5 7 c 00e22025 and 5 3 4 5 12 AND 7 4 10 00642824 add 5 5 4 5 4 7 11 14 00a42820 beq 5 7 end shouldnt be taken 18 10a7000a slt 4 3 4 4 12 7 0 1c 0064202a beq 4 0 around should be taken 20 10800001 addi 5 0 0 shouldnt happen 24 20050000 around slt 4 7 2 4 3 5 1 28 00e2202a add 7 4 5 7 1 11 12 2c 00853820 sub 7 7 2 7 12 5 7 30 00e23822 sw 7 683 80 7 34 ac670044 lw 2 800 2 80 7 38 8c020050 j end should be taken 3c 08000011 addi 2 0 1 shouldnt happen 40 20020001 end sw 2 840 write mem84 7 44 ac020054 Figura 760 Assembly e código máquina para o programa de teste MIPS 20020005 2003000c 2067fff7 00e22025 00642824 00a42820 10a7000a 0064202a 10800001 20050000 00e2202a 00853820 00e23822 ac670044 8c020050 08000011 20020001 ac020054 Figura 761 Conteúdo do memfiedat Capítulo sete Microarquitetura 617 Exemplo HDL 712 TESTBENCH MIPS SystemVerilog module testbench logic clk logic reset logic 310 writedata dataadr logic memwrite instantiate device to be tested top dut clk reset writedata dataadr memwrite initialize test initial begin reset 1 22 reset 0 end generate clock to sequence tests always begin clk 1 5 clk 0 5 end check results always negedge clk begin if memwrite begin if dataadr84 writedata7 begin displaySimulation succeeded stop end else if dataadr 80 begin displaySimulation failed stop end end end endmodule VHDL library IEEE use IEEESTDLOGIC1164all use IEEENUMERICSTDUNSIGNEDall entity testbench is end architecture test of testbench is component top portclk reset in STDLOGIC writedata dataadr out STDLOGICVECTOR31 downto 0 memwrite out STDLOGIC end component signal writedata dataadr STDLOGICVECTOR31 downto 0 signal clk reset memwrite STDLOGIC begin instantiate device to be tested dut top port mapclk reset writedata dataadr memwrite Generate clock with 10 ns period process begin clk 1 wait for 5 ns clk 0 wait for 5 ns end process Generate reset for first two clock cycles process begin reset 1 wait for 22 ns reset 0 wait end process check that 7 gets written to address 84 at end of program processclk begin if clkevent and clk 0 and memwrite 1 then if tointegerdataadr 84 and tointeger writedata 7 then report NO ERRORS Simulation succeeded severity failure elsif dataadr 80 then report Simulation failed severity failure end if end if end process end Capítulo sete Microarquitetura 618 Exemplo HDL 713 MODELO DE ALTO NÍVEL MIPS SystemVerilog module topinput logic clk reset output logic 310 writedata dataadr output logic memwrite logic 310 pc instr readdata instantiate processor and memories mips mipsclk reset pc instr memwrite dataadr writedata readdata imem imempc72 instr dmem dmemclk memwrite dataadr writedata readdata endmodule VHDL library IEEE use IEEESTDLOGIC1164all use IEEENUMERICSTDUNSIGNEDall entity top is toplevel design for testing portclk reset in STDLOGIC writedata dataadr buffer STDLOGICVECTOR31 downto 0 memwrite buffer STDLOGIC end architecture test of top is component mips portclk reset in STDLOGIC pc out STDLOGICVECTOR31 downto 0 instr in STDLOGICVECTOR31 downto 0 memwrite out STDLOGIC aluout writedata out STDLOGICVECTOR31 downto 0 readdata in STDLOGICVECTOR31 downto 0 end component component imem porta in STDLOGICVECTOR5 downto 0 rd out STDLOGICVECTOR31 downto 0 end component component dmem portclk we in STDLOGIC a wd in STDLOGICVECTOR31 downto 0 rd out STDLOGICVECTOR31 downto 0 end component signal pc instr readdata STDLOGICVECTOR31 downto 0 begin instantiate processor and memories mips1 mips port mapclk reset pc instr memwrite dataadr writedata readdata imem1 imem port mappc7 downto 2 instr dmem1 dmem port mapclk memwrite dataadr writedata readdata end Capítulo sete Microarquitetura 619 Exemplo HDL 714 MEMÓRIA DE DADOS MIPS SystemVerilog module dmeminput logic clk we input logic 310 a wd output logic 310 rd logic 310 RAM630 assign rd RAMa312 word aligned alwaysff posedge clk if we RAMa312 wd endmodule VHDL library IEEE use IEEESTDLOGIC1164all use STDTEXTIOall use IEEENUMERICSTDUNSIGNEDall entity dmem is data memory portclk we in STDLOGIC a wd in STDLOGICVECTOR 31 downto 0 rd out STDLOGICVECTOR 31 downto 0 end architecture behave of dmem is begin process is type ramtype is array 63 downto 0 of STDLOGICVECTOR31 downto 0 variable mem ramtype begin read or write memory loop if risingedgeclk then if we1 then mem tointegera7 downto 2 wd end if end if rd mem tointegera 7 downto 2 wait on clk a end loop end process end Capítulo sete Microarquitetura 620 Exemplo HDL 715 MEMÓRIA DE INSTRUÇÕES MIPS SystemVerilog module imeminput logic 50 a output logic 310 rd logic 310 RAM630 initial readmemhmemfiledat RAM assign rd RAMa word aligned endmodule VHDL library IEEE use IEEESTDLOGIC1164all use STDTEXTIOall use IEEENUMERICSTDUNSIGNEDall entity imem is instruction memory porta in STDLOGICVECTOR5 downto 0 rd out STDLOGICVECTOR31 downto 0 end architecture behave of imem is begin process is file memfile TEXT variable L line variable ch character variable i index result integer type ramtype is array 63 downto 0 of STDLOGICVECTOR31 downto 0 variable mem ramtype begin initialize memory from file for i in 0 to 63 loop set all contents low memi others 0 end loop index 0 FILEOPEN memfile CdocsDDCA2ehdlmemfiledat READMODE while not endfilememfile loop readlinememfile L result 0 for i in 1 to 8 loop read L ch if 0 ch and ch 9 then result characterposch characterpos0 elsif a ch and ch f then result characterposch characterposa10 else report Format error on line integer imageindex severity error end if memindex35i4 downto 32i4 tostdlogicvectorresult4 end loop index index 1 end loop Capítulo sete Microarquitetura 621 read memory loop rd memtointegera wait on a end loop end process end 77 EXCEÇÕES A seção 672 introduziu as exceções que causam alterações não programadas no fluxo de um programa Nesta seção queremos melhorar o processador multiciclo para suportar dois tipos de exceções instruções indefinidas e overflows aritméticos O suporte de exceções noutras microarquiteturas segue princípios semelhantes Conforme descrito na Seção 672 quando uma exceção ocorre o processador copia o PC para o registro EPC e escreve um código no registro Cause indicando a origem da exceção As causas de exceção incluem 0x28 para obter instruções indefinidos e 0x30 para overflow ver Tabela 67 O processador em seguida salta para o manipulador de exceção no endereço de memória 0x80000180 O manipulador de exceção é o código que responde a exceção Faz parte do sistema operacional Também tal como discutido na Seção 672 os registros de exceção são parte do coprocessador 0 uma parte do processador de MIPS que é utilizado para as funções do sistema O coprocessador 0 define até 32 registradores de uso especial incluindo o Cause e o EPC O manipulador de exceção pode usar a instrução mfc0 move from coprocessador 0 para copiar estes registros de propósitos especiais para os registros de propósito gerais no banco de registros o registro Cause no co processador 0 é o registro 13 e EPC é o registro 14 Para lidar com as exceções é preciso acrescentar os registros EPC e Cause ao caminho de dados e ampliar o multiplexador PCSrc para aceitar o endereço do manipulador de exceção como mostrado na Figura 762 Os dois novos registros têm como enable de escrita EPCWrite e CauseWrite para armazenar o PC e a causa da exceção quando uma exceção ocorre A causa é gerada por um Capítulo sete Microarquitetura 622 multiplexador que seleciona o código apropriado para a exceção A ALU também deve gerar um sinal de excesso como foi discutido na Seção 524 Figura 762 Caminho de dados suportando overflow e exceções indefinidas de instruções Para apoiar a instrução mfc0 também adicionamos uma forma de selecionar os registros do co processador 0 e escrevelos no banco de registro como mostrado na Figura 763 A instrução mfc0 especifica o registro do coprocessador 0 por Instr1511 neste diagrama apenas os registros Cause e EPC são suportados Adicionamos outra entrada ao multiplexador MemtoReg para selecionar o valor do coprocessador 0 O controlador modificado é mostrado na Figura 764 O controlador recebe a flag de overflow da ALU Gera três novos sinais de controle uma para escrever no EPC um segundo para escrever no registro Cause e um terceiro para selecionar a causa Ele também inclui dois novos estados para apoiar as duas exceções e outro estado para lidar com mfc0 Se o controlador recebe uma instrução indefinido uma que não saiba como lidar ele passa para S12 guarda o PC no EPC escreve 0x28 ao registro Cause e salta para o manipulador de exceção Da Capítulo sete Microarquitetura 623 mesma forma se o controlador detecta o overflow aritmético numa instrução add ou sub ele passa a S13 salva o PC no EPC escreve 0x30 no registro Cause e salta para o manipulador de exceção Notese que quando ocorre uma exceção a instrução é descartada e o banco de registros não é escrito Quando uma instrução mfc0 é decodificada o processador vai para S14 e escreve o registro adequado do co processador 0 no banco de registros principal Figura 763 Caminho de dados suportando mfc0 Capítulo sete Microarquitetura 624 Figura 764 Controlador com suporte de exceções e de mfc0 Capítulo sete Microarquitetura 625 78 MICROARQUITETURA AVANÇADA Os microprocessadores de alto desempenho utilizam uma grande variedade de técnicas para executar mais rapidamente os programas Recordese que o tempo requerido para executar um programa é proporcional ao período do relógio e ao número de ciclos de relógio por instrução CPI Assim para aumentar o desempenho gostaríamos de acelerar o relógio eou reduzir o CPI Esta seção examina algumas técnicas de aceleração existentes Os detalhes da implementação tornaramse bastante complexos por isso vamos concentrarnos sobre os conceitos O livro de texto de Hennessy Pattersons Computer Architecture é uma referência definitiva se o leitor quiser compreender totalmente os detalhes A cada 2 a 3 anos os avanços na fabricação CMOS reduzem as dimensões do transístor em 30 dobrando o número de transístores que podem caber num chip Um processo de fabrico é caracterizado pela sua dimensão de traço que indica o menor transístor que pode ser construído de forma fiável Os transístores menores são mais rápidos e geralmente consomem menos energia Assim mesmo se a microarquitetura não muda a frequência do relógio pode aumentar porque todas as portas são mais rápidas Para além disso transístores menores permitem colocar mais transístores num chip As microarquiteturas usam os transístores adicionais para construir processadores mais complexos ou colocar mais processadores num chip Infelizmente o consumo de energia aumenta com o número de transístores e a velocidade a que operam ver Seção 18 O consumo de energia é agora uma preocupação essencial Os projetistas de microprocessadores têm a difícil tarefa de fazer malabarismos com os compromissos entre a velocidade a potência e o custo para chips com bilhões de transístores em alguns dos sistemas mais complexos que os seres humanos já construiram 781 Profundidade do Pipeline Além dos avanços na fabricação a maneira mais fácil para acelerar o relógio é partir o pipeline em vários estágios Cada estágio contém menos lógica para que ele possa executar mais rápido Este Capítulo considerou um pipeline de cinco estágios clássico mas atualmente é comum usar 10 a 20 estágios Capítulo sete Microarquitetura 626 O número máximo de estágios do pipeline é limitado pelos hazards de pipeline a sobrecarga de sequenciamento e o custo Os pipelines mais longos introduzem mais dependências Algumas das dependências podem ser resolvidas por encaminhamento mas outras requerem stalls que aumentam o CPI Os registros de pipeline entre cada estágio têm sobrecarga de sequenciamento de seu tempo de setup e atraso clktoQ bem como do skew do relógio Esta sobrecarga de sequenciamento faz com que a adição de mais estágios de pipeline proporcione retornos decrescentes Finalmente a adição de mais estágios aumenta o custo por causa dos registros de pipeline extras e do hardware necessários para lidar com os harzards Exemplo 711 PROFUNDIDADE DO PIPELINE Considere a construção de um processador com pipeline por quebra do processador de cicloúnico em N estágios N 5 O processador de cicloúnico tem um atraso de propagação de 875 ps através da lógica combinacional A sobrecarga de sequenciamento de um registro é de 50 ps Assumese que o atraso combinacional pode ser arbitrariamente dividido num qualquer número de estágios e que a lógica de harzard do pipeline não aumenta o atraso O pipeline de cinco estágios no Exemplo 79 tem um CPI de 115 Suponha que cada estágio adicional aumenta o CPI de 01 por causa dos erros de previsão dos branchs e outros hazards dos pipelines Quantos estágios de pipeline devem ser usados para conseguir que o processador execute programas o mais rapidamente possível Solução Se o atraso de 875 ps da lógica combinacional é dividido em N estágios e cada estágio também tem um custo de 50 ps de sobrecarga de sequenciamento para o seu registro de pipeline o tempo de ciclo é Tc 875 N 50 ps O CPI é de 115 01 N 5 O tempo por instrução ou o tempo de instrução é o produto do tempo de ciclo pelo o CPI A Figura 765 representa o tempo de ciclo e o tempo de instrução versus o número de estágios O tempo de instrução tem um mínimo de 227 ps para N 11 estágios Esse mínimo é apenas ligeiramente melhor do que os 245 ps por instrução alcançado com um pipeline de seis estágios No final de 1990 e início de 2000 os microprocessadores foram comercializados em grande parte com base na frequência de relógio 1Tc Isto levou a os microprocessadores a usarem pipelines muito profundos 20 a 31 estágios no Pentium 4 para maximizar a frequência do relógio mesmo que os benefícios para o desempenho global fossem questionáveis A capacidade é proporcional à frequência Capítulo sete Microarquitetura 627 do relógio e também aumenta com o número de registros do pipeline então agora que o consumo de energia é tão importante a profundidade do pipeline está a diminuir Figura 765 Tempo de ciclo e tempo de instrução versus o número de estágios do pipeline 782 Previsão de Branch Um processador com pipeline ideal teria um CPI de 1 A branch misprediction penalty é uma das principais razões para o aumento do CPI Com os pipelines a usar profundidades maiores os branchs são resolvidos mais tarde no pipeline Assim a branch misprediction penalty tornase maior porque Capítulo sete Microarquitetura 628 todas as instruções obtidas após o erro de previsão de branch devem ser descartadas Para resolver este problema os processadores com pipeline usam um preditor de branch para adivinhar se o branch deve ser realizado Lembrese que o nosso pipeline da Seção 753 simplesmente previa que os branchs nunca são realizados Alguns branchs ocorrem quando um programa chega ao fim de um ciclo por exemplo uma estrutura while ou for e retorna ao início para repetir o ciclo Os ciclos tendem a ser executados muitas vezes por isso estes branchs de retorno são normalmente realizados A forma mais simples de previsão de desvios verifica a direção dos branchs de retorno e prevê que branchs de retorno devem ser realizados Isto é chamado de previsão de desvio estático uma vez que não dependem da história do programa Os branchs para a frente são difíceis de prever sem saber mais sobre o programa específico Portanto a maioria dos processadores usa a previsão de desvio dinâmico que usam a história da execução do programa para adivinhar se um branch deve ser realizado Os preditores de desvio dinâmicos mantêm uma tabela das últimas centenas ou milhares instruções de branch que o processador executou A tabela às vezes chamada de buffer de destino de desvio inclui o destino do branch e um historial de se foi realizado Para ver a operação de preditores de desvio dinâmicos considere o seguinte código de ciclo do Exemplo de Código 620 O ciclo repete 10 vezes e o beq fora do ciclo é tomado apenas no último momento add s1 0 0 sum 0 addi s0 0 0 i 0 addi t0 0 10 t0 10 for beq s0 t0 done if i 10 branch to done add s1 s1 s0 sum sum i addi s0 s0 1 increment i j for done Capítulo sete Microarquitetura 629 O preditor dinâmico de desvio de 1bit lembrase se o branch foi feita pela última vez e prevê que ele vai fazer a mesma coisa na próxima vez Enquanto o ciclo se estiver a repetir ele lembra que o beq não foi realizado pela última vez e prevê que não deve ser realizado na próxima vez Esta é uma previsão correta até o último branch do ciclo quando o branch é realizado Infelizmente se o ciclo é executado novamente o preditor de desvio lembra que o último branch foi realizado Portanto incorretamente prevê que o branch deve ser tomado quando o ciclo é executado pela primeira vez novamente Em resumo um preditor de desvio de 1bit erra na previsão dos primeiros e últimos branchs de um ciclo Figura 766 Diagrama de transição de estado do preditor de branch de 2bits Um preditor dinâmico de desvio de 2bits resolve este problema fazendo uso de quatro estados fortemente realizado fracamente realizado fracamente não realizado e fortemente não realizado como mostrado na Figura 766 Quando o ciclo está repetindo ele entra no estado fortemente não realizado e prevê que o branch não deve ser realizado na próxima vez Isto é correto até ao último branch do ciclo que é realizado e move o preditor para o estado fracamente não realizado Quando o ciclo é executado pela primeira vez novamente o previsor de ramos prevê corretamente que o ramo não deve ser realizado e reentra no estado fortemente não realizado Em resumo um preditor de desvio de 2 bits erra na previsão apenas no último branch de um ciclo Como se pode imaginar os preditores de desvio podem ser usados para rastrear ainda mais o historial do programa para aumentar a precisão das previsões Bons preditores de desvio conseguem alcançar 90 de precisão em programas típicos O preditor de desvio opera no estágio de fetch do pipeline de modo que ele pode determinar qual a instrução a executar o próximo ciclo Quando se prevê que o branch deve ser realizado o Capítulo sete Microarquitetura 630 processador busca a instrução do branch de destino armazenado no buffer de destino de branch Ao manter o controle dos destinos de ambos os branchs e jumps no buffer de destino de branch o processador também pode evitar o flush do pipeline durante instruções de jump 783 Processador Superescalar Um processador superescalar contém várias cópias do hardware do caminho de dados para executar múltiplas instruções simultaneamente A Figura 767 apresenta um diagrama de blocos de um processador superescalar bidireccional que obtém e executa duas instruções por ciclo O caminho de dados obtém duas instruções num dado momento a partir da memória de instruções Tem um banco de registros de seis elementos para ler quatro operandos de origem e escrever dois resultados de volta em cada ciclo Ele também contém duas ALU e uma memória de dados de dois elementos para executar as duas instruções ao mesmo tempo Figura 767 Caminho de dados superescalar A Figura 768 mostra um diagrama de pipeline ilustrando o processador superescalar de duas vias a executar duas instruções em cada ciclo Para este programa o processador tem um CPI de 05 Os projetistas referemse comumente ao recíproco do CPI como instruções por ciclo ou IPC Este processador tem um IPC de 2 neste programa Um processador escalar trabalha sobre um pedaço de dados de cada vez Um processador vectorial trabalha em várias partes dos dados com uma única instrução Um processador superescalar trabalha várias instruções de cada vez cada uma das quais opera sobre uma parte de dados O nosso processador com pipeline MIPS é um processador escalar Os processadores vetoriais eram populares nos supercomputadores em 1980 e 1990 porque tratavam eficientemente os longos vectores de dados comuns em cálculos científicos Os microprocessadores modernos de elevado desempenho são superescalar porque a tratamento de várias instruções independentes é mais flexível do que processamento vectorial No entanto os processadores modernos também incluem hardware para lidar com vectores dados curtos sendo comuns em aplicações multimídia e gráficas Estas são chamadas de unidades de instrução única dados múltiplos SIMD Capítulo sete Microarquitetura 631 Figura 768 Vista abstrata de um pipeline superescalar em funcionamento Executar muitas instruções ao mesmo tempo é difícil devido às dependências Por exemplo a Figura 769 apresenta um diagrama de pipeline a executar um programa com dependências de dados As dependências no código são mostradas a azul A instrução add é dependente de t0 que é produzido pela instrução lw por isso não pode ser tratada ao mesmo tempo como lw Na verdade a instrução add provoca um stalls durante mais um ciclo para que lw possa encaminhar t0 para add no ciclo 5 As outras dependências entre sub e and baseadas em t0 e entre or e sw baseadas em t3 são tratadas por meio do envio dos resultados produzidos num ciclo para ser consumidos no próximo Este programa também apresentado a seguir requer cinco ciclos para seis instruções para um IPC de 117 Lw t0 40s0 add t1 t0 s1 sub t0 s2 s3 and t2 s4 t0 or t3 s5 s6 sw s7 80t3 Capítulo sete Microarquitetura 632 Figura 769 Programa com dependências de dados Capítulo sete Microarquitetura 633 Lembrese que o paralelismo ocorre nas formas temporais e espaciais O pipelining e um caso de paralelismo temporal Várias unidades de execução é um caso de paralelismo espacial Os processadores superescalares exploraram ambas as formas de paralelismo para espremer um desempenho superior longe dos nossos processadores de cicloúnico e multiciclo Os processadores comerciais podem ter três quatro ou até seis vias superescalares Eles devem lidar com hazards de controle tais como branchs bem como os hazards de dados Infelizmente os programas reais têm muitas dependências os processadores superescalares raramente utilizam plenamente todas as unidades de execução Além disso o grande número de unidades de execução e redes de encaminhamento complexos consomem grandes quantidades de circuitos e energia 784 Processador OutofOrder Para lidar com o problema das dependências um processador outoforder inspeciona à frente através de muitas instruções para obter ou iniciar a execução de instruções independentes o mais rapidamente possível As instruções podem ser obtidas numa ordem diferente do que foi escrito pelo programador enquanto as dependências são observadas para que o programa produza o resultado pretendido Considere a execução do mesmo programa da Figura 769 num processador superescalar outof order de duas vias O processador pode obter até duas instruções por ciclo de qualquer parte do programa desde que as dependências sejam observadas A Figura 770 mostra as dependências de dados e a operação do processador As classificações de dependências como RAW e WAR serão discutidas brevemente As restrições na obtenção de instruções são descritas abaixo Ciclo 1 A instrução lw é obtida As instruções add sub e and são dependentes de lw por meio de t0 então elas não podem ser obtidas ainda No entanto a instrução or é independente de modo que também é obtida Capítulo sete Microarquitetura 634 Figura 770 Execução de um programa outoforder com dependência Ciclo 2 Lembrese que há uma latência de dois ciclos entre quando a instrução lw é obtida e quando uma instrução dependente pode usar o seu resultado então add não pode ainda ser obtida por causa da dependência de t0 A instrução sub escreve em t0 por isso não pode ser obtida antes do add para que add não receba um valor errado de t0 A instrução and é dependente da instrução sub Apenas a instrução sw é obtida Capítulo sete Microarquitetura 635 Ciclo 3 No ciclo 3 t0 está disponível então and é obtido A instrução sub é obtida simultaneamente porque não vai escrever em t0 até depois do add fazer uso de t0 Ciclo4 A instrução and é obtida T0 é encaminhado de sub para and O processador outoforder obtém as seis instruções em quatro ciclos para um IPC de 15 A dependência de add sobre lw por meio de t0 é um hazard de leitura após a gravação RAW A instrução add não deve ler t0 até depois de lw ter escreveu nele Este é o tipo de dependência a que estamos acostumados a tratar no processador com pipeline Inerentemente limita a velocidade a que o programa pode ser executado mesmo se infinitamente muitas unidades de execução estão disponíveis Da mesma forma a dependência de sw sobre o or por meio de t3 e de and sobre sub por meio de T0 são dependências RAW A dependência de sub sobre and por meio de t0 é chamada de hazard de gravação após a leitura WAR ou uma antidependência A instrução sub não deve escrever em t0 antes de add ler t0 de modo que add recebe o valor correto de acordo com a ordem original do programa Os hazard WAR não poderiam ocorrer no pipeline simples MIPS mas podem acontecer num processador outoforder se a instrução dependente neste caso sub é obtida muito cedo Um hazard WAR não é essencial para o funcionamento do programa É meramente um artefato de escolha do programador para usar o mesmo registro para duas instruções não relacionadas Se a instrução sub tivesse escrito t4 em vez de t0 as dependências desapareceriam e sub poderia ser obtida antes de add A arquitetura MIPS tem apenas 32 registros por isso às vezes o programador é forçado a reutilizar um registro e introduzir um hazard apenas porque todos os outros registros estão em uso Um terceiro tipo de hazard não mostrado no programa é chamado de escrita depois de gravação WAW ou uma dependência de saída Um hazard WAW ocorre se uma instrução tenta escrever um registro após uma instrução subsequente já ter escrito para o registro Por exemplo no seguinte Capítulo sete Microarquitetura 636 programa tanto and como sub escrevem em t0 O valor final no t0 deve vir de sub de acordo com a ordem do programa Se um processador outoforder tentou executar sub primeiro um hazard WAW pode ocorrer add t0 s1 s2 sub t0 s3 s4 Os hazard WAW também não são essenciais novamente eles são artefatos causados pelo programador utilizando o mesmo registro para duas instruções não relacionadas Se a instrução sub foi obtida primeiro o programa poderia eliminar o hazard WAW descartando o resultado do add em vez de escrevêlo para t0 Isso é chamado de squashing o add Os processadores outoforder usam uma tabela para manter o controle das instruções de espera de serem obtidas A tabela às vezes chamada de painel de avaliação contém informações sobre as dependências O tamanho do quadro determina quantas instruções podem ser consideradas para serem obtidas Em cada ciclo o processador analisa a tabela e obtém tantas instruções quantas pode limitadas pelas dependências e pelo número de unidades de execução por exemplo ALUs portos de memória que estão disponíveis O paralelismo do nível de instrução ILP instruction level parallelism é o número de instruções que podem ser executadas simultaneamente por um programa e microarquitetura em particular Estudos teóricos mostram que o ILP pode ser bastante elevado para microarquiteturas outoforder com preditores de desvio perfeitos e um enorme número de unidades de execução No entanto os processadores práticos raramente conseguir um ILP maior do que 2 ou 3 mesmo com seis vias de caminhos de dados superescalares com execução outoforder 785 Renomeação de registros Os processadores outoforder usam uma técnica chamada de renomeação de registro para eliminar os hazards WAR A renomeação de registros acrescenta alguns registros de renomeação não arquiteturais ao processador Por exemplo um processador MIPS poderia acrescentar 20 registros de renomeação chamados de r0 r19 O programador não pode usar estes registros diretamente porque não fazem parte da arquitetura No entanto o processador é livre para os usar para eliminar os hazards Capítulo sete Microarquitetura 637 Por exemplo na seção anterior um hazard WAR ocorreu entre as instruções sub e add baseadas na reutilização de t0 O processador outoforder poderia renomear t0para r0 para a instrução sub Então sub poderia ser executada mais cedo porque r0 não tem nenhuma dependência da instrução add O processador mantém uma tabela que regista quais os registros renomeados de modo que pode mudar o nome de registros consistentemente em subsequentes instruções dependentes Neste exemplo t0 também deve ser renomeado para r0 na instrução add porque se refere ao resultado de sub A Figura 771 mostra o mesmo programa da Figura 770 executado por um processador outof order com renomeação de registros O t0 é renomeado para r0 em sub e add para eliminar o hazard WAR As restrições na obtenção das instruções são descritas abaixo Ciclo 1 A instrução lw é obtida A instrução add é dependente lw por meio de t0 por isso não pode ser ainda obtida No entanto a instrução sub é independente agora que seu destino foi renomeado para r0 de modo que sub também é obtida Ciclo 2 Lembrese que há uma latência de dois ciclos entre quando uma instrução lw é obtida e quando uma instrução dependente pode usar o seu resultado então add não pode ser ainda obtida por causa da dependência t0 A instrução add é dependente de sub para que pode ser obtida r0 é encaminhado de sub para add A instrução or é independente de modo que também é obtida Capítulo sete Microarquitetura 638 Figura 771 Execução outoforder de um programa utilizando renomeação de registros Ciclo 3 No ciclo 3 t0 está disponível então add é obtida t3 também está disponível logo sw é obtida O processador outoforder com renomeação de registros obtém as seis instruções em três ciclos para um IPC de 2 786 Instrução Simples Dados Múltiplos O termo SIMD pronunciase simdee significa single instruction multiple data em que uma única instrução atua em paralelo em blocos partes de dados Uma aplicação comum de SIMD é realizar muitas operações aritméticas curtas de uma só vez especialmente no processamento de gráficos Isto também é chamado aritmética empacotada packed Capítulo sete Microarquitetura 639 Por exemplo um 32bit microprocessador pode empacotar quatro elementos de dados de 8bits numa palavra de 32bits As instruções de somar e subtrair empacotadas operam em paralelo todos os quatro elementos de dados dentro da palavra A Figura 772 apresenta uma adição de 8bits de soma empacotada de quatro pares de números de 8bits para produzir quatro resultados A palavra também pode ser dividida em dois elementos de 16bits Para realizar aritmética empacotada é requerida a modificação da ALU para eliminar os transportes entre os elementos de dados menores Por exemplo um transporte de a0 b0 não deve afetar o resultado de a1 b1 Os elementos de dados curtos muitas vezes aparecem no processamento gráfico Por exemplo um pixel de uma fotografia digital pode usar 8bits para armazenar cada um dos componentes de cor vermelho verde e azul Usar uma palavra de 32bits para processar um destes componentes desperdiça os 24bits mais significativos Quando os componentes de quatro pixels adjacentes são empacotados numa palavra de 32bits o processamento pode ser executado quatro vezes mais rápido As instruções SIMD são ainda mais úteis nas arquiteturas de 64bits o que pode empacotar oito elementos de 8bits quatro elementos de 16bits ou dois elementos de 32bits numa única palavra de 64bits As instruções SIMD também são usadas em cálculos de vírgula flutuante por exemplo quatro valores de 32bits de virgula flutuante de precisão simples pode ser empacotado numa única palavra de 128bits Figura 772 Aritmética empacotada quatro adições de 8bits simultâneas Capítulo sete Microarquitetura 640 787 Multithreading Porque o ILP de programas reais tende a ser bastante baixo a adição demais unidades de execução superescalar ou outoforder dá retornos decrescentes Outro problema discutido no Capítulo 8 é que a memória é muito mais lenta do que o processador A maioria das cargas e armazenamentos acedem a uma memória menor e mais rápida chamado de cache No entanto quando as instruções ou os dados não estão disponíveis na cache o processador pode parar 100 ou mais ciclos enquanto obtém a informação da memória principal Multithreading é uma técnica que ajuda a manter um processador com muitas unidades de execução ocupado mesmo que o ILP de um programa seja baixo ou o programa esteja parado à espera da memória Para explicar o multithreading precisamos definir alguns termos novos Um programa em execução num computador é chamado de processo Os computadores podem executar vários processos simultaneamente por exemplo o leitor pode ouvir música num PC enquanto navega na web e executa um verificador de vírus Cada processo consiste num ou mais threads que também funcionam simultaneamente Por exemplo um processador de texto pode ter uma thread a lidar com a digitação do utilizador uma segunda thread faz a verificação da ortográfica do documento enquanto o utilizador trabalha e uma terceira thread imprime o documento Desta forma o utilizador não tem de esperar por exemplo para que um documento termine a impressão antes de ser capaz de escrever novamente O grau em que um processo pode ser dividido em várias threads que podem ser executadas simultaneamente define o seu nível de paralelismo a nível de thread TLP thread level parallelism Num processador convencional as threads só dão a ilusão da execução simultaneamente As threads realmente se revezam sendo executadas no processador sob o controle do sistema operativo Quando uma thread termina a sua vez o sistema operativo salva o seu estado de arquitetura carrega o estado de arquitetura da próxima thread e começa a executar a próxima thread Este procedimento é chamado de troca de contexto Enquanto o processador comuta entre todas as thread com rapidez suficiente o utilizador tem a percepção de que todas as threads executam ao mesmo tempo Capítulo sete Microarquitetura 641 Um processador multithread contém mais do que uma cópia do seu estado de arquitetura de modo que mais de uma thread pode estar ativa de cada vez Por exemplo se estendemos um processador MIPS para ter quatro contadores de programas e 128 registros quatro threads poderiam estar disponíveis ao mesmo tempo Se uma thread é suspensa enquanto espera pelos dados da memória principal o processador poderia mudar o contexto para outra thread sem qualquer atraso porque o contador de programa e os registros já estão disponíveis Além disso se uma thread carece de paralelismo suficiente para manter todas as unidades de execução ocupadas outra thread pode ser obter instruções para as unidades ociosas O multithreading não melhora o desempenho de uma thread individual porque não aumenta o ILP No entanto ele melhora o rendimento geral do processador porque vários segmentos podem usar recursos do processador que têm estado ociosos durante a execução de uma única thread Multithreading também é relativamente barato de implementar porque reproduz apenas o PC e o banco de registros e não as unidades de execução e memórias 788 Microcessadores Homogéneos Um sistema múltiprocessador consiste de múltiplos processadores e um método para a comunicação entre os processadores Uma forma comum de multiprocessamento em sistemas de computador é o multiprocessamento homogéneo também chamado de multiprocessamento simétrico SMP symmetric multiprocessing em que dois ou mais processadores idênticos compartilham uma única memória principal Os múltiplos processadores pode ser chips separados ou múltiplos núcleos no mesmo chip Os processadores modernos têm um enorme número de transístores disponíveis Usálos para aumentar a profundidade do pipeline ou para adicionar mais unidades de execução a um processador superescalar dá pouca vantagem no desempenho e é um desperdício de energia Por volta do ano 2005 os arquitetos computacionais fizeram uma grande mudança ao construírem várias cópias do processador no mesmo chip estas cópias são chamadas núcleos Os Multiprocessadores podem ser usados para executar mais threads simultaneamente ou para executar uma determinada thread mais rápido Correr mais threads simultaneamente é fácil as Capítulo sete Microarquitetura 642 threads são simplesmente divididas entre os processadores Infelizmente os utilizadores típicos de PC precisam executar apenas um pequeno número de threads num determinado momento A execução rápida de uma threads específica é muito mais desafiador O programador deve dividir a thread existente em vários threads a serem executadas em cada processador Isto tornase complicado quando os processadores precisam se comunicar uns com os outros Um dos principais desafios para os projetistas e programadores de computadores é usar eficazmente um grande número de núcleos do processador Outras formas de multiprocessamento incluem o multiprocessamento heterogéneos e os clusters Os multiprocessadores heterogéneos também chamados de multiprocessadores assimétricos usam microprocessadores especializados para tarefas separadas e são discutidos a seguir No multiprocessamento de cluster cada processador tem seu próprio sistema de memória local Clustering também se pode referir a um grupo de PC conectados em rede a executar software para resolver em conjunto um grande problema 789 Multiprocessamento Heterogéneos Os multiprocessadores homogéneos descritos na Seção 788 tem um número de vantagens Eles são relativamente simples de projetar porque o processador pode ser projetado uma vez e depois replicado várias vezes para aumentar o desempenho A programação para e execução de código num multiprocessador homogéneo é também relativamente simples pois qualquer programa pode ser executado em qualquer processador no sistema e atingir aproximadamente o mesmo desempenho Infelizmente continuar a adicionar mais e mais núcleos não garante que proporciona uma melhoria contínua do desempenho Em 2012 as aplicações de consumo empregam apenas 23 threads em média num determinado momento e esperase de um consumidor típico que tenha um par de aplicações realmente em execução simultaneamente Enquanto isso é suficiente para manter os sistemas dual e quadcore ocupados a menos que os programas comecem a incorporar significativamente mais paralelismo continuar a adicionar mais núcleos para além deste ponto proporcionará benefícios decrescentes Como um problema adicional os processadores de uso geral são projetados para proporcionar um bom desempenho médio e geralmente não são a opção mais Os cientistas em busca de sinais de inteligência extraterrestre usam os maiores cluster de multiprocessadores do mundo para analisar os dados de radiotelescópios em busca de padrões que podem corresponder a sinais de vida em outros sistemas solares O cluster consiste em computadores pessoais pertencentes a mais de 38 milhões de voluntários em todo o mundo Quando um computador no cluster está ocioso ele vai buscar um pedaço de dados de um servidor centralizado analisa os dados e envia os resultados de volta para o servidor Você pode oferecer o tempo ocioso do seu computador para o cluster visitando setiathomeberkeleyedu Capítulo sete Microarquitetura 643 energeticamente eficiente para a realização de uma determinada operação Esta ineficiência energética é especialmente importante em ambientes portáteis com restrições de energia Os multiprocessadores heterogéneos têm como objetivo abordar estas questões através da incorporação de diferentes tipos de núcleos eou hardware especializado num único sistema Cada aplicativo usa esses recursos que proporcionam o melhor desempenho ou relação potência desempenho para essa aplicação Porque os transístores são bastante abundantes nos dias de hoje o fato de que nem todos os aplicativos irão fazer uso de cada peça de hardware é a menor das preocupações Os sistemas heterogéneos podem tomar várias formas Um sistema heterogéneo pode incorporar núcleos com diferentes microarquiteturas que têm diferentes vantagens e desvantagens de potência de desempenho e de área Por exemplo um sistema poderia incluir núcleos simples superescalares outoforder de complexidade maior As aplicações que podem fazer uso eficiente do desempenho superior mas com mais exigência de potência dos núcleos outoforder têm essa opção disponível para eles enquanto que outras aplicações que efetivamente não utilizam a computação acrescentada podem usar os núcleos simples mais eficientes energeticamente Num tal sistema todos os núcleos podem usar o mesmo ISA a qual permite que uma aplicação execute em qualquer um dos núcleos ou pode empregar diferentes ISA o que pode permitir maior adaptação de um núcleo para uma dada tarefa O Cell Broadband Engine da IBM é um exemplo do último O Cell incorpora um power processor element PPE com oito synergistic processor elements SPE As SPE usam um novo ISA a SPU ISA que é adaptado para a eficiência em cargas de trabalho de computação intensiva Embora vários paradigmas de programação sejam possíveis a ideia geral é que o PPE tome a maioria das decisões de controle e de gestão tais como dividir a carga de trabalho entre as SPE enquanto as SPE lidam com a maioria da computação A heterogeneidade do Cell lhe permite fornecer muito maior desempenho computacional para uma dada potência e área do que seria possível utilizando processadores tradicionais Outros sistemas heterogéneos podem incluir uma combinação de núcleos tradicionais e hardware especializado Os coprocessadores de vírgula flutuante são um exemplo precoce disso Nos primeiros microprocessadores não havia espaço para hardware de vírgula flutuante no chip principal Os utilizadores interessados em ter desempenho de vírgula flutuante podem adicionar um chip separado que dava suporte dedicado de vírgula flutuante Os microprocessadores de hoje incluem Capítulo sete Microarquitetura 644 uma ou mais unidades de vírgula flutuante em chip e agora estão começando a incluir outros tipos especializados de hardware A AMD e a Intel ambas têm processadores que incorporam uma unidade de processamento gráfico GPU ou FPGA e um ou mais núcleos x86 tradicionais no mesmo chip O Fusion line da AMD e o Sandy Bridge da Intel é o primeiro conjunto de dispositivos a incorporar um processador e GPU no mesmo chip Os chips da série E600 Stellarton da Intel lançada no início de 2011 emparelham um processador Atom com uma FPGA da Altera novamente no mesmo dispositivo Ao nível do chip um telefone celular contém um processador convencional para lidar com a interação do utilizador como o gerenciamento do telefone sites de processamento e jogar jogos e um processador de sinal digital DSP com instruções especializadas para decifrar comunicações sem fios em tempo real Em ambientes com restrições de energia este tipo de hardware integrado especializado proporciona melhores compromissos de energiadesempenho do que realizar a mesma operação num núcleo standard Os sistemas heterogéneos também têm os seus inconvenientes Eles acrescentam complexidade tanto em termos de concepção dos diferentes elementos heterogéneos como em termos de esforço adicional de programação para decidir quando e como fazer uso dos diferentes recursos No final os sistemas homogéneos e heterogéneos terão ambos provavelmente o seu lugar Os multiprocessadores homogéneos são bons para situações como grandes centros de dados que têm disponível lotes de níveis de paralelismo de thread Os sistemas heterogéneos são bons para os casos que têm cargas de trabalho mais variadas e paralelismo limitado 79 PERSPECTIVA DO MUNDO REAL MICROARQUITETURA X86 A Seção 68 introduziu a arquitetura x86 usada em quase todos os PC Esta seção segue a evolução dos processadores x86 através de microarquiteturas progressivamente mais rápidas e mais complicadas Os mesmos princípios que temos aplicados às microarquiteturas MIPS são usadas na x86 Synergistic Processor Unit SPU ISA O SPU ISA está projetado para fornecer o mesmo desempenho que os processadores de uso geral na metade da área e energia para determinados conjuntos de cargas de trabalho Especificamente a SPU ISA tem como alvo gráficos processamento em stream e outras cargas de trabalho altamente computacionais como jogos físicos e outras modelações do sistema Para atingir as metas de desempenho energia e área desejada o ISA incorpora uma série de características incluindo a execução de 128bits SIMD memória gerenciado por software e um grande banco de registros Na memória gerenciada por software o programador é explicitamente responsável por mover os dados para dentro e para fora da memória local ao contrário das caches dos processadores comuns que trazem os dados automaticamente Se usado corretamente isto pode economizar energia e melhorar o desempenho porque os dados necessários são trazidos antecipadamente e apenas quando necessário O grande banco de registros ajuda a evitar a escassez de registros sem a necessidade de caras renomeações de registros Capítulo sete Microarquitetura 645 A Intel inventou o primeiro microprocessador singlechip o 4bit 4004 em 1971 como um controlador flexível para uma linha de calculadoras Continha 2300 transístores fabricados numa tira de 12 mm2 de silício num processo com uma dimensão de traço de 10 𝜇m e que operava a 750 kHz Uma fotografia do chip obtida de um microscópio é mostrada na Figura 73 Em alguns lugares colunas de quatro estruturas parecidas são visíveis como seria de esperar em um microprocessador de 4 bits Em torno da periferia estão as ligações que são utilizadas para ligar o chip à sua embalagem e placa de circuito O 4004 inspirou o 8008 de 8bit o 8080 que eventualmente evoluiu para o de 8086 de 16bits em 1978 e o 80286 em 1982 Em 1985 a Intel lançou o 80386 que estendeu a arquitetura 8086 a 32bits e definiu a arquitetura x86 A Tabela 77 resume os principais processadores x86 da Intel Nos 40 anos desde o 4004 o tamanho do transístor diminuiu de 160 vezes o número de transístores num chip aumentou em cinco ordens de magnitude e a frequência de operação aumentou em quase quatro ordens de magnitude Nenhum outro campo da engenharia fez tal surpreendente progresso em tão pouco tempo Figura 773 Chip do microprocessador 4004 Capítulo sete Microarquitetura 646 Tabela 77 Evolução dos processadores Intel x86 O 80386 é um processador multiciclo Os componentes principais são rotulados sobre a fotografia do chip na Figura 774 O caminho de dados de 32bit é claramente visível à esquerda Cada uma das colunas processa um bit de dados Alguns dos sinais de controle são gerados usando microcódigo PLA que percorre os vários estados da FSM de controlo A unidade de gestão de memória do lado direito superior controla o acesso à memória externa O 80486 mostrado na Figura 776 melhorou drasticamente o desempenho usando pipelining O caminho de dados é novamente claramente visível juntamente com a lógica de controlo e o microcódigo PLA O 80486 adicionado onchip uma unidade de vírgula flutuante os processadores anteriores da Intel ou enviam as instruções de vírgula flutuante para um coprocessador separado ou emulavamnas em software O 80486 era muito rápido para que a memória externa o pudesse acompanhar por isso incorporou uma cache de 8 KB no chip para manter as instruções e dados mais comumente utilizados O Capítulo 8 descreve as caches com mais detalhes e revê os sistemas de cache em processadores x86 da Intel Capítulo sete Microarquitetura 647 Figura 774 Chip do microprocessador 80386 Figura 775 Chip do microprocessador 80486 Capítulo sete Microarquitetura 648 O processador Pentium mostrado na Figura 777 é um processador superescalar capaz de executar duas instruções simultaneamente A Intel mudou para o nome Pentium em vez de 80586 porque a AMD estava se tornando um sério concorrente vendendo alternativas ao 80486 e os números de componentes não podem ser registrados O Pentium usa caches de instrução e dados separadas Ele também usa um preditor de branch para reduzir a penalidade no desempenho para branchs O Pentium Pro Pentium II e processadores Pentium III todos compartilham uma microarquitetura comum outoforder com o nome de código P6 As instruções x86 complexas são divididas numa ou mais microops semelhantes a instruções MIPS As microops são executadas num núcleo de execução outoforder rápido com um pipeline de 11 estágios A Figura 778 mostra o Pentium III O caminho de dados de 32bit é chamado de IEU Integer Execution Unit Figura 776 Chip do microprocessador Pentium Capítulo sete Microarquitetura 649 Figura 777 Chip do microprocessador Pentium III O caminho de dados de vírgula flutuante é chamado de FPU Floating Point Unit O processador também tem uma unidade de SIMD para executar operações de dados short integer e de vírgula flutuante empacotados A porção maior do chip é dedicado a obter as instruções outoforder do que realmente para as executar As caches de instrução e de dados cresceram para 16 KB cada uma O Pentium III também tem uma cache de segundo nível de 256KB maior mas mais lenta no mesmo chip No final dos anos 1990 os processadores foram comercializados em grande parte pela velocidade do relógio O Pentium 4 é um outro processador outoforder com um pipeline muito profundo para atingir extremamente altas frequências do relógio Tudo começou com 20 estágios e versões posteriores adoptaram 31 estágios para atingir frequências superiores a 3 GHz O chip mostrado na Figura 778 possui 42 a 178 milhões de transístores dependendo do tamanho da cache por isso mesmo as principais unidades de execução são difíceis de ver na fotografia A descodificação de três instruções x86 por ciclo é impossível a tais velocidades de relógio elevadas porque a codificação das Capítulo sete Microarquitetura 650 instruções é complexa e irregular Em vez disso o processador predescodifica as instruções em simples microops em seguida armazena as microops numa memória chamada de cache de rastreamento As versões posteriores do Pentium 4 também realizavam multithreading para aumentar o rendimento de várias threads Figura 778 Chip do microprocessador Pentium 4 Capítulo sete Microarquitetura 651 Figura 779 Chip do microprocessador Coreduo A dependência do Pentium 4 de pipelines profundos e alta velocidade de relógio levou a um consumo extremamente elevado de energia às vezes mais de 100 W Isto é inaceitável em laptops e faz com que a arrefecimento dos desktops seja dispendioso A Intel descobriu que a velha arquitetura P6 poderiam alcançar um desempenho comparável a muito menor velocidade de relógio e energia O Pentium M usa uma versão melhorada da microarquitetura P6 outoforder com caches de instruções e dados de 32KB e cache de segundo nível de 1 a 2 MB O Core Duo é um processador multicore baseada em dois núcleos Pentium M conectados a um cache de segundo nível de 2MB compartilhada As unidades funcionais individuais na Figura 779 são difíceis de ver mas os dois núcleos e a cache grande são claramente visíveis Em 2009 a Intel lançou uma nova microarquitetura com o nome de código Nehalem que agiliza a microarquitetura Core inicial Esses processadores incluindo série Core i3 i5 e i7 estendem o conjunto de instruções para 64bits Eles oferecem de 2 a 6 núcleos 315 MB de memória cache de terceiro nível e um controlador de memória interno Alguns modelos incluem processadores gráficos embutidos também chamados de aceleradores gráficos Algum suportam Turbo Boost para Capítulo sete Microarquitetura 652 melhorar o desempenho do código singlethreaded desligando os núcleos não utilizados e aumentando a tensão e a frequência de relógio do núcleo acelerado Alguns oferecem hyperthreading termo da Intel para 2way multithreading que duplica o número de núcleos a partir da perspectiva do utilizador A Figura 780 mostra uma bolacha de uma Core i7 com quatro núcleos e 8MB de cache L3 compartilhada Figura 780 Chip do microprocessador Core i7 fonte httpwwwintelcompressroomarchivereleases200820081117compsmhtm Cortesia Intel Capítulo sete Microarquitetura 653 710 SUMÁRIO Este Capítulo descreveu três formas de construir processadores MIPS cada um com diferentes compromissos de desempenho e custo Encontramos este tema quase mágico como pode um dispositivo aparentemente tão complicado como um microprocessador na verdade ser simples o suficiente para caber num esquema de meia página Além disso o funcionamento interno tão misterioso para os não iniciados são realmente razoavelmente simples As microarquiteturas MIPS aplicaram quase todos os tópicos abordados no texto até agora A junção das várias peças da microarquitetura ilustra os princípios introduzidos nos Capítulos anteriores incluindo o desenho de circuitos combinatório e sequenciais cobertos nos Capítulos 2 e 3 a aplicação de muitos dos blocos de construção descritos no Capítulo 5 e a implementação da arquitetura MIPS apresentada no Capítulo 6 As microarquiteturas MIPS podem ser descritas em poucas páginas de HDL utilizando as técnicas do Capítulo 4 A construção das microarquiteturas também utilizou muitas das nossas técnicas para gerenciar a complexidade A abstração da microarquitetura forma o elo entre a lógica e a abstração da arquitetura formando o cerne deste livro sobre projeto digital e arquitetura de computadores Também usamos as abstrações de diagramas de blocos e HDL para descrever sucintamente a disposição dos componentes As microarquiteturas exploraram a regularidade e modularidade reutilizando a biblioteca de blocos de construção comuns como ALU memórias multiplexadores e registros A hierarquia é usada de várias maneiras As microarquiteturas são divididas em unidades de controlo e caminho de dados Cada uma dessas unidades está construída a partir de blocos lógicos que podem ser construídos a partir de portas que por sua vez podem ser construídos a partir de transístores utilizando as técnicas desenvolvidas nos cinco primeiros Capítulos Este Capítulo comparou as arquiteturas de cicloúnico multiciclo e com pipeline para o processador MIPS Todos as três microarquiteturas implementam o mesmo subconjunto do conjunto de instruções MIPS e têm o mesmo estado de arquitetura O processador de cicloúnico é o mais simples e tem um CPI de 1 Capítulo sete Microarquitetura 654 O processador multiciclo usa um número variável de passos mais curtos para executar as instruções Assim pode reutilizar a ALU em vez de exigir vários somadores No entanto requer vários registros não arquiteturais para armazenar os resultados entre os estágios O projeto multiciclo em princípio poderia ser mais rápido porque nem todas as instruções devem ter comprimento igual Na prática é geralmente mais lento uma vez que é limitado pelos passos mais lentos e pela sobrecarga de sequenciamento em cada passo O processador com pipeline divide o processador de cicloúnico em cinco estágios de pipeline relativamente rápidos Acrescenta registros de pipeline entre os estágios para separar as cinco instruções que estão em execução simultaneamente E nominalmente tem um CPI de 1 mas os hazards provocam paragens ou descartes que aumentam o CPI ligeiramente A resolução de alguns hazard também requer hardware e design de complexidade extra O período de relógio pode idealmente ser cinco vezes mais curto do que o do processador de cicloúnico Na prática não é tão curto porque é limitado pelo estágio mais lento e pela sobrecarga de sequenciamento em cada estágio No entanto o pipelining fornece vantagens de desempenho substanciais Todos os microprocessadores modernos de alto desempenho utilizam hoje um pipeline Embora as microarquiteturas deste Capítulo implementem apenas um subconjunto da arquitetura MIPS vimos que o suporte de mais instruções envolve melhorias simples do caminho de dados e do controlador O suporte de exceções também requer modificações simples Uma das principais limitações deste Capítulo é que assumimos um sistema de memória ideal que é rápido e grande o suficiente para armazenar todo o programa e dados Na realidade memórias grandes e rápidas são proibitivamente caras O próximo Capítulo mostra como obter a maioria dos benefícios de uma memória grande e rápida com uma memória pequena e rápida que contém a informação mais usada e uma ou mais memórias maiores mas mais lentas que mantenha o resto da informação Capítulo sete Microarquitetura 655 Exercícios Exercício 71 Suponha que um dos seguintes sinais de controlo do processador de cicloúnico MIPS tem uma falha presoem0 o que significa que o sinal é sempre 0 independentemente do valor pretendido Que instruções irão funcionar mal Porquê a RegWrite b ALUOp1 c MemWrite Exercício 72 Repita o Exercício 71 assumindo que o sinal tem uma falha presoem1 Exercício 73 Modifique o processador MIPS de cicloúnico para implementar uma das seguintes instruções Veja o Apêndice B para uma definição das instruções Faça uma cópia da Figura 711 para indicar as alterações no caminho de dados Nomeie quaisquer novos sinais de controle Faça uma cópia da Tabela 78 para mostrar as alterações ao decodificador principal Descreva quaisquer outras mudanças que são necessárias a sll b lui c slti d blez Capítulo sete Microarquitetura 656 Tabela 78 Tabela verdade do decodificador verdade para marcar as alterações Exercício 74 Repita o Exercício 73 para as seguintes instruções MIPS a jal b lh c jr d srl Exercício 75 Muitas arquiteturas de processadores têm uma carga com a instrução pós incremento que atualiza o registro de índice para apontar para a próxima palavra de memória depois de completar a carga lwinc rt imm rs é equivalente às duas instruções a seguir lw rt immrs addi rs rs 4 Repita o Exercício 73 para a instrução lwinc É possível adicionar a instrução sem modificar o banco de registros Capítulo sete Microarquitetura 657 Exercício 76 Adicione uma unidade de vírgula flutuante ao processador de cicloúnico MIPS para lidar com adds subs e muls Suponha que tem disponíveis unidades somador e multiplicador de vírgula flutuante de precisão simples Explique que mudanças devem ser feitas ao caminho de dados e ao controlador Exercício 77 A sua amiga é uma expert no projeto de circuitos Ela se ofereceu para redesenhar uma das unidades do processador de cicloúnico MIPS para ter metade do atraso Usando os atrasos da Tabela 76 em que unidade deve ela trabalhar para obter o maior aumento de velocidade do processador em geral e qual deve ser o tempo de ciclo da máquina melhorado Exercício 78 Considere os atrasos apresentados na Tabela 76 Ben Bitdiddle construiu um somador prefix que reduz o atraso da ALU em 20 ps Se o outro elemento permanece o mesmo encontre o novo tempo de ciclo do processador de cicloúnico MIPS e determine quanto tempo leva para executar um benchmark com 100 bilhões de instruções Exercício 79 Suponhamos que um dos seguintes sinais de controlo do processador multiciclo de MIPS tem uma falha presoem0 o que significa que o sinal é sempre 0 independentemente do valor pretendido Que instruções iriam funcionar mal Porquê a MemtoReg b ALUOp0 c PCSrc Exercício 710 Repita o Exercício 79 assumindo que o sinal tem uma falha presoem1 Capítulo sete Microarquitetura 658 Exercício 711 Modifique o código HDL para o processador de cicloúnico MIPS dado na Seção 761 para lidar com uma das novas instruções do Exercício 73 Melhore o o testbench apresentados na Seção 763 para testar a nova instrução Exercício 712 Repita o Exercício 711 para as novas instruções do Exercício 74 Exercício 713 Modifique o processador multiciclo MIPS para implementar uma das seguintes instruções Veja o Apêndice B para uma definição das instruções Faça uma cópia da Figura 727 para indicar as alterações no caminho de dados Nomeie quaisquer novos sinais de controle Faça uma cópia da Figura 739 para mostrar as alterações ao controlador FSM Descreva quaisquer outras mudanças que são necessárias a srlv b ori c xori d jr Exercício 714 Repita o Exercício 713 para as seguintes instruções MIPS a bne b lb c lbu d andi Capítulo sete Microarquitetura 659 Exercício 715 Repita o Exercício 75 para o processador multiciclo MIPS Mostre as alterações ao caminho de dados multiciclo e ao controlar FSM É possível adicionar a instrução sem modificar o banco de registros Exercício 716 Repita o Exercício 76 para o processador multiciclo MIPS Exercício 717 Suponha que o somador de vírgula flutuante e o multiplicador do Exercício 716 leva cada um dois ciclos para operar Por outras palavras as entradas são aplicadas no início de um ciclo e a saída está disponível no segundo ciclo Como a sua resposta ao Exercício 716 muda Exercício 718 A sua amiga a expert em projeto de circuito ofereceuse para redesenhar uma das unidades do processador multiciclo MIPS para o tornar muito mais rápido Usando os atrasos da Tabela 76 que unidade ela deve trabalhar para obter o maior aumento de velocidade do processador O quão rápido ele deve ser Tornandoo mais rápido do que o necessário é um desperdício de esforço do seu amigo Qual é o tempo de ciclo do processador melhorado Exercício 719 Repita o Exercício 78 para o processador multiciclo Considere a instrução mix do Exemplo 77 Exercício 720 Suponha que o processador multiciclo MIPS tem os atrasos dos componentes indicados na Tabela 76 Alyssa P Hacker projecta um novo banco de registros que tem 40 menos energia mas tem o dobro do atrado Será que ela deveria mudar para o banco de registros baixa potência mais lento para o seu processador multiciclo Capítulo sete Microarquitetura 660 Exercício 721 A Goliath Corp afirma ter uma patente sobre um banco de registros de três portos Em vez de desafiar a Goliath no tribunal Ben Bitdiddle projeta um novo banco de registros que tem apenas uma única porta de leituraescrita como a memória combinada de instrução e de dados Redesenhe o caminho de dados multiciclo MIPS e o controlador para usar o seu novo banco de registros Exercício 722 Qual é o CPI do processador multiciclo MIPS redesenhado a partir do Exercício 721 Use a instruções mix do Exemplo 77 Exercício 723 Quantos ciclos são necessários para executar o seguinte programa no processador multiciclo MIPS Qual é o CPI deste programa addi s0 0 done result 5 while beq s0 0 done if result 0 execute while block addi s0 s0 1 while block result result1 j while done Exercício 724 Repita o Exercício 723 para o programa seguinte add s0 0 0 i 0 add s1 0 0 sum 0 addi t0 0 10 t0 10 loop Capítulo sete Microarquitetura 661 slt t1 s0 t0 if i 10 t1 1 else t1 0 beq t1 0 done if t1 0 i 10 branch to done add s1 s1 s0 sum sum i addi s0 s0 1 increment i j loop done Exercício 725 Escreve o código HDL para o processador multiciclo MIPS O processador deve ser compatível com o módulo de nível superior seguinte O módulo de mem é usado para manter as instruções e os dados Teste o seu processador usando o testbench da Seção 763 module topinput logic clk reset output logic 310 writedata adr output logic memwrite logic 310 readdata instantiate processor and memories mips mipsclk reset adr writedata memwrite readdata mem memclk memwrite adr writedata readdata endmodule module meminput logic clk we input logic 310 a wd output logic 310 rd logic 310 RAM630 initial Capítulo sete Microarquitetura 662 begin readmemhmemfiledat RAM end assign rd RAMa312 word aligned always posedge clk if we RAMa312 wd endmodule Exercício 726 Estenda o seu código HDL para o processador multiciclo MIPS do Exercício 725 para lidar com uma das novas instruções do Exercício 713 Melhore a testbench para testar a nova instrução Exercício 727 Repita o Exercício 726 para uma das novas instruções do Exercício 714 Exercício 728 O processador com pipeline MIPS está a executar o seguinte programa Quais os registros que estão a ser escritos e quais o que estão a ser lidos no quinto ciclo addi s1 s2 5 sub t0 t1 t2 lw t3 15s1 sw t5 72t0 or t2 s4 s5 Capítulo sete Microarquitetura 663 Exercício 729 Repita o Exercício 728 para o seguinte programa MIPS Lembrese que o processador com pipeline MIPS tem uma unidade de hazard add s0 t0 t1 sub s1 t2 t3 and s2 s0 s1 or s3 t4 t5 slt s4 s2 s3 Exercício 730 Usando um diagrama semelhante ao da Figura 752 mostre o encaminhamento e o stall necessário para executar as seguintes instruções no processador com pipeline MIPS add t0 s0 s1 sub t0 t0 s2 Iw t1 60t0 and t2 t1 t0 Exercício 731 Repita o Exercício 730 para as seguintes instruções add t0 s0 s1 Iw t1 60s2 sub t2 t0 s3 and t3 t1 t0 Exercício 732 Quantos ciclos são necessários para o processador com pipeline MIPS obter todas as instruções do programa no Exercício 723 Qual é o CPI do processador neste programa Capítulo sete Microarquitetura 664 Exercício 733 Repita o Exercício 732 para as instruções do programa no Exercício 724 Exercício 734 Explique como estender o processador com pipeline MIPS para suportar a instrução addi Exercício 735 Explique como estender o processador com pipeline para suportar a instrução j Dê especial atenção à forma como o pipeline é descartado quando um salto ocorre Exercício 736 Os exemplos 79 e 710 afirmam que o desempenho do processador com pipeline MIPS pode ser melhorado se os branchs ocorrem na fase de execução em vez de no estágio de decodificação Mostre como modificar o processador com pipeline da Figura 758 para que o branch ocorra no estágio de execução Como é que os sinais de stall e de flushs se alteram Refazer os Exemplos 79 e 710 para encontrar o novo CPI tempo de ciclo e o tempo total para executar o programa Exercício 737 A sua amiga a expert em projeto de circuitos ofereceuse para redesenhar uma das unidades do processador com pipeline MIPS para ser muito mais rápido Usando os atrasos da Tabela 76 e o Exemplo 710 que unidade ela deve trabalhar para obter o maior aumento de velocidade do processador o quão rápido ele deve ser Tornandoo mais rápido do que o necessário é um desperdício de esforço do seu amigo Qual é o tempo de ciclo do processador melhorado Capítulo sete Microarquitetura 665 Exercício 738 Considere os atrasos da Tabela 76 e o Exemplo 710 Agora suponha que a ALU era 20 mais rápida Será que o tempo de ciclo do processador com pipeline MIPS mudou E se a ALU for 20 mais lenta Exercício 739 Suponha que o processador com pipeline MIPS é dividido em 10 estágios de 400 ps cada incluindo a sobrecarga de sequenciamento Considere a instruções mix do Exemplo 77 Também considere que 50 das cargas são imediatamente seguidas por uma instrução que utiliza o resultado requerendo seis stalls e que 30 dos branchs têm um erro de previsão O endereço de destino de instruções branch ou de salto não é determinado até ao final do segundo estágio Calcule o tempo médio do CPI e de execução da computação 100 bilhões de instruções da referência SPECint2000 para este processador com pipeline de 10estágios Exercício 740 Escreva o código HDL para o processador com pipeline MIPS O processador deve ser compatível com o módulo de alto nível do Exemplo HDL 713 Deve suportar todas as instruções descritas neste Capítulo incluindo addi e j ver Exercício 734 e Exercício 735 Teste o seu projeto usando o testbench do Exemplo HDL 712 Exercício 741 Projete a unidade hazard mostrada na Figura 758 para o processador com pipeline MIPS Use HDL para implementar o seu projeto Esboce o hardware que uma ferramenta de síntese possa gerar a partir de seu HDL Exercício 742 A interrupção nonmaskable NMI é desencadeada por um pino de entrada para o processador Quando o pino é ativado a instrução atual deve terminar então o processador deve definir o registro Cause a 0 e assumir uma exceção Mostre como modificar o processador multiciclo das Figura 763 e Figura 764 para lidar com interrupções nonmaskable Capítulo sete Microarquitetura 666 Questões de Entrevista Os exercícios seguintes apresentam perguntas que foram feitas em entrevistas para trabalhos de projeto digital Pergunta 71 Explique as vantagens de microprocessadores com pipeline Pergunta 72 Se os estágios adicionais de pipeline permitem que um processador possa ser mais rápido por que não têm os processadores 100 estágios de pipeline Pergunta 73 Descreva o que é um hazard num microprocessador e explique as formas pelas quais ele pode ser resolvido Quais são os prós e contras de cada alternativa Pergunta 74 Descrever o conceito de um processador superescalar e os seus prós e contras 667 8 Memória e Sistemas de IO 81 INTRODUÇÃO A capacidade de um computador para resolver problemas é influenciada pelo seu sistema de memória e pelos dispositivos entradasaída IO inputoutput tais como monitores teclados e impressoras que nos permitem manipular e ver os resultados das suas computações Este Capítulo investiga esses sistemas práticos de memória e IO A performance de um sistema computacional depende do sistema de memória bem como da microarquitetura do processador O Capítulo 7 supôs um sistema de memória ideal que poderia ser acessado num único ciclo de relógio No entanto isso seria verdade apenas para uma memória muito pequena ou um processador muito lento Os primeiros processadores eram relativamente lentos então a memória era capaz de o acompanhar Mas a velocidade dos processadores aumentou a uma taxa maior do que a velocidade das memórias Memórias DRAM são atualmente de 10 a 100 vezes mais lentas do que processadores O crescente distanciamento entre as velocidades do processador e da memória DRAM demanda sistemas de memória cada vez mais engenhosos para tentar aproximar uma memória que seja tão rápida quanto o processador A primeira metade deste Capítulo investiga os sistemas de memória e considera as escolhas em relação à velocidade à capacidade e ao custo O processador comunica com o sistema de memória através de uma interface de memória A Figura 81 mostra uma simples interface de memória utilizada no nosso processador MIPS multiciclos O processador envia um endereço através do barramento de endereços para o sistema de memória Para uma leitura MemWrite é 0 e a memória retorna o dado no barramento ReadData Para uma escrita MemWrite é 1 e o processador envia dados para a memória através do barramento WriteData Capítulo oito Memória e Sistemas de IO 668 Figura 81 A interface de memória Os principais problemas em projetos de sistemas de memória podem ser explicados utilizando uma metáfora de livros numa biblioteca Uma biblioteca contém muitos livros nas estantes Se você estivesse escrevendo um trabalho de conclusão de curso sobre o significado dos sonhos você poderia ir até à biblioteca e tirar da estante o livro de Freud A Interpretação dos Sonhos e trazêlo até o seu cubículo Após passar os olhos sobre ele você o colocaria de volta e pegaria A Psicologia do Inconsciente de Jung Você poderia então voltar para pegar outra citação de Interpretação dos sonhos seguida por outra viagem nas estantes atrás de O Ego e o Id Logo você ficaria cansado de ficar caminhando do seu cubículo até às estantes Se você for esperto economizaria tempo mantendo os livros no seu cubículo ao invés de ficar carregando os de um lado para o outro Além disso quando você pega um livro de Freud você poderia também pegar vários outros de seus livros da mesma estante Esta metáfora enfatiza o princípio introduzido na Seção 621 de fazer o caso comum rápido Mantendo os livros que você usou recentemente ou gostaria de usar no futuro em seu cubículo você reduz o número de idas consumidoras de tempo às estantes Em particular você utiliza os princípios da localidade espacial e temporal Localidade temporal significa que se você utilizou um livro recentemente é provável que você o usará novamente em breve Localidade espacial significa que quando você utiliza um livro em particular você provavelmente irá se interessar por outros livros da mesma estante A biblioteca em si faz o caso comum rápido através do uso desses princípios e localidade A biblioteca não tem nem o espaço nas prateleiras e nem o orçamento para acomodar todos os livros do mundo Ao Capítulo oito Memória e Sistemas de IO 669 invés disso ela mantém alguns dos livros menos utilizados armazenados no porão Além disso ela pode ter um acordo entre bibliotecas próximas de modo que ela possa oferecer mais livros do que possui fisicamente Resumindo você obtém benefícios tanto de uma grande coleção quanto do rápido acesso aos livros mais comumente utilizados através de uma hierarquia de armazenamento Os livros mais comumente utilizados estão no seu cubículo Uma grande coleção está nas estantes E uma coleção ainda maior está disponível com aviso prévio na cave e em outras bibliotecas Similarmente sistemas de memória usam uma hierarquia de armazenamento para acessar rapidamente os dados mais comumente utilizados enquanto ainda possuem a capacidade de armazenar grandes quantidades de dados Os subsistemas de memória utilizados para construir essa hierarquia foram introduzidos na Seção 55 As memórias de computador são primariamente construídas a partir de RAM dinâmicas DRAM e RAM estáticas SRAM Idealmente o sistema de memória do computador é rápido grande e barato Na prática uma única memória possui apenas dois desses três atributos ou é lenta ou é pequena ou é cara Porém os sistemas computacionais podemse aproximar do ideal pela combinação de uma memória rápida pequena e barata com uma memória lenta grande e barata A memória rápida armazena os dados e as instruções mais comumente utilizadas assim em média o sistema de memória aparentará ser rápido A memória grande armazena os restantes dados e instruções então a capacidade do sistema como um todo é grande A combinação de duas memórias baratas é muito menos cara do que uma única memória rápida Esses princípios são estendidos para o uso em toda uma hierarquia de memorias para aumentar a capacidade e diminuir a velocidade As memórias dos computadores são geralmente construídas a partir de chips DRAM Em 2012 um PC típico possuía a memória principal consistindo de 4 a 8 GB de DRAM e a memória DRAM custa cerca de 10 por gigabyte GB Os preços da DRAM têm diminuído cerca de 25 ao ano durante as últimas três décadas e a capacidade de memória vêm crescendo à mesma taxa de modo que o custo total da memória num PC tem permanecido grosseiramente constante Infelizmente a velocidade das DRAM vem aumentando apenas cerca de 7 ao ano enquanto a performance de um processador aumenta cerca de 25 a 50 ao ano como mostrado na Figura 82 O gráfico mostra as velocidades das memórias DRAM e dos processadores tendo como referência as velocidades do ano de 1980 Em meados de 1980 as velocidades dos processadores e das memórias eram iguais Mas as performances vêm divergindo desde então com as memórias ficando seriamente atrasadas Capítulo oito Memória e Sistemas de IO 670 Figura 82 Divergência entre desempenho do processador e da memória Adaptada com a permissão de Hennessy e Patterson Computer Architecture A Quantitative Approach 5th ed Morgan Kaufmann 2012 A DRAM poderia acompanhar os processadores nos anos 1970 e no início dos anos 1980 mas atualmente é lamentavelmente lenta O tempo de acesso à DRAM é de uma a duas ordens de magnitude maior do que o tempo de ciclo do processador dezenas de nano segundos comparado com menos do que um nano segundo Para contrariar esta tendência os computadores armazenam os dados e instruções mais comumente utilizados numa memória rápida porém menor chamada cache A cache é usualmente construída fora da SRAM no mesmo chip que o processador A velocidade da cache é comparável à velocidade do processador pois a SRAM é inerentemente mais rápida do que a DRAM e porque a memória no mesmo chip elimina os longos atrasos causados pelo caminho até um chip separado Em 2012 um chip SRAM custava na ordem de 10000GB porém a cache é relativamente menor kilobytes a alguns megabytes então o custo total é pequeno Caches podem armazenar tanto instruções quanto dados mas iremos nos referir ao seu conteúdo como sendo genericamente dados Se o processador solicita dados que estão disponíveis na cache eles são retornados rapidamente Isso é chamado cache hit Caso contrário o processador recupera o dado da memória principal DRAM Isso é Capítulo oito Memória e Sistemas de IO 671 chamado cache miss Se acontecem hits na maioria do tempo então o processador raramente tem que esperar pela memória principal lenta e o tempo médio de acesso é curto O terceiro nível na hierarquia de memória é o disco rígido Do mesmo modo que uma biblioteca utiliza a cave para armazenar os livros que não cabem nas estantes os sistemas computacionais utilizam o disco rígido para armazenar dados que não são cabem na memória principal Em 2012 uma drive de disco rídigo HDD Hard Disk Drive construído utilizando armazenamento magnético custava menos que 010GB e possuía um tempo de acesso de cerca de 10 ms O custo dos discos rígidos tem diminuído cerca de 60 ao ano mas o tempo de acesso quase não melhorou As drives de estado sólido Solid State Drives SSD construídos utilizando tecnologia de memória flash são uma alternativa comumente crescente aos HDD Os SSD vêm sendo utilizados por nichos de mercado por mais de duas décadas e foram introduzidos no mercado principal em 2007 Os SSD superam algumas das falhas mecânicas dos HDD mas custam dez vezes mais 1GB O disco rígido fornece uma ilusão de mais capacidade do que na verdade existe na memória principal Isso é então chamado memória virtual Assim como livros numa cave os dados na memória virtual levam um longo tempo para serem acessados A memória principal também chamada memória física mantém um subconjunto de memória virtual Consequentemente a memória principal pode ser vista como uma cache para os dados mais comumente utilizados do disco rígido Figura 83 Uma hierarquia de memória típica A Figura 83 resume a hierarquia de memória de um sistema computacional discutida no restante deste Capítulo O processador primeiramente procura o dado na pequena mas rápida cache que está localizada Capítulo oito Memória e Sistemas de IO 672 usualmente no mesmo chip Se o dado não está disponível na cache o processador então procura na memória principal Se o dado também não está lá o processador busca o dado na memória virtual do grande porém lento disco rígido Figura 84 ilustra esse compromisso entre a capacidade e a velocidade na hierarquia de memória e lista os custos típicos tempos de acessos e larguras de banda na tecnologia em 2012 À medida que o tempo de acesso diminui a velocidade aumenta A Seção 82 introduz a análise de performance do sistema de memória A Seção 83 explora várias organizações de cache e a Seção 84 investiga os sistemas de memória virtual Para concluir este Capítulo explora como os processadores conseguem acessar dispositivos de entrada e saída como teclados e monitores de maneira muito parecida com a qual acessam a memória A Seção 85 investiga o IO mapeado na memória A Seção 86 endereça o IO para sistemas embarcados e a Seção 87 descreve os principais padrões IO para computadores pessoais Figura 84 Componentes da hierarquia de memória com características típicas em 2012 82 ANÁLISE DA PERFORMANCE DOS SISTEMAS DE MEMÓRIA Projetistas e compradores de computadores precisam de meios quantitativos para medir a performance de sistemas de memória para avaliar o custobenefício entre várias alternativas As métricas da performance dos sistemas de memória são a hit rate a miss rate e o tempo médio de acesso à memória As taxas de hit e miss são calculadas como Capítulo oito Memória e Sistemas de IO 673 𝑀𝑖𝑠𝑠 𝑅𝑎𝑡𝑒 𝑛ú𝑚𝑒𝑟𝑜 𝑑𝑒 𝑚𝑖𝑠𝑠𝑒𝑠 𝑁ú𝑚𝑒𝑟𝑜 𝑡𝑜𝑡𝑎𝑙 𝑑𝑒 𝑎𝑐𝑒𝑠𝑠𝑜𝑠 𝑑𝑒 𝑚𝑒𝑚ó𝑟𝑖𝑎 1 𝐻𝑖𝑡 𝑅𝑎𝑡𝑒 81 𝐻𝑖𝑡 𝑅𝑎𝑡𝑒 𝑁ú𝑚𝑒𝑟𝑜 𝑑𝑒 ℎ𝑖𝑡𝑠 𝑁ú𝑚𝑒𝑟𝑜 𝑡𝑜𝑡𝑎𝑙 𝑑𝑒 𝑎𝑐𝑒𝑠𝑠𝑜𝑠 𝑑𝑒 𝑚𝑒𝑚ó𝑟𝑖𝑎 1 𝑀𝑖𝑠𝑠 𝑅𝑎𝑡𝑒 Exemplo 81 CALCULANDO A PERFORMANCE DA CACHE Suponha que um programa tem 2000 instruções de acesso de dados carregamentos ou armazenamentos e 1250 desses valores de dados solicitados são encontrados na cache Os outros 750 valores de dados são fornecidos ao processador pela memória principal ou memória de disco Quais são a hit rate e miss rate para a cache Solução A miss rate é 7502000 0375 375 A hit rate é 12502000 0625 1 0375 625 O tempo médio de acesso à memória AMAT Average memory access time é o tempo médio que o processador deve esperar pela memória por instrução de carregamento ou armazenamento No sistema computacional típico da Figura 83 o processador primeiramente procura pelo dado na cache Se a cache falha o processador então procura na memória principal Se a memória principal falha o processador acessa a memória virtual no disco rígido Portanto o AMAT é calculado como 𝐴𝑀𝐴𝑇 𝑡𝑐𝑎𝑐ℎ𝑒 𝑀𝑅𝑐𝑎𝑐ℎ𝑒𝑡𝑀𝑀 𝑀𝑅𝑀𝑀𝑡𝑉𝑀 82 Onde 𝑡𝑐𝑎𝑐ℎ𝑒 𝑡𝑀𝑀 e 𝑡𝑉𝑀 são os tempos de acesso da cache memória principal e memória virtual e 𝑀𝑅𝑐𝑎𝑐ℎ𝑒 e 𝑀𝑅𝑀𝑀 são as taxas de erro da cache e da memória principal respectivamente Exemplo 82 CALCULANDO O TEMPO MÉDIO DE ACESSO À MEMÓRIA Suponha que um sistema computacional possui uma organização de memória com apenas dois níveis de hierarquia a cache e a memória principal Qual é o tempo médio de acesso à memória dados os tempos de acessos e miss rate na Tabela 81 Capítulo oito Memória e Sistemas de IO 674 Solução O tempo médio de acesso à memória é de 1 01100 11 ciclos Tabela 81 Tempos de acesso e taxas de erro Exemplo 83 MELHORANDO O TEMPO DE ACESSO Um tempo médio de acesso à memória de 11 ciclos significa que o processador gasta dez ciclos esperando pelo dado para cada ciclo verdadeiramente usando o dado Qual a miss rate da cache necessária para reduzir o tempo médio de acesso à memória para 15 ciclos dados os tempos de acesso na Tabela 81 Solução Se a miss rate é 𝑚 o tempo médio de acesso é de 1 100𝑚 Ajustando esse tempo para 15 e resolvendo para 𝑚 requer uma miss rate da cache de 05 Como uma palavra de cautela melhoras na performance podem não ser sempre tão boas quanto parecem Por exemplo fazendo um sistema de memória dez vezes mais rápido não necessariamente fará um programa de computador rodar dez vezes mais rápido Se 50 das instruções de um programa são carregamentos e armazenamentos uma melhora de dez vezes no sistema de memória apenas significa uma melhora de 182 vezes na performance do programa Este princípio geral é chamado Lei de Amdahl a qual diz que o esforço gasto aumentando a performance de um subsistema é válido apenas se o subsistema afeta uma grande percentagem da performance como um todo 83 CACHES A cache mantém dados comumente utilizados pela memória O número de dados que podem ser mantidos é chamado de capacidade 𝐶 Devido à capacidade da cache ser menor do que a da memória principal o projetista do sistema computacional deve escolher em qual subconjunto da memória principal será mantida a cache Gene Amdahl 1922 Famoso pela Lei de Amdahl uma observação feita por ele em 1965 Enquanto estava na graduação começou a projetar computadores em seu tempo livre Esse trabalho paralelo rendeu seu PhD em física teórica em 1952 Se juntou à IBM imediatamente após a graduação e depois saiu para fundar três companhias inclusive a Amdhal Corporation em 1970 Capítulo oito Memória e Sistemas de IO 675 Quando o processador tenta acessar um dado ele primeiro verifica na cache pelo dado Se a cache acerta o dado está disponível imediatamente Se a cache erra o processador busca o dado na memória principal e o coloca na cache para uso futuro Para acomodar novos dados a cache deve substituir dados antigos Esta seção investiga esses problemas no projeto da cache respondendo as seguintes questões 1 Que dado é mantido na cache 2 Como o dado é encontrado E 3 Que dado é substituído para abrir espaço para o novo dado quando a cache está cheia Quando ler as próximas seções tenha em mente que a força motriz para responder essas questões é a inerente localização temporal e espacial do acesso aos dados na maioria das aplicações A cache utiliza localização espacial e temporal para prever qual dado será necessitado em seguida Se um programa acessa o dado numa ordem aleatória ele não se beneficiaria da cache Como explicaremos nas seções seguintes as caches são especificadas por sua capacidade C número de conjuntos S tamanho de bloco b número de blocos B e grau de associatividade N Apesar de focarmos o carregamento de dados na cache os mesmos princípios se aplicam para as buscas em cache de instruções As operações de armazenamento de dados em cache são similares e serão melhor discutidas na Seção 834 831 Qual a Informação a Manter na Cache Uma cache ideal anteciparia todos os dados necessários ao processador e os buscaria na memória principal antes do tempo de modo que a cache teria uma miss rate nulo Devido ao fato de que é impossível prever o futuro com perfeita acurácia a cache deve supor qual o dado será necessário baseado em um padrão passado de acessos à memória Em particular a cache explora a localidade temporal e espacial para alcançar uma miss rate pequeno Lembrese que localidade temporal significa que o processador tem a tendência de acessar um pedaço de dado novamente em breve se ele tiver acessado aquele dado recentemente Portanto quando o processador carrega ou armazena dados que não estão na cache o dado é copiado da memória principal para a cache Requisições subsequentes para aquele dado irão direto para a cache Cache Um local escondido principalmente para ocultar e preservar provisões ou implementos Merriam Webster Online Dictionary 2012 Capítulo oito Memória e Sistemas de IO 676 Lembrese que localidade espacial significa que quando o processador acessa um pedaço de dado é provável que ele também acesse dados em posições de memória próximas Portanto quando a cache busca uma palavra na memória ele também buscará várias palavras adjacentes Esse grupo de palavras é chamado bloco de cache ou linha de cache O número de palavras no bloco de cache 𝑏 é chamado tamanho de bloco Uma cache de capacidade 𝐶 contém 𝐵 𝐶𝑏 blocos Os princípios da localidade temporal e espacial têm sido experimentalmente verificados em programas reais Se uma variável é utilizada num programa a mesma variável provavelmente será utilizada depois criando localidade temporal Se um elemento em um array é utilizado outros elementos no mesmo array também têm a tendência a serem utilizados criando localidade espacial 832 Como a Informação é Encontrada A cache é organizado em 𝑆 conjuntos cada um deles mantendo um ou mais blocos de dados A relação entre o endereço do dado na memória principal e a localização daquele dado na cache é chamada de mapeamento Cada endereço de memória mapeia para exatamente um conjunto na cache Alguns dos bits de endereço são utilizados para determinar qual o conjunto da cache que contém o dado Se o conjunto contém mais de um bloco o dado pode ser mantido em qualquer um dos blocos do conjunto As caches são categorizadas tendo por base o número de blocos num conjunto Numa cache de mapeamento direto cada conjunto contém exatamente um bloco então a cache contém 𝑆 𝐵 conjuntos Então um endereço particular da memória principal mapeia para um único bloco a cache Numa cache de conjunto associativa de Nvias cada conjunto contém 𝑁 blocos O endereço continua a mapear apenas um único conjunto com 𝑆 𝐵𝑁 conjuntos Mas o dado daquele endereço pode ir para qualquer um dos 𝑁 blocos naquele conjunto Uma cache totalmente associativa possui apenas um conjunto 𝑆 1 O dado pode ir para qualquer um dos 𝐵 blocos no conjunto Consequentemente uma cache totalmente associativa é outro nome para uma cache associativa de 𝐵vias Para ilustrar essas organizações de cache iremos considerar um sistema de memória MIPS com endereços de 32bits e palavras de 32bits A memória é endereçável por byte e cada palavra possui quatro bytes então a memória consiste de 230palavras alinhadas nos limites das palavras Analisamos caches com uma capacidade de oito palavras 𝐶 em nome da simplicidade Começaremos com um bloco de uma palavra de tamanho 𝑏 de seguida generalizaremos para blocos maiores Capítulo oito Memória e Sistemas de IO 677 Cache de Mapeamento Direto Uma cache de mapeamento direto possui um bloco em cada conjunto logo é organizada em 𝑆 𝐵 conjuntos Para entender o mapeamento dos endereços de memória para os blocos de cache imagine a memória principal como sendo mapeada em blocos de 𝑏 palavras assim como a cache o é Um endereço no bloco 0 da memória principal mapeia para o conjunto 0 da cache e assim por diante até o endereço no bloco 𝐵 1 da memória principal mapear o bloco 𝐵 1 da cache Não existem mais blocos na cache então o mapeamento a envolve de modo que o bloco 𝐵 da memória principal mapeia para o bloco 0 da cache Esse mapeamento é ilustrado na Figura 85 para uma cache de mapeamento direto com a capacidade de oito palavras e um bloco de tamanho de uma palavra A cache possui oito conjuntos cada um deles contendo um bloco de uma palavra Os dois bits mais baixos do endereço são sempre 00 pois eles são de palavras alinhadas Os próximos log2 8 3 bits indicam o conjunto para o qual é mapeado cada endereço de memória Então os dados nos endereços 0𝑥00000004 0𝑥00000024 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹𝐸4 são mapeados para o conjunto 1 como mostrado em azul Da mesma forma dados nos endereços 0𝑥00000010 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹𝐹0 são todos mapeados para o conjunto 4 e assim por diante Cada endereço da memória principal mapeia exatamente um conjunto na cache Exemplo 84 CAMPOS DE CACHE Para qual conjunto da cache na Figura 85 a palavra no endereço 0𝑥00000014 é mapeada Nomeie outro endereço que mapeia para o mesmo conjunto Solução Os dois bits menos significativos dos endereços são 00 pois os endereços são de palavras alinhadas Os próximos três bytes são 101 então a palavra mapeia para o conjunto 5 Palavras nos endereços 0𝑥34 0𝑥54 0𝑥74 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹𝐹4 são todas mapeadas para o mesmo conjunto Devido a muitos endereços mapearem para um único conjunto a cache deve também acompanhar o endereço dos dados efetivamente contidos em cada conjunto Os bits menos significativos do endereço especificam quais conjuntos mantêm os dados Os bits mais significativos restantes são chamados de tag e indicam quais dos muitos possíveis endereços são mantidos naquele conjunto Capítulo oito Memória e Sistemas de IO 678 Em nossos exemplos anteriores os dois bits menos significativos do endereço de 32bits são chamados byte offset pois eles indicam o byte no interior da palavra Os próximos três bits são chamados set bits pois eles indicam o conjunto para o qual o endereço é mapeado em geral o número de set bits é log2 𝑆 Os 27 tag bits restantes indicam o endereço de memória do dado armazenado num dado conjunto da cache A Figura 86 mostra os campos de cache para o endereço 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹𝐹4 Ele mapeia para o conjunto 1 e todas as suas tags são 1 Figura 85 Mapeamento da memória principal para uma cache de mapeamento direto Capítulo oito Memória e Sistemas de IO 679 Exemplo 85 CAMPOS DE CACHE Encontre o número do conjunto e os tag bits para uma cache de mapeamento direto com 1024 210 conjuntos e tamanho de bloco de uma palavra O tamanho do endereço é de 32bits Solução Uma cache com 210 conjuntos necessita log2210 10 set bits Os dois bits menos significativos do endereço são o byte offset e os 32 10 2 20 bits restantes formam o tag Algumas vezes como quando o computador é ligado os conjuntos da cache não contêm dados A cache utiliza um bit válido para cada conjunto para indicar se o conjunto mantém dados significativos Se o bit válido é 0 o conteúdo não tem significado Figura 86 Campo de cache para o endereço 0xFFFFFFE4 quando mapeado para a cache na Figura 85 A Figura 87 mostra o hardware para a cache diretamente mapeada da Figura 85 A cache é construída como uma SRAM de oito entradas Cada entrada ou conjunto contém uma linha consistindo de 32bits de dados 27bits de tag e 1bit válido A cache é acessada utilizando o endereço de 32bits Os dois bits menos significativos os bits do byte de offset são ignorados para o acesso das palavras Os próximos três bits os set bits especificam a entrada ou o conjunto na cache Uma instrução de carregamento lê a entrada especificada da cache e verifica os tag bits e bits válidos Se o tag está em concordância com os 27bits mais significativos do endereço e o bit válido é 1 a cache acerta e o dado é retornado ao processador Caso contrário a cache erra e o sistema de memória deve buscar o dado na memória principal Capítulo oito Memória e Sistemas de IO 680 Figura 87 Cache de mapeamento direto com 8 conjuntos Exemplo 86 LOCALIDADE TEMPORAL COM UM CACHE DE MAPEAMENTO DIRETO Os loops são uma fonte comum de localidades temporais e espaciais em aplicações Utilizando a cache de oito entradas da Figura 87 mostre os conteúdos da cache após a execução do loop dummy em código assembly MIPS abaixo Assuma que a cache está inicialmente vazia Qual é a miss rate addi t0 0 5 loop beq t0 0 done lw t1 0x40 lw t2 0xC0 lw t3 0x80 addi t0 t0 1 j loop done Capítulo oito Memória e Sistemas de IO 681 Solução O programa contém um loop que se repete por cinco iterações Cada iteração envolve três acessos à memória carregamentos resultando num total de 15 acessos à memória A primeira vez que o loop é executado a cache está vazia e o dado deve ser buscado na memória principal nas localizações 0𝑥4 0𝑥𝐶 e 0𝑥8 para os cache sets 1 3 e 2 respectivamente No entanto nas próximas quatro vezes que o loop é executado o dado se encontra na cache A Figura 88 mostra o conteúdo da cache durante a última requisição para o endereço de memória 0𝑥4 As tags são todas 0 pois os 27 bits superiores dos endereços são 0 A miss rate é de 3 15 20 Quando dois endereços recentemente acessados mapeiam para o mesmo bloco da cache um conflito ocorre e o endereço mais recentemente acessado expulsa o anterior do bloco As caches de mapeamento direto possuem apenas um bloco em cada conjunto então dois endereços que mapeiam para o mesmo conjunto sempre causam um conflito O Exemplo 87 ilustra esses conflitos Figura 88 Conteúdo da cache mapeado diretamente Exemplo 87 CONFLITO DE BLOQUEIO DE CACHE Qual é a miss rate quando o seguinte loop é executado na cache de mapeamento direto de oito palavras da Figura 87 Assuma que a cache está inicialmente vazia addi t0 0 5 loop beq t0 0 done Capítulo oito Memória e Sistemas de IO 682 lw t1 0x40 lw t2 0x240 addi t0 t0 1 j loop done Solução Ambos os endereços de memória 0𝑥4 e 0𝑥24 mapeiam para o conjunto 1 Durante a execução inicial do loop os dados no endereço 0𝑥4 são carregados no conjunto 1 Então o dado no endereço 0𝑥24 é carregado no conjunto 1 expulsando o dado do endereço 0𝑥4 No início da segunda execução do loop o padrão se repete e a cache deve buscar novamente o dado no endereço 0𝑥4 expulsando o dado do endereço 0𝑥24 Os dois endereços entram em conflito e a miss rate é de 100 Figura 89 Cache associativa de conjunto de duas vias Capítulo oito Memória e Sistemas de IO 683 Cache Associativa de Conjunto Multivias Uma cache associativa de conjunto de Nvias reduz os conflitos disponibilizando 𝑁 blocos em cada conjunto onde o mapeamento de dados para aquele conjunto pode ser encontrado Cada endereço de memória continua mapeando para um conjunto específico mas ele pode mapear para qualquer um dos 𝑁 blocos do conjunto Consequentemente uma cache de mapeamento direto é outro nome para uma cache associativa de uma via Ao 𝑁 também é chamado de grau de associatividade da cache A Figura 89 mostra o hardware para uma cache associativa com 𝐶 8 palavras 𝑁 2 vias A cache agora possui apenas 𝑆 4 conjuntos ao invés de 8 Portanto apenas log2 4 2 set bits ao invés de 3 são usados para selecionar o conjunto A tag aumenta de 27 para 28 bits Cada conjunto contém duas vias ou graus de associatividade Cada via consiste num bloco de dados e os bits válidos e tag bits A cache lê os blocos de ambas as vias no conjunto selecionado e verifica as tags e os bits válidos Se ocorre acerto numa das vias um multiplexador seleciona o dado daquela via As caches associativas de conjunto geralmente possuem menores taxas de erro do que as caches de mapeamento direto com a mesma capacidade pois elas têm menos conflitos No entanto as caches associativas de conjunto são normalmente mais lentas e ligeiramente mais caras de se construir devido à saída multiplexada e aos comparadores adicionais Elas também levantam a questão de que maneira substituir quando ambas as vias estão ocupadas essa questão é tratada mais profundamente na Seção 833 A maioria dos sistemas comerciais utiliza caches associativas de conjunto Exemplo 88 MISS RATE DA CACHE ASSOCIATIVA DE CONJUNTO Repita o Exemplo 87 utilizando a cache associativa de conjunto de oito palavras e duas vias da Figura 89 Solução Ambos os acessos à memória dos endereços 0𝑥4 e 0𝑥24 mapeiam para o conjunto 1 No entanto a cache tem duas vias então ele pode acomodar dados de ambos os endereços Durante a primeira iteração do loop a cache vazia perde ambos os endereços e carrega ambas as palavras de dados nas duas vias do conjunto 1 como mostrado na Figura 810 Nas próximas quatro iterações a cache acerta Consequentemente a miss rate é de 2 10 20 Lembrese que a cache de mapeamento direto do mesmo tamanho do Exemplo 87 possuía uma miss rate de 100 Capítulo oito Memória e Sistemas de IO 684 Figura 810 Conteúdo da cache associativa de duas vias Cache Totalmente Associativa Uma cache totalmente associativa contém um único conjunto com 𝐵 vias onde 𝐵 é o número de blocos Um endereço de memória pode mapear para o bloco em qualquer uma dessas vias Uma cache totalmente associativa é outro nome para um cache associativa de 𝐵 vias com um conjunto Figura 811 Cache completamente associativa de oito blocos A Figura 811 mostra o array SRAM de uma cache totalmente associativa com oito blocos Sobre a solicitação de dados oito tags de comparação não mostrados devem ser feitos pois o dado pode estar em qualquer bloco Similarmente um multiplexador 8 1 escolhe os dados apropriados se um acerto ocorrer Caches totalmente associativas tendem a ter os menores erros de conflitos para uma dada capacidade de cache mas elas requerem mais hardware para comparações adicionais de tags Elas são mais adequadas para caches relativamente pequenas devido ao grande número de comparadores Capítulo oito Memória e Sistemas de IO 685 Tamanho de Bloco Os exemplos anteriores eram capazes de tirar vantagem apenas da localidade temporal pois o tamanho do bloco era de uma palavra Para explorar a localidade espacial uma cache utiliza blocos maiores para manter muitas palavras consecutivas A vantagem de um tamanho de bloco maior do que um é que quando um erro ocorre e a palavra é buscada na cache as palavras adjacentes no bloco também são buscadas Portanto acessos subsequentes são mais propensos a acertos devido à localidade espacial No entanto um tamanho grande de bloco significa que uma cache de tamanho fixo terá menos blocos Isso pode levar a mais conflitos aumentando a miss rate Mais ainda leva mais tempo buscar a cache errada após um erro pois mais que uma palavra de dado é buscada na memória principal O tempo necessário para carregar um bloco errado na cache é chamado penalidade de erro Se as palavras adjacentes no bloco não são acessadas posteriormente o esforço de buscalas é perdido Mesmo assim a maioria dos programas reais beneficiam de tamanhos de blocos maiores Figura 812 Cache mapeada diretamente com dois conjuntos e um tamanho de bloco de quatro palavras A Figura 812 mostra o hardware para uma cache mapeada diretamente com 𝐶 8 palavras e com um tamanho de bloco de 𝑏 4 palavras A cache agora possui apenas 𝐵 𝐶 𝑏 2 blocos Uma cache de mapeamento direto possui um bloco em cada conjunto de modo que esta cache é organizada em dois conjuntos Portanto apenas log2 2 1 bit é utilizado para selecionar o conjunto Um multiplexador é agora necessário para selecionar a palavra dentro do bloco O multiplexador é controlado pelos log2 4 2 bits de Capítulo oito Memória e Sistemas de IO 686 offset de bloco do endereço Os 27 bits mais significativos de endereço formam a tag Apenas uma tag é necessária para todo o bloco pois as palavras no bloco estão em endereços consecutivos Figura 813 Campos de cache para endereço 0x8000009C quando mapeado para a cache da Figura 812 A Figura 813 mostra os campos de cache para os endereços 0𝑥8000009𝐶 quando mapeados para a cache de mapeamento direto da Figura 812 Os bits do byte de offset são sempre 0 para acessos de palavra Os próximos log2 𝑏 2 bits de offset de bloco indicam a palavra dentro do bloco E o próximo bit indica o conjunto Os 27 bits restantes são a tag Portanto a palavra 0𝑥8000009𝐶 mapeia para o conjunto 1 palavra 3 na cache O princípio de se utilizar tamanhos maiores de blocos para explorar a localização espacial também é aplicado a caches associativas Figura 814 Conteúdo da cache com um tamanho de bloco b de quatro palavras Capítulo oito Memória e Sistemas de IO 687 Exemplo 89 LOCALIZAÇÃO ESPACIAL COM UMA CACHE DE MAPEAMENTO DIRETO Repita o Exemplo 86 para a cache de mapeamento direto de oito palavras com um tamanho de bloco de quatro palavras Solução A Figura 814 mostra o conteúdo da cache após o primeiro acesso de memória Na primeira iteração do loop a cache erra no acesso ao endereço de memória 0𝑥4 Esse acesso carrega os dados nos endereços de 0𝑥0 a 0𝑥𝐶 para o bloco da cache Todos os acessos subsequentes como mostrado para o endereço 0𝑥𝐶 acertam na cache Consequentemente a miss rate é de 1 15 667 Colocando Tudo Junto As caches são organizadas em arrays bidimensionais As linhas são chamadas conjuntos e as colunas são chamadas vias Cada entrada no array consiste num bloco de dados e seus associados bits válidos e tag As caches são caracterizadas por Capacidade 𝐶 Tamanho do bloco 𝑏 e número de blocos 𝐵 𝐶𝑏 Número de blocos num conjunto 𝑁 A Tabela 82 resume os vários tipos de organização de cache Cada endereço na memória mapeia para apenas um conjunto mas pode ser armazenado em qualquer uma das vias Tabela 82 Organizações da cache Capítulo oito Memória e Sistemas de IO 688 A capacidade da cache associatividade tamanho do conjunto e tamanho do bloco são tipicamente potencias de 2 Isso faz com que os campos da cache bits tags conjuntos e offset de blocos sejam subconjuntos dos bits de endereço Aumentar a associatividade 𝑁 normalmente reduz a miss rate causada pelos conflitos Mas uma maior associatividade requer maiores comparadores Aumentar o tamanho do bloco 𝑏 tira vantagem da localização espacial e reduz a miss rate No entanto isso diminui o número de conjuntos numa cache de tamanho fixo e portanto pode levar a mais conflitos Isso também aumenta a penalidade dos erros 833 Qual a Informação a Substituir Numa cache de mapeamento direto cada endereço mapeia para um único bloco e conjunto Se um conjunto está cheio quando novos dados precisam ser carregados o bloco naquele conjunto é substituído com o novo dado Em caches associativas de conjuntos e totalmente associativas a cache deve escolher de qual bloco retirar dados quando um conjunto está cheio O princípio da localização temporal sugere que a melhor escolha é retirar dados do bloco menos recentemente utilizado pois é muito pouco provável que ele seja utilizado em breve Consequentemente a maioria das caches associativas possuem uma política de substituição dos menos recentemente utilizados LRU least recently used Numa cache associativa de duas vias um bit de uso 𝑈 indica qual a via dentro de um conjunto menos recentemente utilizada A cada vez que uma das vias é utilizada 𝑈 é ajustado para indicar a outra via Para caches associativas de conjunto com mais de duas vias localizar a via menos recentemente utilizada se torna complicado Para simplificar este problema as vias são frequentemente divididas em dois grupos e 𝑈 indica qual o grupo de vias menos recentemente utilizado Após a substituição o novo bloco substitui um bloco aleatoriamente dentro do grupo menos recentemente utilizado Tal política é chamada pseudoLRU e é uma prática boa o suficiente Exemplo 𝟖 𝟏𝟎 SUBSTITUIÇÃO DA LRU Mostre o conteúdo de uma cache associativa de conjunto de oito palavras e duas vias após a execução do seguinte código Assuma uma substituição da LRU um tamanho de bloco de uma palavra e uma cache inicialmente vazia Capítulo oito Memória e Sistemas de IO 689 lw t0 0x040 lw t1 0x240 lw t2 0x540 Solução As primeiras duas instruções carregam dados dos endereços de memória 0𝑥4 e 0𝑥24 para o conjunto 1 da cache mostrada na Figura 815 a 𝑈 0 indica que o dado na via 0 foi o menos recentemente utilizado O próximo acesso de memória no endereço 0𝑥54 também mapeia para o conjunto 1 e substitui o dado menos recentemente utilizado na via 0 como mostrado na Figura 815 b O bit de uso 𝑈 é colocado a 1 para indicar que o dado na via 1 foi o menos recentemente utilizado Figura 815 Duas caches associativas de duas vias com substituição LRU 834 Projeto Avançado de Cache Os sistemas modernos utilizam múltiplos níveis de cache para diminuir o tempo de acesso à memória Esta seção explora o desempenho de um sistema de cache com dois níveis e examina como o tamanho dos blocos a associatividade e a capacidade da cache afetam a miss rate A seção também descreve como as caches lidam com os armazenamentos ou escritas através do uso da política de WriteTrough ou WriteBack Capítulo oito Memória e Sistemas de IO 690 Caches de Níveis Múltiplos As caches grandes são benéficas pois são mais propensas a armazenarem dados de interesse e portanto possuem menores miss rates No entanto as caches grandes tendem a ser mais lentas que as menores Os sistemas modernos utilizam frequentemente pelo menos dois níveis de cache como mostrado na Figura 816 A cache do primeiro nível 𝐿1 é pequena o suficiente para fornecer um tempo de acesso de um ou dois ciclos A cache do segundo nível 𝐿2 é também construído a partir de uma SRAM mas é maior e portanto mais lenta que a cache do primeiro nível O processador primeiramente procura pelo dado na cache 𝐿1 Se a cache 𝐿1 erra o processador procura na cache 𝐿2 Se a cache 𝐿2 erra o processador busca o dado na memória principal Muitos sistemas modernos adicionam ainda mais níveis de cache à hierarquia da memória pois acessar a memória principal é muito lento Figura 816 Hierarquia de memória com cache de dois níveis Capítulo oito Memória e Sistemas de IO 691 Exemplo 811 SISTEMA COM UMA CACHE L2 Use o sistema da Figura 816 com tempos de acesso de 1 10 e 100 ciclos para a cache 𝐿1 cache 𝐿2 e a memória principal respectivamente Assuma que as caches 𝐿1 e 𝐿2 possuem taxas de erro de 5 e 20 respectivamente Especificamente dos 5 dos acessos que são errados na cache 𝐿1 20 deles também são errados na cache 𝐿2 Qual é o tempo médio de acesso à memória AMAT Solução Cada acesso à memória verifica a cache 𝐿1 Quando a cache 𝐿1 erra 5 do tempo o processador verifica a cache 𝐿2 Quando a cache 𝐿2 erra 20 do tempo o processador busca o dado na memória principal Usando a Equação 82 calculamos o tempo médio de acesso à memória como segue 1 𝑐𝑖𝑐𝑙𝑜 00510 𝑐𝑖𝑐𝑙𝑜𝑠 02100𝑐𝑖𝑐𝑙𝑜𝑠 25 𝑐𝑖𝑐𝑙𝑜𝑠 A miss rate 𝐿2 é alta pois ela recebe apenas os acessos pesados à memória aqueles que foram errados na cache 𝐿1 Se todos os acessos fossem diretamente para a cache 𝐿2 a miss rate de 𝐿2 seria em torno de 1 Reduzindo a Miss Rate Os erros de cache podem ser reduzidos mudandose a capacidade o tamanho do bloco eou a associatividade O primeiro passo na redução da miss rate é entender a causa dos erros Os erros podem ser classificados como compulsórios capacidade e conflito A primeira solicitação para um bloco de cache é chamada falha compulsória pois o bloco deve ser lido da memória independentemente do projeto da cache As falhas de capacidade ocorrem quando a cache é muito pequena para manter todos os dados simultaneamente As falhas de conflito são causadas quando muitos endereços mapeiam para o mesmo conjunto e retiram blocos que ainda são necessários Mudar os parâmetros da cache pode afetar um ou mais tipos de falhas da cache Por exemplo aumentar a capacidade da cache pode reduzir as falhas de conflito e capacidade mas isso não afeta as falhas compulsórias Por outro lado aumentar o tamanho do bloco pode reduzir as falhas compulsórias devido à Capítulo oito Memória e Sistemas de IO 692 localização espacial mas pode verdadeiramente aumentar as falhas de conflito pois mais endereços iriam mapear para o mesmo conjunto causando conflitos Os sistemas de memória são suficientemente complexos pelo que a melhor maneira de avaliar a sua performance é rodando benchmarks enquanto se variam os parâmetros da cache A Figura 817 representa a taxa de falhas versus o tamanho da cache e o grau de associatividade para o benchmark SPEC2000 Esta benchmark possui um pequeno número de falhas compulsórias mostrados na região escura perto do eixo x Figura 817 Taxas de erros versus tamanho de cache e associatividade com o benchmark SPEC2000 Adaptada com permissão de Hennessy and Patterson Computer Architecture A Quantitative Approach 5th ed Morgan Kaufmann 2012 Capítulo oito Memória e Sistemas de IO 693 Como esperado quando o tamanho da cache aumenta as falhas de capacidade diminuem Um aumento da associatividade especialmente para caches pequenas diminui o número de falhas de conflito mostradas ao longo do topo da curva Aumentar a associatividade acima de quatro ou oito vias proporciona apenas uma pequena diminuição na taxa de falhas Como mencionado a taxa de falhas também pode ser diminuída utilizandose tamanhos maiores de blocos tirando vantagem da localização espacial Mas conforme o tamanho dos blocos aumenta o número de conjuntos de tamanho fixo na cache diminui aumentando a probabilidade de conflitos A Figura 818 representa a taxa de falhas versus o tamanho do bloco em número de bytes para caches de capacidade variável Para caches pequenas como a cache de 4KB aumentar o tamanho do bloco em cerca de 64 bytes aumenta a taxa de falhas devido aos conflitos Para caches grandes aumentar o tamanho do bloco em 64 bytes não muda a taxa de falhas No entanto grandes blocos podem ainda aumentar o tempo de execução devido às maiores penalidades de falhas o tempo requerido para buscar da memória principal o bloco de cache em falha Figura 818 Taxas de erro versus tamanho de bloco e tamanho de cache na benchmark SPEC92 Adaptada com a permissão de Hennessy e Patterson Computer Architecture A Quantitative Approach 5th ed Morgan Kaufmann 2012 Capítulo oito Memória e Sistemas de IO 694 Política de Escrita As seções anteriores tiveram seu foco nos carregamentos de memória Armazenamentos de memória ou escritas seguem um procedimento similar ao do carregamento Mediante um armazenamento na memória o processador verifica a cache Se a cache falha o bloco de cache é buscado da memória principal para a cache e então a palavra apropriada no bloco de cache é escrita Se a cache acerta a palavra é simplesmente escrita no bloco de cache As caches são classificadas como writetrough ou writeback Numa cache writetrough o dado escrito num bloco de cache é simultaneamente escrito na memória principal Numa cache writeback um dirty bit 𝐷 é associado a cada bloco de cache 𝐷 é 1 quando o bloco de cache foi escrito e 0 caso contrário Os dirty blocos de cache são escritos de volta na memória principal apenas quando são retirados da cache Um cache write trough não exige dirty bits mas usualmente requer mais escritas na memória principal do que uma cache write back As caches modernas são usualmente writeback pois o tempo de acesso à memória principal é muito grande Exemplo 812 WRITETROUGH VERSUS WRITEBACK Suponha uma cache que tenha um tamanho de bloco de quatro palavras Quantos acessos à memória são necessários pelo seguinte código utilizando cada uma das políticas de escrita writethrough e writeback sw t0 0x00 sw t0 OxC0 sw t0 0x80 sw t0 0x40 Solução Todas as quatro instruções de armazenamento escrevem no mesmo bloco de cache Com uma cache writethrough cada instrução de armazenamento escreve uma palavra na memória principal exigindo quatro escritas à memória principal Uma política writeback requer apenas um acesso à memória principal quando o dirty bloco da cache é esvaziado Capítulo oito Memória e Sistemas de IO 695 835 A Evolução das Caches MIPS A Tabela 83 traça a evolução das organizações de cache utilizadas pelos processadores MIPS de 1985 a 2010 As principais tendências são a introdução de cache de níveis múltiplos maior capacidade de cache e o aumento da associatividade Estas tendências são conduzidas pela crescente divergência entre frequências de CPU e velocidades de memórias principais e o preço decrescente dos transístores A crescente diferença entre as velocidades das CPU e as memórias principais necessitam de uma menor miss rate para evitar o bottleneck da memória principal e o preço decrescente dos transístores permite caches com tamanhos maiores Tabela 83 Evolução da cache MIPS 84 MEMÓRIA VIRTUAL A maioria dos sistemas computacionais modernos utiliza um disco rígido de armazenamento magnético ou de estado sólido como o nível mais baixo na arquitetura de memória vide Figura 84 Comparado com uma memória ideal grande rápida e barata o disco rígido é grande e barato porém terrivelmente lento Ele fornece uma capacidade muito maior do que a possível com uma memória de custo efetivo DRAM No entanto se uma fração significante do acesso à memória envolve o disco rígido seu desempenho é péssimo Você pode defrontarse com isso em um PC rodando muitos programas juntos Capítulo oito Memória e Sistemas de IO 696 A Figura 819 mostra um disco rígido para armazenamento magnético com a tampa superior removida Como o nome sugere o disco rígido contém um ou mais discos rígidos ou pratos cada um deles com uma cabeça de escritaleitura no fim de um braço triangular A cabeça se move para a localização correta no disco e escreve ou lê dados magneticamente com o disco abaixo dela A cabeça leva vários milissegundos para descobrir a localização correta no disco o que é rápido comparado à perspectiva humana mas milhões de vezes mais lento do que o processador O objetivo de adicionar um disco rígido à hierarquia de memória é o de com um baixo custo dar a ilusão de uma memória muito grande enquanto isso continuar a fornecer a velocidade da memória mais rápida para a maioria dos acessos Um computador com apenas 128 MB de DRAM por exemplo pode efetivamente fornecer 2 GB de memória utilizando o disco rígido Essa memória maior de 2 GB é chamada memória virtual e a memória principal menor de 128 MB é chamada memória física Utilizaremos o termo memória física para nos referirmos a memória principal ao longo dessa seção Figura 819 Disco Rígido Um computador com endereços de 32bits pode acessar um máximo de 232 bytes 4𝐺𝐵 de memória Esta é uma das motivações da mudança para os computadores de 64bits que podem acessar muito mais memória Capítulo oito Memória e Sistemas de IO 697 Os programas podem acessar dados em qualquer lugar da memória principal por isso devem utilizar endereços virtuais que especificam a localização na memória virtual A memória física mantém um subconjunto da memória virtual mais recentemente acessada Deste modo a memória física age como uma cache para a memória virtual Então a maioria dos acessos são feitos na memória física à velocidade da DRAM no entanto o programa desfruta da capacidade de uma memória virtual maior Os sistemas de memória virtual utilizam diferentes terminologias para os mesmos princípios de cache discutidos na Seção 83 A Tabela 84 resume os termos análogos A memória virtual é dividida em páginas virtuais tipicamente em tamanhos de 4 KB A memória física é dividida da mesma forma em páginas físicas de mesmo tamanho Uma página virtual pode estar localizada na memória física DRAM ou no disco rígido Por exemplo a Figura 820 mostra uma memória virtual que é maior do que a memória física Os retângulos indicam as páginas Algumas páginas virtuais estão presentes na memória física e algumas estão localizadas no disco rígido O processo de determinação do endereço físico a partir do endereço virtual é chamado tradução de endereços Se o processador tenta acessar um endereço virtual que não está na memória física uma falha de página ocorre e o sistema operacional carrega a página do disco rígido na memória física Tabela 84 Termos análogos para cache e memória virtual Para evitar falhas de página causadas por conflitos qualquer página virtual pode ser mapeada para qualquer página física Em outras palavras a memória física se comporta como uma cache totalmente associativa para a memória virtual Numa cache totalmente associativa convencional cada bloco de cache possui um comparador que verifica os bits de endereço mais significativos diante de uma tag para Capítulo oito Memória e Sistemas de IO 698 determinar se a solicitação acerta no bloco Num sistema análogo de memória virtual cada página física necessitaria de um comparador para verificar os bits de endereço mais significativos diante de uma tag para determinar se a página virtual mapeia para aquela página física Um sistema de memória virtual realista possui tantas páginas físicas que fornecer um comparador para cada uma delas seria excessivamente caro Ao invés disso o sistema de memória virtual utiliza uma tabela de páginas para realizar a tradução de endereços Uma tabela de páginas contém uma entrada para cada página virtual indicando a sua localização na memória física ou a que está no disco rígido Cada instrução de carregamento ou armazenamento requer um acesso à tabela de páginas seguido por um acesso à memória física O acesso à tabela de páginas traduz o endereço virtual utilizado pelo programa num endereço físico O endereço físico é então utilizado para realmente ler ou escrever dados Figura 820 Páginas virtuais e físicas A tabela de páginas é normalmente tão grande que está localizada na memória física Consequentemente cada carregamento ou armazenamento envolve dois acessos à memória física o acesso à tabela de páginas e o acesso ao dado Para aumentar a velocidade da tradução de endereços um dispositivo denominado Translation Lookaside Buffer TLB envia à cache as entradas mais utilizadas da tabela de páginas O restante desta seção mostra detalhes sobre a tradução de endereços tabelas de página e TLB Capítulo oito Memória e Sistemas de IO 699 841 Tradução de Endereços Num sistema com memória virtual os programas utilizam endereços virtuais de modo que eles possam acessar uma memória maior O computador deve traduzir estes endereços virtuais tanto para encontrar o endereço na memória física ou tomar uma falha de página e buscar o dado no disco rígido Lembrese que a memória virtual e a memória física são divididas em páginas Os bits mais significativos dos endereços físicos ou virtuais especificam o número de página virtual ou físico Os bits menos significativos especificam a palavra dentro da página e são chamados offset de página A Figura 821 ilustra a organização de página para um sistema de memória virtual com 2 GB de memória virtual e 128 MB de memória física dividida em páginas de 4 KB A MIPS acomoda endereços de 32bits Com uma memória virtual de 2𝐺𝐵 231bytes apenas os 31 bits menos significativos de endereço virtual são usados o bit 32 é sempre 0 Similarmente com uma memória física de 128 𝑀𝐵 227bytes de memória física apenas os 27 bits menos significativos de endereço físico são utilizados os 5 bits superiores são sempre 0 Figura 821 Páginas físicas e virtuais Capítulo oito Memória e Sistemas de IO 700 Devido ao tamanho da página ser de 4𝐾𝐵 212 bytes existem 231 212 219 páginas virtuais e 227 212 215 páginas físicas Então os números de páginas virtuais e físicas são 19 e 15 bits respectivamente A memória física pode apenas manter 116 das páginas virtuais num dado instante O resto das páginas virtuais é mantido no disco rígido A Figura 821 mostra o mapeamento da página virtual 5 para a página física 1 página virtual 0𝑥7𝐹𝐹𝐶 para página física 0𝑥7𝐹𝐹𝐸 e assim por diante Por exemplo o endereço virtual 0𝑥53𝐹8 um offset de 0𝑥3𝐹8 dentro da página virtual 5 mapeia para o endereço físico 0𝑥13𝐹8 um offset de 0𝑥3𝐹8 dentro da página física 1 Os 12 bits menos significativos dos endereços físicos e virtuais são os mesmos 0𝑥3𝐹8 e especificam o offset da página dentro das páginas virtuais e físicas Apenas o número de páginas precisa ser traduzido para se obter o endereço físico a partir do endereço virtual A Figura 822 ilustra a tradução de um endereço virtual para um endereço físico Os 12 bits menos significativos indicam o offset da página e não necessitam tradução Os 19 bits superiores do endereço virtual especificam o número de página virtual Virtual Page Number VPN e são traduzidos para um número de página física Physical Page Number PPN de 15 bits As próximas duas seções descrevem como as tabelas de páginas e os TLB são utilizados para realizar essa tradução de endereços Figura 822 Tradução do endereço virtual para endereço físico Capítulo oito Memória e Sistemas de IO 701 Exemplo 813 TRADUÇÃO DE ENDEREÇO FÍSICO PARA ENDEREÇO VIRTUAL Encontre o endereço físico do endereço virtual 0𝑥247𝐶 utilizando o sistema de memória virtual mostrado na Figura 821 Solução O offset de página de 12 bits 0𝑥47𝐶 não requer tradução Os 19 bits restantes do endereço virtual dão o número de página virtual então o endereço virtual 0𝑥247𝐶 é encontrado na página virtual 0𝑥2 Na Figura 821 a página virtual 0𝑥2 mapeia para a página física 0𝑥7𝐹𝐹𝐹 Então o endereço virtual 0𝑥247𝐶 mapeia para o endereço físico 0𝑥7𝐹𝐹𝐹47𝐶 Figura 823 Tabela de páginas para a Figura 821 Capítulo oito Memória e Sistemas de IO 702 842 A Tabela de Páginas O processador utiliza uma tabela de páginas para traduzir endereços virtuais em endereços físicos A tabela de páginas contém uma entrada para cada página virtual Essa entrada contém um número de página física e um bit válido Se o bit válido é 1 a página virtual mapeia para a página física especificada na entrada Caso contrário a página virtual é encontrada no disco rígido Devido à tabela de páginas ser muito grande ela é armazenada na memória física Vamos assumir por agora que ela é armazenada como um array contíguo como mostrado na Figura 823 Esta tabela de páginas contém o mapeamento do sistema de memória da Figura 821 A tabela de páginas é indexada com o número de página virtual VPN Por exemplo a entrada 5 especifica que a página virtual 5 mapeia para a página física 1 A entrada 6 é inválida 𝑉 0 então a página virtual 6 é localizada no disco rígido Exemplo 814 UTILIZANDO A TABELA DE PÁGINAS PARA REALIZAR TRADUÇÃO DE ENDEREÇOS Encontre o endereço físico do endereço virtual 0𝑥247𝐶 utilizando a tabela de páginas mostrada na Figura 823 Solução A Figura 824 mostra a tradução de endereço virtual para endereço físico para o endereço virtual 0𝑥247𝐶 O offset de página de 12 bits não requer tradução Os 19 bits remanescentes do endereço virtual são o número de página virtual 0𝑥2 e dão o index na tabela de páginas A tabela de páginas mapeia a página virtual 0𝑥2 para a página física 0𝑥7𝐹𝐹𝐹 Então o endereço virtual 0𝑥247𝐶 mapeia para o endereço físico 0𝑥7𝐹𝐹𝐹47𝐶 Os 12 bits menos significativos são os mesmos em ambos os endereços físico e virtual A tabela de páginas pode ser armazenada em qualquer lugar na memória física a critério do sistema operacional O processador tipicamente utiliza um registrador dedicado denominado registrador da tabela de páginas para armazenar o endereço base da tabela de páginas na memória física Capítulo oito Memória e Sistemas de IO 703 Para realizar um carregamento ou armazenamento o processador deve primeiramente traduzir o endereço virtual em endereço físico e então acessar o dado no endereço físico O processador extrai o número de página virtual do endereço virtual e o adiciona ao registrador da tabela de páginas a fim de encontrar o endereço físico na entrada da tabela de páginas O processador então lê essa entrada da tabela de páginas na memória física para obter o número de página físico com o offset de página para criar o endereço físico Finalmente ele lê ou escreve o dado no endereço físico Devido à tabela de páginas ser armazenada na memória física cada carregamento ou armazenamento envolve dois acessos físicos à memória Figura 824 Tradução de endereço utilizando a tabela de páginas Capítulo oito Memória e Sistemas de IO 704 843 O TLB Translation Lookaside Buffer A memória virtual teria um sério impacto no desempenho caso fosse necessária uma leitura da tabela de página em todos os carregamentos ou armazenamentos dobrando o atraso dos carregamentos e armazenamentos Felizmente o acesso à tabela de páginas possui uma grande localização temporal A localização temporal e espacial dos acessos aos dados e o grande tamanho da página significam que muitos carregamentos ou armazenamentos consecutivos são provavelmente referências à mesma página Portanto se o processador lembra a última entrada da tabela de páginas que foi lida ele provavelmente pode reutilizar esta tradução sem realizar a releitura da tabela de páginas Em geral o processador pode manter as últimas entradas da tabela de várias páginas numa pequena cache denominada translation lookaside buffer TLB O processador olha de lado para encontrar a tradução no TLB antes de ter que acessar a tabela de páginas na memória física Em programas reais a grande maioria dos acessos acertam no TLB evitando o consumo de tempo da tabela de páginas lendo na memória física Um TLB é organizado como uma cache totalmente associativa e tipicamente suporta de 16 a 512 entradas Cada entrada do TLB mantém uma página virtual e seu correspondente número de página físico Se o TLB acerta ele retorna o correspondente número de página Caso contrário o processador deve ler a tabela de páginas na memória física O TLB é projetado para ser pequeno o suficiente para que possa ser acessado em menos de um ciclo Mesmo assim o TLB tipicamente possui uma hit rate superior a 99 O TLB diminui o número de acessos requeridos à memória de dois para um para a maioria das instruções de carregamento e armazenamento Exemplo 815 UTILIZANDO O TLB PARA REALIZAR TRADUÇÃO DE ENDEREÇO Considere o sistema de memória virtual da Figura 821 Utilize um TLB de duas entradas ou explique por que é necessário o acesso à tabela de páginas para traduzir os endereços virtuais 0𝑥247𝐶 e 0𝑥5𝐹𝐵0 para endereços físicos Suponha que o TLB atualmente suporta traduções válidas das páginas virtuais 0𝑥2 e 0𝑥7𝐹𝐹𝐹𝐷 Capítulo oito Memória e Sistemas de IO 705 Solução A Figura 825 mostra o TLB de duas entradas com a solicitação para o endereço virtual 0𝑥247𝐶 O TLB recebe o número de página virtual de cada entrada A entrada 0 coincide e é válida então a solicitação acerta O endereço físico traduzido é o número físico de página da entrada coincidente 0𝑥7𝐹𝐹𝐹 concatenado com o offset da página do endereço virtual Como sempre o offset da página não requer tradução A solicitação para o endereço virtual 0𝑥5𝐹𝐵0 falha no TLB Então a solicitação é encaminhada para a tabela de páginas para a tradução Figura 825 Tradução de endereços utilizando um TLB de duas entradas Capítulo oito Memória e Sistemas de IO 706 844 Proteção de Memória Até agora esta seção teve o seu foco no uso da memória virtual para fornecer uma memória grande rápida e barata Uma razão igualmente importante para o uso da memória virtual é fornecer proteção entre programas rodando simultaneamente Como o leitor provavelmente deve saber os computadores modernos tipicamente rodam muitos programas ou processos ao mesmo tempo Todos esses programas estão simultaneamente presentes na memória física Num sistema computacional bem projetado os programas devem ser protegidos uns dos outros para que nenhum programa possa quebrar outro programa Especificamente nenhum programa deve ter a capacidade de acessar a memória de outro programa sem permissão Isso é chamado de proteção de memória Os sistemas de memória virtual fornecem proteção de memória dando para cada programa o seu próprio espaço de endereço virtual Cada programa pode utilizar tanta memória quando quiser em seu espaço de endereço virtual mas apenas uma porção do espaço de endereço virtual está na memória física num dado instante de tempo Cada programa pode utilizar todo o seu espaço de endereço virtual sem se preocupar com onde outros programas estão fisicamente localizados No entanto um programa pode acessar apenas aquelas páginas físicas que estão mapeadas na sua tabela de páginas Deste modo um programa não pode acidentalmente ou maliciosamente acessar as páginas físicas de outro programa pois eles não estão mapeados em suas tabelas de páginas Em alguns casos múltiplos programas podem acessar instruções comuns ou dados O sistema operacional adiciona bits de controle para cada entrada da tabela de páginas para determinar quais os programas se existir algum que podem escrever nas páginas físicas compartilhadas 845 Política de Substituição Os sistemas de memória virtual utilizam a política de substituição writeback e menos recentemente utilizada LRU Uma política writethrough onde cada escrita na memória física inicia uma escrita no disco rígido poderia ser impraticável Instruções de armazenamento operariam na velocidade do disco rígido ao invés da velocidade do processador milissegundos ao invés de nanossegundos Sob a política write back a página física é escrita de volta no disco rígido apenas quando ela é esvaziada da memória física Escrevendo a página física de volta no disco rígido e o recarregando com uma página virtual diferente é Capítulo oito Memória e Sistemas de IO 707 denominado paginação e o disco rígido num sistema de memória virtual é algumas vezes chamado de espaço de troca swap space O processador põe fora uma das páginas menos recentemente usadas quando uma falta de página ocorre então substitui aquela página com a página virtual que faltava Para auxiliar essas políticas de substituição cada entrada da tabela de páginas contém dois bits de status adicionais um dirty bit D e um use bit U O dirty bit é 1 se qualquer instrução de armazenamento tiver modificado a página física desde que ela foi lida do disco rígido Quando uma página física é posta fora ela precisa ser escrita novamente no disco rígido apenas se o dirty bit é 1 caso contrário o disco rígido mantém uma cópia exata da página O use bit é 1 se a página física foi acessada recentemente Assim como num sistema de cache a substituição exata do LRU se tornaria impraticavelmente complicada Ao invés disso o sistema operacional aproxima a substituição do LRU limpando periodicamente todos os use bits na tabela de páginas Quando uma página é acessada seu use bit é colocado a 1 Na ocorrência de uma falha de página o sistema operacional encontra a página com 𝑈 0 para pôr fora da memória física Então não é necessário substituir a página menos recentemente utilizada apenas uma das páginas recentemente utilizadas 846 Tabelas de Páginas Multiníveis As tabelas de páginas podem ocupar uma grande quantidade de memória física Por exemplo a tabela de página das seções anteriores para uma memória virtual de 2 𝐺𝐵 com páginas de 4 𝐾𝐵 precisaria de 219 entradas Se cada entrada tem 4 bytes a tabela de páginas tem 219𝑥 22𝑏𝑦𝑡𝑒𝑠 221𝑏𝑦𝑡𝑒𝑠 2𝑀𝐵 Para conservar a memória física as tabelas de página podem ser quebradas em múltiplos normalmente dois níveis A tabela de página do primeiro nível é sempre mantida na memória física Ela indica onde a pequena tabela de páginas de segundo nível está armazenada na memória virtual As tabelas de páginas do segundo nível contêm as traduções atuais para uma faixa de páginas virtuais Se uma faixa particular da tradução não é ativamente usada a correspondente tabela de páginas de segundo nível pode ser retirada para o disco rígido evitando o desperdício de memória física Numa tabela de páginas de dois níveis o número virtual de páginas é dividido em duas partes o número da tabela de páginas e o offset da tabela de páginas como mostrado na Figura 826 O número da tabela de página indexa a tabela de páginas de primeiro nível a qual deve residir na memória física A entrada da tabela de páginas de primeiro nível dá o endereço base da tabela de páginas de segundo nível ou indica que ela deve ser buscada Capítulo oito Memória e Sistemas de IO 708 no disco rígido quando 𝑉 0 O offset da tabela de páginas indexa a tabela de página de segundo nível Os 12 bits remanescentes do endereço virtual são o offset de página como antes para um tamanho de página de 212 4𝐾𝐵 Figura 826 Tabelas de páginas hierárquicas Na Figura 826 o número de página virtual de 19 bits é quebrado em 9 e 10 bits para indicar o número da tabela de página e o offset da tabela de página respectivamente Então a tabela de página de primeiro nível tem 210 1𝑘 entradas Se cada uma das entradas das tabelas de página de primeiro e segundo níveis possuem 32 bits 4bytes e apenas duas tabelas de página estão presentes de uma vez na memória a tabela de páginas hierárquica utiliza apenas 512𝑥4 𝑏𝑦𝑡𝑒𝑠 2 𝑥 1𝑘 𝑥 4 𝑏𝑦𝑡𝑒𝑠 10 𝑘𝐵 de memória física A tabela de página de dois níveis requer uma fração da memória física necessária para armazenar toda a tabela de página 2MB A desvantagem de uma tabela de páginas de dois níveis é a de que ela adiciona ainda mais um acesso à memória para a tradução quando há falha no TLB Capítulo oito Memória e Sistemas de IO 709 Exemplo 816 UTILIZANDO UMA TABELA DE PÁGINA MULTINÍVEL PARA TRADUÇÃO DE ENDEREÇO A Figura 827 mostra o conteúdo possível de uma tabela de páginas de dois níveis da Figura 826 O conteúdo de apenas uma tabela de páginas de segundo nível é mostrado Utilizando essa tabela de páginas de dois níveis descreva o que acontece com um acesso ao endereço virtual 0𝑥003𝐹𝐸𝐹𝐵0 Solução Como sempre apenas o número virtual de página requer tradução Os nove bits mais significativos do endereço virtual 0𝑥0 dão o número da tabela de página o index da tabela de páginas de primeiro nível A tabela de página de primeiro nível na entrada 0𝑥0 indica que a tabela de página de segundo nível reside na memória 𝑉 1 e seu endereço físico é 0𝑥2375000 Os próximos dez bits do endereço virtual 0𝑥3𝐹𝐸 são o offset da tabela de páginas os quais dão o index para a tabela de páginas do segundo nível A entrada 0 está abaixo na tabela de página de segundo nível e a entrada 0𝑥3𝐹𝐹 está acima A entrada 0𝑥3𝐹𝐸 na tabela de página de segundo nível indica que a página virtual reside na memória física 𝑉 1 e que o número físico de página é 0𝑥23𝐹1 O número físico de página está concatenado com o offset de página para formar o endereço físico 0𝑥23𝐹1𝐹𝐵0 Os Sistemas Embarcados são computadores de propósitos especiais que controlam algum dispositivo físico Eles tipicamente consistem de um microcontrolador ou DSP conectados a um ou mais dispositivos de IO Por exemplo um forno microondas pode ter um microcontrolador para ler os botões configurar o relógio e ligar o magnetron nos tempos apropriados Eles contrastam com sistemas embarcados com computadores de propósito geral como PC que rodam múltiplos programas e tipicamente interagem mais com os usuários do que com um dispositivo físico Sistemas como smartphones estão sobre a linha entre sistemas embarcados e computadores de propósito geral Capítulo oito Memória e Sistemas de IO 710 Figura 827 Tradução de endereços utilizando uma tabela de páginas de dois níveis 85 INTRODUÇÃO AO IO Os Sistemas de EntradaSaída InputOutput IO são utilizados para conectar um computador com dispositivos externos chamados periféricos Num computador pessoal os dispositivos tipicamente incluem teclados monitores impressoras e redes wireless Em sistemas embarcados dispositivos podem incluir o elemento de aquecimento de uma torradeira um sintetizador de voz de uma boneca a injeção de Capítulo oito Memória e Sistemas de IO 711 combustível de um motor o motor de posicionamento do painel solar de um satélite e assim por diante Um processador acessa um dispositivo IO utilizando os barramentos de dados e de endereços da mesma forma que ele acessa a memória Figura 828 Hardware suporte para IO mapeada em memória Uma porção do espaço de endereços é dedicada aos dispositivos IO ao invés de memória Por exemplo suponha que os endereços na faixa de 0𝑥𝐹𝐹𝐹𝐹0000 a 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹 são utilizados para IO Lembrese da Seção 661 que esses endereços estão numa porção reservada do mapa de memória A cada dispositivo IO é atribuído um ou mais endereços de memória nessa faixa Um armazenamento para o endereço especificado envia dados para o dispositivo Um carregamento recebe dados do dispositivo Este método de comunicação com dispositivos IO é chamado IO mapeada em memória Num sistema com IO mapeada na memória um carregamento ou armazenamento pode acessar a memória ou um dispositivo IO Figura 828 mostra o hardware necessário para manter dois dispositivos IO Algumas arquiteturas notavelmente a x86 utiliza instruções especializadas ao invés de uma IO mapeada em memória para se comunicar com outros dispositivos IO Essas instruções são da seguinte forma onde device1 e device2 são a única ID para o dispositivo periférico lwio t0 device1 swio t0 device2 Esse tipo de comunicação entre dispositivos IO é chamada IO programada Capítulo oito Memória e Sistemas de IO 712 mapeados na memória Um decodificador de endereços determina qual o dispositivo que comunica com o processador Ele utiliza os sinais Adress e MemWrite para gerar os sinais de controle para o restante hardware O multiplexador ReadData seleciona entre a memória e os vários dispositivos IO Os registradores ativados para escrita mantém os valores escritos nos dispositivos IO Exemplo 817 COMUNICAÇÃO COM DISPOSITIVOS IO Suponha que ao dispositivo IO 1 da Figura 828 é atribuído o endereço de memória 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹𝐹4 Mostre o código assembly MIPS para a escrita do valor 7 no Dipositivo IO 1 e para ler o valor de saída do Dipositivo IO 1 Solução O seguinte código assembly MIPS escreve o valor 7 no dispositivo de IO 1 addi t0 0 7 sw t0 0xFFF40 FFF4 is signextended to 0xFFFFFFF4 o decodificador de endereços declara WE1 pois o endereço é 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹𝐹4 e MemWrite é TRUE O valor no barramento WriteData 7 é escrito no registrador conectado aos pinos de entrada do dispositivo IO 1 Para ler do do dispositivo IO 1 o processador realiza o seguinte código assembly MIPS lw t1 0xFFF40 O decodificador de endereços coloca 𝑅𝐷𝑠𝑒𝑙10 para 012 pois ele detecta o endereço 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹𝐹4 e MemWrite é FALSE A saída do Dispositivo IO 1 passa através do multiplexador para o barramento ReadData e é carregada em t1 no processador Um software que comunica com um dispositivo IO é chamado driver de dispositivo O leitor provavelmente já fez o download ou instalou drivers de dispositivos para a sua impressora ou outro dispositivo IO Escrever um driver de dispositivo requer conhecimento detalhado sobre o hardware do dispositivo IO Outros programas chamam funções no driver do dispositivo para acessar o dispositivo sem ter que entender seu hardware de baixo nível Capítulo oito Memória e Sistemas de IO 713 Os endereços associados aos dispositivos IO são frequentemente chamados registradores IO pois eles podem corresponderse com registradores físicos no dispositivo IO como aquele mostrado na Figura 828 As próximas seções deste Capítulo fornecem exemplos concretos de dispositivos IO A Seção 86 examina o IO no contexto dos sistemas embarcados mostrando como utilizar um microcontrolador baseado em MIPS para controlar muitos dispositivos físicos A Seção 87 avalia a maioria dos sistemas de IO utilizados em PC 86 SISTEMAS DE IO EMBARCADOS OS sistemas embarcados utilizam um processador para controlar interações com o ambiente físico Eles são construídos em torno de unidades microcontroladoras MCUs que combinam um microcprocessador com um conjunto de periféricos easytouse tais como os pinos de IO analógicos e digitais de propósito geral portas seriais temporizadores etc Os microcontroladores são geralmente baratos e são projetados para minimizar o custo e o tamanho do sistema através da integração da maioria dos componentes necessários num único chip A maioria são menores e mais leves do que uma moeda de dez centavos consomem miliwatts de potência e custam de centavos a muitos dólares Os microcontroladores de 8bits são os mais pequenos e baratos enquanto os microcontroladores de 32bits oferecem mais memória e desempenho superior Por uma questão de concretude esta seção irá ilustrar os sistemas IO embarcados no contexto de um microcontrolador comercial Especificamente nós iremos focar no 𝑃𝐼𝐶32𝑀𝑋675𝐹512𝐻 um membro da serie 𝑃𝐼𝐶32 da Microchip baseada em microprocessadores MIPS de 32bits A família 𝑃𝐼𝐶32 também possui uma grande variedade de periféricos onchip e memória de modo que o sistema completo pode ser construído com poucos componentes externos Selecionamos essa família pois é barata possui um ambiente de desenvolvimento fácil de se utilizar é baseada na arquitetura MIPS estudada nesse livro e porque a Microchip é uma das líderes de vendas em microcontroladores que vende mais de um bilhão de Capítulo oito Memória e Sistemas de IO 714 chips ao ano Os sistemas de IO microcontrolados são bem similares entre um ou outro fabricante logo os princípios ilustrados para o 𝑃𝐼𝐶32 podem facilmente ser adaptados para outros microcontroladores O restante desta seção irá ilustrar como os microcontroladores realizam o IO digitais analógicas e seriais de propósito geral Os temporizadores timers também são comumente utilizados para gerar ou medir intervalos de tempo precisos A seção é concluída com outros periféricos interessantes como displays motores e links wireless 861 O Microcontrolador PIC32MX675F512H Figura 829 Mapa de memória do PIC32 2012 Microchip Technology Reimpresso com permissão Capítulo oito Memória e Sistemas de IO 715 A Figura 829 mostra um diagrama de blocos para um microcontrolador da série 𝑃𝐼𝐶32 No coração do sistema há um processador MIPS de 32bits O processador é conectado via barramento de 32bits à memória Flash contendo o programa e à SRAM contendo os dados O 𝑃𝐼𝐶32𝑀𝑋675𝐹512𝐻 possui 512𝑘𝐵 de FLASH e 64𝑘𝐵 de RAM outros modelos com 16 a 512𝑘𝐵 de FLASH e 4 a 128𝑘𝐵 de RAM estão disponíveis em vários preços Periféricos de alto desempenho como USB e Ethernet também se comunicam diretamente com a RAM através de um barramento matricial Os periféricos de menor desempenho incluindo portas seriais temporizadores e conversores AD compartilham um barramento de periféricos separado O chip também contém circuitos de geração de temporização para produzir os clocks e circuitos sensitivos de tensão para detectar quando o chip é alimentado ou quando está prestes a perder a potência Figura 830 Diagrama de blocos do PI32MX675512H 2012 Microchip Technology Reimpresso com permissão Aproximadamente 16 bilhões em microcontroladores foram vendidos em 2011 e o mercado continua a crescer cerca de 10 ao ano Os microcontroladores vêmse tornando onipresentes e quase invisíveis com um número de cerca de 150 em cada casa e 50 em cada automóvel em 2010 O clássico 8051 é um microcontrolador de 8bits originalmente desenvolvido pela Intel em 1980 e agora vendido por um grupo de fabricantes As series PIC16 e PIC18 da Microchip são líderes no mercado de 8bits A série Atmel AVR temse popularizando entre os amadores como sendo o cérebro da plataforma Arduino Entre os microcontroladores de 32bits a Renesas lidera todo o mercado enquanto a ARM é uma jogadora principal em sistemas móveis incluindo o iPhone Freescale Samsung Texas Instruments e Infineon são outros dos principais fabricantes de microcontroladores Capítulo oito Memória e Sistemas de IO 716 Figura 831 Pinout do PIC32MX6xxFxxH Os pinos pretos são tolerantes a 5V 2012 Microchip Technology Reimpresso com permissão Capítulo oito Memória e Sistemas de IO 717 A Figura 830 mostra o mapa virtual de memória do microcontrolador Todos os endereços utilizados pelo programador são virtuais A arquitetura MIPS oferece um espaço de endereços de 32bits para acessar 232 bytes 4 GB de memória mas apenas uma pequena fração dessa memória é verdadeiramente implementada no chip As seções relevantes na faixa 0𝑥𝐴0000000 0𝑥𝐵𝐹𝐶02𝐹𝐹𝐹 incluem a RAM a Flash e os registradores de funções especiais utilizados para fazer a comunicação com periféricos Note que existe um adicional de 12𝑘𝐵 de Boot Flash que tipicamente realiza alguma inicialização e salta de seguida para o programa principal na memória Flash No reset o contador de programa é inicializado para o começo do Boot Flash no endereço 0𝑥𝐵𝐹𝐶00000 A Figura 831 mostra pinout do microcontrolador Os pinos incluem alimentação terra clock reset e muitos pinos de IO que podem ser utilizados para propósitos gerais eou para periféricos de propósitos especiais A Figura 832 mostra uma fotografia de um microcontrolador num encapsulamento TQFP Twin Quad Flat Pack de 64 pinos com pinos ao redor dos quatro lados espaçados de intervalos de 20 mils 002 polegadas O microcontrolador também está disponível em um encapsulamento de 100 pinos com mais pinos de IO esta versão possui um número de componente terminando com um L ao invés de um H A Figura 833 mostra o microcontrolador conectado numa configuração operacional mínima com uma fonte de alimentação um clock externo uma chave de reset e um jack para um cabo de programação O 𝑃𝐼𝐶32 e os circuitos externos são montados numa placa de circuito impresso Esta placa pode ser um produto real um controlador de torradeira por exemplo ou uma placa de desenvolvimento facilitando o acesso ao chip durante os testes O regulador 𝐿𝑇𝐶1117 33 aceita uma entrada de 45 12 𝑉 por exemplo de um transformador bateria ou circuito de alimentação externo e a diminui para uma tensão contínua de 33 𝑉 requerida nos pinos de alimentação O 𝑃𝐼𝐶32 possui múltiplos pinos VDD e GND para reduzir o ruído causado pela fonte de alimentação oferecendo um caminho de baixa impedância Uma variedade de capacitores de bypass fornece uma reserva de carga para manter a fonte de alimentação estável num evento de mudanças abruptas na demanda de corrente Um capacitor de bypass também conecta o pino VCORE que serve como um regulador de tensão interno de 18 𝑉 O 𝑃𝐼𝐶32 tipicamente drena 1 2 𝑚𝐴𝑀𝐻𝑧 de corrente da fonte de alimentação Por exemplo a 80 𝑀𝐻𝑧 a dissipação máxima de potência é 𝑃 𝑉𝐼 33𝑉120𝑚𝐴 0396 𝑊 O Figura 832 PIC32 em encapsulamento TQFP de 64 pinos Capítulo oito Memória e Sistemas de IO 718 encapsulamento TQFP de 64 pinos possui uma resistência térmica de 47𝐶𝑊 então o chip pode aquecer cerca de 19𝐶 se operado sem um dissipador de calor ou cooler Figura 833 Esquemático básico de operação do PIC32 Um oscilador externo trabalhando a mais de 50 𝑀𝐻𝑧 pode ser conectado ao pino de clock Nesse circuito de exemplo o oscilador está trabalhando a 40000 𝑀𝐻𝑧 Alternativamente o microcontrolador pode ser programado para utilizar um oscilador interno trabalhando a 800 𝑀𝐻𝑧 2 Isso é muito menos preciso em frequência mas pode ser suficiente O clock do barramento de periféricos PBCLK para os dispositivos IO portas seriais conversores AD timers tipicamente rodam a uma fração metade da velocidade do O clock do barramento periférico pode ser configurado para operar à mesma velocidade que o clock do sistema principal ou a metade ou a um quarto ou oitavo da velocidade Os primeiros microcontroladores PIC32 eram limitados a metade da velocidade no máximo pois alguns periféricos eram muito lentos mas a maioria dos produtos atuais podem trabalhar em plena velocidade Se o leitor modificar a velocidade do PBCLK irá precisar ajustar partes do código de amostra nessa seção tal como o número de ticks de PBCLK para medir uma certa quantidade de tempo Capítulo oito Memória e Sistemas de IO 719 sistema de clock principal Esse esquema de clock pode ser determinado pelos bits de configuração no software de desenvolvimento MPLAB ou pela colocação das seguintes linhas de código no início do seu programa em C pragma config FPBDIV DIV2 peripherals operate at half sysckfreq 20 MHz pragma config POSCMOD EC configure primary oscillator in external clock mode pragma config FNOSC PRI select the primary oscillator É sempre conveniente fornecer um botão de reset para que seja possível colocar o chip em um estado inicial de operação conhecido O circuito de reset consiste numa chave do tipo pushbutton e um resistor conectado ao pino de reset 𝑀𝐶𝐿𝑅 O pino de reset é ativo a baixo indicando que o processador reinicia quando o pino está em 0 Quando o botão não está pressionado a chave está aberta e o resistor leva o pino para 1 permitindo a operação normal Quando o botão é pressionado a chave fecha e leva o pino de reset para 0 forçando o processador a reiniciar O 𝑃𝐼𝐶32 também se reinicia automaticamente quando a alimentação é ligada O modo mais fácil de programar o microcontrolador é com o InCircuit Debugger ICD 3 da Microchip O 𝐼𝐶𝐷3 mostrado na Figura 834 permite ao programador comunicarse com o 𝑃𝐼𝐶32 a partir de um 𝑃𝐶 para fazer o download do código e o debug do programa O 𝐼𝐶𝐷3 é conectado por uma porta USB no PC e por um conector modular 𝑅𝐽 11 de seis pinos na placa de desenvolvimento do 𝑃𝐼𝐶32 O conector 𝑅𝐽11 é o conhecido conector utilizado em jacks de telefone O 𝐼𝐶𝐷3 se comunica com o 𝑃𝐼𝐶32 através de uma interface serial de programação In Circuit de dois fios ICSP com um clock e um pino de dados bidirecionais O leitor pode utilizar o Ambiente Integrado de Desenvolvimento IDE Integrated Development Environment grátis da Microchip o MPLAB para escrever os seus programas em linguagem assembly ou C simulálos fazer o download e testálos numa placa de desenvolvimento através do ICD A maioria dos pinos do microcontrolador 𝑃𝐼𝐶32 são por padrão pinos de IO digitais para propósitos gerais Devido ao chip possuir um número limitado de pinos esses mesmos pinos são compartilhados para funções de IO de propósitos especiais tais como portas seriais entradas de conversores analógicodigital etc que são ativados quando o correspondente periférico é ativado É responsabilidade do programador Figura 834 Microchip ICD3 Figura 835 LED e chaves conectados ao porto D GPIO de 12 bits Capítulo oito Memória e Sistemas de IO 720 utilizar cada pino para apenas um propósito a um dado intervalo de tempo O restante da Seção 86 explora em detalhes as funções IO do microcontrolador As capacidades dos microcontroladores vão além do que pode ser discutido no espaço limitado desse Capítulo Veja o datasheet dos fabricantes para mais detalhes Em particular os Family Data Sheet 𝑃𝐼𝐶32𝑀𝑋5𝑋𝑋6𝑋𝑋7𝑋𝑋 e os 𝑃𝐼𝐶32 Family Reference Manual da Microchip são autorizados e razoavelmente legíveis 862 Pinos IO Digitais de Propósito Geral Os pinos IO de Propósito Geral GPIO são utilizados para ler ou escrever sinais digitais Por exemplo a Figura 835 mostra oito diodos emissores de luz LED e quatro chaves conectadas a uma porta GPIO de 12 bits O esquemático indica o nome e o número do pino de cada um dos 12 pinos de portas Isso diz ao programador a função de cada pino e ao projetista de hardware quais as conexões que devem ser feitas fisicamente Os LED são conectados para acenderem quando receberem um nível 1 e apagarem quando receberem um nível 0 As chaves produzem 1 quando estão fechadas e 0 quando estão abertas O microcontrolador pode utilizar a porta tanto para mudar o estado do LED quanto para ler o estado das chaves O 𝑃𝐼𝐶32 organiza grupos de GPIOs em portos que são escritos juntos O nosso 𝑃𝐼𝐶32 denomina essas portas RA RB RC RD RE RF E RG Elas são referidas como porto A porto B etc Cada porto pode ter até 16 pinos GPIO apesar de o 𝑃𝐼𝐶32 não possuir pinos suficientes para disponibilizar muitos sinais para todos esses portos Cada porta é controlada por dois registradores TRISx e PORTx onde x é uma letra de A a G indicando o porto de interesse Os registradores TRISx determinam se o pino do porto é uma entrada ou uma saída enquanto os registradores PORTx indicam o valor lido de uma entrada ou dirigido a uma saída Os 16 bits menos significativos de cada registrador correspondem aos dezesseis pinos do porto GPIO Quando um dado bit do registrador TRISX é 0 o pino é uma saída e quando é 1 o pino é uma entrada É prudente deixar pinos não utilizados como entradas seus estados padrão de modo que eles não possam inadvertidamente serem levados a valores indesejados No contexto da manipulação de bits ativar significa escrever 1 e limpar significa escrever 0 Capítulo oito Memória e Sistemas de IO 721 Cada registrador é mapeado na memória para uma palavra no espaço de Registradores de Funções Especiais na memória virtual 0𝑥𝐵𝐹800000 𝐵𝐹8𝐹𝐹𝐹𝐹𝐹 Por exemplo O TRISD é endereçado em 0𝑥𝐵𝐹8860𝐶0 e PORTD está endereçado em 0𝑥𝐵𝐹8860𝐷0 O arquivo de cabeçalho ou header p32xxxxh declara esses registradores como sendo números inteiros sem sinal unsigned de 32bits Consequentemente o programador pode acessalos pelo nome ao invés de ter que procurar pelos endereços Exemplo 818 GPIO PARA CHAVES E LED Escreva um programa em C para ler a quatro chaves e ligar os correspondentes quatro LED utilizando o hardware da Figura 835 Solução Configure o TRISD de modo que os pinos RD7 0 sejam saídas e RD11 8 sejam entradas Então leia as chaves examinando os pinos RD11 8 e escreva os valores de volta em RD3 0 para ligar os LED apropriados include p32xxxxh int mainvoid int switches TRISD 0xFF00 set RD70 to output RD118 to input while 1 switches PORTD 8 0xF Read and mask switches from RD118 PORTD switches display on the LED O Exemplo 818 escreve a entrada inteira de uma vez só É possível também acessar bits individuais Por exemplo o seguinte código copia o valor da primeira chave para o primeiro LED PORTDbitsRD0 PORTDbitsRD8 Capítulo oito Memória e Sistemas de IO 722 Cada porto também possui registradores correspondentes SET e CLR que podem ser escritos com uma máscara indicando quais bits ativas ou limpar Por exemplo PORTDSET 0b0101 PORTDCLR 0b1000 Ativa o primeiro e terceiro bits de PORTD e limpa o quarto bit Se os quatro bits inferiores de PORTD fossem 1110 eles se tornariam 0111 O número de pinos GPIO disponíveis depende do tamanho do encapsulamento A Tabela 85 resume quais pinos estão disponíveis em vários encapsulamentos Por exemplo um TQFP de 100 pinos fornece RA15 14 RA10 9 e RA7 0 para o porto A Atentese para o fato de que RG3 2 é apenas para entrada Da mesma forma RB15 0 são compartilhados como pinos de entrada analógica e os outros pinos também possuem múltiplas funções Os níveis lógicos são compatíveis com LVCMOS Os pinos de entrada esperam níveis lógicos de 𝑉𝐼𝐿 015 𝑉𝐷𝐷e 𝑉𝐼𝐻 08 𝑉𝐷𝐷 ou 05 𝑉 e 26𝑉 assumindo 𝑉𝐷𝐷 33𝑉 Pinos de saída produzem 𝑉𝑂𝐿 de 04 𝑉 e 𝑉𝑂𝐻 de 24 𝑉 enquanto a corrente de saída 𝐼𝑜𝑢𝑡 não pode exceder uns míseros 7𝑚𝐴 Tabela 85 Pinos GPIO do PI32MX5xx6xx7xx Capítulo oito Memória e Sistemas de IO 723 863 IO Serial Se um microcontrolador precisa mandar mais bits do que o número de pinos livres de GPIO ele deve quebrar a mensagem em múltiplas transmissões menores Em cada passo ele pode enviar um bit ou muitos bits A primeira forma é chamada IO serial e a segunda é chamada IO paralela A IO serial é popular pois utiliza poucas conexões e é rápida o suficiente para muitas aplicações De fato ela é tão popular que múltiplos padrões para IO serial têm sido estabelecidos e o 𝑃𝐼𝐶32 têm hardware dedicado para facilmente enviar dados por esses padrões Esta seção descreve os protocolos padrão Serial Peripheral Interface SPI e Universal Asynchronous ReceiverTransmitter UART Outros padrões seriais comuns incluem a InterIntegrated Circuit I2C Universal Serial Bus USB e Ethernet A I2C é uma interface de dois fios com um clock e um pino de dados bidirecional É utilizada de um modo similar à SPI O USB e a Ethernet são padrões mais complexos de alta performance e são descritos nas Seções 871 e 874respectivamente Serial Peripheral Interface SPI A interface SPI é um simples protocolo serial síncrono fácil de usar e relativamente rápido A interface física consiste de três pinos Serial Clock SCK Serial Data Out SDO e Serial Data In SDI A SPI conecta um dispositivo mestre a um dispositivo escravo como mostrado na Figura 836 a O mestre produz o clock Ele inicia a comunicação iniciando uma série de pulsos de clock em SCK Se ele quer enviar dados ao escravo ele coloca o dado em SDO começando pelo bit mais significativo O escravo pode simultaneamente responder colocando um dado no SDI do mestre A Figura 836 b mostra as formas de onda da SPI para a transmissão de um dado de 8bits Capítulo oito Memória e Sistemas de IO 724 Tabela 86 Campos do registrador SPIxCON As taxas de transmissão dão a taxa de sinalização medida em símbolos por segundo enquanto a taxa de bits dá a taxa de dados medida em bits por segundo A sinalização discutida nesse texto é a sinalização de 2 níveis onde cada símbolo representa um bit No entanto a sinalização multi nível pode enviar múltiplos bits por símbolo por exemplo a sinalização de 4 níveis envia dois bits por símbolo Nesse caso a taxa de bits é o dobro da taxa de transmissão Num sistema simples onde cada símbolo é um bit e cada símbolo representa dados a taxa de dados é igual à taxa de bits Algumas convenções de sinalização requerem bits sobrepostos junto aos dados Por exemplo um sistema de sinalização de dois níveis que usa dois bits sobrepostos para cada 8 bits de dados com uma taxa de 9600 baud possui uma taxa de bits de 9600 símbolossegundox8 bits10 símbolos7680 bitssegundo Capítulo oito Memória e Sistemas de IO 725 Figura 836 Conexão SPI e formas de onda do mestre O 𝑃𝐼𝐶32 possui até quatro portas SPI nomeadas sem surpresa 𝑆𝑃𝐼1 𝑆𝑃𝐼4 Cada uma pode operar como mestre ou como escravo Esta seção descreve o modo mestre de operação mas o modo escravo é similar Para utilizar uma porta SPI o programa PIC deve primeiramente configurar o porto Ele pode então escrever o dado num registrador O dado é transmitido serialmente para o escravo O dado coletado do escravo é coletado em outro registrador Quando a transmissão é completada o PIC32 pode ler o dado recebido Cada porta SPI é associada a quatro registradores de 32 bits SPIxCON SPIxSTAT SPIxBRG e SPIxBUF Por exemplo SPI1CON é o registrador de controle para o porto 1 da SPI Ele é utilizado para ativar a SPI e ativar atributos como o número de bits a serem transferidos e a polaridade do clock A Tabela 86 lista os nomes e funções de todos os bits dos registradores CON Todos tem um valor padrão 0 de reset A maioria das funções como framing buffering avançado seleção de sinais escravos e interrupções não são utilizadas nessa seção mas podem ser encontradas no datasheet STAT é o registrador de dados indicando por exemplo se o registrador receptor está cheio Novamente os detalhes desse registrador também estão totalmente descritos no datasheet do 𝑃𝐼𝐶32 Capítulo oito Memória e Sistemas de IO 726 O clock serial pode ser configurado para pulsar com a metade da taxa de clock periférico ou menos A SPI não possui limite teórico de taxa de dados e pode facilmente operar a dezenas de MHz numa placa de circuito impresso embora possa apresentar problemas de ruído acima de 1 MHz quando são utilizados fios numa breadboard BRG é o registrador de taxa de transmissão que ativa a velocidade de SCK relativa ao clock periférico de acordo com a fórmula 𝑓𝑆𝑃𝐼 𝑓𝑐𝑙𝑜𝑐𝑘 𝑝𝑒𝑟𝑖𝑓é𝑟𝑖𝑐𝑜 2𝐵𝑅𝐺1 83 BUF é o buffer de dados Dados escritos em BUF são transferidos através do porto SPI no pino SDO e o dado recebido do pino SDI pode ser encontrado lendose BUF após a transferência ser completada Para preparar a SPI no modo mestre primeiro levea para OFF através do clear no bit 15 no registrador COM o bit ON para 0 Zere tudo que possa estar no buffer receptor pela leitura do registrador BUF Determine a taxa de transmissão desejada escrevendo no registrador BRG Por exemplo se o clock periférico é 20 MHz e a taxa de transmissão desejada é de 125 MHz sete BRG para 20 2125 1 7 Ponha a SPI em modo master colocando o bit 5 do registrador CON MSTEN a 1 Ative o bit 8 do registrador CON CKE de modo que SDO esteja centrado na borda de subida do clock Finalmente leve a SPI para ON ativando o bit ON no registrador CON Para enviar dados para o escravo escreva o dado no registrador BUF O dado será transmitido serialmente e o escravo irá simultaneamente enviar o dado de volta para o mestre Espere até que o bit 11 do registrador STAT o bit SPIBUSY vá para 0 indicando que o SPI completou sua operação Então o dado recebido do escravo poderá ser lido de BUF O porto SPI no 𝑃𝐼𝐶32 é altamente configurável de modo que ele possa conversar com uma grande variedade de dispositivos seriais Infelizmente isso leva à possibilidade de configuração incorreta do porto e da obtenção de transmissões adulteradas de dados Os tempos relativo entre o clock e os sinais de dados são configurados com três bits do registrador CON chamados CKP CKE e SMP Por padrão esses bits são 0 mas a temporização na Figura 836 b utiliza CKE 1 O mestre modifica SDO na borda de subida do SCK para que o escravo possa amostrar o valor na borda de subida utilizando um flipflop de disparo pela borda A API sempre envia dados em ambas as direções em cada transferência Se o sistema necessita apenas enviar dados para o escravo o bit recebido do escravo pode ser ignorado Se o mestre deseja apenas receber dados do escravo ele deve continuar a disparar a comunicação SPI enviando bytes arbitrários que o escravo irá ignorar Ele pode então ler os dados recebidos do escravo Capítulo oito Memória e Sistemas de IO 727 O mestre espera SDI como sendo estável perto da borda de subida de SCK de modo que o escravo possa modificalo na borda de descida como mostrado no diagrama de temporização Os bits MODE32 e MODE16 do registrador CON especificam se uma palavra de 16 ou 32bits deve ser enviada eles têm por padrão valor 0 indicando uma transferência de 8 bits Exemplo 819 ENVIANDO E RECEBENDO DADOS ATRAVÉS DA SPI Projete um sistema de comunicação entre um PIC mestre e uma FPGA escrava através da SPI Esboce um diagrama esquemático da interface Escreva o código em C para o microcontrolador enviar o caractere A e recebelo de volta Escreva o código HDL para uma SPI escravo na FPGA Como o escravo poderia ser simplificado se ele apenas precisar receber o dado Solução A Figura 837 mostra a conexão entre os dispositivos utilizando o porto SPI 2 Os números dos pinos são obtidos dos datasheets dos componentes Figura 831 Note que tanto os números dos pinos quanto os nomes dos sinais são mostrados no diagrama para indicar tanto a conectividade física quanto a lógica Estes pinos são também utilizados pelo porto GPIO RG8 6 Quando a SPI é ativada esses bits do porto G não podem ser utilizados pela GPIO O código em C abaixo inicializa a SPI e então envia e recebe um caractere include p32xxxxh void initspivoid char junk SPI2CONbitsON 0 desativa a SPI para reiniciar qualquer estado inicial previous state junk SPI2BUF lê o buffer SPI para limpar o buffer receptor SPI2BRG 7 SPI2CONbitsMSTEN 1 ativa modo mestre SPI2CONbitsCKE 1 seta temporização clocktodata SPI2CONbitsON 1 ativa SPI char spisendreceivechar send Capítulo oito Memória e Sistemas de IO 728 SPI2BUF send envia dado para escravo while SPI2STATbitsSPIBUSY espera até que a transmissão SPI esteja completa return SPI2BUF retorna dado recebido int mainvoid char received initspi incializa porto SPI received spisendreceiveA envia letra A e byte receptor volta para escravo Figura 837 Conexão SPI entre o PIC32 e o FPGA O código HDL para a FPGA é listado abaixo e um diagrama de blocos com a temporização é mostrado na Figura 838 A FPGA utiliza um registrador de deslocamento para manter os bits que são recebidos do mestre e os bits que restam para serem enviados ao mestre Na primeira borda de subida de sck após o reset e a cada 8 ciclos a partir de então um novo bit de d é carregado no registrador de deslocamento Em cada ciclo subsequente um bit é deslocado para o sdi da FPGA e um bit é deslocado para fora do sdo da FPGA A Capítulo oito Memória e Sistemas de IO 729 sdo é atrasada até à borda de descida de sck de modo que ela possa ser amostrada pelo mestre na próxima borda de subida Após 8 ciclos o byte recebido pode ser encontrado em q Figura 838 Temporização e circuitos do SPI escravo module spislaveinput logic sck do mestre input logic sdi do mestre output logic sdo para o mestre input logic reset system reset input logic 70 d dado a ser enviado output logic 70 q dado recebido Capítulo oito Memória e Sistemas de IO 730 logic 20 cnt logic qdelayed contador de 3 bits quando todo o byte é transmitido alwaysff negedge sck posedge reset if reset cnt 0 else cnt cnt 3 b1 registrador de deslocamento carregável carrega d no início desloca sdi para baixo a cada passo alwaysff posedge sck q cnt 0 d60 sdi q60 sdi alinha sdo a borda de descida do clock carrega d no inicio alwaysff negedge sck qdelayed q7 assign sdo cnt 0 d7 qdelayed endmodule Se o escravo necessita apenas receber dados do mestre ele é reduzido a um simples registrador de deslocamento dado pelo seguinte código HDL module spislavereceiveonlyinput logic sck do mestre input logic sdi do mestre output logic 70 q dado recebido alwaysff posedge sck q q60 sdi registrador de deslocamento endmodule Capítulo oito Memória e Sistemas de IO 731 Algumas vezes é necessário modificar os bits de configuração para se comunicar com um dispositivo que espera diferente temporização Quando 𝐶𝐾𝑃 1 SCK é invertido Quando 𝐶𝐾𝐸 0 o clock pulsa com metade do ciclo anteriormente relativo ao dado Quando 𝑆𝐴𝑀𝑃𝐿𝐸 1 o mestre amostra SDI meio ciclo depois e o escravo deve estar estável nesse momento Estes modos são mostrados na Figura 839 Tome cuidado pois diferentes produtos SPI podem utilizar diferentes nomes e polaridades para essas opções Verifique cuidadosamente as formas de onda para os seus dispositivos Pode também ser útil examinar SCK SDO e SDI num osciloscópio caso você esteja tendo dificuldades de comunicação Transmissor Receptor Universal Assíncrono Universal Asynchronous Receiver Transmitter UART Uma UART é uma IO serial periférica que comunica entre dois sistemas sem enviar um clock Ao invés disso os sistemas devem concordar antecipadamente sobre qual a taxa de transmissão de dados a ser utilizada e cada um deve localmente gerar seu próprio clock Apesar desses sistemas de clock possuírem uma baixa frequência de erros e uma relação de fase desconhecida a UART gerencia comunicações assíncronas confiáveis A UART é utilizada em protocolos como 𝑅𝑆 232 e 𝑅𝑆 485 Por exemplo portas seriais de computadores utilizam o padrão 𝑅𝑆 232𝐶 introduzido em 1969 pela Associação das Indústrias Eletrônicas O padrão inicialmente imaginado para conectar os equipamentos terminais de dados Data Terminal Equipment DTE tal como um computador principal a um qquipamento de comunicação de dados Data Communication Equipment DCE como um modem Apesar da UART ser relativamente lenta quando comparada a SPI os padrões estiveram ao redor por tanto tempo que continuam importantes até hoje A Figura 840 a mostra uma ligação serial assíncrono O DTE envia dados para o DCE através da linha TX e recebe dados de volta através da linha RX A Figura 840 b mostra uma dessas linhas enviando um caractere a uma taxa de transmissão de 9600 baud A linha permanece em nível lógico 1 quando não está em uso Cada caractere é enviado como um bit de partida start 0 78 bits de dados um bit opcional de paridade e um ou mais bits de parada stop 1𝑠 A UART detecta a transição da descida do estado de inatividade para transmissão para bloquear a transmissão num tempo apropriado Apesar de sete bits de dados serem suficientes para enviar um caractere ASCII oito bits são normalmente utilizados pois eles podem transmitir um byte arbitrário de dados Capítulo oito Memória e Sistemas de IO 732 Um bit adicional o bit de paridade pode também ser enviado permitindo ao sistema detectar se um bit foi corrompido durante a transmissão Ele pode ser configurado como par ou ímpar Paridade ímpar significa que o bit de paridade é escolhido de tal modo que o conjunto total de dados e a paridade possuem um número ímpar de 1𝑠 Em outras palavras o bit de paridade é a operação XOR dos bits de dado O receptor pode verificar se um número ímpar de 1𝑠 foi recebido e enviar um erro escolha com se não Paridade par é o inverso e consequentemente a operação XNOR dos bits de dados Figura 839 Clock e temporização dos dados controlados por CKE CKP e SAMPLE Capítulo oito Memória e Sistemas de IO 733 Figura 840 Ligação serial assíncrono Uma escolha comum é a de 8bits de dados sem paridade e um bit de stop formando um total de 10 símbolos para transmitir um caractere de 8bits de informação Consequentemente taxas de sinalização são referidas em unidades de transmissão baud ao invés de bits por segundo Por exemplo 9600 baud indicam 9600 símbolos por segundo ou 960 caracteres por segundo resultando numa taxa de dados de 960 8 7680 bits de dados por segundo Todos os símbolos devem ser configurados para a taxa de transmissão e número de dados apropriados paridade e bits de stop ou o dado irá ser corrompido Isso é um aborrecimento especialmente para usuários não técnicos a qual é uma das razões para a interface USB Universal Serial Bus estar substituindo a UART em sistemas de computadores pessoais Taxas de transmissão típicas incluem 300 1200 2400 9600 14400 19200 38400 57600 e 115200 As taxas mais baixas eram utilizadas nas décadas de 1970 e 1980 para modems que enviavam dados para as linhas telefônicas como uma série de tons Em sistemas contemporâneos 9600 e 115200 são duas das taxas de transmissão mais comuns A de 9600 é encontrada onde a velocidade não importa e a de 115200 é a mais alta taxa de transmissão embora ainda lenta quando comparada a outros modernos padrões seriais de IO O padrão 𝑅𝑆232 define muitos sinais adicionais Os sinais Request to Send RTS e Clear to Send CTS podem ser utilizados para handshaking de hardware Eles podem ser operados em qualquer um dos dois modos No modo de fluxo de controle a DTE limpa RTS para 0 quando ela está pronta para aceitar dados de DCE Da mesma forma a DCE limpa CTS para 0 quando está pronta para receber dados de DTE Alguns datasheets usam uma barra superior para indicar que elas são ativas a baixo No código simplex mais antigo a DTE limpava RTS para 0 quando estava pronta para transmitir A DCE respondia limpando CTS quando estivesse pronta para receber a transmissão Capítulo oito Memória e Sistemas de IO 734 Alguns sistemas especialmente aqueles conectados a uma linha telefônica também utilizam Data Terminal ReadyDTR Data Carrier Detect DCD Data Set Ready DSR e Ring Indicator RI para indicar quando o equipamento está conectado à linha Figura 842 Cabo macho DE9 a pinout b conexões padrão e c conexões em modem null O padrão original recomendava um conector maciço de 25 pinos DB25 mas os PC o simplificaram para um conector macho de 9 pinos DE9 com o pinout mostrado na Figura 842 a Os fios do cabo normalmente se conectam como mostrado na Figura 842 b No entanto quando diretamente conectados a dois DTEs um cabo null modem mostrado na Figura 842 c pode ser necessário para realizar a troca de RX e TX e completar o handshaking Como nota final alguns conectores são machos e outros conectores são fêmeas Em resumo isso pode necessitar de uma grande caixa de cabos e uma certa quantidade de Na década de 1950 até 1970 os primeiros hackers que se autodenominam phreaks do telefone aprenderam a controlar os interruptores da companhia telefónica assobiando tons apropriados Um tom de 2600 Hz produzido por um apito de brinquedo de uma caixa de cereal Capn Crunch Figura 841 podeía ser explorada para obter chamadas grátis de longa distância e internacionais Figura 841 Apito Capn Crunch BosunWhistle Fotogragia de Evrim Sen Reimpresso com permissão O handshaking referese às negociações entre os dois sistemas tipicamente um sistema sinaliza que está pronto para enviar ou receber dados e o outro sistema reconhece esse pedido Capítulo oito Memória e Sistemas de IO 735 suposições para conectar os dois sistemas utilizando a RS232 novamente se explicando a mudança para a USB Felizmente os sistemas embarcados utilizam uma configuração simplificada de 3 ou 5 fios consistindo de GND TX RX e possivelmente RTS e CTS A RS232 representa um 0 eletricamente de 3 a 15 𝑉 e um 1 de 3 a 15 𝑉 Isso é chamado sinalização bipolar Um transceiver converte os níveis lógicos digitais da UART para os níveis positivos e negativos esperados pela RS232 e também fornece proteção contra descargas eletrostáticas para proteger a porta serial de danos quando o usuário conecta o cabo O 𝑀𝐴𝑋3232𝐸 é um transceiver compatível tanto com lógica digital de 33𝑉 quanto 5𝑉 Ele contém uma bomba de carga que em conjunto com capacitores externos gera na saída 5𝑉 para fontes de alimentação de baixas tensões únicas O 𝑃𝐼𝐶32 possui seis UART nomeadas 𝑈1𝑈6 Assim como na SPI o programa PIC deve primeiramente configurar o porto Ao contrário da SPI ler e escrever podem ocorrer independentemente pois qualquer sistema pode transmitir sem ter recebido e viceversa Cada UART é associada com cinco registradores de 32bits 𝑈𝑥𝑀𝑂𝐷𝐸 𝑈𝑥𝑆𝑇𝐴 status 𝑈𝑥𝐵𝑅𝐺 𝑈𝑥𝑇𝑋𝑅𝐸𝐺 e 𝑈𝑥𝑅𝑋𝑅𝐸𝐺 Por exemplo 𝑈1𝑀𝑂𝐷𝐸 é o registrador de modo para 𝑈𝐴𝑅𝑇1 O registrador de modo é utilizado para configurar a 𝑈𝐴𝑅𝑇 e o registrador 𝑆𝑇𝐴 é utilizado para verificar quando o dado está disponível O registrador 𝐵𝑅𝐺 é utilizado para ativar a taxa de transmissão O dado é transmitido ou recebido escrevendose 𝑇𝑋𝑅𝐸𝐺 ou lendose o 𝑅𝑋𝑅𝐸𝐺 O registrador 𝑀𝑂𝐷𝐸 é padrão para dados de 8bits 1 bit de stop sem paridade e sem controle de fluxo 𝑅𝑇𝑆𝐶𝑇𝑆 então para a maioria das aplicações o programador está apenas interessado no bit 15 o bit ON o qual ativa a UART O registrador 𝑆𝑇𝐴 contém os bits para ativar os pinos de transmissão e recepção e verificar se o buffer de transmissão e recepção estão cheios Após ativar o bit ON da UART o programador deve também ativar os bits 𝑈𝑇𝑋𝐸𝑁 e 𝑈𝑇𝑋𝐵𝐹 bits 10 e 12 do registrador 𝑆𝑇𝐴 para ativar esses dois pinos O bit 𝑈𝑇𝑋𝐵𝐹 bit 9 indica que o buffer transmissor está cheio O bit 𝑈𝑅𝑋𝐷𝐴 bit 0 indica que o buffer de recepção possui dados disponíveis O registrador 𝑆𝑇𝐴 também contém bits que indicam a paridade e erros de construção Um erro de construção ocorre se os bits de start ou de stop não são encontrados no tempo esperado Capítulo oito Memória e Sistemas de IO 736 O registrador de 16 bits 𝐵𝑅𝐺 é utilizado para definir a taxa de transmissão para uma fração do clock do barramento periférico 𝑓𝑈𝐴𝑅𝑇 𝑓𝑐𝑙𝑜𝑐𝑘 𝑝𝑒𝑟𝑖𝑓é𝑟𝑖𝑐𝑜 16𝐵𝑅𝐺1 84 A Tabela 87 lista configurações de 𝐵𝑅𝐺 para taxas de transmissão comuns assumindo um clock periférico de 20 MHz Às vezes é impossível atingir exatamente a taxa de transmissão desejada No entanto enquanto o erro de frequência for menor do que 5 o erro de fase entre o transmissor e o receptor irá permanecer pequeno numa duração de 10 bits sendo o dado recebido apropriadamente O sistema irá então ser novamente sincronizado no próximo bit de start Para transmitir o dado espere até que 𝑆𝑇𝐴 𝑈𝑇𝑋𝐵F esteja limpo indicando que o buffer de transmissão possui espaço disponível e então escreva o byte em 𝑇𝑋𝑅𝐸𝐺 Para receber o dado verifique 𝑆𝑇𝐴 𝑈𝑅𝑋𝐷𝐴 para ver se o dado foi entregue e então leia o byte de 𝑅𝑋𝑅𝐸𝐺 Tabela 87 Configurações BRG para um clock periférico de 20 MHz Capítulo oito Memória e Sistemas de IO 737 Exemplo 820 COMUNICAÇÃO SERIAL COM O PC Desenvolva um circuito e um programa em C para um 𝑃𝐼𝐶32 comunicar com um PC através de uma porta serial a uma taxa de transmissão de 115200 baud com 8bits de dados 1 bit de stop e sem paridade O PC pode estar rodando um programa de consola como o PuTTY para ler e escrever através da porta serial O programa deve dizer ao usuário para digitar uma string Ele deve então dizer ao usuário o que foi digitado Solução A Figura 843 mostra um esquemático para uma ligação serial Devido a poucos PC ainda possuírem portas seriais nós utilizamos um adaptador USB para RS232 𝐷𝐵9 do site plugablecom mostrado na Figura 843 para fornecer uma conexão serial ao PC O adaptador é ligado a um conector fêmea DE9 soldado de modo a alimentar o transceiver o qual converte as tensões de níveis bipolares RS232 para a tensão de 33𝑉 do microcontrolador 𝑃𝐼𝐶32 O microcontrolador e o PC são ambos DTE então os pinos RX e TX devem ter conexão cruzada com o circuito O handshaking RTSCTS do 𝑃𝐼𝐶32 não é utilizado e o RTS e CTS no conector 𝐷𝐸9 são conectados entre si de modo que o PC não necessitará de handshaking Para configurar o PuTTY disponível em wwwputtyorg para trabalhar com a ligação serial selecione Connection type para Serial e Speed para 115200 Selecione 𝑆𝑒𝑟𝑖𝑎𝑙 𝐿𝑖𝑛𝑒 para a porta COM atribuída pelo sistema operacional para o adaptador USB No Windows isso pode ser encontrado no Gerenciador de Dispositivos por exemplo pode ser COM3 Na aba Connection Serial selecione o fluxo de controle para NONE ou RTSCTS Na aba Terminal selecione Local Echo para Force on para ter os caracteres aparecendo no terminal assim que você os digita O código é listado abaixo A tecla Enter no terminal do programa corresponde a um caractere de carriage return denominado r em C com um código ASCII de 0𝑥0𝐷 Para avançar para o início de uma nova linha quando se imprime algo envie ambos os comandos e r carriage return e quebra de linha Capítulo oito Memória e Sistemas de IO 738 Figura 843 PIC32 para link serial Figura 844 Adaptador Serial RS232 para DB9 2012 Plugable Technologies reimpresso com permissão As funções para inicializar ler e escrever na porta serial compõem um simples driver de dispositivo O driver do dispositivo oferece um nível de abstração e modularidade entre o programador e o hardware de modo que o programador utilizando o driver de dispositivo não precisa entender o conjunto de registradores da UART Isso também simplifica a mudança do código para outro microcontrolador o driver de dispositivo deve ser reescrito mas o código que o chama pode permanecer o mesmo A função main demonstra a impressão na consola e a leitura da consola utilizando as funções putstrserial e getstrserial Ela também demonstra a utilização de printf da biblioteca stdioh a qual automaticamente imprime através da UART2 Infelizmente as bibliotecas do 𝑃𝐼𝐶32 não suportam atualmente a função scanf pela UART de um modo elegante mas getstrserial é suficiente Capítulo oito Memória e Sistemas de IO 739 include P32xxxxh include stdioh void inituartvoid U2STAbitsUTXEN 1 ativar pino de transmissão U2STAbitsURXEN 1 ativar pino de recepção U2BRG 10 setar taxa de transmissão para 115200 baud U2MODEbitsON 1 ativar UART char getcharserialvoid while U2STAbitsURXDA esperar até dado disponível return U2RXREG retorna o caractere recebido da porta serial void getstrserialchar str int i 0 do lê uma string inteira até a detecção stri getcharserial carriage return while stri r procura por carriage return stri1 0 string null void putcharserialchar c while U2STAbitsUTXBF espera até o buffer de transmissão estar vazio U2TXREG c transmite caractere através da porta serial void putstrserialchar str int i 0 while stri 0 itera a string Capítulo oito Memória e Sistemas de IO 740 putcharserialstri envia cada caractere int mainvoid char str80 inituart while1 putstrserialPlease type something getstrserialstr printf rYou typed s r str Comunicar com a porta serial a partir de um programa em C é um pouco aborrecedor pois as bibliotecas dos drivers de portas seriais não são padronizadas através dos sistemas operacionais Outros ambientes de programação como Python Matlab ou LabVIEW realizam comunicação serial sem esforço 864 Temporizadores Os sistemas embarcados comumente precisam medir tempo Por exemplo um forno microondas precisa de um temporizador para mostrar a hora do dia e outro para medir quanto tempo cozinhar Ele pode ainda utilizar outro para gerar os pulsos para o motor girar o prato e um quarto para controlar a potência ajustandoo para apenas ativar a energia do microondas por uma fração de cada segundo O 𝑃𝐼𝐶32 possui cinco temporizadores de 16 bits na placa Timer1 é chamado timer Tipo A que pode aceitar uma fonte assíncrona de clock externo como um cristal de quartzo de 32 kHz Os timers 23 e 45 são chamados timers tipo B Eles rodam de modo síncrono fora do clock periférico e podem ser pareados por exemplo 2 com 3 para formar timers de 32 bits para medir longos períodos de tempo Capítulo oito Memória e Sistemas de IO 741 Cada temporizador é associado com três registradores de 16 bits TxCON TMRx e PRx Por exemplo T1CON é o registrador de controle para o Timer 1 CON é o registrador de controle TMR contém a contagem do tempo atual PR é o registrador de período Quando um temporizador atinge um período especificado ele vai de volta para 0 e ativa o bit TxIF no registrador de flag de interrupção IFS0 Um programa pode verificar esse bit para detectar overflow Alternativamente ele pode gerar uma interrupção Por padrão cada temporizador age como um contador de 16bits acumulando ticks de um clock periférico interno 20 𝑀𝐻𝑧 em nosso exemplo O bit 15 do registrador COM especifica o prescalar como mostrado nas Tabela 88 e Tabela 89 para os contadores tipo A e tipo B Préescalando de 𝑘 1 faz o timer contar apenas uma vez a cada 𝑘 ticks Isso pode ser útil para gerar longos intervalos de tempo especialmente quando o clock periférico está rodando rápido Os outros bits do registrador COM são levemente diferentes para os contadores tipo A e tipo B Veja o datasheet para mais detalhes Tabela 88 Prescalars para temporizadores do tipo A Capítulo oito Memória e Sistemas de IO 742 Tabela 89 Prescalars para temporizadores do tipo B Exemplo 821 PRODUÇÃO DE DELAY Escreva duas funções que criam delays de um número especificado de microssegundos e milissegundos utilizando o Timer1 Assuma que o clock periférico está rodando a 20 𝑀𝐻𝑧 Solução Cada microssegundo é igual a 20 ciclos do clock periférico Empiricamente observamos com um osciloscópio que a função delaymicros possui um atraso de 6 𝜇𝑠 para chamada de função e a inicialização do timer Portanto nós ativamos PR para 20 𝑚𝑖𝑐𝑟𝑜𝑠 6 Então a função não terá acurácia para intervalos de menos de 6 𝜇𝑠 A verificação no início previne overflows do PR de 16 bits Capítulo oito Memória e Sistemas de IO 743 A função delaymillis repetidamente invoca delaymicros1000 para criar um número apropriado de delays de 1𝑚𝑠 include P32xxxxh void delaymicrosint micros if micros 1000 Evita overflow do timer delaymicros1000 delaymicrosmicros1000 else if micros 6 TMR1 0 reseta timer para 0 T1CONbitsON 1 liga timer PR1 micros620 20 clocks por microssegundo função tem um atraso de 6 us IFS0bitsT1IF 0 limpa flag de overflow while IFS0bitsT1IF espera até que a flag de overflow seja setada void delaymillisint millis while millis delaymicros1000 repetidamente atrase 1 ms até que esteja feito Outra característica conveniente do temporizador é a gated time accumulation na qual o temporizador apenas conta enquanto um pino externo está a alto Isso permite ao temporizador medir a duração de um pulso externo Essa característica é ativada utilizandose o registrador CON Capítulo oito Memória e Sistemas de IO 744 865 Interrupções Os temporizadores são frequentemente utilizados em conjunto com interrupções de modo que um programa possa rodar o seu procedimento usual e então periodicamente lidar com uma tarefa quando o temporizador gerar uma interrupção A Seção 672 descreveu as interrupções MIPS do ponto de vista de arquitetura Esta seção explora como usálas num 𝑃𝐼𝐶32 As requisições de interrupções ocorrem quando um evento de hardware ocorre como um overflow de um temporizador um caractere sendo recebido pela UART ou certos pinos GPIO comutando Cada tipo de requisição de interrupção ativa um bit específico nos registradores de flags de Status de Interrupção IFS O processador então verifica o bit correspondente nos registradores de Controle de Ativação de Interrupção IEC Se o bit está ativado o microcontrolador deve responder com uma requisição de interrupção invocando uma rotina de serviço de interrupção ISR A ISR é uma função com argumentos void que lida com a interrupção e zeram os bits do IFS antes do retorno O sistema de interrupções do 𝑃𝐼𝐶32 suporta os modos vetorsimples e vetoresmúltiplos No modo de vetor simples todas as interrupções invocam o mesmo ISR que deve examinar o registrador CAUSE para determinar a razão da interrupção se múltiplos tipos de interrupção ocorrerem e lidar com elas de acordo No modo de vetores múltiplos cada tipo de interrupção chama uma ISR diferente O bit MVEC no registrador INTCON determina o modo Em qualquer caso o sistema de interrupção MIPS deve ser ativado com a instrução ei antes de aceitar qualquer interrupção O 𝑃𝐼𝐶32 também permite que cada fonte de interrupção tenha uma prioridade e uma subprioridade configurável A prioridade possui valores de 0 a 7 com 7 sendo a mais alta Uma interrupção de alta prioridade irá antecipar uma interrupção atual a ser tratada Por exemplo suponha que uma interrupção UART é ativada com prioridade 5 e uma interrupção do temporizador é ativado com prioridade 7 Se o programa está executando seu fluxo normal e um caractere aparece na UART uma interrupção irá ocorrer e o microcontrolador poderá ler o dado da UART e lidar com ele Se um temporizador sofre overflow enquanto a ISR da UART está ativa a ISR irá por si só ser interrompida de modo que o microcontrolador possa imediatamente tratar o overflow no temporizador Quando isso estiver feito ele retornará para finalizar a interrupção na UART antes de retornar para o programa principal De outro modo se a interrupção do temporizador tem prioridade 2 a ISR da UART poderá completar primeiro e então a ISR do temporizador seria invocado e finalmente o microcontrolador retornaria para o programa principal Capítulo oito Memória e Sistemas de IO 745 A subprioridade está na faixa de 0 a 3 Se dois eventos com a mesma prioridade estão simultaneamente pendentes aquele com a maior subprioridade irá ser tratado primeiro No entanto a subprioridade não irá causar uma nova interrupção para antecipar uma interrupção de mesma prioridade presentemente sendo tratada A prioridade e a subprioridade de cada evento é configurada nos registradores IPC Cada fonte de interrupção possui um vetor na faixa de 0 a 63 Por exemplo a interrupção de overflow do Timer1 é o vetor 4 a interrupção do UART2 RX é o vetor 32 e a interrupção externa de INT0 disparada por uma mudança de flanco no pino RD0 é o vetor 3 Os campos dos registradores IFS IEC e IPC correspondentes a um número de vetor estão especificados no datasheet do 𝑃𝐼𝐶32 A declaração de função ISR é marcada por duas diretivas de atributos especiais attribute indicando o nível de prioridade e o número do vetor O compilador utiliza esses atributos para associar o ISR com a requisição de interrupção apropriada O Microchip MPLAB C Compiler For PIC32 MCUs Users Guide possui mais informações sobre a escrita de rotinas de serviços de interrupção Exemplo 822 INTERRUPÇÕES PERIÓDICAS Escreva um programa que pisque um LED a 1 𝐻𝑧 utilizando interrupções Solução Iremos definir o Timer1 para ter overflow a cada 05 segundos e pulsar o LED entre ON e OFF no tratamento de interrupção O código abaixo demonstra o modo de operação multivetor embora apenas a interrupção do Timer1 esteja ativada atualmente A função blinkISR possui atributos indicando que ela tem prioridade nível 7 IPL7 e é para vector4 o vetor de overflow do Timer1 O ISR pulsa o LED e limpa o bit da flag de interrupção do Timer1 T1IF antes do retorno A função initTimer1Interrupt configura o timer para um período de 1 2 segundos utilizando um prescalar de 256 1 e um contador de 39063 ticks Ela ativa o modo multivetor A prioridade e a sub prioridade são especificadas nos bits 4 2 e 1 0 do registrador IPC1 respectivamente A flag de interrupção do Capítulo oito Memória e Sistemas de IO 746 Timer1 T1IF bit 4 de IFS0 é zerada e a ativação da interrupção do Timer1 é configurada para aceitar interrupções do Timer1 Finalmente a diretiva asm é utilizada para garantir a instrução ei para ativar o sistema de interrupção A função main apenas espera em um loop while após a inicialização da interrupção do temporizador No entanto isso poderia fazer algo mais interessante como jogar um jogo com o usuário e a interrupção ainda iria garantir que o LED pisca na taxa correta include p32xxxxh A interrupção do timer1 é Vector4 usando bit de enable IEC04 e bit the flag IFS04 prioridade IPC142 subprioridade IPC110 void attribute interruptIPL7 attribute vector4 blinkISRvoid PORTDbitsRD0 PORTDbitsRD0 pulsa o LED IFS0bitsT1IF 0 limpa a flag de interrupcao return void initTimer1Interruptvoid T1CONbitsON 0 desativa o timer TMR1 0 reseta timer para 0 T1CONbitsTCKPS 3 1256 prescale 20 MHz 256 78125 KHz PR1 39063 pulsar a cada meio períodoperíodo de um Segundo INTCONbitsMVEC 1 ativa modo multivetor usamos vector4 IPC1 0x7 2 0x3 prioridade 7 subprioridade 3 IFS0bitsT1IF 0 limpa a flag de interrupção do Timer1 IEC0bitsT1IE 1 ativa a interrupção do timer1 asm volatileei ativa as interrupções do microcontrolador T1CONbitsON 1 liga o timer Capítulo oito Memória e Sistemas de IO 747 int mainvoid TRISD 0 configura PORTD para alimentar os LED PORTD 0 initTimer1Interrupt while1 espera ou realiza algo útil aqui 866 IO Analógica O mundo real é um lugar analógico Muitos sistemas embarcados precisam de entradas e saídas analógicas para realizar uma interface com o mundo Eles utilizam Conversores AnalógicoDigitais Analog to Digital Converters ADC para quantizar sinais analógicos em valores digitais e Conversores DigitalAnalógicos Digital to Analog Converters DAC para realizar o inverso A Figura 845 mostra os símbolos para esses componentes Tais conversores são caracterizados através da resolução faixa dinâmica taxa de amostragem e acurácia Por exemplo um ADC pode ter 𝑁 12 bits de resolução numa faixa 𝑉𝑟𝑒𝑓 a 𝑉𝑟𝑒𝑓 de 0 a 5 𝑉 com uma taxa de amostragem de 𝑓𝑠 44𝑘𝐻𝑧 e acurácia de 3 bits menos significativos lsbs Taxas de amostragem também podem ser listadas em amostras por segundo sps onde 1 𝑠𝑝𝑠 1𝐻𝑧 A relação entre a tensão de entrada analógica 𝑉𝑖𝑛𝑡 e a amostra digital 𝑋𝑛 é 𝑋𝑛 2𝑁 𝑉𝑖𝑛𝑡𝑉𝑟𝑒𝑓 𝑉𝑟𝑒𝑓𝑉𝑟𝑒𝑓 𝑛 𝑡 𝑓𝑠 85 Por exemplo uma tensão de entrada de 25 𝑉 metade da escala poderia corresponder a uma saída de 1000000000002 80016 com uma incerteza de até 3 lsbs Capítulo oito Memória e Sistemas de IO 748 Similarmente um DAC pode ter 𝑁 16 bits de resolução sobre uma faixa de saída em escala total de 𝑉𝑟𝑒𝑓 256 𝑉 Ele produz uma saída de 𝑉𝑜𝑢𝑡𝑡 𝑋𝑛 2𝑁 𝑉𝑟𝑒𝑓 86 Muitos microcontroladores possuem ADC de performance moderada embutidos Para maior desempenho por exemplo 16bits de resolução ou taxas de amostragem maiores do que 1 MHz é frequentemente necessário utilizar um ADC separado conectado ao microcontrolador Poucos microcontroladores possuem DAC então chips separados também podem ser utilizados No entanto os micrcontroladores frequentemente simulam saídas analógicas utilizando a técnica chamada Modulação por Largura de Pulso Pulse Width Modulation PWM Esta seção descreve tais IO analógicas no contexto do microcontrolador 𝑃𝐼𝐶32 Figura 845 Símbolos dos ADC e DAC Capítulo oito Memória e Sistemas de IO 749 Conversão AD O 𝑃𝐼𝐶32 possui um ADC de 10 bits com velocidade máxima de 1 milhão de amostras por segundo Msps O ADC podese conectar a qualquer uma das 16 portas analógicas através de um multiplexador analógico As entradas analógicas são chamadas 𝐴𝑁015 e compartilham os seus pinos com o porto IO RB Por padrão 𝑉𝑟𝑒𝑓 é o pino analógico 𝑉𝐷𝐷 e 𝑉𝑟𝑒𝑓 é o pino analógico GND No nosso sistema essas são as entradas de 33𝑉 e 0𝑉 respectivamente O programador deve inicializar o ADC especificar qual o pino a ser amostrado esperar o tempo suficiente para a tensão ser lida iniciar a conversão esperar até que ela termine e ler o resultado O ADC é altamente configurável com a capacidade de percorrer múltiplas entradas analógicas em intervalos programados e gerar interrupções após a conclusão Esta seção simplesmente descreve como ler um único pino de entrada analógico Veja o PIC32 Family Reference Manual para detalhes e outras características O ADC é controlado por um grupo de registradores 𝐴𝐷1𝐶𝑂𝑁13 𝐴𝐷1𝐶𝐻𝑆 𝐴𝐷1𝑃𝐶𝐹𝐺 𝐴𝐷1𝐶𝑆𝑆𝐿 e 𝐴𝐷𝐶1𝐵𝑈𝐹0𝐹 𝐴𝐷1𝐶𝑂𝑁1 é o registrador de controle primário Ele possui um bit ON para ativar o ADC um bit SAMP para controlar quando a amostragem e a conversão se iniciam e um bit DONE para indicar quando a conversão está completa 𝐴𝐷1𝐶𝑂𝑁3 possui 𝐴𝐷𝐶𝑆7 0 bits que controlam a velocidade da conversão AD 𝐴𝐷1𝐶𝐻𝑆 é o registrador de seleção de canal especificando a entrada analógica a ser amostrada 𝐴𝐷1𝑃𝐶𝐹𝐺 é o registrador de configuração de pinos Quando um bit é 0 o pino correspondente age como uma entrada analógica Quando é 1 o pino age como uma entrada digital 𝐴𝐷𝐶1𝐵𝑈𝐹0 mantém o resultado da conversão de 10 bits Os outros registradores não são necessários em nosso exemplo simples O ADC utiliza um registrador de aproximações sucessivas que produz um bit do resultado em cada ciclo de clock do ADC Dois ciclos adicionais são necessários para um total de 12 clocksconversão do ADC O período de clock do ADC 𝑇𝐴𝐷 deve ser de pelo menos 65 𝑛𝑠 para que a operação seja correta Ele é definido como um múltiplo do período do clock periférico 𝑇𝑃𝐵 utilizando os bits ADCS de acordo com a relação 𝑇𝐴𝐷 2𝑇𝑃𝐵𝐴𝐷𝐶𝑆 1 87 Consequentemente para clocks periféricos superiores a 30 𝑀𝐻𝑧 os bits do ADCS podem ser deixados com seus valores padrão de 0 Note que o ADC tem um uso confuso dos termos taxa de amostragem e frequência de amostragem O tempo de amostragem também chamado tempo de aquisição é a quantidade de tempo necessária para que a entrada estabilize antes que a conversão se inicie A taxa de amostragem é o número de amostras coletadas por segundo Capítulo oito Memória e Sistemas de IO 750 O período de amostragem é a quantidade de tempo necessária para uma nova entrada se estabelecer antes da conversão ter início Enquanto a resistência da fonte sendo amostrada for menor do que 5 𝑘Ω o tempo de amostragem pode ser tão pequeno quanto 132 𝑛𝑠 o que é apenas um número pequeno de ciclos de clock Exemplo 823 ENTRADA ANALÓGICA Escreva um programa que leia o valor da entrada analógica no pino 𝐴𝑁11 Solução A função initadc inicializa o ADC e seleciona o canal especificado Ela deixa o ADC no modo de amostragem A função readadc encerra a amostragem e inicia a conversão Ela espera até que a conversão esteja concluída então recomeça a amostragem e retorna o resultado da conversão include P32xxxxh void initadcint channel AD1CHSbitsCH0SA channel seleciona qual o canal a amostrar AD1PCFGCLR 1 channel configure o pino desse canal como entrada analógica AD1CON1bitsON 1 ativa o ADC AD1CON1bitsSAMP 1 inicia amostragem AD1CON1bitsDONE 0 limpa flag DONE int readadcvoid AD1CON1bitsSAMP 0 encerra amostragem inicia conversão while AD1CON1bitsDONE espera até que a conversão seja concluída Capítulo oito Memória e Sistemas de IO 751 AD1CON1bitsSAMP 1 reinicia amostragem prepara para próxima conversão AD1CON1bitsDONE 0 limpa flag DONE return ADC1BUF0 retorna valor da conversãoo int mainvoid int sample initadc11 sample readadc Conversão DA O 𝑃𝐼𝐶32 não possui DAC embutido então esta seção descreve a conversão DA utilizando DACs externos Ela também ilustra o interface do 𝑃𝐼𝐶32 com outros chips através das portas paralela e serial A mesma abordagem pode ser utilizada para realizar a interface entre o 𝑃𝐼𝐶32 e um ADC externo de maior resolução ou mais rápido Alguns DAC aceitam a entrada digital de Nbits numa interface paralela com N conexões enquanto outros a aceitam através de interfaces seriais como a SPI Alguns DAC exigem tanto tensões de alimentação positivas quanto negativas enquanto outros operam sob uma alimentação única Alguns suportam uma faixa flexível de tensões de alimentação enquanto outros demandam uma tensão específica Os níveis lógicos de entrada dever ser compatíveis com a fonte digital Alguns DAC produzem numa tensão de saída proporcional à entrada digital enquanto outros produzem uma saída em corrente Um amplificador operacional pode ser necessário para converter esse valor de corrente numa tensão na faixa desejada Nesta seção nós usamos o DAC paralelo da Analog Devices 𝐴𝐷558 de 8bits e o DAC serial da Linear Technologies 𝐿𝑇𝐶1257 de 12 bits Ambos produzem uma saída em tensão trabalham sobre uma tensão de alimentação única de 5 a 15 𝑉 utilizam 𝑉𝐼𝐻 24 𝑉 de modo que são compatíveis com as saídas de 33 𝑉 do 𝑃𝐼𝐶32 vêm em encapsulamentos DIP o que os torna fáceis de conectar a uma breadboard e são simples de usar O 𝐴𝐷558 produz uma saída numa escala de 0 a 256 𝑉 consome 75 𝑚𝑊 vem num encapsulamento de Capítulo oito Memória e Sistemas de IO 752 16 pinos e possui um tempo de estabilização settling time de 1𝜇𝑠 permitindo uma taxa de saída de 1𝑀𝑠𝑎𝑚𝑝𝑙𝑒𝑠𝑠 O datasheet se encontra em analogcom O 𝐿𝑇𝐶1257 produz uma saída numa escala de 0 a 2048 𝑉 consome menos de 2 𝑚𝑊 vem num encapsulamento de 8 pinos e possui um tempo de estabilização de 6𝜇𝑠 A sua SPI opera a uma taxa máxima de 14 𝑀𝐻𝑧 O datasheet se encontra em linearcom A Texas Instruments é outra empresa líder na fabricação de ADC e DAC Exemplo 824 SAÍDAS ANALÓGICAS COM DAC EXTERNOS Esboce um circuito e escreva o software para um simples gerador de sinais que produz ondas senoidais e triangulares utilizando um 𝑃𝐼𝐶32 um 𝐴𝐷558 e um 𝐿𝑇𝐶1257 Solução O circuito é mostrado na Figura 846 O 𝐴𝐷558 conectase ao 𝑃𝐼𝐶32 através da porta paralela RD de 8bits São conectados Vout Sense e Vout Select a Vout para definir uma faixa de saída em escala completa de 256 𝑉 O 𝐿𝑇𝐶1257 se conecta ao 𝑃𝐼𝐶32 via 𝑆𝑃𝐼2 Ambos os ADC utilizam uma tensão de alimentação de 5 𝑉 e possuem um capacitor de desacoplamento de 01𝜇𝐹 para reduzir o ruído da fonte de alimentação Nos DAC os sinais enable e load ativos a baixo no chip indicam quando converter a próxima entrada digital Eles devem ser mantidos em nível alto enquanto uma nova entrada está sendo carregada O programa é mostrado abaixo A função initio inicializa as portas paralelas e seriais e configura o temporizador com o período para produzir a frequência de saída desejada A SPI é definida como modo de 16bits a 1 𝑀𝐻𝑧 mas o 𝐿𝑇𝐶1257 apenas se preocupa com os últimos 12bits enviados A função initwavetables précomputa um array de valores de amostra para as funções senoidal e triangular A onda senoidal é definida com uma escala de 12bits e a triangular para uma escala de 8bits Existem 64 pontos por período em cada onda Mudar esse valor acarreta uma troca entre precisão e frequência A Capítulo oito Memória e Sistemas de IO 753 função genwaves percorre as amostras Para cada amostra ela desativa os sinais CE e LOAD para os DAC envia a nova amostra através das portas paralelas e seriais reativa os DAC e então espera até que o timer indique que é hora para a próxima amostra A mínima frequência senoidal e triangular de 5 𝐻𝑧 é definida pelo registrador de período de 16bits do Timer1 e a máxima frequência de 605 𝐻𝑧 387 𝑘 𝑠𝑝𝑠 é definida como o tempo par enviar cada ponto na função genwaves a qual a transmissão SPI é o componente principal Figura 846 Interfaces serial e paralela do DAC ao PIC32 Capítulo oito Memória e Sistemas de IO 754 include P32xxxxh include mathh exigido para o uso da função seno define NUMPTS 64 int sineNUMPTS triangleNUMPTS void initioint freq freq pode ser 5605 Hz TRISD 0xFF00 faz os 8bits inferiores saídas de PORTD SPI2CONbitsON 0 desativa SPI para resetar estados anteriores SPI2BRG 9 1 MHz SPI clock SPI2CONbitsMSTEN 1 ativar modo mestre SPI2CONbitsCKE 1 definir clocktodata timing SPI2CONbitsMODE16 1 ativar modo 16bit SPI2CONbitsON 1 ativar SPI TRISF 0xFFFE fazer RF0 uma saida para controlar load e ce PORTFbitsRF0 1 definir RF0 1 PR1 20e6NUMPTSfreq 1 definir registrador de período para onda desejada frequência T1CONbitsON 1 ativar Timer1 void initwavetablesvoid int i Capítulo oito Memória e Sistemas de IO 755 for i0 iNUMPTS i sinei 2047sin2314159iNUMPTS 1 escala de 12 bits if iNUMPTS2 trianglei i511NUMPTS escala de 8 bits else trianglei 510i511NUMPTS void genwavesvoid int i while 1 for i0 iNUMPTS i IFS0bitsT1IF 0 limpa flag de overflow de timer PORTFbitsRF0 1 desativa load durante a mudança das entradas SPI2BUF sinei envia pontos atuais para DAC PORTD trianglei while SPI2STATbitsSPIBUSY espera até que a transferência esteja completa PORTFbitsRF0 0 carrega novos pontos nos DAC while IFS0bitsT1IF espera o tempo para enviar ao próximo ponto int mainvoid initio500 initwavetables genwaves Capítulo oito Memória e Sistemas de IO 756 Modulação por Largura de Pulso Pulse Width Modulation PWM Outro modo de um sistema digital gerar saídas analógicas é através da modulação por largura de pulso PWM no qual uma saída periódica é pulsada ente o nível lógico alto por parte do seu período e o nível lógico baixo no tempo restante O duty cycle é a fração do período para o qual o pulso tem nível alto como mostrado na Figura 847 O valor médio da saída é proporcional ao duty cycle Por exemplo se a saída oscila entre 0 e 33 𝑉 e tem um duty cycle de 25 o valor médio será 025 33 0825 𝑉 Fazer a filtragem do sinal PWM com um filtro passabaixo elimina as oscilações e deixa o sinal com o valor médio desejado O 𝑃𝐼𝐶32 contém cinco módulos de comparação de saída 𝑂𝐶1𝑂𝐶5 onde cada um em conjunto com o Timer2 ou Timer3 pode produzir saídas PWM Cada módulo de comparação de saída está associado com três registradores de 32 bits 𝑂𝐶𝑥𝐶𝑂𝑁 𝑂𝐶𝑥𝑅 e 𝑂𝐶𝑥𝑅𝑆 𝐶𝑂𝑁 é o registrador de controle Os bits 𝑂𝐶𝑀 do registrador 𝐶𝑂𝑁 devem ser definidos em 1102 para ativar o modo PWM e o bit ON deve estar ativado Por padrão a comparação de saída utiliza o Timer2 no modo 16bits mas os bits 𝑂𝐶𝑆𝑇𝐸𝐿 e 𝑂𝐶32 podem ser utilizados para selecionar o Timer3 eou o modo de 32 bits No modo PWM 𝑅𝑆 define o duty cycle o registrador de período do timer 𝑃𝑅 define o período e 𝑂𝐶𝑥𝑅 pode ser ignorado Figura 847 Sinal modulado em largura de pulso PWM Capítulo oito Memória e Sistemas de IO 757 Exemplo 825 SAÍDA ANALÓGICA COM PWM Escreva uma função que gere uma saída de tensão analógica utilizando PWM e um filtro RC externo A função deve aceitar uma entrada entre 0 saída de 0 𝑉 e 256 saída completa de 33𝑉 Solução Use o módulo 𝑂𝐶1 para produzir um sinal de 78125 𝑘𝐻𝑧 no pino 𝑂𝐶1 O filtro passabaixo na Figura 848 possui uma frequência de corte de 𝑓𝑐 1 2𝜋𝑅𝐶 16 𝑘𝐻𝑧 para eliminar as oscilações de alta frequência e passar o valor médio O temporizador deve rodar a 20 𝑀𝐻𝑧 com um período de 256 ticks pois 20 𝑀𝐻𝑧256 resulta na desejada frequência PWM de 78125 𝑘𝐻𝑧 A entrada do duty cycle é o número de ticks para o qual a saída possui nível alto Se o duty cycle é 0 a saída irá permanecer em nível 0 Se é 256 ou maior a saída irá permanecer em nível alto O código PWM utiliza 𝑂𝐶1 e o Timer2 O registrador de período é definido em 255 para um período de 256 ticks 𝑂𝐶1𝑅𝑆 é definido como sendo o duty cycle desejado 𝑂𝐶1 é então configurado no modo PWM e o temporizador e o módulo de comparação de saída estão ligados O programa deve avançar para outras tarefas enquanto o módulo de comparação da saída continua rodando O pino 𝑂𝐶1 irá continuamente gerar o sinal PWM até explicitamente ser desligado Capítulo oito Memória e Sistemas de IO 758 Figura 848 Saída analógica utilizando PWM e um filtro passabaixo include P32xxxxh void genpwmint dutycycle PR2 255 define periodo para 2551 tiques 78125 KHz OC1RS dutycycle seta duty cycle OC1CONbitsOCM 0b110 seta modulo de comparacao de saida 1 para PWM mode T2CONbitsON 1 ativa timer2 em modo padrão 20 MHz 16bit OC1CONitsON 1 ativa modulo de comparacao de saída 1 867 Outros Periféricos do Microcontrolador Os microcontroladores frequentemente realizam interfaces com outros periféricos externos Esta seção descreve uma variedade de exemplos comuns incluindo displays de cristal líquido LCD monitores VGA ligações Bluetooth e controle de motores Interfaces de comunicações padrão incluindo USB e Ethernet são descritas nas Seções 871 e 874 Displays LCD Um caractere LCD é um pequeno display de cristal líquido capaz de mostrar uma ou mais linhas de texto Eles são comumente utilizados em painéis frontais de aparelhos como caixas eletrônicos impressoras a laser e máquinas de fax que necessitam mostrar uma quantidade limitada de informação Eles são fáceis de Capítulo oito Memória e Sistemas de IO 759 se interligar com um microcontrolador através da porta paralela RS232 ou interfaces SPI A Crystalfontz America vende uma grande variedade de caracteres LCDs na faixa de 8 colunas por 1 linha até 40 colunas por 4 linhas com escolhas de cor luz de fundo operação 335 𝑉 e visibilidade em luz do dia Esses LCDs podem custar 20 ou mais em pequenas quantidades mas os preços caem abaixo de 5 quando o volume é grande Figura 849 LCD de caracteres Crystalfontz CFAH2002TMI 20x2 2012 Crystalfontz America Reimpresso com permissão Esta seção dá um exemplo de como realizar a interface de um microcontrolador 𝑃𝐼𝐶32 com um LCD de caracteres através de uma interface de 8bits paralela A interface é compatível com o padrão industrial para controladores de LCD 𝐻𝐷44780 originalmente desenvolvido pela Hitachi A Figura 849 mostra um LCD paralelo Crystalfontz 𝐶𝐹𝐴𝐻2002𝐴 𝑇𝑀𝐼 𝐽𝑇 20 2 A Figura 850 mostra o LCD conectado a um 𝑃𝐼𝐶32 através de uma interface paralela de 8bits A lógica opera a 5 𝑉 mas é compatível com entradas de 33 𝑉 do 𝑃𝐼𝐶32 O contraste do LCD é definido por uma segunda tensão produzida por um potenciômetro o LCD é usualmente mais legível quando esta tensão está na faixa de 4248 𝑉 O LCD recebe três sinais de controle 𝑅𝑆1 para caracteres 0 para instruções 𝑅𝑊 Capítulo oito Memória e Sistemas de IO 760 1 para leitura do display 0 para escrita e 𝐸se mantido em nível alto por pelo menos 250𝑛𝑠 ativa o LCD quando o próximo byte estiver pronto Quando a instrução é lida o bit 7 returna a flag busy indicando 1 quando ocupada e 0 quando o LCD está pronto para aceitar outra instrução No entanto certos passos de inicialização e a instrução clear requerem um delay especificado ao invés da verificação da flag busy Para inicializar o LCD o 𝑃𝐼𝐶32 deve escrever uma sequência de instruções para o LCD como mostrado abaixo Espera 1500𝜇𝑠 após 𝑉𝐷𝐷ser aplicada Escreve 0𝑥30 para definir o modo de 8 bits Espera 4100 𝜇𝑠 Escreve 0𝑥30 para definir o modo de 8 bits novamente Espera 100 𝜇𝑠 Escreve 0𝑥30 para definir o modo de 8 bits novamente Espera até a flag busy estar vazia Escreve 0𝑥3𝐶 para definir 2 linhas e fonte 5 8 Espera até a flag busy estar vazia Escreve 0𝑥08 para desligar o display Espera até a flag busy estar vazia Escreve 0𝑥01 para limpar o display Espera 1530 𝜇𝑠 Escreve 0𝑥06 para definir o modo de entrada para incrementar o cursor após cada caractere Espera até a flag busy estar vazia Escreve 0𝑥0𝐶 para ligar o display sem o cursor Então para escrever textos no LCD o microcontrolador pode enviar uma sequência de caracteres ASCII Ele pode também enviar as instruções 0𝑥01 para limpar o display ou 0𝑥02 para retornar para a posição inicial no canto superior esquerdo Capítulo oito Memória e Sistemas de IO 761 Figura 850 Interface paralela LCD Exemplo 826 CONTROLE DE LCD Escreva um programa que escreva I love LCDs num display de caracteres Solução O seguinte programa escreve I love LCDs no display Ele requer a função delaymicros do Exemplo 821 include P32xxxxh Capítulo oito Memória e Sistemas de IO 762 typedef enum INSTR DATA mode char lcdreadmode md char c TRISE 0xFFFF faz da PORTE70 entrada PORTCbitsRC14 md DATA define instruções ou modo de dados PORTCbitsRC13 1 modo de leitura PORTCbitsRC15 1 pulsa enable delaymicros10 espera resposta do LCD c PORTE 0x00FF lê um byte da porta E PORTCbitsRC15 0 desativa enable delaymicros10 espera resposta do LCD void lcdbusywaitvoid char state do state lcdreadINSTR ê instrução while state 0x80 repete ate flag busy estar limpor char lcdwritechar val mode md TRISE 0xFF00 fazer de PORTE70 saida PORTCbitsRC14 md DATA define instruções ou modo de dados PORTCbitsRC13 0 modo de escrita PORTE val valor a escrever Capítulo oito Memória e Sistemas de IO 763 PORTCbitsRC15 1 pulsa enable delaymicros10 espera resposta do LCD PORTCbitsRC15 0 desativa enable delaymicros10 espera resposta do LCD char lcdprintstringchar str whilestr 0 loop ate terminação null lcdwritestr DATA imprime esse caractere lcdbusywait str avança ponteiro para próximo caractere na string void lcdclearvoid lcdwrite0x01 INSTR limpa display delaymicros1530 espera execução void initlcdvoid set LCD control pins TRISC 0x1FFF PORTC1513 são saidas as outras entradas PORTC 0x0000 desativa todos os controles send instructions to initialize the display delaymicros15000 lcdwrite0x30 INSTR modo 8bit delaymicros4100 Capítulo oito Memória e Sistemas de IO 764 lcdwrite0x30 INSTR modo 8bit delaymicros100 lcdwrite0x30 INSTR modo 8bit ainda lcdbusywait lcdwrite0x3C INSTR seta 2 linhas fonte 5x8 lcdbusywait lcdwrite0x08 INSTR desliga display lcdbusywait lcdclear lcdwrite0x06 INSTR seta modo de entrada para incrementar cursor lcdbusywait lcdwrite0x0C INSTR liga display sem cursor lcdbusywait int mainvoid initlcd lcdprintstringI love LCDs Monitor VGA Uma opção mais flexível de display é dirigir a informação a um monitor de computador O padrão de monitor Video Graphics Array VGA foi introduzido em 1987 para os computadores 𝐼𝐵𝑀 𝑃𝑆2 com uma resolução de 640 480 pixel em um tubo de raios catódicos TRC e um conector de 15 pinos transmitindo informações de cores com tensões analógicas Monitores LCD modernos possuem maior resolução mas permanecem compatíveis com o padrão VGA Num tubo de raios catódicos um canhão de elétrons varre a tela da esquerda para a direita excitando material fluorescente para mostrar uma imagem TRC coloridos utilizam diferentes fósforos para as cores vermelho verde e azul e três feixes de elétrons A força de cada canhão de elétrons determina a intensidade de cada cor no pixel Ao final de cada linha de varredura o disparador deve ser interrompido para um intervalo de apagamento horizontal para retornar ao início da próxima linha Após todas as linhas Capítulo oito Memória e Sistemas de IO 765 de varredura estarem completas o canhão deve retornar novamente para um intervalo de apagamento vertical para retornar para o canto superior esquerdo O processo se repete cerca de 60 a 75 vezes por segundo para dar a ilusão visual de uma imagem permanente Num monitor VGA de 640 480 pixel atualizado a 5994 𝐻𝑧 o clock do pixel opera a 25175𝑀𝐻𝑧 então cada pixel dura 3972 𝑛𝑠 A tela cheia pode ser vista como 525 linhas de varredura de 800 pixels cada mas apenas 480 das linhas de varredura e 640 pixels por varredura verdadeiramente transmitem a imagem enquanto o restante é preto Uma linha de varredura inicia com uma back porch a seção branca na borda esquerda da tela Ela então contém 640 pixels seguidos por uma front porch na borda direita da tela e um pulso de sincronia horizontal hsync para rapidamente mover o canhão de volta para a borda esquerda A Figura 851 a mostra a temporização de cada uma dessas porções da linha de varredura começando com os pixels ativos Toda a linha de varredura possui 31778𝜇𝑠 Na direção vertical a tela inicia com uma back porch no topo seguida por 480 linhas de varredura ativas seguida por uma front porch na borda inferior e um pulso de sincronia vertical vsync para retornar ao topo e iniciar a próxima frame Uma nova frame é recomeçada 60 vezes por segundo A Figura 851 b mostra a temporização vertical note que as unidades de tempo são agora linhas de varredura ao invés de pixel clocks Resoluções maiores utilizam um pixel clock maior de até 388 𝑀𝐻𝑧 para 2048 1536 85 𝐻𝑧 Por exemplo 1024 768 60 𝐻𝑧 podem ser alcançados com um pixel clock de 65 𝑀𝐻𝑧 A temporização horizontal envolve um front porch de 24 clocks pulso hsync de 136 clocks e back porch de 160 clocks A temporização vertical envolve uma front porch de 3 linha vsync de 6 linhas e back porch de 29 linhas A Figura 852 mostra o pinout para um conector fêmea proveniente de uma fonte de vídeo Informações dos pixels são transportadas com três tensões analógicas para vermelho verde e azul Cada tensão está na faixa de 0 a 07 𝑉 com valores mais positivos indicando mais brilho As tensões devem ser 0 durante os front e back porches O cabo também fornece um link serial 𝐼2𝐶 para configurar o monitor O sinal de vídeo deve ser gerado em tempo real a uma alta velocidade o que é difícil para um microcontrolador mas fácil para um FPGA Um simples display preto e branco pode ser produzido levandose todos os três pinos de cores simultaneamente para 0 ou 07 𝑉 utilizando um divisor de tensão conectado a um pino de saída digital Um monitor cores por outro lado utiliza um DAC de vídeo com três conversores DA Capítulo oito Memória e Sistemas de IO 766 separados para independentemente conduzir os três pinos de cores A Figura 853 mostra uma FPGA conduzindo um monitor VGA através de um DAC de vídeo triplo de 8 bits 𝐴𝐷𝑉7125 O DAC recebe 8bits de R G e B da FPGA Ele também recebe o sinal SYNCb que é conduzido em ativo baixo quando HSYNC ou VSYNC são declarados O DAC de vídeo produz três saídas de corrente para conduzir as linhas analógicas vermelha verde e azul as quais são normalmente linhas de transmissões de 75 Ω paralelas terminadas tanto no DAC de vídeo quando no monitor O resistor 𝑅𝑆𝐸𝑇 define a escala da saída de corrente para alcançar toda a faixa de cores A taxa de clock depende da resolução e da taxa de refresh ela pode ser tão alta quanto 330 𝑀𝐻𝑧 usandose um DAC 𝐴𝐷𝑉7125𝐽𝑆𝑇𝑍330 Figura 851 Temporização do VGA a horizontal b vertical Capítulo oito Memória e Sistemas de IO 767 Figura 852 Pintout do conector VGA Figura 853 FPGA conduzindo cabo VGA através do vídeo DAC Capítulo oito Memória e Sistemas de IO 768 Exemplo 827 MONITOR VGA Escreva um código HDL para mostrar texto e uma caixa verde em um monitor VGA utilizando o circuito da Figura 853 Solução O código assume uma frequência de clock do sistema de 40 𝑀𝐻𝑧 e usa uma phase Locked Loop PLL na FPGA para gerar o clock de 25175 𝑀𝐻𝑧 do VGA A configuração PLL varia entre as FPGA Para o Cyclone III as frequências são especificadas com o megafunction wizard da Altera Alternativamente o clock pode ser fornecido diretamente de um gerador de sinais O controlador VGA conta através das colunas e linhas da tela gerando os sinais hsync e vsync nos tempos apropriados Ele também produz um sinal blankb que é declarado como nível baixo para ordenar a volta quando as coordenadas estiverem fora da região ativa de 640 480 O gerador de vídeo produz os valores das cores vermelho verde e azul baseado na atual localização 𝑥 𝑦 do pixel 00 representa o canto superior esquerdo O gerador desenha um conjunto de caracteres na tela junto com um retângulo verde O gerador de caracteres um caractere de 8 8 pixels dando uma dimensão de tela de 80 60 caracteres Ele procura o caractere na ROM onde é codificado em binário com 6 colunas e 8 linhas As outras duas colunas ficam em branco A ordem do bit é invertida pelo código em SystemVerilog pois a coluna mais à esquerda no arquivo na ROM é o bit mais significativo que deve ser escrito na posição 𝑥 menos significativa A Figura 854 mostra uma fotografia do monitor VGA enquanto esse programa está rodando As linhas de letras se alternam entre vermelho e azul Uma caixa verde sobrepõe parte da imagem module vgainput logic clk output logic vgaclk clock VGA 25175 MHz output logic hsync vsync output logic syncb blankb para monitor DAC output logic 70 r g b para video DAC Capítulo oito Memória e Sistemas de IO 769 logic 90 x y Usar PLL para criar o VGA pixel clock de 25175 MHz 25175 MHz clk period 39772 ns Tela possui 800 clocks de comprimento por 525 de altura mas apenas 640 x 480 usados para display HSync 139772 ns 800 31470 KHz Vsync 31474 KHz 525 5994 Hz 60 Hz taxa de refresh pll vgapllinclk0clk c0vgaclk gera sinais de temporização do monitor vgaController vgaContvgaclk hsync vsync syncb blankb x y modulo definido pelo usuário para determinar cor do pixel videoGen videoGenx y r g b endmodule module vgaController parameter HACTIVE 10d640 HFP 10d16 HSYN 10d96 HBP 10d48 HMAX HACTIVE HFP HSYN HBP VBP 10d32 VACTIVE 10d480 VFP 10d11 VSYN 10d2 VMAX VACTIVE VFP VSYN VBP input logic vgaclk output logic hsync vsync syncb blankb output logic 90 x y counters for horizontal and vertical positions always posedge vgaclk begin x if x HMAX begin x 0 y Capítulo oito Memória e Sistemas de IO 770 if y VMAX y 0 end end computa sinais sync ativo baixo assign hsync hcnt HACTIVE HFP hcnt HACTIVE HFP HSYN assign vsync vcnt VACTIVE VFP vcnt VACTIVE VFP VSYN assign syncb hsync vsync força saídas para black quando saem da area legal assign blankb hcnt HACTIVE vcnt VACTIVE endmodule module videoGeninput logic 90 x y output logic 70 r g b logic pixel inrect dada a posicao y escolher caractere para mostrar entao procurer o valor do pixel na ROM e mostrar em vermelho ou azul Tambem desenhar retangulo verde chargenrom chargenromby838d65 x20 y20 pixel rectgen rectgenx y 10d120 10d150 10d200 10d230 inrect assign r b y30 8pixel8h00 8h008pixel assign g inrect 8hFF 8h00 endmodule module chargenrominput logic 70 ch input logic 20 xoff yoff output logic pixel logic 50 charrom20470 gerador de caractere ROM logic 70 line uma linha lida de Capítulo oito Memória e Sistemas de IO 771 ROM inicializa ROM com caracteres do arquivo texto initial readmembcharromtxt charrom indexa ROM para encontrar linha do caractere assign line charromyoffch65 3b000 subtrai 65 pois A é entrada 0 ordem reversa de bits assign pixel line3d7xoff endmodule module rectgeninput logic 90 x y left top right bot output logic inrect assign inrect x left x right y top y bot endmodule charromtxt A ASCII 65 011100 100010 100010 111110 100010 100010 Capítulo oito Memória e Sistemas de IO 772 100010 000000 B ASCII 66 111100 100010 100010 111100 100010 100010 111100 000000 C ASCII 67 011100 100010 100000 100000 100000 100010 011100 000000 Capítulo oito Memória e Sistemas de IO 773 Figura 854 Saída VGA Comunicação Wireless Bluetooth Existem muitos padrões atualmente disponíveis para comunicação wireless incluindo Wifi ZigBee e Bluetooth Os padrões são elaborados e requerem circuitos integrados sofisticados mas uma crescente variedade de módulos esconde a complexidade e dá ao usuário uma interface simples para comunicação wireless Um desses módulos é o BlueSMiRF que é uma interface wireless Bluetooth fácil de usar que pode ser utilizada ao invés de um cabo serial Tabela 810 Classes Bluetooth Capítulo oito Memória e Sistemas de IO 774 Figura 855 Formas de onda FSK e GFSK Figura 856 Módulo BlueSMiRF e dongle USB Capítulo oito Memória e Sistemas de IO 775 Figura 857 Link Bluetooth PIC32 para PC O Bluetooth é um padrão wireless desenvolvido pela Ericsson em 1994 para comunicações de velocidade moderada e baixa potência em distâncias de 5 a 100 metros dependendo do nível de potência do transmissor Ele é comumente utilizado para conectar fones de ouvido a um telefone celular ou um teclado a um computador Ao contrário dos links de comunicação infravermelha ele não requer uma linha de direcionamento entre os dispositivos O Bluetooth opera na banda não licenciada de uso industrialcientíficomédico ISM em 24 𝐺𝐻𝑧 Ele define 79 canais de rádio espaçados de intervalos de 1 𝑀𝐻𝑧 partindo da frequência de 2402 𝑀𝐻𝑧 Ele salta entre esses canais em um padrão pseudoaleatório para evitar interferências consistentes com outros dispositivos Como dado na Tabela 810 transmissores Bluetooth são classificados em um de três níveis de potência o qual dita a faixa e o consumo de potência No modo da taxa básica ele opera a 1 𝑀𝑏𝑖𝑡𝑠 utilizando o chaveamento de frequência Gaussiana FSK No FSK ordinário cada bit é transportado ao transmitir uma frequência de 𝑓𝑐 𝑓𝑑 onde 𝑓𝑐 é a frequência central do canal e 𝑓𝑑 é um offset de pelo menos 115 𝑘𝐻𝑧 A transição abrupta em frequências entre os bits consome larguras de banda extras Na FSK Gaussiana a mudança na frequência é suavizada para fazer melhor uso do espectro A Figura 855 mostra as frequências sendo transmitidas por uma sequência de 0𝑠 e 1𝑠 num canal de 2402 𝑀𝐻𝑧 utilizandose FSK e GFSK Capítulo oito Memória e Sistemas de IO 776 O módulo BueSMiRF Silver mostrado na Figura 856 contém um rádio Bluetooth de Classe 2 modem e circuitos de interface com um pequeno cartão com interface serial Ele comunica com outro dispositivo Bluetooth como um Bluetoth USB dongle conectado ao PC Então ele pode fornecer um link serial wireless entre um 𝑃𝐼𝐶32 e um PC similarmente ao link da Figura 843 mas sem o cabo A Figura 857 mostra um esquemático para esse link O pino TX do BlueSMiRF é conectado ao pino RX do 𝑃𝐼𝐶32 e viceversa Os pinos RTS e CTS são conectados de modo que o BlueSMiRF não necessita de handshaking O BlueSMiRF trabalha por padrão em 1152 𝑘𝑏𝑎𝑢𝑑 com 8 bits de dados 1 bit de stop e sem paridade ou controle de fluxo Ele opera em níveis lógicos de 33𝑉 não sendo necessário um transceiver 𝑅𝑆232 para realizar a conexão com outro dispositivo de 33𝑉 Para utilizar a interface plugue um dongle USB Bluetooth no PC Ligue o 𝑃𝐼𝐶32 e o BlueSMiRF O LED vermelho STAT irá piscar no BlueSMiRF indicando que está aguardando para realizar uma conexão Abra o ícone do Buetooth no PC utilize o Assistente para adicionar dispositivo Bluetooth para parear o dongle com o BlueSMiRF A senha padrão do BlueSMiRF é 1234 Anote qual a porta COM está atribuída ao dongle Então a comunicação pode prosseguir como se estivesse sendo feita por um cabo serial Note que o dongle tipicamente opera a 9600 baud e que o PuTTY deve estar configurado corretamente Controle de Motores Outra aplicação principal dos microcontroladores é controlar atuadores como motores Esta seção descreve três tipos de motores motores DC servo motores e motores de passo Os motores DC requerem uma grande quantidade de corrente então um driver de potência como uma Ponte H deve ser conectada entre o microcontrolador e o motor Ele também requer um encoder de eixo se o usuáro quiser saber qual é a posição atual do motor Os servos motores aceitam um sinal modulado por largura de pulso para especificar sua posição numa faixa limitada de ângulos Permitem realizar uma interface fácil mas não são potentes e não são adequados para rotação contínua Motores de passo aceitam uma sequência de pulsos cada um deles rodando o motor num ângulo fixo denominado de passo Eles são mais caros e necessitam de uma ponte H para fornecer corrente mas a sua posição pode ser precisamente controlada Capítulo oito Memória e Sistemas de IO 777 Os motores podem drenar uma quantidade substancial de corrente e podem introduzir pequenos picos na tensão de alimentação do circuito o que pode perturbar a lógica digital Um modo de reduzir isso é utilizar uma fonte de alimentação diferente ou uma bateria para o motor e outra para o circuito de lógica digital Figura 858 Motor DC Motores DC A Figura 858 mostra a operação de um motor DC com escovas O motor é um dispositivo de dois terminais Ele contém imãs permanentes estacionários que formam o estator e um eletroímã rotativo chamado rotor ou armadura conectado ao eixo A frente do rotor é conectada a um anel metálico dividido chamado comutador Escovas de metal conectadas aos terminais de potência terminais de entrada são esfregadas contra o coletor fornecendo corrente ao eletroímã do rotor Isso induz um campo magnético no rotor que faz com que o rotor Capítulo oito Memória e Sistemas de IO 778 gire para permanecer alinhado com o campo do estator Uma vez que o rotor tenha girado uma parte do caminho e se aproximado do alinhamento com o estator as escovas tocam os lados opostos do coletor revertendo o fluxo de corrente e de campo magnético e fazendo com que o motor continue girando indefinidamente Os motores DC tendem a girar a milhares de rotações por minuto RPM a um torque muito pequeno A maioria dos sistemas adiciona um trem de engrenagens para reduzir a velocidade a um nível mais razoável e aumentar o torque Procure por um trem de engrenagens projetado para ser acoplado a seu motor A Pittman fabrica uma grande variedade de motores DC de alta qualidade e de acessórios enquanto os motores baratos de brinquedos são populares entre os hobbystas Um motor DC requer tensões e correntes substanciais para fornecer potência significativa para uma carga A corrente deve ser reversível se o motor tiver a capacidade de girar em ambas as direções A maioria dos microcontroladores não pode produzir corrente suficiente para alimentar um motor DC diretamente Ao invés disso eles utilizam uma Ponte H que conceitualmente contém quatro chaves eletricamente controladas como mostrado na Figura 859 a Se a chave A e D estão fechadas a corrente flui da esquerda para a direita através do motor e o faz girar numa direção Se as chaves B e C estão fechadas a corrente flui da direita para a esquerda através do motor fazendoo girar na outra direção Se A e C ou B e D estão fechadas a tensão através do motor é forçada a 0 fazendo com que o motor freie ativamente Se nenhuma das chaves está fechada o motor irá parar naturalmente As chaves numa ponte H são transístores de potência A ponte H também contém alguma lógica digital para convenientemente controlar as chaves Quando a corrente no motor muda abruptamente a indutância do eletroímã do motor induz uma alta tensão que pode exceder a tensão de alimentação e danificar os transístores de potência Portanto muitas pontes H também possuem diodos de proteção em paralelo às chaves como mostrado na Figura 859 b Se o pico indutivo é conduzido tanto ao terminal do motor acima de 𝑉𝑚𝑜𝑡𝑜𝑟 ou abaixo da terra os diodos entram em condução e grampeiam a tensão a um nível seguro As pontes H podem dissipar grandes quantidades de potência então um dissipador de calor pode ser necessário para mantêla fria Capítulo oito Memória e Sistemas de IO 779 Exemplo 828 VEÍCULO AUTÔNOMO Projete um sistema no qual um 𝑃𝐼𝐶32 controla dois drives de motores para um carro robótico Escreva uma biblioteca de funções para inicializar o driver do motor e para fazer o carro ir para frente para trás virar para esquerda ou para a direita e parar Use PWM para controlar a velocidade dos motores Figura 859 Ponte H Capítulo oito Memória e Sistemas de IO 780 Figura 860 Controle de motor com ponte H dual Tabela 811 Controle de ponte H Capítulo oito Memória e Sistemas de IO 781 Solução A Figura 860 mostra um par de motores DC controlados por um 𝑃𝐼𝐶32 utilizando uma ponte H dupla da Texas Instruments 𝑆𝑁754410 A ponte H requer uma alimentação lógica 𝑉𝐶𝐶1 de 5 𝑉 e uma tensão nos motores 𝑉𝐶𝐶2 de 45 a 36 𝑉 Ela tem 𝑉𝐼𝐻 2𝑉 e consequentemente é compatível com a IO de 33 𝑉 do 𝑃𝐼𝐶32 Ela pode entregar até 1 𝐴 de corrente para cada um dos motores A Tabela 811 descreve como as entradas de cada ponte H controla um motor O microcontrolador aciona os sinais de ativação com um sinal PWM para controlar a velocidade dos motores Ele aciona os quatro outros pinos para controlar a direção de cada motor O PWM é configurado para trabalhar a cerca de 781 𝐻𝑧 com um duty cycle variando entre 0 e 100 include P32xxxxh void setspeedint dutycycle OC1RS dutycycle ativa duty cycleentre 0 e 100 void setmotorleftint dir dir de 1 frente 0 trás PORTDbitsRD1 dir PORTDbitsRD2 dir void setmotorrightint dir dir de 1 frente 0 trás PORTDbitsRD3 dir PORTDbitsRD4 dir void forwardvoid setmotorleft1 setmotorright1 ambos os motores para frente void backwardvoid setmotorleft0 setmotorright0 ambos os motores para trás Capítulo oito Memória e Sistemas de IO 782 void leftvoid setmotorleft0 setmotorright1 esquerda para trás direita para frente void rightvoid setmotorleft1 setmotorright0 direita para trás esquerda para frente void haltvoid PORTDCLR 0x001E turn both motors off by clearing RD41 to 0 void initmotorsvoid TRISD 0xFFE0 RD40 sao saídas halt garantir que motores nao estao girando configura PWM em OC1 RD0 T2CONbitsTCKPS 0b111 prescale de 256 para 78125 KHz PR2 99 seta período para 991 ticks 78125 Hz OC1RS 0 inicia com sinal de enable baixo para Hbridge OC1CONbitsOCM 0b110 ativa modulo de comparação de saída 1 para PWM mode T2CONbitsON 1 ativa timer 2 OC1CONbitsON 1 ativa PWM Capítulo oito Memória e Sistemas de IO 783 Figura 861 Codificador de eixo a disco b saídas em quadratura No exemplo anterior não existe um modo de medir a posição de cada motor É improvável que dois motores sejam exatamente iguais então é provável que um gire ligeiramente mais rápido do que o outro fazendo com que o robô se desvie do curso Para resolver esse problema alguns sistemas adicionam codificadores de eixo A Figura 861 a mostra um simples codificador de eixo consistindo de um disco com slots conectados ao eixo do motor Um LED é colocado em um lado e um sensor de luminosidade no outro lado O codificador de eixo produz um pulso a cada vez que o vão passa pelo LED Um microcontrolador pode contar esses pulsos para medir o ângulo total percorrido pelo eixo Utilizando dois pares LEDsensor espaçados de pelo menos metade da largura do slot um codificador de eixo improvisado pode produzir saídas em quadratura mostradas na Figura 861 b que indicam a direção que o eixo está girando bem como o ângulo para o qual ele está se movendo Algumas vezes são adicionados aos codificadores de eixo outro furo para indicar quando o eixo está em sua posição de índice Servo Motor Um servo motor é um motor DC integrado com um sistema de engrenagens um codificador de eixo e lógica de controle sendo ele mais fácil de se utilizar Eles possuem rotação limitada de tipicamente 180 A Figura 862 mostra um servo com a tampa removida para revelar as engrenagens Um servo motor possui uma interface de três pinos com alimentação tipicamente 5 𝑉 terra e entrada de controle A entrada de controle é tipicamente um sinal de 50 𝐻𝑧 modulado em largura de pulso O sistema de controle lógico do Capítulo oito Memória e Sistemas de IO 784 servo conduz o eixo para uma posição determinada pelo duty cycle da entrada de controle O codificador de eixo do servo é tipicamente um potenciômetro rotativo que produz uma tensão dependente da posição do eixo Figura 862 Servo motor SG90 Num servo motor típico com 180 graus de rotação uma largura de pulso de 05 𝑚𝑠 conduz o eixo para 0 15 𝑚𝑠 para 90 e 25 𝑚𝑠 para 180 Por exemplo a Figura 863 mostra um sinal de controle com uma largura de pulso de 15 𝑚𝑠 Levar o servo para fora de sua faixa de movimento pode causar danos mecânicos A potência do servo vem do pino de alimentação e não do pino de controle então o controle pode ser conectado diretamente a um microcontrolador sem o uso de uma ponte H Servo motores são comumente utilizados em aeromodelos controlados por controle remoto e pequenos robôs pois eles são pequenos leves e convenientes Encontrar um motor com um datasheet adequado pode ser difícil O pino central com um fio vermelho é normalmente de alimentação e o fio preto ou marrom normalmente é a terra Figura 863 Forma de onda de controle do servo Capítulo oito Memória e Sistemas de IO 785 Exemplo 829 SERVO MOTOR Projete um sistema com um microcontrolador 𝑃𝐼𝐶32 conduzindo um servo motor para um ângulo desejado Figura 864 Controle de servo motor Solução A Figura 864 mostra um diagrama de conexões para um servo motor 𝑆𝐺90 O servo opera com uma tensão de alimentação de 40 72 𝑉 Apenas um único fio é necessário para conduzir o sinal PWM o qual pode ser fornecido em níveis de 5 ou 33 𝑉 O código configura a geração de PWM utilizando o módulo de comparação de saída 1 e define o duty cycle apropriado para o ângulo desejado include P32xxxxh void initservovoid configura PWM em OC1 RD0 T2CONbitsTCKPS 0b111 prescale de 256 para 78125 KHz PR2 1561 define período para 1562 ticks 50016 Hz 20 ms OC1RS 117 define largura de pulso para 15 ms para centro do servo OC1CONbitsOCM 0b110 define modo de comparação de Capítulo oito Memória e Sistemas de IO 786 saída 1 para modo PWM T2CONbitsON 1 ativa timer 2 OC1CONbitsON 1 ativa PWM void setservoint angle if angle 0 angle 0 Angulo deve estar na faixa de 0180 graus else if angle 180 angle 180 OC1RS 39angle1561180 define largura de pulso de 39195 ticks 0525 ms baseado no angulo Também é possível converter um servo normal num servo de rotação contínua cuidadosamente o desmontando removendo a trava de parada mecânica e substituindo o potenciômetro por um divisor de tensão fixo Muitos websites mostram instruções detalhadas para alguns servos particulares O PWM irá então controlar a velocidade ao invés da posição com 15 𝑚𝑠 indicando parada 25 𝑚𝑠 indicando velocidade total num sentido e 05 𝑚𝑠 indicando velocidade total no sentido contrário Um servo de rotação contínua pode ser mais conveniente e mais barato do que um motor DC simples combinado com uma ponte H e um trem de engrenagens Motor de Passo Um motor de passo avança em passos discretos conforme pulsos são aplicados às entradas alternadas A dimensão do passo é de normalmente poucos graus permitindo posicionamento preciso e rotação contínua Motores de passo menores geralmente vêm com dois conjuntos de bobinas chamadas fases enroladas em modo bipolar ou unipolar Motores bipolares são mais potentes e menos caros para um determinado tamanho mas necessitam de uma ponte H enquanto motores unipolares podem ser conduzidos por transístores agindo como chaves Essa seção foca no motor de passo mais eficiente o bipolar Capítulo oito Memória e Sistemas de IO 787 A Figura 865 a mostra um motor bipolar simplificado com uma dimensão de passo de 90 O rotor é um ímã permanente com um polo norte e um polo sul O estator é um eletroímã com dois pares de bobinas compondo as duas fases Motores bipolares de duas fases portanto possuem quatro terminais A Figura 865 b mostra o símbolo para o motor de passo modelando as duas bobinas como indutores A Figura 866 mostra três sequências comuns de condução para um motor bipolar de duas fases A Figura 866 a ilustra um wave drive no qual as bobinas são energizadas na sequência AB CD BA DC Note que BA significa que o enrolamento AB é energizado com corrente fluindo na direção oposta Essa é a origem do nome bipolar O rotor gira 90 graus a cada passo A Figura 866 b ilustra o twophaseon drive seguindo o padrão AB CD BA CD BA DC AB DC AB CD indica que ambos os enrolamentos e CD são energizados simultaneamente O rotor novamente gira 90 graus a cada passo mas se alinha à metade do caminho entre as posições dos dois polos Isso resulta em um maior torque de operação pois ambos os enrolamentos estão entregando potência de uma vez só A Figura 866 c ilustra o halfstep drive seguindo o padrão AB CD CD BA CD BA BA DC DC AB DC AB O rotor gira 45 graus a cada meio passo A taxa à qual cada padrão avança determina a velocidade do motor Para inverter a direção do motor as mesmas sequências são aplicadas mas na ordem inversa Em um motor real o rotor possui muitos polos para fazer o ângulo entre passos menor Por exemplo a Figura 867 mostra o AIRPAX LB82773M1 um motor de passo bipolar com um tamanho de passo de 75 graus O motor opera com 5 𝑉 e drena 08 𝐴 através de cada enrolamento O torque no motor é proporcional à corrente nos enrolamentos Essa corrente é determinada pela tensão aplicada pela indutância 𝐿 e pela resistência 𝑅 da bobina O modo mais simples de operação é chamado drive direto de tensão ou LR drive no qual a tensão 𝑉 é diretamente aplicada ao enrolamento A corrente aumenta até 𝐼 𝑉𝑅 com uma constante de tempo determinada por 𝐿𝑅 como mostrado na Figura 868 a Ele trabalha bem para operações em baixa velocidade No entanto em altas velocidades a corrente não possui tempo suficiente para atingir o nível completo como mostrado na Figura 868 b e o torque cai Um modo mais eficiente de controlar um motor de passo é pela modulação em largura de pulso de uma tensão maior A alta tensão faz com que a corrente se eleve mais rapidamente sendo então desligada PWM para evitar a sobrecarga do motor A tensão é então modulada ou recortada para manter a corrente perto do nível desejado Isso é chamado drive de recorte constante de tensão e é mostrado naFigura 868 c O Capítulo oito Memória e Sistemas de IO 788 controlador utiliza um pequeno resistor em série com o motor como sensor de corrente sendo aplicada através da medição da queda de tensão no resistor e aplica um sinal de ativação para que a ponte H desligue o drive quando a corrente atingir o nível desejado A princípio um microcontrolador poderia gerar as formas de ondas corretas mas é mais fácil utilizar um controlador de motor de passo O controlador 𝐿297 da ST Microelectronics é uma escolha conveniente especialmente quando acoplado à ponte H dual 𝐿298 que tem pinos sensíveis à corrente e uma capacidade de potência de 2 𝐴 de pico Infelizmente o 𝐿298 não está disponível em encapsulamento DIP sendo difícil de conectálo a uma breadboard As STs Application Notes 𝐴𝑁460 e 𝐴𝑁470 são valiosas referências para projetistas de motores de passo Figura 865 a Motor de passo bipolar simplificado b símbolo do motor de passo Capítulo oito Memória e Sistemas de IO 789 Figura 866 Drive de motor bipolar Figura 867 Motor de passo bipolar AIRPAX LB82773M1 Capítulo oito Memória e Sistemas de IO 790 Figura 868 Drive de corrente direta de motor de passo bipolar a baixa rotação b alta rotação c alta rotação com drive chopper Exemplo 830 CONTROLE POR ONDA DIRETA DE MOTOR DE PASSO BIPOLAR Projete um sistema no qual um microcontrolador 𝑃𝐼𝐶32 controla um motor de passo bipolar AIRPAX a uma velocidade e direção especificadas utilizando direct drive Solução A Figura 869 mostra um motor de passo bipolar sendo conduzido diretamente por uma ponte H controlada por um 𝑃𝐼𝐶32 Capítulo oito Memória e Sistemas de IO 791 A função spinstepper inicializa o array de sequência com os padrões a serem aplicados em 𝑅𝐷4 0 para ser seguida a sequência de drive direto Ela aplica o padrão seguinte na sequência então espera o tempo suficiente para rotacionar à taxa desejada de revoluções por minuto RPM Utilizandose um clock de 20 𝑀𝐻𝑧 e uma dimensão de passo de 75 graus com um timer de 16 bits e um prescalar de 256 1 a faixa factível de velocidades é 2 230 𝑟𝑝𝑚 com a extremidade inferior limitada pela resolução do timer e a extremidade superior limitada pela potência do motor 𝐿𝐵82773 𝑀1 Figura 869 Drive direto de motor de passo bipolar com ponte H Capítulo oito Memória e Sistemas de IO 792 include P32xxxxh define STEPSIZE 75 tamanho do passo em graus int curstepstate procura o estado atual do motor de passo na sequencia void initsteppervoid TRISD 0xFFE0 RD40 sao saidas curstepstate 0 T1CONbitsON 0 desliga Timer1 T1CONbitsTCKPS 3 prescale de 256 para rodar mais devagar void spinstepperint dir int steps float rpm dir 0 para frente 1 reverso int sequence4 0b00011 0b01001 0b00101 0b10001 int step sequência wave drive PR1 int200e62563600STEPSIZErpm600 tempopasso c 20 MHz peripheralclock TMR1 0 T1CONbitsON 1 liga Timer1 for step 0 step steps step Capítulo oito Memória e Sistemas de IO 793 toma o numero especificado de passos PORTD sequencecurstepstate aplica controle de passo atual if dir 0 curstepstate curstepstate 1 4 determina o proximo estado frente else curstepstate curstepstate 3 4 determina o proximo estado tras while IFS0bitsT1IF espera o overflow do timer IFS0bitsT1IF 0 limpa flag de overflowg T1CONbitsON 0 desliga Timer1 para economizar energia quando concluído 87 SISTEMAS IO DO PC Os computadores pessoais PC utilizam uma grande variedade em protocolos IO para propósitos que incluem memória discos redes cartões de expansão interna e dispositivos externos Esses padrões IO evoluíram para oferecer desempenhos muito elevados e para facilitar aos usuários a adição de dispositivos Esses atributos vieram à custa da complexidade nos protocolos IO Essa seção explora os principais padrões IO utilizados em PC e examina algumas opções para conectar um PC a um circuito lógico digital customizado ou outro hardware externo A Figura 870 mostra a placamãe de um PC para um processador com Core 𝑖5 ou 𝑖7 O processador é encapsulado num land grid array com 1156 pads banhados a ouro para fornecer tensão de alimentação e terra Capítulo oito Memória e Sistemas de IO 794 para o processador e conectálo à memória e aos dispositivos IO A placamãe contém os slots de módulos de memória DRAM uma grande variedade de conectores de dispositivos IO um conector para a fonte de alimentação reguladores de tensão e capacitores Um par de módulos DRAM são conectados através de uma interface 𝐷𝐷𝑅3 Periféricos externos como teclados ou webcams são conectados através da USB Cartões de expansão de alto desempenho como placas gráficas são conectadas através do slot PCI Express x16 enquanto placas de menor desempenho podem utilizar os slots PCI Express x1 ou os mais antigos O PC se conecta à rede utilizando o jack Ethernet O disco rígido é conectado a uma porta SATA O restante desta seção dá uma visão geral da operação de cada um desses padrões IO Figura 870 Placamãe Gigabyte GAH55MS2V Um dos maiores avanços nos padrões IO dos PC tem sido o desenvolvimento de links seriais de alta velocidade Até recentemente a maioria dos dispositivos IO era construída ao redor de links paralelos consistindo de um grande barramento de dados e um sinal de clock Conforme a taxa de dados aumentava Capítulo oito Memória e Sistemas de IO 795 a diferença entre os atrasos nos fios do barramento definiam um limite para o quão rápido o barramento podia trabalhar Mais ainda barramentos conectados a múltiplos dispositivos sofriam na linha de transmissão problemas como reflexões e temporizações diferentes para diferentes cargas Ruído também pode corromper os dados Links seriais ponto a ponto eliminam muitos desses problemas O dado é usualmente transmitido num par diferencial de fios Os ruídos externos que afetam ambos os fios com a mesma intensidade não são importantes As linhas de transmissão são simples de serem encerradas então reflexões são pequenas Veja Seção A8 em linhas de transmissão Nenhum clock é enviado explicitamente Ao invés disso o clock é recuperado no receptor através da análise da temporização da transição dos dados O projeto de links seriais de alta velocidade é um assunto especializado mas boas interfaces podem rodar a mais de 10 𝐺𝑏𝑠 através de fios de cobre e a taxas ainda mais rápidas através de fibras óticas 871 USB Até o meio da década de 1990 adicionar um periférico a um PC requeria algum conhecimento técnico Para adicionar cartões de expansão era necessário abrir a caixa colocar os jumpers nas posições corretas e manualmente instalar um driver de dispositivos Adicionar um dispositivo 𝑅𝑆232 requeria escolher o cabo correto e apropriadamente configurar a taxa de transmissão e os bits de dados de paridade e de stop O Barramento Universal Serial Universal Serial Bus USB desenvolvido pela Intel IBM Microsoft e outros simplificou grandemente a adição de novos periféricos através da padronização dos cabos e dos processos de configuração do software Bilhões de periféricos USB são vendidos por ano atualmente O USB 10 foi lançado em 1996 Ele utiliza um cabo simples com quatro fios 5 𝑉 𝐺𝑁𝐷 e um par diferencial de fios para carregar dados O cabo é impossível de ser conectado para trás ou de cabeça para baixo Ele opera em até 12 𝑀𝑏𝑠 Um dispositivo pode puxar até 500 𝑚𝐴 de corrente da porta USB então teclados mouses e outros periféricos podem ser alimentados através da porta ao invés de baterias ou cabos separados de alimentação O USB 20 lançado em 2000 atualizou a velocidade para 480 𝑀𝑏𝑠 executando os fios diferenciais muito mais rápido Com o link mais rápido o USB se tornou prático para conectar webcams e discos rígidos externos As pen drive flash com interface USB também substituíram os discos flexíveis como meios de transferência de arquivos entre computadores Capítulo oito Memória e Sistemas de IO 796 O USB 30 lançado em 2008 aumentou ainda mais a velocidade para 5 𝐺𝑏𝑠 Ele usa a mesma forma de conector mas o cabo possui mais fios que operam a uma velocidade muito alta É mais adequado para conectar discos rígidos de alta performance Mais ou menos ao mesmo tempo o USB adicionou uma qspecificação de carregamento de bateria que impulsionou a alimentação através da porta para aumentar a velocidade do carregamento de dispositivos móveis A simplicidade para o usuário vem com o preço de uma implementação muito mais complexa de hardware e software Construir uma interface USB do zero é uma grande empreitada Mesmo escrever um simples driver de dispositivo é moderadamente complexo O 𝑃𝐼𝐶32 vem com um controlador USB embutido No entanto o driver de dispositivos da Microchip para conectar um mouse ao 𝑃𝐼𝐶32 disponível em microchipcom possui mais de 500 linhas de código e está além do escopo deste Capítulo 872 PCI e PCI Express O barramento Peripheral Component Interconnect PCI é um barramento de expansão desenvolvido pela Intel que se tornou muito difundido em meados de 1994 Ele era utilizado para adicionar cartões de expansão como portas USB ou seriais extras interfaces de rede placas de som modems controladores de disco ou placas de vídeo O barramento paralelo de 32 bits opera a 33 𝑀𝐻𝑧 dando uma largura de banda de 133 𝑀𝐵𝑠 A demanda pelos cartões de expansão PCI vem caindo constantemente Mais portas padrão como Ethernet e SATA são agora integrados à placamãe Muitos dispositivos que antes necessitavam de um cartão de expansão podem agora ser conectados através de um rápido link USB 20 ou 30 E placas de vídeo atualmente requerem muito mais largura de banda do que a PCI pode fornecer Placasmãe contemporâneas frequentemente ainda possuem um pequeno número de slots PCI mas dispositivos rápidos como placas de vídeo agora são conectadas via PCI Express PCIe Slots PCI Express fornecem uma ou mais vias de links seriais de alta velocidade No PCIe 30 cada via opera em até 8 𝐺𝑏𝑠 A maioria das placasmãe fornece um slot x16 com 16 vias resultando n um total de 16 𝐺𝐵𝑠 de largura de banda para dispositivos com grande exigência de dados como as placas de vídeo Capítulo oito Memória e Sistemas de IO 797 873 Memórias DDR3 A DRAM é conectada ao microprocessador através de um barramento paralelo Em 2012 o padrão atual é o 𝐷𝐷𝑅3 a terceira geração de barramentos de memória de taxa de dados double operando a 15 𝑉 Placas mãe típicas agora vêm com dois canais 𝐷𝐷𝑅3 de modo que podem acessar dois bancos de memórias simultaneamente A Figura 871 mostra um módulo de memória do tipo dual inline DIMM 𝐷𝐷𝑅3 4𝐺𝐵 O módulo possui 120 contatos de cada lado com um total de 240 conexoes incluindo um barramento de dados de 64bits Um barramento de endereços multiplexados em tempo de 16bits sinais de controle e vários pinos de alimentação e terra Em 2012 as DIMM tipicamente carregavam de 1 a 16GB de DRAM A capacidade de memória vem sendo dobrada a aproximadamente 2 ou 3 anos Figura 871 Módulo de memória DDR3 Atualmente a 𝐷𝑅𝐴𝑀 opera a uma taxa de clock de 100 a 266 𝑀𝐻𝑧 A 𝐷𝐷𝑅3 opera o barramento de memória a quatro vezes a taxa de clock da DRAM Mais ainda ela transfere os dados em ambas as bordas de subida e descida do clock Consequentemente ela envia 8 palavras de dado para cada clock da memória A 64 bitspalavra isso correspond e a 6417 𝐺𝐵𝑠 de largura de banda Por exemplo a 𝐷𝐷𝑅3 1600 utiliza um clock de memória de 200 𝑀𝐻𝑧 e um clock IO de 800 𝑀𝐻𝑧 para enviar 16 bilhão de palavras por segundo ou 12800 𝑀𝐵𝑠 Consequentemente os módulos são também chamados 𝑃𝐶3 12800 Infelizmente a latência da DRAM permanece alta com cerca de 50 𝑛𝑠 de atraso da leitura de uma requisição até a chegada da primeira palavra de dados Capítulo oito Memória e Sistemas de IO 798 874 Rede Computadores se conectam à Internet através de uma interface de rede rodando o Transmission Control Protocol e Internet Protocol TCPIP A conexão física pode ser um cabo Ethernet ou um link wireless Wifi Tabela 812 Protocolos WiFi 80211 A Ethernet é definida pelo padrão 𝐼𝐸𝐸𝐸 8023 Ele foi desenvolvido pelo Xerox Palo Alto Research Center PARC em 1974 Foi originalmente operado a 10 𝑀𝑏𝑠 denominado 10 Mbit Ethernet mas agora é comumente encontrado a 100 𝑀𝑏𝑠 e 1 𝐺𝑏𝑠 rodando em cabos de Categoria 5 contendo 4 pares de fios O padrão Ethernet de 10 𝐺𝑏𝑖𝑡 com cabos de fibra ótica vem se tornando crescentemente popular em servidores e outros tipos de computação de alta performance e a Ethernet 100 𝐺𝑏𝑖𝑡 está emergindo WiFi é o nome popular para o padrão de redes wireless 𝐼𝐸𝐸𝐸 80211 Ele opera nas bandas wireless não licenciadas de 24 e 5 𝐺𝐻𝑧 o que significa que o usuário não necessita de uma licença de operador de rádio para transmitir nessas bandas a potência reduzida A Tabela 812 resume as capacidades das três gerações de WiFi o padrão emergente 80211𝑎𝑐 promete empurrar as taxas wireless para acima de 1 𝐺𝑏𝑠 O desempenho crescente vem dos avanços na modulação e no processamento de sinais múltiplas antenas e maiores largura de bandas dos sinais Capítulo oito Memória e Sistemas de IO 799 875 SATA Discos rígidos internos requerem uma rápida interface com o PC Em 1986 a Western Digital introduziu a interface Integrated Drive Electronics IDE que evoluiu para o padrão AT Attachment ATA O padrão utiliza um volumoso cabo de fita de 40 ou 80 fios com um comprimento máximo de 18 para enviar dados a 16 133 𝑀𝐵𝑠 Figura 872 Cabo SATA O padrão ATA vem sendo substituído pelo Serial ATA SATA que utiliza links seriais de alta velocidade para trabalhar a 15 3 ou 6 𝐺𝑏𝑠 utilizando um mais conveniente cabo de 7condutores mostrado na Figura 872 Os drives em estado sólido mais rápidos em 2012 se aproximaram de 500 𝑀𝐵𝑠 de largura de banda tomando plena vantagem da interface SATA Um padrão relacionado é o Serial Attached SCSI SAS uma evolução da interface SCSI paralela Small Computer System Interface A SAS oferece um desempenho comparado ao SATA e aceita cabos maiores É mais comum em servidores de computadores 876 Interface com o PC Todos os padrões IO do PC descritos até agora são otimizados para alto desempenho e facilidade de ligação mas são difíceis de serem implementadas em hardware Engenheiros e cientistas frequentemente precisam de um modo de conectar um PC a circuitos externos como sensores atuadores microcontroladores ou FPGA A Capítulo oito Memória e Sistemas de IO 800 conexão serial descrita na Seção 863 é suficiente para uma conexão de baixa velocidade com um microcontrolador com uma UART Essa seção descreve dois outros modos sistemas de aquisição de dados e links USB Sistemas de Aquisição de Dados Os Sistema de Aquisição de Dados DAQ conectam um computador ao mundo real utilizando múltiplos canais de entradas analógicas eou digitais Os DAQ são agora comumente disponíveis como dispositivos USB fazendo com que sejam simples de serem instalados A National Instruments NI é uma fabricante líder no ramo dos DAQ Figura 873 NI myDAQ Figura 874 Cabo FTDI USB para MPSSE Capítulo oito Memória e Sistemas de IO 801 Os preços dos DAQ de alta performance tendem a milhares de dólares principalmente porque o mercado é pequeno e possui concorrência limitada Felizmente a partir de 2012 a NI tem vendido seu sistema myDAQ com um desconto para estudantes de 200 incluindo o software LabView A Figura 873 mostra um myDAQ Ele possui dois canais analógicos com capacidade de entrada e saída a 200 ksampless com 16bits de resolução e uma faixa dinâmica de 10 𝑉 Esses canais podem ser configurados para operarem como um osciloscópio e gerador de sinais Ele também possui oito linhas digitais de entradas e saídas compatíveis com sistemas de 33 e 5 𝑉 Mais ainda ele gera saídas de alimentação de 5 15 e 15 𝑉 e inclui um multímetro digital capaz de medir tensão corrente e resistência Então o myDAQ pode substituir uma bancada inteira de testes e equipamentos de medição enquanto simultaneamente oferece data logging automático A maioria dos NI DAQ são controlados com o LabVIEW a linguagem gráfica da NI para o projeto de sistemas de controle e de medição Alguns DAQ também podem ser controlados através de programas em C utilizando se o ambiente LabWindows de aplicações em Microsoft NET utilizando o ambiente Measurement Studio ou do Matlab usando o Toolbox Data Acquisition Links USB Uma crescente variedade de produtos agora disponibiliza links digitais entre PC e hardware externo através de USB simples e baratos Esses produtos contêm drivers e bibliotecas prédesenvolvidos permitindo ao usuário facilmente escrever um programa no PC que intercambie dados entre o PC e uma FPGA ou microcontrolador Capítulo oito Memória e Sistemas de IO 802 Figura 875 Interface do C232HMDDHSL USB para MPSESE do PC para FPGA Figura 876 Módulo FTDI UM232H A FTDI é líder em vendas de tais sistemas Por exemplo o cabo USB para MPSSE 𝐹𝑇𝐷𝐼 𝐶232𝐻𝑀 𝐷𝐷𝐻𝑆𝐿 mostrado na Figura 874 fornece um jack USB numa extremidade e na outra extremidade uma interface SPI operando a até 30 𝑀𝑏𝑠 juntamente com uma alimentação de 33 𝑉 e quatro pinos IO de propósito geral A Figura 875 mostra um exemplo de conexão entre um PC e uma FPGA utilizando esse cabo Capítulo oito Memória e Sistemas de IO 803 O cabo pode opcionalmente alimentar o FPGA com 33 𝑉 Os três pinos SPI são conectados a um dispositivo FPGA escravo como aquele do Exemplo 819 A figura também mostra um dos pinos GPIO usado para controlar um LED O PC requer que o controlador de biblioteca dinamicamente ligada 𝐷2𝑋𝑋 esteja instalado Você pode então escrever um programa em C utilizando a biblioteca para enviar dados através do cabo Se uma conexão ainda mais rápida é necessária o módulo 𝐹𝑇𝐷𝐼 𝑈𝑀232𝐻 mostrado na Figura 876 liga a porta USB do PC a uma interface paralela síncrona de 8bits operando a até 40 𝑀𝐵𝑠 88 PERSPECTIVA DO MUNDO REAL MEMÓRIA X86 E SISTEMAS IO Conforme um processador fica mais rápido ele necessita sempre de uma hierarquia de memória mais elaborada para manter um suprimento permanente de dados e o fluxo de instruções Esta seção descreve os sistemas de memória dos processadores 𝑥86 para ilustrar essa progressão A Seção 79 contém fotografias dos processadores destacando as caches onchip Os 𝑥86 também possuem um sistema de IO programada invulgar que difere das IO mais comuns mapeadas na memória 881 Sistemas de Cache x86 O 80386 inicialmente produzido em 1985 operava a 16 𝑀𝐻𝑧 Ele não tinha cache então acessava diretamente a memória principal para todas as instruções e dados Dependendo da velocidade da memória o processador poderia ter uma resposta imediata ou teria que que fazer uma pausa de um ou mais ciclos para a memória reagir Esses ciclos são chamados estados de espera e aumentam a CPI do processador As frequências de clock dos microprocessadores têm crescido pelo menos 25 por ano desde então enquanto a latência de memória dificilmente vem diminuíndo O atraso de quando o processador envia um endereço para a memória principal até a memória retornar o dado pode atualmente exceder 100 ciclos de clock do processador Portanto caches com uma baixa miss rates são essenciais para um bom desempenho A Tabela 813 resume a evolução dos sistemas de cache nos processadores Intel 𝑥86 Capítulo oito Memória e Sistemas de IO 804 Tabela 813 Evolução dos sistemas de memória dos microprocessadores Intel X86 O 80486 introduziu uma cache unificada writethrough que mantinha tanto instruções quanto dados A maioria dos sistemas computacionais de alto desempenho também fornecia uma cache de segundo nível maior na placamãe utilizando chips de SRAM comercialmente disponíveis que eram substancialmente mais rápidos que a memória principal O processador Pentium introduziu as caches separadas para dados e instruções para evitar contenção durante requisições simultâneas para dados e instruções As caches utilizavam uma política de writeback reduzindo a comunicação com a memória principal Novamente um segundo nível de cache maior tipicamente 256 512 𝐾𝐵 era oferecido na placamãe Capítulo oito Memória e Sistemas de IO 805 Figura 877 Módulo Pentium Pro multichip com o processador esquerda e um cache de 256 kB direita em um encapsulamento PGA Cortesia Intel A série 𝑃6 de processadores Pentium Pro Pentium II e Pentium III foi projetada para frequências de clock muito mais elevadas A cache de segundo nível na placamãe poderia não ser mantida sendo então movida para perto do processador para melhorar a sua latência e taxa de transferência O Pentium Pro era encapsulado num modulo multichip MCM contendo tanto o chip do processador quanto o chip da cache de segundo nível como mostrado na Figura 877 Assim como no Pentium o processador tinha caches de nível 1 separados para dados e instruções No entanto essas caches eram nonblocking de modo que o processador fora de funcionamento poderia continuar a executar subsequentes acessos à cache mesmo se a cache falhasse num particular acesso e tivesse que buscar o dado na memória principal A cache de segundo nível era de 256 𝐾𝐵 512 𝐾𝐵 ou 1 𝑀𝐵 de tamanho e podia operar à mesma velocidade do processador Infelizmente o Capítulo oito Memória e Sistemas de IO 806 encapsulamento MCM provouse muito caro para fabricação em volumes elevados Por esse motivo o Pentium II foi vendido num cartucho de menor custo que continha o processador e a cache de segundo nível As caches de nível 1 foram dobradas em tamanho para compensar o fato de que a cache de segundo nível operava à metade da velocidade do processador O Pentium III integrava uma cache de segundo nível de velocidade completa diretamente sobre o mesmo chip do processador Uma cache no mesmo chip pode operar com uma melhor latência e taxa de transferência então é substancialmente mais efetiva do que uma cache de mesmo tamanho mas fora do chip O Pentium 4 oferecia uma cache nonblocking de primeiro nível de dados Ele era chaveado com uma cache de troca para armazenar instruções após ter sido decodificado em micro operações evitando o atraso de recodificar cada uma das instruções buscadas na cache O projeto do Pentium M foi adaptado do Pentium III Ele aumentou ainda mais a cache de nível 1 para 32 𝐾𝐵 cada e destacou uma cache 2 de a 1 a 2 𝑀𝐵 O Core Duo contém dois processadores Pentium M modificados e uma cache compartilhada de 2 𝑀𝐵 em chip A cache compartilhada é útil para a comunicação entre os processadores um pode escrever dados na cache e o outro pode lêlos O projeto do Nehalem Core 𝑖3𝑖7 adicionou um terceiro nível de cache compartilhada entre todos os núcleos com o fim de facilitar o compartilhamento de informação entre núcleos Cada núcleo possui a sua própria cache 𝐿1 de 64 𝐾𝐵 e cache 𝐿2 de 256 𝐾𝐵 enquanto a cache compartilhada 𝐿3 contém de 4 a 8 𝑀𝐵 882 Memória Virtual x86 Processadores 𝑥86 operam tanto em Modo Real quanto em Modo Protegido Modo Real é compatível com o original 8086 Ele utiliza apenas 20 bits de endereço limitando a memória para 1 𝑀𝐵 e não aceita memória virtual O Modo Protegido foi introduzido com o 80286 e estendido para endereços de 32bits com o 80386 Ele suporta memórias virtuais com páginas de 4 𝐾𝐵 Também fornece proteção de memória de modo que um programa não pode acessar as páginas pertencentes a outros programas Consequentemente um programa defeituoso ou malicioso não pode quebrar ou corromper outros programas Todos os sistemas operacionais modernos utilizam atualmente esse modo Capítulo oito Memória e Sistemas de IO 807 Um endereço de 32bits permite até 4 𝐺𝐵 de memória Processadores desde o Pentium Pro têm aumentado a capacidade de memória para 64 𝐺𝐵 através do uso de uma técnica chamada extensão de endereço físico Cada processo usa endereços de 32bits O sistema de memória virtual mapeia esses endereços sobre um espaço maior de memória de 36bits Ele utiliza diferentes tabelas de páginas para cada processo de modo que cada processo pode ter o seu próprio espaço de endereços de até 4 𝐺𝐵 Para contornar esse gargalo na memória de uma forma mais elegante 𝑥86 tem sido atualizada para 𝑥86 64 o qual oferece endereços virtuais e registradores de propósitos gerais de 64bits Atualmente apenas 48 bits de endereço virtual são utilizados fornecendo um espaço de endereços virtuais de 256 𝑇𝐵 terabyte O limite pode ser estendido para os completos 64bits como expansão de memória oferecendo uma capacidade de 16 𝐸𝐵 exabyte 883 IO Programada para x86 A maioria das arquiteturas utiliza IO de memória mapeada descrita na Seção 85 nas quais os programas acessam dispositivos IO através da leitura e da escrita em endereços de memória A 𝑥86 utiliza IO programada na qual instruções especiais IN e OUT são utilizadas para ler e escrever em dispositivos IO A 𝑥86 define 216portas IO A instrução IN lê um dois ou quatro bytes da porta especificada por DX em AL AX ou EAX OUT possui funcionamento similar mas escreve na porta Conectar um dispositivo periférico a um sistema IO programado é similar a conectálo a um sistema de memória mapeada Quando acessamos uma porta IO o processador envia o número de porta ao invés do endereço de memória nos 16 bits menos significativos do barramento de endereços O dispositivo lê ou escreve dados do barramento de dados A diferença principal é que o processador também produz um sinal 𝑀𝐼𝑂 Quando 𝑀𝐼𝑂 1 o processador está acessando a memória Quando é 0 o processador está acessando um dos dispositivos IO O decodificador de endereços deve também olhar para 𝑀𝐼𝑂 para gerar os sinais de ativação apropriados a memória principal e par aos dispositivos IO Dispositivos IO podem também enviar interrupções para o processador para indicar que elas estão prontas para se comunicarem Capítulo oito Memória e Sistemas de IO 808 89 SUMÁRIO A organização de sistemas de memória é um fator principal na determinação do desempenho do computador Diferentes tecnologias de memória tais como DRAM SRAM e discos rígidos oferecem compromissos em capacidade velocidade e custo Este Capítulo introduziu as organizações de memórias cache e virtual que utilizam uma hierarquia de memórias para se aproximarem de uma memória ideal grande rápida e barata A memória principal é tipicamente construída a partir da DRAM a qual é significativamente mais lenta que o processador Uma cache reduz o tempo de acesso mantendo na SRAM rápida os dados comumente utilizados A memória virtual aumenta a capacidade de memória através do uso de um disco rígido para armazenar dados que não cabem na memória principal Caches e memória virtual adicionam complexidade e hardware a um sistema computacional mas os benefícios usualmente prevalecem sobre os custos Todos os computadores pessoais modernos utilizam caches e memórias virtuais A maioria dos processadores também utiliza a interface de memória para realizar a comunicação entre dispositivos IO Ela é chamada IO de memória mapeada Programas utilizam operações de carregamento e armazenamento para acessar os dispositivos IO EPÍLOGO Esse Capítulo nos traz até o final de nossa jornada juntos pelo reino dos sistemas digitais Esperamos que este livro tenha passado a beleza e a emoção da arte tanto quanto o conhecimento em engenharia O leitor aprendeu a projetar sistemas lógicos combinatórios e sequenciais utilizando diagramas esquemáticos e linguagens de descrição de hardware Está familiarizado com os blocos maiores como multiplexadores ULA e memórias Computadores são uma das muitas fascinantes aplicações dos sistemas digitais O leitor aprendeu a programar um processador MIPS na sua linguagem assembly nativa e como construir o sistema do processador e memória utilizando blocos de construção digitais Do início ao fim viu aplicações da Capítulo oito Memória e Sistemas de IO 809 abstração disciplina hierarquia modularidade e regularidade Com essas técnicas juntamos todas as peças do quebracabeças do funcionamento interno de um microprocessador De telefones celulares às televisões digitais os Mars rovers os sistemas de imagens médicas nosso mundo é um lugar cada vez mais digital Imagine que o Charles Babbage faria para realizar uma jornada parecida há um século e meio atrás Ele aspirava apenas calcular tabelas matemáticas com precisões mecânicas Os sistemas digitais de hoje são a ficção científica de ontem Talvez Dick Tracy tenha utilizado o iTunes em seu celular Será que Julio Verne podia ter lançado uma constelação de satélites de posicionamento global no espaço Poderia Hipócrates ter curado doenças utilizando imagens digitais em alta resolução do cérebro Porém ao mesmo tempo o pesadelo de George Orwell da vigilância do governo onipresente se torna mais próxima a cada dia Hackers e governos travam guerras digitais não declaradas atacando as infraestruturas industriais e as redes financeiras E estados desonestos desenvolvem armas nucleares utilizando computadores portáteis mais poderosos do que os supercomputadores do tamanho de uma sala que simularam as bombas da Guerra Fria A revolução do microprocessador continua a acelerar As mudanças nas próximas décadas irão superar aquelas do passado O leitor possui agora as ferramentas para projetar e construir esses novos sistemas que irão moldar o nosso futuro Junto com seus novos poderes acrescem profundas responsabilidades Temos a esperança de que vai usálos não apenas por diversão e riqueza mas também para o benefício da humanidade Capítulo oito Memória e Sistemas de IO 810 Exercícios Exercício 81 Em menos de uma página descreva quatro atividades diárias que exibem localidade temporal ou espacial Liste duas atividades para cada tipo de localidade e seja específico Exercício 82 Num parágrafo descreva duas pequenas aplicações computacionais que exibem localidade temporal eou espacial Descreva quais Seja específico Exercício 83 Apresente uma sequência de endereços para os quais uma cache mapeada diretamente com um tamanho capacidade de 16 palavras e um tamanho de bloco de 4 palavras supera uma cache totalmente associativa com substituição do menos recentemente usado LRU com mesma capacidade e tamanho de bloco Exercício 84 Repita o Exercício 83 para o caso em que uma cache completamente associativa supera a cache mapeada diretamente Exercício 85 Descreva os compromissos de se aumentar cada um dos parâmetros da cache enquanto se mantém os outros constantes a Tamanho de bloco b Associatividade c Tamanho da cache Capítulo oito Memória e Sistemas de IO 811 Exercício 86 A miss rate de uma cache associativa de duas vias usualmente ocasionalmente ou nunca é melhor do que uma cache mapeada diretamente de mesma capacidade e tamanho de bloco Explique Exercício 87 Cada uma das seguintes declarações pertence à miss rate das caches Marque cada declaração como verdadeira ou falsa Explique brevemente o seu raciocínio Apresente um contraexemplo se a declaração for falsa a Uma cache associativa de duas vias sempre possui uma miss rate menor do que a de uma cache mapeada diretamente com o mesmo tamanho de bloco e capacidade total b Uma cache diretamente mapeada de 16 𝑘𝐵 sempre possui uma miss rate menor do que uma cache diretamente mapeada de 8 𝑘𝐵 com o mesmo tamanho de bloco c Uma cache de instruções com um bloco de 32 bytes usualmente possui uma miss rate menor do que um cache de instruções com um tamanho de bloco de 8 bytes dados o grau de associatividade e a capacidade total Exercício 88 Uma cache possui os seguintes parâmetros 𝑏 tamanho do bloco em número de palavras 𝑆 número de conjuntos 𝑁 número de vias e 𝐴 número de bits de endereço a em termos dos parâmetros descritos qual é a capacidade da cache 𝐶 b Em termos dos parâmetros descritos qual é o número total de bits necessários para armazenar as tags c Quais são 𝑆 e 𝑁 para uma cache totalmente associativa de capacidade 𝐶 palavras com um tamanho de bloco 𝑏 d Qual é 𝑆 para uma cache diretamente mapeada de tamanho 𝐶 palavras e tamanho de bloco 𝑏 Capítulo oito Memória e Sistemas de IO 812 Exercício 89 Uma cache de 16 palavras possui os parâmetros dados no Erro A origem da referência não foi encontrada Considere a seguinte sequência repetida de lw endereços dados em hexadecimal 40 44 48 4𝐶 70 74 78 7𝐶 80 84 88 8𝐶 90 94 98 9𝐶 0 4 8 𝐶 10 14 18 1𝐶 20 Assumindo substituição do menos recentemente usado LRU para caches associativas determine a miss rate efetiva se a sequência é a entrada das seguintes caches ignorando os efeitos de inicialização perdas compulsórias por exemplo a Cache diretamente mapeada 𝑏 1 palavra b Cache totalmente associativa 𝑏 1 palavra c Cache de conjunto associativa duas vias 𝑏 1 palavra d Cache diretamente mapeada 𝑏 2 palavras Exercício 810 Repita o Exercício 89 para a seguinte sequência repetida de lw endereços dados em hexadecimal e configurações de cache A capacidade da cache mantémse de 16 palavras 74 10 78 38𝐶 𝐴𝐶 84 88 8𝐶 7𝐶 34 38 13𝐶 388 18𝐶 a Cache diretamente mapeada 𝑏 1 palavra b Cache totalmente associativa 𝑏 2 palavras c Cache associativa de conjunto duas vias 𝑏 2 palavras d Cache diretamente mapeada 𝑏 4 palavras Exercício 811 Suponha que está rodando um programa com o seguinte padrão de acesso de dados O padrão é executado apenas uma vez 0𝑥0 0𝑥8 0𝑥10 0𝑥18 0𝑥20 0𝑥28 Capítulo oito Memória e Sistemas de IO 813 a Se o leitor utilizar uma cache com mapeamento direto com um tamanho de cache de 1 kB e um tamanho de bloco de 8 bytes 2 palavras quantos conjuntos existem na cache b Com a mesma cache e tamanho de bloco de dados na parte a qual é a miss rate da cache mapeada diretamente para o padrão de acesso à memória dado c Para o dado padrão de acesso à memória qual das seguintes afirmações poderia diminuir a miss rate da maioria a capacidade da cache é mantida constante Circule uma i Aumentando o grau de associatividade para 2 ii Aumentando o tamanho do bloco para 16 bytes iii Tanto i quanto ii iv Nem i nem ii Exercício 812 O leitor está construindo uma cache de instruções para um processador MIPS Ela possui a capacidade total de 4𝐶 2𝑐2 bytes Sendo associativa de conjunto com 𝑁 2𝑛 vias 𝑁 8 com um tamanho de bloco de 𝑏 2𝑏 bytes 𝑏 8 Em termos destes parâmetros dê as suas respostas para as questões seguintes a Quais os bits de endereço utilizados para selecionar uma palavra dentro do bloco b Quais os bits de endereço utilizados para selecionar o conjunto na cache c Quantos bits existem em cada tag d Quantos tag bits existem em toda a cache Exercício 813 Considere uma cache com os seguintes parâmetros 𝑁 associatividade 2 𝑏 tamanho de bloco 2 palavras 𝑊 tamanho da palavra 32 bits 𝐶 tamanho da cache 32 𝑘 palavras 𝐴 tamanho de endereço 32 bits Você precisa considerar apenas os endereços de palavras Capítulo oito Memória e Sistemas de IO 814 a Mostre o tag conjunto offset de bloco e bits do byte offset do endereço Indique quantos bits são necessários para cada campo b Qual é o tamanho de todas as tags de cache nos bits c Suponha que cada bloco de cache também tenha um bit válido 𝑉 e um dirty bit 𝐷 Qual é o tamanho de cada conjunto de cache incluindo dados tags e bits de status d Projete a cache utilizando os blocos de construção da Figura 878 e um pequeno número de portas lógicas de duas entradas O projeto da cache deve incluir armazenamento de tags armazenamento de palavras comparação de endereços seleção de dados de saída e qualquer outras partes que o leitor ache relevantes Note que os blocos do multiplexador e do comparador podem ter qualquer tamanho 𝑛 ou 𝑝 bits respectivamente mas os blocos SRAM devem ter 16𝑘 4 bits Tenha a certeza de incluir um diagrama de blocos nítido e com legendas Você precisa projetar a cache apenas para leituras Figura 878 Blocos de construção Exercício 814 O leitor se juntou a uma nova e hot startup de Internet para construir relógios de pulso com pager e navegor web embutido Ele utiliza um processador embarcado com um esquema de cache multinível mostrado na Figura 879 O processador inclui uma pequena cache onchip juntamente com uma grande cache offchip Sim esse relógio pesa 13𝑘𝑔 mas você deveria vêlo funcionando Assuma que o processador utiliza endereços físicos de 32bits mas acessa os dados apenas das fronteiras das palavras As caches possuem as características dadas na Tabela 814 A DRAM possui um tempo de acesso de 𝑡𝑚 e um tamanho de 512 𝑀𝐵 Capítulo oito Memória e Sistemas de IO 815 a Para uma dada palavra na memória qual é o número total de localizações em que ela pode ser encontrada na cache onchip e na cache de segundo nível b Qual é o tamanho em bits de cada tag para a cache onchip e para a cache de segundo nível c Dê uma expressão para o tempo médio de acesso à memória As caches são acessadas em sequência a Medidas mostraram que para um particular problema de interesse a hit rate da cache onchip é de 85 e a hit rate da cache de segundo nível é de 9 No entanto quando a cache onchip é desativada a hit rate da cache de segundo nível sobe para 985 Dê uma breve explicação para esse comportamento Tabela 814 Características de memória Figura 879 Sistema computacional Capítulo oito Memória e Sistemas de IO 816 Exercício 815 Este Capítulo descreveu a política de substituição do menos recentemente utilizado LRU para caches associativas multivias Outra menos comum política de substituição incluem a firstinfirst out FIFO e as políticas aleatórias A substituição por FIFO evita o bloco que lá está há mais tempo independente do quão recentemente ele foi acessado A substituição aleatória evita um bloco aleatoriamente a Discuta as vantagens e desvantagens de cada uma destas políticas de substituição b Descreva um padrão de acesso de dados para o qual a FIFO teria uma melhor realização do que a LRU Exercício 816 O leitor está construindo um computador com um sistema hierárquico de memória que consiste em caches separados para instruções e dados seguidas pela memória principal O leitor está utilizando o processador MIPS multiciclos da Figura 841 trabalhando a 1 𝐺𝐻𝑧 a Suponha que a cache de instruções é perfeita isto é sempre acerta mas a cache de dados possui uma miss rate de 5 Num erro de cache o processador espera 60 𝑛𝑠 para acessar a memória principal e então volta à operação normal Levando as falhas de cache em consideração qual é o tempo médio de acesso à memória b Quantos ciclos de clock por instrução CPI em média são necessários para carregar e armazenar instruções de palavras considerando um sistema de memória não ideal c Considerando a aplicação de referência do Exemplo 77 que possui 25 de carregamentos 10 de armazenamentos 11 de branches 2 de saltos e 52 de instruções tipoR Levando em conta o sistema de memória não ideal qual é a CPI média para esta aplicação d Agora suponha que a cache de instruções é também não ideal e possui uma miss rate de 7 Qual a CPI média para a aplicação na parte c Leve em conta que ambas as caches de instruções e de dados falham Capítulo oito Memória e Sistemas de IO 817 Exercício 817 Repita o Erro A origem da referência não foi encontrada com os seguintes parâmetros a Suponha que a cache de instruções é perfeito isto é sempre acerta mas a cache de dados possui uma miss rate de 15 Num erro de cache o processador espera 200 𝑛𝑠 para acessar a memória principal e então volta à operação normal Levando as falhas de cache em consideração qual é o tempo médio de acesso à memória b Quantos ciclos de clock por instrução CPI em média são necessários para carregar e armazenar instruções de palavras considerando um sistema de memória não ideal c Considerando a aplicação de referência do Exemplo 77 que possui 25 de carregamentos 10 de armazenamentos 11 de branches 2 de saltos e 52 de instruções tipoR Levando em conta o sistema de memória não ideal qual é a CPI média para esta aplicação d Agora suponha que a cache de instruções é também não ideal e possui uma miss rate de 10 Qual a CPI média para a aplicação na parte c Leve em conta que ambas as caches de instruções e de dados falham Exercício 818 Se um computador utiliza endereços virtuais de 64bits quanto de memória virtual ele pode acessar Note que 240 bytes 1 terabyte 250 bytes 1 petabyte e 260bytes 1 exabyte Exercício 819 Um projetista de supercomputadores escolhe gastar 1 milhão em DRAM e a mesma quantia em discos rígidos para memória virtual Utilizando os preços da Figura 84 quanto de memória física e virtual o computador terá Quantos bits de endereço físicos e virtuais são necessários para se acessar a memória Exercício 820 Considere um sistema de memória virtual que pode endereçar um total de 232bytes O leitor possui um espaço ilimitado de disco rígido mas está limitado em apenas 8 𝑀𝐵 de memória semicondutora física Assuma que as páginas físicas e virtuais possuem 𝑘𝐵 de tamanho cada Capítulo oito Memória e Sistemas de IO 818 a De quantos bits é endereço físico b Qual é o número máximo de páginas virtuais no sistema c Quantas páginas físicas há no sistema d De quantos bits é o número de páginas físicas e virtuais e Suponha que o leitor apresenta um esquema mapeado diretamente que mapeia as páginas virtuais em páginas físicas O mapeamento utiliza os bits menos significativos do número de página virtual para determinar o número de página físico Quantas páginas virtuais são mapeadas para cada endereço físico Por que esse plano de mapeamento direto é um plano ruim f Claramente um esquema mais dinâmico e flexível para traduzir endereços virtuais em físicos é necessário ao invés daquele descrito na parte e Suponha que o leitor utiliza uma tabela de páginas para armazenar mapeamentos traduções de números de páginas virtuais para números de páginas físicas Quantas entradas a tabela de páginas irá conter g Assuma que além do número de páginas físicas cada tabela de páginas contém também alguma informação de status na forma de um bit válido 𝑉 e um dirty bit 𝐷 Quantos bytes possui cada entrada da tabela de páginas Arredonde para o maior número inteiro de bytes h Esboce o layout da tabela de páginas Qual é o tamanho total em bytes da tabela de páginas Exercício 821 Considere um sistema de memória virtual que pode endereçar um total de 250bytes O leitor possui um espaço ilimitado no disco rígido mas é limitado em 2𝐺𝐵 de memória semicondutora física Assuma que as páginas físicas e virtuais possuem cada uma 4 𝑘𝐵 de tamanho a De quantos bits é o endereço físico b Qual é o máximo número de páginas virtuais no sistema c Quantas páginas físicas existem no sistema Capítulo oito Memória e Sistemas de IO 819 d De quantos bits é o números de páginas físicas e virtuais e Quantas entradas na tabela de páginas irá a tabela de páginas conter f Assuma que além do número de páginas físicas cada tabela de páginas contém também alguma informação de status na forma de um bit válido 𝑉 e um dirty bit 𝐷 Quantos bytes possui cada entrada da tabela de páginas Arredonde para o maior número inteiro de bytes g Esboce o layout da tabela de páginas Qual é o tamanho total da tabela de páginas em bytes Exercício 822 O leitor decide aumentar a velocidade do sistema de memória virtual do Exercício 820 utilizando um translation lookaside buffer TLB Suponha que o seu sistema de memória tem as características mostradas na Tabela 815 O TLB e a miss rate da cache indicam o quão frequentemente a entrada requisitada não foi encontrada A miss rate da memória principal indica o quão frequentemente uma falha de página ocorre a Qual é o tempo médio de acesso à memória do sistema de memória virtual antes e depois da adição do TLB Assuma que a tabela de páginas reside sempre na memória física e nunca é mantida na cache de dados b Se o TLB possui 64 entradas qual o tamanho em bits do TLB Dê os números para dados número de página física tag número de página virtual e bits válidos para cada entrada Mostre o seu trabalho claramente c Esboce o TLB Rotule claramente todos os campos e dimensões d Para construir o TLB descrito na parte c você precisaria de uma SRAM de que tamanho Dê sua resposta em termos de profundidade largura Capítulo oito Memória e Sistemas de IO 820 Tabela 815 Características de memória Exercício 823 O leitor decide aumentar a velocidade do sistema de memória do Exercício 821 utilizando um TLB de 128 entradas a Qual o tamanho em bit do TLB Dê os números para dados número de página física tag número de página virtual e bits válidos para cada entrada Mostre o seu trabalho claramente b Esboce o TLB Rotule claramente todos os campos e dimensões c Para construir o TLB descrito na parte b você precisaria de uma SRAM de que tamanho Dê sua resposta em termos de profundidade largura Exercício 824 Suponha que o processador MIPS multiciclos descrito na Seção 74 utiliza um sistema de memória virtual a Esboce a localização do TLB no esquemático do processador multiciclos b Descreva como a inserção de um TLB afeta o desempenho do processador Capítulo oito Memória e Sistemas de IO 821 Exercício 825 O sistema de memória virtual que você está projetando utiliza uma tabela de páginas de nível único construída a partir de hardware dedicado SRAM e lógica associada Ele suporta endereços virtuais de 25bits endereços físicos de 22bits e páginas de 216bytes 64𝑘𝐵 Cada entrada da tabela de páginas contém um número de página física um bit válido 𝑉 e um dirty bit 𝐷 a Qual é o tamanho total da tabela de páginas em bits b A equipe do sistema operacional propôs a redução do tamanho de página de 64 𝑘𝐵 para 16 𝑘𝐵 mas os engenheiros de hardware da sua equipe atentaram para o aumento no custo do hardware Explique o porquê dessa objeção c A tabela de páginas deve ser integrada ao chip do processador juntamente com a cache onchip A cache onchip lida apenas com endereços físicos não virtuais É possível acessar o conjunto apropriado na cache onchip ao mesmo tempo que a tabela de páginas para um dado acessa a memória Explique brevemente a relação que é necessária para acessar simultaneamente o conjunto da cache e a entrada da tabela de páginas d É possível realizar uma comparação de tags numa cache onchip simultaneamente ao acesso a tabela de páginas para um dado acesso à memória Explique brevemente Exercício 826 Descreva um cenário no qual um sistema de memória virtual pode afetar como uma aplicação é escrita Tenha certeza de incluir uma discussão de como o tamanho da página e o tamanho da memória física afetam o desempenho da aplicação Exercício 827 Suponha que você tenha um computador pessoal PC que utiliza endereços virtuais de 32 bits a Qual é a quantidade máxima de espaço de memória virtual que cada programa pode utilizar b De que modo o tamanho do disco rígido do seu PC afeta o desempenho Capítulo oito Memória e Sistemas de IO 822 c De que modo o tamanho da memória física do seu PC afeta o desempenho Exercício 828 Utilize uma IO MIPS mapeada em memória para interagir com o usuário Cada vez que usuário pressiona o botão um padrão de sua escolha é mostrado em cinco diodos emissores de luz LED Suponha que o botão de entrada é mapeado para o endereço 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹10 e os LED são mapeados para o endereço 0𝑥𝐹𝐹𝐹𝐹𝐹𝐹14 Quando o botão é pressionado a saída é 1 Caso contrário a saída é 0 a Escreva um código MIPS para implementar essa funcionalidade b Desenhe um esquemático para esse sistema IO mapeado em memória c Escreva o código HDL para implementar o decodificador de endereços para o seu sistema IO mapeado em memória Exercício 829 Máquinas de estados finitos FSM assim como aquelas construídas no Capítulo 3 podem também ser implementadas em software a Implemente a FSM do semáforo da Figura 325 utilizando código assembly MIPS As entradas 𝑇𝐴 e 𝑇𝐵 são mapeadas em memória para bit 1 e bit 0 respectivamente do endereço 0𝑥𝐹𝐹𝐹𝐹𝐹000 As duas saídas de 3bits 𝐿𝐴 e 𝐿𝐵 são mapeadas para os bits 02 e bits 35 respectivamente do endereço 0𝑥𝐹𝐹𝐹𝐹𝐹004 Assuma codificação de saída onehot para cada lâmpada 𝐿𝐴 e 𝐿𝐵 vermelho é 100 amarelo é 010 e verde é 001 b Desenhe um esquemático para esse sistema IO mapeado em memória c Escreva o código HDL para implementar o decodificador de endereços para o seu sistema IO mapeado em memória Exercício 830 Repita o Exercício 829 para a FSM na Figura 330 a A entrada 𝐴 e a saída 𝑌 são mapeadas em memória para os bits 0 e 1 respectivamente do endereço 0𝑥𝐹𝐹𝐹𝐹𝐹040 Capítulo oito Memória e Sistemas de IO 823 Questões de Entrevista Os seguintes exercícios apresentam questões que vêm sendo perguntadas em entrevistas Pergunta 81 Explique a diferença entre caches associativas de conjunto mapeadas diretamente e completamente associativas Para cada tipo de cache descreva uma aplicação em que um tipo de cache é melhor do que os outros dois Pergunta 82 Explique como um sistema de memória virtual funciona Pergunta 83 Explique as vantagens e desvantagens de se usar um sistema de memória virtual Pergunta 84 Explique como o desempenho da cache pode ser afetado pelo tamanho de página virtual de um sistema de memória Pergunta 85 Endereços utilizados em IO de memória mapeada podem ser utilizados em caches Explique porque sim ou porque não Capítulo oito Memória e Sistemas de IO 824 825 A Implementação de Sistemas Digitais A1 INTRODUÇÃO Este apêndice apresenta questões práticas na concepção de sistemas digitais O material não é necessário para a compreensão do resto do livro no entanto procura desmistificar o processo de construção de sistemas digitais reais Além disso acreditamos que a melhor maneira de compreender os sistemas digitais é construir e os depurar sozinho no laboratório Os sistemas digitais são geralmente construídos utilizando um ou mais chips Uma estratégia é fazer a ligação entre chips contendo portas lógicas individuais ou elementos maiores como unidades aritméticaslógicas ALUs ou memórias Outro é a utilização de lógica programável que contém as matrizes genéricas de circuito que podem ser programadas para realizar as funções lógicas específicas Ainda uma terceira é a concepção de um circuito integrado personalizado que contém a lógica específica necessária para o sistema Estas três estratégias oferecem compensações em termos de custo velocidade consumo de energia e tempo de projeto que são exploradas nas Seções a seguir Este apêndice também examina o empacotamento física e montagem de circuitos as linhas de transmissão que conectam os chips e a economia dos sistemas digitais A2 LÓGICA 74XX Nos anos 1970 e 1980 muitos sistemas digitais foram construídos a partir de chips simples cada um contendo um punhado de portas lógicas Por exemplo o chip de 7404 contém seis portas NOT o 7408 Apêndice A Implementação de Sistemas Digitais 826 possui quatro portas AND e o 7474 contém dois flipflops Esses chips são coletivamente referidos como a lógica da série 74xx Eles foram vendidos por muitos fabricantes geralmente por 10 a 25 centavos de dólar por chip Estes chips são agora completamente obsoletos mas ainda são úteis nos sistemas digitais ou em projetos académicos simples dado que são baratos e fáceis de usar Os chips da série 74xx são comumente vendidos em pacotes Dual Inline Packcage DIP de 14 pinos A21 Portas Lógicas A Figura A1 mostra os diagramas de pinout para uma variedade de chips populares da série 74xx contendo portas lógicas básicas Estes são algumas vezes chamados de chips de integração de pequena escala SSI Small Scale Integration porque são construídos a partir de alguns transístores Os pacotes de 14 pinos têm tipicamente um entalhe na parte superior ou um ponto na parte superior esquerda para indicar a orientação Os pinos são numerados começando com 1 no canto superior esquerdo e no sentido antihorário em torno do pacote Os chips precisam receber alimentação VDD 5 V e terra GND 0 V nos pinos 14 e 7 respectivamente O número de portas lógicas sobre o chip é determinado pelo número de pinos Notese que os pinos 3 e 11 do chip 7421 não estão conectados NC Not Connected O flipflop 7474 tem os típicos terminais D CLK e Q Também tem uma saída complementar 𝑄 Além disso recebe sinais de set assíncrono também chamado de preset ou PRE e de reset também chamado clear ou CLR Estes são ativos a baixo por outras palavras o flipflop fica ativo quando 𝑃𝑅𝐸 0 repõe quando 𝐶𝐿𝑅 0 e opera normalmente quando 𝑃𝑅𝐸 𝐶𝐿𝑅 1 A22 Outras Funções A série 74xx também inclui funções lógicas um pouco mais complexas incluindo as mostradas na Figura A2 e na Figura A3 Estes são chamados de chips de integração de média escala MSI medium scale integration A maioria usa pacotes maiores para acomodar mais entradas e saídas A alimentação e a terra ainda são fornecidas no canto superior direito e inferior esquerdo respectivamente de cada chip A descrição funcional geral é fornecida para cada chip Veja as folhas de dados do fabricante para obter descrições completas Apêndice A Implementação de Sistemas Digitais 827 A3 LÓGICA PROGRAMÁVEL A lógica programável consiste em matrizes de circuito que podem ser configurados para realizar as funções lógicas específicas Já introduzimos três formas de lógica programável memórias programáveis de apenas leitura PROM dispositivos de lógica programável PLA Programmable Logic Arrays e Field Programmable Gate Array FPGA Esta seção apresenta implementações de chips para cada uma delas A configuração destes chips pode ser realizada por queima dos fusíveis onchip para ligar ou desligar os elementos do circuito Isso é chamado de lógica OneTime Programmable OTP porque uma vez que um fusível esteja queimado ele não pode ser restaurado Alternativamente a configuração pode ser armazenada numa memória que pode ser reprogramada à vontade A lógica reprogramável é conveniente em laboratório porque o mesmo chip pode ser reutilizado durante o desenvolvimento A31 PROM Como discutido na Secção 557 as PROM podem ser usadas como tabelas de consulta Uma PROM de 2Npalavras Mbits pode ser programada para executar qualquer função de combinações de N entradas e M saídas As alterações de projeto envolvem apenas a substituição do conteúdo da PROM em vez da religação das ligações entre os chips As tabelas de pesquisa são úteis para pequenas funções mas tornase proibitivamente caro com o aumento do número de entradas Apêndice A Implementação de Sistemas Digitais 828 Figura A1 Portas lógicas da série 74xx Apêndice A Implementação de Sistemas Digitais 829 Nota os nomes de variáveis em SystemVerilog não podem começar com números mas os nomes no código de exemplo na Figura A2 são escolhidos para coincidir com a folha de dados do fabricante Figura A2 Chips de integração de média escala Apêndice A Implementação de Sistemas Digitais 830 Figura A3 Mais chips de integração de média escala MSI Apêndice A Implementação de Sistemas Digitais 831 Figura A4 EPROM de 8KB 2764 Por exemplo a clássica PROM 2764 apagável de 8 KB 64 KB EPROM é mostrada na Figura A4 A EPROM tem 13 linhas de endereço para especificar uma das 8K palavras e 8 linhas de dados para ler o byte de dados dessa palavra O ativar do chip e da saída devem ser acionados para os dados a serem lidos O atraso máximo de propagação é de 200 ps Em operação normal 𝑃𝐺𝑀 1 e 𝑉𝑃𝑃 não é utilizado A EPROM é geralmente programada num programador especial que define 𝑃𝐺𝑀 0 aplica 13 V a 𝑉𝑃𝑃 e usa uma sequência especial de entradas para configurar a memória As PROM modernas são similares no conceito mas têm capacidades muito maiores e mais pinos A memória flash é do tipo mais barato de PROM vendido por cerca de US 1 por gigabyte em 2012 Os preços historicamente diminuem de 30 a 40 ao ano Apêndice A Implementação de Sistemas Digitais 832 A32 PLA Como discutido na Seção 561 as PLA contêm planos de AND e OR para determinar qualquer função combinatória escrita na forma de soma de produtos Os planos de AND e OR podem ser programados usando as mesmas técnicas das PROM A PLA tem duas colunas para cada entrada e uma coluna para cada saída Ela tem uma linha para cada mintermo Esta organização é mais eficiente do que uma PROM para muitas funções mas o array ainda se torna excessivamente grande para funções com vários IO e mintermos Diferentes fabricantes estenderam o conceito básico da PLA para construir dispositivos lógicos programáveis PLD que incluem registros A 22V10 é uma das PLD clássicas mais populares Ela tem 12 pinos de entrada dedicados e 10 saídas As saídas podem vir diretamente da PLA ou a partir de registros de clock no chip As saídas também podem ser alimentadas de volta para a PLA Assim a 22V10 pode implementar diretamente uma FSM com até 12 entradas 10 saídas e 10 bits de estado A 22V10 custa cerca de US 2 em quantidades de 100 As PLD foram tornandose obsoletas pelas rápidas melhorias na capacidade e custo das FPGA A33 FPGA Como discutido na Seção 562 as FPGA consistem em matrizes de elementos lógicos LE logic element configuráveis também chamados de blocos lógicos configuráveis CLB configurable logic block ligados entre si com fios programáveis Os LE contêm pequenas tabelas de pesquisa e flip flops As FPGA escalam graciosamente para capacidades extremamente grandes com milhares de tabelas de pesquisa A Xilinx e a Altera são duas das principais fabricantes de FPGA As tabelas de pesquisa e os fios programáveis são flexíveis o suficiente para implementar qualquer função lógica No entanto eles têm uma ordem de magnitude menos eficiente na velocidade e no custo área de chip do que as versões hardwired das mesmas funções Assim muitas vezes as FPGA incluem blocos especializados tais como memórias multiplicadores e até mesmo microprocessadores inteiros A Figura A5 mostra o processo de concepção de um sistema digital num FPGA O projeto é geralmente especificado com uma linguagem de descrição de hardware HDL embora algumas ferramentas para FPGA também suportam esquemas O projeto é então simulado As entradas são Apêndice A Implementação de Sistemas Digitais 833 aplicadas e comparadas com os resultados esperados para verificar que a lógica está correta Normalmente é necessária uma depuração A seguir a síntese lógica converte o HDL em funções Booleanas Boas ferramentas de síntese produzem um esquema das funções e o designer prudente examina esses esquemas bem como quaisquer avisos produzidos durante a síntese para garantir que a lógica desejada foi produzida Às vezes a codificação descuidada leva a circuitos que são muito maiores do que o pretendido ou a circuitos com lógica assíncrona Quando os resultados de síntese são bons a ferramenta para FPGA mapeia as funções para o LE de um chip específico A funcionalidade posiciona e roteia determina quais as funções em cada tabela de pesquisa e como são ligadas entre si O atraso do condutor aumenta com o comprimento os circuitos críticos devem ser colocados juntos Se o projeto é grande demais para caber no chip ele deve ser recriado A análise temporal compara as restrições de tempo por exemplo uma velocidade de relógio pretendida de 100 MHz contra os atrasos de circuitos reais e relata quaisquer erros Se a lógica é muito lenta pode ter que ser redesenhada ou um pipeline diferente deve ser utilizado Quando o projeto está correto um arquivo é gerado especificando o conteúdo de todos os LE e a programação de todos os fios na FPGA Muitas FPGA armazenam essas informações de configuração numa memória RAM estática que deve ser recarregado de cada vez que a FPGA é ligada A FPGA pode baixar esta informação de um computador no laboratório ou pode lêla a partir de uma ROM não volátil quando a energia é aplicada pela primeira vez Exemplo A1 ANÁLISE TEMPORAL DE UMA FPGA Alyssa P Hacker usa uma FPGA para implementar um classificador de MM com um sensor de cor e motores para colocar os doces vermelhos num frasco e os doces verdes noutro O seu projeto é implementado com uma FSM e ela está usando uma Cyclone IV GX De acordo com a folha de dados a FPGA tem as características de temporização apresentados na Tabela A1 A Alyssa gostaria que a sua FSM fosse executada a 100 MHz Qual é o número máximo de LE no caminho crítico Qual é a velocidade mais rápida a que sua FSM pode executar Figura A5 Fluxo de projecto utilizando uma FPGA Apêndice A Implementação de Sistemas Digitais 834 Solução A 100 MHz o tempo de ciclo Tc é 10 ns Alyssa usa a Equação 313 para descobrir o atraso mínimo de propagação tpd neste tempo de ciclo 𝑡𝑝𝑑 10𝑛𝑠 0199𝑛𝑠 0076𝑛𝑠 9725 𝑛𝑠 A1 Com um atraso combinado do LE e do condutor de 381 ps 246 ps 627 ps a FSM da Alyssa no máximo deve usar 15 LE consecutiva 9725 0627 para implementar a lógica de próximo estado A maior velocidade à qual uma FSM pode ser executada nesta FPGA Cyclone IV é quando utiliza um único LE para a próxima lógica estado O tempo de ciclo mínimo é 𝑇𝑐 381 𝑝𝑠 199 𝑝𝑠 76 𝑝𝑠 656 𝑝𝑠 A2 Portanto a frequência máxima é de 15 GHz Tabela A1 Temporização da Cyclone IV GX A Altera anunciou a FPGA Cyclone IV com 14400 LE por US 25 em 2012 Em grandes quantidades as FPGA médias normalmente custam vários dólares As FPGA maiores custam centenas ou mesmo milhares de dólares Apêndice A Implementação de Sistemas Digitais 835 A4 CIRCUITOS INTEGRADOS DE USO ESPECÍFICO Os ASIC são chips projetados para um uso particular Os aceleradores gráficos chips de interface de rede e chips de telefones celulares são exemplos comuns de ASICS O projetista de ASIC coloca os transístores para criar conjuntamente as portas lógicas e as respectivas ligações Dado que o ASIC é programado para uma função específica é tipicamente várias vezes mais rápido do que uma FPGA e ocupa uma ordem de magnitude menos área de pastilha e portanto o custo do que uma FPGA com a mesma função No entanto as máscaras especificando onde transístores e as suas ligações estão localizados no chip custam centenas de milhares de dólares para produzir O processo de fabricação requer geralmente 6 a 12 semanas para fabricar embalar e testar os ASIC Se os erros são descobertos após o ASIC ser fabricado o projetista deve corrigir o problema gerando novas máscaras e aguarde que um outro lote seja fabricado Assim os ASIC são adequados apenas para os produtos que vão ser produzidos em grandes quantidades e cuja a função é bem definida previamente A Figura A6 mostra o processo de criação de um ASIC que é semelhante ao processo de criação da FPGA da Figura A7 A lógica de verificação é especialmente importante porque a correção de erros após as máscaras serem produzidas é dispendioso A síntese produz uma netlist que consiste em portas lógicas e ligações entre as portas as portas nesta netlist são colocadas e as ligações são encaminhadas entre as portas Quando o desenho é satisfatório as máscaras são geradas e utilizadas para fabricar o ASIC Uma única partícula de poeira pode arruinar um ASIC pelo que os chips devem ser testados após a fabricação A fração de chips fabricados que funcionam é chamada de rendimento tipicamente 50 a 90 dependendo do tamanho do chip e do processo de fabrico Finalmente os chips operacionais são colocados em embalagens como será discutido na Secção A7 A5 DATA SHEETS Os fabricantes de circuitos integrados publicam folhas de dados data sheets que descrevem as funções e o desempenho dos seus chips É essencial ler e compreender as folhas de dados Uma das principais fontes de erros em sistemas digitais vem de não perceber o funcionamento de um chip Figura A6 Sequência de projeto ASIC Apêndice A Implementação de Sistemas Digitais 836 As folhas de dados estão geralmente disponíveis a partir do Web site do fabricante Se o leitor não conseguir localizar a folha de dados para um componente e não têm documentação clara de outra fonte não use o componente Algumas das entradas na folha de dados pode ser enigmática Muitas vezes o fabricante publica livros de dados contendo folhas de dados para muitos componentes relacionados Algumas das entradas na folha de dados pode ser enigmática O início do livro de dados tem informações de esclarecimento adicional Esta informação pode ser encontrada na web com uma pesquisa cuidadosa Esta Seção disseca a folha de dados para o chip inversor 74HC04 da Texas Instruments TI A folha de dados é relativamente simples mas ilustra muitos dos elementos principais A TI ainda fabrica uma ampla variedade de chips da série 74xx No passado muitas outras empresas construíram esses chips também mas o mercado está se consolidando com o declínio de vendas A Figura A7 mostra a primeira página da folha de dados Algumas das seções principais são destacadas em azul O título é SN54HC04 SN74HC04 HEX INVERTERS HEX INVERTERS significa que o chip contém seis inversores SN indica que a TI é o fabricante Outros códigos de fabricação incluem MC para Motorola e DM para a National Semiconductor Geralmente o leitor pode ignorar esses códigos porque todos os fabricantes disponibilizam lógica de série 74xx compatível HC é a família lógica alta velocidade CMOS A família lógica determina a velocidade e o consumo de energia do chip mas não a função Por exemplo os chips 7404 74HC04 e 74LS04 contêm todos seis inversores mas diferem em desempenho e custo Outras famílias lógicas são discutidas na Seção A6 Os chips 74xx operar em toda a gama de temperaturas comercial ou industrial 0 a 70 C ou de 40 a 85 C respectivamente ao passo que os chips 54xx operam em toda a gama militar de temperaturas 55 a 125 C e são vendidos por um preço mais elevado mas são apesar disso compatíveis O 7404 está disponível em muitos pacotes diferentes e é importante para quando o leitor faz uma compra Os pacotes são distinguidos por um sufixo no número de peça O N indica um pacote PDIP plastic dual inline package que se encaixa numa breadboard ou pode ser soldada throughholes numa placa de circuito impresso Outros empacotamentos são descritos na Secção A7 Apêndice A Implementação de Sistemas Digitais 837 A tabela funcional mostra que cada porta inverte a sua entrada Se A está a High H Y está a Low L e viceversa O quadro é trivial neste caso mas é mais interessante para chips mais complexos A Figura A8 mostra a segunda página da ficha de dados O diagrama lógico indica que o chip contém inversores A secção absolute maximum indica as condições para além das quais o chip poderá ser destruído Em particular a tensão de alimentação VCC também chamado VDD neste livro não deve ser superior a 7 V A corrente contínua de saída não deve exceder os 25 mA A resistência térmica ou impedância θJA é utilizada para calcular o aumento de temperatura causado por dissipação de energia no chip Se a temperatura ambiente na vizinhança do chip é TA e o chip dissipa Pchip em seguida a temperatura no próprio chip na sua junção com o pacote será 𝑇𝐽 𝑇𝐴 𝑃𝑐ℎ𝑖𝑝𝜃𝐽𝐴 A3 Por exemplo se um chip 7404 num pacote DIP de plástico está a funcionar dentro de uma caixa aquecida a 50 C e consome 20 mW a temperatura da junção irá subir para 50 C 002 W 80 C W 516 C A dissipação de energia interna raramente é importante para os chips da série 74xx mas tornase importante para os chips modernos que dissipam dezenas de watts ou mais Apêndice A Implementação de Sistemas Digitais 838 Figura A7 Página 1 do data sheet do 7404 Apêndice A Implementação de Sistemas Digitais 839 Figura A8 Página 2 do data sheet do 7404 Apêndice A Implementação de Sistemas Digitais 840 As condições de operação recomendadas definem o ambiente no qual o chip deve ser usado Dentro destas condições o chip deve observar as especificações Estas condições são mais rigorosas do que os máximos absolutos Por exemplo a tensão de alimentação deve estar compreendida entre 2 e 6 V Os níveis lógicos de entrada para a família lógica HC depende de VDD Use as entradas de 45 V quando VDD 5 V para permitir uma queda de 10 no fornecimento de energia provocado pelo ruído no sistema A Figura A9 mostra a terceira página da ficha de dados As características eléctricas descrevem como o dispositivo funciona quando usado dentro das condições de operação recomendadas se as entradas são mantidas constantes Por exemplo se a VCC 5 V e desce para 45 V e a corrente de saída IOH IOL não excede os 20 μΑ VOH 44 V e 01 V VOL no pior dos casos Se a saída de corrente aumenta a tensão de saída se torna menos ideal porque os transístores no chip lutam para fornecer a corrente A família lógica HC usa transístores CMOS que exigem muito pouca corrente A corrente em cada entrada é garantida ser menor do que 1000 nA e é tipicamente de apenas 01 nA à temperatura ambiente A corrente de alimentação de repouso IDD exigida enquanto o chip está ocioso é menor que 20 μΑ Cada entrada tem menos do que 10 pF de capacidade As características de comutação definem como o dispositivo funciona quando usado dentro das condições de operação recomendadas se as entradas mudam O atraso de propagação tpd é medido a partir da entrada quando passa através de 05 VCC para quando a saída passa através de 05 VCC Se VCC é nominalmente 5 V e o chip lida com uma capacidade de menos de 50 pF o atraso de propagação não será superior a 24 ns e tipicamente será muito mais rápido Lembrese que cada entrada pode apresentar 10 pF de modo que o chip não pode dirigir mais de cinco chips idênticos à velocidade máxima Na verdade a capacidade parasita das ligações dos chips diminui mais a carga útil O tempo de transição também chamado de tempo de subidadescida é medido como as transições de saída entre 01 VCC e 09 VCC Lembrese da Seção 18 que os chips consomem tanto potência estática como dinâmica A energia estática é baixa para circuitos HC A 85 C a corrente de alimentação de quiescente máxima é 20 μΑ A 5 V corresponde um consumo de energia estática de 01 mW A potência dinâmica depende da capacitância com que lida e a frequência de comutação O 7404 tem uma capacidade de dissipação de energia interna de 20 pF por inversor Se todos os seis inversores do 7404 comutam a 10MHz e Apêndice A Implementação de Sistemas Digitais 841 lidam com cargas externas de 25 pF então a potência dinâmica dada pela Equação 14 é ½ 6 20 pF 25 pF 52 10 MHz 3375 mW e a potência total máxima é de 3385 mW Figura A9 Página 3 do data sheet do 7404 Apêndice A Implementação de Sistemas Digitais 842 A6 FAMÍLIA LÓGICAS Os chips lógicos da série 74xx foram fabricados com muitas tecnologias diferentes chamadas de famílias lógicas que oferecem diferentes compromissos de velocidade potência e nível lógico Outros chips são normalmente concebidos para serem compatíveis com algumas destas famílias lógicas Os chips originais tais como o 7404 foram construídos utilizando transístores bipolares numa tecnologia chamada TransistorTransistor Logic TTL As tecnologias mais recentes adicionam uma ou mais letras depois do 74 para indicar a família lógica como 74LS04 74HC04 ou 74AHCT04 A Tabela A2 resume as famílias mais comuns de lógica 5 V Os avanços nos circuitos bipolares e na tecnologia de processo levaram à Schottky S e às famílias LowPower Schottky LS Ambas são mais rápidas do que a TTL A Schottky exige mais energia enquanto a LowPower Schottky consome menos A Schottky Advanced AS e a Advanced LowPower Schottky ALS melhoraram a velocidade e a potência em comparação com a S e a LS A lógica fast F é mais rápida e consome menos energia do que a AS Todas estas famílias fornecem mais corrente para as saídas a LOW do que para saídas a HIGH e portanto têm níveis lógicos assimétricos Elas estão em conformidade com os níveis lógicos TTL VIH 2V VIL 08 V VOH 24 V e VOL 05 V Como os circuitos CMOS amadureceram nos anos 1980 e 1990 eles se tornaram populares porque eles exigem pouca energia ou corrente de entrada As famílias High Speed CMOS HC e Advanced High Speed CMOS AHC exigem quase nenhuma potência estática Elas também entregam a mesma corrente para saídas HIGH e LOW Estão em conformidade com os níveis lógicos CMOS VIH 315 V VIL 135 V VOH 38 V e VOL 044 V Infelizmente estes níveis são incompatíveis com circuitos TTL porque uma saída a HIGH TTL de 24 V pode não ser reconhecida como uma entrada CMOS HIGH válida Isso motiva o uso da lógica High Speed TTL compatível com a CMOS HCT e Advanced High Speed TTL compatível com CMOS ACTH que aceitam níveis lógicos de entrada TTL e geraram níveis lógicos de saída CMOS válidos Estas famílias são ligeiramente mais lentas do que as suas homólogas CMOS puras Todos os chips CMOS são sensíveis à descarga eletrostática ESD electrostatic discharge causada pela eletricidade estática Por isso devese tocar num grande objeto de metal antes de manusear os chips CMOS Apêndice A Implementação de Sistemas Digitais 843 Tabela A2 Especificações típicas para famílias lógicas de tensão reduzida A lógica da série 74xx é barata As famílias lógicas mais recentes são muitas vezes mais baratas do que as obsoletas A família LS é amplamente disponível e robusta e é uma escolha popular para projetos de laboratório ou passatempo que não têm necessidades especiais de desempenho O padrão de 5 V entrou em colapso em meados dos anos 1990 quando os transístores se tornaram pequeno demais para suportar a tensão Além disso a tensão mais reduzida permite um menor consumo de energia Agora 33 25 18 e 12 V são as tensões mais baixas usadas comumente A pletora de tensões coloca desafios na comunicação entre os chips com diferentes Apêndice A Implementação de Sistemas Digitais 844 fontes de alimentação A Tabela A3 lista algumas das famílias lógicas de baixa tensão Nem todos os dispositivos 74xx estão disponíveis em todas estas famílias lógicas Tabela A3 Especificações típicas para famílias lógicas de baixa tensão Todas as famílias lógicas de tensão reduzida usam transístores CMOS o cavalo de trabalho dos modernos circuitos integrados Eles operam sobre uma vasta gama de VDD mas a velocidade degrada a tensão mais reduzida A lógica LowVoltage CMOS LVC e a lógica Advanced LowVoltage CMOS ALVC são comumente usadas em 33 25 ou 18 V A LVC permite entradas até 55 V para que possa receber entradas de circuitos 5V CMOS ou TTL A lógica Advanced UltraLowVoltage CMOS AUC é comumente usado em 25 18 ou 12 V e é excepcionalmente rápida Tanto a ALVC como a AUC suportam entradas até 36 V para que possam receber entradas de circuitos 33 V As FPGA muitas vezes oferecem fontes de tensão separadas para a lógica interna chamada de núcleo e para pinos de entradasaída IO Como as FPGA têm evoluído a tensão do núcleo caiu Apêndice A Implementação de Sistemas Digitais 845 de 5 para 33 25 18 e 12 V para economizar energia e evitar danificar os transístores muito pequenos As FPGA têm IO configurável para que possam operar a tensões diferentes de modo a serem compatíveis com o resto do sistema A7 EMPACOTAMENTO E MONTAGEM Os circuitos integrados são normalmente colocados em embalagens de plástico ou cerâmica O empacotamento tem várias funções incluindo ligar os pequenos pinos de metal do IO do chip aos pinos maiores no pacote para facilidade de ligação protegendo o chip de danos físicos e dissipar o calor gerado pelo chip sobre uma área maior para ajudar a refrigerar Os pacotes são colocados numa placa de ensaio ou placa de circuito impresso e ligados entre si para a montagem do sistema Empacotamento A Figura A10 mostra uma variedade de pacotes de circuitos integrados Os pacotes podem ser geralmente classificados como Throughhole ou Surface Mount SMT Os throughhole como o seu nome indica têm pinos que podem ser inseridos através de furos numa placa de circuito impresso ou em socket Os Dual Inline Packages DIP têm duas fileiras de pinos com espaçamento de 01 polegadas entre pinos O Pin Grid Arrays PGA suporta mais pinos num empacotamento mais pequeno colocando os pinos na parte inferior do pacote O empacotamento SMT é soldado diretamente na superfície de uma placa de circuito impresso sem o uso de furos Os pinos no empacotamento SMT são chamado de leads O empacotamento Thin Small Outline Package TSOP tem duas linhas de leads espaçadas espaçamento tipico de 002 polegadas Os Plastic Leaded Chip Carriers PLCC têm ligações em forma de J em todos os quatro lados com espaçamento de 005 polegadas Eles podem ser soldados directamente a uma placa ou colocados em encaixes especiais Os Quad Flat PQFP acomodam um elevado número de pinos utilizando pinos em todos os quatro lados Os Ball Grid Arrays BGA eliminam completamente os pinos Em vez disso têm centenas de pequenas bolas de solda na parte inferior do empacotamento São cuidadosamente colocados sobre os correspondentes pads na placa de circuito impresso que em seguida é aquecida de modo a que a solda derreta e una o pacote à placa de base Apêndice A Implementação de Sistemas Digitais 846 Figura A10 Empacotamento de circuitos integrados Breadboard Os DIP são fáceis de utilizar em prototipagem porque podem ser colocados numa breadboard A breadboard de plástico contém as linhas de bases como mostrado na Figura A11 Todos os cinco furos numa fileira estão ligados entre si Cada pino do pacote é colocado num orifício de uma linha separada Os fios podem ser colocados em furos adjacentes na mesma linha para fazer ligações ao pino A breadboard fornecem muitas vezes colunas separadas de furos conectados no topo da placa para distribuição de energia e terra Apêndice A Implementação de Sistemas Digitais 847 Figura A11 Circuito numa breadboard A Figura A11 mostra uma placa de ensaio contendo uma porta maioria construída com um chip AND 74LS08 e um chip OR 74LS32 O esquema do circuito é mostrado na Figura A12 Cada porta no esquema é rotulada com o chip 08 ou 32 e os números dos pinos das entradas e saídas ver Figura A1 Observase que as mesmas conexões são feitas na placa de ensaio As entradas estão ligadas aos pinos 1 2 e 5 do chip 08 e a saída é observada no pino 6 do chip 32 A alimentação e a terra são ligadas aos pinos 14 e 7 respectivamente de cada chip a partir das colunas verticais de alimentação e de terra que estão ligadas às tomadas de ficha de banana Vb e Va Rotulando o esquema desta maneira e verificando as conexões como elas são realizadas é uma boa forma de reduzir o número de erros cometidos durante a construção do circuito Apêndice A Implementação de Sistemas Digitais 848 Infelizmente é fácil ligar acidentalmente um fio no buraco errado ou um fio cair então a utilização de breadboards requer uma grande dose de atenção e geralmente alguma depuração no laboratório As breadboards são adequadas apenas para prototipagem não para produção Figura A12 Esquema do circuito com chips e identificação dos pinos Placas de Circuito Impresso Em vez de serem montados numa breadboard os circuitos integrados podem ser soldados numa placa de circuito impresso PCB printed circuit board A PCB é formada por camadas alternadas de cobre e isolante epoxi O cobre é removido para formar fios chamados traços Os furos chamados de vias são perfurados através da placa e revestidos com metal para os conectar entre as camadas Os PCB são normalmente concebidos com ferramentas CAD de desenho assistido por computador O leitor pode gravar e perfurar suas próprias placas em laboratório ou pode enviar o projeto da placa para uma fábrica especializada para produção de baixo custo em massa As fábricas têm tempos de resposta de dias ou semanas para corridas de baixo custo de produção em massa e geralmente cobram algumas centenas de dólares em custos adicionais e alguns dólares para placa moderadamente complexas construídas em grandes quantidades Apêndice A Implementação de Sistemas Digitais 849 Figura A13 Secção transversal de um PCB Os traços do PCB são normalmente feitos de cobre devido à sua baixa resistência São incorporados num material isolante geralmente um plástico verde resistente ao fogo chamado FR4 O PCB também normalmente tem uma camada de cobre de energia e terra chamados de planos entre camadas de sinal A Figura A13 mostra uma secção transversal de uma PCB As camadas de sinal estão na parte superior e na parte inferior e os planos de energia e de terra são incorporadas no centro da placa Os planos de alimentação e terra têm resistência baixa para que possam distribuir a energia de modo estável aos componentes na placa Permitem também tonar previsível e uniforme a capacitância e a indutância dos traços A Figura A14 mostra uma PCB para um computador Vintage de 1970 Apple II Na parte superior há um microprocessador 6502 Abaixo estão seis chips de memória ROM de 16 Kb formando 12 KB de ROM que contém o sistema operacional Três fileiras de oito chips de 16 Kb DRAM fornecer 48 KB de RAM À direita há várias linhas de lógica da série 74xx para decodificação dos endereços de memória e outras funções As linhas entre chips são traços que interligam os chips Os pontos nas extremidades de alguns dos traços são vias cheias de metal Apêndice A Implementação de Sistemas Digitais 850 Figura A14 Placa do circuito do Apple II Apêndice A Implementação de Sistemas Digitais 851 A8 LINHAS DE TRASMISSÃO Temos assumido que as ligações são conexões equipotenciais que têm uma única tensão ao longo de todo o seu comprimento Os sinais realmente se propagam ao longo dos condutores à velocidade da luz na forma de ondas eletromagnéticas Se estes são suficientemente curtos ou os sinais variam lentamente a suposição de equipotencial é boa Quando o condutor é longo ou o sinal é muito rápido o tempo de transmissão ao longo do condutor tornase importante para determinar com precisão o atraso de circuito Devemos possuir modelos nos quais os condutores são linhas de transmissão em que uma onda de tensão e corrente se propaga à velocidade da luz Quando a onda atinge o fim da linha pode haver uma reflexão de volta ao longo da linha A reflexão pode causar ruído e comportamentos estranhos a menos que sejam tomadas medidas para os limitar Assim o projetista digital deve considerar o comportamento da linha de transmissão para contabilizar com precisão os efeitos de atraso e de ruído em condutores longos As ondas eletromagnéticas viajam à velocidade da luz num determinado meio que é rápida mas não é instantânea A velocidade da luz ν depende da permitividade ε e permeabilidade μ do meio 𝑣 1 𝜇𝜀 1 𝐿𝐶 A velocidade da luz no espaço livre é de 𝑣 𝐶 3 108 𝑚𝑠 Os sinais viajam num PCB em cerca de metade dessa velocidade porque o isolador FR4 tem quatro vezes a permissividade do ar Assim os sinais do PCB viajam a cerca de 15 108 𝑚𝑠 ou 15 𝑐𝑚𝑛𝑠 O tempo de atraso para um sinal para viajar ao longo de uma linha de transmissão de comprimento l é 𝑡𝑑 𝑙 𝑣 A4 A impedância característica da linha de transmissão Z0 é a razão entre a tensão e a corrente de uma onda que se desloca ao longo da linha 𝑍0 𝑉 𝐼 Não é a resistência do fio uma boa linha de transmissão num sistema digital tipicamente tem resistência desprezível Z0 depende da indutância e capacitância da linha ver a Secção A87 e tipicamente tem um valor de 50 a 75 Ω Apêndice A Implementação de Sistemas Digitais 852 𝑍0 𝐿 𝐶 A4 A Figura A15 mostra o símbolo para uma linha de transmissão O símbolo se assemelha a um cabo coaxial com um condutor de sinal interno e um condutor aterrado exterior como aquele usado na televisão por cabo Figura A15 Representação de uma linha de transmissão A chave para a compreensão do comportamento das linhas de transmissão está em visualizar a propagação da onda de tensão ao longo da linha à velocidade da luz Quando a onda atinge o fim da linha pode ser absorvida ou refletida dependendo da terminação ou carga no final As reflexões viajam de volta ao longo da linha somandose à tensão já na linha As terminações são classificadas como matched open short ou mismatched As Seções a seguir explorar como a onda se propaga ao longo da linha e o que acontece com a onda quando atinge a terminação A81 Terminação Matched A Figura A16 mostra uma linha de transmissão de comprimento l com uma terminação matched o que significa que a impedância da carga ZL é igual à impedância característica Z0 A linha de transmissão tem uma impedância característica de 50 Ω Uma extremidade da linha está ligada a uma fonte de tensão por meio de um interruptor que fecha no momento t 0 A outra extremidade está ligada à carga matched de 50 Ω Esta secção analisa as tensões e as correntes nos pontos A B e C no início da linha a um terço do comprimento da linha e no final da linha respectivamente Apêndice A Implementação de Sistemas Digitais 853 Figura A16 Linha de transmissão com a terminação matched A Figura A17 mostra as tensões nos pontos A B e C ao longo do tempo Inicialmente não há tensão ou corrente na linha de transmissão porque o interruptor está aberto No tempo t 0 o interruptor fecha e a fonte de tensão lança uma onda com a tensão V VS ao longo da linha Isto é chamada a onda incidente Uma vez que a impedância característica é Z0 a onda tem corrente I VS Z0 A tensão atinge o início da linha ponto A imediatamente tal como mostrado na Figura A17 a A onda se propaga ao longo da linha à velocidade da luz No instante td3 a onda atinge o ponto B A tensão neste ponto se eleva bruscamente de 0 a VS tal como mostrado na Figura A17 b No instante td a onda incidente atinge o ponto C no final da linha a tensão aumenta também ai Toda a corrente I flui para o resistor ZL produzindo uma tensão através da resistência de ZLI ZL VS Z0 VS porque ZL Z0 Esta tensão é consistente com a onda que flui ao longo da linha de transmissão Assim a onda é absorvida pela impedância de carga e a linha de transmissão atinge o seu estado de equilíbrio Em estado estacionário a linha de transmissão comportase como um fio de potencial ideal pois é afinal apenas um fio A tensão em todos os pontos ao longo da linha deve ser idêntica A Figura A18 mostra o modelo equivalente em estado estacionário para o circuito da Figura A6 A tensão é VS em todos os pontos ao longo do fio Exemplo A2 LINHAS DE TRANSMISSÃO COM FONTE MATCHED E TERMINAÇÃO DE CARGA A Figura A19 mostra uma linha de transmissão com impedâncias de fonte e de terminação matched ZS e ZL Represente a tensão nos nós A B e C em função do tempo Quando é que o sistema atinge o estado estacionário e qual é o circuito equivalente no estado de equilíbrio Solução Quando a fonte de tensão tem uma impedância ZS em série com a linha de transmissão parte da queda de tensão ocorre através de ZS e o restante propagase ao longo da linha de transmissão Figura A17 Formas de onda da Figura A16 nos pontos A B e C Figura A18 Circuito equivalente da Apêndice A Implementação de Sistemas Digitais 854 Em primeiro lugar a linha de transmissão comportase como uma impedância Z0 porque a carga na extremidade da linha possivelmente não pode influenciar o comportamento da linha até que um atraso à velocidade de luz tenha ocorrido Assim pela equação do divisor de tensão a tensão incidente que flui pela linha é 𝑉 𝑉𝑆 𝑍0 𝑍0𝑍𝑆 𝑉𝑠 2 A6 Assim no instante t 0 uma onda de tensão V VS2 é enviada do ponto A pela linha Mais uma vez o sinal atinge o ponto B no tempo td3 e o ponto C em td como mostrado na Figura A20 Toda a corrente é absorvida pela impedância de carga ZL de modo que o circuito entra em estado estacionário em t td Em estado estacionário a linha inteira está a VS2 assim como o circuito de estado estacionário equivalente na Figura A21 permite prever Figura A19 Linha de transmissão com match de impedâncias de fonte e de carga A82 Terminação Open Quando a impedância de carga não é igual a Z0 a terminação não pode absorver a totalidade da corrente e alguma da onda vai ser refletida A Figura A23 mostra uma linha de transmissão com uma terminação de carga open Nenhuma corrente pode fluir através de uma terminação open de modo que a corrente no ponto C deve ser sempre 0 A tensão na linha é inicialmente zero Em t 0 o interruptor fecha e uma onda de tensão 𝑉 𝑉𝑆 𝑍0 𝑍0𝑍𝑆 𝑉𝑠 2 começa a propagarse pela linha Notese que esta onda inicial é a mesma que a do Exemplo A2 e é independente da terminação porque a carga na extremidade da linha não pode influenciar o comportamento no início até pelo menos que 2td tenha decorrido Esta onda atinge o ponto B em td3 e o ponto C em td como mostrado na Figura A22 Figura A20 Formas de onda da Figura A19 nos pontos A B e C Figura A21 Circuito equivalente da Figura A19 no regime estacionário Apêndice A Implementação de Sistemas Digitais 855 Quando a onda incidente atinge o ponto C não pode continuar em frente porque o condutor está aberto Deve em vez refletir de volta para a fonte A onda refletida também tem tensão V VS2 pois a terminação open reflete a onda inteira Figura A23 Linha de transmissão com terminação open A83 Terminação Short A Figura A24 mostra uma linha de transmissão terminada com um curtocircuito à terra Assim a tensão no ponto C deve ser sempre 0 Como nos exemplos anteriores as tensões na linha são inicialmente 0 Quando o interruptor fecha uma onda de tensão V VS2 começa a propagarse pela linha Figura A25 Quando chega ao fim da linha deve refletir com polaridade oposta A onda refletida com tensão V VS2 somase à onda incidente assegurando que a tensão no ponto C permanece 0 A onda refletida atinge a fonte no instante t 2td e é absorvida pela impedância de fonte Neste momento o sistema atinge o regime estacionário e a linha de transmissão é equivalente a um condutor de equipotencial com tensão nula Figura A25 Figura A24 Linha de transmissão com terminação short Figura A22 Formas de onda da Figura A23 nos pontos A B e C Apêndice A Implementação de Sistemas Digitais 856 A84 Terminação Mismatched A impedância de terminação é dita mismatched quando não for igual à impedância característica da linha Em geral quando uma onda incidente atinja uma terminação mismatched parte da onda é absorvida e parte é refletida O coeficiente de reflexão kr indica a fracção da onda incidente Vi que é refletida Vr krVi A Seção A88 deriva o coeficiente de reflexão usando a conservação das correntes Isso mostra que quando uma onda incidente que flui ao longo de uma linha de transmissão de impedância característica Z0 atinge uma impedância de terminação ZT no final da linha o coeficiente de reflexão é 𝑘𝑟 𝑍𝑇𝑍0 𝑍𝑇𝑍0 A7 De notar alguns casos especiais Se a terminação é um circuito aberto ZT kr 1 porque a onda incidente é refletida totalmente assim a corrente para fora da extremidade da linha permanece zero Se a terminação é um curtocircuito ZT 0 R 1 porque a onda incidente é refletida com a fase invertida de modo que a tensão na extremidade da linha permanece zero Se a terminação é uma carga matched ZT Z0 kr 0 porque a onda incidente é completamente absorvida A Figura A26 ilustra a reflexão numa linha de transmissão com uma terminação de carga mismatched de 75 Ω ZT ZL 75 Ω e Z0 50 Ω então kr 15 Como nos exemplos anteriores a tensão na linha é inicialmente 0 Quando o interruptor é fechado uma onda de tensão V VS2 propagase pela linha atingindo o fim em t td Quando a onda incidente atinge a terminação no final da linha um quinto da onda é refletida e os restantes quatro quintos fluem para a impedância de carga Assim a onda refletida tem uma tensão de V VS2 15 VS10 A tensão total no ponto C é a soma da tensão de entrada e da refletida VC VS2 VS10 3VS5 Em t 2td a onda refletida atinge o ponto A onde é absorvida pela terminação de 50 Ω ZS A Figura A27 representa graficamente as correntes e tensões ao longo da linha Mais uma vez devemos notar que em regime estacionário neste caso no instante t 2td a linha de transmissão é equivalente a um condutor de potencial como mostrado na Figura A28 No regime estacionário o sistema atua como um divisor de tensão assim Figura A25 Formas de onda da Figura A24 nos pontos A B e C Apêndice A Implementação de Sistemas Digitais 857 𝑉𝐴 𝑉𝐵 𝑉𝐶 𝑉𝑆 𝑍𝐿 𝑍𝐿𝑍𝑆 𝑉𝑆 75Ω 75Ω50Ω 3𝑉𝑠 5 A8 Figura A26 Linha de transmissão com terminação mismatched Figura A27 Formas de onda da Figura A26 nos pontos A B e C Figura A28 Circuito equivalente da Figura A26 em regime estacionário As reflexões podem ocorrer em ambas as extremidades da linha de transmissão A Figura A29 mostra uma linha de transmissão com uma impedância da fonte ZS de 450 Ω e uma terminação open na carga Os coeficientes de reflexão na carga e fonte krL e krS são 1 e 45 respectivamente Neste caso as ondas refletem de ambas as extremidades da linha de transmissão até que um regime estacionário seja atingido Apêndice A Implementação de Sistemas Digitais 858 Figura A29 Linha de transmissão com terminação de carga e fonte mismatched O diagrama de bounce mostrado na Figura A30 ajuda a visualizar as reflexões de ambas as extremidades da linha de transmissão O eixo horizontal representa a distância ao longo da linha de transmissão e o eixo vertical representa o tempo aumentando para baixo Os dois lados do diagrama de bounce representam as extremidades da fonte e de carga da linha de transmissão os pontos A e C As ondas dos sinais de entrada e refletidos são desenhados como linhas diagonais entre os pontos A e C No instante t 0 a impedância da fonte e da linha de transmissão comporta se como um divisor de tensão lançando uma onda de tensão VS10 do ponto A para o ponto C No instante t td o sinal atinge o ponto C e é totalmente refletido krL 1 No instante t 2td a onda refletida de VS10 atinge o ponto A e é refletida com um coeficiente de reflexão krS 45 para produzir uma onda de 2VS25 que viaja para o ponto C e assim por diante A tensão num determinado momento em qualquer ponto da linha de transmissão é a soma de todos as ondas incidentes e refletidas Assim no instante t 11td a tensão no ponto C é VS10 VS10 VS5 No instante t 31td a tensão no ponto C é VS10 VS10 2VS25 2VS25 9VS25 e assim por diante A Figura A31 traça as tensões no tempo Com t a aproximarse do infinito as tensões se aproximam do regime estacionário com VA VB VC VS Figura A30 Diagrama de bounce para a figura A29 Apêndice A Implementação de Sistemas Digitais 859 Figura A31 Formas de onda da tensão e da corrente para a Figura A29 A85 Quando Devemos usar Modelos das Linhas de Transmissão Os modelos de linhas de transmissão para os condutores são necessários sempre que o atraso do condutor td é maior do que uma fracção por exemplo 20 das taxas de transição tempos de subida ou descida de um sinal Se o atraso do condutor é menor tem um efeito desprezável de atraso na propagação do sinal e as reflexões dissipamse enquanto o sinal ainda está em transição Se o atraso do condutor é maior deve ser considerado a fim de prever com precisão o atraso de propagação e a forma de onda do sinal Em particular as reflexões podem distorcer a característica digital de uma forma de onda resultando em operações lógicas incorretas Lembrese que os sinais viajam num PCB a cerca de 15 cmns Para a lógica TTL com taxas de transição de 10 ns os condutores devem ser modelados como linhas de transmissão somente se possuem um comprimento superior a 30 cm 10ns 15 cmns 20 As pistas nos PCB são geralmente menores que 30 cm por isso a maioria das pistas pode ser modelada como um condutor equipotencial ideal Em contraste muitos chips modernos têm taxas de transição de 2ns ou menos de modo que pistas com mais do que cerca de 6 cm cerca de 25 polegadas devem ser modeladas como linhas de transmissão Claramente a utilização de taxas de transição que são mais complicadas do que o necessário apenas provoca dificuldades ao projetista As breadboards não têm um plano de terra de modo que os campos eletromagnéticos de cada sinal são nãouniformes e por isso é difícil criar um modelo Além disso os campos interagem com os sinais Isso pode causar reflexos estranhos e crosstalk entre os sinais Assim as breadboards não são fiáveis acima de alguns megahertz Apêndice A Implementação de Sistemas Digitais 860 Em contraste os PCB têm boas linhas de transmissão com impedância característica e velocidade consistente ao longo de toda a linha Se são terminadas com uma fonte ou impedância de carga matched com a impedância da linha as pistas nos PCB não sofrem reflexões A86 Terminações Adequadas das Linhas Há duas maneiras comuns para terminar adequadamente uma linha de transmissão mostradas na Figura A32 Na terminação paralela o driver tem uma baixa impedância ZS 0 Uma resistência de carga ZL com impedância Z0 é colocada em paralelo com a carga entre a entrada da porta do receptor e da terra Quando o driver comuta de 0 para VDD envia uma onda de tensão VDD pela linha A onda é absorvida pela terminação de carga matched e não há lugar a reflexões Na terminação série uma resistência de fonte ZS é colocada em série com o condutor para aumentar a impedância da fonte para Z0 A carga tem uma alta impedância ZL Quando o driver comuta envia uma onda com VDD tensão2 pela linha A onda reflete na carga do circuito aberto e regressa levando a tensão na linha até VDD A onda é absorvida na terminação da fonte Ambos os esquemas são semelhantes na medida em que a tensão nos receptores comuta de 0 a VDD em t td tal como seria de desejar Eles diferem no consumo de energia e nas formas de onda que aparecem nas outras posições ao longo da linha A terminação paralela dissipa energia continuamente através da resistência de carga quando a linha está a uma tensão High A terminação série não dissipa energia DC porque a carga é um circuito aberto No entanto nas linhas em terminação série os pontos perto do meio da linha de transmissão inicialmente estão sujeitos a uma tensão de VDD2 até que a reflexão volte Se outras portas estão ligadas ao meio da linha elas vão ver momentaneamente um nível lógico ilegal Portanto a terminação série funciona melhor na comunicação pontoaponto com um único driver e um único receptor A terminação paralela é melhor para um barramento com vários receptores porque os receptores no meio da linha nunca veem um nível lógico ilegal Apêndice A Implementação de Sistemas Digitais 861 Figura A32 Modos de terminação a paralela e b série Apêndice A Implementação de Sistemas Digitais 862 A87 Derivação de Z0 Z0 é a relação entre a tensão e a corrente numa onda em propagação ao longo de uma linha de transmissão Esta Seção deriva Z0 que pressupõe algum conhecimento prévios de análise de circuitos resistênciaindutorcondensador RLC Imagine que uma tensão em degrau é aplicada à entrada de uma linha de transmissão semiinfinita de modo que não haja reflexões A Figura A33 a mostra a linha semiinfinita e um modelo de um segmento da linha de comprimento dx Os parâmetros R G e C são os valores de resistência de indutância e de capacitância por unidade de comprimento A Figura A33 b mostra o modelo da linha de transmissão com um componente resistivo R Isto é chamado um modelo de linha de transmissão com perdas porque a energia é dissipada ou perdida na resistência do condutor No entanto esta perda é muitas vezes desprezível e podemos simplificar a análise ignorando o componente resistivo e tratar a linha de transmissão como uma linha de transmissão ideal como mostrado na Figura A33 c A tensão e a corrente são funções do tempo e do espaço ao longo da linha de transmissão como dado por Equações A8 e A9 𝑥 𝑉𝑥 𝑡 𝐿 𝑡 𝐼𝑥 𝑡 A8 𝑥 𝐼𝑥 𝑡 𝐶 𝑡 𝑉𝑥 𝑡 A9 Tomando a derivada no espaço da Equação A8 e a derivada temporal da Equação A9 e substituindo resulta na Equação A10 a equação de onda 2 𝑥2 𝑉𝑥 𝑡 𝐿𝐶 2 𝑡2 𝑉𝑥 𝑡 A10 Z0 é a relação entre a tensão e a corrente na linha de transmissão tal como ilustrado na Figura A34 a Z0 deve ser independente do comprimento da linha pois o comportamento da onda não pode depender de coisas à distância Uma vez que é independente do comprimento a impedância deve ainda ser igual a Z0 após a adição de uma pequena quantidade de linha de transmissão dx como mostrado na Figura A34 b Apêndice A Implementação de Sistemas Digitais 863 Figura A33 Modelo para linhas de transmissão a cabo semiinfinito b perdas c ideal Figura A34 Modelo para a linha de transmissão a linha completa e b comprimento adicional dx Introduzindo as impedâncias de um indutor e um condensador podemos reescrever a relação da Figura A34 na forma de equação 𝑍0 𝑗𝜔𝐿𝑑𝑥 𝑍0 1 𝑗𝜔𝐶𝑑𝑥 A11 Fazendo um rearranjo obtemos 𝑍0 2𝑗𝜔𝐶 𝑗𝜔𝐿 𝜔2𝑍0𝐿𝐶𝑑𝑥 0 A12 Tomando o limite quando x tende para 0 o último termo desaparece e encontramos que 𝑍0 𝐿 𝐶 A13 A88 Derivação do Coeficiente de Reflexão O coeficiente de reflexão kr é derivado utilizando a conservação da corrente A Figura A35 mostra uma linha de transmissão com impedância característica Z0 e impedância de carga ZL Imagine que uma Apêndice A Implementação de Sistemas Digitais 864 onda incidente de tensão Vi e corrente Ii Quando a onda atinge a terminação alguma corrente IL flui através da impedância de carga provocando uma queda de tensão VL O restante da corrente reflete de volta na linha numa onda de tensão Vr e corrente de Ir Z0 é a relação entre a tensão e a corrente da onda que se propaga ao longo da linha de modo que ViIi VrIr Z0 A tensão na linha é a soma das ondas de tensão incidentes e refletidas A corrente que flui no sentido positivo na linha é a diferença entre as correntes das ondas incidentes e refletidas 𝑉𝐿 𝑉𝑖 𝑉𝑟 A14 𝐼𝐿 𝐼𝑖 𝐼𝑟 A15 Figura A35 Linha de transmissão mostrando as tensões e correntes de entrada refletida e carga Usando a lei de Ohm e substituindo IL Ii e Ir na Equação A15 obtemos 𝑉𝑖𝑉𝑟 𝑍𝐿 𝑉𝑖 𝑍0 𝑉𝑟 𝑍0 A16 Rearranjando resolvemos em ordem ao coeficiente kr 𝑉𝑟 𝑉𝑖 𝑍𝐿𝑍0 𝑍𝐿𝑍0𝑘𝑟 A16 A89 Colocado Tudo Junto As linhas de transmissão modelam o facto de que os sinais precisam de tempo para se propagar ao longo de condutores longos porque a velocidade da luz é finita Uma linha de transmissão ideal tem indutância L uniforme e capacitância C por unidade de comprimento e resistência zero A linha de transmissão é caracterizada através da sua impedância característica Z0 e atraso td que pode ser derivada a partir da indutância da capacitância e do comprimento do cabo A linha de transmissão Apêndice A Implementação de Sistemas Digitais 865 tem efeitos significativos de atraso e de ruído em sinais cujos tempos de subidadescida são inferiores a cerca de 5td Isto significa que para sistemas com tempos de subidadescida de 2 ns as pistas do PCB com mais do que cerca de 6 cm devem ser analisadas como linhas de transmissão para perceber com precisão o seu comportamento Um sistema digital consiste de uma porta que define o estado de um longo condutor ligado à entrada de um segundo portão pode ser modelado com uma linha de transmissão conforme mostrado na Figura A36 A fonte de tensão a impedância da fonte ΖS e o interruptor modelam a primeira porta a comutar de 01 no instante 0 A porta de drive não pode fornecer corrente infinita esta é modelada por ZS ZS é geralmente pequena para uma porta lógica mas um projetista pode optar por adicionar um resistor em série com a porta para aumentar ZS e corresponder a impedância da linha A entrada para a segunda porta é modelada como ZL Os circuitos CMOS geralmente têm pouca corrente de entrada de modo que ZL pode estar perto do infinito O projetista também pode optar por adicionar um resistor em paralelo com a segunda porta entre a entrada da porta e da terra de modo que ZL corresponde à impedância da linha Figura A36 Sistema digital modelado com linhas de transmissão Apêndice A Implementação de Sistemas Digitais 866 Quando a primeira porta comuta uma onda de tensão é aplicada na linha de transmissão A impedância da fonte e a linha de transmissão formam um divisor de tensão de modo que a tensão da onda incidente é 𝑉𝑖 𝑉𝑠 𝑍0 𝑍0𝑍𝑠 A18 No instante td a onda atinge o fim da linha Parte é absorvida pela impedância de carga e uma parte é refletida O coeficiente de reflexão R indica que porção se reflete R VrVI onde Vr é a tensão da onda refletida e Vi é a tensão da onda incidente 𝑘 𝑍𝐿𝑍0 𝑍𝐿𝑍0 A19 A onda refletida adicionase à tensão já existente na linha Atinge a fonte no instante 2td onde uma parte é absorvida e parte é novamente refletida As reflexões continuam para a frente e para trás e a tensão na linha eventualmente aproximase do valor que seria esperado se a linha fosse um condutor equipotencial simples A9 ECONOMIA Embora o projeto digital seja tão divertido que alguns de nós fazemolo gratuitamente a maioria dos projetistas e empresas pretendem ganhar dinheiro Portanto as considerações económicas são um fator importante nas decisões de projeto O custo de um sistema digital pode ser dividido em custos não recorrentes de engenharia NRE e as despesas recorrentes Os NRE representam o custo de projetar o sistema Ele inclui os custos dos salários da equipa de projeto computação e software e os custos de produção da primeira unidade operacional O custo totalmente de um projetista nos Estados Unidos em 2012 incluindo salário seguro de saúde plano de aposentadoria e um computador com ferramentas de design é cerca de US 200000 por ano então os custos do projeto podem ser significativos Os custos recorrentes são o custo de cada unidade adicional Isto inclui componentes fabricação marketing suporte técnico e transporte Apêndice A Implementação de Sistemas Digitais 867 O preço de venda deve abranger não só o custo do sistema mas também outros custos como aluguel de escritório impostos e salários do pessoal que não contribuem diretamente para o projecto como o zelador e o CEO Depois de todas estas despesas a empresa deve ainda fazer um lucro Exemplo A3 O BEN PROCURA FAZER ALGUM DINHEIRO Ben Bitdiddle projetou um circuito astuto para a contagem das gotas de chuva Ele decide vender o dispositivo e tentar fazer algum dinheiro mas ele precisa de ajuda para decidir qual a implementação a usar Ele decide usar uma FPGA ou um ASIC O kit de desenvolvimento para projetar e testar a FPGA custa 1500 Cada FPGA custa 17 O ASIC custa 600000 para uma máscara e 4 por chip Independentemente de qual o chip escolhido a usar na implementação Ben precisa montar o chip numa placa de circuito impresso PCB que lhe custará 150 por placa Ele acha que pode vender 1000 dispositivos por mês Ben tem trabalhado com uma equipa de estudantes brilhantes por isso não custa nada para ele o projeto Se o preço de venda tem que ser duas vezes o custo margem de lucro de 100 e a vida útil do produto é de 2 anos qual a implementação a ser escolhida Solução Ben descobre o custo total para cada aplicação a 2 anos como mostra a Tabela A4 Mais de 2 anos Ben planeja vender 24000 dispositivos e o custo total é dado na Tabela A4 para cada opção Se a vida útil do produto é de apenas dois anos a opção da FPGA é claramente superior O custo por unidade é de 445500 24000 1856 e o preço de venda é de 3713 por unidade para dar uma margem de lucro de 100 A opção do ASIC teria custado 732000 24000 3050 e teria sido vendida por 61 por unidade Apêndice A Implementação de Sistemas Digitais 868 Tabela A4 Custo FPGA vs ASIC Exemplo A4 BEN FICA GANANCIOSO Depois de ver os anúncios de marketing para o seu produto Ben acha que pode vender ainda mais chips por mês do que o inicialmente esperado Se ele tivesse que escolher a opção ASIC quantos dispositivos por mês ele teria que vender para fazer a opção ASIC mais rentável do que a opção FPGA Solução Ben resolve para o número mínimo de unidades N que ele precisaria vender em 2 anos 600000 N 550 1500 N 1850 Resolvendo a equação obtemos N 46 039 unidades ou 1919 unidades por mês Ele precisaria quase o dobro das vendas mensais para beneficiar da solução ASIC Apêndice A Implementação de Sistemas Digitais 869 Exemplo A5 BEN FICA MENOS GANANCIOSO Ben percebe que os olhos ficaram maiores do que a barriga e acha que não pode vender mais de 1000 dispositivos por mês Mas pensa que a vida útil do produto pode ser superior a 2 anos Num volume de vendas de 1000 dispositivos por mês qual seria o tempo de vida do produto para fazer a opção ASIC valer a pena Solução Se Ben vende mais de 46 039 unidades no total a opção ASIC é a melhor escolha Então Ben precisaria vender um volume de 1000 por mês durante pelo menos 47 meses arredondando para cima que é quase 4 anos Até então o produto é susceptível de ficar obsoleto Os chips são geralmente comprados de um distribuidor em vez de diretamente do fabricante a menos que você esteja precisando dezenas de milhares de unidades A Digikey wwwdigikeycom é um dos principais distribuidores que vende uma grande variedade de produtos electrónicos A Jameco wwwjamecocom e All Electronics wwwallelectronicscom têm catálogos ecléticos com preços competitivos e bem adequado para amadores Apêndice A Implementação de Sistemas Digitais 870 871 B Instruções MIPS Este apêndice sumariza as instruções MIPS utilizadas neste livro As Tabela C1 Tabela C3 definem campos de opcode e funct para cada instrução juntamente com uma breve descrição do que a instrução faz As seguintes notações são usadas reg Conteúdo do registro imm Campo do imediato de 16bit addr Campo de endereço de 26bit de instruções do tipoJ SignImm imediato de sinal estendido de 32bit 16imm15 imm ZeroImm imediato zero estendido de 32bit 16b0 imm Address rs SignImm Address Conteúdo do endereço de memória Address BTA Endereço de destino do salto Apêndice B Instruções MIPS 872 PC 4 SignImm 2 JTA Endereço do salto PC 43128 addr 2b0 label Texto indicando a localização de um instrução O BTA no simulador SPIM é PC SignImm 2 porque não tem atraso de salto Assim se o leitor usar o assembler SPIM para criar código de máquina para um processador MIPS verdadeiro deve diminuir de 1 o campo imediato de cada instrução salto para compensar Apêndice B Instruções MIPS 873 Tabela B1 Instruções organizadas por opcode Apêndice B Instruções MIPS 874 Tabela B1 Instruções organizadas por opcode Contínuação Tabela B2 Instruções do tipoR organizadas pelo campo funct Apêndice B Instruções MIPS 875 Tabela B2 Instruções do tipoR organizadas pelo campo funct continuação Tabela B3 Instruções do tipoF fop 1617 Apêndice B Instruções MIPS 876 877 C Programação em C C1 INTRODUÇÃO O objetivo geral deste livro é dar uma imagem de como os computadores funcionam em muitos níveis dos transístores dos quais eles são construídos por todo o caminho até aos softwares que eles executam Os primeiros cinco Capítulos deste livro trabalham em cima dos níveis mais baixos de abstração dos transístores às portas para os projetos lógicos O Capítulos 6 a 8 saltaram para a arquitetura e trabalharam com a microarquitetura para conectar o hardware ao software Este Apêndice sobre programação em C faz uma ligação lógica entre os Capítulos 5 e 6 cobrindo a programação em C como o nível mais alto de abstração neste texto Ele motiva o material de arquitetura e liga este livro à experiência em programação que já pode ser familiar ao leitor Este material é colocado no Apêndice para que os leitores possam facilmente cobrilo ou pulalo dependendo da sua experiência anterior Os programadores utilizam muitas linguagens diferentes para dizer ao computador o que fazer Fundamentalmente o computador processa instruções em linguagem máquina consistindo de 1𝑠 e 0𝑠 como explorado no Capítulo 6 Mas programar em linguagem máquina é tedioso e lento levando os programadores a utilizar linguagens mais abstratas para obter mais eficientemente o que desejam A Tabela C1 lista alguns exemplos de linguagens em vários níveis de abstração Uma das linguagens mais populares de programação de todos os tempos é chamada C Ela foi desenvolvida por um grupo que incluía Dennis Ritchie e Brian Kernighan da Bell Laboratories entre 1969 e 1973 para reescrever o sistema operacional UNIX a partir de seu código assembly original Por muitas medidas C incluindo uma família de linguagens relacionadas como C C e Objective C é a linguagem existente mais largamente utilizada Sua popularidade é fixada por vários fatores incluindo Disponibilidade em uma tremenda variedade de plataformas de supercomputadores a microcontroladores embarcados Apêndice C Programando em C 878 Relativa facilidade de uso com uma gigantesca base de usuários Nível moderado de abstração fornecendo uma produtividade maior que a linguagem assembly e ainda dando ao programador um bom entendimento de como o código irá ser executado Adequabilidade para a geração de programas de alto desempenho Capacidade de interagir diretamente com o hardware Tabela C1 Linguagens em graus aproximadamente decrescente de abstração Este Capítulo é dedicado à programação em C por uma variedade de razões Mais importante C permite ao programador acessar diretamente endereços na memória ilustrando a conexão entre hardware e software enfatizada nesse livro C é uma linguagem prática que todos os engenheiros e cientistas da computação deveriam saber Ela utiliza muitos aspectos de implementação e projeto isto é desenvolvimento de software programação de sistemas embarcados e simulação tornando a proficiência em C uma habilidade vital e comercial As seguintes Seções descrevem como um todo a sintaxe de um programa em C discutindo cada parte do programa incluindo o cabeçalho declarações de variáveis e funções tipos de dados e funções comumente utilizadas disponibilizadas em bibliotecas A Seção 86 descreve aplicações importantes utilizando C para programar um microcontrolador 𝑃𝐼𝐶32 O C foi formalmente introduzido em 1978 pelo livro clássico de Brian Kernighan e Dennis Ritchie The C Programming Language Em 1989 o American National Standards Institute ANSI expandiu e padronizou a linguagem que se tornou conhecida como ANSI C Standard C ou C89 Logo depois em 1990 esse padrão foi adoptado pela International Organization for Standardization ISO e pelo Intenational Electrotechnical Commission IEC ISOMEC atualizaram a linguagem em 1999 para o que é chamada C99 que é discutida nesse texto Apêndice C Programando em C 879 Resumo Programação de alto nível A programação de alto nível é útil em muitos níveis de projeto da análise de escrita ou simulação de software até a programação de microcontroladores que interagem com hardware Acesso de baixo nível O código em C é poderoso porque juntamente com construtores de alto nível ele disponibiliza acesso a hardware de baixo nível e à memória C2 BEM VINDO AO C Um programa em C é um arquivo de texto que descreve as operações a serem realizadas pelo computador O arquivo texto é compilado convertido num formato legível pela máquina e executado num computador O Exemplo de Código C1 é um simples programa em C que imprime a frase Hello world na consola a tela do computador Programas em C estão geralmente contidos num ou mais arquivos texto que terminam em c Um bom estilo de programação requer um nome de arquivo que indica o conteúdo do programa por exemplo esse exemplo pode ser chamado de helloc Exemplo de Código C1 PROGRAMA C SIMPLES Write Hello world to the console include stdioh int mainvoid printfHello world Saída da Consola Hello world C é a linguagem usada por sistemas onipresentes como Linux Windows e iOS C é uma linguagem poderosa devido ao seu acesso direto ao hardware Quando comparada a outras linguagens como Perl e Matab C não possui muito suporte embutido para operações especializadas como manipulação de arquivos reconhecimento de padrões manipulação matricial e interfaces gráficas Ela também carece de recursos para proteger o programador de erros comuns como escrever dados depois do fim de um array Esse poder combinado a essa carência de proteção tem ajudado hackers que exploram software de sistemas pobremente escritos invadindo assim os sistemas de computadores Apêndice C Programando em C 880 C21 Dissecação de um Programa em C Em geral um programa em C é organizado numa ou mais funções Todos os programas devem incluir a funcao main onde o programa começa a ser executado A maioria dos programas utiliza outras funções definidas em outro lugar do código C eou numa biblioteca As Seções gerais do programa helloc são o cabeçalho a função main e o corpo Cabeçalho include stdioh O cabeçalho inclui as bibliotecas de funções necessárias para o programa Neste caso o programa utiliza a função printf que é parte da biblioteca IO padrão stdioh Veja a Seção C9 para mais detalhes das bibliotecas C builtin Função main int mainvoid Todos os programas em C devem incluir exatamente uma função main A execução do programa ocorre rodandose o código dentro de main chamado corpo de main A sintaxe de uma função é descrita na Seção C9 O corpo de uma função contém uma sequência de declarações Cada declaração termina com um ponto e vírgula O int denota que a função main devolve ou retorna um resultado inteiro que indica que o programa rodou com sucesso Corpo printfHello world O corpo dessa função main contém uma declaração uma chamada para a função prinf a qual imprime a frase Hello world seguida de um caractere de quebra de linha indicado pela sequência especial Mais detalhes a respeito de funções IO são descritos na Seção C91 C22 Rodando um programa C Os programas em C podem rodar em diferentes máquinas Essa portabilidade é outra vantagem de C O programa é primeiramente compilado na máquina desejada utilizandose um compilador C Existem versões ligeiramente diferentes do compilador C incluindo o cc C compiler ou gcc GNU C compiler Aqui mostramos como compilar e rodar um programa utilizando o gcc que é disponibilizado gratuitamente para download Ele roda diretamente em máquinas Linux e é acessado através do ambiente Cygwin em máquinas Windows Ele também é disponibilizado para Enquanto este capítulo fornece uma explicação fundamental de programação em C textos inteiros são escritos para descrever a fundo a linguagem C Um nos nossos favoritos é o texto clássico The C Programming Language de Brian Kernighan e Dennis Ritchie os desenvolvedores de C Esse texto dá uma descrição concisa das nuts and Bolts de C Outro bom texto é o A Book on C de Al Kelley e Ira Pohl Apêndice C Programando em C 881 muitos sistemas embarcados como os microcontroladores 𝑃𝐼𝐶32 da Microchip O processo geral descrito abaixo para a criação de um arquivo C compilação e execução é o mesmo para qualquer programa em C 1 Crie o arquivo texto por exemplo helloc 2 Numa janela do terminal mude o diretório corrente para o que contém o arquivo helloc e digite gcc helloc no prompt de comando 3 O compilador cria um arquivo executável Por padrão o executável é chamado aout ou aexe em máquinas Windows 4 No prompt de comando digite aout ou aexe no Windows e pressione Enter 5 Hello world aparecerá na tela Resumo nomedoarquivoc Arquivos de programas em C são tipicamente nomeados com uma extensão c main Cada programa C deve ter exatamente uma função main include A maioria dos programas em C utilizam funções fornecidas por bibliotecas builtin Essas funções são utilizadas escrevendose include bibliotecah no início do arquivo C gcc nomedoarquivoc Arquivos C são convertidos num executável utilizandose um compilador como o GNU gcc ou o C compiler cc Execução Após a compilação programas em C são executados digitandose aout ou aexe na linha de comando C3 COMPILAÇÃO Um compilador é um pedaço de software que lê um programa numa linguagem de alto nível e o converte num arquivo de código máquina chamado de executável Livros inteiros são escritos sobre Apêndice C Programando em C 882 compiladores mas nós os descreveremos aqui brevemente A operação geral de um compilador é 1 préprocessar o arquivo incluindo as bibliotecas referenciadas e expandindo as definições das macros 2 ignorar toda a informação desnecessária como os comentários 3 traduzir o código de alto nível em instruções simples nativas para o processador que são representadas em binário chamadas código máquina e 4 compilar todas as instruções num único arquivo binário que pode ser lido e executado pelo computador Cada linguagem máquina é específica para um dado processador então o programa deve ser compilado especificamente para o sistema no qual ele irá rodar Por exemplo a linguagem máquina MIPS é coberta no Capítulo 6 em detalhes C31 Comentários Os programadores utilizam comentários para descrever código num alto nível e esclarecer as funções do código Qualquer pessoa que ler um código sem comentários pode atestar a sua importância Programas em C utilizam dois tipos de comentários comentários em linha simples iniciam com e terminam ao final da linha comentários de linhas múltiplas iniciam com e terminam com Enquanto comentários são críticos para a organização e clareza do programa eles são ignorados pelo compilador Esse é um exemplo de um comentário de uma linha Esse é um exemplo de um comentário multilinhas Um comentário no topo de cada arquivo C é útil para descrever o autor do arquivo datas de criação e modificação e propósitos O comentário abaixo pode ser incluído no topo de um arquivo helloc helloc 1 de Junho 2012 SarahHarrishmcedu DavidHarrishmcedu Este programa imprime Hello world na tela Apêndice C Programando em C 883 C32 define Constantes são nomeadas utilizandose a diretiva define e então utilizadas pelo nome durante o programa Estas constantes globalmente definidas também são chamadas macros Por exemplo suponha que você escreve um programa que permite no máximo 5 perguntas do usuário você pode usar define para identificar aquele número define MAXPERGUNTAS 5 O indica que essa linha no programa irá ser tratada pelo préprocessador Antes da compilação o préprocessador substitui cada ocorrência do identificador MAXPERGUNTAS no programa por 5 Por convenção as linhas define estão localizadas no topo do arquivo e os identificadores são escritos todos em letras maiúscula Com a definição de constantes numa localização e então utilizar o identificador no programa o programa permanece consistente e o valor é facilmente modificado ele precisa apenas ser modificado na linha define ao invés de em cada linha de código onde o valor é necessário O Exemplo de Código C2 mostra como utilizar a diretiva define para converter polegadas em centímetros As variáveis inch e cm são declaradas como sendo float para indicar que elas representam números em vírgula flutuante de precisão simples Se o fator de conversão INCH2CM fosse usado ao longo de um programa grande têlo declarado usando define preveniria erros causados por digitação por exemplo digitar 253 ao invés de 254 e facilitaria a localização de alguma mudança por exemplo se mais algarismos significativos fossem requeridos Exemplo de Código C2 USANDO DEFINE PARA DECLARAR CONSTANTES Converte polegadas em centimetros include stdioh define INCH2CM 254 int mainvoid float inch 55 55 polegadas float cm Números constantes em C são decimais por padrão mas também podem ser hexadecimais prefixo 0x ou octais prefixo 0 Constantes binárias não são definidas em C99 mas são supoertadas por alguns compiladores prefixo 0b Por exemplo as seguintes atribuições são equivalentes char x 37 char x 0x25 char x 045 Constantes globalmente definidas erradicaram os números mágicos do programa Um número mágico é uma constante que aparece num programa sem um nome A presença de números mágicos num programa frequentemente introduz bugs complicados por exemplo quando um número é modificado num local mas não em outro Apêndice C Programando em C 884 cm inch INCH2CM printff polegadas f cm inch cm Saída da Consola 5500000 polegadas 13970000 cm C33 include A modularidade encoraja a separar programas em arquivos separados e funções Funções comumente utilizadas podem ser agrupadas para facilitar a sua reutilização Declarações de variáveis valores definidos e definições de funções localizadas num header file cabeçalho podem ser utilizadas por outro arquivo adicionandose a diretiva do préprocessador include As bibliotecas padrão que disponibilizam funções comumente utilizadas são acessadas dessa forma Por exemplo a linha seguinte é requerida para a utilização das funções definidas na biblioteca padrão de entradasaída como a função printf include stdioh O sufixo h do arquivo include indica que ele é um arquivo de cabeçalho Enquanto diretivas include podem ser colocadas em qualquer lugar do arquivo antes das funções variáveis ou identificadores que são necessários elas são convencionalmente colocadas no topo de um arquivo C Um arquivo de header criado pelo programador pode também ser incluído utilizandose aspas no nome do arquivo ao invés de colchetes Por exemplo um arquivo de cabeçalho criado pelo usuário chamado myfunctionsh poderia ser incluído utilizandose a seguinte linha include myfunctionsh Na hora de compilar arquivos especificados entre colchetes são procurados nos diretórios do sistema Arquivos especificados entre aspas são procurados no mesmo diretório local onde o arquivo C é encontrado Se o arquivo de cabeçalho criado pelo usuário está localizado num diretório diferente o caminho do arquivo relativo ao diretório atual deve ser incluído Apêndice C Programando em C 885 Resumo Comentários C fornece comentários de linha única e comentários de várias linha define NOME val A diretiva define permite um identificador NOME ser utilizado ao longo do programa Antes da compilação todas as instâncias de NOME são substituídas por val include include permite que funções comuns sejam utilizadas no programa Para bibliotecas builtin inclua a seguinte linha no topo do código include bibliotecah Para incluir um arquivo de cabeçalho definido pelo usuário o nome deve estar entre aspas listando o caminho Comentários C disponibiliza comentários de linha simples e comentários multilinhas relativo ao diretório atual como necessário isto é include othersmyFuncsh C4 VARIÁVEIS As variáveis nos programas em C possuem tipo nome valor e localização na memória Uma declaração de variável define o tipo e o nome da variável Por exemplo a seguinte declaração indica que a variável é do tipo char a qual é um tipo de 1 byte e o nome da variável é x O compilador decide em que lugar da memória devese colocar essa variável de 1 byte char x O C considera a memória como um grupo de bytes consecutivos onde a cada byte de memória é atribuído um único número indicando a sua localização ou endereço como mostrado na Figura C1 Uma variável ocupa um ou mais bytes na memória e o endereço das variáveis de múltiplos bytes é indicado pelo número mais baixo do byte O tipo de uma variável indica se o byte é interpretado como inteiro número de vírgula flutuante ou outro tipo O resto desta seção descreve os tipos primitivos de dados em C a declaração de variáveis globais e locais e a inicialização de variáveis Nomes de variáveis são case sensitive e podem ser de sua escolha No entanto o nome não pode ser qualquer uma das palavras reservadas em C isto é int while etc não podem começar com um número isto é int 1x não é uma declaração válida e não podem incluir caracteres especiais como ou underscores são permitidos Figura C1 Visão de C da memória Apêndice C Programando em C 886 C41 Tipos Primitivos de Dados O C possui um número de tipos primitivos ou builtin de dados disponível Eles podem ser amplamente caracterizados como inteiros variáveis de vírgula flutuante ou caracteres Um inteiro representa um número em complemento2 ou sem sinal dentro de uma faixa finita Uma variável de vírgula flutuante utiliza a representação IEEE de vírgula flutuante para descrever números reais com faixa e precisão finitas Um caractere pode ser visto tanto quanto um valor ASCII ou um inteiro de 8 bits A Tabela C2 lista o tamanho e a faixa de cada tipo primitivo Os inteiros podem ser de 16 32 ou 64bits Eles utilizam o complemento2 a menos que sejam qualificados como unsigned O tamanho de um tipo int é dependente da máquina e é geralmente do tamanho da palavra nativa da máquina Por exemplo num processador MIPS de 32bits o tamanho de um int ou unsigned int é de 32 bits Números em vírgula flutuante podem ter 32 ou 64bits em precisão simples ou dupla Caracteres possuem 8bits Tabela C2 Tipos e tamanhos primitivos de dados Apêndice C Programando em C 887 A Tabela C3 mostra a declaração de variáveis de diferentes tipos Como mostrado na Figura C2 x requer um byte de dados y requer dois e z requer quatro O programa decide onde esses bytes são armazenados na memória mas cada tipo sempre requer a mesma quantidade de dados Para ilustrar os endereços de x y e z nesse exemplo são 1 2 e 4 Nomes de variáveis são case sensitive então por exemplo a variável x e a variável X são duas variáveis diferentes mas seria bem confuso utilizar as duas no mesmo programa Figura C2 Armazenamento de variáveis na memória para o Exemplo de Código C3 Exemplo de Código C3 EXEMPLOS DE TIPOS DE DADOS Exemplos de diversos tipos de data na sua representação binária unsigned char x 42 x 00101010 short y 10 y 11111111 11110110 unsigned long z 0 z 00000000 00000000 00000000 00000000 A natureza dependente do tipo de dado int é uma benção e uma maldição Pelo lado bom ela combina com o tamanho natural de palavras do processador então pode ser ajustada e manipulada eficientemente Por outro lado programas que utilizam int se comportam de modo diferente em computadores diferentes Por exemplo um programa de um banco pode armazenar número dos centavos na sua conta como um int Quando compilado em um PC de 64 bits ela terá plena faixa de valores até para os mais ricos empreendedores Mas se ela for portada para um microcontrolador de 16 bits irá ocorrer overflow para contas que excedem 32767 resultando em clientes infelizes e endividados Apêndice C Programando em C 888 C42 Variáveis Globais e Locais Variáveis globais e locais diferem em onde elas são declaradas e onde elas estão visíveis Uma variável global é declarada fora de todas as funções tipicamente no topo de um programa e pode ser acessada por todas as funções Variáveis globais devem ser utilizadas com moderação pois elas violam o princípio da modularidade fazendo com que grandes programas se tornem difíceis de ler No entanto uma variável acessada por muitas funções pode ser feita global Uma variável local é declarada dentro de uma função e pode ser utilizada apenas por aquela função Portanto duas funções podem ter variáveis locais com os mesmos nomes sem que uma interfira na outra Variáveis locais são declaradas no início de uma função Elas deixam de existir quando a função termina e são recriadas quando a função é chamada novamente Elas não retêm valores de uma invocação de uma função para a próxima Os Exemplo de Código C4 e Exemplo de Código C5 comparam programas usando variáveis globais versus variáveis locais No Exemplo de Código C4 a variável global max pode ser acessada por qualquer função Usar uma variável local como mostrado no Exemplo de Código C5 é o estilo preferível pois ele preserva a interface bem definida da modularidade Exemplo de Código C4 VARIÁVEIS GLOBAIS Usa uma variável global para encontrar e imprimir o valor máximo entre três números int max variável global mantém o valor máximo void findMaxint a int b int c max a if b max if c b max c else max b else if c max max c O scope de uma variável é o contexto no qual ela pode ser usada Por exemplo para uma variável local o seu scope é a função em que é declarada El está fora do scope em qualquer outro lugar Apêndice C Programando em C 889 void printMaxvoid printfThe maximum number is d max int mainvoid findMax4 3 7 printMax Exemplo de Código C5 VARIÁVEIS LOCAIS Usar variáveis locais para encontrar e imprimir o valor máximo entre três números int getMaxint a int b int c int result a variável local mantém o valor máximo if b result if c b result c else result b else if c result result c return result void printMaxint m printfThe maximum number is d m int mainvoid int max max getMax4 3 7 printMaxmax Apêndice C Programando em C 890 C43 Inicializando Variáveis Uma variável necessita ser inicializada atribuída a um valor antes de ser lida Quando uma variável é declarada o número correto de bytes é reservado para aquela variável na memória No entanto a memória naquelas localizações retém qualquer valor que ela tinha na última vez que foi utilizada essencialmente uma variável aleatória Variáveis globais e locais podem ser inicializadas quando são declaradas ou dentro do corpo do programa O Exemplo de Código C3 mostra variáveis inicializadas ao mesmo tempo em que são declaradas O Exemplo de Código C4 mostra como variáveis são inicializadas antes de seu uso mas após a declaração A variável global max é inicializada pela função getMax antes de ser lida pela função printMax Ler uma variável não inicializada é um erro comum de programação e pode ser complicado de se consertar Resumo Variáveis Cada variável é definida por seu tipo de dado e localização de memória Uma variável é declarada como tipodedado nome Tipos de dados Um tipo de dado descreve um tamanho número de bytes e a representação interpretação dos bytes de uma variável A Tabela C2 lista os tipos de dados builtin em C Memória O C visualiza a memória como uma lista de bytes A memória armazena as variáveis e associa cada variável com um endereço número de byte Variáveis Globais Variáveis globais são declaradas fora de todas as funções e podem ser acessadas em qualquer lugar do programa Variáveis Locais Variáveis locais são declaradas dentro de uma função e podem ser acessadas apenas naquela função Inicialização de Variável Cada variável deve ser inicializada antes de ser lida A inicialização pode acontecer tanto na declaração quanto depois C5 OPERADORES O tipo mais comum de declaração num programa em C é uma expressão tal como y a 3 Apêndice C Programando em C 891 Uma expressão envolvendo operadores como ou agindo sobre um ou mais operandos como variáveis ou constantes O C suporta os operadores mostrados na Tabela C3 listados por categoria e por ordem decrescente de precedência Por exemplo operadores multiplicativos têm precedência sobre operadores aditivos Dentro de uma mesma categoria operadores são computados na ordem em que aparecem no programa Tabela C3 Operadores listados em precedência decrescente Apêndice C Programando em C 892 Tabela C4 Operadores listados em precedência decrescente Continuação Operadores unários também chamados operadores monádicos possuem um único operando Operadores ternários possuem três operandos e todos os outros têm dois O operador ternário do latim ternarius que consiste de três escolhe o segundo ou o terceiro operando dependendo se o primeiro valor é TRUE ou FALSE respectivamente O Exemplo de Código C6 mostra como computar y maxab utilizando o operador ternário juntamente com uma declaração equivalente mas mais detalhada Apêndice C Programando em C 893 Exemplo de Código C6 A OPERADOR TERNÁRIO E B DECLARAÇÃO IFELSE EQUIVALENTE a y a b a b parênteses não são necessários mas deixam o código mais limpo b if a b y a else y b Atribuições simples usam o operador O código C também permite atribuições compostas isto é atribuições após uma simples operação como adição ou multiplicação Em atribuições compostas a variável do lado esquerdo é tanto operada quanto atribuída ao resultado O Exemplo de Código C7 mostra essas e outras operações em C Valores binários nos comentários são indicados com o prefixo 0b Exemplo de Código C7 EXEMPLOS DE OPERADORES A verdade a verdade inteira e nada mais que a verdade O C considera uma variável ser TRUE se ela for diferente de zero e FALSE se ela é zero Os operadores lógicos e ternários bem como as instruções de controle de fluxo if e while dependem da verdade de uma variável Os operadores relacionais e lógicos produzem um resultado que é 1 quando TRUE ou 0 quando FALSE Apêndice C Programando em C 894 C6 CHAMADAS DE FUNÇÃO Modularidade é a chave para a boa programação Um programa grande é dividido em pequenas partes chamadas funções que similarmente aos módulos de hardware possuem entradas saídas e comportamento bem definidos O Exemplo de Código C8 mostra a função sum3 A declaração da função começa com o tipo de retorno int seguido pelo nome sum3 e as entradas contidas entre parênteses int a int b int c Chaves são utilizadas para limitar o corpo da função que pode conter zero ou mais declarações A declaração return indica o valor que a função deve retornar à função chamadora Isso pode ser visto como a saída da função Uma função pode retornar apenas um único valor Exemplo de Código C8 FUNÇÃO SUM3 Retorna a soma de três variáveis de entrada int sum3int a int b int c int result a b c return result Após a seguinte chamada para a função sum3 y mantém o valor 42 int y sum310 15 17 Apesar de uma função poder possuir entradas e saídas nenhuma delas é necessária O Exemplo de Código C9 mostra uma função que não tem entradas nem saídas A palavra chave void antes do nome da função indica que nada é retornado Um void entre parênteses indica que a função não possui argumentos de entrada Exemplo de Código C9 FUNÇÃO PRINTPROMPT QUE NÃO POSSUI NEM ENTRADAS NEM SAÍDAS Imprime um prompt na consola void printPromptvoid printfPlease enter a number from 13 Nada entre parênteses também indica argumentos de entrada Então neste caso nós poderíamos ter escrito void printPrompt Com a ordenação cuidadosa de funções protótipos podem ser desnecessários No entanto eles são inevitáveis em certos casos tais como quando uma função f1 chama f2 e f2 chama f1 É um bom estilo de programação colocar protótipos para todas as funções do programa perto do início do arquivo C ou em um arquivo cabeçalho Apêndice C Programando em C 895 Uma função deve ser declarada no código antes de ser chamada Isso pode ser feito colocandose a função chamada anteriormente no arquivo Por essa razão main é frequentemente colocada ao fim do arquivo C após todas as funções que ela chama Alternativamente um protótipo de função pode ser colocado no programa antes da função ser definida O protótipo de função é a primeira linha da função declarando o tipo de retorno nome da função e suas entradas Por exemplo o protótipo de função para as funções do Exemplo de Código C8 e Exemplo de Código C9 são int sum3int a int b intc void printPromptvoid O Exemplo de Código C10 mostra como protótipos de funções são usados Apesar de as funções por si só estarem depois de main os protótipos de função no início do arquivo permitem que elas sejam utilizadas em main Exemplo de Código C10 PROTÓTIPOS DE FUNÇÃO include stdioh protótipos de função int sum3int a int b int c void printPromptvoid int mainvoid int y sum310 15 20 printfsum3 result d y printPrompt int sum3int a int b int c int result abc return result void printPromptvoid printfPlease enter a number from 13 Tal como os nomes de variáveis os nomes de funções são case sensitive não podem conter nenhuma palavra reservada não podem conter caracteres especiais exceto underscore e não podem iniciar com um número Tipicamente nomes de funções incluem verbetes do que elas fazem Seja consistente no modo com capitaliza suas funções e nome de variáveis para que você não tenha que constantemente procurar pela capitalização correta Dois estilos comuns são o camelCase no qual a letra inicial de cada palavra após a primeira é capitalizada como as corcovas de um camelo por exemplo printPrompt ou usar underscors entre as palavras por exemplo printprompt Temos observado não cientificamente que o uso de underscore agrava a síndrome do túnel carpal meu dedo mindinho dá pontadas só de pensar em underscore e consequentemente preferimos usar a camelCase Mas a coisa mais importante é ser consistente no estilo e na organização Apêndice C Programando em C 896 Saída da Consola sum3 result 45 Please enter a number from 13 A função main é sempre declarada como retornando um int que transmite ao sistema operacional a razão para o encerramento do programa Um zero indica realização normal enquanto um valor diferente de zero sinaliza uma condição de erro Se main atinge o fim sem ter encontrado uma declaração return ela irá automaticamente retornar 0 A maioria dos sistemas operacionais não informa automaticamente o usuário do valor retornado pelo programa C7 DECLARAÇÕES DE CONTROLE DE FLUXO A linguagem C fornece declarações de controle de fluxo para laços condicionais e loops Condicionais executam uma declaração apenas se uma condição é alcançada Um loop executa repetidamente uma declaração até que uma condição seja alcançada C71 Declarações Condicionais Declarações if ifelse e switchcase são declarações condicionais comumente utilizadas em linguagens de alto nível incluindo C Declarações if Uma declaração if executa a declaração imediatamente a seguir quando a expressão entre parênteses é TRUE diferente de zero O formato geral é if expressão Declaração Apêndice C Programando em C 897 O Exemplo de Código C11 mostra como utilizar uma declaração if em C Quando a variável aintBroke é igual a 1 a variável dontFix é colocada em 1 Um bloco de múltiplas declarações pode ser executado colocandose chaves em volta das declarações como mostrado no Exemplo de Código C12 Exemplo de Código C11 DECLARAÇÃO IF int dontFix 0 if aintBroke 1 dontFix 1 Exemplo de Código C12 DECLARAÇÃO IF COM UM BLOCO DE CÓDIGO Se amt 2 prompt user e dispense candy if amt 2 printfSelect candy dispenseCandy 1 Declarações ifelse Declarações ifelse executam uma de duas declarações dependendo de uma condição como mostrado abaixo Quando a expressão na declaração é TRUE a declaração 1 é executada Caso contrário a declaração 2 é executada if expressão Declaracao1 else Declaracao2 Apêndice C Programando em C 898 O Exemplo de Código C6 b dá um exemplo de uma declaração ifelse em C O código define max como sendo igual a se a é maior que b caso contrário max b Declarações switchcase Declarações switchcase executam uma de muitas declarações dependendo das condições como mostrado na forma geral abaixo switch variável case expressao1 declaracao 1 break case expressao1 declaracao 1 break case expressao1 declaracao 1 break default declaracao 4 Por exemplo se a variável é igual à expressao2 a execução continua a partir da declaracao2 até que a palavrachave break seja atingida Nesse ponto o programa sai da declaração switchcase Se nenhuma condição é atingida default é executada Se a palavrachave break é omitida a execução começa do ponto onde a condição é TRUE e então segue executando os cases remanescentes abaixo dela Isso normalmente não é o que você quer e é um erro comum entre programadores C iniciantes O Exemplo de Código C13 mostra uma declaração switchcase que dependendo da variável option determina a quantidade de dinheiro amt a ser desembolsada Uma declaração switchcase é equivalente a uma serie de declarações ifelse aninhadas como mostrado no código equivalente do Exemplo de Código C14 Exemplo de Código C13 DECLARAÇÃO SWITCHCASE Atribui amt dependendo do valor de option switch option case 1 amt 100 break Apêndice C Programando em C 899 case 2 amt 50 break case 3 amt 20 break case 4 amt 10 break default printfError unknown option Exemplo de Código C14 DECLARAÇÃO ifelse ANINHADA Atribui amt dependendo do valor de option if option 1 amt 100 else if option 2 amt 50 else if option 3 amt 20 else if option 4 amt 10 else printfError unknown option C72 Loops while dowhile e for são construtores de loop comuns utilizados em muitas linguagens de alto nível inclusive C Esses loops executam uma declaração repetidamente até que uma condição seja satisfeita Loops while Loops while repetidamente executam uma declaração até que uma condição seja não satisfeita como mostrado na forma geral abaixo while condição declaração O loop while no Exemplo de Código C15 computa o fatorial de 9 9 8 7 1 Note que a condição é verificada antes do início da execução de declaração Neste exemplo a declaração é uma declaração composta então as chaves são necessárias Apêndice C Programando em C 900 Exemplo de Código C15 LOOP WHILE Computa 9 o fatorial de 9 int i 1 fact 1 multiplica os números de 1 a 9 while i 10 loops while checa a condição primeiro fact i i Loops dowhile Loops dowhile são como os loops while mas a condição é verficada somente depois da declaração ter sido executada uma vez O formato geral é mostrado abaixo A condição é seguida por um ponto e vírgula do Declaração while condição O loop dowhile no Exemplo de Código C16 pede ao usuário para adivinhar um número O programa verifica a condição se o número do usuário é o número correto apenas após o corpo do dowhile ter sido executado uma vez Esse construtor é útil quando como neste caso algo deve ser feito por exemplo o palpite do usuário antes da condição ser verificada Exemplo de Código C16 LOOP DOWHILE Pede ao usuário para adivinhar um número e checa contra a resposta certa define MAXGUESSES 3 define CORRECTNUM 7 int guess numGuesses 0 Apêndice C Programando em C 901 do printfAdivinhe um número entre 0 e 9 Você tem mais d palpites MAXGUESSESnumGuesses scanfd guess lê a entrada do usuário numGuesses while numGuesses MAXGUESSES guess CORRECTNUM loop do checa a condição após a primeira iteração if guess CORRECTNUM printfVocê acertou a resposta Loops for Loops for assim como loops while e dowhile repetidamente executam uma declaração até que uma condição não seja satisfeita No entanto os loops for adicionam o suporte a uma variável de loop que tipicamente mantém o controle do número de execuções do loop A forma geral do loop for é for inicialização condição operação do loop declaração O código de inicialização é executado apenas uma vez antes do loop for ser iniciado Se a condição não é TRUE o loop existe A operação do loop é executada ao fim de cada operação O Exemplo de Código C17 mostra o fatorial de 9 computado utilizandose um loop for Exemplo de Código C17 LOOP FOR Computa 9 int i variável de loop int fact 1 fori1 i10 i fact i Apêndice C Programando em C 902 Enquanto os loops while e dowhile no Exemplo de Código C15 e 𝐄𝐱𝐞𝐦𝐩𝐥𝐨 𝐝𝐞 𝐂ó𝐝𝐢𝐠𝐨 𝐂 𝟏𝟔 incluem o código para incremento e verificação da variável de loop i e numGuesses respectivamente o loop for incorpora essas declarações no seu formato Um loop for pode ser expresso de forma equivalente mas menos conveniente como inicialização while condição declaração operação de loop Resumo Declarações de controle de fluxo A linguagem C fornece declarações de controle de fluxo para declarações condicionais e loops Declarações condicionais Declarações condicionais executam uma declaração quando uma condição é verdadeira C inclui as seguintes declarações condicionais if ifelse e switchcase Loops Loops executam repetidamente uma declaração até que uma condição seja falsa C fornece while dowhile e loops for C8 MAIS TIPOS DE DADOS Além de inteiros de vários tamanhos e números em vírgula flutuante a linguagem C inclui outros tipos especiais de dados incluindo ponteiros arrays strings e estruturas Estes tipos de dados são introduzidos nesta seção juntamente com alocação dinâmica de memória Apêndice C Programando em C 903 C81 Ponteiros Um ponteiro é um endereço de uma variável O Exemplo de Código C18 mostra como utilizar ponteiros salary1 e salary2 são variáveis que contém inteiros e ptr é uma variável que pode manter o endereço de um inteiro O compilador irá atribuir localizações arbitrarias na RAM para essas variáveis dependendo do ambiente de execução Por uma questão de prática suponha que esse programa é compilado num sistema de 32bits com salary1 nos endereços 0𝑥7073 salary2 nos endereços 0𝑥7477 e ptr em 0𝑥787𝐵 A Figura C3 mostra a memória e seu conteúdo após o programa ser executado Numa declaração de variável o asterisco antes do nome da variável significa que ela é um ponteiro para o tipo declarado Ao usar uma variável do tipo ponteiro do operador dereferência um ponteiro retornando o valor armazenado no endereço de memória indicado contido no ponteiro O operador é pronunciado endereço de e ele produz o endereço de memória da variável sendo referenciada Figura C3 Conteúdos de memória após o Exemplo de Código C18 mostrado a como valor e b por byte usando memória little endian Apêndice C Programando em C 904 Exemplo de Código C18 PONTEIROS Exemplo de manipulação de ponteiros int salary1 salary2 números de 32 bits int ptr ponteiro especificando o endereço de uma variável salary1 67500 salary1 67500 0x000107AC ptr salary1 ptr 0x0070 endereço de salary1 salary2 ptr 1000 dereferencia ptr para dar o conteúdo do endereço 70 67500 então adiciona 1000 e define salary2 como 68500 Ponteiros são particularmente úteis quando uma função precisa modificar uma variável ao invés de simplesmente retornar um valor Devido às funções não poderem modificar suas entradas diretamente uma função pode fazer da entrada um ponteiro para a variável Isso é denominado fazer a passagem de uma variável de entrada por referência ao invés de por valor como mostrado nos primeiros exemplos O Exemplo de Código C19 dá um exemplo de como fazer a passagem de x por referência de modo que quadruple possa modificar a variável diretamente Exemplo de Código C19 FAZENDO A PASSAGEM DE UMA VARIÁVEL DE ENTRADA POR REFERÊNCIA Quadruplica o valor apontado por a include stdioh void quadrupleint a a a 4 Dereferenciar um ponteiro para uma localização de memória não existente ou para um endereço fora da faixa acessível pelo programa irá usualmente fazer com que o programa trave Essa falha é frequentemente chamada de falha de segmentação Apêndice C Programando em C 905 int mainvoid int x 5 printfx antes d x quadruplex printfx depois d x return 0 Consola da Output x antes 5 x depois 20 Um ponteiro para o endereço 0 é chamado ponteiro null e indica que o ponteiro não está verdadeiramente apontando para algum dado significativo Ele é escrito como NULL num programa C82 Arrays Um array é um grupo de variáveis similares armazenadas em endereços consecutivos na memória Os elementos são numerados de 0 a 𝑁 1 onde 𝑁 é o tamanho do array O Exemplo de Código C20 declara uma variável do tipo array chamada scores que mantém as notas dos exames finais para três estudantes O espaço de memória é reservado para três longs isto é 3 4 12 bytes Suponha que o array scores comeca no endereço 0𝑥40 O endereço do primeiro scores0 é 0𝑥40 o segundo elemento é 0𝑥44 e o terceiro elemento é 0𝑥48 como mostrado na Figura C4 Em C o array variável nesse caso scores é um ponteiro para o primeiro elemento É responsabilidade do programador não acessar os elementos além do fim do array O C não possui verificação de limite interno então um programa que escreve além do fim de um array será compilado normalmente mas poderá passar sobre outras partes da memória quando for executado Apêndice C Programando em C 906 Exemplo de Código C20 DECLARAÇÃO DE ARRAY long scores3 array de três números de 4 bytes Os elementos de um array podem ser inicializados tanto em uma declaração utilizando chaves como mostrado o Exemplo de Código C21 ou individualmente no corpo do código como mostrado no Exemplo de Código C22 Cada elemento de um array é acessado utilizandose colchetes O conteúdo da memória contendo o array é mostrado na Figura C4 A inicialização de um array utilizandose chaves pode apenas ser realizada na declaração e não depois Os loops for são comumente usados para atribuir e ler dados em arrays como mostrado no Exemplo de Código C23 Exemplo de Código C21 INICIALIZAÇÃO DE ARRAY NA DECLARAÇÃO UTILIZANDO long scores393 81 97 scores093 scores181 scores297 Figura C4 array scores armazenado na memória Apêndice C Programando em C 907 Exemplo de Código C22 INICIALIZAÇÃO DE ARRAYS USANDO ATRIBUIÇÕES long scores3 scores0 93 scores1 81 scores2 97 Exemplo de Código C23 INICIALIZAÇÃO DE ARRAY UTILIZANDO UM LOOP FOR Usuário entra com 3 notas de estudantes num array long scores3 int i entered printfPor favor informe as 3 notas dos estudantes for i0 i3 i printfInforme uma nota e digite enter scanfd entered scoresi entered printfNotas d d d scores0 scores1 scores2 Quando um array é declarado o comprimento deve ser constante de modo que o compilador possa alocar a quantidade apropriada de memória No entanto quando o array é passado para a função como um argumento de entrada o comprimento não precisa ser definido pois a função apenas precisa saber o endereço no início do array O Exemplo de Código C24 mostra como um array é passado para uma função O argumento de entrada arr é simplesmente o endereço do primeiro elemento do array Frequentemente o número de elementos num array também é passado como um argumento de entrada Numa função um argumento de entrada do tipo int indica que está num array de inteiros Arrays de qualquer tipo podem ser passados para uma função Exemplo de Código C24 PASSANDO UM ARRAY COMO UM ARGUMENTO DE ENTRADA Inicializa um array de 5 elementos computa a media e imprime o resultado Apêndice C Programando em C 908 include stdioh Retorna o valor médio de um array arr de comprimento len float getMeanint arr int len int i float mean total 0 for i0 i len i total arri mean total len return mean int mainvoid int data4 78 14 99 27 float avg avg getMeandata 4 printfO valor médio é f avg Consola da Output O valor médio é 54500000 Um argumento de array é equivalente a um ponteiro no início do array Então getMean poderia também ser declarada como float getMeanint arr int len Apesar de funcionalmente equivalente datatype é o método preferido para passar arrays como argumentos de entrada pois é mais claro indicar que o argumento é um array Uma função é limitada a uma única saída isto é uma variável de retorno No entanto recebendo um array como argumento de entrada uma função pode essencialmente gerar na saída mais do que um único valor através da mudança do array em si O Exemplo de Código C25 ordena um array do menor índice para o maior e deixa o resultado no mesmo array Os três protótipos de função abaixo são equivalentes O comprimento de um array em uma declaração de função é ignorado Apêndice C Programando em C 909 void sortint vals int len void sortint vals int len void sortint vals100 int len Exemplo de Código C25 PASSANDO UM ARRAY E SEU COMPRIMENTO COMO ENTRADA Ordena os elementos de um array vals de comprimento len do menor para o maior void sortint vals int len int i j temp for i0 ilen i for ji1 jlen j if valsi valsj temp valsi valsi valsj valsj temp Os arrays podem ter múltiplas dimensões O Exemplo de Código C26 utiliza um array bidimensional para armazenar as notas de um conjunto de oito problemas para dez estudantes Lembrese que a inicialização de valores de arrays utilizandose é permitida apenas na declaração Exemplo de Código C26 INICIALIZAÇÃO DE ARRAY BIDIMENSIONAL Inicializa um array 2D na declaração int grades108 100 107 99 101 100 104 109 117 103 101 94 101 102 106 105 110 101 102 92 101 100 107 109 110 114 106 95 101 100 102 102 100 98 105 97 101 103 104 109 109 105 103 99 101 105 104 101 105 103 101 100 101 108 105 109 100 Apêndice C Programando em C 910 100 102 102 101 102 101 105 102 102 106 110 101 100 102 120 103 99 107 98 101 109 104 110 108 O Exemplo de Código C27 mostra algumas funções que operam no array 2D grades do Exemplo de Código C26 Os Arrays multidimensão utilizados como argumentos de entrada para uma função devem definir todos menos a primeira dimensão Então os seguintes protótipos de função são aceitáveis void print2dArrayint arr108 void print2dArrayint arr8 Exemplo de Código C27 OPERANDO COM ARRAYS MULTIDIMENSIONAIS include stdioh Imprime o conteudo de um array 10x8 void print2dArrayint arr108 int i j for i0 i10 i para cada um dos 10 estudantes printfRow d i for j0 j8 j printfd arrij imprime as notas para os 8 conjuntos de problemas printf Calcula a pontuação média de um array 10x8 float getMeanint arr108 int i j float mean total 0 Apêndice C Programando em C 911 obtem a media do array 2D for i0 i10 i for j0 j8 j total arrij soma valores dos arrays mean total108 printfMean is f mean return mean Note que devido ao array ser representado por um ponteiro no elemento inicial a linguagem C não pode copiar ou comparar arrays utilizando operadores ou Ao invés disso você deve utilizar um loop para copiar ou comparar cada elemento um a cada vez C83 Caracteres Um caractere char é uma variável de 8bits Ela pode ser vista como um número em complemento2 entre 128 e 127 ou como um código ASCII para uma letra dígito ou símbolo Caracteres ASCII podem ser especificados como um valor numérico em decimal hexadecimal etc ou como um caractere imprimível entre aspas simples Por exemplo a letra A possui o código ASCII 0𝑥41 B0𝑥42 etc Então 𝐴 3 é 0𝑥44 ou 𝐷 A Tabela 62 lista as codificações de caracteres ASCII e a Tabela C4 lista caracteres usados para indicar caracteres especiais ou de formatação Os códigos de formatação incluem o carriage return r newline tab horizontal e o fim de uma string 0 r é mostrado por exaustividade mas é raramente utilizado em programas em C O r retorna a carriage localização de digitação para o início esquerda da linha mas qualquer texto que estava ali é sobrescrito por sua vez move a localização da digitação para o início de uma nova linha O caractere NULL 0 indica o fim de uma string de texto e é discutido mais adiante na Seção C84 C84 Strings Uma string é um array de caracteres utilizada para armazenar um pedaço de texto de um comprimento limitado mas variável Cada caractere é um byte representando um código ASCII para O termo carriage return provém de máquinas de escrever que exigiam o transporte a engenhoca que segura o papel para o mover para a direita a fim de permitir a digitação começar no lado esquerdo da página Uma alavanca de retorno de carro mostrado à esquerda na figura abaixo é pressionada para movimentar para a direita e avançar o papel por uma linha chamado de avanço de linha line feed Uma máquina de escrever Remington electric utilizada por Winston Churchill httpcwriwmorgukservershowcon MediaFile71979 Apêndice C Programando em C 912 aquela letra número ou símbolo O comprimento do array determina o comprimento máximo da string mas o verdadeiro comprimento da string pode ser menor Em C o comprimento de uma string é determinado procurandose a terminação null valor ASCII 0𝑥00 no final da string O Exemplo de Código C28 mostra a declaração de um array de caracteres de 10 elementos chamado greeting que mantém a string Hello Para concretizar suponha que greeting inicia no endereço de memória 0𝑥50 A Figura C5 mostra o conteúdo de memória de 0𝑥50 até 0𝑥59 mantendo a string Hello Note que a string utiliza apenas os primeiros sete elementos do array mesmo se dez elementos forem alocados na memória Exemplo de Código C28 DECLARAÇÃO DE STRING char greeting10 Hello O Exemplo de Código C29 mostra uma declaração alternativa da string greeting O ponteiro greeting mantém o endereço do primeiro elemento de um array de sete elementos composto de cada um dos caracteres em Hello seguido pela terminação null O código também demonstra como imprimir uma string utilizandose o formato de código s Exemplo de Código C29 DECLARAÇAO ALTERNATIVA DE STRING char greeting Hello printfgreeting s greeting Saída da Consola greeting Hello Ao contrário das variáveis primitivas uma string não pode ser definida igual a outra string utilizando o operador de igualdade Cada elemento do array de caracteres deve ser individualmente copiado da string fonte para a string alvo Isso é verdadeiro para qualquer array O Exemplo de Código C30 copia uma strinf src para outra dst Os tamanhos dos arrays não são necessários pois o fim da string src é indicado pela terminação null No entanto dst deve ser Strings em C são chamadas null terminated ou zero terminated pois o comprimento é determinado pela procura de um zero ao final Em contraste linguagens como Pascal usam o primeiro byte para especificar o comprimento da string até um número máximo de 255 caracteres Esse byte é chamado de byte de prefixo e tais strings são chamadas P strings Uma vantagem das strings null terminated é a de que o comprimento pode ser arbitrariamente grande Uma vantagem das Pstrings é que o comprimento pode ser determinado imediatamente sem a necessidade da inspeção de todos os caracteres da string Apêndice C Programando em C 913 grande o suficiente de modo que o leitor não esbarre em outro dado Strcpy e outras funções de manipulação de strings estão disponíveis nas bibliotecas builtin de C veja Seção C94 Exemplo de Código C30 COPIANDO STRINGS Copia a string fonte src para a string destino dst void strcpychar dst char src int i 0 do dsti srci copia caracteres um byte por vez while srci até o character null ser encontrado Figura C5 String Hello armazenada na memória Apêndice C Programando em C 914 C85 Estruturas Em C as estruturas são utilizadas para armazenar uma coleção de dados de vários tipos A forma geral de uma declaração de estrutura é struct name type1 element1 type2 element2 onde struct é uma palavra chave indicando que ela é uma estrutura name é o nome da estrutura e element1 e element2 são membros da estrutura Uma estrutura pode ter qualquer número de membros O Exemplo de Código C31 mostra como utilizar uma estrutura para armazenar informações de contato O programa então declara uma variável c1 do tipo struct contact Exemplo de Código C31 DECLARAÇÃO DE ESTRUTURA struct contact char name30 int phone float height em metros struct contact c1 strcpyc1name Ben Bitdiddle c1phone 7226993 c1height 182 Da mesma forma que em que tipos builtin em C o leitor pode criar arrays de estruturas e ponteiros para estruturas O Exemplo de Código C32 cria um array de contatos Exemplo de Código C32 ARRAY DE ESTRUTURAS Apêndice C Programando em C 915 struct contact classlist200 classlist0phone 9642025 É comum utilizar ponteiros para estruturas A linguagem C fornece o operador member access para dereferenciar um ponteiro para uma estrutura e acessar um membro da estrutura O Exemplo de Código C33 mostra um exemplo de declaração de um ponteiro para uma struct contact atribuindoo para apontar o 42 elemento de classlist do Exemplo de Código C32 e usando o operador access member para definir um valor naquele elemento Exemplo de Código C33 ACESSANDO MEMBROS DE ESTRUTURAS UTILIZANDO PONTEIROS E struct contact cptr cptr classlist42 cptrheight 19 equivalente a cptrheight 19 Estruturas podem ser passadas como entradas ou saídas de funções por valor ou por referência Passar por valor requer que o compilador copie a estrutura inteira para a memória para a função a acessar Para uma estrutura grande isso requer uma grande quantidade de memória e tempo Passando por referência envolve passar um ponteiro para a estrutura o que é mais eficiente A função pode também modificar a estrutura sendo apontada ao invés de ter que retornar outra estrutura O Exemplo de Código C34 mostra duas versões para a função stretch que faz o contato 2 𝑐𝑚 mais alto stretchByReference evita a cópia da grande estrutura duas vezes Exemplo de Código C34 PASSANDO ESTRUTURAS POR NOME OU POR VALOR struct contact stretchByValuestruct contact c cheight 002 return c void stretchByReferencestruct contact cptr Apêndice C Programando em C 916 cptrheight 002 int mainvoid struct contact George Georgeheight 14 poor fellow has been stooped over George stretchByValueGeorge stretch for the stars stretchByReferenceGeorge and stretch some more C86 typedef A linguagem C também permite definir os seus próprios nomes para tipos de dados utilizando a declaração typedef Por exemplo escrever struct contact se torna tedioso quando ela é frequentemente usada então nós podemos definir um novo tipo nomeado contact e usálo como mostrado no Exemplo de Código C35 Exemplo de Código C35 CRIANDO UM TIPO CUSTOMIZADO UTILIZANDO TYPEDEF typedef struct contact char name30 int phone float height em metros contact define contact como um atalho para struct contact contact c1 agora nós podemos declarar a variável como um tipo contact typedef pode ser usada para criar um novo tipo ocupando a mesma quantidade de memória do que o tipo primitivo O Exemplo de Código C36 define byte e bool como tipos de 8bits O tipo byte pode deixar claro que o propósito de pos é ser um número de 8bits ao invés de um caractere ASCII O tipo bool indica que o número de 8bits está representando TRUE ou FALSE Estes tipos fazem um programa mais fácil de ler do que se alguém simplesmente utilizasse char em todo lugar Apêndice C Programando em C 917 Exemplo de Código C36 TYPEDEF BYTE E BOOL typedef unsigned char byte typedef char bool define TRUE 1 define FALSE 0 byte pos 0x45 bool loveC TRUE O Exemplo de Código C37 ilustra a definição de um vetor vector de três elementos e uma matriz matrix 3 3 utilizando arrays Exemplo de Código C37 TYPEDEF VECTOR E MATRIX typedef double vector3 typedef double matrix33 vector a 45 23 70 matrix b 33 47 92 25 4 9 31 992 88 C87 Alocação Dinâmica de Memória Em todos os exemplos até aqui as variáveis têm sido declaradas estaticamente isto é o seu tamanho é conhecido na hora da compilação Isso pode ser problemático para arrays e strings de tamanhos variáveis pois o array deve ser declarado grande o suficiente para acomodar o maior tamanho que o programa irá ver Um modo alternativo é alocar dinamicamente a memória durante a execução quando o tamanho atual é conhecido A função malloc da stdlibh aloca um bloco de memória de um tamanho especificado e retorna um ponteiro para ela Se não existe memória suficiente disponível um ponteiro NULL é retornado nesse caso Por exemplo o seguinte código aloca 10 shorts 10 2 20 bytes O operador sizeof retorna o tamanho de um tipo ou variável em bytes Apêndice C Programando em C 918 alocação dinâmica de 20 bytes de memória short data malloc10sizeofshort O Exemplo de Código C38 ilustra a alocação e libertação dinâmica O programa aceita um número variável de entradas armazenaas num array dinamicamente alocado e computa sua média A quantidade de memória necessária depende do número de elementos no array e do tamanho de cada elemento Por exemplo se um int é uma variável de 4 bytes e 10 elementos são necessários 40 bytes são dinamicamente alocados A função free liberta a memória de modo que ela possa ser utilizada depois para outros propósitos A falha na libertação dinâmica de dados alocados é chamado vazamento de memória e deve ser evitado Exemplo de Código C38 ALOCAÇÃO E DESALOCAÇÃO DINÂMICA DE MEMÓRIA Dinamicamente alocar e desalocar um array usando malloc and free include stdlibh Inserir função getMean do Exemplo C24 int mainvoid int len i int nums printfQuantos números você deseja inserir scanfd len nums malloclensizeofint if nums NULL printfERROR sem memória else for i0 ilen i printfEntre com o número scanfd numsi printfA média é f getMeannums len freenums Apêndice C Programando em C 919 C88 Listas Ligadas Uma lista ligada ou lista encadeada é uma estrutura comum de dados utilizada para armazenar um número variado de elementos Cada elemento na lista é uma estrutura contendo um ou mais campos de dados e ligados ao próximo elemento O primeiro elemento na lista é chamado cabeça Listas ligadas ilustram muitos conceitos de estruturas ponteiros e alocação dinâmica de memória O Exemplo de Código C39 descreve uma lista ligada para armazenar contas do usuário do computador para acomodar um número variável de usuários Cada usuário possui um nome uma senha um número de identificação único UID e um campo indicando quando ele possui privilégios de administrador Cada elemento da lista é do tipo userL contendo toda essa informação do usuário juntamente com uma ligação para o próximo elemento da lista Um ponteiro para a cabeça da lista é armazenado numa variável global chamada users e é inicialmente definida como NULL para indicar que não existem usuários O programa define funções para inserir excluir e localizar um usuário e para contar o número de usuários A função insertUser aloca espaço para um novo elemento da lista e o adiciona à cabeça da lista A função deleteUser faz uma varredura através da lista até o UID especificado ser encontrado e então remove aquele elemento ajustando o link do elemento anterior para pular o elemento excluído A função findUser faz uma varredura na lista até a UID especificada ser encontrada e retorna um ponteiro para aquele elemento ou NULL se o UID não for encontrado A função numUsers conta o número de elementos na lista Exemplo de Código C39 LISTA LIGADA include stdlibh include stringh typedef struct userL char uname80 nome de usuario char passwd80 senha int uid número de id do usuario int admin 1 indica privilégios de administrador Apêndice C Programando em C 920 struct userL next userL userL users NULL void insertUserchar uname char passwd int uid int admin userL newUser newUser mallocsizeofuserL cria espaco para novo usuario strcpynewUseruname uname copia valores nos campos do usuario strcpynewUserpasswd passwd newUseruid uid newUseradmin admin newUsernext users insere no início da lista ligada users newUser void deleteUserint uid exclui primeiro usuario com dado uid userL cur users userL prev NULL while cur NULL if curuid uid encontra usuario para excluir if prev NULL users curnext else prevnext curnext freecur return feito prev cur caso contrário continuar varrendo lista cur curnext userL findUserint uid userL cur users Apêndice C Programando em C 921 while cur NULL if curuid uid return cur else cur curnext return NULL int numUsersvoid userL cur users int count 0 while cur NULL count cur curnext return count Resumo Ponteiros Um ponteiro mantém o endereço de uma variável Arrays Um array é uma lista de elementos similares declarados utilizandose colchetes Caracteres tipos char podem manter pequenos inteiros ou códigos especiais para representar textos ou símbolos Strings Uma string é um array de caracteres terminado com uma terminação NULL 0𝑥00 Estruturas Uma estrutura armazena uma coleção de variáveis relacionadas Alocação dinâmica de memória malloc é uma função builtin para alocação dinâmica de memória conforme o programa é executado free liberta a memória após o uso Listas Ligadas Uma lista ligada é uma estrutura de dados comum para armazenamento de um número variável de elementos Apêndice C Programando em C 922 C9 BIBLIOTECAS PADRÃO Programadores comumente utilizam uma variedade de funções padrão como de impressão e trigonométricas Para libertar o programador de ter que escrever essas funções do zero a linguagem C disponibiliza bibliotecas de funções frequentemente usadas Cada livraria possui um arquivo de cabeçalho header e um arquivo objeto associado o qual é um arquivo C parcialmente compilado O arquivo de cabeçalho mantém as declarações de variáveis tipos definidos e protótipos de funções O arquivo objeto contém as funções em si e é ligado no momento da compilação para criar o executável Devido às chamadas de funções das bibliotecas serem compiladas num arquivo objeto o tempo de compilação é reduzido A Tabela C5 lista algumas das bibliotecas em C mais frequentemente utilizadas e cada uma é descrita brevemente abaixo C91 stdio A biblioteca padrão de entradasaída Standard inputoutput stdioh contém comandos para imprimir na consola ler entradas do teclado e ler e escrever arquivos Para usar essas funções a biblioteca deve ser incluída no topo do arquivo C include stdioh printf A declaração print formatted printf mostra texto na consola O seu argumento de entrada requerido é uma string entre aspas A string contém texto e comandos opcionais para imprimir variáveis Variáveis a serem impressas são listadas após a string e são impressas utilizando os códigos de formato mostrados na Tabela C6 O Exemplo de Código C40 dá um exemplo simples da função printf Apêndice C Programando em C 923 Tabela C5 Bibliotecas C frequentemente usadas Apêndice C Programando em C 924 Tabela C6 Códigos de formato de printf para a impressão de variáveis Exemplo de Código C40 IMPRIMINDO NA CONSOLA UTILIZANDO PRINTF Simples função de impressão include stdioh int num 42 int mainvoid printfA resposta é d num Saída da Consola A resposta é 42 Apêndice C Programando em C 925 Formatos em vírgula flutuante floats e doubles por padrão tem seis dígitos impressos após o ponto decimal Para mudar essa precisão substitua f por wdf onde w é o tamanho mínimo do número e d é o número de casas decimais a serem impressas Note que o ponto decimal está incluído na contagem do tamanho No Exemplo de Código C41 pi é impresso com um total de quatro caracteres dois dos quais estão após o ponto decimal 314 A variável e é impressa com um total de oito caracteres três deles estão depois do ponto decimal Devido a ele possuir apenas um dígito antes do ponto decimal ele é coberto com três espaços para atingir a largura requisitada A variável c deve ser impressa com cinco caracteres três dos quais estão após o ponto decimal Mas ela é muito grande para arredondar então a largura requisitada é substituída enquanto são retidos os três dígitos após o ponto decimal Exemplo de Código C41 FORMATOS DE IMPRESSÃO DE NÚMEROS EM VÍRGULA FLUTUANTE Imprima números em vírgula flutuante com diferentes formatos float pi 314159 e 27182 c 2998e8 printfpi 42f e 83f c 53f pi e c Saída da Consola pi 314 e 2718 c 299800000000 Devido à e serem usadas na formatação de impressão para imprimir esses caracteres o leitor deve utilizar a sequência especial de caracteres mostrada no Exemplo de Código C42 Exemplo de Código C42 IMPRIMIR E UTILIZANDO PRINTF Como imprimir e na consola printfAqui estão alguns caracteres especiais Saída da Consola Aqui estão alguns caracteres especiais Apêndice C Programando em C 926 scanf A função scanf lê textos digitados no teclado Ela utiliza códigos de formatação do mesmo modo que printf Exemplo de Código C43 mostra como utilizar a função scanf Quando a função scanf é encontrada o programa espera até que o usuário digite um valor antes de continuar sua execução Os argumentos de scanf são uma string indicando um ou mais códigos de formatação e ponteiros para as variáveis onde os resultados devem ser armazenados Exemplo de Código C43 LENDO ENTRADA DO TECLADO COM SCANF Lê variáveis da linha de comando include stdioh int mainvoid int a char str80 float f printfEntre com um inteiro scanfd a printfEntre com um numero em vírgula flutuante scanff f printfEntre com uma string scanfs str note que não é necessário str é um ponteiro Manipulação de Arquivos Muitos programas precisam ler e escrever arquivos seja para manipular dados já armazenados num arquivo ou para carregar grandes quantidades de informação Em C o arquivo deve ser aberto com a função fopen Ele pode então ser lido ou editado com fscanf ou fprintf de modo análogo a ler e escrever na consola Finalmente ele deve ser fechado com o comando fclose A função fopen toma como argumentos o nome do arquivo e o modo de impressão Ela retorna um ponteiro de arquivo ou tipo FILE Se fopen está impossibilitada de abrir o arquivo ela Apêndice C Programando em C 927 retorna NULL Isso deve acontecer quando alguém tenta abrir um arquivo não existente ou escrever num arquivo que já está aberto por outro programa Os modos são w Escreve num arquivo Se o arquivo existe ele é sobrescrito r Lê de um arquivo a acrescenta ao fim de um arquivo existente Se o arquivo não existe ele é criado O Exemplo de Código C44 mostra como abrir imprimir e fechar um arquivo É uma boa prática sempre verificar se o arquivo foi aberto com sucesso e providenciar uma mensagem de erro se não foi A função exit será discutida na Seção 𝐶 922 A função fprintf é parecida com a printf mas ela também toma um ponteiro de arquivo como argumento de entrada para saber em qual arquivo escrever fclose fecha o arquivo garantindo que toda a informação foi efetivamente escrita no disco e libertou os recursos do sistema de arquivos Exemplo de Código C44 IMPRIMINDO NUM ARQUIVO UTILIZANDO FPRINTF Escreva Testando escrita em arquivo em resulttxt include stdioh include stdlibh int mainvoid FILE fptr if fptr fopenresulttxt w NULL printfImpossivel abrir resulttxt para escrita exit1 sai do programa indicando execução malsucedida fprintffptr Testando escrita em arquivo fclosefptr O Exemplo de Código C45 ilustra a leitura de números de um arquivo chamado datatxt utilizando a função fscanf O arquivo deve ser aberto para leitura O programa então utiliza a função feof É idiomático abrir um arquivo e verificar se o ponteiro e arquivo é NULL em uma única linha de código como mostrado no Exemplo de Código C44 Entretanto você pode simplesmente separar a funcionalidade em duas linhas fptr fopenresulttxtw if fptr NULL Apêndice C Programando em C 928 para verificar se ele atingiu o fim do arquivo Enquanto o programa não chega ao fim ele lê o próximo número e o imprime na tela Novamente o programa fecha o arquivo no final para liberar recursos Exemplo de Código C45 LENDO A ENTRADA DE UM ARQUIVO UTILIZANDO FSCANF include stdioh int mainvoid FILE fptr int data le dado do arquivo de entrada if fptr fopendatatxt r NULL printfImpossivel ler dadotxt exit1 while feoffptr checa que o fim do arquivo não foi atingido ainda fscanffptr d data printfLe dado d data fclosefptr Saída da Consola Le dado 25 Le dado 32 Le dado 14 Le dado 89 Apêndice C Programando em C 929 Outras funções stdio Convenientes A função sprintf imprime caracteres em uma string e sscanf lê variáveis de uma string A função fgetc lê um único caractere de um arquivo enquanto fgets lê uma linha completa de uma string fscanf é bastante limitada na sua capacidade de ler e analisar arquivos complexos então é frequentemente mais fácil usar fgets numa linha por vez e então resumir aquela linha usando sscanf ou com um loop que inspecione caracteres um por vez utilizando fgetc C92 stdlib A biblioteca padrão stdlib fornece funções de propósito geral incluindo a geração aleatória de números rand e srand alocação dinâmica de memória malloc e free já discutidas na Seção C88 saída do programa exit e conversão entre formatos de números Para utilizar essas funções adicione a seguinte linha de código no topo do arquivo C include stdlibh rand e srand rand retorna um inteiro pseudoaleatório Números pseudoaleatórios possuem a estatística dos números aleatórios mas seguem um padrão determinístico começando com um valor inicial denominado semente seed Para converter o número numa faixa particular use o operador módulo como mostrado no Exemplo de Código C46 para uma faixa de 0 a 9 Os valores x e y serão aleatórios mas eles serão os mesmos a cada vez que o programa for executado Amostras de saídas da consola são dadas abaixo do código Exemplo de Código C46 GERAÇÃO DE NÚMEROS ALEATÓRIOS UTILIZANDO RAND include stdlibh int x y x rand x um inteiro aleatorio y rand 10 y um numero aleatório de 0 a 9 Apêndice C Programando em C 930 printfx d y d x y Saída da Consola x 1481765933 y 3 Um programador cria uma sequência diferente de números aleatórios cada vez que o programa é executado através da mudança da semente Isso é feito pela chamada da função srand que toma o valor da semente como argumento de entrada Como mostrado no Exemplo de Código C47 a semente por si só deve ser aleatória então um programa típico em C a atribui pela chamada da função time que retorna o tempo atual em segundos Exemplo de Código C47 SEMEANDO O GERADOR DE NÚMEROS ALEATÓRIOS USANDO SRAND include stdlibh int x y x rand x um inteiro aleatório y rand 10 y um número aleatório de 0 a 9 printfx d y d x y Saída da Consola x 1481765933 y 3 exit A função exit termina o programa antecipadamente Ela toma um único argumento que é retornado ao sistema operacional indicando a razão do término O valor zero indica realização normal enquanto um valor diferente de zero indica uma condição de erro Por razões históricas a função time usualmente retorna o tempo atual em segundos relativo ao dia 1 de Janeiro de 1970 0000 UTC UTC significa Coordinated Universal Time o qual é o mesmo que o Tempo médio de Greenwich GMT Essa data é logo após o sistema operacional UNIX ser criado por um grupo no Bell Labs incluindo Dennis Ritchie e Brian Kernighan em 1969 Similarmente às festas de vésperas do Ano Novo alguns entusiastas UNIX mantêm festas para celebrar valores significativos retornados por time Por exemplo no dia 1 de fevereiro de 2009 às 233130 UTC time retornou o valor 1234567890 No ano 2038 os relógios UNIX irão ter overflow e voltar ao ano de 1901 Apêndice C Programando em C 931 Conversão de Formatos atoi atol atof A biblioteca padrão fornece funções para converter strings ASCII em inteiros inteiros longos ou doubles usando atoi atol e atof respectivamente como mostrado no Exemplo de Código C48 Isso é particularmente útil quando se está lendo dados misturados uma mistura de strings e números de um arquivo ou nos argumentos da linha de comando para processamento numérico como descrito na Seção C103 Exemplo de Código C48 CONVERSÃO DE FORMATO Converter strings ASCII em ints longs e floats include stdlibh int mainvoid int x long int y double z x atoi42 y atol833 z atof3822 printfx d y d z f x y z Saída da Consola x 42 y 833 z 3822000 Apêndice C Programando em C 932 C93 math A biblioteca matemática mathh fornece funções matemáticas comumente utilizadas como funções trigonométricas raiz quadrada e logaritmos O Exemplo de Código C49 mostra como utilizar algumas dessas funções Para utilizar funções matemáticas coloque a seguinte linha no arquivo C include mathh Exemplo de Código C49 FUNÇÕES MATEMÁTICAS funções matemáticas include stdioh include mathh int mainvoid float a b c d e f g h a cos0 1 note o argumento de entrada esta em radianos b 2 acos0 pi acos significa arc cosseno c sqrt144 12 d exp2 e2 7389056 e log7389056 2 logaritmo natural base e f log101000 3 log base 10 g floor178567 178 arredondado para o menor inteiro mais proximo h pow2 10 computa 2 elevado a decima potencia printfa 0f b f c 0f d 0f e 2f f 0f g 2f h 2f a b c d e f g h Saída da Consola a 1 b 3141593 c 12 d 7 e 200 f 3 g 17800 h 102400 Apêndice C Programando em C 933 C94 string A biblioteca stringh fornece funções de manipulação de strings comumente utilizadas Funções chave incluem copia src em dst e retorna dst char strcpychar dst char src concatena src ao fim de dst e retorna dst char strcatchar dst char src compara duas strings Retorna 0 se igual nonzero caso contrário int strcmpchar s1 char s2 retorna o comprimento de str não incluindo o terminador null int strlenchar str C10 COMPILADOR E OPÇÕES DA LINHA DE COMANDO Embora nós tenhamos introduzidos programas em C relativamente simples os programas do mundo real podem consistir de dezenas ou até mesmo milhares de arquivos C para permitir a modularidade e legibilidade a múltiplos programadores Essa seção descreve como compilar um programa espalhado por múltiplos arquivos C e mostra como utilizar as opções do compilador e os argumentos da linha de comando C101 Compilando Múltiplos Arquivos Fonte C Múltiplos arquivos C são compilados num único executável listandose todos os nomes dos arquivos na linha do compilador como mostrado abaixo Lembrese que o grupo de arquivos C devem conter uma única função main convencionalmente colocada num arquivo nomeado como mainc gcc mainc file2c file3c C102 Opções do Compilador As opções do compilador permitem ao programador especificar algumas coisas como nomes e formato dos arquivos de saída otimizações etc As opções do compilador não são padronizadas mas a Tabela C7 lista algumas das mais comumente utilizadas Cada opção é tipicamente precedida por um Apêndice C Programando em C 934 traço na linha de comando como mostrado Por exemplo a opção o permite ao programador especificar um nome ao arquivo de saída que não seja o padrão aout Existe uma grande quantidade de opções elas podem ser vistas digitandose gcc help na linha de comando Tabela C7 Opções do compilador C103 Argumentos da Linha de Comando Assim como outras funções main também pode receber variáveis de entrada No entanto ao contrário de outras funções esses argumentos são especificados na linha de comando Como mostrado no Exemplo de Código C50 argc significa uma contagem de argumento e denota o número de argumentos na linha de comando argv significa vetor de argumentos e é um array das strings encontradas na linha de comando Por exemplo suponha que o programa no Exemplo de Código C50 é compilado num executável chamado testargs Quando as seguintes linhas são digitadas na linha de comando argc tem o valor 4 e o array argv tem os valores testargs arg1 25lastarg Note que o nome do executável é contado como o primeiro argumento A saída da consola após a digitação desse comando é mostrada abaixo no Exemplo de Código C50 Apêndice C Programando em C 935 gcc o testargs testargsc testargs arg1 25 lastarg Os programas que necessitam de argumentos numéricos podem converter as strings de argumentos em números utilizando as funções em stdlibh Exemplo de Código C50 ARGUMENTOS DA LINHA DE COMANDO Imprime os argumentos da linha de comando include stdioh int mainint argc char argv int i for i0 iargc i printfargvd s i argvi Saída da Consola argv0 testargs argv1 arg1 argv2 25 argv3 lastarg C11 ERROS COMUNS Assim como em qualquer linguagem de programação você está quase certo de que vai cometer erros enquanto escreve programas não triviais em C Abaixo estão algumas descrições de alguns erros comuns cometidos quando programamos em C Alguns desses erros são particularmente problemáticos pois são compilados mas não funcionam como o programador pretendia Habilidades de depuração são adquiridas com o tempo mas aqui estão algumas dicas Conserte erros começando com o primeiro indicado pelo compilador Erros seguintes podem ser erros de efeito devido ao primeiro Após consertar aquele bug recompile e repita até que todos os bugs pelo menos aqueles detectados pelo compilador sejam consertados Quando o compilador informa que uma linha válida no código possui um erro cheque o código acima dela isto é por pontos e vírgulas e chaves faltantes Quando necessário quebre declarações complicadas em múltiplas linhas Use printf para mostrar resultados intermediários Quando um resultado não atinge suas expectativas comece a depurar o código no primeiro lugar onde ele devia atender às expectativas Olhe para todas as advertências do compilador Enquanto algumas advertências podem ser ignoradas outras podem alertar para erros mais sutis no código que irão compilar mas não executar como o esperado Apêndice C Programando em C 936 Erro de Código C1 ESQUECER EM SCANF Código Errado int a printfEntre com um inteiro scanfd a falta antes de a Código Correto int a printfEntre com um inteiro scanfd a Erro de Código C2 USAR AO INVÉS DE PARA COMPARAÇÃO Código Errado if x 1 sempre definido como TRUE printfEncontrado Código Correto if x 1 printfEncontrado Erro de Código C3 INDEXAR ELEMENTOS APÓS O ÚLTIMO ÍNDICE DO ARRAY Código Errado int array10 array10 42 index entre 09 Código Correto int array10 array9 42 Erro de Código C4 USAR NA DECLARAÇÃO DEFINE Código Errado substitui NUM por 4 no código define NUM 4 Código Correto define NUM 4 Erro de Código C5 USAR UMA VARIÁVEL NÃO INICIALIZADA Código Errado int i if i 10 i não foi inicializada Código Correto int i 10 if i 10 Apêndice C Programando em C 937 Erro de Código C6 NÃO INCLUIR O CAMINHO DE CABEÇALHOS CRIADOS PELO USUÁRIO Código Errado include myfileh Código Correto include othercodemyfileh Erro de Código C7 USAR OPERADORES LÓGICOS AO INVÉS DE OPERADORES BIT A BIT Código Errado char x5 lógico NOT x 0 char y52 lógico OR y 1 char z52 lógico AND z 1 Código Correto char x5 bit a bit NOT x 0b11111010 char y52 bit a bit OR y 0b00000111 char z52 lógico AND z 0b00000000 Erro de Código C8 ESQUECER BREAK EM UMA DECLARAÇÃO SWITCHCASE Código Errado char x d switch x case u direction 1 case d direction 2 case l direction 3 case r direction 4 default direction 0 direction 0 Código Correto char x d switch x case u direction 1 break case d direction 2 break case l direction 3 break case r direction 4 break default direction 0 direction 2 Erro de Código C9 ESQUECER AS CHAVES Código Errado if ptr NULL chaves esquecidas printfImpossível abrir arquivo exit1 sempre executa Código Correto if ptr NULL printfImpossível abrir arquivo exit1 Apêndice C Programando em C 938 Erro de Código C10 USAR UMA FUNÇÃO ANTES DA MESMA SER DECLARADA Código Errado int mainvoid test void testvoid Código Correto void testvoid int mainvoid test Erro de Código C11 DECLARAR UMA VARIÁVEL GLOBAL E UMA LOCAL COM O MESMO NOME Código Errado int x 5 declaração global de x int testvoid int x 3 declaração local de x Código Correto int x 5 declaração global de x int testvoid int y 3 declaração local de y Erro de Código C12 TENTAR INICIALIZAR UM ARRAY COM APÓS A DECLARAÇÃO Código Errado int scores3 scores 93 81 97 não compila Código Correto int scores3 93 81 97 Erro de Código C13 ATRIBUIR UM ARRAY A OUTRO UTILIZANDO Código Errado int scores3 88 79 93 int scores23 scores2 scores Código Correto int scores3 88 79 93 int scores23 for i0 i3 i scores2i scoresi Apêndice C Programando em C 939 Erro de Código C14 ESQUECER UM PONTO E VÍRGULA APÓS UM LOOP DOWHILE Código Errado int num do num getNum while num 100 falta Código Correto int num do num getNum while num 100 Erro de Código C15 UTILIZAR VÍRGULAS AO INVÉS DE PONTO E VÍRGULA NUM LOOP FOR Código Errado for i0 i 200 i Código Correto for i0 i 200 i Erro de Código C16 DIVISÃO INTEIRA AO INVÉS DE DIVISÃO EM VÍRGULA FLUTUANTE Código Errado divisão inteira truncada ocorre quando ambos os argumentos da divisão são inteiros float x 9 4 x 20 Código Correto ao menos um dos argumentos da divisão deve ser um float para realizar divisão em vírgula flutuante float x 90 4 x 225 Erro de Código C17 ESCREVER NUM PONTEIRO NÃO INICIALIZADO Código Errado int y 77 Código Correto int x y x y 77 Erro de Código C18 GRANDES EXPECTATIVAS OU A FALTA DELA Um erro comum de iniciantes é escrever um programa inteiro usualmente com pouca modularidade e esperar que ele funcione perfeitamente da primeira vez Para programas não triviais escrever um código modular e testar as funções individualmente ao longo do caminho é essencial A depuração se torna exponencialmente mais difícil e consome mais tempo com a complexidade Apêndice C Programando em C 940 Outro erro comum é a falta de expectativa Quando isso acontece o programador pode somente verificar que o código produz um resultado não que aquele resultado é correto Testar um programa com entradas conhecidas e esperar resultados é crítico na verificação de funcionalidade Este apêndice foi focado na utilização de C num sistema com uma consola como um computador com Linux A Seção 86 descreve como C é utilizado para programar microcontroladores 𝑃𝐼𝐶32 utilizados em sistemas embarcados Os microcontroladores são usualmente programados em C pois essa linguagem fornece um controle de baixo nível do hardware quanto a linguagem assembly ainda que muito mais sucinto e rápido de escrever 941 D Processador MIPSfpga D1 INTRODUÇÃO O MIPSfpga é um processador MIPS32 microAptiv da Imagination para uso educacional com cache e unidade de gerenciamento de memória É disponibilizada uma implementação deste processador em código Verilog adequada para simulação e implementação numa FPGA Os processadores MIPS têm sido utilizados em produtos comerciais e estudados por estudantes de arquitetura de computador ao longo de décadas Este anexo introduz o primeiro núcleo MIPS comercial disponível gratuitamente A arquitetura MIPS é aqui introduzida e os seus aspectos mais relevantes são apresentados A Imagination disponibiliza através da sua plataforma educacional após o registo gratuito para além do código de implementação vários exemplos ilustrativos Este anexo pretende introduzir o leitor a esta ferramenta educacional Pretendese realçar o seu potencial educativo através da ilustração do seu funcionamento Dado o modo como foi concebido o processador MIPSfpga pode ser explorado de várias formas simulação do funcionamento interno do processador verificação do funcionamento real numa FPGA ou utilizando uma FPGA conjuntamente com um programador JTAG para analisar e depurar o funcionamento do sofware Este anexo começa por apresentar os passos necessários para obter gratuitamente o MIPSfpga através do site do Imagination University Programme UIP Em seguida é fornecida uma visão geral do núcleo MIPS onde são descritos os sinais de interface do núcleo MIPSfpga As três últimas seções deste anexo ilustram num crescendo de complexidade a utilização do processador MIPSfpga As ferramentas tanto de software como de hardware necessárias são introduzidas assim como o modo de as obter e instalar Neste ponto o leitor estará apto a começar a explorar o processador MIPSfpga Apêndice D O Processador MIPSfpga 942 Para isso o leitor começará por realizar no ModelSim a simulação do funcionamento do processador MIPSfpga e executar um programa Alguns aspectos do funcionamento interno relativos à execução do programa serão realçados Em seguida serão descritos os passos necessários à instalação do processador MIPDfpga no kit de desenvolvimento Nexys4 DDR utilizando o Xilinx Vivado 151 O processador MIPS irá executar um programa com o qual foi previamente sintetizado Na parte final do anexo vamos ver como compilar um programa utilizando as ferramentas de produção de software CodeScape Este novo programa será carregado no processador MIPSfpga através do programador BusBlaster e o seu funcionamento verificado através de técnicas de depuração de código D11 Como Obter o MIPSfpga Getting Started O IUP Imagination University Programme faz parte do site da Comunidade Imagination Aqui o leitor pode encontrar informações sobre o IUP os seus parceiros e futuros eventos visualizar tutoriais online fazer o download de materiais de ensino e muito mais tais como encontrar fóruns e outros recursos Para isso o leitor deve primeiro registrarse gratuitamente em httpcommunityimgteccomuniversityuniversityregistration Após receber um email de verificação deve ativar a sua conta e completar os seus dados de perfil Deste momento em diante pode fazer login em httpscommunityimgteccomuniversityresources Agora com as suas credenciais de acesso pode descarregar os conteúdos do seu interesse No nosso caso estamos interessados no pacote MIPSfpga Getting Started em língua inglesa Figura D1 Seguindo os procedimentos indicados irá obter um ficheiro compactado Após receber o ficheiro deve descompactar o seu conteúdo no seu disco Mantenha o ficheiro compactado para poder repor sempre os ficheiros originais Desta ação resultará uma estrutura como a apresentada na Figura D2 Os ficheiros de implementação do processador MIPSfpga estão Figura D1 Seleção do pacote a descarregar Apêndice D O Processador MIPSfpga 943 disponíveis no folder rtlup A implementação do projeto no Xilinx Vivado para a Nexys4 DDR está disponível no folder Nexys4DDR O projeto de simulação para o ModelSim do processador MIPSfpga está disponível no folder ModelSim Um instalador do Codescape e vários exemplos de código tanto em assembler como C estão disponíveis no folder Codescape De especial interesse são os scripts disponibilizados que ajudam na elaboração dos projetos como veremos em seguida Finalmente no folder Documents pode ser encontrada literatura relevante para auxiliar no estudo do processador MIPSfpga D12 A Arquitectura MIPSfpga A arquitetura MIPS é uma das arquiteturas de computadores originais do tipo Reduced Instruction Set RISC Teve a sua origem nos resultados da pesquisa desenvolvida na Universidade de Stanford em 1981 e teve como consequência um aumento da eficiência das arquiteturas de computadores Foi comercializado em 1984 pela MIPS Computer Systems e adquirida pela Imagination Technologies em 2013 Os processadores MIPS tornaramse em 1980 e 1990 os cérebros das estações de trabalho da Silicon Graphics de alto desempenho O MIPS R3000 com um pipeline de 5 estágios foi o primeiro sucesso comercial importante Que foi seguido pelo R4000 ao qual foram adicionadas instruções de 64bits o R8000 superscalar e o R10000 outoforder seguidos por núcleos com desempenho muito mais elevado A arquitetura MIPS evoluiu para responder às necessidades dos mercados onde as restrições energéticas ou o custo são fatores determinantes incluindo a electrónica de consumo as redes de dados e os microcontroladores A família M4K baseiase no clássico de 32bits com pipeline de 5 estágios A família M14K acrescentou o conjunto de instruções de 16bits microMIPS definido para reduzir o tamanho do código para aplicações embarcadas de baixo custo A família microAptiv estende a M14K com instruções opcionais de processamento de sinais digitais A microAptiv está Figura D2 Estrutura do MIPSfpga GettingStartedv131Mar2016 Apêndice D O Processador MIPSfpga 944 disponível nas variantes microcontrolador UC e microprocessador UP sendo que à variante microprocessador foram acrescentadas caches e memória virtual para executar sistemas operacionais como Linux ou Android O leitor pode estar familiarizado com a linha PIC32 popular da Microchip de microcontroladores baseada na arquitetura M4K As famílias MIPS M4K M14K e microAptiv são os núcleos mais simples de processador da Imagination Technologies em termos de microarquitetura No entanto o seu software é compatível com as linhas midrange e highend da Imagination bem como com as suas variantes multicore A linha de núcleos midrange inclui o MIPS interAptiv um núcleo de 32bits com suporte de hardware para multithreading e o dualissue superscalar MIPS I6400 de 64bits A linha de núcleos highend inclui o multiprocessador MIPS P5600 de 32bit com até seis cores multipleissue outoforder extensões SIMD e outros recursos avançados O núcleo MIPSfpga é uma versão do microAptiv UP Os processadores microAptiv são encontrados numa ampla variedade de aplicações comerciais incluindo a automação industrial automóvel electrónica de consumo e as comunicações sem fio O núcleo MIPSfpga é definido na linguagem de descrição de hardware Verilog HDL É designado como um processador soft core porque é descrito em software Verilog em vez de ser fabricado num chip de computador Os arquivos Verilog podem ser encontrados no folder MIPSfpga rtlup RTL significa registertransferlogic um termo que se refere à lógica e aos registros que descrevem o processador MIPSfpga no código HDL e up significa microprocessador O processador MIPSfpga possui cerca de 12k declarações Verilog e tem as seguintes características Núcleo microAptiv UP correndo MIPS32 ISA com pipeline de 5 estágios e fornece 15 Dhrystone MIPS MHz Caches associativas de 2vias para instruções e dados 2 KB cada Unidade de gestão de memória com TLB de 16entradas Apêndice D O Processador MIPSfpga 945 Barramento de interface AHBLite Programador depurador EJTAG incluindo 2 breackpoints de instrução e 1 de dados Contadores de desempenho Sincronizadores de entrada CorExtend para instruções definidas pelo usuário Sem extensões de processamento de sinais digitais interface para os registros do coprocessador 2 ou registros sombra O processador MIPSfpga é licenciado exclusivamente para uso educacional e não comercial Por favor consulte os Termos de Uso associados aos conteúdos que obteve O leitor pode usálos para aprender como um microprocessador funciona Pode simular o código Verilog ou compilálo para FPGA e assistir ao desempenho do processador em ação Pode ler o código e aprender sobre como a microarquitetura é implementada Pode escrever e compilar programas em linguagem assembly ou C e vêlos a serem executados num simulador de Verilog ou numa FPGA O leitor pode fazer a interface com periféricos ou outros núcleos através do barramento AHBLite e aprender sobre o projeto de systemonchip Pode modificar o código para explorar a implementação de novas instruções ou variações microarquiteturais Pode até mesmo arrancar com o Linux para ver todo o sistema em funcionamento desde o Verilog até ao sistema operacional O microAptiv executa a versão MIPSr3 do conjunto de instruções MIPS O pipeline e o conjunto de instruções são descritos em detalhe no Manual do Utilizador de Software MIPSfpgaDocumentsMicroAptiv UP Software Users Manual MD00924pdf Esta seção resume os aspectos principais e descreve como o núcleo está ligado à memória e dispositivos de IO A Figura D3 mostra um diagrama do processador MIPSfpga A parte central do processador é a Execution Unit Ela executa as operações ordenadas pelas instruções tais como adicionar ou subtrair A MDU multiplydivide unit é uma extensão daquela unidade que executa as operações de multiplicação e divisão O bloco Instruction Decoder recebe as instruções a partir da cache de instruções e gera sinais para fazer com que a unidade de execução execute a operação A unidade System CoProcessor fornece os sinais de interface do sistema como o relógio do sistema e o reset A unidade GPR suporta os registros de uso geral utilizados como operandos das instruções Apêndice D O Processador MIPSfpga 946 Figura D3 O núcleo MIPSfpga As outras interfaces na parte superior da Figura D3 UDI COP2 e Interrupt Interfaces permitem que o processador execute instruções definidas pelo usuário como descrito na Folha de dados encontrada em MIPSfpgaDocumentsMicroAptiv UP Datasheet MD00929pdf para fazer a interface com uma unidade coprocessador 2 e receber interrupções externas respectivamente As caches de instrução e de dados ICache e Dcache estão conectadas aos seus respectivos controladores e a uma unidade de gestão de memória MMU A MMU executa a tradução de endereços de memória e recupera os dados ou as instruções da memória quando os dados não estão disponíveis na cache A BIU bus interface unit permite que o usuário possa anexar memórias e IO mapeado na memória ao processador através de um barramento AHBLite As interfaces das RAM de dados e de instruções Interfaces DSRAM e ISRAM permitem o acesso de baixa latência do processador a memórias em chip conforme descrito no Guia do MicroAptiv UP Integrator MIPSfpgaDocumentsMicroAptiv UP Integrators Guide MD00941pdf Apêndice D O Processador MIPSfpga 947 Tabela D1 O pipeline do MIPSfpga Número Estágio Nome Descrição 1 I Instruction O processador obtém uma instrução 2 E Execution O processador obtém os operandos a partir do banco de registros e executa uma operação da ALU por exemplo adição subtração ou cálculo de endereço de memória 3 M Memory Se for o caso o processador acede a um operando de memória 4 A Align Se for o caso os dados carregados são alinhados com o limite de palavra 5 W Writeback Se for o caso o processador escreve o resultado para o banco de registros A unidade Debugger and Profiler disponibiliza a interface EJTAG1 para depuração bem como monitoramento de desempenho e download de código para o processador O núcleo do MIPSfpga tem um pipeline de 5 estágios A Tabela D1 apresenta cada um dos estágios de pipeline com uma breve descrição de cada estágio O processador MIPSfpga tem um espaço de endereçamento de 32bits e três modos de operação kernel user e debug Em reset o processador começa no modo kernel e salta para o vetor de reset no endereço 0xbfc00000 A Figura D4 mostra um mapa da memória do processador O endereço 0xbfc00000 está no segmento de kernel 1 kseg1 que é uncached e não mapeado Isto significa que todas as instruções serão obtidas a partir da memória externa em vez das caches e que o segmento tem um mapeamento fixo dos endereços virtuais para endereços físicos em vez de usar a MMU o que é importante porque as caches e a MMU ainda não foram inicializadas imediatamente após o reset A tabela de mapeamento dos endereços fixos mapeia o kseg1 para o endereço físico 0x00000000 subtraindo 0xa0000000 ao endereço virtual Assim após o reset o programa começa a executar o código fora da memória principal a partir do endereço físico 0x1fc00000 O Manual do Usuário do Figura D4 Mapa de memória Apêndice D O Processador MIPSfpga 948 Software MIPSfpgaDocumentsMicroAptiv UP Software Users Manual 00942pdf fornece informação adicional relativa ao mapeamento da memória A Figura D6 mostra um diagrama de blocos das componentes principais do processador MIPSfpga O sistema recebe o relógio o reset e os sinais de programação EJTAG a partir de uma FPGA ou de um ficheiro de simulação Ele interage com LED ou interruptores externos e dirige os sinais do barramento de interface Dentro do bloco mipsfpgasys está o núcleo m14ktop microAptiv e o bloco mipsfpgaahb contendo a RAM entradas de IO de uso geral GPIO e a lógica de interface com o AHBLite Bus Figura D6 Sistema MIPSfpga A Figura D5 mostra o mapa de memória física fornecida pelo bloco mipsfpgaahb Ele contém um bloco de RAM com 128 KB em 0x1fc00000 inicializada com o código a ser executado apôs o reset do processador e outro bloco de RAM de 256 KBRAM em 0x00000000 para outro código ou dados Ele contém também quatro registros GPIO que controlam LED e interruptores O código de linguagem máquina para executar após a o reset é carregado a partir do arquivo ramresetinittxt no arranque ou pode ser carregado através do EJTAG D13 Sinais de Interface no Processador MIPSfpga O processador MIPSfpga tem três interfaces principais o barramento AHBLite o IO da placa FPGA e a interface EJTAG O barramento AHBLite conecta o núcleo MIPSfpga à memória e dispositivos periféricos A interface de entradasaídas IO da placa FPGA permite que o núcleo Figura D5 Mapa de memória física do processador MIPSfpga Apêndice D O Processador MIPSfpga 949 MIPSfpga possa ter acesso aos interruptores e aos LED nas placas FPGA e a interface EJTAG é usada para fazer o download de programas no núcleo MIPSfpga e depurar aplicações em tempo real A Tabela D2 lista as interfaces do processador MIPSfpga Estes sinais usam prefixos com significados específicos SI Sinal de interface do sistema IO Sinais de IO para a placa FPGA H Sinais do barramento AHBLite EJ Sinais de interface EJTAG Tabela D2 Sinais de interface com o processador MIPSfpga Apêndice D O Processador MIPSfpga 950 O sinal de relógio SIClkIn é o relógio de sistema para o processador O processador MIPSfpga funciona a 50 MHz na placa Nexys4 DDR usando um sinal de 100 MHz da Nexys4 DDR O sinal de reinicialização SIResetN é ativo a baixo indicado pelo sufixo N Pressionando o botão de reset CPURESETN na Nexys4 DDR faz o reset do processador O processador deve ser reiniciado após o power up Outros sinais podem ser encontrados no Integrators Guide MIPSfpgaDocumentsMicroAptiv UP Integrators Guide MD009241pdf Interface AHBLite O Advanced Highperformance Bus AHB é uma interface opensource usada em muitos microprocessadores particularmente em sistemas embarcados O barramento AHB facilita a conexão de vários dispositivos ou periféricos O AHBLite é uma versão mais simples do AHB com um barramento de mestre único Para informação mais detalhada consulte o AHBLite Interface Guide MIPSfpgaDocumentsMicroAptiv UP AHBLite interface MD01082pdf Figura D7 Mapa de memória física do processador MIPSfpga A Figura D7 mostra o barramento AHBLite no processador MIPSfpga Esta configuração tem um mestre o processador MIPSfpga e três escravos RAM0 RAM1 e GPIO que são dois blocos de memória Figura D8 AHBLite Write Apêndice D O Processador MIPSfpga 951 RAM e um módulo para aceder ao IO interruptores e LED na placa FPGA O processador o mestre produz os sinais de relógio HCLK permitir escrever HWRITE endereço HADDR e escrever os sinais de dados HWDATA O processador recebe os dados lidos HRDATA a partir de um dos escravos dependendo do endereço O decodificador de endereços ativa o sinal NSE a alto para selecionar o dispositivo escravo indicado pelo endereço Uma transação AHBLite é ocorre em dois ciclos de relógio uma fase de endereços e uma fase de dados Durante a fase de endereços o mestre envia o endereço em HADDR e ativa HWRITE para uma gravação ou desativa para uma leitura Durante a fase de dados o mestre envia em HWDATA numa gravação ou o escravo envia em HRDATA numa leitura A Figura D8 e a Figura D9 mostram as formas de onda para um processador realizar uma gravação e leitura respectivamente Para o processador MIPSfpga os módulos escravos e decodificador de endereço estão localizados no módulo mipsfpgaahb encontrado no ficheiro mipsfpgaahbv e os seus submódulos A RAM0 contém a memória de instrução que é acedida após o arranque No reset o processador define o PC com o endereço de instrução da exceção de reset endereço físico 0x1fc00000 0xbfc00000 endereço virtual A RAM1 contém memória acessível de programa a partir do endereço físico 0 O módulo GPIO escravo interage com o IO da placa FPGA Interface de IO da FPGA A placa Nexys4 DDR disponibiliza LED e switches que estão ligados à FPGA O módulo de IO de uso general no barramento AHBLite grava e lê a partir do IO da placa FPGA LED interruptores etc usando memória de IO mapeada Na memória de IO mapeada o processador acede a um dispositivo de IO também chamado de periférico da mesma forma que acede à memória com cada periférico mapeado para um endereço de memória em particular A Tabela D3 lista os endereços de memória de IO para a placa FPGA Nexys4 O endereço virtual é usado pelas instruções MIPS e o endereço físico é o que aparece em HADDR no barramento AHBLite Figura D9 AHBLite read Apêndice D O Processador MIPSfpga 952 Tabela D3 Endereços do mapeamento de memória para o IO das placas FPGA Interface EJTAG O EJTAG é um protocolo que permite 1 a depuração baseada em hardware e programas 2 download de software num núcleo MIPS Os sinais de interface chamados coletivamente de Test Access Port TAP são TCK TDI TDO TMS e TRST O EJTAG utiliza as funcionalidades destes sinais tal como definido no protocolo JTAG como listado abaixo EJTCK Relógio de teste EJTMS Test Mode Select seleciona o modo de operação EJTDI Test Data In entrada de dados no processador EJTDO Test Data Out saída de dados do processador EJTRSTNprobe Test Reset ativo a baixo provoca o reset do controlador EJTAG O EJTAG define ainda um sinal de requisição de interrupção de debug EJDINT D2 OBTER E INSTALAR AS FERRAMENTAS DE TRABALHO Para realizar as tarefas definidas neste anexo o leitor deve instalar e obter as ferramentas de software e hardware apresentadas nesta seção Todas as ferramentas de software são obtidas de forma gratuita O hardware obriga à sua aquisição o que representa sempre algum custo Apêndice D O Processador MIPSfpga 953 D21 ModelSim A realização das simulações requer o uso do ModelSim PE Student Edition 104a Esta ferramenta é disponibilizada gratuitamente pela Mentor Graphics O ficheiro de instalação tem um tamanho de aproximadamente 250 MB Sendo que a instalação requer cerca de 600 MB Começamos por visitar o site em httpwwwmentorcomcompanyhigheredmodelsimstudentedition No momento de escrita deste anexo a versão mais recente do ModelSim disponível é a 104a Para fazer download clicamos em Será convidado a descarregar o ficheiro através da caixa de diálogo da Figura D10 Selecione a opção Guardar Ficheiro Figura D10 Guarde o ficheiro de instalação Execute o programa de instalação À questão se permite que o software efetue alterações no seu computador responda afirmativamente Deve também aceitar os termos e as condições da utilização associados O software deve ser instalado no folder por defeito CModeltechpeedu104a Siga os passos normais do processo de instalação Apêndice D O Processador MIPSfpga 954 No final do processo de instalação será aberta uma folha de registo online como a que se apresenta na Figura D11 Preencha corretamente estes campos Certifiquese que o seu email está correto já que o ficheiro da licença será enviado por email No final do processo será dada uma confirmação do envio do email que contém também as indicações a seguir para ativar a licença tal como se representa na Figura D12 Repare que a licença apenas é válida por um período de 180 dias Após o que deve instalar nova versão e requerer nova licença Figura D11 Pedido da licença para a edição estudante do ModelSim Apêndice D O Processador MIPSfpga 955 Figura D12 Instruções a seguir na ativação da licença para a edição estudante do ModelSim O ModelSim fica agora apto a ser utilizado Após o a arranque será exibida a janela apresentada na Figura D14 Ao longo deste anexo serão dadas as indicações necessárias à utilização desta ferramenta Mas o leitor pode encontrar toda a informação que necessita nos vários documentos disponíveis na ajuda No final será criado um atalho no ambiente de trabalho como o da Figura D13 Figura D13 Atalho para o ModelSim Apêndice D O Processador MIPSfpga 956 Figura D14 ModelSim com a janela Help aberta D22 Xilinx Vivado para a NEXYS4 DDR FPGA Para programar a Nexys4 DDR será utilizado o Xilinx Vivado 20151 que está disponível gratuitamente a partir da Xilinx Inc A instalação será realizada num computador com o sistema operacional Windows 7 de 64 bits Note que o Xilinx Vivado também está disponível para o sistema operacional Linux O arquivo de instalação tem aproximadamente 50 MB enquanto que o aplicativo requer cerca de 7 GB Para obter o ficheiro de instalação tamanho aproximado de 50MB o leitor deverá visitar o site httpwwwxilinxcomsupportdownloadhtml Apêndice D O Processador MIPSfpga 957 Certifiquese que seleciona a versão 20151 do Xilinx Vivado como indicado na Figura D15 Localize na página a Instalação do Vivado 20151 para Windows 64bits como se representa na Figura D16 Figura D15 Página de download do Vivado da Xilinx A página de download irá requerer a autenticação numa conta da Xilinx Se a não possuir deverá criar uma Utilizando as credenciais recebidas pode então efetuar o login Agora será efetuada a questão de se deseja salvar o executável de instalação Salve o arquivo num local temporário Execute o instalador do Xilinx Vivado para iniciar o processo de instalação Será solicitado o seu ID Xilinx de usuário e senha obtidos aquando do registo Aceite as condições de utilização Instale a versão Vivado WebPACK Edition Certifiquese de que instala as Design Tools e o suporte para o Device Artix7 Esta é a FPGA na Nesyx4 DDR Se o desejar pode instalar outros dispositivos Certifiquese de que tem uma configuração de instalação idêntica à da Figura D17 Aceite o folder de instalação por defeito CXilinx Antes que a instalação tenha início será apresentado um quadro resumo como o ilustrado na Figura D18 Figura D16 Instalação do Vivado 20151 para Windows 64bits Apêndice D O Processador MIPSfpga 958 Figura D17 Ferramentas de projeto e dispositivos Figura D18 Resumo da instalação Apêndice D O Processador MIPSfpga 959 A janela Vivado License Manager permite obter a licença para o produto que acabou de instalar Selecione o Get Free Licenses Será efetuada uma ligação web ao site da Xilinx e no qual deve utilizar as suas credenciais de acesso Escolha a licença para Vivado WebPACK e selecione a Activate NodeLocked License Se o processo de licenciamento decorrer corretamente será apresentada uma janela comunicando que a licença foi corretamente gerada e que lhe foi enviada por email Se a ativação da licença não ocorrer automaticamente utilize o email que lhe foi enviado e siga as instruções aí fornecidas No seu ambiente de trabalho será criado um ícone como o que se representa na Figura D19 D23 Produção de Software com o Codescape A produção de programas a executar no MIPSfpga é feita utilizando o OpenOCD e o Codescape MIPS SDK Essentials A instalação do OpenOCDCodescape pode ser realizada utilizando dois métodos diferentes 1 utilizando o instalador fornecido no MIPSfpga Getting Started no folder Codescape ou 2 visitando o site da Imagination University Programme e na seção Teaching Resources fazendo download do OpenOCDCodescape offline installer Ao executar o instalador garanta que leciona a instalação de ambos OpenOCD e Codescape MIPS SDK como se representa na Figura D20 Garanta que mantém o folder de instalação por defeito para que os scripts fornecidos no MIPSfpga Getting Started Guide possam funcionar corretamente Depois de indicar que aceita as condições legais de utilização na caixa de instalação Development Type escolha a opção Both Linux and Bare Metal Applications Na caixa de instalação Setup escolha os Development Cores tipo MIPS Classic Legacy CPU IP Cores e MIPS Aptiv Family CPU IP Cores O Codescape será instalado no folder CProgram FilesImagination Technologies No final da instalação será permitido o acesso ao guia Display Codescapes getting started Se não estiver interessado nesta informação feche a página O manual online do OpenOCD está disponível para sua referência em httpopenocdsourceforgenetdochtmlindexhtml Figura D19 Vivado 20151 Apêndice D O Processador MIPSfpga 960 O guia do usuário do OpenOCD está disponível no ficheiro OpenOCD Users Guidepdf no folder CProgram FilesImagination TechnologiesOpenOCDopenocd092 Figura D20 Instalação do OpenOCD e do Codescape MIPS SDK D24 NEXYS4 DDR FPGA O processador MIPSfpga foi desenvolvido para ser utilizado com uma FPGA criando um processador soft core capaz de executar aplicações de software Para além da Nexys4 DDR existem outras placas para nas quais a implementação do processador MIPSfpga está preparada e com as quais pode funcionar Basys3 DE0 e DE2115 Para além disso existe informação de como preparar versões de migração para outras boards com FPGA no MIPSfpga Getting Started Guide Apêndice D O Processador MIPSfpga 961 Figura D21 Nexys4 DDR Principais características da Nexys4 DDR Apêndice D O Processador MIPSfpga 962 A Nexys4 DDR é disponibilizada pela Digilent httpsreferencedigilentinccom De notar que esta ferramenta de hardware pode ser adquirida a um custo reduzido quando destinada a ser utilizada pela academia Para saber como beneficiar desta política contate a empresa ou um seu representante A Nexys4 é uma plataforma completa pronta a ser utilizada no desenvolvimento de circuitos digitais com base na FPGA Artix7 da Xilinx Com a sua FPGA de grande capacidade memórias externas de grande capacidade USB Ethernet e outros portos a Nexys4 pode hospedar projetos que variam desde os circuitos combinatórios introdutórios até aos processadores embutidos Vários periféricos embutidos incluindo um acelerómetro sensor de temperatura microfone digital MEMS um amplificador de altifalante e uma série de dispositivos de IO permitem que a Nexys4 possa ser utilizada para explorar a utilização da arquitetura MIPS em aplicações do mundo real D25 BusBlaster V3c para o MIPS O BusBlaster V3c para MIPS é um económico adaptador de alta velocidade para depuração projetado para suportar a depuração via JTAG para vários dos processadores MIPS Esta versão do BusBlaster tem um conector alvo de 14 pinos e cabo de interface com a lógica de buffer adequada para targets EJTAG MIPS Este dispositivo é entregue com um BusBlaster v3c EJTAG para MIPS e um adaptador JTAG de 14 para 6 pinos Para a depuração de software em hardware MIPS recomendase o uso do BusBlaster com o OpenOCD JTAG programming and debugging software que pode ser descarregado do Source Forge Para instalar os drivers para o programador BusBlaster certifiquese de que instalou primeiro as ferramentas Codescape SDK e OpenOCD de programação corretamente Ao ligar o programador ao computador através do cabo USB a luz de alimentação amarela PWR deve ficar acesa Abra uma consola de comando Windows em CProgram FilesImagination TechnologiesOpenOCD Execute o aplicativo zadig211exe Será solicitado para permitir que o programa possa fazer alterações no seu computador clique em Sim Na janela que se abre em Figura D22 BusBlaster V3c para MIPS Apêndice D O Processador MIPSfpga 963 seguida clique em Options List All Devices isto permite reduzir a lista para os itens que nos interessa Selecione BUSBLASTERv3c Interface 0 e em seguida clique em Install Driver Este processo pode demorar alguns minutos Depois que o driver estiver instalado uma janela popup surgirá informando que O driver foi instalado com sucesso Clique em Fechar Também deve instalar o driver para BUSBLASTERv3c Interface 1 Quando tudo estiver concluído feche a janela Zadig D3 SIMULAÇÃO COM O MODELSIM Uma forma económica e eficiente de explorar o processador MIPSfpga é através da realização de simulações Para isso vamos considerar duas ações distintas 1 como simular o funcionamento do processador MIPSfpga a executar um programa e 2 como modificar o programa a simular D31 Simular a Execução de um Programa no Processador MIPFSfpga A simulação faz o précarreamento do processador MIPSfpga com o programa IncrementLEDs Este programa é ilustrado no exemplo da Figura D23 São apresentados o código C e assembly correspondentes Uma análise permite verificar que o conteúdo do endereço de memória 0xbf800000 é repetidamente incrementado Para cada uma das instruções que constituem o programa são abaixo fornecidos o código máquina e o respectivo endereço da instrução Código Máquina Endereço de Instrução Código Assembly 24090001 bfc00000 addiu 9 0 1 val 1 3c08bf80 bfc00004 lui 8 0xbf80 80xbf800000 ad090000 bfc00008 L1 sw 9 08 mem0xbf800000 val 25290001 bfc0000c addiu 9 9 1 val val1 1000fffd bfc00010 beqz 0 L1 branch to L1 00000000 bfc00014 nop branch delay slot O programa é carregado na memória tendo início no endereço virtual 0xbfc00000 Apêndice D O Processador MIPSfpga 964 C unsigned int val 1 volatile unsigned int dest dest 0xbf800000 while 1 dest val val val 1 Código assembly MIPS 9 val 8 mem address 0xbf800000 addiu 9 0 1 val 1 lui 8 0xbf80 80xbf800000 L1 sw 9 08 mem0xbf800000 val addiu 9 9 1 val val1 beqz 0 L1 branch to L1 nop branch delay slot Figura D23 Programa IncrementLEDs em C e assembler Os endereços virtuais com início em 0xa0000000 são mapeados para o endereço físico 0x00000000 A simulação mostra os sinais de interface de barramento AHBLite que trabalham com endereços físicos Assim na forma de onda da simulação o endereço de instrução 0xbfc00000 vai aparecer como 0x1fc00000 0xbf800000 como 0x1f800000 etc Carregamento do Projeto no ModelSim O exemplo simulado nesta seção é disponibilizado no folder MIPSfpgaModelSim Comece por fazer uma cópia de salvaguarda do folder Project1 dandolhe a designação de Project2 Após ter iniciado o ModelSim carregue o projeto através da opção File Open e procure o folder MIPSfpgaModelSimProject2 Para isso terá que escolher o tipo de ficheiro mpf Project File e visualizará o ficheiro mipsfpgasimmpf Abra esse ficheiro Execução do Script Em seguida execute o script simMIPSfpgatcl Para isso deve escrever no painel Transcript source simMIPSfpgatcl Este script realiza três operações diferentes Compila os ficheiros Verilog localizados em MIPSfpgartlup Apêndice D O Processador MIPSfpga 965 Adiciona sinais ao painel de visualização de forma de ondas Wave Simula o processador a executar o programa IncrementLEDs usando o módulo testbenchv A execução do script irá demorar alguns minutos Irá receber o aviso Warning Design size of 12114 statements or 2473 leaf instances exceeds ModelSim PE Student Edition recommended capacity Expect performance to be quite adversely affected Figura D24 ModelSim no final da execução do script Apêndice D O Processador MIPSfpga 966 Por estarmos a utilizar a versão educacional o desempenho irá ser penalizado pelo facto do número de linhas de código ultrapassar as 10k No final o prompt no painel Transcript apresentado será VSIM 2 tal como se apresenta na Figura D24 Visualização das Saídas Se selecionar o painel Wave terá acesso às ferramentas para realizar a gestão da visualização dos sinais gerados Utilize a ferramenta para visualizar a forma de onda inteira Acrescente um novo curso utilizando as ferramentas Posicione o Cursor 1 em 1350000 ps e o Cursor 2 em 950000 ps faça zoom entre os cursores utilizando a ferramenta Observamos na Figura D25 que o sinal SIResetN é mantido no nível lógico LOW mantendo o processador no estado de reset Em torno do instante 1 microssegundo o sinal SIResetN transita de LOW para HIGH e permite o arranque do processador MIPSfpga Como podemos observar as linhas de endereço apresentam o valor 0x1fc00000 valor do endereço físico que corresponde ao endereço virtual 0xbfc00000 Um ciclo de relógio depois o valor 0x2490001 é lido da memória A linha HWRITE está a LOW no decorrer da fase de endereço o que corresponde a uma leitura do barramento veja a Figura D9 Este código de máquina corresponde à instrução addiu 9 0 1 Quatro ciclos de relógio mais tarde a próxima instrução é obtida a partir do endereço 0x1fc00004 HRADDR O código máquina 0x3c08bf80 que corresponde à instrução lui US 8 0xbf80 aparece no barramento de leitura de dados HRDATA Apêndice D O Processador MIPSfpga 967 Figura D25 Visualização dos sinais no arranque do processador MIPSfpga Notese que uma nova instrução é obtida a cada 5 ciclos de relógio em vez de a cada ciclo de relógio porque logo após o reset as caches ainda não estão inicializadas Especificamente os 5 ciclos necessários para obter uma instrução são os seguintes 1 ciclo para o processador reconhecer que os dadosinstrução não está na cache 1 ciclo para enviar o pedido para a Bus Interface Unit BIU 1 ciclo para a BIU colocar o pedido de leitura no barramento AHBLite 1 ciclo para os dados serem devolvidos da memória externa para o barramento AHBLite 1 ciclo para o processador colocar os dados de leiturainstrução num registrador O processador continua a obter instruções A instrução de armazenamento de palavra sw 9 08 a que corresponde o código de máquina 0xad090000 está localizada no endereço físico 0x1fc00008 Esta instrução vai escrever no endereço 0xbf800000 endereço físico 0x1f800000 Note se que a próxima instrução addiu 9 9 1 a que corresponde o código de máquina 0x25290001 é obtida do endereço 0x1fc0000c antes que a gravação da palavra na memória ocorra Logo após que a instrução addiu com código máquina 0x25290001 aparece no HRDATA o endereço Apêndice D O Processador MIPSfpga 968 HADDR muda para 0x1f800000 o endereço a ser escrito pela inicial instrução de armazenamento de palavra sw e por isso o HWRITE é colocado a HIGH como mostrado na Figura D26 A gravação na memória é completada um ciclo mais tarde com o HWDATA a tomar o valor a ser escrito neste caso o valor 1 Em seguida o processador obtém as instruções de branch e nop com os códigos máquina 0x1000fffd e 0x00000000 e localizadas nos endereços físicos 0x1fc00010 e 0x1fc00014 respectivamente regressando depois à instrução sw no endereço 0x1fc00008 O leitor pode seguir as formas de onda de como ele volta repetidamente a obter instruções nos endereços de memória 0x1fc00008 a 0x1fc00014 e escreve os valores incrementados no endereço de memória 0x1f800000 Para observa o processo descrito anteriormente deve posicione o Cursor 1 em 1250000 ps e o Cursor 2 em 1400000 ps faça zoom entre os cursores Figura D26 Visualização do ciclo de incremento da memória Apêndice D O Processador MIPSfpga 969 D32 Modificar o Programa a ser Simulado O núcleo MIPSfpga pode tanto escrever como ler da memória de IO mapeada nas placas FPGA A Figura D27mostra o código C e assembly MIPS para o programa SwitchesLEDs Este programa lê os interruptores e os botões de pressão na placa FPGA e reflete os seus valores para os LED vermelho e verde respectivamente Nota a placa Nexys4 DDR não exibirá os valores de botões quando executar este programa porque ela não tem os LED verdes C unsigned int sw pb unsigned int ledrptr unsigned int ledgptr unsigned int swptr unsigned int pbptr ledrptr 0xbf800000 ledgptr 0xbf800004 swptr 0xbf800008 pbptr 0xbf80000c while 1 sw swptr pb pbptr ledrptr sw ledgptr pb Código assembly MIPS 10 sw 11 pb lui 8 0xbf80 addiu 12 8 4 12 LEDG addr addiu 13 8 8 13 SW addr addiu 14 8 0xc 14 PB addr readIO lw 10 013 sw SW values lw 11 014 pb PB values sw 10 08 store sw to LEDR sw 11 012 store pb to LEDG beq 0 0 readIO repeat nop branch delay slot Figura D27 Programa SwitchesLEDs Nas quatro primeiras instruções assembly MIPS o código coloca os endereços de memória mapeada para os LED vermelhos e verdes e os interruptores e botões de pressão nos registros 8 12 13 e 14 Nas duas próximas instruções LW carga de palavra o programa assembly lê os valores dos interruptores e dos botões de pressão nos registros 10 e 11 Finalmente nas duas Apêndice D O Processador MIPSfpga 970 instruções a seguir sw armazenamento de palavra o código escreve esses valores para os LED vermelhos e verdes O loop em seguida repete usando a instrução beq branch se igual O branch é sempre executado porque 0 é sempre igual a si próprio O conteúdo do arquivo ramresetinittxt com o código de máquina para o programa SwitchesLEDs é mostrado em baixo Este arquivo está localizado em MIPSfpgartlup initfiles 3SwitchesLEDs Código Máquina Endereço de Instrução Código Assembly 3c08bf80 bfc00000 lui 8 0xbf80 8LEDR addr 250c0004 bfc00004 addiu 12 8 4 12LEDG addr 250d0008 bfc00008 addiu 13 8 8 13SW addr 250e000c bfc0000c addiu 14 8 0xc 14PB addr 8daa0000 bfc00010 readIO lw 10 013 10SW 8dcb0000 bfc00014 lw 11 014 11PB ad0a0000 bfc00018 sw 10 08 SWLEDR ad8b0000 bfc0001c sw 11 012 PBLEDG 1000fffb bfc00020 beq 0 0 readIO repeat 00000000 bfc00024 nop branch delay slot Para modificar o programa IncrementLEDs executado pelo processador MIPSfpga apenas tem que copiar o arquivo ramresetinittxt correspondente ao programa SwitchesLEDs que se localiza em MIPSfpgartlupinitfiles3SwitchesLEDs para o folder MIPSfpgaModelSimProject2 Esta operação irá substituir o ficheiro existente com o mesmo nome Para reinicializar a simulação e obrigar à leitura do ficheiro de reinicialização da memória como o novo programa SwitchesLEDs escreva no painel Transcript restart f Adicione agora ao painel Wave os sinais a visualizar IOSwitch IOPB IOLEDR and IOLEDG Para isso apenas terá que os selecionar no painel Objects e arrastar para o painel Wave Especifique os valores das entradas IOSwitch 18bits e IOPB 5bits Para isso no painel Transcript escreva Apêndice D O Processador MIPSfpga 971 force IOSwitch 18h3f58c force IOPB 5h1a Estamos agora em condições de executar a simulação Para isso no painel Transcript escreva run 2000 Este comando vai ordenar a simular a execução do programa por 2000000 ps Como se pode observar Figura D28 os LED passam a refletir o estado das respectivas entradas Primeiro o IOLEDR 1514971 ps e depois o IOLEDG 1545030 ps Pode repetir este comando em conjunto com o comando force para observar os estados dos LED a serem modificados Figura D28 Alteração do estado dos LED Apêndice D O Processador MIPSfpga 972 D4 CARREGAR E DEPURAR UM PROGRAMA EM TEMPO REAL Esta seção irá descrever os passos a seguir para que se possa observar o processador MIPSfpga a executar em tempo real um programa escrito em C Para que isso seja possível é necessário realizar um conjunto de tarefas que são descritas a seguir Ao contrário da Seção D3 esta seção obriga a dispor de hardware específico e que já foi descrito na Seções D24 e D25 Vamos utilizar o OpenOCD e o BusBlaster para carregar na placa Nexys4 DDR o programa a ser executado pelo processador MIPSfpga O OpenOCD usa o gdb de Codescape um depurador de consola para transferir e depurar programas a executar no núcleo MIPSfpga utilizando um programador EJTAG Essencialmente OpenOCD é uma ponte de software entre o gdb e o programador O OpenOCD também tem vários comandos específicos do núcleo que podem ser acedidos a partir do gdb através do comando do gdb Monitor Até agora temos vindo a executar a simulação de programas no processador MIPSfpga não inicializado Embora esta situação seja aceitável para programas simples para programas que usam armazenamento em cache e outros recursos avançados o núcleo deve ser inicializado usando o código de inicialização Depois de ter terminado a inicialização do processador o código de inicialização salta para a função principal do código do usuário para executar o seu programa O código de inicialização MIPSfpga fornecido inicializa o núcleo MIPSfpga através da criação de registros e inicializando as caches e o TLB O código de inicialização está localizado no endereço virtual 0xbfc00000 que é o endereço da exceção do reset Após a reinicialização o núcleo MIPSfpga começa a obter as instruções deste endereço endereço virtual 0xbfc00000 que corresponde ao endereço físico 0x1fc00000 Apesar de uma profunda compreensão não ser essencial para a execução de código no processador MIPSfpga o utilizador interessado pode encontrar o código de inicialização no folder MIPSfpgaCodescapeExampleProgramsCExample O código de inicialização deixa o núcleo MIPSfpga pronto para executar o código do usuário inicializando Coprocessador 0 O TLB A cache de instrução Apêndice D O Processador MIPSfpga 973 A cache de dados Após inicializar o processador o código de inicialização chama a função start que executa inicializações adicionais e em seguida chama a função main do usuário D41 Escrever e Compilar um Programa em C com o Codescape Código Fonte do Programa Vamos exemplificar como pode um programa escrito em C ser compilado utilizando o Codescape e os scripts fornecidos com o MIPSfpga O programa tem três modos de funcionamento correspondentes aos botões de pressão assim como um Modo Padrão Quando botão 3 é pressionado btnD o programa exibe os valores incrementados nos LED Quando o botão 2 é pressionado btnL os LED mostram valores decrementados Quando tecla 1 for pressionada btnC os LEDs piscam Quando nenhum botão for pressionado os LED mostram um grupo de 4 LED a serem repetidamente deslocados para a esquerda Para além das construções típicas C o código também demonstra como incluir inline assembly De notar que todas as variáveis associadas com o hardware são declaradas como volatile Desta forma impedese que sejam removidas por otimização do compilador C define inlineassembly asmori 0 0 0x1234 void delay int main volatile int IOLEDR int0xbf800000 volatile int IOPUSHBUTTONS int0xbf80000c volatile unsigned int pushbutton count 0 while 1 pushbutton IOPUSHBUTTONS Apêndice D O Processador MIPSfpga 974 Figura D29 Código exemplo em C Compilar o Programa Para compilar este programa C primeiro abra uma consola de comando Windows utilizando o comando cmdexe a partir do menu Iniciar do Windows Dirija o prompt para a pasta MIPSfpaCodescapeExamplePrograms CExample e escreva na consola make switch pushbutton case 0x8 count break case 0x4 count break case 0x2 if count0 count count else count 0 break default if count0 count 0xf else count count 1 IOLEDR count Escreve para os LED vermelhos delay inlineassembly return 0 Apêndice D O Processador MIPSfpga 975 Isto irá compilar o programa C usando o Makefile localizado na pasta C exemplo e o gcc do Codescape O Makefile gera o arquivo FPGARamelf que é um ficheiro ELF Executable and Linkable Format executável Este arquivo é usado pelo gdb do Codescape para carregar o programa no processador MIPSfpga através do programador EJTAG O leitor pode também estar interessado em ver o ficheiro FPGARamdasmtxt que mostra o executável disassemblado intercalado com o códigofonte C O topo deste arquivo lista o código de inicialização a partir do endereço virtual 0x9fc00000 O endereço virtual 0x9fc00000 correspondente ao endereço físico 0xbfc00000 ou seja 0x1fc00000 Assim a instrução em 0x9fc00000 será obtida após o reset A diferença é que 0x9fc00000 está no kseg0 e possui cache 0xbfc00000 está no kseg1 e não possui cache Colocar o código em 0x9fc00000 permite que o código de inicialização execute mais rápido depois que a cache seja habilitada A parte inferior do arquivo procure por mainc mostra o código do utilizador com início no endereço virtual 0x8000075c O arquivo FPGARammodelsimtxt também localizada na pasta CExample mostra uma versão legível do executável endereços de memória com código de máquina e código assembly sem a fonte de C O leitor pode remover todos os arquivos criados durante a compilação digitando no prompt de comando make clean Apêndice D O Processador MIPSfpga 976 D42 Carregar o Processador MIPSfpga na Nexys4 Seguindo as instruções fornecidas nesta seção irá instalar o processador MIPSfpga na FPGA Artix 7 da Xilinx presente na placa Nexys4 DDR usando software Xilinx Vivado Figura D30 Instalação experimental Ligar e Alimentar a Nexys4 DDR Ligue o seu computador através do cabo de programação USB à porta programador USB da placa Nexys4 DDR identificado na Figura D21 Agora comute o interruptor de alimentação da placa para a posição ON Se a placa está configurada de fábrica será executado um programa précarregado que escreve aos 7 segmentos exibe com um padrão de cobra que se repete indefinidamente Certifique Apêndice D O Processador MIPSfpga 977 se de que a placa está configurada num dos Modos JTAG ou QSPI isto é o jumper de Modo deve ligar os dois pinos do centro ou como mostrado na figura os dois mais à esquerda Instalar o Processador MIPSfpga Abra a sua instalação do Xilinx Vivado Serlheá apresentada uma janela como a que se ilustra na Figura D31 Selecione a opção Flow Open Hardware Manager Figura D31 Início do Xilinx Vivado A janela Hardware Manager será aberta como se ilustra na Figura D32 Clique em Open Target e escolha Auto Connect Aviso quando clicar em Auto Connect o Xilinx Vivado pode parecer travar Ele está se conectando ao alvo o que irá demorar alguns segundos enquanto o Vivado detecta a FPGA na placa Nexys4 DDR Apêndice D O Processador MIPSfpga 978 Figura D32 Hardware Manager Agora clique em Program device e selecione xc7a100t0 como mostrado na Figura D33 Figura D33 Programação do MIPSfpga Apêndice D O Processador MIPSfpga 979 A janela Program Device será aberta como mostrado na Figura D34 Na caixa arquivo de Bitstream procure MIPSfpgaNexys4DDRmipsfpganexys4ddrbit Deixe a caixa Debug Probe File em branco e a opção Enable End of Startup Check selecionada Clique em Program Figura D34 Program Device Executar o Processador MIPSfpga Agora o leitor está pronto para executar o processador MIPSfpga na FPGA Artix7 da placa Nexys4 DDR Pressione o botão de RESET rotulado CPU RESET consulte a Figura D21 para provocar o reset do processador Após soltar o botão Reset o processador irá executar o programa IncrementLEDsDelay que gera um número crescente binário usando os LED começando com 1 Os LED alteram os valores a cada segundo D43 Carregar o Programa via BUSBLASTER Nesta seção o leitor vai baixar um programa compilado no núcleo MIPSfpga usando a interface EJTAG e o programador BusBlaster O programador BusBlaster recebe uma entrada de cabo de alta velocidade USB 20 e converte os comandos no protocolo de série EJTAG que permite carregar programas no núcleo MIPSfpga e controlar a depuração de programas em execução no MIPSfpga Agora abra uma consola de comando Windows ou seja o menu Iniciar cmdexe Na consola de comando dirija o prompt para o diretório MIPSfpgaCodescapeExampleProgramsScriptsNexys4DDR Apêndice D O Processador MIPSfpga 980 Agora execute o script que carrega o novo programa a partir do diretório C Exemplo no núcleo MIPSfpga Digite o seguinte no prompt de comando loadMIPSfpgabat CExample O script loadMIPSfpgabat realiza as seguintes tarefas 1 Compila o programa no diretório especificado usando make 2 Executa OpenOCD numa nova consola 3 Executa o gdb ou seja MIPSMTIelf em GDB de Codescape no núcleo MIPSfpga numa nova consola 4 Carrega o arquivo executável elf do diretório especificado no núcleo MIPSfpga usando OpenOCD e gdb Depois de executar o script o leitor deve ver o programa em execução no núcleo MIPSfpga No caso do programa CExample verá os LED em rolagem para a esquerda Pressione os botões para ver os outros modos de funcionamento Qualquer programa pode ser carregado no processador MIPSfpga utilizando o programa de lote com a indicação do caminho do programa a ser carregado loadMIPSfpgabat program directory Considerando que o núcleo foi previamente instalado na FPGA e que o BusBlaster está ligado à Nexys4 DDRR pode executar outros programas Não se esqueça de fechar as consolas OpenOCD e de comando gdb gerados pelo script de carregamento MIPSfpgabat Apêndice D O Processador MIPSfpga 981 D44 Executar a Depuração de Código Clique na consola gdb para selecionar esta ferramenta tal como se ilustra na Figura D35 O gdb está ligado ao núcleo MIPSfpga usando OpenOCD Também pode ver a consola OpenOCD se estiver interessado e que se representa na Figura D36 No final do script loadMIPSfpgabat o gdb carrega o arquivo executável elf e inicia o programa executar no processador MIPSfpga A seguir são fornecidos alguns comandos úteis para execução e depuração de um programa que está sendo executado em tempo real sobre no processador MIPSfpga usando o gdb Consulte também o manual do gdb disponível nesta página httpwwwgnuorgsoftwaregdbdocumentation Uma referência rápida dos comandos mais comuns do gdb está disponível em CProgramasImagination TechnologiesDocumentationrefcardpdf Figura D35 Consola do gdb Apêndice D O Processador MIPSfpga 982 Figura D36 Consola do OpenOCD A título de exemplo podemos ilustrar as potencialidades do gdb na depuração de código Reset e Stop do Processador Ao executar o comando abaixo o processador suspende a execução do programa Para além de provocar o reset do processador suspende também a sua execução monitor reset halt provoca o reset e suspende a execução Colocar um Breakpoint Ao associar um breakpoint a uma linha de comando sempre que o endereço dessa linha de comando é alcançado o processador suspende a execução do programa Apêndice D O Processador MIPSfpga 983 b main Coloca um breakpoint na função main No nosso código de exemplo a função main tem início no endereço 0x8000076c b 0x80000848 Coloca um breakpoint no endereço 0x80000848No código de exemplo esta instrução corresponde à instrução sw que escreve nos LED vermelhos Informação dos Breakpoint i b Lista informação sobre os breakpoint existentes Continuar a Execução de um Programa c Continua a execução do programa Irá suspender se encontrar um breakpoint No nosso caso o primeiro a ser encontrado vai ser o que corresponde à função main c Continua até ao próximo breakpoint No nosso caso corresponde ao do endereço 0x80000848 Imprimir o Conteúdo de uma Variável p count Apresenta o conteúdo da variável count px count Apresenta o conteúdo da variável count em hexadecimal px count Apresenta o endereço da variável count em hexadecimal Informação dos Valores dos Registros i r Imprime o valor de todos os registros i r v1 Imprime o valor do registro v1 valor a escrever nos LED i r v0 Imprime o valor do registro v0 endereço de memória dos LED Apêndice D O Processador MIPSfpga 984 Execução de uma Instrução stepi Executa apenas uma instrução Apagar um Breakpoint d 1 Apaga o breakpoint 1 Executa o Programa Monitor reset run Sem a existência de breakpoints o programa será executado normalmente 985 Leituras Futuras Berlin L The Man Behind the Microchip Robert Noyce and the Invention of Silicon Valley Oxford University Press 2005 A fascinante biografia de Robert Noyce inventor do microchip e fundador da Fairchild e Intel Para quem quiser trabalhar em Silicon Valley este livro dá informações sobre a cultura da região uma cultura influenciada mais fortemente por Noyce do que qualquer outro indivíduo Colwell R The Pentium Chronicles The People Passion and Politics Behind Intels Landmark Chips Wiley 2005 Conto de um insider do desenvolvimento de várias gerações de chips Pentium da Intel contada por um dos líderes do projeto Para aqueles que consideram uma carreira no campo este livro oferece uma visão da gestão de grandes projetos de concepção e um olhar behindthescenes para uma das linhas de microprocessadores comerciais mais significativas Ercegovac M and Lang T Digital Arithmetic Morgan Kaufmann 2003 O mais completo texto sobre sistemas aritméticos computacionais Um excelente recurso para a construção de unidades aritméticas de alta qualidade para computadores Hennessy J and Patterson D Computer Architecture A Quantitative Approach 5th ed Morgan Kaufmann 2011 Um texto fundamental sobre a arquitetura avançada de computadores Se você está intrigado sobre o funcionamento interno de microprocessadores de última geração este é o livro para você Kidder T The Soul of a New Machine Back Bay Books 1981 A clássica história de projeto de um sistema de computacional Três décadas depois a história ainda é um virar de página e os detalhes sobre a gestão de projeto e a tecnologia ainda soam a verdadeiro Pedroni V Circuit Design and Simulation with VHDL 2nd ed MIT Press 2010 Uma referência que mostra como projetar circuitos com VHDL Ciletti M Advanced Digital Design with the Verilog HDL 2nd ed Prentice Hall 2010 Uma boa referência para Verilog 2005 mas não SystemVerilog SystemVerilog IEEE Standard IEEE STD 1800 O padrão IEEE para HDL Verilog última atualização em 2009 Disponível em ieeexploreieeeorg VHDL IEEE Standard IEEE STD 1076 O padrão IEEE para VHDL última atualização em 2008 Disponível a partir IEEE Disponível em ieeexploreieeeorg Wakerly J Digital Design Principles and Practices 4th ed Prentice Hall 2006 Um texto abrangente e legível em projeto digital e um excelente livro de referência Weste N and Harris D CMOS VLSI Design 4th ed AddisonWesley 2011 O projeto Very Large Scale Integration VLSI é a arte e a ciência de construir chips que contêm grande quantidade de transistores Este livro coautoria de um dos nossos escritores favoritos atravessa este domínio desde o início através das técnicas mais avançadas utilizadas em produtos comerciais 986