Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> VHDL

Aproveitando Records VHDL para Interfaces FIFO Limpas e Reutilizáveis

No VHDL, records oferecem uma maneira poderosa de simplificar seu design, assim como structs em C. Agrupando sinais relacionados em um único tipo, você pode reduzir drasticamente duplicação de código, melhorar legibilidade e simplificar port maps em múltiplas entidades.

Records brilham quando você trabalha com interfaces grandes e recorrentes — como aquelas conectando a memórias off-chip ou FIFOs — onde o mesmo conjunto de sinais de controle e dados aparece repetidamente. Definir um record uma vez em um pacote e reutilizá-lo em todo lugar mantém suas interfaces de entidade organizadas e facilita modificações futuras.

O exemplo a seguir demonstra como criar dois tipos de record em um pacote dedicado (example_record_pkg.vhd) e usá-los para modelar sinais de entrada e saída de um FIFO. Um único sinal record representa todas as entradas do FIFO, e outro representa todas as saídas para o FIFO.

Principais conclusões:

  1. Records simplificam declarações de entidade e port maps em VHDL.
  2. Podem conter elementos de tipos variados — std_logic, integer, std_logic_vector, etc.
  3. Records são análogos a structs em C, fornecendo paradigma familiar para muitos engenheiros.
  4. Tipos de record compartilhados devem residir em um único pacote para consistência.
  5. Sinais record podem ser inicializados com constantes para valores de inicialização previsíveis.
  6. Arrays de records permitem manipulação estruturada de dados, como tabela de configurações de FIFO.

Abaixo está a definição do pacote, seguida por uma entidade de exemplo que usa os tipos de record para gerenciar lógica de leitura/escrita de FIFO. O código é totalmente compatível com o padrão IEEE 1076-2008.

 library ieee; use ieee.std_logic_1164.all; package example_record_pkg is -- Outputs from the FIFO. type t_FROM_FIFO is record wr_full : std_logic; -- FIFO Full Flag rd_empty : std_logic; -- FIFO Empty Flag rd_dv : std_logic; rd_data : std_logic_vector(7 downto 0); end record t_FROM_FIFO; -- Inputs to the FIFO. type t_TO_FIFO is record wr_en : std_logic; wr_data : std_logic_vector(7 downto 0); rd_en : std_logic; end record t_TO_FIFO; constant c_FROM_FIFO_INIT : t_FROM_FIFO := (wr_full => '0', rd_empty => '1', rd_dv => '0', rd_data => (others => '0')); constant c_TO_FIFO_INIT : t_TO_FIFO := (wr_en => '0', wr_data => (others => '0'), rd_en => '0'); end package example_record_pkg; 
 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use work.example_record_pkg.all; -- USING PACKAGE HERE! entity example_record is port ( i_clk : in std_logic; i_fifo : in t_FROM_FIFO; o_fifo : out t_TO_FIFO := c_TO_FIFO_INIT -- intialize output record ); end example_record; architecture behave of example_record is signal r_WR_DATA : unsigned(7 downto 0) := (others => '0'); begin -- Handles writes to the FIFO p_FIFO_WR : process (i_clk) is begin if rising_edge(i_clk) then if i_fifo.wr_full = '0' then o_fifo.wr_en <= '1'; o_fifo.wr_data <= std_logic_vector(r_WR_DATA + 1); end if; end if; end process p_FIFO_WR; -- Handles reads from the FIFO p_FIFO_RD : process (i_clk) is begin if rising_edge(i_clk) then if i_fifo.rd_empty = '0' then o_fifo.rd_en <= '1'; end if; end if; end process p_FIFO_RD; end behave; 

VHDL

  1. Introdução ao VHDL: Construindo sua Primeira Porta AND
  2. Guia Completo de Conversões de Tipos VHDL com Numeric_Std e Std_Logic_Arith
  3. Exemplo de Procedure VHDL: Incrementando um Standard Logic Vector
  4. Dominando Tipos Signed vs Unsigned em VHDL: Insights Práticos
  5. Variáveis VHDL Explicadas: Exemplos Práticos & Regras para Design Confiável
  6. Configuração de Análise AC: Curvas, Pontos e Parâmetros de Varredura de Frequência
  7. A Arte e o Processo de Produção de Discos LP
  8. Dominando Verificação Formal de Módulos VHDL com PSL
  9. Criando Listas de Strings em VHDL: Boas Práticas e Exemplo
  10. Dominando Declarações Generate em VHDL: Construa Debouncers Reutilizáveis com Facilidade