220 likes | 333 Views
Projecto de Hardware com FPGAs. Integração Hardware-Software João M. P. Cardoso Email: jmcardo@ualg.pt URL: http://w3.ualg.pt/~jmcardo 2004/2005. FPGAs. FPGAs: Field-Programmable Logic Arrays Introduzidos no começo dos anos 80 Com crescente utilização
E N D
Projecto de Hardware com FPGAs Integração Hardware-Software João M. P. Cardoso Email: jmcardo@ualg.pt URL: http://w3.ualg.pt/~jmcardo 2004/2005
FPGAs • FPGAs: Field-Programmable Logic Arrays • Introduzidos no começo dos anos 80 • Com crescente utilização • Classe de dispositivos de Lógica Programável • Empresas representativas • Xilinx Inc. (www.xilinx.com) • Altera Inc. (www.altera.com)
FPGAs • Cada empresa tem um conjunto de FPGAs • Exemplo Xilinx • Spartan-II • Spartan-IIE • Spartan-III • Virtex • Virtex-II • Virtex-Pro • Virtex-4 (nova)
FPGAs • Estrutura genérica
Exemplo: Spartan-IIE 1.8V FPGA • Composto por 5 elementos principais: • IOBs permitem o interface entre os pinos do chip e a lógica interna • CLBs os elementos lógicos para construir funções • Blocos de RAM dedicados cada com 4096 bits • Interligações versáteis multi-nível • Clock DLLs: para compensação do atraso na distribuição do relógio e controlo do relógio
Exemplo: Spartan-IIE 1.8V FPGA • Cada CLB é constituído por dois Slices LC: logic cell Slice
Exemplo: Spartan-IIE 1.8V FPGA LUT: Look-Up Table • Geradores de funções: • Implementados com 4-input look-up tables (LUTs) • LUTs: Além de poderem ser utilizados para gerar funções: • Cada LUT pode ser utilizado como uma RAM síncrona de 16 x 1-bit s • 2 LUTs num slice podem ser combinados para produzir 16 x 2-bit or 32 x 1-bit RAM síncrona, • Ou uma 16 x 1-bit RAM síncrona de duplo porto. • LUTs permitem implementar 16-bit shift registers rápidos
Exemplo: Spartan-IIE 1.8V FPGA Elementos de armazenamento • Elementos de armazenamento podem ser configurados: • Flip-flops tipo D ou latches. • A entrada D pode vir de geradores de funções no slice ou diretamente das entradas do slice • Adicionalmente aos sinais Clock e Clock Enable, cada slice tem sinais de set ou reset síncronos ou assíncronos.
Exemplo: Spartan-IIE 1.8V FPGA • Estrutura do CLB
Exemplo: Spartan-IIE 1.8V FPGA • Blocos de RAM • Cada célula de RAM é constituída por uma memória síncrona, de duplo porto, de 4096 bits • O tamanho de bits de cada porto pode ser configurado independente
Exemplo: Spartan-IIE 1.8V FPGA • Programação do FPGA é constituída por ficheiros de bits cujo tamanho depende do sistema digital implementado
Projecto Hardware com FPGAs • Hardware a implementar é descrito numa linguagem de descrição de hardware (ex.: VHDL) • A ferramenta de síntese lógica encarrega-se de criar a estrutura do circuito que implementa a especificação • A ferramenta de Place & Route mapeia, coloca encaminha o circuito no FPGA utilizado • Ligação de sinais internos a pinos do dispositivo é realizada com indicações do programador: por atributos em VHDL ou com a utilização de um ficheiro de restrições (*.ucf) • Por último é gerado o código binário que programa o hardware
Projecto Hardware com FPGAs • Fluxo de projecto de hardware digital em FPGAs utilizando síntese lógica
Hierarquia no desenho? • Projectos com HDLs podem ser modelos planares com um único módulo ou constituídos por muitos módulos pequenos • Ambos têm vantagens e desvantagens • Contudo, com a complexidade dos FPGAs, a hierarquia é mais vantajosa • Vantagens dos desenhos com hierarquia • Verificação/simulação mais fácil e mais rápida • Possibilidade de vários engenheiros trabalharem no mesmo desenho ao mesmo tempo • Aumenta a velocidade da compilação do desenho • Reduz tempo de desenho, ao permitir a re-utilização de módulos neste e nos próximos desenhos • Desenhos mais fáceis de perceber • Fluxo de projecto mais fácil de gerir • Desvantagens dos desenhos com hierarquia: • Mapeamento do desenho no FPGA pode não ser tão boa entre fronteiras de módulos: pode causar menor utilização do dispositivo e diminuir a performance do desenho • Controlo do ficheiro do desenho torna-se mais difícil • Desenhos tornam-se mais verbose • Algumas destas desvantagens podem ser torneadas com uma escolha adequada da hierarquia
Utilização das RAM distribuídas do FPGA library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity ram_dist_single is generic( INIT_00: String := "1F1E1D1C1B1A191817161514131211100F0E0D0C0B0A0980706050403020100"; d_width : integer := 8; addr_width : integer := 5; mem_depth : integer := 32); port ( o : out STD_LOGIC_VECTOR(d_width - 1 downto 0); we, wclk : in STD_LOGIC; d : in STD_LOGIC_VECTOR(d_width - 1 downto 0); addr : in STD_LOGIC_VECTOR(addr_width - 1 downto 0)); end ram_dist_single; architecture xilinx of ram_dist_single is type mem_type is array (mem_depth - 1 downto 0) of STD_LOGIC_VECTOR (d_width - 1 downto 0); signal mem : mem_type; begin process(wclk, we, addr) begin if (rising_edge(wclk)) then if (we = '1') then mem(conv_integer(addr)) <= d; end if; end if; end process; o <= mem(conv_integer(addr)); end xilinx;
Utilização de blocos de RAM do FPGA library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity ram_block is generic( data_width : integer := 8; address_width : integer := 8; mem_depth : integer := 256); port( data : in std_logic_vector(data_width-1 downto 0); address : in std_logic_vector(address_width-1 downto 0); en, we, clk : in std_logic; q : out std_logic_vector(data_width-1 downto 0)); end ram_block; architecture rtl of ram_block is type mem_array is array (mem_depth-1 downto 0) of std_logic_vector (data_width-1 downto 0); signal mem : mem_array; attribute syn_ramstyle : string; attribute syn_ramstyle of mem : signal is "block_ram"; signal raddress : std_logic_vector(address_width-1 downto 0); begin l0: process (clk, address) begin if (clk = '1' and clk'event) then if (we = '1') then mem(CONV_INTEGER(address)) <= data; end if; end if; q <= mem(CONV_INTEGER(address)); end process; end rtl;
Utilização de blocos de RAM do FPGA library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity ram_block is generic( data_width : integer := 8; address_width : integer := 8; mem_depth : integer := 256); port( data : in std_logic_vector(data_width-1 downto 0); address : in std_logic_vector(address_width-1 downto 0); en, we, clk : in std_logic; q : out std_logic_vector(data_width-1 downto 0)); end ram_block; architecture rtl of ram_block is type mem_array is array (mem_depth-1 downto 0) of std_logic_vector (data_width-1 downto 0); signal mem : mem_array; attribute syn_ramstyle : string; attribute syn_ramstyle of mem : signal is "block_ram"; signal raddress : std_logic_vector(address_width-1 downto 0); begin l0: process (clk) begin if (clk = '1' and clk'event) then if (we = '1') then mem(CONV_INTEGER(address)) <= data; else q <= mem(CONV_INTEGER(address)); end if; end if; end process; end rtl;
Utilização de blocos de RAM do FPGA entity ram_block_dual is generic( data_width : integer := 8; address_width : integer := 8; mem_depth : integer := 256); port( data : in std_logic_vector(data_width-1 downto 0); address1, address2 : in std_logic_vector(address_width-1 downto 0); en, we, clk : in std_logic; q : out std_logic_vector(data_width-1 downto 0)); end ram_block_dual; architecture rtl of ram_block_dual is type mem_array is array (mem_depth-1 downto 0) of std_logic_vector (data_width-1 downto 0); signal mem : mem_array; attribute syn_ramstyle : string; attribute syn_ramstyle of mem : signal is "block_ram"; signal raddress : std_logic_vector(address_width-1 downto 0); begin WRITE: process (clk, address1) begin if (clk = '1' and clk'event) then if (we1 = '1') then mem(CONV_INTEGER(address1)) <= data; end if; end if; end process; READ: process (clk, address2) begin q <= mem(CONV_INTEGER(address2)); end process; end rtl;
Pipelining • Forma de aumentar o ritmo de computação • Inserir registos entre lógica de computação • Nos FPGAs os registos já existem
Sumário • FPGAs são dispositivos • Programáveis, substitutos de hardware, substitutos de tarefas desempenhadas por microprocessadores • Projecto parte de uma HDL: VHDL, por exemplo • Partir de software é um tópico muito importante de investigação: compiladores • Arquitectura é escolhida pelo projectista • Para se tirar partido dos recursos do FPGA é necessário • Ler com atenção as sugestões em termos de estilo de VHDL dadas pelo fabricante de FPGAs