variable una signal multiplicacion inicializar hexadecimal example como array vhdl

una - VHDL Variable vs. Señal



variables en vhdl (5)

He estado leyendo un texto (no lo tengo enfrente, así que no puedo dar el título) sobre la programación de VHDL. Un problema que me ha costado entender el texto es cuándo usar una variable frente a una señal. Creo que tengo un claro entendimiento de cuándo usar una señal (señal interna que es) pero no tanto para una variable.

Noté que el texto generalmente declara e inicializa señales antes de definir un proceso, mientras que una variable se declara (y supongo que nunca se inicializa ..) dentro de un proceso.

De todos modos, para aclarar eso, ya sea por definición o por ejemplo, ¡sería genial!



Las variables están destinadas a ser utilizadas para almacenar un valor dentro de un proceso. Como tal, su alcance es limitado. Tiende a haber una relación menos directa con el hardware sintetizado.

Las variables también obtienen un valor inmediatamente, mientras que las señales no lo hacen. Los dos procesos siguientes tienen el mismo efecto:

signal IP, NEXTP : STD_LOGIC_VECTOR(0 to 5); process (CLK) Variable TEMP : STD_LOGIC_VECTOR(0 to 5); begin if (rising_edge(clk)) then TEMP := IP; IP <= NEXTP; NEXTP <= TEMP(5) & TEMP(0 to 4); end if; end process;

signal IP, NEXTP : STD_LOGIC_VECTOR(0 to 5); process (CLK) begin if (rising_edge(clk)) then IP <= NEXTP; NEXTP <= IP(5) & IP(0 to 4); end if; end process;

Esto se debe a que las actualizaciones se programan, pero aún no han cambiado. el <= incluye un elemento temporal


Las variables se utilizan cuando se desea crear un código serializado, a diferencia del código paralelo normal. (Serializado significa que los comandos se ejecutan en su orden, uno después del otro en lugar de juntos). Una variable solo puede existir dentro de un proceso, y la asignación de valores no es paralela. Por ejemplo, considere el siguiente código:

signal a,b : std_logic_vector(0 to 4); process (CLK) begin if (rising_edge(clk)) then a <= ''11111''; b <= a; end if; end process;

pondrá en b el valor de a antes de que se ''11111 el proceso, y no ''11111 ''. Por otro lado, el código:

signal a,b : std_logic_vector(0 to 4); process (CLK) variable var : std_logic_vector(0 to 4); begin if (rising_edge(clk)) then var := ''11111''; a <= var; b <= var; end if; end process;

pondrá el valor ''11111'' en a y b .

Francamente, en mi experiencia, la mayoría de las veces no necesita usar variables, el único lugar donde lo usé fue en un bucle en el que necesitaba comprobar si alguna de las señales es 1:

type BitArray is array (natural range <>) of std_logic; --... entity CAU_FARM is port ( -- IN -- REQUEST : in BitArray(0 to (FLOW_num -1)); --.. ); end CAU_FARM; --... farm_proc: process(CLK_FARM, RESET) variable request_was_made_var : std_logic; begin if RESET = C_INIT then -- ... elsif rising_edge(CLK_FARM) then -- read state machine -- case read_state is when st_read_idle => request_was_made_var := ''0''; for i in 0 to (FLOW_num -1) loop if (REQUEST(i) = ''1'') then request_was_made_var := ''1''; end if; end loop; if (request_was_made_var = ''1'') and (chosen_cau_read_sig /= 8) then read_state <= st_read_stage_1; for i in 0 to (FLOW_num -1) loop if (i = choice_out_sig) then ACKNOWLEDGE(i) <= ''1''; end if; end loop; else read_state <= st_read_idle; end if; ------------------------ when st_read_stage_1 => --...


Variables: son locales a un proceso, su valor se actualiza tan pronto como la variable obtiene un nuevo valor.

Las variables compartidas son similares a las variables, pero se puede acceder a ellas desde diferentes procesos.

Señales: su alcance es mayor, todos los procesos pueden acceder a las señales declaradas en la arquitectura o en un bloque específico (si existe). Hay actualizaciones de valor después de que el proceso se suspende o encuentra una declaración de espera.


variables : ubicación temporal; se utilizan para almacenar valores intermedios dentro de "proceso".

Señales : Actualizar valores de señal. El proceso de ejecución se activa mediante cambios en la señal. Mientras el proceso ejecuta todas las señales en el sistema no se modifica.

Diferencias:

variables : son locales; sin demora; declarado dentro del proceso

Señales : son globales (antes de comenzar); retraso debido al cable; declarado antes de que comience la palabra clave