TrabalhosGratuitos.com - Trabalhos, Monografias, Artigos, Exames, Resumos de livros, Dissertações
Pesquisar

Bacharelado em Engenharia de Controle e Automação

Por:   •  1/3/2023  •  Trabalho acadêmico  •  1.566 Palavras (7 Páginas)  •  78 Visualizações

Página 1 de 7

Instituto Federal de Educação, Ciência e Tecnologia de Goiás – IFG, Campus Itumbiara.[pic 1]

Bacharelado em Engenharia de Controle e Automação

 Prática 03

DESCRIÇÃO DE HARDWARE USANDO VHDL

Disciplina:

Eletrônica Digital 2

Prof. Dr. Bruno Gabriel Gustavo Leonardo Zambolini Vicente

Ewerton Albany Silva, 20211040070287

Data de Entrega: 07/12/2022

ITUMBIARA – GO

12/2022

  1. Objetivos

O objetivo desta prática é realizar o desenvolvimento de um hardware utilizando a linguagem de programação VHDL (VHSIC Hardware Description Language), que é específica para a descrição de hardware, em especial para projeto de circuitos digitais. O propósito é que seja construído uma unidade de cálculo lógica, Ucalc, composta por duas LUTs (LookUp Table) que realizam operações lógicas em dois pares de entradas de mesmo tamanho e resulte em um par de saídas referentes a cada par de entrada. A saída deverá ser dada tanto em número binário, quanto em número inteiro.

  1. Introdução teórica

Os FPGAs são conhecidos como um dos inventos mais complexos da humanidade e é o responsável pelo avanço significativo da tecnologia nos últimos anos. A sua complexidade se dá pelo fato de ser um circuito reconfigurável, ou seja, que pode se moldar a qualquer circuito por meio de uma linguagem de descrição de hardware. Isso facilita bastante a criação de ASICs (“Application Specific Integratec Circuit”), pois possibilita uma prototipação rápida de diversos módulos digitais. As aplicações se expandem até a ala aeroespacial e de defesa, onde os FPGAs podem ser utilizados como partes redundantes dos circuitos: a FPGA pode reconfigurar-se para atender uma parte do circuito danificada por eventos externos.

Dita essas vantagens, é de interesse que se compreenda o funcionamento básico de tais circuitos. Um dos principais componentes das FPGAs são as LUTs (LookUp Tables). Elas são blocos lógico pré-definidos que consistem em um número finito de portas lógicas e Flip-Flops. As LUTs ainda são implementadas conforme a tabela lógica que recebem, de onde se deriva o seu nome. O roteamento entre as LUTs é feito por blocos chaveadores e por blocos de conexão, tal como visto na figura 1, que são de fato um conjunto de transistores controlados para criar o caminho entre os blocos lógicos (LUTs).

[pic 2]

Figura 1 - Princípio básico do funcionamento de uma FPGA.

        A partir desse princípio básico de funcionamento, é possível realizar a criação de circuitos complexos como unidades aritméticas, memórias, processadores, entre outros dispositivos digitais. Aliado as FPGAs, é possível encontrar nos chips alguns outros módulos já implementados para auxiliar na integração das aplicações, tais como circuitos gerenciadores de rede, memórias DDRx, gerenciadores ULPI (protocolo para o gerenciamento de interface USB de alta velocidade), processadores (ARMs são muito comuns) e etc. Essa conexão entre diversos módulos é chamada de SoC (“System On Chip”).

  1. Procedimentos experimentais
  1. Software

O software utilizado foi o Quartus II, na versão 13.1 edição web. Distribuído pela Intel, tal software é o ambiente de desenvolvimento utilizado para o desenvolvimento da descrição de hardware, compilação, síntese, implementação e programação das FPGAs da marca.

Neste projeto, será utilizado como base o chip FPGA Cyclone IV, modelo EP4CGX15BF14A7.  

  1. Código VHDL

A primeira etapa é realizar a descrição das variáveis genéricas e das portas. Como variáveis genéricas, foi escolhido o tamanho do comprimento de bits a ser utilizado (“bit_lenght”), e a escolha se será utilizado borda de subida ou de descida para a sincronização da saída (“rising_or_fallen_edge”). Como portas, foi inserido o reset (rst) e o clock (clk) para a sincronia da LUT. O comando de operação é dado pela porta OP, e as duas entradas dadas por in1 e in2, sendo que possuem seus comprimentos definidos pelo tamanho do comprimento dos bits. Por último, a saída, também em função do tamanho do comprimento dos bits.

[pic 3]

Como trabalharemos com processos, é importante definir sinais para que seja feita as operações dentro dessa etapa sequencial. O sinal definido foi o da saída, dado também em função do tamanho do comprimento dos bits, como visto abaixo.

O processo LUT_OPERATION é responsável por realizar as operações sincronamente através da sensibilidade aos pinos de clock e reset. O reset é assíncrono, assim, ele realizará a sua operação independentemente do sinal de clock.

[pic 4]

Se o reset estiver inativo, o clock será comparado para descobrir se está em borda de subida ou de descida, em função da variável genérica rising_or_fallen_edge. Se a condição for satisfeita, então é realizado a operação entre os bits de entrada em função dos bits de OP, que definem a operação realizada. Isso foi implementado por meio de uma estrutura de case, mas poderia ser implementado utilizando if.

        Ao final do processo, o sinal é atualizado, e é associado de maneira paralela à saída out1.

[pic 5]

        No código do Ucalcs.vhd, tem-se a declaração também da biblioteca numeric_std, para futuramente ser realizado uma operação de conversão. As portas são as mesmas definidas no diagrama em blocos da figura 2. Os inteiros intOpAB e intOpCD foram limitados a apenas 8 bits. Isso foi feito pois o inteiro integral possui 32 bits, o que ocuparia desnecessariamente boa parte dos pinos do chip.

[pic 6]

Nessa etapa apenas é feito a instanciação do componente LUT, que será utilizado adiante.

[pic 7]

Cria-se agora os sinais em com o mesmo tipo das entradas e saídas para que faça o roteamento das portas do Ucalcs para as portas das LUTs.

[pic 8]

Abaixo, é feito o gerenciamento de portas e a definição das variáveis genéricas. Tendo feito isso, é realizado o roteamento das saídas das LUTs para as saídas do Ucalcs. Além disso é feito uma conversão da saída binária para inteiro utilizando a função to_integer, que é enviada para os pinos de saída intOpXX.

...

Baixar como (para membros premium)  txt (10.1 Kb)   pdf (680.7 Kb)   docx (621.6 Kb)  
Continuar por mais 6 páginas »
Disponível apenas no TrabalhosGratuitos.com