Estoy tratando de sintetizar un diseño en VHDL en un ProASIC3 FPGA usando el Synplify Pro de la herramienta. El informe de síntesis, me da el siguiente mensaje de advertencia en la inferirse de los relojes.
@W:MT420 : | Found inferred clock counter_unit| pstate_inferred_clock[1] with period 10.00ns. Please declare a user-defined clock on object "n:bcu_ins.ctr_ins.pstate[1]"
Me remonta a la parte del código donde la advertencia se genera y el mismo se reproduce aquí por referencia.
p_fsm_clk : process(reset_n_in, clk_25mhz_in)
begin
if (reset_n_in = '0') then
pstate <= s0;
elsif rising_edge(clk_25mhz_in) then
pstate <= nstate;
end if;
end process p_fsm_clk;
p_fsm : process(pstate,restart_ctr,enable_ctr2,sys_fail)
begin
start_ctr1 <= '0';
start_ctr2 <= '0';
case pstate is
when s0 =>
--Reset state. All counters are reset
if (sys_fail = '0' and restart_ctr = '1') then
nstate <= s1; --move to start counter1
else
nstate <= s0;
end if;
when s1 =>
start_ctr1 <= '1'; --Initiate counter1
if (restart_ctr = '1') then
--restart the counters
start_ctr1 <= '0'; --reset counter1
nstate <= s1;
elsif (enable_ctr2 = '1') then
--move to start counter2
nstate <= s2;
else
nstate <= s1;
end if;
when s2 =>
--Save the counter1 value and start counter2
start_ctr2 <= '1'; --assert flag to start counter2
if (restart_ctr = '1') then
--restart the counters
nstate <= s1;
else
nstate <= s3;
end if;
when s3 =>
start_ctr2 <= '1';
if (sys_fail = '1') then
nstate <= s0;
elsif (restart_ctr = '1') then
--restart the counters
nstate <= s1;
else
nstate <= s3;
end if;
when others =>
nstate <= s0;
end case;
end process p_fsm;
--counter1
p_ctr1 : process(reset_n_in, clk_25mhz_in)
begin
if (reset_n_in = '0') then
ctr1 <= 0; --value on reset
elsif rising_edge(clk_25mhz_in) then
if (start_ctr1 = '1') then
--flag is asserted to start counter1
ctr1 <= ctr1 + 1; --increment counter
else
--flag de-asserted
ctr1 <= 0; --reset the counter
end if;
end if;
end process p_offset_cnt;
--save the value of counter1
offset_val <= ctr1 when pstate = s2;
La lógica contiene dos contadores – ctr1
y ctr2
. Los contadores se ejecuta cuando no hay fallas en el sistema. En la primera fase ctr1
se ejecute, lo que es seguido por ctr2
. ctr1
deja de contar cuando ctr2
está habilitado. El valor de ctr1
determina cuánto más tarde se ctr2
comenzó (en términos de 25MHz reloj período), conocido como el desplazamiento. Este valor de desplazamiento se almacena a una señal, vector, como se puede ver en la última línea del código. El estado s2
es utilizado para capturar el valor de ctr1
antes de que se restablece a 0.
offset_val <= ctr1 when pstate = s2;
Me di cuenta de que esta instrucción de asignación está causando el supuesto reloj en el diseño (pero no sé por qué). Cuando pongo la misma instrucción dentro de un reloj proceso, el supuesto reloj de advertencia desaparece. Sin embargo, mi lógica no funciona correctamente.
Estoy buscando un par de aclaraciones a este respecto.
- ¿Por qué hay un inferirse reloj en pstate[1] en este diseño?
- Está bien que tienen esas declaraciones en el diseño? La presencia de los inferirse relojes indican un mal diseño de la práctica?
- Si no aceptar que han deducido los relojes en el diseño, ¿cómo puedo solucionar este problema mediante la codificación de la lógica de manera diferente?
- Si está bien que se han deducido de los relojes, ¿cómo puedo dejar que la herramienta se sabe de ella? ¿Qué período de restringir puedo proporcionar para tales inferirse relojes? ¿Cómo puedo determinar un período significativo de tales inferirse relojes?