SSブログ

VHDLいろいろ [FPGA]

今更感あるけども、VHDLで特定用途で便利な記述ネタを。

●コンポーネント宣言を省略する

use work.all;

を追加すると読み込んだエンティティのコンポーネント宣言を省略できる。VHDLの悪名の半分はこれで解消。
注意点はModelSimではコンパイル順で認識するので、ソースファイルの順番に依存してしまう。Quartusでは全てのファイルを読み込んでから評価するみたいなので同じプロジェクト内のソースであればどこでも参照できる。

●LPMやMegafunctionを直接インスタンスする

library altera_mf;
use altera_mf.altera_mf_components.all;
library lpm;
use lpm.lpm_components.all;

を追加しておくと、コンポーネント宣言を省略してLPMやMegafunctionのマクロをインスタンスできる。
乗算やFIFO、DDRIOなどハードマクロにインスタンスしたい場合に便利。
パラメータのマニュアルはIP Catalogで表示されるコンポーネント名でぐぐれはIntelのpdfがでてくるけど、そのままIP Catalogでソースを出力して該当部分をコピペした方が早い。

そんなわけで、ソース公開するときにライセンス云々でやかましい類の人間に噛みつかれたくないときに重宝。別にQuartusPrimeのツール生成ソースでライセンス上も何の問題も無いのだけれど。

●リダクション演算を使う

use ieee.std_logic_misc.all;

を追加すると以下のリダクション演算ファンクションが使えるようになる。

and_reduce(std_logic_vector)
or_reduce(std_logic_vector)
xor_reduce(std_logic_vector)
nand_reduce(std_logic_vector)
nor_reduce(std_logic_vector)
xnor_reduce(std_logic_vector)

リダクション演算は引数のベクタの全ビットに対して論理演算を行うというもの。例えば and_reduce(data) とやると、dataの全ビットでand演算を行った結果が返される。つまり全ビットが'1'なら'1'が返る。
or_reduce(data)であれば全ビットが'0'の場合に'0'が返る。xor_reduce(data)では'1'のビットが奇数個の時に'1'が返る。
or_reduceは関係演算子でオーバーロードが行われるのでゼロ比較で代用できるけども、and_reduceの機能(任意長のビット幅で全ビットが'1'の判定)は少々面倒なので、パラメタラブルな記述をし始めると出番は多い。


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。