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