I'm creating a FSM in VHDL to implement a serial transmission module. However, whenever I synthesize it, it throws a bunch of the same error about finding a timing loop.

[Synth 8-295] found timing loop. 

However, the line it points to looks like this:

sync_proc : process (sys_clk, sys_rst, NS) 
    if (sys_rst = '1') then
        PS <= FSM_RESET;
    elsif rising_edge(sys_clk) then
        PS <= NS;
    end if;
end process sync_proc;

Specifically, the error points to the "PS <= NS" line. From what I've been taught and read in VHDL standards, this is a standard way to implement the synchronous part of an FSM, but I can't find why its giving me an issue about it now. Any thoughts?

  • \$\begingroup\$ This code shows not the complete (timing) loop. Please follow the signal assignments in your code. Normally, Vivado should print the complete loop: See this example. \$\endgroup\$
    – Paebbels
    Aug 9, 2016 at 0:35
  • \$\begingroup\$ With respect to Paebbels example show us the process or concurrent statement(s) assigning NS and declarations and any signals NS depends on. \$\endgroup\$
    – user8352
    Aug 9, 2016 at 1:23

1 Answer 1


The problem is because you included NS in your sensitivity list. The first line shall look like this

sync_proc : process (sys_clk, sys_rst) 
  • \$\begingroup\$ That's right! Another cuestión. Why do you use an asynchronous reset? It's really recomendable use synchronous reset. \$\endgroup\$ Aug 10, 2016 at 8:35
  • \$\begingroup\$ I use asynchronous reset on assertion and I synchronize it for de-assertion. \$\endgroup\$ Aug 10, 2016 at 22:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.