工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> VHDL

VHDLで乱数生成: 一様分布からOSVVMまで

VHDLには組み込みの疑似乱数生成器が含まれており、[0, 1]区間の浮動小数点値を生成します。これらの値をスケーリングおよびオフセットすることで、実数、整数、std_logic_vector、時間など、テストベンチに適した任意の型の乱数データを作成できます。以下のガイドでは、IEEE MATH_REALパッケージのuniform手順を使用してこれらの生成器を構築する方法と、より高い柔軟性のためにOSVVM Randomパッケージを活用する方法を示します。

以下の例の基礎となるuniform手順は、IEEE MATH_REALパッケージで定義されています:

procedure UNIFORM(variable SEED1, SEED2 : inout POSITIVE; variable X : out REAL); 

この手順は、呼び出しごとに更新される2つのシード変数を必要とします。出力Xは0と1の間の疑似乱数実数です。アルゴリズムは決定論的であるため、同じ初期シード・ペアはまったく同じ数列を生成します。これは再現可能なテストベンチに不可欠な特性です。

基盤アルゴリズムの詳細については、Pierre L'EcuyerのEfficient and Portable Combined Random Number Generators論文を参照するか、GHDLシミュレーターにバンドルされている実装を調べてください。

テスト・ケース

以下のすべての例で、両方のシード値として999を使用します。プロセス宣言領域でシードを宣言し、ランダム化関数を同じプロセス内の不純関数として実装します:

variable seed1, seed2 : integer := 999; 

この記事のすべての例を含む完全なテストベンチをZIPファイルでダウンロードできます。アーカイブには、シミュレーションをコンパイルおよび実行するスクリプトを含むModelSimプロジェクトも含まれています。

乱数実数値

uniform手順は[0.0, 1.0]範囲の実数を返します。これを任意の区間[min_val, max_val]にマッピングするには、幅を掛けてオフセットを加算します:

impure function rand_real(min_val, max_val : real) return real is variable r : real; begin uniform(seed1, seed2, r); return r * (max_val - min_val) + min_val; end function; 

乱数整数値

実数値から乱数整数を生成するのは、単純な丸めでは極値の確率が歪むためトリッキーです。次の関数は、丸め前に0.5を加算することでこのバイアスを修正します:

VHDLで乱数生成: 一様分布からOSVVMまで

impure function rand_int(min_val, max_val : integer) return integer is variable r : real; begin uniform(seed1, seed2, r); return integer( round(r * real(max_val - min_val + 1) + real(min_val) - 0.5)); end function; 

この調整により、区間[min_val, max_val]のすべての整数が等しい確率で選択されます。

乱数std_logic_vector

任意長のstd_logic_vectorをランダム・ビットで埋めるには、各位置をイテレーションし、乱数実数が0.5を超える場合は'1'、そうでなければ'0'を割り当てます:

impure function rand_slv(len : integer) return std_logic_vector is variable r : real; variable slv : std_logic_vector(len - 1 downto 0); begin for i in slv'range loop uniform(seed1, seed2, r); slv(i) := '1' when r > 0.5 else '0'; end loop; return slv; end function; 

乱数時間値

ランダムなタイムスタンプが必要な場合(バースト・データ・トラフィックのシミュレーションなど)、乱数実数を所望の区間にスケーリングし、VHDL時間型に戻せます:

impure function rand_time(min_val, max_val : time; unit : time := ns) return time is variable r, r_scaled, min_real, max_real : real; begin uniform(seed1, seed2, r); min_real := real(min_val / unit); max_real := real(max_val / unit); r_scaled := r * (max_real - min_real) + min_real; return real(r_scaled) * unit; end function; 

シミュレーターの時間単位(例: ns)を関数に渡す必要があることに注意してください。

OSVVM Randomパッケージ

出来合いのソリューションを好むユーザーのために、OSVVMのRandomパッケージは、すべての標準VHDL型の乱数値を生成する豊富なオーバーロード関数セットを提供します。以下でパッケージをインポートします:

library osvvm; use osvvm.RandomPkg.all; 

ModelSimにはOSVVMがプリインストールされているため、そのプラットフォームでは追加ダウンロードは不要です。他のシミュレーターについては、OSVVM GitHubリポジトリのRandomPck.vhdファイルを参照してください。

VHDL

  1. VHDLで文字列リストを作成する: ベスト・プラクティスと実装例
  2. VHDLテストベンチ・シミュレーションを優雅に終了させる方法
  3. VHDLでPWMコントローラを実装: 設計、シミュレーション、FPGAデモ
  4. VHDLで保護型とアクセスポインタを用いた動的リンクリスト実装
  5. プロセス内プロシージャでVHDLステートマシンをクリーンに設計
  6. VHDLにおける不純関数の活用:FSMの可読性と保守性向上
  7. VHDL関数マスター:効率的な設計のための実践ガイド
  8. VHDLで有限ステートマシンを設計:信号機の実践例
  9. VHDLプロシージャ活用:再利用可能なコードで設計をシンプルに
  10. VHDLで信頼性の高いタイマーを構築:クロックサイクルカウントで時間を計測
  11. Java 乱数生成:Random クラスと Math.random 実践ガイド