Baixe o app para aproveitar ainda mais
Prévia do material em texto
LÓGICA PROGRAMÁVEL AULA 3 Prof. Ederson Cichaczewski 2 CONVERSA INICIAL Nesta aula, abordaremos o papel do VHDL em componentes e circuitos, configurações, registradores, máquinas de estados, e, por fim, a descrição VHDL a partir de um algoritmo. Na linguagem VHDL é importante organizar os projetos hierarquicamente, por meio de componentes e pacotes, assim como estabelecer uma relação entre eles por meio de configurações. Iniciando-se por aplicações, os registradores são elementos de memória que são a base para máquinas de estados, circuitos síncronos ou assíncronos que operam por construções com comandos sequenciais. Descrição de hardware não é algoritmo, mas é possível estabelecer uma relação entre ambos que permita a conversão de um pseudocódigo em VHDL. TEMA 1 – COMPONENTES E PACOTES EM VHDL Um componente é uma entidade de projeto empregada na arquitetura de outra entidade. Lembre-se de que é possível criar um projeto hierárquico; é como interligar vários componentes em um diagrama esquemático. Para isso, usa-se a palavra reservada COMPONENT. A instanciação de um componente é um comando concorrente, e a declaração de um componente é semelhante à de uma entidade. Figura 1 ‒ Estrutura da declaração de um componente A declaração pode ser inserida no corpo da arquitetura ou em pacotes. Para instanciar/chamar um componente é necessário: atribuir-lhe um rótulo (label) seguido do nome do componente; definir as conexões entre os sinais do componente e os sinais da entidade que instanciou o componente com a palavra reservada PORT MAP. 3 Figura 2 ‒ Formas de chamada de um componente Por exemplo: a arquitetura “final” da entidade “topo” solicita dois componentes com rótulos “u1” e “u2”. No mapa de portas de “u1” é estabelecida a conexão entre os sinais “k1”, “k2” e “j1” e as portas “x”, “y” e “z” do componente “soma”. De modo semelhante, é estabelecida a interligação entre “j1”, “j2”, “js” e “jr” e as portas “a”, “b”, “s” e “o” do componente “alu”. Note que o sinal “j1” define a ligação entre as portas “z” e “a” por meio das solicitações de componentes “u1” e “u2”. Os nomes dos componentes declarados são idênticos aos nomes das entidades associadas aos componentes. O mesmo se aplica aos nomes das portas. Essa é a maneira mais simples de se estabelecer um elo de correspondência entre uma entidade e uma declaração de componente. Figura 3 ‒ Exemplo de elo entre componente e entidade 1.1 Pacotes Permitem reunir declarações de constantes, tipos, sinais, subprogramas e componentes. Diferentes unidades de projetos (design units) podem compartilhar essas declarações. Os pacotes ficam associados a uma biblioteca, e sua estrutura é composta de duas partes: 4 1. declaração; 2. corpo (opcional). Figura 4 ‒ Estrutura da declaração e do corpo de um pacote O pacote pode ser compilado e usado por meio da cláusula USE. Para isso, especifica-se a biblioteca, o nome do pacote e, se desejar, o item do pacote. Caso queira deixar todos os itens visíveis, use a palavra reservada ALL. Figura 5 ‒ Formas de referenciar o item de um pacote TEMA 2 – CONFIGURAÇÕES EM VHDL A configuração estabelece o elo entre a declaração de um componente e uma entidade de projeto. É possível especificar uma entidade com várias arquiteturas; nesse caso, o elo é estabelecido com a última arquitetura compilada. Figura 6 ‒ Elo natural entre o nome da entidade de projeto e o rótulo do componente 5 Pode ser necessário fazer uma alteração das associações entre componentes e entidades, sem recompilar as entidades. Os mecanismos para atender esses requisitos são: especificação da configuração; declaração da configuração. 2.1 Especificação da configuração A configuração define o elo entre uma solicitação de componente e uma entidade de projeto, e está inserida na região de declaração de uma arquitetura que solicita os componentes. Figura 7 ‒ Elo definido por meio de uma especificação Figura 8 ‒ Formas de especificação da configuração A especificação da configuração do componente contém uma lista de rótulos seguidos do nome do componente e da indicação do elo. 6 A indicação do elo associa o componente a uma entidade, identificando sua biblioteca. Ela inclusive permite especificar a arquitetura da entidade a ser usada. Também pode-se definir mapas de portas por meio da especificação da configuração. 2.2 Declaração da configuração Permite que a configuração seja realizada fora da arquitetura da entidade. A declaração da configuração é uma unidade de projeto (design unit). Figura 9 ‒ Unidades de projeto em VHDL A declaração da configuração deve ser compilada. Ela está no nível mais alto da hierarquia do projeto. A simulação é executada a partir de sua unidade de projeto. Pode-se alterar a configuração do projeto sem recompilar as unidades dependentes da configuração. Figura 10 ‒ Elo definido por meio da declaração da configuração 7 A declaração contém dois nomes: o primeiro identifica a configuração; o segundo identifica a entidade de projeto a que a configuração se aplica. Podem ser inseridas configurações de bloco e cláusulas USE. A configuração de bloco inicia-se com a palavra reservada FOR. Figura 11 ‒ Formas de declaração de configuração Figura 12 ‒ Formas de configuração de bloco Figura 13 ‒ Exemplos de configuração de componente TEMA 3 – REGISTRADORES EM VHDL O registrador é um elemento de memória que pode ser sensível a: 8 nível: caso dos latches, em que a condição de memorização corresponde a um determinado nível lógico do sinal de controle (pino de enable); borda: caso dos flip-flops, em que a condição de memorização corresponde à transição de um nível lógico para outro do sinal de clock. Figura 14 ‒ Operação de um latch Figura 15 ‒ Operação de um flip-flop Uma transição de sinal pode ser detectada por meio dos atributos EVENT ou STABLE. Figura 16 ‒ Exemplos de testes de ocorrência de bordas de subida e descida São operações de inicialização do registrador: set: leva a saída para o nível lógico alto; reset: leva a saída para nível lógico baixo. As operações de inicialização set e reset podem ser síncronas com o sinal de clock ou assíncronas. 9 Figura 17 ‒ Exemplo de operação de inicialização síncrona em flip-flops Figura 18 ‒ Exemplo de operação de inicialização assíncrona em flip-flops Na implementação de um registrador em VHDL, a palavra-chave é PROCESS. 3.1 Registrador sensível a nível: latch em VHDL Leia a seguir um exemplo de descrição de um registrador de três bits sensível a nível com inicialização assíncrona: o sinal “en” controla o armazenamento da informação presente no sinal “d”; “en” no nível lógico baixo mantém a informação, e “en” no nível lógico alto faz com que o sinal “q” siga a entrada “d”. O sinal “rst” estabelece a operação de reset, e o sinal “set”, a operação de set. A construção do tipo “IF ELSE” verifica as condições set, reset e habilitação. Como ocorre com “en”, “rst” e “set”, bem como no sinal “d” ‒ a lista de sensibilidade do processo deve conter todos esses sinais ‒, qualquer alteração nos sinais de controle deve sempre ser avaliada. A saída é atualizada com o valor de entrada apenas quando en = 1. 10 Figura 19 ‒ Exemplo de uma descrição para um registrador sensível a nível 3.2 Registrador sensível a borda: flip-flop em VHDL com inicialização síncrona Exemplo de um registrador com três bits sensível à borda de subida do terminal de controle. As operações de set e reset são síncronas. A descrição emprega duas construções do tipo “IF ELSE”: a primeira detecta a condição do sinal de controle, e a segundatesta sucessivamente as condições para se realizar operações de set, reset ou armazenamento. Como a segunda construção somente é executada na ocorrência de uma borda de subida do sinal de relógio, as operações de set, reset e armazenamento ficam condicionadas ao sinal de relógio, caracterizando o sincronismo com esse sinal. O código “ck'EVENT AND ck = ‘1’ identifica uma borda de subida. Figura 20 ‒ Exemplo de descrição para um registrador sensível a borda com inicialização síncrona 11 3.3 Registrador sensível a borda: flip-flop em VHDL com inicialização assíncrona Exemplo de um registrador, com três bits, sensível à borda de subida do sinal de relógio. As operações para inicialização definidas pelos sinais “set” e “rst” são independentes do sinal de relógio “ck”. A descrição emprega uma construção do tipo “IF ELSE” para testar sucessivamente as condições set, reset e borda de subida do sinal de relógio. Como os eventos nos sinais não estão mais condicionados ao sinal “ck”, eles devem ser inseridos na lista de sensibilidade do processo. Nesse exemplo, devido à característica da construção “IF ELSE”, a operação reset tem precedência sobre a operação set, e esta tem precedência sobre a operação de armazenamento. Apenas a atualização da saída depende do sinal de clock. Figura 21 ‒ Exemplo de descrição para um registrador sensível a borda com inicialização assíncrona 12 Síntese do código VHDL: a síntese do circuito gera um esquemático em nível RTL. Figura 22 ‒ Flip-flop com inicialização assíncrona, nível RTL TEMA 4 – MÁQUINAS DE ESTADOS EM VHDL A máquina de estados é um circuito sequencial que transita em uma sequência finita de estados. A transição entre estados é comandada por um sinal de controle (clock). O estado atual é definido por um elemento de memória; o estado futuro é determinado com base no estado atual e na condição das entradas. 13 4.1 Estilos de máquinas de estados A operação das máquinas de estados é descrita por um diagrama de transição de estados, sendo cada estado representado por um nó e pelas transições (de subida ou descida do clock), por arcos com setas. 4.1.1 Máquina de Mealy O valor da saída depende exclusivamente do estado atual e das condições das entradas. No diagrama de estados, o valor da saída é incluído no arco. A seguir, veja um exemplo de operação com mudança de estado na borda de subida do sinal de controle (clock). Figura 23 ‒ Exemplo de um diagrama de blocos de uma máquina de Mealy Figura 24 ‒ Exemplo de diagrama de estados e de diagrama de tempo da máquina de Mealy 14 4.1.2 Máquina de Moore O valor da saída depende exclusivamente do estado atual. No diagrama de estados, o valor da saída é indicado no nó. A seguir, veja um exemplo de operação com mudança de estado na borda de subida do sinal de controle (clock). Figura 25 ‒ Exemplo de um diagrama de blocos de uma máquina de Moore Figura 26 ‒ Exemplo de diagrama de estados e diagrama de tempo da máquina de Moore 4.1.3 Exemplo prático: máquina de Moore com quatro estados A máquina de Moore com quatro estados realiza uma contagem dada por: 00, 01, 11 e 10 (nessa ordem). Ela inclui uma entrada de inicialização assíncrona chamada “rst”. O valor que representa o estado atual corresponde ao valor das saídas. 15 Figura 27 ‒ Diagrama de transição de estados da máquina de Moore de quatro estados Figura 28 ‒ Diagrama de blocos da máquina de Moore de quatro estados O código VHDL, sendo um circuito sequencial, necessita do recurso PROCESS. Os estados não são necessariamente valores, então podem ser definidos como tipos enumerados com TYPE. Os sinais de inicialização assíncrona devem estar na lista de sensibilidade do PROCESS. CASE/WHEN: define a transição de estados. IF/ELSE: controla a transição de estados. 16 Figura 29 ‒ Código VHDL da máquina de Moore de estados finitos O padrão de contagem não é necessariamente uma sequência. Uma máquina de estado controla eventos. A síntese gera um conjunto de flip-flops e também uma lógica combinacional. As saídas de uma máquina de Moore são síncronas ao clock. É necessário haver um ciclo de inicialização. As saídas de uma máquina de Mealy podem mudar assincronamente. TEMA 5 – DESCRIÇÃO A PARTIR DE UM ALGORITMO 5.1 Conversão de pseudocódigo em VHDL A linguagem VHDL não funciona exatamente como uma linguagem de programação baseada em algoritmos. São necessárias considerações com relação a: armazenamento de informações; controle das operações; tomadas de decisões; unidades funcionais empregadas. É importante considerar o diagrama de blocos do circuito, definindo seus elementos e suas interligações. 17 5.1.1 Exemplo prático: máximo divisor comum (MDC) Os aspectos da descrição a partir de um algoritmo serão abordados por meio de um exemplo de algoritmo descrito por pseudocódigo para determinação do máximo divisor comum (MDC). Figura 30 ‒ Pseudocódigo do algoritmo do MDC Uma primeira abordagem usando um alto nível de abstração pode levar à implementação de uma descrição, conforme vemos a seguir: Figura 31 ‒ Algoritmo do MDC convertido diretamente em VHDL 18 Contudo, ao compilar-se esse código são verificados problemas de síntese e, portanto, uma análise das operações envolvidas é necessária para possibilitar a sintetização do código. 1º passo Primeiro, é preciso prever quais serão os registradores “a” e “b”. A execução do algoritmo começa quando um nível alto é detectado na entrada “inicio” (linha 1 do pseudocódigo). O circuito de controle impõe um nível alto na saída “fim” (linha 2) e ativa os sinais de habilitação “h1” e “h2” para o armazenamento dos valores provenientes das entradas “a_en” e “b_en” (linhas 3 e 4). Assim, dois registradores, denominados “a” e “b”, devem ser previstos. Figura 32 ‒ Operações das linhas 1, 2, 3 e 4 do pseudocódigo 2º passo Depois, deve-se tomar uma decisão com um comparador. Com isso, é possível verificar a tomada de decisão com base nos valores atuais dos registradores “a” e “b”. Para tanto, um comparador é necessário. Figura 33 ‒ Operações da linha 5 do pseudocódigo 19 3º Passo Aqui, é preciso comparar e subtrair entre os registradores “a” e “b”. Se o valor do registrador “a” for maior do que o valor do registrador “b”, deve-se executar uma subtração entre esses valores. Desse modo, mais um circuito de comparação e um subtrator devem ser adicionados ao diagrama. Nessa linha é indicado, ainda, que o valor resultante da subtração entre “a” e “b” deve ser armazenado no registrador “a”. Assim, uma unidade de seleção dever ser inserida no diagrama de blocos, de modo a permitir que a entrada do registrador “a” receba o valor de “a_en” ou o valor de sua própria saída. Essa operação deve ocorrer em uma transição do sinal de relógio. Figura 34 ‒ Operações da linha 6 do pseudocódigo 20 4o e último passo As operações executadas na linha 7 do pseudocódigo levam a considerações semelhantes àquelas levantadas na análise da linha 6. Duas novas unidades devem ser previstas: um subtrator e um circuito de seleção. Nesse caso, a saída do novo subtrator, que contém o valor de “b” menos “a”, deve ser interligada com a entrada do registrador “b”. O circuito de controle repetirá a execução do conjunto de operações da linha 6 ou do conjunto da linha 7 do pseudocódigo enquanto a condição de teste da linha 5 for verdadeira. Uma vez atingida a condição, as linhas 9 e 10 deverão ser executadas: a saída “fim” deverá ser ativada e mais um registrador será necessário para o armazenamento do valor final presente na saída do registrador “a”. Figura 35 ‒ Diagrama final identificando os blocos da unidade de controle e da unidadeoperativa Um estudo com esse nível de detalhamento nem sempre é necessário, mas uma avaliação dos principais recursos da unidade operativa facilita a análise de possíveis opções de implementação. Por exemplo, um único subtrator com mais alguns circuitos de seleção poderiam realizar as operações das linhas 6 e 7 do pseudocódigo. A vantagem disso é a redução de recursos, considerando que um circuito de seleção é menos complexo que um subtrator; a desvantagem é a redução na frequência de operação do circuito, devido ao 21 maior tempo de propagação na unidade operativa ocasionado pela inclusão de circuitos de seleção. 5.1.2 Fluxograma No fluxograma, converte-se o pseudocódigo em forma gráfica para facilitar a descrição. Tem-se uma máquina com quatro estados. Inicialização assíncrona. Mudanças de estado na borda de subida. Figura 36 ‒ Fluxograma do algoritmo de MDC 5.1.3 Código VHDL O código completo da descrição da máquina do máximo divisor comum (MDC) é apresentado a seguir. Figura 37 ‒ Código VHDL final 22 Figura 38 ‒ Diagrama de tempo da simulação do circuito MDC FINALIZANDO Nesta aula, tivemos contato com o VHDL e seu funcionamento. A compreensão do conteúdo desta aula é fundamental para a continuidade do conteúdo da disciplina. 23 REFERÊNCIAS D’AMORE, R. VHDL: descrição e síntese de circuitos digitais. 2. ed. Rio de Janeiro: LTC, 2012. Capítulo 6, 7, 9, 14 e 16.
Compartilhar