Procesar declaración en vhdl

0

Tengo una pregunta muy básica aquí. Cuando aprendí los procesos, se dijo que las declaraciones se producen de forma secuencial. Esto es lo que creía. En el archivo de imagen del proceso NCO, hay pruebas de ello. fword se asigna con un valor y nco_acc se incrementa en la siguiente declaración y en la tercera clk_pn se asigna. En el segundo archivo de imagen, se han dado los resultados de síntesis correspondientes. Cuando el reinicio se reduce, fword obtiene su valor en el primer borde positivo del reloj y en el siguiente borde nco_acc se incrementa y en el siguiente borde clk_pn se asigna el msb del nco_acc. Hasta aquí no hay problema. Luego encontré otro problema. En la otra imagen hay un proceso resaltado. aquí también hay dos declaraciones dentro de la declaración del proceso en la parte else. Pero sucedió al mismo tiempo. Las declaraciones ocurrieron en el mismo ciclo de reloj.

¿Qué debo concluir?

¿Cuándo es secuencial y cuándo no?

NCO:process(clk,reset)
          begin
            if (reset='1') then
              clk_pn<='0';
              nco_acc<=(others=>'0');
              fword<=(others=>'0');
            elsif (rising_edge(clk) ) then
               fword<=fword1(conv_integer(outp_sm));
               nco_acc<=nco_acc+fword;
               clk_pn<=nco_acc(nco_pngen_res-1);
            end if;
          end process NCO;


  process(reset,clk,car_change)
        begin
         if reset='0' or car_change = '1' then
            g2codereg <= "1111111111";
         elsif clk'event and clk='1' then
            g2codereg(1)           <= g2codereg(2) xor g2codereg(3) xor 
                                    g2codereg(6) xor g2codereg(8) xor 
                                g2codereg(9) xor g2codereg(10);
            g2codereg(10 downto 2) <= g2codereg(9 downto 1);
         end if;
       end process;
    

2 respuestas

1

Las declaraciones dentro de process se ejecutan de manera secuencial, pero todas se ejecutan cada vez que se activa el proceso (según lo define su lista de sensibilidad).

Normalmente, todo el proceso se ejecutará una vez por cada flanco de reloj, lo que significa que cualquier salida (señales o variables) que se asignen dentro del proceso puede todas actualizarse en cualquier flanco de reloj dado.

En este caso, "secuencial" se refiere a las relaciones entre las declaraciones dentro del proceso , pero no tiene relación con su interacción con el resto del diseño.

    
respondido por el Dave Tweed
0

El problema no es con las declaraciones secuenciales, es más fundamental tener que ver con las señales.

Ninguna actualización de señal tiene efecto mientras que cualquier proceso aún no se ha suspendido en el ciclo de simulación actual. Las actualizaciones del controlador de señal se programan en colas de forma de onda de salida proyectada . Una señal retiene su valor a lo largo de todo el ciclo de simulación actual, que dura hasta que cada proceso excitado por un evento en una señal que es sensible a suspender.

Esta actualización de señal:

    fword <= fword1(conv_integer(outp_sm)); 

no está disponible para la siguiente declaración secuencial:

    nco_acc <= nco_acc+fword; 

hasta después del siguiente evento que permita la ejecución del proceso de cierre si es una declaración (en el siguiente flanco ascendente del reloj).

Sus otros usos consecutivos se efectúan de manera similar. Los valores intermedios deben usar variables o involucrar la asignación de señales concurrentes.

El uso de variables intermedias se vería así:

NCO:
    process (clk, reset)
        variable fword_var:    std_logic_vector(fword'range);
        variable nco_acc_var:  std_logic_vector(nco_acc'range);
    begin               
        if reset = '1' then
            clk_pn <= '0';
            nco_acc_var := (others => '0');
            fword_var := (others => '0');
        elsif rising_edge(clk)  then
            fword_var := fword1(conv_integer(outp_sm));
            nco_acc_var := nco_acc + fword_var;
            clk_pn <= nco_acc_var(nco_pngen_res - 1);
        end if;
        fword <= fword_var;
        nco_acc <= nco_acc_var;
    end process;

Una solución que utiliza asignación de señal concurrente probablemente proporcionaría señales intermedias como entrada para señalar las asignaciones en el proceso.

    
respondido por el user8352

Lea otras preguntas en las etiquetas