私の考えでは、今日の構造 HDL の役割は、テスト済みの動作ブロックを相互接続する (またはテストされていないブロックをテストベンチに接続する!) ことに限定されています。
また、行動プロセスを書くことは、ある意味でソフトウェアを書くことに似ていることにも同意します (そうではないという一部の叫びに対して)。
でも
動作をシーケンシャルまたはスローと同一視するという罠に陥らないでください。
あなたのシフトレジスタを考えると、
type reg_type is array(7 downto 0) of bit;
signal s_in, s_out : bit;
process(clk) is
variable reg : reg_type;
begin
if rising_edge(clk) then
s_out <= reg(7);
reg := reg(6 downto 0) & s_in;
end if;
end;
次のように簡単に並列化できます。
signal p_in, p_out : array(1 to 4) of bit;
process(clk) is
variable reg : array(1 to 4) of reg_type;
begin
if rising_edge(clk) then
for i in reg'range loop
p_out(i) <= reg(i)(7);
reg(i) := reg(i)(6 downto 0) & p_in(i);
end loop;
end if;
end;
(そして、これを書くもっと簡単な方法があります!) ループの実行にそれ以上時間がかからないことに注意することが重要です: より多くのハードウェアを生成するだけです (ソフトウェア用語では、完全に展開されます)。各反復は、他の反復から完全に独立しています。そうでない場合、事態はより複雑になります。
構造と行動の学術的な違いについて心配する必要はありません。
プロセス内のシグナル割り当てスケジューリングと変数割り当てスケジューリングの違いについて心配します (デルタ サイクルと延期された割り当てとは何かを学びます。これはソフトウェアとの主な違いの 1 つであり、ソフトウェアには VHDL のシグナルではなく変数しかないために発生します)。ここでパイプラインを逆さまに実装した理由を説明します (最初に出力) - 変数を使用したためです。
1 プロセスの SM の方がシンプルで安全なのに、馬鹿げた 2 プロセスのステート マシンを教える人がなぜそんなに多いのか心配です。
単一プロセス モデルに関する Mike Treseler のページを見つけて理解してください (まだオンラインになっていることを願っています)。