Mudanças entre as edições de "DIG222802 2017 1 AULA12"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 1: Linha 1:
=Ambiente de Software EDA=
 
 
Software EDA é uma categoria de ferramentas de software para projetar sistemas eletrônicos, tais como placas de circuitos impressos e circuitos integrados. Nessa apostila o software utilizado será o Quartus®II Web Edition versão 9.2.
 
Por intermédio desse ambiente é possível fazer simulação, testes e programação de dispositivos FPGAs. As fases de implementação de um projeto de circuito digital podem ser divididas em entradas de dados, compilação, simulação e programação.
 
 
A entrada de dados do projeto consiste em fornecer ao programa a especificação do projeto. Essa entrada pode ser realizada das seguintes formas:
 
 
'''[1] Editor Gráfico''': Um diagrama lógico, desenvolvido a partir de elementos primitivos, portas lógicas básicas e outros componentes disponíveis em bibliotecas, que podem ser inseridos e interligados para criar o projeto.
 
 
'''[2] Editor de Texto''': Uma descrição abstrata do circuito lógico, utilizando se comandos de uma linguagem estruturada de descrição de hardware como AHDL, VHDL ou Verilog, que descrevem o comportamento ou o funcionamento do circuito lógico.
 
 
'''[3] Editor de Símbolo Gráfico''': Nesse caso, os elementos do diagrama lógico são símbolos gráficos criados pelo usuário ou macroinstruções gráficas existentes nas bibliotecas do software, que implementam alguma função lógica.
 
 
'''[4] Editor de forma de onda''': Nesse caso, os dados de entrada são formas de onda que implementam alguma função desejada. A partir das formas de onda de entrada e saída o programa implementa a função lógica.
 
 
==Software Quartus®II==
 
 
Ao longo do curso será utilizado o software Quartus®II da Altera Corp., para se implementar e testar projetos de sistemas digitais, a serem desenvolvidos em aulas práticas. Este software é um ambiente de desenvolvimento integrado, ou EDA (Electronic Design Automation), que permite a realização de todas as etapas envolvidas no projeto de um sistema digital, desde a descrição de sua lógica, por meio de diagramas esquemáticos ou linguagens de descrição, simulação do circuito desenvolvido, até a gravação do projeto em um dispositivo lógico programável como um CPLD ou FPGA. O Quartus®II trabalha com um sistema orientado a projetos, ou seja, o software associa diversos arquivos à um projeto. Este sistema possibilita a utilização de componentes básicos em diversos projetos e simplifica a elaboração de projetos mais complexos uma vez que as funcionalidades de um grande sistema podem ser divididas em diversos sistemas mais simples e por fim, agrupados.
 
 
==Criando Projeto com Quartus®II==
 
 
A forma mais simples de se criar um projeto no Quartus®II é por meio do aplicativo Project Wizard. Para executar tal aplicativo, clique no menu File > New Project Wizard.
 
Com isto a tela de apresentação do aplicativo Project Wizard irá se abrir. Clique em Next. Nesta tela pode-se escolher o diretório do projeto, o nome do projeto e o nome da entidade principal do projeto. É recomendável que para cada projeto, uma pasta diferenciada seja criada, para que não haja conflito entre os diversos arquivos gerados para cada projeto.
 
Uma vez preenchidos os campos corretamente, clique em Next novamente. Nesta tela é possível incluir arquivos ao projeto. Através do botão “...” ao lado do campo File Name é possível definir o diretório do arquivo a ser incluído. Uma vez selecionado o arquivo, clique em Add para adicioná-lo ao projeto. Quando todos os projetos desejados forem incluídos, clique em Next. Com isso a próxima tela aparecerá.
 
 
OBS1: Caso esteja criando um projeto que não se utiliza de componentes
 
previamente criados apenas clique em Next.
 
Nesta tela deve-se escolher o componente a ser utilizado para implementar o projeto, ou seja, em qual dispositivo lógico programável o sistema será gravado. A família do dispositivo pode ser definida no campo Device Family. Na seção Show in Avaliable device list, na lista Available devices são apresentados todos os componentes da família escolhida que atendam aos requisitos definidos pelo filtro de componentes. Selecione o dispositivo adequado e clique em Next para prosseguir para a próxima tela.
 
 
OBS2: Observe no kit de desenvolvimento qual o dispositivo utilizado.
 
Nesta janela é possível utilizar outras ferramentas de desenvolvimento em conjunto com o Quartus®II, para isto a ferramenta a ser utilizada deve estar instalada no computador, uma vez que estas ferramentas não acompanham o pacote de instalação do Quartus®II. No curso de sistemas digitais não será utilizada nenhuma ferramenta adicional. Assim sendo, clique em Next.
 
Esta tela apresenta um resumo do projeto a ser criado. Verifique se todos os dados conferem com os desejados, caso haja algo incorreto, retorne à tela adequada, por meio do botão back e corrija o erro. Caso não haja erros, clique em Finish. Ao final do processo, a janela de projeto (Project Navigator) conterá o projeto criado.
 
 
 
==Desenvolvendo um projeto usando diagrama esquemático==
 
 
O uso de diagramas esquemáticos é uma das maneiras de se definir a lógica de um sistema digital dentro do ambiente de projeto do Quartus®II. Neste modo de projeto os componentes básicos de eletrônica digital como portas lógicas, flip-flops e multiplexadores, são representados por meio de blocos, os quais podem ser arranjados e associados de forma a se definir uma lógica de funcionamento.
 
 
Para se iniciar o desenvolvimento de um projeto que utilize o modo de diagrama
 
esquemático, é necessário, primeiramente, adicionar ao projeto principal um arquivo que comporte este tipo de entrada. Assim sendo, para adicionar um arquivo de diagrama esquemático ao projeto clique em File -> New..., e uma nova janela aparecerá.
 
Nessa janela é possível escolher o tipo de arquivo que se deseja criar. Selecione a opção Block Diagram / Schematic File e clique em Ok. Um novo arquivo de diagrama esquemático aparecerá na janela principal do Quartus®II. Para salvar este arquivo clique em File > Save as... e dê um nome ao arquivo, salvando-o na pasta do projeto principal.
 
 
OBS: Para arquivos de descrição de hardware, deve-se sempre lembrar que o nome da entidade principal do arquivo deve ser igual ao nome do arquivo.
 
 
A tela de edição de diagramas esquemáticos é aberta, onde devemos destacar as funções de alguns botões:
 
 
#Atracar/Desatracar Janela: Permite separar a janela de diagrama esquemático da janela principal do Quartus®II.
 
#Ferramenta de Seleção: Permite selecionar elementos inseridos no arquivo.
 
#Ferramenta de texto: Permite inserir texto no arquivo, com fins explicativos ou de documentação.
 
#Ferramenta de símbolo: Permite inserir símbolos (componentes). Seu uso será detalhado posteriormente.
 
#Ferramenta de conexão: Realiza a ligação entre terminais dos componentes.
 
#Ferramenta de barramento: Realiza a ligação de barramentos (conjunto de sinais associados).
 
 
Através da ferramenta de símbolos é possível inserir componentes no arquivo. Clique nela, ou dê dois cliques na tela em branco, para inserir um componente. Feito isso uma janela com a biblioteca de componentes do software será aberta.
 
Nessa janela, no campo Libraries, é possível explorar as diversas coleções de componentes do Quartus®II. As mais relevantes são listadas abaixo:
 
 
#Megafunctions: Tratam-se de funções complexas já prontas, necessitando muitas vezes de configuração. Serão melhor explicadas futuramente.
 
#Others: esta coleção possui modelos de componentes equivalentes aos da família de dispositivos 74xx. Dessa forma é possível realizar qualquer combinação lógica feita com componentes discretos dentro do CPLD.
 
#Primitives: componentes básicos:
 
##Buffers: diversos tipos de buffers, incluindo os de saída tri-state.
 
##Logic: elementos lógicos básicos (AND, OR, NOR, XOR, etc.) com diversos números de entradas.
 
##Others: elementos diversos.
 
##Pin: diversos tipos de pinos suportados pelo componente: entrada, saída ou bidirecional.
 
##Storage: elementos de armazenamento de dados, ou seja, flip-flops de diversos tipos.
 
 
EXEMPLO: Para exemplificar o modo de desenvolvimento via diagrama esquemático, será realizada a montagem de um circuito combinacional capaz de executar a operação:
 
 
<math>S(A,B,C,D)=(A.B) \oplus (C.D)</math>
 
 
 
 
 
=Tutorial Modelsim=
 
=Tutorial Modelsim=
  

Edição das 14h35min de 17 de abril de 2017

Tutorial Modelsim

Ferramentas de simulação são grandes aliadas no desenvolvimento de aplicações embarcadas, pois facilitam a vida do desenvolvedor, em FPGA é extremamente recomendado que todo o código seja testado em um simulador antes de ser sintetizado em um FPGA. Nesta aula será apresentado um rápido tutorial de modelsim.

O processo de gravar o FPGA e testar é muito mais demorado do que simplesmente rodar o simulador. Além disso não existem muitas interfaces da FPGA com o mundo externo, é praticamente impossível saber sobre tudo que está acontecendo no seu sistema em tempo real. Alguns bugs são difíceis de serem encontrados em tempo de execução pois podem ocorrer só em situações especificas que demoram muito a acontecer ou por necessitar de vários equipamentos externos para simular a situação em que ocorreriam.

O Modelsim é um simulador de HDL (Hardware Description Language) desenvolvido pela Mentor Graphics. Ele suporta a simulação das linguagens VHDL e Verilog e pode simular o código a nível de RTL (Register Transfer Level) e Gate Level. Em nível de RTL é analisado o circuito a nível de comportamento dos registradores e em Gate Level é analisado a nível de netlist com inclusão de atrasos das portas lógicas e etc.


Neste tutorial vamos apresentar o que é necessário para realizar a simulação da aplicação e seu de comportamento.


Download do Modelsim

A primeira coisa que deve ser feita, é instalar o Modelsim no seu computador. Uma edição de graça do Modelsim para estudantes pode ser obtido no site da Altera. Recomendo o download junto com o Quartus 14.

É importante notar que a versão gratuita possui algumas limitações, tais como: limitação de performance, limite para o número de linhas de código executáveis e não trabalhar com duas linguagens em um mesmo projeto (misturar VHDL e Verilog).


Criar um TestBench

Uma das utilidades de VHDL é a simulação que é usada para estudar a operação de um circuito ou para verificar se um design está correto. Fazer uma simulação em VHDL é simular um experimento com um circuito físico, em que as entradas do circuito são conectadas a algum sinal de estímulo (por exemplo, um gerador de sinais) , e com isso, as saídas deste circuito podem ser observadas.

Simular uma lógica programada em VHDL é similar a fazer um experimento virtual, em que o circuito físico é substituído pela sua descrição em VHDL, bem como os estímulos de entrada e as saídas. Este conjunto de ferramentas e práticas são implantadas em um Testbench (arquivo de teste).

O código VHDL abaixo apresenta o arquivo testbench_pisca_led.vhd para o nosso exemplo.

library ieee; 
use ieee.std_logic_1164.all; 
entity testbench_pisca_led is 
end entity testbench_pisca_led; 
architecture rtl of testbench_pisca_led is 
signal clk: std_logic := '0'; 
signal rs: std_logic; 
signal led_status: std_logic; 
component pisca_led 
port 
( 
sys_clk_50mhz : in std_logic; 
sys_rst : in std_logic; 
led : out std_logic 
); 
end component; 
begin 
clk <= NOT clk after 10 ns; -- clock de 50 MHz 
pisca_led1: pisca_led PORT MAP(clk, rs, led_status); 
end architecture rtl;

Pode-se observar as entradas de estímulo criadas do clock de 50MHz e o sinal de reset. A saída é o led_status. (10ns para alto, 10ns para baixo = período de 20ns = frequência de 50 MHz).

Para melhor visualizar a simulação o código pisca_led.vhd teve a frequência de pisca alterada para um período de 10ms. Isso foi feito alterando o valor da comparação do sinal led_delay para 500000;

library ieee; 
use ieee.std_logic_1164.all; 
entity pisca_led is 
port 
( 
sys_clk_50mhz : in std_logic; 
sys_rst : in std_logic; 
led : out std_logic 
); 
end entity pisca_led; 
architecture rtl of pisca_led is 
signal led_delay : NATURAL range 0 to 50000000; 
signal led_reg : std_logic; 
begin 
led <= led_reg; -- Atribui a porta de saída chamada led o valor do registrador 
process(sys_clk_50mhz, sys_rst) -- Executado a cada pulso de clock ou reset 
begin 
if sys_rst = '0' then -- Reset assíncrono, independe do clock 
led_delay <= 0; 
led_reg <= '0'; 
elsif rising_edge(sys_clk_50mhz) then 
led_delay <= led_delay + 1; 
if led_delay = 500000 then 
led_delay <= 0; 
led_reg <= not led_reg; -- Inverte o valor do registrador do led 
end if; 
end if; 
end process; 
end architecture rtl;

A seguir será mostrado como criar um projeto no Modelsim para que os códigos apresentados sejam testados.

Criar um Projeto, Adicionar os Arquivos, e Compilar

Podemos então abrir o Modelsim. Isto deve ser o que você vai encontrar ao executar o Modelsim e clicar em Jumpstart pela primeira vez.

Fig68 DIG222802.png

Figura 1 - Informações sobre o projeto inicial.

Preencha as informações adequadamente e clique em Ok. Uma nova janela irá se abrir.


Fig69 DIG222802.png

Figura 2 - Adicionando arquivos ao projeto.

Se você já tem os arquivos .vhd do Testbench e do módulo disponível pisca_led , clique em ‘Add Existing File’ e adicione os arquivos ao projeto. Se não os tiver, o Modelsim possui um editor que pode ser utilizado para esse fim. Então clique em Create New File e copie o conteúdo para o novo arquivo. A tela do seu projeto deve ficar como mostra a Figura 3.

Fig70 DIG222802.png

Figura 3 - Visão da tela do projeto.

Não esqueça que você deverá ter os códigos dos dois arquvios: pisca_led.vhd e testebench_pisca_led.vhd.

Agora vamos compilar os arquivos para isto é só clicar em Compile > Compile All. Se não houver erros nos arquivos a seguinte mensagem irá aparecer na tela Transcript:


Fig71 DIG222802.png

Figura 4 - Visão da área da tela com as informações do Transcript.

Rodar a Simulação

Agora vamos rodar a simulação. Para isso clique em Simulate > Start Simulation... A seguinte tela vai aparecer:


Fig72 DIG222802.png

Figura 5 - Janela com as informações da Simulação.

Clicando em OK, deverá aparecer a tela de Wave -default. Caso não apareça, vá em View > Wave.


Fig73 DIG222802.png

Figura 6 - Janela da Simulação.

É possível observar os seguintes itens, descritos na imagem:

  • Tempo de simulação: Especifica o tempo de cada passo da simulação;
  • Instancias: Instâncias disponíveis;
  • Objects: Sinais disponíveis dentro da instância selecionada;
  • Wave: Analisador de ondas, onde é possível verificar os sinais em determinados instante de tempo.

Antes de começar a simulação, escolha os sinais de interesse que serão analisados. Para tal, selecione primeiramente a instância do testbench_pisca_led no Instance Viewer. Observe que os sinais clk, rs e led_status ficarão disponíveis em Objects. Arraste estes 3 sinais para a janela Wave. Em seguida, selecione a instância pisca_led1 e arraste o sinal led_delay para a janela Wave.

Na janela Wave, o sinal de reset não está sendo setado, e com isso ele está no estado unknown. Antes de simularmos temos que fazer com que o sinal rs fique em 0 para que ocorra o reset e os sinais sejam iniciados corretamente. Para fazer isso clique com o botão direito sobre o sinal rs. No menu que irá se abrir, clique em Forc... . Coloque value = 0 e clique em OK.


Fig74 DIG222802.png

Figura 7 - Atribuindo um valor a um sinal.


Em seguida, altere o tempo do passo da simulação para 10ms e clique em play. Essa operação irá levar algum tempo devido às limitações da versão free do Modelsim.

Altere o sinal de rs para 1 e rode novamente 10ms. Rode mais uma vez 10 ms.

Ao fim estará simulado 30 ms em que os primeiros 20 ms foram utilizados para dar reset no módulo de pisca_led e os próximos 10 ms foram utilizados para o led alterar seu status para 1.

Ao final da simulação, podemos observar o resultado na janela wave. O zoom (icone lupa) pode ser utilizado para melhor visualizar a simulação. Para observar o evento da alteração do status do led, selecione o sinal led_status e clique no botão para procurar o nível de borda. Conforme podemos observar na Figura 8.


Fig75 DIG222802.png

Figura 8 - Resultado da simulação.


Observamos que a simulação aconteceu conforme o esperado. A cada pulso de clock, o contador led_delay foi incrementado e quando atingiu o valor 500000 (10 ms) o valor de led_status foi alterado.

Conclusões

Simulações são de suma importância para o desenvolvedor VHDL, pois o tempo de compilação de tais ferramentas é excessivamente grande conforme o projeto vai aumentando de complexidade. Fica muito trabalhoso testar um design diretamente em um placa ou kit de desenvolvimento. Além disso, ela permite verificar se o comportamento está de acordo com o projetado antes de ir para o kit, permitindo encontrar possíveis “furos”.

Por fim, sugiro que você faça algumas modificações no código, principalmente para que a simulação não demore tanto. Isso pode ser feito alterando-se o valor de comparação do registrador led_delay.

Existem diversas formas de criar um testbench e testar um circuito, neste tutorial fiz de forma básica pois a intenção era mostrar o Modelsim! Mais para frente faço um post exclusivo sobre testbenchs.

Adaptamos esse Texto Original, publicado por Andre Prado em seu blog e escrito em conjunto com Raphael Silva.

Exercício

Um contador de Johnson é um circuito digital que consiste de uma série de flip-flops do tipo D ligados entre si num circuito de com realimentação da saída Q\ do último FF na entrada D do primeiro FF. Quando o circuito é acionado todas as saídas Q dos FF ficam em nível lógico zero, enquanto todas às saídas Q\ ficam em 1.

O diagrama de circuito para um contador Johnson de 4 bits é mostrada abaixo :


Fig43 DIG222802.png

Figura 9 - Contador Johnson.


O código VHDL para um contador Johnson de 4 bits é mostrado abaixo:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity johnson_counter is
port ( 
        DAT_O : out unsigned(3 downto 0);
        RST_I : in std_logic;
        CLK_I : in std_logic
        );
end johnson_counter;

architecture Behavioral of johnson_counter is

signal temp : unsigned(3 downto 0):=(others => '0');

begin

DAT_O <= temp;

process(CLK_I)
begin
    if( rising_edge(CLK_I) ) then
        if (RST_I = '1') then
            temp <= (others => '0');
        else
            temp(1) <= temp(0);
            temp(2) <= temp(1);
            temp(3) <= temp(2);
            temp(0) <= not temp(3);
        end if;
    end if;
end process;
    
end Behavioral;

O código testbench utilizado para testar o código é dada abaixo:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

ENTITY tb2 IS
END tb2;

ARCHITECTURE behavior OF tb2 IS 
   --Inputs
   signal RST_I : std_logic := '0';
   signal CLK_I : std_logic := '0';
    --Outputs
   signal DAT_O : unsigned(3 downto 0);
   -- Clock period definitions
   constant CLK_I_period : time := 1 ns;

BEGIN

    -- Instantiate the Unit Under Test (UUT)
   uut: entity work.johnson_counter PORT MAP (
          DAT_O => DAT_O,
          RST_I => RST_I,
          CLK_I => CLK_I
        );

   -- Clock process definitions
   CLK_I_process :process
   begin
        CLK_I <= '0';
        wait for CLK_I_period/2;
        CLK_I <= '1';
        wait for CLK_I_period/2;
   end process;

   -- Stimulus process
   stim_proc: process
   begin        
        RST_I <= '1';
      wait for 2 ns;    
        RST_I <= '0';
        wait for 2 ns;  
        RST_I <= '1';
        wait for 1 ns;  
        RST_I <= '0';
      wait;
   end process;

END;

Nota: Você deve definir um período de simulação de 1ns. Você deve, primeiramente, definir o sinal CLK_I como clock (botão direito do mouse > Clock...) e simular (botão run) para RST_I (botão direto do mouse > Force...) igual a 1, depois igual a zero (0).


A Figura 10 mostra o resultado esperado para as formas da onda da simulação.


Fig76 DIG222802.png

Figura 10 - Formas de ondas simuladas para o Contador Johnson.


Exemplos de códigos VHDL

http://wiki.sj.ifsc.edu.br/index.php/C%C3%B3digos_VHDL_para_uso_nas_Aulas


Organização das próxima aulas

Na próxima aula vamos conversar sobre o Altera Quartus II, que é um ambiente utilizado para o design de sistemas programáveis em Chip - system-on-a-programmable-chip (SOPC). A versão do Quartus II que será vista é 9.0 que oferece o máximo em desempenho e produtividade para projetos de FPGA, CPLD, entre outros.

Estudem!

Prof. Douglas A.

Referências

[1] https://www.altera.com/products/design-software/model---simulation/modelsim-altera-software.html

[2] http://www.embarcados.com.br/tutorial-de-modelsim-vhdl-fpga/




Icone voltar.png Icone menu.png Icone prox.png