Escolar Documentos
Profissional Documentos
Cultura Documentos
Prototipao em PLDs
Tcnicas de Implementao em VHDL
Autor: Prof. Rodrigo Marques de Figueiredo
Agenda
Restries Recomendaes Biblioteca Xilinx (Primitivas)
Restries
Em descrio de hardware deve-se tomar cuidado com o hardware e no com a simplicidade do cdigo, pois muitas vezes isso causa dualidades que no podem ou so resolvidas de maneira errnea pelo sintetizador;
Para evitar problemas provenientes dessas dualidades deve-se seguir algumas restries.
Restries
Acumuladores ou registradores:
Sempre registr-los utilizando como referncia o clock do sistema para aquela determinada rea de hardware;
Ou seja, s haver espao para a utilizao do atributo event para os sinais de clock, caso outro sinal registre um determinado dado deve-se utilizar um circuito de sincronismo, como o do exemplo a seguir:
Restries
Circuito de Sincronismo:
Restries
Detectores de Borda:
Com a restrio de no utilizar indiscriminadamente o atributo event, fica a questo de como fazer um detector de borda sem a utilizao do mesmo; A soluo fazer um detector de borda amostrando o sinal de entrada. Com a opo por generic deste ter sada em nvel ou por toggle.
Restries
Detector de Borda:
Restries
Shift-Registers:
Para implementar um shift-register em VHDL deve-se utilizar o comportamento procedural de comandos dentro de um processo, fazendo um cdigo com a seguinte construo:
<sinal_sr>(0) <= <sinal_serial>; <sinal_sr>(7 downto 1) <= <sinal_sr>(6 downto 0);
Restries
Shift-Registers:
Esta decrio para o sintetizador da Xilinx (ISE) inferida diretamente em uma LUTSR para este trecho de hardware, o que gera um ganho na reduo do hardware da implementao.
Este fato muito importante para otimizao de espao em hardware e minimizao de rea em projetos com estas restries.
Restries
Multiplexadores:
Usar sempre o comando when para todas as ordens de multiplexao, quando esta for assncrona; Quando a multiplexao for obrigatoriamente sncrona, deve-se ento utilizar o comando case a partir da 3 ordem de multiplexao inclusive.
Restries
Comando For:
Em cdigos sintetizveis usado somente no set e reset de matrizes e barramentos interdependentes, ou em geraes rotas de implementao (for...generate); Para cdigos no sintetizveis pode ser utilizado normalmente sem quaisquer restries.
Restries
Comando While:
Nunca utilizar este comando para gerar um cdigo sintetizvel, pois este no possui inferncia coerente;
Para testes deve-se tomar muito cuidado em utilizar este comando, uma vez que seu comportamento sucetvel a diversos fatores, o torna o seu uso muito criterioso e por conseqncia de implementao demorada. Evitar este comando mesmo em cdigos no sintetizveis.
Recomendaes
As recomendaes visam alertar o projetista para a preveno de possveis problemas de implementao e ocupao de rea de hardware;
Outro tipo de problema a ser evitado a performance em termos computacionais, pois melhorando o roteamento melhora-se a velocidade mxima de operao do hardware.
Recomendaes
Operaes Aritmticas:
Como VHDL descrio de hardware e em neste tipo de implementao as operaes matemticas no so de fcil implementao no que se trata de ocupao de rea, deve-se ento ter em mente o seguinte: Em hardware existe apenas 1 funo diretamente implementvel que a soma; A multiplicao pode ser dada de maneira indireta, atravs da tcnica de multiplicar analgicamente e decodificar para digital.
Recomendaes
Soma / Subtrao:
Otimizadas para uso diretamente em VHDL; Deve-se cuidar o uso da subtrao no caso de nmeros negativos (atentar para o complemento de 2);
Tambm atentar para a necessidade ou no do uso da library signed e unsigned.
Recomendaes
Multiplicao:
Pode-se utilizar a multiplicao diretamente no cdigo com um smbolo (*);
Para obter-se performance e otimizao de rea em hardware deve-se utilizar a instanciao de uma primitiva hardcore; Com esta abordagem pode-se inclusive conseguir-se um reaproveitamento de multiplicadores.
Recomendaes
Multiplicao:
Recomendaes
Diviso:
Deve-se ter o mesmo cuidado dado a multiplicao; Exige-se uma ateno extra para com o truncamento de bits que deve ser feito de maneira criteriosa;
No existe uma primitiva para divises, mas sim tcnicas para o uso de multiplicadores associados a divisores binrios (shift de bits).
Recomendaes
Encoders / Decoders:
Sempre que possvel (99,99% das vezes) utilizar o comando case para implementar um encoder/decoder;
Pois o sintetizador reconhece neste comando o indicador para o uso de uma estrutura de uma ULA (encoder), o que prov uma maior otimizao na sntese para hardware.
Recomendaes
Mquinas de Estado Finito:
Usar sempre mquinas de estado usuais, Mealy e Moore Observar a aplicao para qual as caractersticas destas so utilizadas;
Dar preferncia a mquina Moore, pois esta tem melhor performance em FPGAs (esta possui uma simplificao de hardware maior na arquitetura que estes utilizam para sua implementao).
Recomendaes
Generate:
Usar sempre que possvel este comando, pois assim pode-se parametrizar o cdigo (alm de deix-lo mais limpo ) Cria previses rotas de debug no hardware, e diminui o tempo de preparo de setup de teste;
O hardware descrito pode ser alterado de maneira simples.
Biblioteca Xilinx
Multiplicadores:
MULT18X18_inst : MULT18X18 port ( P : out std_logic_vector(35 downto 0); A : in std_logic_vector(17 downto 0); B : in std_logic_vector(17 downto 0) );
Biblioteca Xilinx
Biblioteca Xilinx
IOBs:
IBUFGDS_inst : IBUFGDS generic ( IOSTANDARD : string := DEFAULT ); port ( O : out std_logic; I : in std_logic; IB : in std_logic );
Diferencial
Biblioteca Xilinx
IOBs:
IBUFG_inst : IBUFG generic ( IOSTANDARD : string := "DEFAULT" ); port ( O : out std_logic; I : in std_logic );
Single-end
Biblioteca Xilinx
Biblioteca Xilinx
: out std_logic_vector(15 downto 0); : out std_logic_vector(15 downto 0); : out std_logic_vector(1 downto 0); : out std_logic_vector(1 downto 0); : in std_logic_vector(9 downto 0); : in std_logic_vector(9 downto 0); : in std_logic; : in std_logic; : in std_logic_vector(15 downto 0); : in std_logic_vector(15 downto 0); : in std_logic_vector(1 downto 0); : in std_logic_vector(1 downto 0); : in std_logic; : in std_logic; : in std_logic; : in std_logic; : in std_logic; : in std_logic
Biblioteca Xilinx
Biblioteca Xilinx
DCM_inst : DCM generic ( CLKDV_DIVIDE CLKFX_DIVIDE CLKFX_MULTIPLY CLKIN_DIVIDE_BY_2 CLKIN_PERIOD CLKOUT_PHASE_SHIFT CLK_FEEDBACK DESKEW_ADJUS DFS_FREQUENCY_MODE DLL_FREQUENCY_MODE DUTY_CYCLE_CORRECTION FACTORY_JF PHASE_SHIFT STARTUP_WAIT )
: real := 2.0; : integer := 1; : integer:= 4; : boolean := FALSE; : real := 0.0; : string := NONE; : string := "1X"; : string := "SYSTEM_SYNCHRONOUS"; : string := "LOW"; : string := "LOW"; : string := TRUE; : std_logic_vector(15 downto 0) := X"C080"; : integer := 0; : boolean := FALSE
: out std_logic; : out std_logic; : out std_logic; : out std_logic; : out std_logic; : out std_logic; : out std_logic; : out std_logic; : out std_logic; : out std_logic; : out std_logic; : out std_logic_vector(7 downto 0); : in std_logic; : in std_logic; : in std_logic; : in std_logic; : in std_logic; : in std_logic
Prototipao em PLDs
Obrigado!