Error VHDL: Coudl no implementa el registro en este borde del reloj

2

Quiero restablecer la variable v_count a 0 en el borde ascendente de la entrada puerto i_pulse_run . Pero me salen los siguientes errores:

  

Error: No se pudo implementar el registro en este borde del reloj.
  Error (10821): error de HDL en PWM_Gen.vhd (85): no se puede inferir el registro para   "CTRL: v_count [15]" porque su comportamiento no coincide con ningún soporte   modelo de registro.

¿De qué otra manera puedo restablecer la variable a 0. Quiero restablecerla solo en la flanco ascendente de la señal i_pulse_run .

Cualquier sugerencia es bienvenida. Gracias

LIBRARY IEEE;
USE IEEE.numeric_std.all;
USE IEEE.std_logic_1164.all;
..
..
..
CTRL : PROCESS(i_Reset, i_Clock,i_pwm_pulse_run)

variable v_PWMout        : std_logic;          
variable v_intPWMvalue    : integer range 0 to 8192;  
variable  v_updatePWMvalue  : std_logic;          
variable v_count : integer range 0 to 65535;

begin
if i_Reset = '0' then
  -- Asynchronous reset
  o_PWM        <= '0';
  s_PWMCounter     <= 0;
  v_updatePWMvalue  := '0';
elsif rising_edge(i_Clock) then
-- Increment the PWM counter

   if s_PWMCounter < i_PWM_Freq_Div - 1 then
      s_PWMCounter   <= s_PWMCounter + 1;
   else
      s_PWMCounter   <= 0;
      if rising_edge(i_pulse_run) then
          v_count := 0; -- Error 
      end if;
      if i_pwm_pulse_en = '1' AND  v_count < i_pulse_count +1 then
         v_count := v_count + 1;
      end if;
end if;

..
..
end if;
end process CTRL;
    
pregunta Alex

3 respuestas

1

Los D-Flops solo son sensibles al flanco ascendente de un reloj. En su caso, no desea realmente que cambie en el borde ascendente de i_pulse_run porque el resto de su circuito está desactivado i_clock; lo que debe hacer es tener otro registro que guarde el valor de i_pulse_run en cada ciclo de reloj, y luego, cuando el valor de entrada de i_pulse_run ! = guardado i_pulse_run , estará en el borde ascendente.

    
respondido por el pjc50
0

Está intentando diseñar un registro que se actualice en los flancos ascendentes simultáneos de i_Clock y i_pulse_run. Evita los bordes anidados.

    
respondido por el PFA
0

Lo que quieres hacer es:

begin if i_Reset = '0' then -- Asynchronous reset o_PWM <= '0'; ... elsif rising_edge(i_Clock) then ---This is what is important i_pulse_run_prev <= i_pulse_run; ---!!---------------------------- -- Increment the PWM counter if s_PWMCounter < i_PWM_Freq_Div - 1 then s_PWMCounter <= s_PWMCounter + 1; else s_PWMCounter <= 0; if rising_edge_pulse_run then v_count := 0; elsif i_pwm_pulse_en = '1' AND v_count < i_pulse_count +1 then v_count := v_count + 1; end if; end if; end process CTRL;

rising_edge_pulse_run < = i_pulse_run y no i_pulse_run prev;

    
respondido por el Jotorious

Lea otras preguntas en las etiquetas