Baixe o app para aproveitar ainda mais
Prévia do material em texto
LÓGICA PROGRAMÁVEL AULA 5 Prof. Ederson Cichaczewski 2 CONVERSA INICIAL Nesta aula, abordaremos memória ROM, memória RAM, arquivos, geração de estímulos e testes em VHDL. A VHDL permite implementar, além de diversos circuitos digitais, elementos de armazenamento, e também acessar arquivos. Para a verificação da operação de um projeto é necessário realizar testes. Em VHDL é possível gerar formas de onda para estimular uma entidade e analisar os resultados. TEMA 1 – MEMÓRIA ROM EM VHDL É uma memória apenas de leitura. Portanto, não possui pino de habilitação de escrita. Pode ter um pino de habilitação do dado na saída. Os dados armazenados na memória ROM em VHDL são definidos em sua inicialização em um vetor. Possui um barramento de entrada de endereços e um outro de saída de dados. 1.1 Exemplo prático: memória ROM 16x8 Veja um exemplo de memória ROM com barramento de endereços de 4 bits e barramento de dados de 8 bits: Figura 1 ‒ Diagrama de uma memória ROM 16x8 A entrada "ce" (chip enable) habilita a saída de dados quando está em nível lógico baixo (0), ou deixa a saída em alta impedância (Z) quando está em nível lógico alto (1). A operação do ciclo de leitura é apresentada a seguir. 3 Figura 2 ‒ Diagrama de tempo da operação de leitura da memória ROM 16x8 A descrição VHDL da memória ROM de 8 bits de dados e 16 endereços (barramento de 4 bits de endereços), usando vetor, é apresentada a seguir. Figura 3 ‒ Exemplo de descrição de memória ROM 16x8 A organização da memória é estabelecida na linha 12, na declaração do tipo “arranjo_memoria”; o número de bits de dados é fixado em 8. O número de endereços é definido pela constante “dados” na linha 13, com 16 elementos. Como a posição do vetor é dada por um tipo inteiro ("NATURAL"), é necessário converter o tipo "UNSIGNED" do sinal “endereco” para "INTEGER", por meio da função “to_integer”. TEMA 2 – MEMÓRIA RAM EM VHDL É uma memória de escrita e leitura, e na descrição é baseada em vetor. Possui barramentos de dados separados para entrada e saída, além de um pino que identifica a operação como sendo de escrita ou de leitura. Também possui um pino de habilitação de escrita que opera por borda como uma entrada de clock. 4 2.1 Exemplo prático: memória RAM 8x4 Veja a seguir um exemplo de memória RAM com barramento de endereços de 3 bits e barramento de dados de 4 bits. Figura 4 ‒ Exemplo de diagrama de uma memória RAM 8x4 A entrada "we" identifica se a operação é de leitura ou de escrita. A entrada "ce" (chip enable) habilita a escrita na memória quando está em nível lógico baixo (0). A saída está sempre habilitada. A operação dos ciclos de escrita e de leitura é apresentada a seguir. Figura 5 ‒ Diagrama de tempo das operações de escrita e de leitura da memória RAM 8x4 A escrita de um dado na memória ocorre na borda de subida do sinal "ce" com "we=0". A descrição VHDL da memória ROM de 4 bits de dados e 8 endereços usando vetor é apresentada a seguir. 5 Figura 6 ‒ Descrição da memória RAM 8x4 com barramentos de entrada e saída separados A organização da memória é estabelecida na linha 13, na declaração do tipo “arranjo_memoria”, e o número de bits de dados e de endereços são fixos. O sinal “memoria” é o objeto que contém as informações da memória. Como a posição do vetor é dada por um tipo inteiro, é necessário converter o tipo "UNSIGNED" do sinal “endereco” para "INTEGER", por meio da função “to_integer”. 2.2 RAM com barramento de dados bidirecional O mesmo barramento é utilizado para escrever ou ler dados da memória. 2.2 Exemplo prático: memória RAM 16x8 bidirecional Figura 7 ‒ Exemplo de diagrama de uma memória RAM com barramento de dados bidirecional 6 A descrição VHDL da RAM 16x8 bidirecional é apresentada a seguir. Figura 8 ‒ Descrição de uma memória RAM 16x8 com barramento de dados bidirecional A operação dos ciclos de escrita e leitura é apresentada a seguir. Figura 9 ‒ Diagrama de tempo das operações de escrita e leitura da memória RAM 16x8 com barramento de dados bidirecional Quando "wr_ena=1", a escrita está habilitada. O dado é armazenado na borda de subida de "clk". Quando "wr_ena=0", nenhuma mudança ocorre nos dados armazenados. 7 TEMA 3 – ARQUIVOS EM VHDL Os arquivos em VHDL permitem a troca de dados entre uma entidade e o mundo exterior. As operações com arquivos não são sintetizáveis; elas servem apenas para teste e validação de entidades, como uma opção de origem para estímulos a serem aplicados em uma simulação. O tipo "arquivo" é usado para a declaração de objetos. A leitura e a escrita em objetos são feitas por meio de procedimentos. Os valores são lidos ou armazenados de modo sequencial, identificando- se o final do arquivo por uma marca. 3.1 Exemplo: declaração de um tipo “arquivo” A seguir são apresentados exemplos da descrição de declaração de um tipo "arquivo". Figura 10 ‒ Exemplos de declaração de um tipo "arquivo" Um objeto do tipo “arquivos_de_tipo_x” representa um arquivo contendo elementos da categoria “tipo_contido”. 3.2 Arquivos binários Considerando a versão VHDL 1993, a abertura do arquivo ocorre na declaração de um objeto do tipo "arquivo" ("FILE"). Declaração: modo: “IN” para arquivo de leitura e “OUT” para arquivo de escrita; operação: “OPEN” explicita a abertura de arquivo. A seguir são apresentados exemplos de códigos para leitura e escrita em arquivo binário. 8 Figura 11 ‒ Exemplos de descrição VHDL de arquivos para leitura e escrita Não se esqueça também de que operações implícitas são subprogramas implicitamente declarados após uma declaração de um tipo "arquivo". A seguir são apresentados exemplos de códigos das operações implícitas para arquivos. Figura 12 ‒ Operações implícitas para arquivos em VHDL São valores para o campo “modo” do procedimento "FILE_OPEN": "READ_MODE", "WRITE_MODE", "APPEND_MODE". Os valores retornados pelo campo “status” do procedimento "FILE_OPEN" são: "OPEN_OK", "STATUS_ERROR", "NAME_ERROR", "MODE_ERROR". O arquivo pode ser fechado de duas formas: após o término da simulação ou por meio do procedimento "FILE_CLOSE". 3.3 Exemplo prático: abertura de arquivo binário para escrita Veja na figura a seguir um exemplo de descrição para abertura de arquivo binário para escrita sendo fechado após o término da simulação. 9 Figura 13 ‒ Exemplo de descrição VHDL da abertura de arquivo binário para escrita 3.4 Arquivos de texto (pacote TEXTIO) Esses arquivos podem ser manipulados por um editor de texto, e permitem uma interpretação direta das informações. Arquivos no formato "texto" possibilitam a troca de informações entre aplicativos de diferentes fornecedores. São de maior tamanho e execução mais lenta em relação aos arquivos binários. Além disso, são compostos por linhas com uma sequência de caracteres. Cada linha tem ao seu final um caractere de retorno de carro. Para tornar o pacote visível à entidade, é necessário incluir a cláusula “USE STD.TEXTIO.ALL”. Os tipos definidos no pacote TEXTIO são apresentados a seguir. Figura 14 ‒ Tipos de dados do pacote TEXTIO O tipo “LINE” é um ponteiro para um valor do tipo “STRING”. As operações de escrita e de leitura de dados em arquivos são executadas com objetos definidos segundo esse tipo. O tipo “TEXT” é um tipo de arquivo composto por elementos do tipo “STRING”. Objetos do tipo “LINE” são empregados nas operações com arquivos no formato "texto". As operações de leitura e de escrita de dados são executadas em duas etapas. Para o armazenamento de uma informação em um arquivo, 10 deve-se primeiro transferir um ou mais dados para um objeto do tipo “LINE”. Uma vez transferidosos valores, o conteúdo do objeto tipo “LINE” é armazenado no arquivo. De maneira semelhante, na operação de leitura os valores são transferidos para um objeto do tipo “LINE”, e posteriormente os dados são extraid́os do objeto. O tipo “SIDE” é empregado nos procedimentos de escrita para definir a justificação dos dados no campo de escrita. O valor “RIGHT” indica que o valor está alinhado pelo lado direito do campo, e o valor “LEFT”, pelo lado esquerdo. O subtipo “WIDTH” é utilizado para especificar o tamanho do campo empregado na escrita de um dado. Os procedimentos de escrita e leitura são apresentados a seguir. Figura 15 ‒ Descrição VHDL dos procedimentos de escrita e de leitura em arquivo "texto" Os identificadores “linha_wr” e “linha_rd” são objetos do tipo "LINE". O procedimento “WRITE” insere o valor de “dado” no objeto “linha_wr”. O procedimento “WRITELINE” escreve a informação contida no objeto “linha_wr” no arquivo. O procedimento “READLINE” executa a leitura em arquivo e retorna com a informação no objeto “linha_rd”. O procedimento “READ” extrai um dos valores presentes no objeto “linha_rd”, e retorna com o valor em “dado”. Um objeto tipo “LINE” pode conter vários valores, pois esse tipo é um ponteiro para um valor “STRING”. A cada chamada do procedimento “WRITE”, um novo dado é inserido no objeto tipo “LINE”, e o ponteiro é movido para uma nova posição. A chamada do procedimento “WRITELINE” causa o retorno do ponteiro à posição inicial, e os valores contidos no objeto tipo “LINE” são perdidos. De modo semelhante, a cada chamada do procedimento “READ”, um dado é removido do objeto tipo “LINE”, e o ponteiro é deslocado. Os procedimentos “READ” e “WRITE” definidos no pacote “TEXTIO” sobrecarregam os procedimentos de mesmo nome definidos na linguagem para arquivos binários. Esses procedimentos do pacote “TEXTIO” são 11 invocados quando um objeto do tipo “LINE” é empregado no campo identificado por “linha_wr” ou “linha_rd”. Em ambos os procedimentos, “dado” pode ser do tipo “BIT”, “BIT_VECTOR”, “BOOLEAN”, “CHARACTER”, “INTEGER”, “REAL”, “STRING” e “TIME”. Um exemplo de descrição VHDL com operações de escrita e de leitura em um arquivo "texto" é apresentado a seguir. Figura 16 ‒ Exemplo de descrição VHDL de operações de escrita e de leitura em arquivo "texto" Esse código executa a escrita de uma linha contendo os caracteres de “a” a “z” em um arquivo. Após o armazenamento, o arquivo é fechado; posteriormente ele é aberto novamente no modo de leitura para recuperação da informação armazenada. Para leitura da informação no arquivo, o procedimento “READLINE” é executado uma única vez, sem teste de final de arquivo. Os valores recuperados são extraídos um a um por meio de um laço. A construção “WAIT FOR” foi incluid́a para permitir a visualização dos resultados no sinal “dado”. TEMA 4 – GERAÇÃO DE ESTÍMULOS EM VHDL Para testar um projeto em descrição VHDL é possível aplicar ao sistema sob teste uma série de estímulos e verificar o resultado. 12 Pode-se criar uma entidade específica que execute as operações de teste por meio da geração de estímulos. Os estímulos permitem detectar inconsistências de projeto na fase de simulação. O ponto de partida é a geração de estímulos que simulem as condições de entrada da descrição sob teste. Isso é possível por meio da ferramenta de simulação. Uma abordagem que torna o teste independente da ferramenta de simulação é gerar as formas de onda necessárias por meio de uma descrição e sintetizá-las. 4.1 Sinais aleatórios É possível gerar sinais em região de código concorrente por meio da cláusula "AFTER" e em região de código sequencial, por meio do comando "WAIT", conforme a descrição a seguir. Figura 17 ‒ Exemplo de descrição VHDL para geração de sinal aleatório As duas construções sintetizam a mesma forma de onda, conforme vemos a seguir. 13 Figura 18 ‒ Diagrama de tempo do sinal aleatório gerado No caso da atribuição de sinal que emprega a cláusula “AFTER”, são indicados os valores e os correspondentes atrasos na transferência dos valores para o sinal. No caso da construção que emprega “WAIT”, os intervalos de tempo são acumulados por cada comando, e a transferência do valor para o sinal ocorre na execução do comando “WAIT”. Na primeira atividade do processo “abc”, o valor “01” é agendado para ser transferido para “s1” na próxima iteração dos comandos concorrentes. Isso ocorre em “t=0 ns”, na construção “WAIT FOR 20 ns”, e o processo é suspenso por 20 ns. No instante “t=20 ns”, o valor “11” é agendado para ser transferido para “s1”, e na execução da construção “WAIT FOR 50 ns”, o valor é transferido. De modo semelhante, ocorrem as outras transferências de valores. 4.2 Sinais periódicos Um problema muito frequente em operações de teste é a geração de sinais periódicos no controle de circuitos sińcronos, como registradores, contadores, máquinas de estado etc. Abordagens utilizam regiões de código concorrente ou sequencial para a geração de sinais periódicos, sempre empregando a cláusula "AFTER". A descrição VHDL para a geração de um sinal periódico é apresentada a seguir. 14 Figura 19 ‒ Descrição VHDL de um sinal periódico As formas de onda periódicas geradas são apresentadas a seguir. Figura 20 ‒ Diagrama de tempo com os sinais periódicos gerados Na forma de onda do sinal “s0”, o intervalo de tempo em nível alto é igual ao intervalo de tempo em nível baixo, e o período é definido pelo genérico “t_ck”. A forma de onda dos sinais “s1”, “s2” e “s3” não é simétrica. No caso dos sinais “s1” e “s2”, os intervalos de tempo são definidos pelos genéricos “t_alto” e “t_baixo”. A forma de onda do sinal “s3” é gerada pelo deslocamento do sinal “dado”, que contém o padrão de valores que “s3” pode assumir. A cada intervalo de tempo definido pelo genérico “t_rol”, a informação armazenada em “dado” sofre uma rotação, e o valor do elemento de posição mais à esquerda do vetor é transferido para “s3”. Essa técnica é muito útil para a geração de padrões complexos de forma periódica. 15 TEMA 5 – TESTES EM VHDL A execução do teste de uma descrição pode empregar diferentes métodos, e a escolha da abordagem mais adequada deve considerar aspectos como: facilidade de elaboração; compatibilidade entre ferramentas de diferentes fornecedores; tempo de execução; necessidade de armazenar resultados etc. O uso dos recursos da linguagem de descrição de hardware é uma maneira eficiente de realizar testes em uma entidade de projeto. 5.1 Teste usando constantes para geração de estímulos É uma maneira simples de realizar um teste. Os valores são armazenados em uma ou mais constantes do tipo vetor. Um processo controlado por comandos “WAIT” realiza a aplicação dos estímulos nos instantes desejados. É necessário recompilar a descrição a cada alteração de estímulos. 5.2 Exemplo prático: teste de um registrador tipo "D" O diagrama de blocos do teste de um registrador tipo "D" com inicialização assíncrona é apresentado a seguir. Figura 21 ‒ Diagrama de blocos do teste de um registrador tipo "D" A descrição VHDL do teste do registrador tipo "D" é apresentada a seguir. 16 Figura 22 ‒ Descrição VHDL do teste do registrador tipo "D" A entidade sob teste é um registrador tipo "D" de 4 bits com inicialização assíncrona. Sua descrição VHDL é apresentada a seguir. Figura 23 ‒ Descrição VHDL da entidade sob teste: um registrador de 4 bits A sequência de estímulos para o teste é apresentada a seguir. 17 Figura 24 ‒ Diagrama de tempo da sequência de estímulos para teste do registrador Doze estiḿulos de teste são propostos na constante “vetores”.Essa constante é um vetor composto de elementos do tipo “RECORD”, em que cada elemento contém os estiḿulos que devem ser aplicados e o resultado esperado. A aplicação dos estiḿulos é definida pelo laço entre as linhas 25 e 31, que percorre todos os elementos do vetor. A cadência da aplicação é definida pelo comando “WAIT” no interior do laço. Note que ele foi inserido para permitir a observação das formas de onda na simulação; poderia ser removido se a visualização não fosse necessária. A operação de teste proposta na descrição verifica a ocorrência de erros. O comando “ASSERT” verifica se os valores obtidos, “q”, e os valores corretos, “q_td”, são iguais. Se há discordância entre os valores é gerada uma mensagem de erro. Uma mensagem do erro introduzido no 11o estímulo, para verificação da condição de falha, é enviada à janela do simulador, conforme vemos a seguir. Figura 25 ‒ Mensagem do erro induzido no teste FINALIZANDO Nesta aula, vimos o projeto em VHDL de uma memória ROM, uma memória RAM, arquivos, geração de estímulos e testes. A compreensão do conteúdo desta aula é fundamental para que possamos dar continuidade do conteúdo da disciplina. 18 REFERÊNCIAS D’AMORE, R. VHDL: descrição e síntese de circuitos digitais. 2. ed. Rio de Janeiro: LTC, 2012. cap. 12, 13 e 15. PEDRONI, V. A. Eletrônica digital moderna e VHDL. Rio de Janeiro: Elsevier, 2010. cap. 9.
Compartilhar