Baixe o app para aproveitar ainda mais
Prévia do material em texto
Dispositivos Lógicos Programáveis Apostila com práticas em VERILOG. Junho – 2019 (versão 3). Prof. João Ranhel Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 1 Introdução Esta é uma apostila para introduzir dispositivos programáveis (“reconfiguráveis”) aos alunos do curso de Eletrônica Digital (disciplina ESTI002-17 no curso de Engenharia de Informação/CECS/UFABC). Acredito, e as evidências de mercado/indústria apontam, que circuitos integrados (CI) digitais discretos pertencem ao passado. Atualmente, projetos digitais são criados em dispositivos programáveis. São ao menos três linhas de CIs que permitem reconfiguração: CPLD (complex programmable logic devices – com centenas de blocos lógicos programáveis), FPGA (field programmable logic arrays – com milhares/milhões de blocos lógicos associados à memória interna e circuitos de suporte), e SoC (system on chip – um FPGA e um ou mais núcleos de CPU/processador, memória, etc. integrados no mesmo chip). Contudo, como ensinar que PLD (programmable logic devices - dispositivos lógicos programáveis) podem ser compreendidos com a mesma facilidade que os circuitos da geração anterior? A primeira providência pode ser tomar contato com os circuitos programáveis. Nesse sentido, temos a sorte de ter atualmente na UFABC um dos kits mais completos para ensino de PLDs. Usamos o kit DE2-115 da Terasic, que possui um FPGA da Altera/Intel com 115.000 blocos programáveis. O aluno perguntará se isso é muito – sim, é muito mais do que precisamos para fazer a disciplina. Em todas as aulas práticas que fazemos nessa disciplina não usamos mais de uns 5.000 blocos lógicos. Este é o argumento fatal a favor da mudança de paradigma para PLDs em vez dos CIs discretos. Fazer um projeto, do protótipo à placa de circuito final (PCI – placa de circuito impresso ou, PCB – printed circuit board) era um processo demorado e custoso. Hoje, estes kits permitem prototipagem rápida e, caso não demande criação de milhões de PCBs, é possível usar os circuitos programáveis nos projetos finais. Para se ter uma ideia, um CPLD com 32 células de programação (grosso modo equivale a 32 CIs discretos) custa em torno de US$ 1,50. Um FPGA com 6.000 blocos lógicos tem custo a partir de US$ 12,50. Estes custos têm caído rapidamente. Apenas para comparação, um 74HC163 (contador da geração anterior) custa ~US$ 0,50 por CI. A tendência é que fique mais difícil e mais caro obter componentes discretos devido à diminuição da produção em escala. A economia de tempo e custo de horas de engenharia de desenvolvimento (custo NRE – non-recurrent engineering), capacidade de customização de projetos, economia de energia, aumento de velocidade de processamento de informação, redução do tamanho das PCBs, e vários outros benefícios, apontam que os PLDs se tornaram a forma irreversível de se fazer projetos em eletrônica digital. Os kits de desenvolvimento do padrão da DE2-115 são caros e trazem vários recursos (displays, LCDs, chaves e botões, saída VGA, conversores A/D e D/A, entrada e saída de áudio, memória, etc.) que são desejáveis para quem desenvolve sistemas digitais avançados. Contudo, para o aluno que começa a aprender sobre portas e blocos lógicos combinacionais, circuitos sequenciais e máquinas de estado, há muito recurso nestes kits e esse excesso pode intimidar. Acredito que se deve ensinar lógica programável focado no objeto a ser programado (CPLD e FPGA). Por isso, sou adepto das PCBs de FPGA e CPLD mínimas. Elas possuem apenas os circuitos integrados básicos para alimentação do chip, cristais osciladores, conectores ligados direto nos pinos do CI, e memória de configuração (dispensável porque FPGA e CPLD têm memória de programação interna). Um kit FPGA mínimo (com FPGA Cyclone IV – EP4CE6) custa menos de US$ 30 pela Internet, e um Kit CPLD (MAX II EPM240) custa menos de US$ 12. Muitos alunos podem comprar um kit assim, apesar de a burocracia brasileira dificultar a importação, mesmo de valores abaixo de US$ 50. Tais kits mínimos podem ser usados para fazer trabalhos de conclusão de curso e até mesmo para aplicações profissionais. Acreditando que estudantes devem ter acesso a kits de PDLs para criar protótipos em casa, solicitei a alguns alunos que ajudassem a criar kits mínimos. O resultado foi a confecção de placas de alta qualidade, com os arquivos desenvolvidos no CAD Eagle, livres de royalties para quem quiser criar seu próprio kit FPGA. Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 2 Geralmente fazemos lotes de placas de circuito impresso (PCBs) e o custo de produção de cada PCB tem sido entre 1 e 2 dólares sem os componentes. Usamos um CI FPGA que custa menos de US 18. As listas de materiais estão disponíveis, portanto, o aluno pode montar sua própria FPGA. Evidentemente, é mais em conta fazer um pedido de uma placa pronta em um site no exterior. Nesta apostila vamos descrever como realizar as aulas práticas em um kit mínimo e no kit DE2-115 da Terasic. A ideia é sintetizar os circuitos nos FPGAs, ou seja, transformar os projetos em circuitos físicos na placa. As linguagens HDL permitem simulação, parte importante da cadeia de projeto digital. Técnicas de simulação serão objeto aprofundado em outra disciplina; por enquanto, nosso foco será síntese de circuitos. Nessa disciplina, sinais de entrada para FPGA serão fornecidos por chaves, botões ou teclados simples, e saídas serão LEDs ou displays de 7-segmentos. Aprenderemos simular e sintetizar circuitos no software EDA (Electronic Design Automation – programa assistente de projetos eletrônicos) Altera/Intel Quartus (versão Quartus II ou Quartus Prime). O aluno pode baixar a versão livre e sem custo desse programa para utilização em seu computador pessoal. Quem utilizar o kit mínimo precisa de um adaptador USB-JTAG (USB-Blaster da Altera/Intel) para programar FPGAs. O comportamento do CI FPGA/CPLD/SoC será descrito por uma linguagem de descrição de hardware (HDL – hardware description language) e, dentre algumas linguarens para esse fim escolhemos a Verilog por ser hoje um padrão na indústria, além de mais simples e mais indicada para um primeiro contato com HDL. Pode parecer aumento de complexidade ensinar “descrição” (ou “configuração”) de hardware logo no primeiro contato com eletrônica digital; mas a prática tenha mostrado que não. É fato que os alunos devem aprender uma nova linguagem; porém, montar “tabelas” verdade, extrair delas “equações” booleanas (ou seja, leis matemáticas), transformar equações em “diagramas eletrônicos” são partes de um processo contínuo que tem agora uma nova forma de representação: a HDL. Ou seja, HDL é apenas outra forma de representar o mesmo circuito, e que facilita muito para o engenheiro fazer alterações no projeto. A apostila é um texto guia sobre PLDs, sobre o básico de Verilog, e o uso dos kits em laboratório, tanto DE2- 115 quanto os kits míninos. Um livro para aprofundar nesses assuntos é imprescindível. O aluno que ler a apostila no início do curso (ESTI002-17 Eletrônica Digital) provavelmente não compreenderá aspectos técnicos descritos na explicação dos PLDs (próxima seção), tais como memória ROM, blocos lógicos programáveis, Look-Up Table, multiplex e decodificadores, nem flip-flops e somadores, além de outros. Não se preocupem porque ao final do curso todos esses conceitos terão sido abordados. Dessa forma, ao reler esta parte da apostila após ter cursado a disciplina o aluno deverá estar confortável e entender cada aspecto técnico da evolução e construção dos PLDs atuais. João Ranhel Junho de 2019 Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 3 1. Lógica Programável Dispositivos Lógicos Programáveis (PLDs – programmable logic devices) são componentes eletrônicosutilizados para construir sistemas digitais. Introduzidos na década de 1980, estes circuitos surgiram para atender a demanda crescente na complexidade dos sistemas digitais, diminuir e simplificar placas de circuito impresso (PCBs), reduzir consumo de energia, aumentar velocidade de operação, entre outras. CI discreto monolíticos Programable Logic Device (FPGA) (imagens modificadas da internet) Ao contrário de um circuito integrado (CI) discreto com portas ou blocos lógicos, cuja função é fixa, um PLD NÃO tem função prefixada quando é fabricado; assim, é o usuário/criador do sistema digital que configura o PLD determinando sua funcionalidade. Por hábito, essa “configuração” é chamada “programação” de PLDs; mas não deve ser confundida com os programas tradicionais de computadores. O que o usuário descreve é um hardware, e o que o programador de computador faz é criar uma sequência de instruções que um processador executará passo a passo. Alternativa aos circuitos programáveis são os circuitos cuja função é destinada a um propósito específico, denominados ASICs (application-specific integrated circuit - ou circuitos integrados de aplicação específica). Estes CIs são geralmente mais velozes, otimizados com relação ao consumo de energia, geralmente mais baratos quando fabricados aos milhões, e suas funções são definidas na fabricação. Geralmente, ASICs não necessitam de muitos componentes externos porque sua alta densidade permite absorver grande parte dos subsistemas, que são implementados dentro dos próprios chips. Os problemas com ASICs são: seu desenvolvimento é caro e demorado, não podem ser reprogramados; portanto, sua função e/ou vida útil fica dependente do tempo de existência do produto ao que foi destinado. Em geral, um ASIC é prototipado primeiro em PLDs, e assim que a funcionalidade do sistema é comprovada, cria-se um ASIC a partir da descrição de hardware usada na prototipagem, com os devidos ajustes para mudança de implementação. Em contrapartida, os PLDs são flexíveis e podem ser reutilizados, garantindo ao produto vida útil maior porque novas versões dos sistemas digitais podem ser reconfiguradas. Apesar de custarem mais que os ASICs por unidade, de consumirem um pouco mais de energia em geral, e de não atingirem as velocidades de operação mais altas que os concorrentes ASICs, para muitos projetos os PLDs são os circuitos finais. Em comparação com outras tecnologias de circuitos integrados digitais (por exemplo, discretos), os dispositivos de lógica programável apresentam um ciclo de projeto menor e custos reduzidos. Os PLDs podem, atualmente, ser classificados em três tipos de circuitos: CPLDs (complex programmable logic device), FPGAs (Field Programmable Logic Arrays), e SoCs (Systems on Chips – que são FPGAs associadas a microprocessadores em um único chip. CPLDs são mais simples que FPGAs e são utilizados para implementação de sistemas ou circuitos lógicos de complexidade intermediária, são reconfiguráveis e sua configuração é não volátil, ou seja, na falta de energia a configuração permanece. Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 4 FPGAs permitem implementar sistemas lógicos de grande complexidade por terem blocos lógicos mais complexos (explicado adiante), sistemas de roteamento em maior escala, sistemas de distribuições de sinais globais como clock e reset, circuitos aritméticos e DPS com multiplicadores, somadores, etc; mas, principalmente, porque possuem blocos de memória interna configurável de acordo com a necessidade do usuário – por exemplo, é possível configurar memória RAM de porta dupla (dual-port RAM). Existem CIs FPGAs com configuração não volátil, mas a maioria utiliza RAM estática para programação/configuração, que é volátil e perdem a configuração ao serem desligados. Portanto, uma característica marcante dos FPGAs é que precisam ser reconfigurados cada vez que são desligados. Essa reconfiguração pode ser feita de várias maneiras diferentes: automaticamente, após o reset, pelo próprio CI FPGA que lê os bits de configuração numa memória externa; ou por um microprocessador externo que envia os bits para dentro do CI FPGA; ou ainda via uma porta especial chamada JTAG, que consiste em um conjunto de pinos do FPGA que permitem programação e debugging serial. Vamos trabalhar com os CIs FPGA da Altera / Intel. Portanto, vamos explicar o que há dentro de uma família de FPGAs especificas chamada CYCLONE IV. 1.1 Evolução da lógica programável Antes de surgirem os CIs de lógica programável (PLDs) as placas de circuito eletrônicas (PCBs) só continham CIs discretos que eram interligados por trilhas de cobres nas placas. Isso ocupa espaço na placa porque cada CI dedicado tinha seu encapsulamento. Os primeiros CIs foram encapsulados na forma dual-inline package (DIP – ainda existentes). Eles atravessam as PCBs e são soldados do outro lado da placa, limitando a quantidade de componentes na PCB. Um avanço foi o surgimento dos CIs para montagem de superfície que não exigem a perfuração da placa, portanto o lado oposto da placa pode também ter componentes. Mas, o que se mostrava mais necessário é que CIs não precisassem ser encapsulados e seus módulos funcionais pudessem ser apenas reconfigurados para se obter melhor uso do espaço, da energia, etc. Assim, a indústria de componentes eletrônicos passou a pensar em criar CIs que não tivessem funções pré-definidas como os discretos, e sim, que fossem circuitos programáveis ou reprogramáveis. A ideia é que qualquer função lógica pode ser obtidas a partir de portas AND, OR, NOT interligadas internamente, e não do lado de fora de um CI discreto. O avanço de tecnologias de integração de transistores permitiu gradativamente a construção de CIs dessa natureza. Os arranjos lógicos programáveis: Um arranjo lógico programável consiste em circuitos que possuem estrutura interna baseada em um conjunto deportas AND-OR (o conjunto de portas AND e OR são chamados de arranjos) que podem ser ligados ou desligados para se obter, geralmente, SOMA DE PRODUTOS. As entradas desse circuito são ligadas às portas AND (formando produtos: P = A•B•C ... •Z) e as saídas das portas AND são conectadas às entradas das portas OR (realizando a soma: X = P1 + P2 + ... + PN), que são as saídas do circuito. Lógica Programável em ROM: É possível fazer lógica programável nas memórias do tipo ROM. Antes das PLD's serem inventadas, as memórias ROM/PROM foram utilizadas para implementar lógica combinatória. Considere uma ROM com m entradas (m linhas de endereço) e n saídas (n bits de dados). Quando usadas como memória, cada ROM contém 2n palavras de n-bits. Considere que as entradas são ligadas não a um endereço m-bits mas a m sinais lógicos independentes; teremos em tese 2m funções booleanas possíveis desses sinais. Por exemplo, suponha que m = 3 = {A,B,C}. Pode-se obter as seguintes combinações com essas entradas (ou, os seguintes endereços de memória): �̅��̅�𝐶̅ + �̅��̅�𝐶 + �̅�𝐵𝐶̅ + �̅�𝐵𝐶 + 𝐴�̅�𝐶̅ + 𝐴�̅�𝐶 + 𝐴𝐵𝐶̅ + 𝐴𝐵𝐶. Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 5 Contudo, a estrutura da ROM permite apenas n destas funções sejam obtidas nos pinos de saída. Ou seja, se escolhermos o bit D0 como saída, podemos gravar a ROM para gerar em D0 uma soma de qualquer dos produtos acima, basta gravar um bit ‘1’ na posição equivalente ao termo da equação desejado. Como temos n saídas (digamos 8 bits) então teremos n (8) funções lógicas possíveis, uma em cada pino de saída de dados (D0, D1, D2, D3, D4, D5, D6, D7). Um exemplo, com m=3={A,B,C} e n=8{D0, D1, D2, D3, D4, D5, D6, D7}, em D0 poderia ser gravar: {1 + 0 + 0 + 1 + 1 + 0 + 0 + 0} que significa que, no bit D0 , seria obtida a seguinte função: 𝑫𝟎 =�̅��̅�𝐶̅ + 0 + 0 + �̅�𝐵𝐶 + 𝐴�̅�𝐶̅ + 0 + 0 + 0. A ROM torna-se equivalente a n de circuitos lógicos paralelos, cada qual gerando sua função lógica independente de m entradas. Pode-se utilizar ROM (PROMs, EPROMs, EEPROMs) para esse fim para gerar qualquer função lógica combinacional com m entradas, tornando a ROM um dispositivo lógico disponível para aplicações variadas. O inconveniente é que as ROMs ficam com grande parte de seu circuito inativo e sem função, além de serem mais lentas que os circuitos convencionais, de consumirem mais energia, de não permitirem implementação de lógica sequencial sem componentes externos. Por esses motivos, implementar lógica programável em ROM é ineficiente. A noção de programação de memória ROM como PLD é mostrada na figura 1. Fig. 1: Uma ROM vista como dispositivo programável (img modificada da internet). Circuitos Programáveis Específicos: Na década de 1970 começaram a surgir os circuitos programáveis específicos. A ideia era atender uma demanda de engenharia que precisava de lógica combinacional programável para minimizar espaços nas PCBs. Datas marcantes e as principais tecnologias introduzidas foram: •PLA (Programmable Logic Array – ou arranjo lógico programável) Em 1970, a Texas Instruments desenvolveu um CI programável por máscara baseado em memória associativa. Este componente, o TMS2000 era programado alterando-se a camada de metal durante a fabricação. A Texas criou a sigla (o acrônimo) PLA(Programmable Logic Array) para este dispositivo. Em 1973, a National Semiconductor introduziu um dispositivo PLA programável por máscara (DM7575) com 14 entradas e 8 saídas, mas não possuíam registradores/memória. A ideia do PLA é ilustrada na figura 2: http://pt.wikipedia.org/wiki/Texas_Instruments http://pt.wikipedia.org/wiki/National_Semiconductor Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 6 Fig. 2: arranjo típico do PLA: ambas, a matriz AND e a matriz OR são programáveis (imagem do manual - National). Este tipo de circuito era difícil de ser programado devido ao fato do projetista ter que escolher tanto os termos que produziam os produtos (AND) quanto os termos da soma (OR). Extrair o melhor dos CIs requeria dos projetistas realizar simplificações dos circuitos desejados, o que resultava em pouca economia de tempo de projeto. Simplificação de circuito era um processo manual que requeria grande involvimento intelectual e atenção dos projetistas, resultando muitas horas de desenvolvimento de engenharia. No exemplo da Fig. 2 vemos como devem ser programadas as conexões tanto na matriz AND quanto na matriz OR para se obter cada uma das 6 funções de saída. Ainda com limitações, os PLAs foram os primeiros passos no sentido da criação de lógica programável que efetivamente diminuiam espaços nas placas, melhoravam o desempenho em velocidade e em consumo de energia. • PAL - (Programmable Array Logic – ou Matriz lógica programável) No início de 1978, a fabricante Monolithic Memories, Inc (MMI) introduziu um dispositivo diferente dos PLAs, com uma arquitetura mais simples porque omitia a matriz programável OR, ou seja, a matriz OR está pré- configurada. Esse dispositivo ficou conhecido pelo acrônimo PAL (Programmable Logic Arrays). O novo arranjo torna os componentes mais rápidos, menores e mais baratos, e o projetista deveria optar apenas pelo tipo de arranjo de saída que desejava. Os PAL possuíam ainda flip-flops (ver Fig. 3) incorporados às matrizes OR, que podiam ser programados para criar circuitos sequenciais e máquinas de estados finitos (FSM) sem auxílio de circuitos discretos externos. Em certo sentido o PAL desmistifica o processo de construção de sistemas digitais porque um software de design convertia equações booleanas de engenharia em padrões de queima ou não de fusíveis internos no chip, usados para programar o componente. Os componentes PAL se tornaram populares. Acompanhando o avanço dos circuitos integrados, surgem as primeiras linguagens de descrição de hardware HDL (Hardware Description Language), tais como ABEL, CUPL, ou PALASM. A primeira função das linguagens seria documentar circuitos digitais, mas logos viu-se que era possível usar HDL para simular circuitos digitais em computador. Nessa época, algumas linguagens passaram a oferecer opções de síntese de circuitos; ou Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 7 seja a capacidade de converter o texto da descrição do circuito em configuração (ou programação) dos circuitos integrados recém criados. Fig. 3: circuito PAL PLUS 16R4 da Philips: a matriz AND é programável e a matriz OR é fixa. Note-se a presença de flip- flops, apropriados para criação de FSM (imagem do manual Philips). • GAL - (Generic Array Logic) Com o sucesso dos PALs, em 1985 a Lattice Semiconductor expandiu a ideia criando os circuitos conhecidos como GAL (Generic Array Logic), que tem as mesmas propriedades lógicas dos PAL mas podem ser apagadas e reprogramadas. Estes circuitos se mostraram úteis no estágio de prototipagem de projetos, quando alguns erros lógicos costumam surgir. Os GAL podem ser programados e reprogramados usando um programador PAL ou usando um circuito especializado, embutido em alguns chips. Um componente similar, o PEEL (programmable electrically erasable logic), foi produzido pela ICT1. Atualmente, estes circuitos e técnicas de criação de sistemas lógicos programáveis foram substituídos pelos novos dispositivos que surgiram a partir dos anos 1980, baseados em blocos lógicos programáveis. Elementos Lógicos Programáveis: A Altera/Intel chama Elementos Lógicos (LE – Logic Elements) as estruturas que compõem a nova base de dispositivos programáveis, mais genéricas e versáteis que as tradicionais matrizes de AND-OR dos arranjos lógicos programáveis. O principal conceito introduzido neste tipo de tecnologia é a LUT (Look-up Table). Uma LUT (tabela de consulta) é composta de um multiplexador (MUX) ( ver figura 4) associado a um registrador de deslocamento (SR: shift-register). Os bits em paralelo na saída do SR são ligados a um MUX. 1 Fonte: http://pt.wikipedia.org/wiki/Dispositivo_l%C3%B3gico_program%C3%A1vel (17/09/2014) http://pt.wikipedia.org/wiki/Dispositivo_l%C3%B3gico_program%C3%A1vel Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 8 Fig. 4: Multiplexador de 2 entradas, e uma Look-up Table (LUT) de 2 entradas. As saídas do MUX na LUT são definidas pelas variáveis de entrada A e B, e os registrador de deslocamento armazena os bits. Com esse arranjo, a saída F do MUX é selecionada em função das entradas (A e B – no exemplo da Fig. 4). Se um determinado termo da função está ativo (ou não) é uma questão de ligar (1) ou desligar (0) o bit de dado respectivo no shift-register. Por exemplo, no esquema da Fig. 4, para obter a equação 𝐹 = 𝐴. 𝐵 + �̅�. �̅� precisamos gravar os bits “1001” nos flip-flops do SR (cujas saídas se tornam as entradas I1...I4 do mux). Para obter a função 𝐹 = 𝐴 ⊕ 𝐵 (função XOR) precisamos gravar os bits “0110” nos flip-flops do registrador de deslocamento (𝑋𝑂𝑅 = �̅�. 𝐵 + 𝐴. �̅�). Associado às LUTs colocam-se entradas adicionais (geralmente ligadas a portas XOR para criar somadores e subtratores em cascata) e um ou mais flip-flops do tipo D para reter dados; ou seja, para facilitar a criação de lógica sequencial. A esse conjunto de blocos lógicos funcionais a Altera/Intel dá o nome de Logical Elements (LE), ou elementos lógicos, como pode ser visto na Fig. 5. Outro nome comum é Configurable Logic Block (CLB), usado pela Xilinx, outra fabricante de FPGAs. Os blocos de lógica configurável (CLB) são os blocos fundamentais na construção das tecnologias atuais de FPGA e CPLDs. Fig. 5: Esquemático de um bloco lógico configurável composto de umaLUT, um flip-flop e um multiplex de saída. A complexidade dos elementos lógicos varia entre tecnologias, e de fabricante para fabricante. É comum construir elementos lógicos com 4, com 5 ou com 6 entradas nos multiplexadores. Isso depende da família de elementos lógicos programáveis onde serão utilizados. A figura 6 mostra um elemento lógico configurável de um CPLD da Altera. Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 9 Fig. 6: Elemento Lógico (LE) configurável numa CPLD Altera. Nos dispositivos mais complexos como FPGA, os LEs possuem entradas em cascatas para operações aritméticas e outras funções (imagem - manual da Altera). Embora exista CPLDs com matrizes de portas AND e OR associadas a elementos lógicos (LUT), é uma tendência que os circuitos, mesmo CPLDs, sejam feitos com elementos lógicos como os descritos acima. Relativamente, PALs e GALs são construídos pequenos, com poucos componentes configuráveis. São apropriados para criação de circuitos lógicos de baixa complexidade, e são equivalentes a algumas centenas de portas lógicas. Para sistemas lógicos maiores pode-se usar Complex PLD ou CPLDs. • CPLDs (Complex Programmable Logic Devices) O acrônimo CPLD (Complex Programmable Logic Devices) define uma classe de componentes que contém o equivalente a vários PALs integrados no mesmo chip. Esses PALs podem internamente ser interligados por meio de barramentos (conjunto de fios paralelos que possuem transistores fazendo o papel de chaves que os interligam). Dentro de um único chip CPLD pode ter centenas ou milhares de elementos lógicos (LE) programáveis, que podem ser interconectados por barramentos programáveis implementados no chip. CPLDs podem assim substituir milhares de portas lógicas e/ou blocos lógicos vendidos em CIs discretos. E os barramentos programáveis podem fazer o papel de milhares de trilhas de cobre nas PCBs – ou centenas e milhares de fios nos protoboards! Alguns CPLDs antigos podem ser configurados/programados usando o programador PAL ou programador universal, mas este método torna-se inconveniente para CIs com centenas de pinos. Devemos lembrar que para a lógica interna do CI executar alguma função no mundo externo é preciso disponibilizar pinos no chip para conexão de entrada e/ou saída dos sinais lógicos. Com o aumento da complexidade os chips têm cada vez mais pinos para conexão externa – hoje da ordem de centenas, mais de mil, e até >2000 pinos.2 Assim, surgiu outro método de programação que consiste em soldar o componente à PCB, ligar um cabo serial que transfere dados de configuração a partir de um PC, e programar (configurar é a melhor palavra) o CI na própria PCB junto com os outros componentes. Essa técnica é conhecida como In-Circuit Serial 2_https://www.xilinx.com/support/documentation/user_guides/ug1099-bga-device-design-rules.pdf http://www.aetpcb.com/aet/net_resources/help/BGA_Breakouts_and_Routing.pdf https://www.xilinx.com/support/documentation/user_guides/ug1099-bga-device-design-rules.pdf http://www.aetpcb.com/aet/net_resources/help/BGA_Breakouts_and_Routing.pdf Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 10 Programming (ICSP). O CPLD contém um circuito que decodifica os dados seriais e configura o chip. Alguns fagricantes usam nome proprietário para o sistema de configuração dos chips com essa metodologia; e.g. a Lattice chama (ISP) "In-system Programming" (ou programação no sistema), termo que ainda é utilizado. Contudo, o método mais comum de gravação é o JTAG, que discutiremos adiante, que é um padrão estabelecido pelo IEEE. Foi dito que o CPLD é programado via serial, esta é a razão por termos utilizado um registrador de deslocamento (SR ou shift-register) na representação dos bits de configuração da LUT na Fig. 4. Na verdade, os bits de configuração de um CPLD ou FPGA (tanto os das LUTs quanto os que configuram os barramentos e interconexões) são introduzidos nos chips serialmente, e percorrem um longo registrador de deslocamento que armazena todos os bits de configuração possíveis dentro do chip. A Fig. 7 ilustra como é um diagrama de blocos com a configuração interna de um CPLD da Altera. Fig. 7: Diagrama de blocos de um CPLD Altera (MAX V). Cada Bloco Lógico (LAB) é formado de vários elementos lógicos programáveis (LEs). Um barramento interconecta blocos lógicos. Os blocos IOE mostram os circuitos que interconectam cada bloco com os pinos de entrada e saída do circuito integrado (imagem do manual Altera). Os CPLDs modernos são muito utilizados para fazer pontes entre barramentos (bus-bridge) em PCBs complexas, quando há diferenças entre tipos de barramentos num sistema. Podem ainda ser utilizados para fornecer lógica complementar para FPGAs, ou em substituição a circuitos que usariam centenas de circuitos integrados discretos. Atualmente (05/2017) é possível comprar uma placa (kit) de desenvolvimento CPLD em sites da internet por ≈ US$ 10,00; como a placa da figura 8. O CI sozinho custa em torno de US$ 7,50, mas comprado aos milhares o preço cai consideravelmente. Os kits facilitam o uso dos CPLDs porque já vem com toda a parte de alimentação e regulação de tensão, filtros, entrada de programação JTAG e cristal oscilador instalados na placa. Os pinos de entrada e saída (I/O) do chip (EPM240 Altera MAX II CPLD) são ligados a quatro barras de pinos duplos (latch connectors). Por meio desses pinos o usuário tem acesso aos pinos do chip que podem ser configurados para entrada, saída, bidirecionais; facilitando ao usuário configurar o circuito como queira. Por esse motivo, essas placas de PCB são apropriadas para criar protótipos rápidos. Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 11 Fig. 8: kit EPM240 Altera MAX II CPLD. O kit custa ~ US$ 10,50 3. Baseado no CPLD EPM240 possui: 240 elementos lógicos LEs, 192 macro células, 80 pinos I/O, opera até 340 MHz (foto divulgação da internet). Uma vez tendo terminado um protótipo, o usuário poderá optar por criar sua própria placa (usando o chip do kit), ou incorporar o kit em seu projeto final – ganhando tempo. Para vários projetos de conclusão de curso estes kits são mais que suficientes. • FPGA (Field Programmable Gate Array) A sigla FPGA (Field Programmable Gate Array) se referem a uma família de CIs reprogramáveis que usam conjuntos de elementos lógicos (LEs, descritos anteriormente) como unidades básicas para construção da lógica configurável. Cada fabricante dá um nome ao seu conjunto de elementos lógicos, assim, podemos encontrar “blocos lógicos programáveis” (PLBs ou Programmable Logic Blocks) ou Logic Array Blocks (LABs), e assim por diante. Para se ter uma ideia, na família Cyclone IV da Altera, cada LAB possui: ■ 16 LEs ■ LAB control signals ■ LE carry chains ■ Register chains ■ Local interconnect Apenas por essa pequena descrição dá para perceber que o que diferencia FPGAs de CPLDs é a complexidade da construção dos elementos programáveis. Associe-se a isso a integração em grande escala permitindo que um chip possua milhares e até milhões de LEs semelhantes aos da Fig. 6. Na tecnologia da família de FPGAs Cyclone V a Altera/Intel chamou de ALM (adaptive logic modules) cada elemento lógico programável (LUT + 4 registradores + adders + lógica adicional), com mostrado na Fig. 9. 3 http://www.dx.com/pt/p/altera-max-ii-epm240-cpld-development-board-214282 (em 10/05/2017) http://www.dx.com/pt/p/altera-max-ii-epm240-cpld-development-board-214282 Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 12 Fig. 9: ALM (adaptive logic modules) são os elementos lógicos programáveis na família Cyclone V da Altera. Cada ALM possui 4 registradores, 2 LUTs com 6 entradas, 8 MUXs e lógica adicional. Os ALMs são os componentes-base na construçãodos LAB (logic array block) e MLABs. Os LABs são os blocos de arranjo lógicos que abrigam os primeiros arranjos de ALMs, como na Fig. 10 abaixo. Fig. 10: Estrutura dos LAB (logic array block) na família Cyclone V. LABs e MLABs formados por vários ALMs agrupados. MLABs são LABs que podem ser usados como memória RAM. Note as estruturas de interconecção entre blocos lógicos na forma de barramentos em colunas e linhas, todos programáveis, ou seja, cada uma das milhares de vias nesses barramentos possui um transistor que faz o papel de chave, ligando ou desligando entrada ou saída do LAB às vias. Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 13 Além de possuirem as estruturas de blocos lógicos programáveis e barramentos que os interconectam, as FPGAs possuem também subsistemas ou circuitos complexos dedicados. Por exemplo: • Sistema de gerenciamento de clock – dedicado para gerenciar sinais vários sinais de clock (relógios do sistema), sinais de reset e enable global, etc. Para isso, circuitos nos FGPAs avançados possuem PLLs (Phase Locked Loop) que permitem multiplicar e dividir o clock de entrada globalmente pelo chip, gerando duty- cicles variados e compensando atrasos na propagação de sinais. • Advanced I/O support – que permite gerar sinais diferenciais de alta velocidade nas saídas (para transceptores diferenciais), ou permitem controlar os vários níveis de tensão (Single-Ended I/O standard support, including 2.5-V and 1.8-V, SSTL class I and II, 1.8-V and 1.5-V HSTL class I and II, 3.3-V PCI and PCI-X 1.0, 3.3-, 2.5-, 1.8-, and 1.5-V LVCMOS, and 3.3-, 2.5-, and 1.8-V LVTTL). • Multiplicadores e Acumuladores embutidos – para implementar operações aritméticas no hardware em alta velocidade, facilitando implementação de processamentos de sinais digitais (DSPs). • Bloco de memória RAM – internamente os chips FPGAs possuem RAM estática de alta velocidade, a maioria com suporte a dual-port RAM. Note-se que há diferença entre a memória de programação do FPGA (que são bits que programam as LUTs, os elementos lógicos, e as interconexões de barramento) e a memória RAM implementada no FPGA (que são bits disponíveis para uso como memória de rascunho pelos circuitos que o FPGA estiver executando). É possível comprar um kit FPGA atualmente (Fig. 10) por valores como ~US$ 27,00 (05/2017)4. Um circuito integrado FPGA hoje, com 6.000 LEs pode custar em torno de US$ 12,00 ou US$ 18,00 dependendo da versão. Por outro lado, há CIs FPGA especializados que custam até US$ 20.000,00 ou mais por CI. Fig. 10: Placa (kit) FPGA CoreEP4CE6 Cyclone IV Altera. A placa é feita par prover alimentação ao FPGA, sinal de clock e acesso aos pinos do JTAG usados para configurar o chip. Os pinos e entrada e saída da FPGA ficam disponíveis para o usuário usar para input ou output de seu projeto (foto divulgação no site DX na internet). Uma tendência também é embutir microprocessadores (µP) dentro dos CIs FPGAs, criando os chamados SoC (System on Chips). Esse componente permite aproveitar o melhor dos dois mundos: a flexibilidade de rodar software nos µPs, dentro de um FPGA que permite processamento em hardware. Com dispositivos tão complexos, fica evidente a necessidade de utilização de uma ferramenta apropriada para configurá-los. Um FPGA pode ter milhões de bits que precisam ser ligados ou desligados, basicamente para três fins: implementar a lógica desejada nos LEs, configurar o roteamente e as interconexões locais ou na matriz geral do chip, ou preencher os bits dos blocos de memória interna do chip. Assim, um FPGA pode 4 http://www.dx.com/pt/p/coreep4ce6-ep4ce6e22c8n-altera-cyclone-iv-cpld-fpga-development-core-board-w-full-io- expanders-297718 http://www.dx.com/pt/p/coreep4ce6-ep4ce6e22c8n-altera-cyclone-iv-cpld-fpga-development-core-board-w-full-io-expanders-297718 http://www.dx.com/pt/p/coreep4ce6-ep4ce6e22c8n-altera-cyclone-iv-cpld-fpga-development-core-board-w-full-io-expanders-297718 Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 14 facilmente alcançar milhões de bits necessários para configurá-lo. Por esse motivo, usa-se FFs tipo D em cada bit, e os dados de configuração são introduzidos no chip cada vez que o FPGA é religado. Cada bit interno pode representar um fio que o usuário precisaria ligar num protoboard, por exemplo, ou uma trilha a ser feita na PCB. Só para dar um exemplo, se um FPGA tiver 2 milhões de bits de configuração e o usuário gastasse 1 segundo para ligar cada bit, ele levaria ~556 horas contínuas para ligá-los; ou ~ 23 dias contínuos sem parar, contando que nenhum erro foi feito. Fica evidente a necessidade da assistência de um computador para realizar tal tarefa. Para isso foram criadas as ferramentas Electronic Design Automation (EDA ou ECAD), que fazem a “automação do projeto eletrônico”. O programa EDA da Altera/Intel no qual o usuário descreve o hardware de seu projeto é o QUARTUS II ou o Quartus Prime (ou versão mais atual). O usuário pode configurar esses chips para implementar funcionalidades complexas e personalizadas em hardware. Para isso, ele deverá descrever o hardware desejado utilizando uma linguagem de descrição de hardware (HDL – Hardware Description Language). Os arquivos de descrição em HDL são introduzidos no QUARTUS. As duas linguagens mais conhecidas para descrição de hardware são VHDL e Verilog. Outras linguagens com recursos mais avançados estão ganhando corpo ultimamente, como o SystemVerilog e SystemC. A linguagem Verilog será usada em nossas aulas práticas descritas adiante • JTAG (Joint Test Action Group) Já na década de 1970 o projeto das PCBs se tornaram complexo o bastante para causar um embaraço para a indústria eletrônica: como testar cada placa produzida? Com os circuitos integrados crescendo em complexidade, o número de trilhas da placas aumentavam. Mais ainda, surgiram PCBs com vários layers e as trilhas ficavam ‘escondidas’ e sem pontos de acesso para serem testadas. Posteriormente surgiram CIs cujos pinos (e as trilhas) ficavam escondidos em baixo dos CIs (os BGAs ou ball gate arrays). Para estudar e solucionar o problema o IEEE (Institute of Electrical and Electronics Engineers) criou um grupo de trabalho que ficou conhecido como Joint Test Action Group. Este grupo criou um padrão, denominado IEEE 1149.1, que define uma ferramenta para testes de Cis e PCBs, conhecido também como Standard Test Access Port e Boundary-Scan Architecture. A imagem 11 mostra como o padrão IEEE 1149.1 insere no chip a capacidade de funcionar na cadeia de CIs com arquitetura boundary-scan. Estes chips possuem em cada pino do CI um sistema de chaveamento que permite desconectar a lógica interna do chip; ou seja, os núcleos lógicos do CIs ficam desconectados do mundo externo. O boundary-scan permite também desconectar as trilhas externas da PCB da lógica interna; portanto, uma trilha da placa pode ser isolada. Fig. 11: Chip com o boundary-scan architecture (ou JTAG). Estes chips possuem em cada pino do CI um sistema de chaveamento que pode desconectar a lógica interna, pode desconectar as trilhas externas, e permite excitar tanto a lógica interna quanto as trilhas externas. Os chips são interconectados em cadeia. Mais ainda, o sistema de chaveamento implementado em cada pino do boundary-scan permite excitar tanto a lógica interna do chip (com as trilhas desconectadas) quanto as trilhas externas (com as lógicas internas dos chips desconectadas). Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 15 Para que essa funcionalidade fosse implementada, os CIs com JTAG possuem pinos adicionais dedicados, e podem ser conectados em cadeia. Dessa forma, é possível deslocar bits na cadeia de forma a ‘ler’ o estado de cada pino isolado nos CI da cadeia. Por exemplo, pode-se excitar uma trilha e verificar se osinal chega apenas nos pinos aos quais ela está ligada, verificando se há rompimento ou curto nas trilhas. Por outro lado, se é possível desconectar os CIs e excitá-los internamente, então é possível usar o boundary scan para pelo menos dois outros propósitos: gravar bits na lógica interna do chip e verificar o status desses bits. Ou seja, pode-se configurar ou programar os chips JTAG com os CIs conectados às PCBs. Por outro lado, pode-se ler os bits dentro do chip, então, é possível usar o JTAG como ferramenta de depuração (debugging) lendo o status de qualquer bit dentro do chip. A Fig. 12 mostra uma placa de circuito impresso com alguns CIs com (e outros sem) JTAG, e a forma como a cadeia é ligada. Os pinos JTAG do chip tem nomes definidos: TDI (test data input), TCK (test clock), TMS (test mode select) e TDO (test data output). Para fazer a cadeia, conectam-se os pinos TCK e TMS em paralelo, enquanto TDI e TDO são ligados em série. O pino TDI1 do 1º chip (por onde entram os dados da cadeia) está ligado no terminal JTAG. O pino TDO1 do 1º chip é ligado ao TDI2 do 2º chip na cadeia, e seu TDO2 é ligado ao TDI do chip seguinte e assim por diante, até que TDO do último chip se conecta ao terminal JTAG (Fig. 12). Fig. 12: Placa de circuito impresso (PCB) com um terminal JTAG de acesso externo. Note como os CIs são ligados em cadeia, com o TDOn de cada chip conectado ao TDIn+1 do chip seguinte. Os outros sinais são ligados em paralelo. Isso forma a cadeia boundary-scan que permite testar a placa, programá-la, e debugar projetos (imagem da internet) Vamos utilizar o terminal JTAG da placa para configurar o kit FGPA/CPLD, por isso é preciso um adaptador serial que converta a saída do PC para a entrada JTAG do kit. O adaptador USB-Blaster (Fig. 13) da Altera serve para esse fim. Ele vem com dois cabos: (a) um que se conecta à USB do PC e ao conversor de níveis; e (b) um flat-cable JTAG (10 pinos) que é conectado ao conversor de níveis e ao conector JTAG da placa. Fig. 13: Adaptador JTAG da Altera (USB-Blaster): o cabo preto é conectado na USB do PC e ao conversor de níveis – a caixa USB-Blaster. O flat-cable é conectado à caixa e no terminal JTAG da placa (foto divulgação da internet). Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 16 2. LINGUAGEM DE DESCRIÇÃO DE HARDWARE (HDL) Como já foi dito, existem duas linguagens de descrição de hardware mais utilizadas atualmente: VHDL e Verilog. Vamos utilizar a última por entender que ela está mais próxima do padrão que se utiliza na indústria e no desenvolvimento de CIs; embora VHDL também seja uma linguagem eficiente e seja bastante utilizada na Academia e em projetos militares. A principal vantagem da modelagem de circuitos por linguagem descritiva, quando comparada à modelagem por captura de esquemático, é que em HDL o projeto se torna independente da plataforma de desenvolvimento (IDE) na qual se está trabalhando. Veremos a plataforma Quartus, mas um projeto descrito em HDL pode ser perfeitamente portado para ISE Design Suite – Xilinx, ou para IDE Vivado – Xilinx, ou qualquer outra IDE. Ciclo de Desenvolvimento utilizando HDL: Criar um projeto em HDL segue um ciclo de desenvolvimento. Primeiro o projetista cria um projeto e descreve o circuito usando Verilog. Durante o processo o projetista pode verificar sintaxe, etc. e garantir que cada arquivo de código gerado está descrito corretamente. Geralmente, cada arquivo Verilog descreve um circuito, um bloco lógico, um pequeno sistema. Se achar interessante a metáfora, pense nestes arquivos como se fossem um circuito integrado que você compraria numa loja para integrar ao seu sistema global – algo mais complexo. Um arquivo deve descrever como os vários arquivos Verilog estão interligados – ou seja, deve existir um arquivo também em Verilog que descreve a estrutura global do projeto. O fluxo de projeto pode ser visto na Fig. 14. Após descrever em Verilog os blocos que fazem parte do sistema (Fig. 14 System Design) o usuário pode e deve verificar a funcionalidade do projeto (bloco no canto superior direito: Functional Simulation, Design Rule Checking e RTL View). A fase de simulação de projetos é importante porque é mais fácil simular e observar a resposta do circuito primeiro dentro do computador do que completar o processo, gravar os bits de programação no FPGA e então executar o processamento da informação em hardware. Sem contar que o processo de debugging (depuração) no hardware é menos flexível do que no computador, usando excitação e verificação virtual. Durante o processo de simulação e verificação é possível ver graficamente no computador o comportamento e as respostas dos blocos circuitos e blocos descritos. É possível analisar tanto em nível de sinal lógico individual quanto no nível da transferência de pacotes de dados entre registradores (RTL). Fig. 14: Fluxo de criação de um projeto em HDL (retirado manual Quartus II) Na sequência do fluxo do projeto, o usuário deve impor as restrições ao circuto desejado, ou seja, deve configurar quais pinos físicos do CI receberá quais sinais eletrônicos, que na descrição de hardware foram Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 17 tratados por nomes abstratos. Por exemplo, na descrição do circuito podemos chamar um sinal de LED_01 e, para fazer esse LED acender temos que restringir esse sinal a um pino específico do FPGA (pino ao qual foi ligado esse LED). Ainda nessa fase o usuário pode fazer análises de performance aproximada e consumo, ambas baseadas em simulação (Fig. 14 – I/O Assignment & Analysis). Na sequência do fluxo o usuário deve fazer a síntese propriamente dita (RTL Synthesis). O programa EDA irá rotear as funções desejadas dentro do dispositivo escolhido (Place & Route Process). O programa vai então gerar um arquivo que é uma sequência de bits ‘1’s e ‘0’s respeitando o que foi descrito (a função que deve ser executada) associada aos pinos físicos do FPGA, para o dispositivo escolhido, ou seja, aquele CI FPGA escolhido (e.g. Cyclone IV EP4CE6E22C8N ou Cyclone V SoC—5CSXFC6D6F31C6N). Depois que o programa EDA realizou essa “compilação”, é possível enviar essa sequência de bits para o FPGA, esse processo é melhor definido como a gravação do arquivo configurador no dispositivo, mas, dentro dos EDAs esse processo é chamado “programação do FPGA”. Projetistas já em estágio avançados podem editar os locais da distribuição de funções na planta (fabric) do chip (Chip Editor). Podem também analisar por meio de simulações as áreas de dissipação de energia no FPGA de forma mais realística. Podem ainda analisar a temporização dos sinais de forma estimada e mais realista, perto do efeito real que a propagação de sinais terá no FPGA, embora esses processos consumam muito tempo. Para essas finalidades, os projetistas usam-se ferramentas de simulação (Power Analyis, Board-Level Timing, etc, quadro à direita inferior na Fig. 14). Esses procedimentos são avançados e não serão vistos na apostila. É possível também utilizar o JTAG e outras ferramentas de software para fazer debugging do hardware sintetizado no CI, direto na PCM (Fig. 14 In-System Verification). Esse é o fluxo normal de criação de um projeto utilizando uma linguagem HDL e uma ferramenta EDA. Agora, vamos analisar como se faz a descrição de hardware. • VHDL (Very high-speed integrated circuits Hardware Description Language) VHDL foi originalmente proposta pelo Depto de Defesa americano (DARPA) e depois foi transferida para o IEEE (Institute of Electrical and Electronics Engineers) que a padronizou. A linguagem é conhecida como IEEE 1076, ratificada em 1987, depois revisada em 1993, pequenas alterações foram introduzidas em 2000 e 2002, e por último, em setembro de 2008 foi aprovado pelo REVCOM a mais recente versão, IEEE 1076-2008.A ideia inicial da linguagem de descrição de hardware era padronizar a forma de descrever os circuitos lógicos de milhares de placas de diversos fornecedores do DARPA, em substituição aos desenhos dos circuitos; assim, seria possível passar a descrição de uma placa de um fornecedor para outro fornecedor com mais facilidade. Em seguida, observou-se que a linguagem de descrição do hardware também serve para simulações, para testar se o circuito opera da forma que se espera. Portanto, um HDL serve também para simular funcionamento dos circuitos, o que não é objeto desta apostila. Depois, ferramentas foram criadas para sintetizar circuitos em CPLDs e FPGAs. Sintetizar significa transformar a descrição dos circuitos em conexões dentro dos CIs de lógica programável, de forma que o comportamento e as funcionalidades descritas na linguagem se tornem efetivamente circuitos de hardware dentro dos chips. Nós vamos trabalhar com esta perspectiva. Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 18 • Verilog (Verilog Hardware Description Language – Verilog HDL) Verilog foi uma das primeiras linguagens para descrição de hardware (HDL) a ser inventada ( 1983/84, para a Gateway Design Automation, comprada pela Cadence Design Systems). Inicialmente a linguagem era proprietária, e tinha por objetivo descrever circuitos e permitir simulações; mais tarde, também lhe foi acrescentada a síntese de circuitos. Verilog foi posteriormente tornada não-proprietária. Diante do avanço da linguagem VHDL na época, a Cadence tornou a linguagem aberta para padronização, transferindo-a para domínio público subordinada à Open Verilog International (OVI – hoje Accellera). Posteriormente, submetida ao IEEE a linguaghem tornou-se o padrão (IEEE Standard 1364-1995), também conhecido por Verilog-95. Seis anos mais tarde, extensões foram submetidas para padronização no IEEE a fim de suprir deficiências encontradas pelos usuários na versão original, e se tornaram o padrão IEEE Standard 1364-2001, conhecido como Verilog-2001. Verilog-2001 foi um importante avanço em relação ao Verilog-95 e tornou-se a versão dominante de Verilog com suporte da maioria dos pacotes de software comerciais para a automação de projetos eletrônicos EDA. A mais recente revisão é Verilog 2005 (IEEE Standard 1364-2005) que é uma atualização do padrão anterior, SystemVerilog é um superconjunto de Verilog-2005, com novas características e capacidades para auxiliar o projeto e a sua verificação. A partir de 2009, SystemVerilog e a linguagem Verilog fundiram-se no padrão SystemVerilog 2009 (IEEE Standard 1800-2009). Sintaxe de Verilog: Os criadores dessa linguagem preferiram uma sintaxe familiar à da linguagem de programação C. Estruturas de controle de fluxo ( "if", "while" ) são constantemente encontradas nos código Verilog. A diferença básica entre o Verilog e “C” está na estruturação do código. Enquanto C é baseada no paradigma procedural, Verilog é estruturada em blocos “begin / end”, se caracterizando em uma linguagem modular, como veremos. Paralelismo temporal: Verilog difere das linguagens de computador (como “C”) pela maneira como é executada. Verilog (assim como VHDL) não segue os padrões lineares que as linguagens de computação usam. Um circuito Verilog consiste na separação hierárquica de módulos que contém conexões e registradores. Em outras palavras, pense que Verilog descreve circuitos que funcionam em paralelo. Há também a possibilidade de descrever processos sequenciais em Verilog. Processos sequenciais e paralelos definem o comportamento dos módulos em Verilog. Processos sequenciais são executados dentro de blocos "begin / end". Todos os demais processos são executados de forma paralela (são circuitos). Por outro lado, mesmo os blocos sequenciais são executados simultaneamente (em paralelo) com os outros módulos. Ou seja, o interior de um bloco “begin / end” é sequencial mas dois blocos/módulos são paralelos. Quais as vantagens de se utilizar Verilog? Vantagens Desvantagens Projeto independente da tecnologia; Hardware gerado é menos otimizado; Facilidade na atualização dos projetos; Simulações mais lentas que implementações Intercâmbio de projetos entre equipes; Dificuldade em encontrar pessoal treinado para lidar com a linguagem; Reconfiguração parcial e dinâmica; Reduz tempo de projeto e custo; Elimina erros de baixo nível; Simplifica a documentação Aumento da performance Toda linguagem tem um conjunto de regras (chamada sintaxe) que permite a um compilador, interpretador e/ou sintetizador verificar se não há ambiguidades ou descrições incongruentes. Você não aprende uma Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 19 lingua natural, como português, primeiro pela sintaxe; você aprende com a prática e o uso. Vamos usar o mesmo método aqui, vamos mostrar Verilog pela prática. Contudo, em conjunto, vamos analisar alguns aspectos da sintaxe básica de Verilog. Lembre-se de uma coisa primordial: quando você está trabalhando em um HDL você não está PROGRAMANDO computadores, no sentido de fazer um programa em “C” ou “Assembly”, você está DESCREVENDO um hardware. Há vários livros sobre Verilog, um que indico é Verilog by Example: a Concise Introduction for FPGA Design; Blaine C Readler, 2011 – Full Arc Press (www.readler.com) . Há vários tutoriais e apostilas na Internet. Sugiro o site: http://www.asic-world.com/verilog/index.html para consulta rápida e tutoriais. Para quando você estiver utilizando Verilog profissionalmente, consulte o manual do IDE que você estiver usando quanto ao estilo de codificação apropriado para o IDE. A Altera/Intel tem um manual do IDE (ex: Quartus II Handbook Volume 1: Design and Synthesis ) e nele há um capítulo intitulado Recommended HDL Coding Styles. Consulte o manual para ver se o estilo escolhido corresponde à melhor prática no IDE. • VERILOG HDL (uso prático, regras e sintaxe) • Comente (ou documente) seus projetos. É boa prática de programação/descrição comentar um projeto para descrever detalhes que no momento que você escreve estão claros para mas que podem ser esquecidos. Comente também para facilitar a outra pessoa ler o seu texto. Inserimos comentários no código Verilog da mesma forma com em linguagem “C”, ou seja, entre os marcadores /* comentários em várias linhas */ e, numa mesma linha usamos // comentário. Por exemplo: Fig 15. Exemplo de código em Verilog – cabeçalho e comentários Da linha 1 até a linha 24 na Fig. 15 há um comentário que começa com /* e termina na linha 24 com */. Tudo o que está em verde na figura é comentário, ou seja, o compilador Verilog ignora. É uma boa prática colocar um cabeçalho nos arquivos de projeto para você se lembrar posteriormente do que se trata aquele projeto. Insira detalhes sobre como configurar o circuito, quais os requisitos fundamentais para funcionar, etc. Na linha 33 do código tem (ao final da linha, depois do “;”) um marcador “//” e um comentário sobre o que é o parâmetro W_KTE. O compilador Verilog ignora tudo o que está escrito após o // até o próximo caracter carriage return (CR), que marca o final da linha (quando você dá um ENTER para saltar para linha seguinte). Note que as linhas 32 http://www.asic-world.com/verilog/index.html Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 20 e 34 também estão verdes (são linhas de comentário) porque começam com //. A linha 35 também tem um comentário ao final, depois do //, para o leitor se lembrar o que é o parâmetro Add_1. • Verilog é case sensitive, isso significa que o nome de uma variável declarada em letras maiúsculas é diferente do nome idêntico com letras minúsculas. Em Verilog, a variável varX é diferente de outra definida como VarX, que é diferente de VARX e de varx; • A linguagem Verilog tem algumaspalavras reservadas. Todas as palavras-chave da linguagem devem estar em letras minúsculas no texto. Por exemplo, na linha 33 e 35 temos a palavra-chave parameter que aparece em azul. As palavras-chave são reservadas e não podem ser utilizadas para outra finalidade. • Espaços em branco são utilizados para melhor legibilidade do código, ou para separar variáveis, palavras- chave, operadores e parâmetros. Você não pode usar espaço dentro do nome de uma variável, por exemplo. Assim, “Add 1” não é um nome de variável/parâmetro válido. Nesse caso, é recomendado o uso do underline ("_"), como pode ser visto em W_KTE (linhas 33, Fig. 15) e Add_1 (linha 35, Fig. 15). • Como outras linguagens, uma atribuição, comando ou declaração em Verilog termina com “;” – como nas linhas 33 e 35 da Fig. 15. Nesse caso, o enunciado começa com a palavra-chave parameter e termina com o “;”. O ponto e vírgula é entendido pelo compilador como terminação da linha (em vez do CR ou Enter). Em outras palavras, o compilador Verilog entende todos os caracteres como pertencente a uma linha até encontrar um ponto e vírgula; • Verilog NÃO aceita caracteres com acento (só nos comentário, porque não faz parte do código/texto Verilog). Um identificador (variável, porto, nome de sinal/fio ou bus) tem que começar com uma letra. • As seguintes palavras são reservadas (veja lista com as funções no apêncide 1): Palavras reservadas - Verilog always assign automatic begin case casex casez cell config deassign default defparam design disable edge else end endcase endconfig endfunction endgenerate endmodule endprimitive endspecify endtable endtask event for force forever fork function generate genvar if ifnone incdir include initial inout input instance join liblist library localparam macromodule module negedge noshowcancelled output parameter posedge primitive pulsestyle_ondetect pulsestyle_onevent reg release repeat scalared showcancelled signed specify specparam strength table task tri tri0 and tri1 triand,wand trior, wor trireg unsigned use vectored wait while wire Nos códigos Verilog descrevemos um circuito como um módulo. Um módulo é descrito entre duas palavras- chave: "module" e "endmodule". A palavra module é necessária e, depois de module temos o nome do módulo. As figuras Fig. 16 e Fig. 17 mostram um projeto simples em Verilog, descrito em um único módulo. O mesmo projeto foi descrito em dois estilos diferentes e as diferenças são explicadas adiante. OBS 1: Um módulo é sinônimo de um “arquivo”, então o nome do módulo é o mesmo do nome do arquivo. Ou seja, o nome do arquivo deve ser o nome do módulo seguido pelo “.v” que identifica um arquivo Verilog. OBS 2: Nas prática adotamos uma pasta para cada projeto; assim, o nome da pasta deve ser o mesmo nome do projeto. Como alguns projetos possuem apenas um módulo, vamos usar também o nome do módulo principal igual ao do projeto. Ou seja, acostume-se a criar uma pasta com o mesmo nome do módulo principal em Verilog, que será salvo dentro dessa pasta com a extensão “nome_do_módulo.v”. Para ficar claro: Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 21 Um projeto cria um comparador de 4 bits. O nome do projeto pode ser Comparador_4_bits. Assim, criamos uma pasta .\Comparador_4_bits\ e dentro dela colocaremos o arquivo Verilog Comparador_4_bits.v; e ainda, o nome do módulo Verilog dentro desse arquivo será definido assim: module Comparador_4_bits (...); ... (aqui entra a descrição do módulo) endmodule Note que as duas figuras (Fig.16 e Fig.17) contém códigos que começam com a palavra module e em seguida o nome do módulo: Simples_IN_OUT. Ambos os códigos terminam com endmodule. Entre essas duas palavras-chave escrevemos o comportamento do circuito que chamamos Simples_IN_OUT. Fig.16 – Um módulo simples escrito em Verilog no estilo do Verilog-95 Fig.17 – O mesmo projeto de módulo simples escrito em Verilog no estilo do Verilog-2001 Circuitos têm entradas e saídas de sinais, assim, depois do nome do módulo descreve-se quais são os sinais que entram e saem do módulo. Isso é feito em uma seção chamada port list, que está dentro de parêntesis ( ); logo depois do nome do módulo. Num esquema geral fica: module nome_do_módulo ( port list ); ... (aqui entra a descrição do módulo) endmodule module nome_do_módulo ( port list ); ... (aqui entra a descrição do módulo) endmodule Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 22 Os dois textos mostram o esquema geral do “esqueleto” de um módulo. Note que após o nome é possível inserir CR e espaços para melhorar a leitura, como na coluna da direita. O compilador entende que a linha Verilog começou com module e terminou no final do port list com o “;”, como no exemplo da esquerda. Observe nas Figs. 16 e 17 que depois do ”(“ que abre o port list temos uma lista separada por vírgulas com os nomes dos sinais: in_A, in_B, in_C, out_1, out_2. Trata-se da lista dos fios/sinais que entram e saem do módulo. Como foi dito, em inglês denomina-se port list, que numa tradução mais adequada seria “portos”, ou o local onde se ancoram os fios/sinais de entrada e saída do módulo. Não é bom usar “portas” de entrada e saída para não confundir com portas lógicas. Na versão Verilog-95 é obrigado listar os portos (Fig. 16) e depois de fechar o port list com “);” deve-se definir a direção do sinal: entrada, saída, ou bidirecional. Ou seja, define-se a direção dos ports usando comandos, com palavras-chave: input , output e inout; como nas linhas 19, 20, 21, 23, 24 da Fig. 16. Para facilitar a escrita, da versão 2001 em diante o Verilog incorporou o estilo de escrita (Fig. 17) com a definição das direções dos ports (input , output e inout) na própria declaração da lista. Note que a linha 9 inicia com input e, por ser uma lista, basta separar as entradas (iguais) por vírgula. A linha 10 (Fig. 17) inicia com output, que quebra a lista input e informa ao compilador que, a partir dali, a lista indica saídas. Observe que depois de declarar out_2 não há mais vírgulas e sim o fechamento da lista com “);”. Até esse ponto o leitor sabe que criamos um módulo, demos nome a ele, e definimos quais são os portos pelos quais os sinais entram e saem do módulo. Ou seja, definimos uma caixa preta, demos o nome a ela, e dissemos o que entra e o que sai dessa caixa. Nas linhas 26 e 27 da Fig. 16, e nas linhas 13 e 14 da Fig. 17, o código define o comportamento do circuito – ou seja, o que o circuito deve fazer. Em outras palavras, nestas linhas dizemos para caixa preta o que ela deve aplicar aos sinais de entrada e em quais saídas ela deve gerar os resultados desejados. Verilog suporta a descrição de circuitos em níveis diferentes de abstração. Três deles são importantes: ✓ Nível da porta (gate level) ✓ Nível comportamental (behavioral level) ✓ Nível de Transferência de Registo (register transfer level) No primeiro (gate level), as características do módulo (da caixa preta) são descritas por links lógicos e algumas propriedades temporais. Os sinais são discretos e só podem ter valores lógicos definidos (‘0’, ‘1’, ‘X’, ‘ ‘Z’). Os valores ‘0’ e ‘1’ são os estados lógicos 0 ou 1, o valor ‘X’ indica que o valor “não importa” (pode ser ‘0’ ou ‘1’, tanto faz); e ‘Z’ é o estado de alta impedância do circuito 3-state, que veremos mais tarde no curso. As operações utilizáveis são primitivas lógicas predefinidas (AND, OR, NOT, etc.). Usar modelagem no nível de portas pode não ser uma boa idéia para qualquer tipo de projeto, porque é o mais baixo nível. O segundo nível de descrição de circuitos (behavioral level), descreve um sistema por algoritmos concorrentes. Em outras palavras, o projetista descreve o comportamento do circuito, e não como as portas e circuitos lógicos se interligam. Cada algoritmo em si é sequencial,o que significa que são num conjunto de instruções executadas uma após a outra. Contudo, cada bloco comportamental funciona em paralelo tanto com os circuitos combinacionais (gate level) quanto com outros blocos comportamentais. No terceiro nível (Register-Transfer Level ou RTL) os projetos especificam as características de um circuito por operações de transferência de dados entre os registradores. Um sinal de clock explícito é usado. O design RTL contém limites de sincronização exatos: as operações estão planejadas para ocorrer em determinados momentos. Em outras palavras, a descrição em RTL define como os dados fluem dentro de um circuito e quais operações são realizada (e em que sequência) sobre eles. Os circuitos das figuras Fig.16 e Fig.17 estão codificados no nível gate level. Veremos os outros tipos em momento mais apropriado. O circuito/módulo descrito em Verilog nas figuras 16 e 17 é representado na Fig. 18 na forma de diagrama esquemático com portas lógicas. Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 23 Fig.18 – Esquema do circuito Simples_IN-OUT descrito nas figuras 16 e 17. A palavra assign em Verilog é reservada para definir lógica combinacional, ou seja, uma atribuição direta resultado da combinação de sinais. Na linha 26 Fig.16 (ou 13 Fig.17), descreve-se que o sinal out_1 (saída) recebe o resultado da conexão das (entradas) in_A, in_B, e in_C, por meio de uma porta lógica AND. O símbolo “&” define a operação lógica AND, que deve ser executada entre os operandos: in_A, in_B, in_C. Em álgebra booleana essa linha Verilog seria escrita: 𝐨𝐮𝐭_𝟏 = 𝐢𝐧_𝐀 • 𝐢𝐧_𝐁 • 𝐢𝐧_𝐂 . No caso da linha 27 Fig.16 (ou 14 Fig.17), descreve-se que o sinal out_2 recebe o resultado da conexão dos sinais in_A OR in_B OR (o sinal in_C invertido). O símbolo “|” no código quer dizer que a operação lógica OR deve ser executada entre os operandos: as entradas in_A, in_B. O símbolo “~” define um operador unário (aplicado apenas a um operando: a entrada in_C). Porém, o operador “|” entre (in_B|~in_C) determina que, depois de invertida, a entrada in_C também se liga à porta OR. Em álgebra booleana: 𝐨𝐮𝐭𝟐 = 𝐢𝐧𝐀 + 𝐢𝐧𝐁 + 𝐢𝐧_𝐂̅̅ ̅̅ ̅̅ . Veja no Apêndice 2 a tabela dos operadores da linguagem Verilog. Muitas vezes os circuitos digitais representam valores digitais usando mais de um fio em paralelo, ou seja, vetores (chamados de barramentos, ou bus). Verilog permite facilmente que você defina um porto como vetor usando a seguinte notação: Fig.19 – declaração de vetores em Verilog. A palavra assign em Verilog No exemplo (a) o estilo usado é Verilog-95 e no exemplo (b) o estilo é Verilog- 2001, mas ambos definem que os sinais/ports D são de entrada e que possuem 8 bits. O compilador entenderá que há um fio chamado D7 e decresce o nome dos fios seguintes até D0. A linha define o vetor de entrada cujos fios/sinais individuais são denominados {D7, D6, D5, D4, D3, D2, D1, D0}. Na linha abaixo, nos exemplos (a) e (b), temos a declaração de um vetor de saída de 8 bits, cujo nome é D_OUT e os sinais individuais serão {D_OUT7, D_OUT6, D_OUT5, D_OUT4, D_OUT3, D_OUT2, D_OUT1, D_OUT0}. Em Verilog podemos executar comandos com o vetor inteiro ou com sinais (os fios) individuais, por exemplo: Fig.20 – exemplo de uso de vetores dentro do corpo módulo. A linha 1 na Fig. 20 descreve um comando de atribuição direta do vetor de entrada D para o vetor D_OUT. Isso significa que o fio D7 foi ligado diretamente ao fio D_OUT7, o fio D6 foi ligado diretamente ao fio D_OUT6, e assim sucessivamente até D0 ligado diretamente ao D_OUT0. Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 24 A linha 2 Fig. 20 faz uma atribuição direta do valor binário ‘0’ ao sinal D_OUT0. O índice do sinal dentro de um vetor é definido dentro de um colchete. Por exemplo, na linha 3 da Fig. 20 temos um comando de atribuição direta do valor ‘1’ lógico ao bit (ao fio, ao sinal) D_OUT[6]. Valores estáticos (numeric literals) em Verilog são sempre representados usando um formato específico. A seguir alguns exemplos de como declarar valores estáticos: Var = 3’b101; // 3 bits, forma binária, explicitamente o número 5 = “101”b Var = 4’d13; // vals decimais não precisam formatar; mas, 4’d13 explicita o num 13 em 4 bits Var = 12’h3FA; // valor em 12 bits, hexadecimal e o conteúdo é 3FA = 1018 = 11 1111 1010b Vamos supor agora que você tenha um circuito descrito pela seguinte equação booleana e você precisa descrevê-lo em Verilog: 𝐨𝐮𝐭𝟏 = 𝐢𝐧𝐀| ( 𝐢𝐧𝐁 • 𝐢𝐧𝐂) | ( 𝐢𝐧_𝐀 • 𝐢𝐧_𝐂̅̅ ̅̅ ̅̅ ) . E esquema desse módulo é: Fig.21 – Esquema do circuito Simples_IN_OUT_2 descrito a figura 22. Note que temos duas ligações internas (fio1 e fio2) no circuito que não são portos (não são entradas nem saída do módulo). Esses dois sinais são ao mesmo tempo saída na porta AND e entrada na porta OR. Para fazermos as ligações desses sinais precisamos descrever para o compilador que esses fios (wires) serão usados antes de usá-los na descrição do circuito. A Figura 22 mostra a descrição desse circuito em Verilog. Fig.22 – Descrição do módulo com sinais intermediários, codificação do circuito da figura 21. As linhas 13 e 14 do código mostrado na Fig.22 declaram dois fios (wires) que serão usados depois nas linhas 16 e 17. A palavra-chave para declarar sinais intermediários é wire – literalmente, fio. Em circuitos eletrônicos existem dois tipos de sinais – um que não tem memória ( wire ) e outro tipo que memoriza o sinal por um tempo indeterminado ( reg ), como veremos adiante. Sinais tipo reg também precisam ser declarados antes de serem usados. Sinais não memorizáveis (wire) trafegam no circuito por meio de fios e são saídas e entradas ao mesmo tempo. Sinais memorizáveis são armazenados em registradores e possuem um sentido de propagação do sinal. Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 25 Agora que já sabemos como criar um módulo, como descrever seus portos de entrada e de saída, e como descrever como o circuito deve responder – fizemos isso no nível de portas lógicas – vamos mostrar como descrever o que o módulo faz por meio da descrição do comportamento dos sinais (behavioral level). Para isso, vamos introduzir novos conceitos de Verilog e usaremos a figura seguinte para isso. Note que na apostila (e nos códigos das práticas) escolhemos usar o estilo de definição de ports do Verilog- 2001 por ser menos “verborrágico” – o texto fica menor. O leitor deve se lembrar que outros códigos Verilog podem apresentar o texto na formatação antiga, ou mesmo o leitor pode optar por usá-lo. Os circuitos combinacionais, como o que foi feito até o momento, geram uma saída assim que as entradas se alteram (descontados atrasos internos). Já os circuitos com memória terém o estado do sinal até que um evento (geralmente chamado clock) force o circuito a mudar sua saída. Essa classe de circuitos é chamada lógica sequencial, e é importante em eletrônica digital porque permitem que os circuitos sejam descritos em função de seu comportamento no tempo. No curso de ED esse tipo de circuito é descrito na segunda parte do curso. O bloco que é sinônimo de lógica sequencial em Verilog é o bloco de construção iniciado com a palavra-chave always, por isso conhecido como always Block. O código a seguir mostra a construção de um circuito chamado registrador (latch) que memoriza um valor de 8 bits. O leitor não precisa se preocupar em entender como o latch faz isso, apenas procure entender a função do always block, porque o funcionamento de registradores será ensinado posteriormente, e vamos executar algumas práticas nesse sentido. Fig.23 – exemplo de uso do bloco always – construindo um registrador. Neste trecho de código temos várias novidades, vamos nos ater a elas. Onome do módulo é Registrador e os portos do módulo são 3 sinais de entrada de controle (clk, reset, ena); um conjunto de fios (um vetor) por onde entra um byte no módulo (vetor D de 8-bits: D7...D0), e finalmente um conjunto de fios por onde saem os sinais memorizados no módulo (vetor de saída Q de 8-bits Q7...Q0). Este vetor é diferente porque em sua declaração tem a palavra-chave reg, determinando que esse tipo de sinal é um sinal que exibe um circuito flip-flop, que memoriza o sinal digital. Não é necessário (se usar não causa erro) usar a palavra wire nos portos do tipo wire porque o compilador assume por default. Contudo, todos os portos memorizáveis precisam ser declarados com reg, da forma como está na linha 14 da Fig. 23. Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 26 Até aqui não há muita novidade porque o leitor já viu a declaração de ports anteriormente, e não precisa se preocupar com o fato de não saber ainda o que é um flip-flop – ele será explicado a seu tempo. Vamos continuar a descrição do módulo porque o objetivo é entender sua forma de construção. A palavra-chave always (linha 17 Fig.23) define um bloco funcional que começa a ser descrito na linha 18, com a palavra-chabe begin, e este bloco termina na linha 29, com a palavra-chave end. Entre essas duas linhas o projetista descreve o comportamento do circuito. Note que há uma palavra begin na linha 21 e um end na linha 23, assim como há um begin na linha 26 e um end na linha 28. Begin marca o começo de um conjunto (ou bloco) de comandos ou atribuições e end determina o final desse bloco. Assim, o par da linha 21 a 23 marca um bloco e o par das linhas 26 a 28 marcam outro bloco. Eles estão “aninhados” (nested) dentro de um begin-end maior, do bloco always, que começa na linha 18 e termina na 29. Se o número de begin-end não corresponder, ou seja, se para cada begin não houver um end, o compilador indicará erro. Seguido à palavra always (linha 17 Fig.23) vemos “@(posedge clk)”, que se lê: at positive edge of clk. Todo bloco always tem uma lista de eventos que o disparam. No caso descrito na linha 17 Fig.23 o evento que dispara o bloco always é uma subida (posedge) do sinal clk. Se o projetista desejar a descida do sinal clk, deve usar a palavra-chave negedge em vez de posedge; escrito: “@(negedge clk)”. Em qualquer dos casos significa que o bloco always só será executado quando ocorrer o evento descrito neste complemento. Se mais de um evento deve disparar o bloco always, este evento deve estar listado dentro do parêntesis. Nesse caso, usa-se um operador lógico: “@(posedge clk or negedge reset)”. Neste exemplo, eventos em dois sinais disparam o bloco always: quando ocorrer uma subida do sinal clk ou quando ocorrer uma descida do sinal reset. Em outras palavras, no caso do exemplo da Fig. 23, o circuito lógico que está descrito a partir do begin da linha 18, até o end na linha 29, será “atualizado” toda vez que ocorrer uma subida do sinal clk. Então, o que vemos dentro desses limites é uma estrutura if - then - else, como a já conhecida da linguagem “C”. Mas, atente para o fato de você descrever um circuito eletrônico em Verilog, e não um software. Aprendemos em computação que um IF {condição} THEN {comando 1} ELSE {comando 2} é executado assim: a CPU testa a condição e se ela for verdadeira ela executa o conjunto/sequência {comando 1}, caso contrário, a CPU executa o conjunto/sequência {comando 2}. Porém, não temos uma CPU no circuito digital que estamos descrevendo, a descrição não é um programa de computador. O que ocorre é que o compilador de Verilog transforma a estrutura if - then - else em um circuito físico (sintetizável). Como isso é feito será detalhado durante o curso de Eletrônica Digital. Não se preocupe se você ainda não sabe como funciona o MUX, você aprenderá durante o curso; apenas entenda o exemplo para se ter uma ideia do que ocorre e como o compilador pode criar o circuito if - then - else: Fig.24 – exemplo de uma possível forma de síntese da estrutura IF em um MUX No MUX, a variável a controla a seleção entre I0 ou I1. O sinal que entra em I0 saírá em Y quando a=0, e o sinal de I1 saírá em Y quando a=1. Este MUX pode ser usado para sintetizar a linha de código: if (a==1) assign Y = I1; else assign Y = I0; Apostila: Dispositivos Lógicos Programáveis e Verilog - Prof. João Ranhel 27 O que o compilador faz é conectar o sinal que chamamos “a” no fio de seleção do MUX, e os fios que chamamos I0 e I1 nas entradas do MUX. A saída do circuito será o sinal Y. O que fizemos ao escrever a linha de código no Verilog foi transformar uma semântica humana (uma estrutura lógica se isso faça isso, senão, faça aquilo) em um formato que o Verilog transforma num circuito eletrônico. O compilador faz esse papel, desde que a estrutura if - then - else seja escrita corretamente. Note que foi escrito uma linha de comando e os marcadores de bloco begin e end não foram escritos. Quando se tem apenas um comando ou atribuição entre o if e o else não é necessário usar os marcadores begin e end . Voltando ao circuito descrito na Fig.23, vimos que a cada subida de clk o if será executado; então, se o reset estiver em zero, a condição (!reset) é verdade (=1) e o circuito executa a porção IF (linhas 21 a 23) . Por outro lado, se reset estiver em nível lógico ‘1’ a inversão de reset (!reset) transforma a condição em falsa. Isso quer dizer que a porção else será executada (linas 26 a 28). A porção if se reduz à linha 22 ( Q <= 8’b0; ) que traduzindo quer dizer: cada bit do registrador Q memoriza nível lógico ‘0’, ou seja o registrador inteiro será zerado. Portanto, 𝒓𝒆𝒔𝒆𝒕̅̅ ̅̅ ̅̅ ̅̅ faz com que o registrador seja zerado. O operador <= será explicado em práticas futuras, mas para adiantar, ele é usado nas atribuições que criam memorização nos registradores. Na sequência, se reset=1 então a porção else será executada: e ela testa se o sinal ena é verdadeiro (ou seja, se ena=1). Se a condição for falsa (se ena=0), o circuito executará nada – tudo entre o if e o else (linha 20 à 28 /fig. 23) será ignorado por não gerar nenhuma condição verdadeira (reset=1 e ena=0). Contudo, se a condição for verdadeira (ena=1) então a porção else se reduz à linha 27 ( Q <= D; ) que traduzindo quer dizer: cada bit do vetor D será copiado no respectivo bit do vetor/registrador Q; ou seja, o registrador Q memorizará o conteúdo do vetor de entrada D. Note que Verilog sabe que deve copiar D0 em Q0, D1 em Q1 e assim por diante até D7 em Q7. Esperto isso não?! Resumindo o que o bloco always faz: a cada subida do clk ele testa se reset=0. Se for, o registrador Q será zerado. Se reset não for zero, o circuito testa o sinal ena, se ena=1 o circuito copia o dado D (D0...D7) da entrada do módulo para o registrador Q (A0...Q7) que é também uma saída do módulo. Porém, se ena=0 e reset=1 o bloco always faz nada. Isso se repete toda vez que o clk subir! O que temos de direfente no módulo Registrador em relação ao módulo Simples_IN_OUT é que o módulo Registrador foi descrito por meio do comportamento que desejamos do circuito, em vez de descrever como as portas lógicas são conectadas, que foi como feito no Simples_IN_OUT. Isto é o básico que alguém precisa saber para começar a lidar com Verilog. Todos esses passos serão repetidos durante o curso, nas aulas prática. Não vamos nos atentar demasiado para nuances da linguagem e da sintaxe. Vamos apenas descrever circuitos que serão sintetizados para o kit FPGA para guardarmos os conceitos teóricos ensinados em sala de aula. A seguir descrevemos o básico das placas e kits com os quais vamos fazer as práticas para nos familiarizarmos com os recursos (chaves, botões, LEDs, Displays, etc.) que a placa ou o kit contém, em que pinos do FPGA esses fios/sinais estão fisicamente conectados, e qual os CIs
Compartilhar