¿Cuándo se ejecuta la asignación de señal concurrente?

2

Teniendo el siguiente código:

library IEEE;
use IEEE.std_l0gic_1l64.all;
—— entity
entity t_ff_s is
   port ( T,$,CLK : in std_logic;
          Q       : out std_log1c);
end t_ff_s;
—— entity

architecture my_t_ff_s of t_ff_s is
   signal t_tmp : std_logic;   —— intermediate signal declaration

begin
   tff: process (S,CLK)

   begin
      if (S I '0') then
         t_tmp <= '1';
      elsif (rising_edge(CLK)) then
         t_tmp <= T XOR t_tmp;   —— temp output assignment
      end if;
   end process tff;

   Q <= t_tmp;                   —— final output assignment
end my_t_ff_s;

Entiendo que el " proceso " y la " asignación de señal concurrente " se ejecutan simultáneamente y debido a que " Q " es una salida no se puede colocar en el lado derecho de " <=" y es por eso que la señal " t_tmp " se usa para poder hacer el Operación XOR. Mi pregunta es ¿en qué momento se ejecuta " Q < = t_tmp "? ¿Se realiza inmediatamente después de asignar un valor a la señal " t_tmp " en cualquier punto dentro de la declaración del proceso? ¿O se hace al final después de que se ejecutan todas las líneas en la declaración de proceso?

En la respuesta de esta publicación VHDL - ¿Cómo se ejecuta un proceso concurrentemente con otros procesos y componentes mientras se ejecuta de forma secuencial? Leí que" se dice que las señales retienen la última asignación es un proceso "así que creo que la asignación se realiza al final del proceso, independientemente de cuántas veces se asigna un valor diferente a" t_tmp ". ¿Estoy en lo correcto?

    
pregunta m4l490n

2 respuestas

5

Cuando se busca entender qué está sucediendo en una HDL en general, es una buena idea pensar qué está pasando en el hardware real. No hay un concepto de "ejecución" en un FPGA de la misma manera que hay en una CPU. Me enseñaron que cuando lees una declaración concurrente, la lees como Q is driven by not out1 .

En hardware, la declaración concurrente anterior ( Q <= not out1 ) es equivalente a esto:

simular este circuito : esquema creado usando CircuitLab

¿Cuándo cambia la salida? Después de que los cambios de entrada + algún retraso es una característica del chip. ¿Esto se llama ejecución? No.

Los procesos se construyen utilizando flip flops que están sincronizados. Por ejemplo, esto:

p1:process(clk)
begin
  if rising_edge(clk) then
    b <= a
    c <= b
  end if;
end process;

produce

simular este circuito

Dado que el flip flop está sincronizado, las salidas controladas solo cambian en el borde del reloj, aunque la entrada haya cambiado en algún momento anterior. ¿Podría esto ser llamado ejecución? No.

Escribir HDL realmente necesita un cambio de mentalidad de la CPU a un lugar donde realmente consideres las implicaciones de hardware de lo que estás codificando. Estás describiendo el hardware.

Como ejercicio, eche un vistazo al diagrama de bloques final del código que escribe una vez que se ha creado y vea si puede identificar dónde están las declaraciones concurrentes y dónde están los procesadores. es bastante interesante ver.

Descargo de responsabilidad: he simplificado bastante lo que sucede en el FPGA. No utiliza puertas discretas y tampoco creo que use chancletas tipo D, por lo que hay algunas imprecisiones aquí, elegí esos componentes con fines ilustrativos.

    
respondido por el stanri
1

Las sentencias concurrentes se ejecutan siempre que hay un cambio en el valor de las señales en el lado derecho de la sentencia.

Su declaración Q<=t_temp se ejecutará siempre que ocurra un cambio en el valor de t_temp y la acción suceda inmediatamente después de la asignación de la señal.

\ $% Por esta declaración, * "se dice que las señales retienen la última asignación en un proceso" *, creo que quiso decir que el valor estable de una señal después de ejecutar un proceso es el último valor asignado a ello en el proceso. \ $

Por ejemplo, si la asignación se realiza al final del proceso, el siguiente código siempre producirá la salida Q <= 0 y no lo creo.

p1:process(clk)
  begin
    if clk = '1' then
      count <= Count-1;
  end process;

p2:process(trigger)
  begin
    if trigger = '1' then
       out1 <= '0'
       wait until count = 0;
    end if;
    out1 <= '1'
  end process;

Q <= not out1;
    
respondido por el nidhin

Lea otras preguntas en las etiquetas