あなたが提案するアプローチ (単純な再利用可能な要素のライブラリ) がうまくいかない理由の 1 つは、多くの場合、それらを使用しない方がよいということです。
リンク先のマルチプレクサの例は、その点を非常によく示しています。
ENTITY multiplexer IS
PORT (
a, b, c, d, e, f, g, h : IN STD_LOGIC;
sel : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
y : OUT STD_LOGIC
);
END ENTITY multiplexer;
あなたが書くことができる型システムを使用して、わずかに優れた設計が与えられます(おそらく再利用可能なパッケージで)
subtype sel_type is natural range 0 to 7;
そして、あなたのデザインでは、信号宣言が与えられます
signal sel_inputs : std_logic_vector(sel_type);
signal sel : sel_type;
signal y : std_logic;
あなたは単に書くことができます
sel_inputs <= a & b & c & d & e & f & g & h;
y <= sel_inputs(sel);
マルチプレクサ コンポーネントを実際にインスタンス化するよりも手間がかかりません。
先頭のゼロ検出器は、一見すると難しいように見えます。これらは通常、クロック処理されたプロセスとして、またはより大きなクロック処理されたプロセスの一部として実装されます。
VHDL の最近の傾向は、合成可能な VHDL のセミビヘイビア スタイルに向かって進んでおり、かなりの量が 1 つのクロック プロセス内でシーケンシャル スタイルで記述されます。これは、「単一プロセス状態マシン」で最もよく見られます。まだ一般的に教えられている「2 プロセス」スタイルよりも小さく、理解しやすく、間違いなく信頼性が高い*。
(* お使いのツールが組み合わせプロセスの VHDL-2008 の "process(all)" センシティビティ リストをサポートしていない場合。)
クロックされたプロセス内 (つまり、以下がループif rising_edge(clk) then
を使用して表現できる配列内の先行ゼロをカウントするような単純なタスク内にあると仮定しfor
ます。たとえば:
for i in sel_type loop
if sel_inputs(i) = '1' then
zero_count <= sel_type'high - i;
end if;
end loop;
最後の課題が勝ちます。h = '1' の場合、カウントは 0 になります。それ以外の場合、g = '1' の場合、カウントは 1 になります。
プロシージャを作成しない限り、これはワンライナーではありません (ほとんどのツールで合成可能です!) が、エンティティのインスタンス化 (および相互接続) のサイズと比較します。
もちろん、プロシージャーと関数のライブラリーは役に立ちます。そして(それほど重要でないタスクの場合)同じことがエンティティにも当てはまりますが、私の意見では、それらを重くすることなく、すべての人に役立つように十分に一般的なものにすることは、かなりの成果です.