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)
begin
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– Paebbels2016年08月09日 00:35:11 +00:00Commented 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– user83522016年08月09日 01:23:04 +00:00Commented 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\$David Quiñones– David Quiñones2016年08月10日 08:35:41 +00:00Commented Aug 10, 2016 at 8:35
-
\$\begingroup\$ I use asynchronous reset on assertion and I synchronize it for de-assertion. \$\endgroup\$Claudio Avi Chami– Claudio Avi Chami2016年08月10日 22:59:19 +00:00Commented Aug 10, 2016 at 22:59