June 22, 2011

バス接続な同期応答信号をVHDLで表現

なかなか良いタイトルが思いつかなかったので苦肉の策として、とりあえずキーワードを並べてみました。何が言いたいのかもう少しまともな文章で表現すると、FPGAやCPLDの内部でさまざまなモジュールをバス接続、つまり同じ信号上に複数のモジュールをぶら下げることがあるのですが、そのモジュールからの応答をうまく受け取るにはどうしたらいいか、という話です。ごくごく当たり前のことであったのですが、ようやく考えた末に導かれた結論なので、僕自身の備忘録あらため戒めとして、記事として残しておこうと思います。

状況を図にすると、以下のような接続図になります。

bus_cs_done_connection.png

CSは同時に1つの特定のモジュール(以下、スレーブNといいます)をマスタが起動要求する信号で、クロックに同期します。またDONEは全てのスレーブ(0,1,...)がバス接続されており、CSで指定されたスレーブの処理(ここではスレーブN)が終わったらLからHにクロックに同期して遷移することが望まれています。さらには、どのスレーブもCSで選択されていないときはDONEはLであることが望まれています。

この仕様をタイミングチャートで書くと、以下のようになります。

bus_cs_done_tc.png

バス接続ということでDONEは誰が責任をもって出力すればいいか、ということが重要になります。CSでスレーブNが特定されているうちは、もちろんスレーブNの責任です(タイミングチャート下から2段目)。コードで書くと以下のようになります。

ではスレーブNがない間は、誰がDONEの面倒を見てLを出力するのか、というところで悩んでしまいました。結局のところ、バスの定義があるレベルで、その機能を持てばいいと思います(タイミングチャート1番下)。コードで書くと、以下のようになります。

単純なのですが、これはバス接続の終端を行っていることに他なりません。これを忘れると、スレーブNがない場合のDONEは、合成ツールが勝手に決めてしまうので気持ちが悪い、という事態が発生します。終端を忘れないように記録に残しておくことにしました。

23:32 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/806
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。