5

Douglas L Perry の教科書「VHDL: Programming By Example」、第 4 版を使用しています。彼は 4 ページで Dataflow プログラミング モデルの例を示しました。

コード I:

ENTITY mux IS
PORT ( a, b, c, d : IN BIT;
s0, s1 : IN BIT;
x, : OUT BIT);
END mux;
ARCHITECTURE dataflow OF mux IS
SIGNAL select : INTEGER;
BEGIN
select <= 0 WHEN s0 = ‘0’ AND s1 = ‘0’ ELSE
          1 WHEN s0 = ‘1’ AND s1 = ‘0’ ELSE
          2 WHEN s0 = ‘0’ AND s1 = ‘1’ ELSE
          3;
x <= a AFTER 0.5 NS WHEN select = 0 ELSE
     b AFTER 0.5 NS WHEN select = 1 ELSE
     c AFTER 0.5 NS WHEN select = 2 ELSE
     d AFTER 0.5 NS;
END dataflow;

17ページ、 Code II

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY mux4 IS
PORT ( i0, i1, i2, i3, a, b : IN std_logic;
PORT ( i0, i1, i2, i3, a, q : OUT std_logic);
END mux4;
ARCHITECTURE mux4 OF mux4 IS
SIGNAL sel: INTEGER;
BEGIN
WITH sel SELECT
q <= i0 AFTER 10 ns WHEN 0,
q <= i1 AFTER 10 ns WHEN 1,
q <= i2 AFTER 10 ns WHEN 2,
q <= i3 AFTER 10 ns WHEN 3,
q <= ‘X’ AFTER 10 ns WHEN OTHERS;
sel <= 0 WHEN a = ‘0’ AND b = ‘0’ ELSE
       1 WHEN a = ‘1’ AND b = ‘0’ ELSE
       2 WHEN a = ‘0’ AND b = ‘1’ ELSE
       3 WHEN a = ‘1’ AND b = ‘1’ ELSE
       4;
END mux4;

これは、同じ教科書によると、動作モデルであると想定されています。変数名の違いを除けば、ここで目にする唯一の大きな違いは、余分なステートメントがあることです

WITH sel SELECT

2 番目のケースでは、わずかな構文の違いがあります。この Code II は同時実行です。しかし、インターネットの他の情報源 (以下にリスト) から、行動モデルはシーケンシャルであると想定されていることがわかりました。どちらを信じるべきですか?

現在、インターネットの他のソースから、これらのモデルの定義は次のとおりです。

Behavioral – 回路は、プロセス内の順次ステートメントを使用した i/o 関係として記述されます。

データフロー – 回路は同時実行ステートメントを使用して記述されます

-サンノゼ州立大学

Behavioral – 構造化ステートメントを使用して入力から出力を導出する方法を説明します。

データフロー – データがどのように流れるかを説明します。

-アクロン大学工学部

ここで、構造化ステートメントの意味がわかりません。

Behavior レベルでは、process キーワードが存在します

データフロー レベルで、同時実行ステートメント (<=) が存在する


これはオンラインフォーラムで見られました。

プロセスステートメントは行動モデルに必須ですか?

コード I と II の実際の違いは何ですか? 著者によると、それらには異なるモデル、データフロー、および動作があります。これがどのように可能かわかりません。私は何を信じるべきですか?

最後に、Perry DL の 45、46 ページ:

LIBRARY IEEE;
USE IEEE.std_logic_1164ALL;
ENTITY mux IS
PORT (i0, i1, i2, i3, a, b : IN std_logic;
PORT (q : OUT std_logic);
END mux;
ARCHITECTURE better OF mux IS
BEGIN
PROCESS ( i0, i1, i2, i3, a, b )
VARIABLE muxval : INTEGER;
BEGIN
muxval := 0;
IF (a = ‘1’) THEN
muxval := muxval + 1;
END IF;
IF (b = ‘1’) THEN
muxval := muxval + 2;
END IF;
CASE muxval IS
WHEN 0 =>
q <= I0 AFTER 10 ns;
WHEN 1 =>
q <= I1 AFTER 10 ns;
WHEN 2 =>
q <= I2 AFTER 10 ns;
WHEN 3 =>
q <= I3 AFTER 10 ns;
WHEN OTHERS =>
NULL;
END CASE;
END PROCESS;
END better;

これは、MUX の順次バージョンです。他の定義によれば、これは行動的であると考えられていますが、著者はそうは述べていません。これらのモデルに関する私の混乱を解消していただけますか?

4

3 に答える 3

8

これらの用語の数学的に厳密な説明を求めないでください。それらはそれよりもはるかに曖昧で、重複する可能性のある緩い分類です。

ここで「データフロー」はかなり明確だと思います。それはデータの流れを記述しており、並行ステートメントの観点からそれを記述しています。ただし、各並行ステートメントは入力の変更によって起動され、出力を提供することを付け加えておきます。したがって (重要な点:) 発生する順序とソース コード内の要素の順序との間に対応関係はありません。その点で、関数型プログラミングと多くの共通点があります。最初の 2 つのモデルはどちらもデータフローです。(I) では、要素は論理的な順序になっていますが、(II) はそうではありません。

「動作」もかなり明確にする必要があります。これは、動作の観点から回路を単に説明するだけです。

しかし、それは一般的にデータフローに反対しているわけではありません - あなたのサンノゼの引用は多少正しいですが - 動作の記述は一般的にシーケンシャルです。単純に、(VHDL プロセス内の) シーケンシャル パラダイムが一般的であり、プログラマーになじみがあるからです。それでも、このような複数のプロセスが相互に作用する動作は ... データフローです。

Behavioralはdataflowと正しく対立していません。これは、かなり明確な意味を持つRTL (Register Transfer Level) や構造的なものとは正反対です。

構造記述は、多数のビルディング ブロック (ゲート、マルチプレクサ、CPU 全体) とそれらを相互接続する信号で構成されます: テキスト ブロック図 (おそらくグラフィカルなものから自動生成)。そのため、最低レベル (ゲートから加算器を作成することに関するよくある質問を参照してください!) または最高レベル (CPU をメモリ、周辺機器などに接続) のいずれかになります。

RTL 記述はかなり低レベルです。ストレージ要素(レジスタ)間のデータの転送と操作を記述し、プロセス内で一般的です。これは、(動作) C プログラムからのアセンブリ言語のリストに似ています。

最後に、説明が多すぎたり、余分な詳細が多すぎたりすると、適切な設計作業の妨げになります。目の前のタスクを見て、その本質を抽出し、それを実装します。

マルチプレクサは、必要な要素のインデックスに従って、入力要素のコレクションの 1 つを選択します。インデックスの最も自然な形式は通常、整数型であり、負のインデックスを含むことはめったにありません。VHDL でのコレクションの最も自然な形式は ... 配列です。

では、なぜ書かないのですか

ENTITY mux IS
  PORT ( a, b, c, d : in BIT;
         sel        : in natural range 0 to 3;
         x          : out BIT);
END mux;
ARCHITECTURE simple OF mux IS
SIGNAL values : array (0 to 3) of BIT;
BEGIN
   values <= a & b & c & d;
   x      <= values(sel);   -- after 0.5 ns; if you need to model timing!
END simple;

または、「値」を入力ポートにします...

于 2013-09-08T11:02:42.150 に答える
1

この特定の本では十分に説明されていない、動作実装と構造実装の違いがあります。データフローは、誰が何を伝えようとしているかに基づいて、ハードウェアに適切に適用されない可能性があります。

Switching & Logic Laboratory Spring 2008 jeg 1 Lab 2 – Behavioral and Dataflow VHDL (PDF、 66KB 、12 ページ) は、この本の読者の混乱を解消するために提供されました。

VHDL 内では、3 つの異なる方法でロジックを記述できます。これら 3 つの異なるアーキテクチャは次のとおりです。

  • Behavioral – 構造化ステートメントを使用して入力から出力を導出する方法を説明します。

  • データフロー – データが入力から出力までどのように流れるかを、NOT、AND、および OR 演算を使用して最も頻繁に説明します。

  • 構造 - 回路図のアプローチと同様に、ゲートがどのように相互接続されているかを説明します。

データフローは並行性を暗示することができますが、動作または構造のいずれも、順次または同時の記述を排除しません。すべてのコンカレント ディスクリプションは、VHDL シミュレーションのシーケンシャル プロセスに変換され、デルタ シミュレーション サイクルをカウントして、コンカレンシーをエミュレートする信号割り当てを同期します。

回路図がフラットなネット リストで表現できるように、シミュレータにはデザイン階層を反映するデザイン ネットワークの概念があります。

ここでデータフローと呼ばれるものを使用する十分な理由があります。たとえば、9 レベルのロジック (パッケージ std_logic_1164 で使用される MVL9) でロジックの動作を記述すると、未知数 ('X') と初期化されていない値 ('U') が伝播されるからです。例外によって以外は、抽象化のレベル間で調整できない目に見える値を手で振ることなく、動作モデルと構造モデルの間の閉鎖をもたらします。刺激と期待される結果は、Dataflow 動作記述と構造的実装の間で同じです。

経験から言えば、ファウンドリから最初のシリコンを遅らせて、提供した刺激に対する例外の承認を待つよりも、さまざまなレベルの抽象化を一致させる方がはるかに簡単です。 IC テスターで作成できる例外の数はかなり限られていました。IC テスター上の実際のシリコンは、別のレベルの抽象化と考えることができます。

VHDL でさまざまなレベルの抽象化をシミュレートするには、基本的に、構造モデルの動作により近いビヘイビア モデルを記述します。あ

「VHDLデータフロー」をグーグルで検索して上記のPDFを見つけました。これにより、さらに多くの情報源が明らかになります。

于 2013-09-08T11:08:26.867 に答える
1

Behavioral – 構造化ステートメントを使用して入力から出力を導出する方法を説明します。

データフロー – データがどのように流れるかを説明します。

-アクロン大学工学部

データフローモデルでは、データフロー (つまり、物理回路) を明確に理解している必要があります。ただし、動作モデルを使用する場合は、設計の主な動作にのみ注意を払う必要があります。そのため、動作モデルは理解しやすく維持しやすいものです。たとえば、並列乗算器を実装するには

データフロー モデル

レジスタ、FAU、マルチプレクサなどのコンポーネントが必要になります。それらはすべて自分で実装する必要があります。これは、特に入力数値が 16 ビット以上の場合にひどいことです。

行動モデル

必要なのは、次のようなステートメントを書き留めることだけです。

p <= a * b;

モデルがデータフロー モデルかビヘイビア モデルかは、デザインのモデル化方法によって決まります。順次ステートメントまたは同時ステートメント? それは問題ではありません。

于 2013-09-08T11:37:25.097 に答える