UNIDADE 2
CAPÍTULO 1
Conceitos da linguagem de hardware
Como vimos anteriormente, podemos configurar os PLDs conforme a necessidade de projeto e os seus respectivos objetivos, mas, como elaboramos essas instruções? Utilizamos a linguagem de hardware para descrever o funcionamento de um circuito, a sua concepção e organização, ou seja, como cada parte ou sistema atua e quando atua, ou seja, são expressões baseadas em textos com estrutura espacial, temporal e comportamental. Uma característica dessa linguagem é expressar a conectividade do circuito entre uma hierarquia de blocos que estão previamente organizados e classificados.
PLD e FPGA
Como vimos anteriormente, existem vários tipos de PLDs e essa variedade demandou a criação de várias formas de linguagem de hardware para atender cada um desses tipos. Alguns PLDs possuem uma tecnologia chamada ISP (In-System Programmable) que permite que o PLD seja programado mesmo que ele já esteja inserido em um circuito. A linguagem utilizada é denominada JAM e é implementada por meio de uma interface chamada JTAG. Essa linguagem se assemelha com a BASIC. Basicamente a diferença entre um PLD e um FPGA é o método de interligação das células.
Nos PLDs, as estruturas são contínuas, enquanto, que no FPGA as estruturas são de conexões segmentadas.
vHDL
Embora o VHDL signifique Linguagem de Descrição de Hardware com Ênfase em Circuitos Integrados de Altíssima Velocidade (Very High Speed Integrated Circuit Hardware Description Languague). O VHDL não é propriamente uma linguagem de programação, mas é análogo à ela. Sendo executado em um simulador e não tem, portanto, um arquivo executável (do tipo *.exe).

vantagens da utilização do vHDL
» Projeto independente da tecnologia e fabricante.
-
› O desenvolvimento não é atrelado à tecnologia ou ao fabricante.
» Ferramentas de CAD com compatibilidades entre as diversas disponibilidades.
-
› Facilidade na gestão dos projetos.
-
› Projetos em VHDL requerem poucos desenvolvedores, o que facilitam a estruturação e documentação e são mais simples de serem modificados ou inserir novas implementações.
» Reduz tempo de projeto e custo.
» Ao realizar as simulações no início do projeto, o VHDL permite que não se necessite criar e manter esquemáticos e assim conter erros no desenvolvimento do projeto.
» Reduz “time-to-market”.
» Um produto que contém VHDL é lançado ao mercado para vendas em tempo menor, pois, o seu desenvolvimento é muito mais rápido.
Ambientes de desenvolvimento e simulações (modelSim)
Um ambiente muito utilizado para desenvolvimento e simulações de projetos em VHDL é o ModelSim© que foi desenvolvido pela Mentor Graphics. O modelSim© é oferecido em duas versões: ModelSim© PE e Questa Sim.
A versão PE é oferecida para entusiastas e estudantes, enquanto que
a Questa Sim é usada para aplicações em grande escala industriais.
O ModelSim© também pode ser utilizado em conjunto com o Matlab/Simulink©.
Neste caso, o Matlab© fornecerá uma ferramenta numérica de simulação, enquanto que
o ModelSim© apresenta ferramentas para verificar a implementação no hardware.
O Modelsim© suporta a utilização de linguagens VHDL e Verilog embora a versão gratuita não permita o uso simultâneo dessas duas linguagens. E, ainda, a versão gratuita tem-se uma limitação na performance de desenvolvimento, ou seja, na quantidade de números de linhas de comandos e instruções no ato do desenvolvimento, e dentre outras limitações.
Uma grande utilidade do VHDL é poder simular a operação de um circuito, a fim de se identificar o seu correto funcionamento, antes que ele seja levado para a fabricação do protótipo. Essa simulação permite analisar o comportamento de todo o circuito e, inclusive, permite que sejam feitos vários experimentos sem a necessidade de montar e desmontar o circuito inúmeras vezes, no intuito de garantir a sua validade.
O ModelSim© cria um arquivo de teste chamado Testbench (bancada de teste) e o utilizamos para criar a simulações de
teste do experimento do projeto, conforme ilustrado na figura a seguir.

Fonte: <https://www.embarcados.com.br/tutorial-de-modelsim-vhdl-fpga/>. acesso em: 8/5/2018.
Podemos verificar que as entradas do circuito são criadas pelo clock de 50 MHz e mais um sinal de Reset.
A saída é o led_status (com 10 ns para nível lógico alto e, 10 ns para o nível lógico baixo,
ou seja, período de cada ciclo de 20 ns, o que equivale a frequência de 50 MHz).
Conforme o cálculo a seguir.
T = 1 / f
Onde T é o período de ciclo dado em segundos, e f é a frequência em Hertz.
Então, tem- se para a frequência de 50 MHz:
T = 1 / ( 50 x10^6 )
T = 20 x 10^-9 = 20 ns
A fim de facilitar a visualização da simulação do código “pisca_led.vhd”, alteramos a frequência de pisca para um período de 10 ms. Isso foi feito alterando o valor da comparação do sinal “led_delay” para 500000:

Fonte: <https://www.embarcados.com.br/tutorial-de-modelsim-vhdl-fpga/>. acesso em: 8/5/2018
Feito isso, podemos iniciar no ModelSim©.

Iniciemos em “File”, depois “New” e, por fim, em “Project”. Na janela que aparecerá,
colocamos os dados do projeto.
(1)
Após ter preenchido tudo conforme indicado e corretamente, clique em “Ok”, e crie um novo projeto.
(2)
Na próxima janela é onde se adiciona itens ao projeto. Se você já possuir arquivos com extensão “*.vhd” do Testbench e do módulo “pisca_led”, pode-se clicar em “Add Existing File” (Adicionar arquivo existente) e selecione os arquivos ao projeto. Em caso contrário, o ModelSim© permite utilizar um editor para isso.
Por fim, clique em “Create New File” (Criar novo arquivo), copie todo o conteúdo para o novo arquivo. A tela ficará assim:
(3)
Por fim, compilaremos todos os arquivos. Vá em “Compile”, depois “Compile All”. Se
não ocorrer nenhum erro, o resultado será:
# Compile of pisca_led.vhd was successful.
# Compile of testbench_pisca_led.vhd was successful. # 2 compiles, 0 failed with no errors.
Pronto, podemos iniciar a simulação! Vá em “Simulate” e, depois, em “Start Simulation”. E veremos:
(4)
Se a tela não surgir, vá em “View” e depois em “Wave”.
Escolha o Testbench e vá em “Ok”. Veremos a tela:
(5)
Podemos reparar alguns dados nessa imagem como:
» Objects: são os sinais disponíveis dentro da instância marcada.
» Instâncias: são as instâncias disponíveis.
» Tempo de simulação: detalha o tempo de cada passo da simulação.
» Wave: é o analisador de ondas, que podemos checar os sinais em vários instantes de tempo.
Recomenda-se que antes de propriamente iniciar a simulação, sejam escolhidos os sinais que serão analisados.
Inicialmente escolha a instância “testbench_pisca_led” em “Instance Viewer”. Feito isso, os sinais “clk”, “rs” e “led_status” ficarão disponíveis em “Objects”. Selecione e os arraste para a janela “Wave”. Após isso, selecione a instância “pisca_led1” e arraste o sinal “led_delay” também para a janela “Wave”.
Agora na janela “Wave”, precisamos configurar o sinal de “reset” que atualmente exibe o estado “unknown” (desconhecido). Clique com o botão direito do mouse sobre o sinal “rs”. No próximo menu, clique em “Force”, e configure o “value” para “0” e vá em “Ok”.
(7)
Agora, alteramos o tempo do passo da simulação para 10 ms. Feito isso, clique em “Play”. Dependendo da configuração do computador e das limitações da versão, o processo pode levar um tempo.
Agora altere o sinal de “rs” para 1 e rode 10 ms novamente. Agora, novamente 10 ms. Feito esse processo, teremos simulado 30 ms sendo que nos primeiros 20 ms foram utilizados para resetar o módulo “pisca_led” e os seguintes 10ms o led alterou seu status para 1. Com o processo concluído, observaremos o resultado na janela “Wave”. Selecione o sinal “led_status” e clique no botão para procurar o nível de borá e, assim, veremos o evento de alteração do status do led.
(8)
Por fim, podemos identificar o correto funcionamento de nosso projeto hipotético. A cada pulso de “clock”, o contador “led_delay” foi incrementado até atingir o valor de 500000 (equivalente a 10ms) o valor do “led_status” alterou-se.
Desta forma, podemos imaginar que o uso dessa ferramenta é de grande utilidade tanto em questão de tempo, retrabalho e resultado.
A versão para estudantes e entusiastas pode ser baixada em: <https://www. mentor.com/company/higher_ed/modelsim-student-edition>, para que você possa iniciar os seus projetos, igual ao exemplo citado anteriormente.
Enquanto, que a versão Questa Sim pode ser adquirida em <https://www. buyaltera.com/PartDetail?partId=2021454>.
Para iniciar nos ambiente de desenvolvimento do ModelSim©, acesse: <https:// www.youtube.com/watch?v=Z8whdGa7RtY> e <https://www.youtube.com/ watch?v=6M79Mb7OnM0>.
Para também conhecer a ferramenta Matlab© com o ModelSim©, acesse:
<https://www.youtube.com/watch?v=qOJx83aH_2g> e <https://www.youtube. com/watch?v=XDRkA3eQ-RQ>.

Componentes de formação do vHDL
Um projeto VHDL é composto por 4 blocos, conforme a figura a seguir indica.

Fonte: <https://pt.scribd.com/document/94307332/dispositivos-logico-e-programavel-Fpga-e-linguagem-de-descricao-de- Hardware-vHdl>. acesso em: 8/5/2018.
Pacotes e entidades
Nos pacotes, que também são chamados de bibliotecas, como o próprio nome diz,
são pacotes de elementos e informações. Os mais usados são:
» IEEE.std_logic_arith: Pacote de funções aritméticas.
» IEEE.std_logic_signed: Pacote de funções aritméticas com sinal.
» IEEE.std_logic_unsigned: Pacote de funções aritméticas sem sinal.
» IEEE.std_logic_1164: Pacote padrão de funções lógicas básicas.
Para utilizar esses pacotes, usa-se os seguintes comandos:
LIBRARY <NOME_DO_PACOTE> e/ou USE <NOME_DO_PACOTE>.all.
Como regra geral, use o “.all” ao usar um pacote para que todos os elementos desse pacote sejam acrescentados.
Com relação à Entity, ou Entidade, ela pode ser dividida em duas partes:
tipos de portas (pinos) e
tipos de sinais, o que trataremos a seguir.
A entidade é basicamente uma representação forma de uma porta lógica e de até um sistema lógico completo.
Ao se declarar uma entidade, se declara um conjunto de entradas e saídas.

Nessas figuras, identificamos que os pinos
de entradas são I0, I1 e I2 enquanto que os
de saída são S0 e S1.
Por regra, a declaração de uma entidade deve conter três cláusulas como ENTITY, PORT e END.
» ENTITY: essa cláusula indica que se tratará de uma declaração de uma entidade.
» PORT: essa cláusula lista as entradas e saídas da entidade.
» END: essa cláusula indica o término da declaração de uma entidade.
Portas e tipos de sinais
Como vimos, existem as portas de entradas e saídas mas existem outras, como veremos todas:
» IN: Porta de entrada.
» OUT: Porta de saída.
» INOUT: Porta de entrada e saída.
» BUFFER: Porta de saída que pode ser realimentada internamente.
Os tipos de sinais mais comuns são:
» Bit: assume valor 0 ou 1.
X:in bit.
» Bit_vector: vetor de bits.
X:in bit_vector(7 downto 0) ou
X:in bit_ vector(0 to 7).
» Std_logic: é parte do pacote std_logic_1164
e provê modelamento mais realístico dos sinais dentro de um sistema digital.
X:in std_logic.
» Std_logic_vector: é um conjunto de variáveis e sinais do std_logic.
X:in std_logic_vector(7 downto 0) ou
X:in std_logic_vector(0 to 7).
» Boolean: assume valores verdadeiro (True) ou falso (False).
» Real: assume valores reais.
É comum que as portas de entrada sejam declaradas antes das portas de saídas e que cada interface seja seguida de “ponto e vírgula” (;). E, ao final da definição de uma porta, também é necessário o ponto e vírgula.
Arquiteturas
Trata-se do funcionamento do circuito, de como se dá o comportamento da entidade, do funcionamento interno e sua relação com entradas, saídas e sinais. A arquitetura é formada por declarações e comandos que são:
» Declarações: sinais, constantes, variáveis, componentes, subprogramas.
» Comandos: blocos, atribuições à sinais, chamadas à subprogramas, instanciação de componentes e processos.
A arquitetura abrange desde apenas um processo quanto
a processos concorrentes que ocorrem de forma simultânea e mais complexa.

Existem três formas de se descrever uma arquitetura:
» Descrição estrutural: nessa descrição, todos os componentes e as interconexões (onde ocorrem as atribuições de sinais) são feitos por meio do mapeamento de entradas e saídas de componentes. É como se fosse uma lista de ligações entre componentes pré-definidos.
» Component: é a descrição de um componente.
» Port Map: é o mapeamento do componente em um sistema maior.
» Comentários: são feitos colocando “--” na frente dos mesmos. Desta forma a linha não é interpretada como uma instrução.

» Descrição por Fluxo de Dados: Também conhecido como “Data Flow”, nesse tipo os valores de saída são atribuídos diretamente utilizando-se expressões lógicas. Aqui, as expressões são concorrentes, ou seja, simultâneas.

tipo
WORKING-STORAGE SECTION
» Descrição comportamental: nesta descrição, utiliza-se um comando fundamental chamado “PROCESS” que opcionalmente é precedido de um “Label”, ou rótulo” e depois de uma lista de sensibilidade que por sua vez indica quais são as variáveis e sinais.
