Variáveis VHDL Explicadas: Exemplos Práticos & Regras para Design Confiável
No VHDL, variáveis comportam-se similarmente a variáveis em C: seu valor está disponível imediatamente após uma atribuição e permanece inalterado até a próxima atribuição. Isso as torna ideais para armazenamento temporário e cálculos procedurais dentro de um processo.
Regras Principais para Usar Variáveis em VHDL
- Variáveis são confinadas ao processo em que são declaradas.
- Cada processo tem seu próprio conjunto de variáveis; elas não podem ser compartilhadas entre processos.
- Declare variáveis entre a palavra-chave
processe a palavra-chavebegin. - Atribuições usam o operador
:=. - Uma vez atribuída, uma variável imediatamente mantém o novo valor para declarações subsequentes no mesmo processo.
O último ponto — atribuição instantânea — é frequentemente fonte de confusão. Abaixo está um exemplo conciso demonstrando como uma variável pode ser usada para concatenar dois sinais e impulsionar um case statement.
VAR_CASE : process (i_clk) variable v_Choices : std_logic_vector(1 downto 0); begin v_Choices := i_select_1 & i_select_2; -- concatenation case v_Choices is when "00" => o_data <= "0001"; when "01" => o_data <= "0010"; -- additional cases omitted for brevity end case; end process VAR_CASE;
Neste snippet, v_Choices está disponível para o case statement imediatamente após a concatenação, ilustrando a atualização instantânea da variável.
Para uma ilustração mais profunda, considere a seguinte arquitetura que rastreia um contador com duas cópias de sinal. Embora os dois sinais pareçam idênticos, apenas r_Var_Copy1 atinge o valor 5 antes do reset porque r_Var_Copy2 é atribuído após o contador já ter sido resetado no mesmo ciclo de clock.
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity variable_ex is port ( i_clk : in std_logic; o_done : out std_logic ); end variable_ex; architecture rtl of variable_ex is signal r_Done : std_logic := '0'; signal r_Var_Copy1 : natural range 0 to 5 := 0; signal r_Var_Copy2 : natural range 0 to 5 := 0; begin EX_VAR : process (i_clk) variable v_Count : natural range 0 to 5 := 0; begin if rising_edge(i_clk) then v_Count := v_Count + 1; r_Var_Copy1 <= v_Count; if v_Count = 5 then r_Done <= '1'; v_Count := 0; else r_Done <= '0'; end if; r_Var_Copy2 <= v_Count; end if; end process EX_VAR; o_done <= r_Done; end rtl;
Para observar esse comportamento em simulação, um testbench simples é fornecido. Ele alterna o clock e monitora a saída o_done. Ao usar ModelSim, lembre-se que variáveis aparecem na janela de waveform apenas se a opção de exibição de variáveis do simulador estiver habilitada.
library ieee; use ieee.std_logic_1164.all; entity variable_ex_tb is end variable_ex_tb; architecture behave of variable_ex_tb is component variable_ex port ( i_clk : in std_logic; o_done : out std_logic ); end component variable_ex; constant c_CLK_PERIOD : time := 10 ns; signal r_CLK : std_logic := '0'; signal w_DONE : std_logic; begin UUT : variable_ex port map ( i_clk => r_CLK, o_done => w_DONE ); r_CLK <= not r_CLK after c_CLK_PERIOD/2; end behave;
Este exemplo destaca os comportamentos distintos de variáveis versus sinais: enquanto r_Var_Copy1 atinge 5, r_Var_Copy2 nunca o faz porque a variável é resetada antes da atribuição do sinal.
VHDL
- Exemplo de Procedure VHDL: Incrementando um Standard Logic Vector
- Aproveitando Records VHDL para Interfaces FIFO Limpas e Reutilizáveis
- Configuração de Análise AC: Curvas, Pontos e Parâmetros de Varredura de Frequência
- Domine Variáveis e Tipos de Dados Primitivos em C#: Guia Completo
- Dominando Variáveis, Literais e Constantes em C++: Guia Completo
- Variáveis, Constantes e Literais em C: Um Guia Completo
- Entendendo Classes de Armazenamento em C: Escopo, Tempo de Vida e Performance
- Strings em C Facilitadas: Declaração, Entrada, Saída e Funções da Biblioteca
- Entendendo Tipos de Variáveis Java: Um Guia Abrangente
- Entendendo Variáveis em C: Tipos, Regras de Nomenclatura e Gerenciamento de Memória