3

私は VHDL を学んでおり、常に改善を目指しているため、ここでさまざまな質問を読んでいます。しかし、このコメントは私を興味深くしました:

単純なステート マシンの問題

大学での短い VHDL コースで、同期の側面を分離するには、個別のプロセスが最善の形であると言われました。

明らかにこれは個人的な好みですが、経験豊富なユーザーが自分の好みで長所と短所に光を当てることができることを望んでいましたか? 一方は他方よりも一般的ですか?

ありがとう!

4

2 に答える 2

5

まあ、あなたがリンクしたことを言ったのは私だったので...コメントしたほうがいいです:)

物事を別々のプロセスに入れる場合の悪いこと(IMHO):

  • 機密リストを宗教的に最新の状態に保つ必要があります
  • 非同期ラッチが必要でない限り(通常は必要ありません)、すべての出力にデフォルトを提供する必要があります。
  • ロジックが分割されているため、ステート マシンにステートを追加する場合は、両方のプロセスに新しいステートを配置する必要があります。
  • シグナルを登録済みと未登録の両方で使用したい場合は、シグナルを複製することになります。単一のプロセスでは、変数を使用してこれを実現できます。
  • 読みにくいと思う人もいます。

良いもの:

  • 状態の「出力」を未登録にすることができます。これはレイテンシの削減には有効ですが、ほぼすべての目的で、各ブロックの出力にレジスタを配置してタイミングを簡単に満たす必要があります
  • 読みやすいと思う人もいる

私の意見では、あなたが聞いたような勅令 (「分けておいてください」) は、シンセサイザーがロジックとフロップを区別するのが得意ではなかった時代に由来するものであり、フロップだけをクロック プロセスに配置することは理にかなっています。

さらに、そのアプローチは、HDL を持たない時代の人々が模式図を描く方法と一致していました。

最近では、シンセサイザーは、クロック処理されたプロセスで任意の複雑なロジックを処理できます。そして、論理の各小さなビットがどこにあるかを明示する必要なく、意味のある方法でそれを書くことができます。タイミングが本当にタイトな場合にのみ、適切な場所にフロップとロジックを配置することについて真剣に考える必要があります。

私の「ルール」は次のとおりです。

  • 読めるようにしておく
  • 要件を満たしている場合 (例: 電源、タイミング、および機能が OK)、作業は完了です。
  • そうでない場合は、そのときだけ、読めないトリックをプレイします

ソフトウェアを書くのとよく似ています:)

于 2010-12-10T16:45:00.393 に答える
1

私は別のキャンプにいます。私のコードには、リセットとクロッキングの動作を行う単一の同期プロセスがあります。他のすべては非同期です。登録プロセスは次のようになります。

Wait for Clock;
If Reset then
    Value <= '0';
else
    Value <= nextValue;
endif

好きなもの:

  • どの信号がフロップであるかは明らかです。それらは、クロックプロセスにあるものです。
  • 私は一度登録プロセスを書いて、それを忘れます。
  • すべての非同期プロセスは、保持された状態のない「純粋」関数です。
  • レジスタでロジックを分割したり、パイプラインステージを分離したりする必要があります
  • それは、多くの、小さく、単純な、非同期プロセスであるスタイルを促進します。
  • このロジックにより、コーンは理解と最適化が容易になります。
  • 大きなプロセスは、タイミングクロージャに問題があるプロセスである可能性があります。早期警報ベル。

ネガ:

  • 感度はリストされていますが、Emacsにはこのためのマクロがあり、警告が表示されます。リストが巨大な場合、プロセスが大きすぎます。
  • すべての出力のデフォルトですが、実際にはドキュメントとして機能します。プロセスの開始直後、これらは私の出力とデフォルトです。繰り返しますが、私がそれを間違えると警告に捕まります。また、非同期項が1つのパスに割り当てられていないため、追加のフリップフロップよりもラッチ(ほとんどの場合は必要ありません)をキャッチする方がはるかに簡単です。

マーティンの答えから私が完全に理解していないこと:

  • ロジックが分割されているため、ステートマシンに状態を追加する場合は、両方のプロセスに新しい状態を配置する必要があります

状態変数のタイプを変更して(つまり、列挙型を追加して)、次に進みます。統一されたスタイルとまったく同じです。

  • シグナルを登録済みと未登録の両方で使用したい場合は、それを複製することになります。単一のプロセスで、変数を使用してこれを実現できます。

スプリットスタイルでは、すでに登録済みと未登録のバージョンがあります。これらは、レジスタプロセスへの入力と出力です。余分な作業は一切ありません。

于 2010-12-14T15:02:33.813 に答える