15

私はいくつかの古いものを調べて試験の準備をしています。質問の1つは次のとおりです。

図の同期 FSM を実装する合成可能なビヘイビア VHDL コードを記述します。FSM には、値 (r1、r2、r3) を持つ列挙型の要求と呼ばれる入力が 1 つあります。

それは私がこのコードを書きたくなる:

entity fsm is
  port ( clk     : in  std_logic;
         request : in  my_enum_type
  );
end fsm;

そしてどこかに:

type my_enum_type is (r1, r2, r3);

どこかで(ポート宣言の直前とアーキテクチャ宣言の直後に試しました)。

しかし、私はそれを機能させることができないようです。そのような入力または出力としてカスタム型を使用できますか?

4

1 に答える 1

17

はい、できます。私はこれをベスト プラクティスと考えています。つまり、最小限の作業、最も理解しやすい方法、最も簡単なメンテナンス、最もクリーンな設計を意味します。

秘訣は、パッケージ内のデザイン全体に共通する型を宣言し (通常は「共通」と呼びます:-) use work.Common.all、エンティティ宣言の前に追加し、そのエンティティのすべての顧客に追加します。もちろん、より特殊なコンポーネントには適切な名前を付けることができます。

例えば:

package Common is    -- untested...

   type my_enum_type is (r1, r2, r3);

   -- (optional) useful tools
   function to_slv (e : my_enum_type) return std_logic_vector;
   function to_enum (s : std_logic_vector(my_enum'length downto 0)) 
                    return my_enum_type;

end Common;

package body Common is
   -- subprogram bodies here
end Common;

列挙型に値を追加するときは、「Common」のみを変更してデザインを再構築しますが、従来のガイドラインに従う人は、「std_logic_vector」の範囲を 1 増やす必要があるすべてのポートと信号を識別しようとします。 .

各方向のレコードがすべての個々のバスとハンドシェイク信号を隠すバス インターフェイスでも非常にうまく機能します。

ザイリンクスの「自動テストベンチ ジェネレーター」のような脳死状態のツールと戦わなければなりません。これは、すべてのポート タイプ (整数またはブール値、カスタム) を std_logic(_vector) に変換し、コンパイルに失敗します。それらをもう一度翻訳してください。

最上位レベルでは、すべての外部 FPGA ピンが引き続き std_logic ベースである必要があるというケースを引き続き作成できます。また、デザインの合成後のバージョンをシミュレートする必要がある場合は、std_logic_vector ポートを使用するか、単純なラッパーを追加してある形式から別の形式に変換する必要があります。

于 2013-06-01T13:17:53.830 に答える