Simulando FPGA no ISE - Xilinx
José Rodrigo Furlanetto de Azambuja
Tópicos
• Histórico
• Fluxo de Projeto
• Linguagem VHDL
• Xilinx ISE - VHDL Prático
• Xilinx Spartan3
• Programação FPGA - Prático
Histórico
• Desenvolvido pelo Departamento de Defesa Americano (DoD)
• Padronizado pelo IEEE em 1993
– IEEE Std 1076-1987 – IEEE Std 1076-1993
• VHDL-AMS para circuitos analógicos
– IEEE Std 1076.1-1999
Linguagem de Descrição de Hardware
• Hardware Description Language (HDL)
• Very High Speed Integrated Circuit (VHSIC)
• VHSIC HDL (VHDL)
• Possível descrever HW em diferentes níveis
– Comportamental, equações lógicas, estrutural – Metodologia Top-Down
– Independente de tecnologia
Fluxo de Projeto
Sintaxe VHDL
• Não é case sensitive
• Caracteres especiais
– Comentários com dois traços (--)
– Fim de comando com ponto e vírgula (;) – Assinalamento de sinais com setas (<=)
– Assinalamento de variáveis com dois pontos e igual (:=)
• Nomes devem começar com letras
Elementos Estruturais
• Entity: define a interface
• Architecture: implementação da arquitetura
• Process: processos concorrentes controlados por eventos
• Library: bibliotecas de funções específicas
• Package: agrupa componentes, constantes e
tipos
Elementos Estruturais
library lib_name;
use lib_name.tipo library pack_name;
use pack_name.tipo entity e_name is
port (entrada1 : in tipo;
entrada2 : in tipo;
saida : out tipo);
end e_name
architecture ark_name of e_name is
<declaração de sinais>
<declaração de componentes>
begin
saida <= not signal_name;
<lógica combinacional>
process(entrada1)
<declaração de variáveis>
begin
if (entrada1 = ‘0’) then signal_name <= entrada2;
end if;
<lógica sequencial>
end process;
end ark_name;
Elementos Estruturais
library lib_name;
use lib_name.tipo library pack_name;
use pack_name.tipo entity e_name is
port (entrada1 : in tipo;
entrada2 : in tipo;
saida : out tipo);
end e_name
architecture ark_name of e_name is
<declaração de sinais>
<declaração de componentes>
begin
saida <= not signal_name;
<lógica combinacional>
process(entrada1)
<declaração de variáveis>
begin
if (entrada1 = ‘0’) then signal_name <= entrada2;
end if;
<lógica sequencial>
end process;
end ark_name;
library
Elementos Estruturais
library lib_name;
use lib_name.tipo library pack_name;
use pack_name.tipo entity e_name is
port (entrada1 : in tipo;
entrada2 : in tipo;
saida : out tipo);
end e_name
architecture ark_name of e_name is
<declaração de sinais>
<declaração de componentes>
begin
saida <= not signal_name;
<lógica combinacional>
process(entrada1)
<declaração de variáveis>
begin
if (entrada1 = ‘0’) then signal_name <= entrada2;
end if;
<lógica sequencial>
end process;
end ark_name;
package
Elementos Estruturais
library lib_name;
use lib_name.tipo library pack_name;
use pack_name.tipo entity e_name is
port (entrada1 : in tipo;
entrada2 : in tipo;
saida : out tipo);
end e_name;
architecture ark_name of e_name is
<declaração de sinais>
<declaração de componentes>
begin
saida <= not signal_name;
<lógica combinacional>
process(entrada1)
<declaração de variáveis>
begin
if (entrada1 = ‘0’) then signal_name <= entrada2;
end if;
<lógica sequencial>
end process;
end ark_name;
entity
Elementos Estruturais
library lib_name;
use lib_name.tipo library pack_name;
use pack_name.tipo entity e_name is
port (entrada1 : in tipo;
entrada2 : in tipo;
saida : out tipo);
end e_name
architecture ark_name of e_name is
<declaração de sinais>
<declaração de componentes>
begin
saida <= not signal_name;
<lógica combinacional>
process(entrada1)
<declaração de variáveis>
begin
if (entrada1 = ‘0’) then signal_name <= entrada2;
end if;
<lógica sequencial>
end process;
end ark_name;
architecture
Elementos Estruturais
library lib_name;
use lib_name.tipo library pack_name;
use pack_name.tipo entity e_name is
port (entrada1 : in tipo;
entrada2 : in tipo;
saida : out tipo);
end e_name
architecture ark_name of e_name is
<declaração de sinais>
<declaração de componentes>
begin
saida <= not signal_name;
<lógica combinacional>
process(entrada1)
<declaração de variáveis>
begin
if (entrada1 = ‘0’) then signal_name <= entrada2;
end if;
<lógica sequencial>
end process;
end ark_name;
process
Library IEEE
• IEEE.std_logic_1164
• IEEE.std_logic_textio
• IEEE.std_logic_arith
• IEEE.std_logic_signed
• IEEE.std_logic_unsigned
Entity
entityHALF_ADDER is port(A, B : instd_logic;
S, Carry : out std_logic);
end HALF_ADDER;
entityFULL_ADDER is
port(A, B : in std_logic_vector(7 downto 0);
S : outstd_logic_vector(7 downto 0);
Carry : outstd_logic);
end FULL_ADDER;
Tipos de Dados
• BOOLEAN is (FALSE, TRUE)
• BIT is (‘1’, ‘0’)
• CHARACTER is (--ascii set)
• INTEGER is (--definido pela implementação)
• REAL is (--definido pela implementação)
• BIT_VECTOR, STRING, TIME
std_logic
• IEEE.std_logic_1164
• Valores padronizados
• std_logic
• std_logic_vector
Declaração de Sinais
signal nome_signal : tipo := inicialização;
Assinalamento de Dados
Assinalamento de Dados
signal BYTE : std_logic_vector (7 downto 0);
signal A, B : std_logic_vector (3 downto 0);
• Concatenação
BYTE <= A & B;
BYTE <= A & ‘1’ & “000”;
• Agregação
(A, B) <= BYTE;
• Porções de array
BYTE(6 downto 3) <= A;
Tipos enumerados
type nome is tipo;
• Máquinas de Estado
– type estado is (idle, execute, finish);
• Matrizes
– type coluna is array(1 to 8) of integer;
– type matriz is array(1 to 8) of coluna;
– type matriz2 is array(1 to 8, 1 to 8) of std_logic;
Conversão de Tipos
Operadores
• Lógicos
– not, and, or, nand, nor, xor, xnor
• Relacional
– =, /=, <, <=, >=, >
• Shifts
– sll, srl, sla, sra, rol, ror
• Operadores aritméticos
– +, -, *, **, /, mod, rem, abs
Comandos Concorrentes
• Ordem não é importante
C <= A and B;
E <= C or D;
• Condicional
SAIDA <= VALOR1 when EXPRESSAO else VALOR2;
• Seletivo
whit EXPRESSAO select
SAIDA <= VALOR1 when ‘1’,
VALOR2 when others;
Processos
• Apenas comandos sequenciais
• Todos os processos rodam ao mesmo tempo de forma concorrente entre si
• Controlados por sinais de trigger
• Aceitam comandos de wait
Comando IF-THEN-ELSE
if CONDICAO1 then -- implementacao end if;
if CONDICAO1 then -- implementacao else
-- implementacao end if;
if CONDICAO1 then -- implementacao
elsif CONDICAO2 then -- implementacao
else
-- implementacao
end if;
Comando CASE
• Todas opções devem ser cobertas
• Valores simples
• Seleção de valores
• Intervalo de valores
• when others
Comandos de Loop
• FOR-LOOP
• WHILE-LOOP
FOR identificador IN range LOOP -- implementação
END LOOP;
WHILE identificador LOOP -- implementação
END LOOP;
Comando FOR-LOOP
process(A) begin
for i in (0 to 3) loop S(i) <= A(i);
end loop;
end process;
S(0) <= A(0);
S(1) <= A(1);
S(2) <= A(2);
S(3) <= A(3);
• O comando FOR- LOOP é sintetizável somente quando o range é fixo, ou seja, nao depende de
variáveis
• Repetição de um
trecho de código
Comando WAIT
• Evento de sinal
• Condição de sinal
• Tempo específico
• Indefinido
process(CLK) begin
wait on CLK if (CLK = ‘1’)…
end if;
wait until CLK = ‘1’
wait for 10 ns;
wait
end process;
Processos sensíveis ao Clock
• if/wait until (clock’EVENT and clock = ‘1’)
• if/wait until (not clock’STABLE and clock = ‘1’)
• if/wait until (RISING_EDGE(clock))
• wait until (clock = ‘1’)
process(clock) begin
if (clock’event and clock = ‘1’) then S <= D;
end if;
end process;
Variáveis
• Somente em processos
• Declaradas antes do begin
• Apenas localmente
• Variáveis globais não são sintetizáveis
architecture ark of XYZ is
signal A, B, C : integer range 0 to 7;
signal Y, Z : integer range 0 to 15;
begin
process (A, B, C)
variable M, N : integer range 0 to 7;
begin M := A;
N := B;
Z <= M+ N;
M := C;
Y <= M + N;
end process;
end ark;
Components
• Hierarquia de projeto
• Modularidade
Components
architecture ark of FULL_ADDER is component HALF_ADDER
port(A,B : in std_logic;
S, Carry : out std_logic);
end component;
signal sum_t, carry_t0, carry_t1;
begin
MODULE0 : HALF_ADDER
port map (A, B, sum_t, carry_t0);
MODULE1 : HALF ADDER
port map ( A => Cin, B => sum_t, S => S, Carry => carry_t1);
cout <= carry_t0 or carry_t1;
end ark;
Parte Prática 1
http://www.inf.ufrgs.br/~jrfazambuja/IEEE_CAS/
Parte Prática 1
• Identificar:
– Bibliotecas
– Interface do sistema – Arquitetura do módulo
• Quantos pinos de entrada existem?
• Quantos pinos de saída existem?
• Quantos sinais são utilizados?
• Quantos processos concorrentes existem?
• Onde são utilizadas as entradas do sistema?
• Onde são atribuídas as saídas do sistema?
Spartan3 XC3S200-FT256
Spartan3 XC3S200-FT256
Seven-Segment LED Display
Seven-Segment LED Display
Botões
• Ao apertar um botão é gerado um sinal HIGH
• Cada botão é
endereçado através de
um sinal na placa
Chaves
• Quando levantado, gera um sinal HIGH
• Quando embaixo, gera um sinal LOW
• Cada botão é
endereçado através de
um sinal na placa
Programação com JTAG
Parte Prática 2
http://www.inf.ufrgs.br/~jrfazambuja/IEEE_CAS/
Parte Prática 2
Parte Prática 2
• Aumentar as chances do jogador 3 vencer
• Diminuir os valores sorteados para 0-9
• Remover um jogador
In December 12 of 2008 in Porto Alegre, RS, Brazil.
General Chair
Thiago Rocha de Assis
Program Chair
Jefferson Luiz Bosa
Publicity Chair
Ricardo Augusto da Luz Reis
www.inf.ufrgs.br/ieeestudent