VHDLメモ
'X'(不定値)と'-'(don't care)
- 'X'はシミュレーション結果で信号の衝突やタイミング制約違反があったときなどに表示される。
- '-'はwhen文などでどんな出力値でもよい場合に以下の目的で使用する。
- 不必要なラッチを生成しない
- コンパイラの最適化で回路を小さくする
'X'も'-'と同様にdon't careの目的で使用することができるらしい。
アルテラの資料にも'X'を使用するとの記述があった。
範囲指定したintegerによる循環カウンタ
integer range 0 to MAXで整数値の範囲指定をすることができる。
これは静的に違反しているときはコンパイル時にエラー、
動的に違反がした場合はシミュレーションでエラーを出してくれるらしい。
実行時はどうなる?
これを使って0からMAXを循環する値を作り出したい場合、
if文で最大値の判定をして0で初期化する処理を入れる必要がある。
こんな感じ。
if (cnt = MAX) then cnt <= 0; else cnt <= cnt + 1; end if;
ソフト屋目線で見るとMAXが2の累乗−1という条件では
この処理は冗長に見えてしまう。
でも上の理由からこの処理ははずせない。
しかもC言語の三項演算子のようなものも見当たらず。
integerじゃなくて、std_logic_vectorならいけるか?
でもどっかの記述でstd_logic_vectorでの加算は勝手に
ビット拡張されるとあったような。
C言語みたいにビット範囲を切り出して使えば、まぁ使えなくもなさそうか。
if-else文について
疑問に思うこと。
ソフトでは同じ変数を使って条件文を書くときはelse ifを使うと思う。(Cの場合)
if (val == 0) { ... } else if (val == 1) { ... } else ...
valが0のときにval == 1の判定を行う必要はないが、
else ifをifにするとval == 1の判定も行ってしまう。
逐次処理ではなく並列処理が基本のハードでは
ifでもelsifでも処理は実行される。
その上elsifはその前のif文の結果を考慮するので、
結果的に回路が増えてしまわないのだろうか?
もう一つ疑問。
if文で同じ判定式だけど、意味的に分けたい(出力先によって分けるなど)場合、
if文を分けた場合に回路的には増大してしまうのかな?
最適化とかどうなんだろ?
こういうのはコンパイル結果を見るしかないんだろうなぁ。うーん。