Variables VHDL explicadas: Ejemplos prácticos y reglas para diseño fiable
En VHDL, las variables se comportan similar a variables en C: su valor está disponible inmediatamente después de una asignación y permanece inalterado hasta la siguiente asignación. Esto las hace ideales para almacenamiento temporal y cálculos procedimentales dentro de un proceso.
Reglas clave para usar variables en VHDL
- Las variables están confinadas al proceso en que se declaran.
- Cada proceso tiene su propio conjunto de variables; no pueden compartirse entre procesos.
- Declare variables entre la palabra clave
processy la palabra clavebegin. - Las asignaciones usan el operador
:=. - Una vez asignada, una variable mantiene inmediatamente el nuevo valor para sentencias subsiguientes en el mismo proceso.
El último punto —asignación instantánea— es a menudo fuente de confusión. A continuación un ejemplo conciso que demuestra cómo una variable puede usarse para concatenar dos señales y impulsar una sentencia case.
VAR_CASE : process (i_clk) variable v_Choices : std_logic_vector(1 downto 0); begin v_Choices := i_select_1 & i_select_2; -- concatenación case v_Choices is when "00" => o_data <= "0001"; when "01" => o_data <= "0010"; -- casos adicionales omitidos por brevedad end case; end process VAR_CASE;
En este fragmento, v_Choices está disponible para la sentencia case inmediatamente después de la concatenación, ilustrando la actualización instantánea de la variable.
Para una ilustración más profunda, considere la siguiente arquitectura que rastrea un contador con dos copias de señal. Aunque las dos señales aparecen idénticas, solo r_Var_Copy1 alcanza el valor 5 antes del reset porque r_Var_Copy2 se asigna después de que el contador ya se ha reiniciado dentro del mismo ciclo de reloj.
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 este comportamiento en simulación, se proporciona un testbench simple. Alterna el reloj y monitoriza la salida o_done. Al usar ModelSim, recuerde que las variables aparecen en la ventana de formas de onda solo si la opción de visualización de variables del simulador está 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 ejemplo destaca los comportamientos distintos de variables versus señales: mientras r_Var_Copy1 alcanza 5, r_Var_Copy2 nunca lo hace porque la variable se reinicia antes de la asignación de señal.
VHDL
- Configuración de análisis AC: Curvas, puntos y barrido de frecuencia
- Domine variables y tipos de datos primitivos en C#: Guía completa
- Dominando Variables, Literales y Constantes en C++: Guía Completa
- Variables, constantes y literales en C: guía completa
- Entendiendo las clases de almacenamiento en C: ámbito, vida y rendimiento
- Cadenas en C hechas fáciles: Declaración, entrada, salida y funciones de biblioteca
- Entendiendo las variables en C: Tipos, reglas de nomenclatura y gestión de memoria
- Entendiendo el Alcance de Variables en C++: Variables Locales vs Globales
- Ejemplo de procedimiento VHDL: Incrementando un vector Standard Logic
- Aprovechando records VHDL para interfaces FIFO limpias y reutilizables
- Entendiendo los Tipos de Variables en Java: Guía Completa