The reason some people always write two-stage state machines (i.e., one synchronous process and one parallel process) is probably mainly because they learned how to do this at school, as others said.
However, in some cases, this coding style may be better than having one synchronous process. In short, it allows you to mix synchronous and parallel assignments in one context. Consider the following two code snippets, both performing the same thing:
Two-process state machine:
process (clk) begin if rising_edge(clk) then state <= state_next; end if; end process; process (all) begin state_next <= state; case state is when s_idle => if req_i = '1' then fifo_read <= '1'; -- Concurrent assignment state_next <= s_check_data; -- "Synchronous" assignment end if; when s_check_data => if fifo_out = x"1234" then (...) end if; (...) end case; end process;
Single-stage state machine:
process (clk) begin if rising_edge(clk) then case state is when s_idle => if req_i = '1' then fifo_read <= '1'; state <= s_wait_for_data; end if; when s_wait_for_data => state <= s_check_data; when s_check_data => -- Data word from FIFO now available. if fifo_out = x"1234" then (...) end if; (...) end case; end if; end process;
Note the additional state in the second example. Since there is no way to make simultaneous assignments in synchronous processes in VHDL (I would like to!), A register will be added to the fifo_read signal, delaying it by one cycle. Although this example is simple enough, always sticking to uniprocessor states of a machine can sometimes cause the code to become quite confusing and difficult to follow for this reason. It can also cause your state machine to spend more hardware resources and even make the code longer. No style is always the right choice, but I usually prefer the one-process option.
source share