2007年10月02日
VHDL TIPS 「物理タイプの使い方」
物理タイプとは、時間や電圧、電流、距離などの物理的な物を表すために使用するデータタイプだ。
VHDLには元々「time」が物理タイプとして定義されており内容はスタンダードパッケージに書かれている。
この「time」を代表とする物理タイプはpsやnsなどの単位を指定できるのが大きな特徴で、新しい単位を持ったデータタイプを作成する事も出来る。
以下の例は距離の物理タイプを新たに定義して、その距離を遅延時間に変換する関数も用意した。(遅延時間は1ns=15cmで計算)
use modelsim_lib.util.all;
package distance_pkg is
-- 距離タイプ
type distance is range 0 to integer'high
units
munit;
um = 10 munit;
mm = 1000 um;
cm = 10 mm;
m = 100 cm;
km = 1000 m;
mil = 254 munit;
inch = 1000 mil;
ft = 12 inch;
yd = 3 ft;
fm = 6 ft;
mi = 5280 ft;
lg = 3 mi;
end units;
-- 距離から遅延時間を算出
function distance2time( trace_len : distance ) return time;
end distance_pkg;
package body distance_pkg is
-- 距離から遅延時間を算出
function distance2time( trace_len : distance ) return time is
variable resolution : real;
variable delay_time : time;
begin
-- シミュレーションレゾリューションの取得
resolution := get_resolution;
-- メートル−時間変換
--1ns=15cm(150000um)
--1000000fs=150000um
--1fs=0.15um(1.5munit)
delay_time := to_time( real( distance'pos(trace_len))
/(1.5 * resolution * 1000000000000000.0));
return delay_time;
end;
end distance_pkg;
このように最小単位からの係数を変えることで、ミリやインチなどを混在して記述出来る事も便利な点だ。
また、距離を遅延時間に変換する関数は、「time」がシミュレーションのレゾリューションによって最小単位が変わる特殊な物理タイプのため、まずレゾリューションを取得してから変換している。
この距離パッケージを使うと、以前紹介したVHDL TIPS 「双方向バスの遅延モデル」の遅延値を入力する部分を、距離を入力する様に簡単に置き換えることが出来るので、ケーブルのモデリングなどに使用するとおもしろいと思う。