一部の人々が常に 2 プロセスのステート マシン (つまり、1 つの同期プロセスと 1 つの並行プロセス) を記述する理由は、他の人が言っているように、学校でそのようにすることを学んだためです。
ただし、場合によっては、このコーディング スタイルが実際には、単一の同期プロセスを使用するよりも優れていることがあります。つまり、同じコンテキストで同期割り当てと同時割り当てを混在させることができます。次の 2 つのコードを考えてみましょう。どちらも同じことを実行します。
2 プロセス ステート マシン:
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;
1 プロセスのステート マシン:
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;
2 番目の例の余分な状態に注意してください。VHDL では同期プロセスで同時割り当てを行う方法がないため (あったらいいのに!)、 fifo_read 信号にレジスタが追加され、1 サイクル遅延します。この例は非常に単純ですが、常に 1 つのプロセスのステート マシンに固執すると、コードが非常に混乱し、理解が困難になることがあります。また、ステート マシンがハードウェアでより多くのリソースを消費し、コードが長くなる可能性もあります。どちらのスタイルも常に正しい選択ではありませんが、私は通常、1 プロセスのバリアントを好みます。