Você está na página 1de 30

Universidade do Vale do Rio dos Sinos - UNISINOS

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

Utilizao da Biblioteca Xilinx:


- Para utilizar-se as bibliotecas Xilinx deve-se utilizar a library unisim; - No sintetizador a simples declarao da library j suficiente para a mesma passar a ser reconhecida - J no simulador ser necessrio (caso no este no possua) a instalao de um pacote de suporte a compilao e simulao das primitivas. - Esta library declarada da seguinte forma:
library unisim; use unisim.vcomponents.all;

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

Block RAM (BRAM):

Biblioteca Xilinx

Block RAM (BRAM):


RAMB16_S18_S18_inst : RAMB16_S18_S18 generic ( INIT_A : bit_vector(19 downto 0) := x"00000"; INIT_B : bit_vector(19 downto 0) := x"00000; SRVAL_A : bit_vector(19 downto 0) := x"00000"; SRVAL_B : bit_vector(19 downto 0) := x"00000"; WRITE_MODE_A : string := "WRITE_FIRST"; WRITE_MODE_B : string := "WRITE_FIRST"; SIM_COLLISION_CHECK : string := "ALL"; -- Espao de memria RAM INIT_00 : bit_vector(255 downto 0) := x"00...00"; . . . INIT_3F : bit_vector(255 downto 0) := x"00...00"; -- Espao de memria RAM (paridade) INITP_00 : bit_vector(255 downto 0) := x"00..00"; . . . INITP_07 : bit_vector(255 downto 0) := x"00...00" )
port ( DOA DOB DOPA DOPB ADDRA ADDRB CLKA CLKB DIA DIB DIPA DIPB ENA ENB SSRA SSRB WEA WEB );

: 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

Digital Clock Manager (DCM):

Biblioteca Xilinx

Digital Clock Manager (DCM):


port ( clk0 clk180 clk270 clk2x clk2x180 clk90 clkdv clkfx clkfx180 locked psdone status clkfb clkin psclk psen psincdec rst );

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

Universidade do Vale do Rio dos Sinos - UNISINOS

Prototipao em PLDs
Obrigado!

Você também pode gostar