VHDLでwhenを大量に書きたくない
CPLDを最近いじっていますが、設計をVHDLで行っています。そんなことで表題の問題に遭遇しました。なお普段は手続き型のプログラミング言語に比べると、同時実行が前提のHDLを書くのは凄まじく苦手なので、この記事に対して『これは違うんじゃない?』『こう書いたほうがいい』などありましたら是非ツッコミをいれてください。
言葉で説明するよりもコードを掲載したほうが明確だと思いますので、さっそくコードを。
要約としては、4つの候補(candidates)から、優先度付指示(selects)に従って、1つの出力(result)を選んでくる、どれも指示がない場合はハイインピーダンスにする、というセレクタです。問題としては、この指示が4つ以上の大量になった場合です。whenを大量に書くのもつらいので、その記述方法を探ってみました。なお以下では、指示の数を変えられるような汎用的な記述にしてあります。
はじめに思いついたのが以下のコードですが、どうも様子が変です。
それぞれにHi-Z付ドライバ持たせて出力を単純につなぎ合わせる、バスなどでおなじみの手法です。しかしながらselectsが複数'1'になると出力がconflictするので、機能的には等価でありません。
おそらく正解はこちら。
process文の中でforループをまわすことにより、記事の冒頭にあたったwhenベタ書きで見られるような優先度も加味しています。RTLビューワで比較してみたところ、冒頭のコードと同様のものが得られています。
06:54 fenrir が投稿 :
固定リンク
|
|
|
トラックバックこのエントリーのトラックバックURL:
https://fenrir.naruoka.org/mt/mt-tb.cgi/803