Chris Laplante さんには申し訳ありませんが、あなたの質問は VHSIC ハードウェア記述言語 (VHDL) に関する非常に有効な質問のようです。(Very High Scale Integrate Circuit の頭字語である VHSIC)。よく意図された Wiki の説明にもかかわらず、VHDL は汎用プログラミング言語ではありません。実行は、シミュレーション時間または実装に依存する方法で、連続するデルタ サイクルの数によって制限されます。ハリー・ハリソンの言い回しを借りると、VHDL はハードウェアです。つまり、electronics.stackexchange.com vhdl タグがトラフィックを使用できるということです。
テスト ベンチは、インスタンス化された T_FF の正式な T の実際の値である sT のデフォルト値を既に提供しています。ラベル付けされていないプロセスから、変数 hold1 と hold 2 が T と Q の積であることがわかります。そのため、パッケージ本体 std_logic_1164 で AND テーブルまたは NOT テーブル ルックアップの Q の既知の値が問題であり、'U' 以外の値が生成されます。
-- truth table for "not" function
CONSTANT not_table: stdlogic_1d :=
-- -------------------------------------------------
-- | U X 0 1 Z W L H - |
-- -------------------------------------------------
( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X' );
-- truth table for "and" function
CONSTANT and_table : stdlogic_table := (
-- ----------------------------------------------------
-- | U X 0 1 Z W L H - | |
-- ----------------------------------------------------
( 'U', 'U', '0', 'U', 'U', 'U', '0', 'U', 'U' ), -- | U |
( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), -- | X |
( '0', '0', '0', '0', '0', '0', '0', '0', '0' ), -- | 0 |
( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ), -- | 1 |
( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), -- | Z |
( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), -- | W |
( '0', '0', '0', '0', '0', '0', '0', '0', '0' ), -- | L |
( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ), -- | H |
( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ) -- | - |
);
2 つの表から、「U」または「X」以外のものを配信するには、入力が「0」、「1」、「H」、または「L」のいずれかでなければならないことがわかります。(横軸は 1 つの入力を表し、縦軸は 2 つの入力 AND 関数のもう 1 つの入力を表します。結果の値は、1 つまたは両方の軸と交差する値の配列にあります)。
したがって、Q はこれら 4 つの値のいずれかに初期化する必要があります。これには 2 つの方法があります。FPGA で初期化を反映してセットまたはリセット条件に自然なバイアスを与えるか、Q にアクティブ リセットを適用します (関連する質問VHDL - 非同期アップ/ダウン カウンターへの回答を参照してください)。 )。
Q ポート モードを inout にしてフィードバックに直接使用することを選択したため、リセットを提供することが最善の選択です。また、T_FF には設計エラーがあり、両方のクロック エッジで動作しますが、これは clk'event を clk = '1' で修飾して一方のエッジ (立ち上がりエッジ) でのみ動作させることで解決できます。
process (clk, RESET) is
variable hold1, hold2 : std_logic;
begin
if RESET = '1' then
Q <= '0';
else
if (clk'event AND clk = '1') then
hold1 := Q and (not T);
hold2 := T and (not Q);
Q <= hold1 or hold2;
end if;
end if;
end process;
(両方のエッジを使用する「失敗モード」は、正しい周波数であるが、クロックの低いボーに対してのみ有効な出力を生成することです。試してみてください)。
したがって、T_FF のポートに非同期 RESET を追加し、tb でコンポーネント宣言とインスタンス化ステートメントを追加し、tb に sRESET を追加して true に初期化すると、一定時間後に false になると、T_FF シミュレーションは次のようになります。
合成に準拠した VHDL に関する IEEE 規格、IEEE Std 1076.6-2004 というタイトルの IEEE Standard for VHDL Register Transfer Level (RTL) Synthesis があり、ここで使用される構造について説明しています。RESET が T_FF のラベルなしプロセス ステートメントのセンシティビティ リストに追加されていることに注意してください。