VHDLでwhenを大量に書きたくない

CPLDを最近いじっていますが、設計をVHDLで行っています。そんなことで表題の問題に遭遇しました。なお普段は手続き型のプログラミング言語に比べると、同時実行が前提のHDLを書くのは凄まじく苦手なので、この記事に対して『これは違うんじゃない?』『こう書いたほうがいい』などありましたら是非ツッコミをいれてください。

言葉で説明するよりもコードを掲載したほうが明確だと思いますので、さっそくコードを。

要約としては、4つの候補(candidates)から、優先度付指示(selects)に従って、1つの出力(result)を選んでくる、どれも指示がない場合はハイインピーダンスにする、というセレクタです。問題としては、この指示が4つ以上の大量になった場合です。whenを大量に書くのもつらいので、その記述方法を探ってみました。なお以下では、指示の数を変えられるような汎用的な記述にしてあります。

はじめに思いついたのが以下のコードですが、どうも様子が変です。

それぞれにHi-Z付ドライバ持たせて出力を単純につなぎ合わせる、バスなどでおなじみの手法です。しかしながらselectsが複数'1'になると出力がconflictするので、機能的には等価でありません。

おそらく正解はこちら。

process文の中でforループをまわすことにより、記事の冒頭にあたったwhenベタ書きで見られるような優先度も加味しています。RTLビューワで比較してみたところ、冒頭のコードと同様のものが得られています。

June 01, 2011 06:54 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク

コメント

コメントする