VHDL é uma linguagem bastante complexa!

Documentos relacionados
VHDL é uma linguagem bastante complexa!

FPGA & VHDL. Tutorial Aula 1. Computação Digital

low): Descreve o que o sistema deve fazer utilizando expressões lógicas.

Introdução à Linguagem VHDL

Funções de Lógica Combinacional

Projeto de Circuito Combinacional

Exercícios de Laboratório 1

LABORG. VHDL Máquina de estados finitos

Livro texto: VHDL- Descrição e Síntese de Circuitos Digitais Roberto D Amore Editora LTC

Fundamentos de Sistemas Digitais. Lógica Sequencial. Prof. Dr. Alexandre M. Amory Prof. Dr Edson I. Moreno

12/11/13. Obje%vos do laboratório. SST20707 Síntese de Sistemas de Telecomunicações. Síntese de máquinas de estado (FSM) Finite State Machine (FSM)

Gustavo G. Parma. Objetivos: O aluno deverá ser capaz de compreender os conceitos básicos de VHDL.

Introdução ao VHDL. Circuitos Lógicos. DCC-IM/UFRJ Prof. Gabriel P. Silva. Original por Ayman Wahba

Introdução à Linguagem VHDL

4.a Aula Prática Projeto de um Somador de 16 bits com a Linguagem VHDL

SIMULAÇÃO DE CIRCUITOS

Introdução à Programação

DISPOSITIVOS LÓGICOS PROGRAMÁVEIS - DLP. 18/04/2016 Prof. Alexandre - ELP1DLP1 / DEE

Introdução ao Python. Programa Computacional

Variáveis e Entrada de Dados Marco André Lopes Mendes marcoandre.googlepages.

Introdução à Computação

Circuito Decodificador BCD para Display de Sete Segmentos

ARITMÉTICA BINÁRIA. Adão de Melo Neto

Descrição e Projeto de Circuitos Utilizando VHDL

Descreva em VHDL, simule no simulador logico e sintetize usando uma ferramenta de CAD para FPGA :

Unidade 11: Programando Swing com o NetBeans Prof. Daniel Caetano

Processador: Conceitos Básicos e Componentes

Disciplina: Arquitetura de Computadores

Como construir um compilador utilizando ferramentas Java

IDES E PROGRAMAÇÃO. Prof. Dr. Cláudio Fabiano Motta Toledo PAE: Maurício A Dias

EPUSP PCS 2355 Laboratório Digital. Contadores em VHDL

ALTERA Quartus II. Manual

Introdução. VHDL: VHSIC Hardware Description Language. Origem: VHSIC: Very High Speed Integrated Circuits. Departamento de Defesa EUA

Organização e Arquitetura de Computadores II

O diagrama ASM contém dois elementos básicos: o bloco de estado e o bloco de decisão.

FACULDADE PITÁGORAS PRONATEC

Tutorial Multisim. Página inicial do Multisim

SPYDER. um ambiente de desenvolvimento integrado (IDE*) para Python. Prof. Carlos Hitoshi Morimoto DCC IME USP Março, 2016

Curso Superior de Sistemas de Telecomunicações Unidade São José. Disciplina: Síntese de Sistemas de Telecomunicações 7º Fase

Calculadora Simples em VHDL

Arquitetura e Organização de Computadores

PRÁTICAS PARA DESENVOLVIMENTO DE PROTÓTIPOS DE CIRCUITOS DIGITAIS COM O KIT EDUCACIONAL DE2

SSC510 Arquitetura de Computadores 1ª AULA

Primeiro Trabalho de Sistemas Digitais

Aula 8 - Unidade lógica aritmética e Multiplicadores

SIMULAÇÃO DE MÁQUINA DE REGISTRADORES COM MÁQUINA DE TURING MULTIFITA

Curso de C. Introdução by Arnaldo V. Moura e Daniel F. Ferber 3/10/ :43 AM

Linguagem C Princípios Básicos (parte 1)

Registradores. Circuitos Lógicos. DCC-IM/UFRJ Prof. Gabriel P. Silva

Bases de Dados. Lab 1: Introdução ao ambiente

Tópicos Avançados em Sistemas Computacionais: Infraestrutura de Hardware Aula 02

Construção de Compiladores. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2014.

NEANDERWIN. Algumas características do processador Neander são:

a b s cout Tabela 1: tabela verdade do meio somador

Algoritmos e Programação

ORGANIZAÇÃO DE COMPUTADORES MÓDULO 7

Laboratório de Ciências Computação

Início Rápido: Exibir relatórios Início Rápido: Exibir relatórios

Aula 12: Memória: Barramentos e Registradores

Representações de Números Inteiros: Sinal e Magnitude e Representação em Excesso de k

PRINCÍPIOS DA PROGRAMAÇÃO LEGO MINDSTORMS NXT

Novas Tecnologias no Ensino da Matemática

No Windows há basicamente dois tipos de programas de usuário:

Estrutura de Dados Básica

arquitetura de computadores

Operações com números binários

Somador e subtrator de 8 bits

Tutorial Proteus 02. Como simular o Arduino no Proteus ISIS utilizando a biblioteca "Emulater" por João Vitor

Mini apostila de Python - Oficina de Vestibulandos. PET Computação - UFPR September 2016

Aula 14 Funcionamento de Processadores (Visão específica)

Representação da Informação no Computador

Organização e Arquitetura de Computadores I

Aula 7: Portas Lógicas: AND, OR, NOT, XOR, NAND e NOR

Tópicos Avançados em Sistemas Computacionais: Infraestrutura de Hardware Aula 06

Na seqüência, será aberta uma página de login de acesso ao ambiente de gerenciamento do portal, conforme ilustrado na figura 01, abaixo: Figura 01

PASSO A PASSO COMO CRIAR UM NOVO PROJETO EM SCHEMATIC NO SOFTWARE QUARTUS II CYCLONE IV

ÁLGEBRA BOOLEANA E LÓGICA DIGITAL AULA 04 Arquitetura de Computadores Gil Eduardo de Andrade

Atalho de teclado CTRL + P

Obs.: para realizar estas atividades tenha certeza de que já tenha instalado no sistema operacional o Java JDK e o NetBeans.

CALCULADORA SIMPLES COM ULA

Pontifícia Universidade Católica Federal do Rio de Santa Grande Catarina do Sul

Lógica de Programação I. Gilson de Souza Carvalho

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À ORGANIZAÇÃO DE COMPUTADORES

Sistemas de Numeração. Exemplos de Sistemas de Numeração (1) Exemplos de Sistemas de Numeração (2) Sistemas de Numeração

Criação de componentes no Proteus

Ambiente de desenvolvimento

Introdução a UML (Unified Modeling Language)

Anhanguera Educacional S.A. Centro Universitário Ibero-Americano

DESCRIÇÃO DE CIRCUITOS DIGITAIS EM VHDL

LABORG. Parte 5 Projeto de um circuito digital de média complexidade Parte 2. Fernando Gehm Moraes Matheus Trevisan

Uma Introdução às Linguagens de Descrição de Hardware

Executar uma macro clicando em um botão da Barra de Ferramentas de Acesso Rápido

Introdução à Computação: Máquinas Multiníveis

CIRCUITOS ELETRÔNICOS LINEARES TE054. Introdução a simulação de circuitos usando o programa QUCS

Transcrição:

arquitetura de computadores UTFPR DAELN Engenharia de Computação prof. Juliano µprocessador 1 Tutorial de Introdução ao VHDL Uma HDL é uma Hardware Definition Language, ou seja, não é uma linguagem de programação! Nós usamos a linguagem VHDL para especificar circuitos digitais. Antes de começarmos, um aviso: VHDL é uma linguagem bastante complexa! Veremos aqui um subset da linguagem, uma versão bem light mesmo. A internet pode ajudar, mas cuidado pra não se afundar nos muitos detalhes, que serão vistos na disciplina de Lógica Reconfigurável. Ferramentas Precisamos de três ferramentas para o trabalho: um editor de código, um compilador/simulador e um visualizador de formas de onda. O código será compilado e executado com o ghdl e os resultados serão vistos com o gtkwave. Um documento na página da disciplina contém as instruções de instalação. Para editar o código, sugere-se o Notepad++; em sala de aula, pode-se usar o Quartus II. Outras alternativas são sugeridas nas instruções de instalação. Crie um arquivo novo no editor de textos escolhido. Grave ele com o nome porta.vhd. Básico: Uma Porta Lógica Digite o código abaixo no arquivo.vhd, não recorte-e-cole; assim você já vai vendo a cara do bicho (aprenda devagar, é o único jeito). O VHDL é case-insensitive, mas cuidado se for usar no Linux... Vamos por partes. Comece com: library ieee; use ieee.std_logic_1164.all; O padrão IEEE para valores lógicos é o 1164, que inclui não só '0' e '1', mas outros sete, incluindo 'X' (desconhecido) e 'U' (não inicializado). Siga agora com a definição da interface, ou seja, as entradas e saídas do bloco: entity porta is port( in_a : in std_logic; in_b : in std_logic; a_e_b: out std_logic ); end entity; CUIDADO: veja que o último pino especificado não termina com ponto-e-vírgula! A entidade é o bloco que estamos construindo. Observe que o nome da entidade deve preferencialmente ser o mesmo nome do arquivo ( porta, no caso). Ou seja, use um nome idêntico para o arquivo e para a entity e não brigue. A keyword port indica que vamos especificar as entradas ( in ) e saídas ( out ) do bloco. Os nomes que escolhi para os pinos são in_a, in_b e a_e_b. Os três são std_logic, ou seja, são só um bit. Finalmente vamos especificar a implementação do bloco, ou a arquitetura dele.

architecture a_porta of porta is begin a_e_b <= in_a and in_b; end architecture; Batize a arquitetura simplesmente colocando um a_ na frente ( a_porta ), pra ficar fácil. Entre o begin e o end está a circuitaria: uma única linha que define uma porta AND. Abra então o terminal de linha de comando (o shell) e digite os comandos: ghdl -a porta.vhd ghdl -e porta Caso haja mensagens, verifique erros de digitação ou cópia 1. Note que o -e tem só o nome da entidade, sem o.vhd: é a entidade, não o nome do arquivo. O primeiro comando (-a) executa uma análise do código fonte, procurando validá-lo como VHDL correto. O segundo comando (-e) faz a elaboração do circuito, construindo uma representação dele em um formato intermediário. O circuito produzido é o visto abaixo 2 : Bom, agora a gente vai simular. Arquivo de Simulação A simulação é não-interativa: especificamos algumas entradas e observamos a resposta do circuito nas saídas. Para especificar as entradas, precisamos criar um arquivo de testes, ou testbench. Crie um arquivo porta_tb.vhd 3 no editor de textos e já inicie a digitação do código (aprenda devagar...). library ieee; use ieee.std_logic_1164.all; -- a entidade tem o mesmo nome do arquivo entity porta_tb is end; Como este arquivo apenas gera sinais, o bloco não possui nem entradas nem saídas. O hífen duplo -- é o comentário. Prosseguimos. architecture a_porta_tb of porta_tb is component porta port( in_a : in std_logic; in_b : in std_logic; a_e_b: out std_logic ); end component; signal in_a,in_b,a_e_b: std_logic; ---- (continua a seguir...) -- lembre: sem ';' nessa linha 1 Se o ghdl não der nem sinal de vida, veja o documento de instruções de instalação no site da disciplina. Em especial, verifique se o path padrão do sistema está correto. 2 Usando o Quartus II podemos visualizar o circuito produzido pela compilação com Tools => Netlist Viewers => RTL Viewer (RTL é Register Transfer Level) 3 Esse padrão de usar _tb como sufixo para o testbench de um módulo é bem comum e altamente recomendável. Use-o.

A seção component indica que vamos usar um componente pronto de outro arquivo. Precisamos indicar exatamente a mesma interface definida lá. Adicionalmente, vamos precisar de sinais para fazer as ligações dos pinos do componente e suas atribuições de valores. Um sinal VHDL é um ponto qualquer no circuito, um nó ou um fio, ao qual damos um nome. Como padrão, criamos sinais com o mesmo nome dos pinos para facilitar, mas o nome ode ser diferente. Note que, embora os pinos possuam sentido ( in ou out ), os sinais não possuem. ---- (...continuação do anterior) begin -- uut significa Unit Under Test uut: porta port map( in_a => in_a, in_b => in_b, a_e_b => a_e_b); ---- (continua a seguir...) uut é o nome da instância do componente porta. A seguir, é exigido que se faça o mapeamento de todos os pinos do bloco para sinais criados neste arquivo. O formato é pino1 => sinal1, pino2 => sinal2 etc. Enfim inserimos os dados de simulação. ---- (...continuação do anterior) process begin in_a <= '0'; in_b <= '0'; in_a <= '0'; in_b <= '1'; in_a <= '1'; in_b <= '0'; in_a <= '1'; in_b <= '1'; wait; end process; end architecture; A keyword process identifica uma seção sequencial de VHDL, com eventos. As atribuições parecem simples: '0' e '1' são constantes booleanas atribuídas aos sinais. As aspas simples identificam valores do tipo std_logic. A construção wait for ns não pode ser usada em um circuito normal; ela existe apenas para que possamos fazer testbenches. O process deve terminar com um wait; sem tempo. Assim como para o outro arquivo fonte, precisamos fazer a análise e a elaboração do arquivo com: ghdl -a porta_tb.vhd ghdl -e porta_tb Okay, agora sim a gente vai simular. Como Simular Vamos fazer o ghdl rodar os processos de testbench através do seu comando -r (run), que vai gerar formas de onda obtidas a partir dos sinais especificados no arquivo porta_tb.vhd que é o

arquivo top-level do nosso projeto, ou seja, inclui todos os outros como dependentes. Digite o comando seguinte no terminal: ghdl -r porta_tb --wave=porta_tb.ghw Isso diz para executar a entidade porta_tb (não é o nome do arquivo, portanto omite o.vhd ). O comando vai produzir formas de onda de saída da simulação num formato adequado. Para visualizar estas formas de onda, precisamos invocar o gtkwave, que é um visualizador genérico, usado tanto para ondas de circuitos VHDL como para outros propósitos. Execute-o assim: gtkwave porta_tb.ghw As ondas não aparecem a princípio pois não foram selecionadas; para vê-las, você deve: Expandir a treeview que está no painel superior esquerdo (diz SST nele); Clicar na entidade porta_tb na árvore; Selecionar todos os sinais que aparecem ali (são a, b e e) e clicar Insert; Ir ao menu Time => Zoom e escolher Zoom Full; As formas de onda devem aparecer no painel preto. Circuitos Maiores Para fazermos um circuito como o abaixo, vamos precisar de várias ligações. Os x's são entradas e os y's são saídas. Aliás, o que faz este circuito? Qual sinal tem maior prioridade, x3 ou x0? Um código VHDL possível para descrever o circuito é: y3 <= x3; y2 <= x2 and not x3; y1 <= x1 and not x2 and not x3; y0 <= x0 and not x1 and not x2 and not x3; Perceba que todas as linhas acima são executadas em paralelo! Isso ocorre porque esta é uma descrição estática de um circuito. Isto não é um programa. Cada comando desta seção cria uma conexão física entre partes do circuito. Por isso, o seguinte trecho é bugado: d <= a; d <= b or c; O circuito equivalente é esse:

Ou seja, um curto-circuito indesejável, já que estamos descrevendo duas ligações para um mesmo ponto d. Drills (Exercícios de Fixação) É necessário fazer, não é necessário entregar, não vale nota. O método vai ser útil em algum momento. Um decoder é um circuito que seleciona apenas uma das saídas disponíveis. Portanto um decoder 2x4 possui dois bits de seleção (entrada) e vai manter apenas em uma das 4 saídas em nível 1 ( ligada ), que é aquela selecionada pelos bits de entrada, deixando as demais em nível 0 ( desligadas ). Projete e simule um decoder 2x4. Faça a tabela verdade, extraia as expressões lógicas e daí sintetize o código VHDL. Teste. Siga obrigatoriamente as recomendações abaixo. Então a ordem típica é: 1. Identifique a interface (entradas e saídas) 2. Especifique o componente (entidade) 3. Projete o comportamento no papel 4. Só então construa a arquitetura 5. Construa o testbench 6. Teste tudo e conserte o que precisar Mas só para estes exercícios, para fixar bem, construa o testbench antes de construir a arquitetura. Isso forçará você a lembrar que a implementação é só um detalhe, um ajuste, depois de você compreender bem o comportamento do circuito. Mais um: Projete e simule um somador completo de 1 bit. Faça a tabela verdade e extraia uma expressão lógica e daí sintetize o código VHDL. Teste o circuito. Resposta Detalhada do Exercício 4 do Laboratório #3 No 8051, é o programador que decide se o número de 8 bits é sinalizado ou não. Dada a conta: 11001110 2 +11000111 2 com resultado num registrador de 8 bits, quais são os valores decimais envolvidos? Houve estouro da capacidade de 8 bits ou não? Chamemos o valor 11001110 2 de x e o valor 11000111 2 de y. Temos quatro possibilidades interpretativas, usando notação da linguagem C: tipo x y signed de 8 bits -50-57 unsigned de 8 bits 206 199 O resultado final da soma será 10010101 2, independentemente de haver sinal ou não, pois a ULA faz as somas sem saber se o número é binário puro ou complemento de 2, já que a operação matemática é a mesma em ambos os casos. Este valor tanto pode ser 149, caso o resultado seja interpretado como unsigned, como pode ser -107, se for signed. Perceba que o resultado está correto em todas as possibilidades, exceto quando tanto x quanto y são unsigned:

1. -50-57=-107 2. -50+199=149 3. 206-57=149 4. 206+199=405, e 405=256+149 (o 256 é o carry) Isso ocorre porque as contas de 8 bits são feitas em módulo 256. Observe que não há overflow e há carry nesta conta 11001110 2 +11000111 2. Ademais, o overflow só vale para o caso 1, sinalizado, e o carry só deve ser usado no caso 4, não sinalizado. Os casos 2 e 3 são perigosos para o programador, misturando representações sinalizada e não sinalizada, mas dão o resultado certo. Portanto só há estouro da capacidade de 8 bits se estivermos usando números não sinalizados; caso contrário, não há estouro.