目次[隠す]
- 1. 定義済みパッケージ
- 1-1. std_logic_1164パッケージ
- 1-2. std_logic_unsignedパッケージ
- 1-3. std_logic_signedパッケージ
- 1-4. std_logic_arithパッケージ
- 1-5. std_logic_miscパッケージ
- 2. まとめ
定義済みパッケージ
いつも定型文のように使っている定義済みパッケージを整理しておきます。
std_logic_1164パッケージ
std_logic_1164は標準パッケージです。読み込みは必須です。
Wikipedia(英語版)には「VHDLで使用するロジックの値を定義したんだ」と書かれています。9個のロジック値がこのパッケージで定義されています。
It describes the definitions of logic values to be used in electronic design automation, for the VHDL hardware description language.
https://en.wikipedia.org/wiki/IEEE_1164
Character | Value |
---|---|
‘U’ | uninitialized |
‘X’ | strong drive, unknown logic value |
‘0’ | strong drive, logic zero |
‘1’ | strong drive, logic one |
‘Z’ | high impedance |
‘W’ | weak drive, unknown logic value |
‘L’ | weak drive, logic zero |
‘H’ | weak drive, logic one |
‘-‘ | don’t care |
僕の場合、実際に論理合成するVHDLファイルに書くのは ‘0’ , ‘1’ , ‘Z’ ぐらいで、残りはシミュレーションで見かける程度です。
ちなみに余談ですが、シミュレーションで出力信号が “X” になる原因の多くは信号の重複です。
std_logic_unsignedパッケージ
std_logic_unsignedパッケージを読み込むと、std_logic_vectorと宣言した信号を符号なし二進数とみなしてくれます。
std_logic_signedパッケージ
std_logic_unsignedの代わりにstd_logic_signedを呼び出すと、std_logic_vectorの信号を符号付き二進数(2の補数)として扱えます。
内部で数値をどう使うかによりますが、僕はunsignedを呼び出しておいて必要なところで符号の有無を変換する回路を書くことが多いです。
std_logic_arithパッケージ
std_logic_vectorの信号同士の算術演算を定義しています。
元のソースや他のサイトを調べると、加算と減算以外もこのパッケージで定義されていました。
具体的には加算(+)、減算(-)、乗算(*)、絶対値(ABS)と、比較演算が6種類(<, >, <=, >=, =, /=)。
The package defines some arithmetic operators (+, -, *, and abs) and the relational operators (<, >, <=, >=, =, and /=).
また、integerをstd_logic_vectorに変換する CONV_std_logic_vector もこのパッケージに含まれています。
std_logic_miscパッケージ
リダクション演算を行いたいときに呼び出しています。
そのほかにも、ロジックレベルと信号強度の変換ができるようです。
まとめ
次のパッケージを呼び出しておけば、Webや参考書で見かけるサンプル回路は動くと思います。
- std_logic_1164
- std_logic_unsigned
- std_logic_arith
必要に応じて追加でほかのパッケージを呼び出すのが良いかと。
- std_logic_signed
↑ unsignedと同時呼び出ししないように注意 - std_logic_misc
コメントを残す