1

私は VHDL から始めており、回路を実装しようとしているときに、leading one/zero detectorsまたはのような基本的な要素が必要であることがわかりましたleading one/zero counters。これらは基本的なものだと考えているので、含めるライブラリがあるかどうかを知りたいです。

独自の実装をまとめる必要がある場合、コピーできるコレクションはありますか、それとも車輪を再発明する必要がありますか?

(私はそれらを1つずつグーグルで検索し、フォーラムで実装を見つけることができますが、それらのいくつかは非常に悪い/実装が十分に一般的ではないようです(つまり、このマルチプレクサー))。

4

2 に答える 2

2

あなたが提案するアプローチ (単純な再利用可能な要素のライブラリ) がうまくいかない理由の 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 になります。

プロシージャを作成しない限り、これはワンライナーではありません (ほとんどのツールで合成可能です!) が、エンティティのインスタンス化 (および相互接続) のサイズと比較します。

もちろん、プロシージャーと関数のライブラリーは役に立ちます。そして(それほど重要でないタスクの場合)同じことがエンティティにも当てはまりますが、私の意見では、それらを重くすることなく、すべての人に役立つように十分に一般的なものにすることは、かなりの成果です.

于 2013-04-02T12:29:18.500 に答える
0

一部の IDE には、サンプル ライブラリが直接付属しています。たとえば、Xilinx ISE には「言語テンプレート」セクションがあり、基本的な合成構造、コード例などが含まれています。

于 2013-04-02T12:40:09.897 に答える