Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> VHDL

Cara menghasilkan angka acak di VHDL

VHDL memiliki generator pseudo-acak built-in, tetapi hanya dapat menghasilkan angka floating-point antara 0 dan 1. Untungnya, Anda dapat memperoleh dari jenis format data acak lain yang Anda perlukan. Lanjutkan membaca artikel ini untuk mengetahui cara menghasilkan real atau integer nilai rentang apa pun, serta std_logic_vector acak urutan dan time nilai.

uniform prosedur dari paket IEEE MATH_REAL adalah dasar untuk algoritma yang dijelaskan dalam artikel ini. Harap diperhatikan bahwa uniform bergantung pada perangkat lunak untuk menghasilkan angka acak. Oleh karena itu, tidak satu pun dari algoritma ini yang dapat disintesis. Anda hanya dapat menggunakannya di testbenches.

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

Daftar di atas menunjukkan prototipe uniform prosedur. Dibutuhkan dua variabel benih untuk bekerja, dan itu akan memodifikasinya setiap kali Anda memanggil prosedur. Outputnya, X, adalah bilangan acak, yang selalu memiliki nilai antara 0 dan 1.

Sama seperti generator nomor pseudo-acak lainnya, uniform akan menghasilkan urutan angka yang sama ketika dipanggil dengan nilai seed awal yang sama. Karena perilaku ini, Anda dapat menjalankan kembali testbench dan mendapatkan hasil yang sama saat menggunakan nilai benih yang sama.

Lihat makalah Penghasil Angka Acak Gabungan yang Efisien dan Portabel oleh Pierre L'Ecuyer untuk penjelasan rinci tentang cara kerja algoritma ini. Anda juga dapat melihat implementasi aktual dari algoritme dalam simulator VHDL open-source GHDL.

Kasus uji

Semua contoh dalam artikel ini menggunakan nilai 999 untuk kedua benih. Kami mendeklarasikan variabel benih seperti yang tercantum di bawah ini di wilayah deklaratif dari suatu proses. Kemudian, kami menerapkan algoritme pengacakan khusus kami sebagai fungsi tidak murni dalam proses yang sama.

variable seed1, seed2 : integer := 999;

Anda dapat mengunduh testbench lengkap yang berisi semua contoh dalam artikel ini dengan menggunakan formulir di bawah ini. File Zip juga berisi proyek ModelSim dengan skrip yang mengkompilasi dan menjalankan simulasi untuk Anda.

Nilai riil acak

uniform prosedur menghasilkan real random acak nilai antara 0,0 dan 1,0. real type adalah format floating-point VHDL. Namun, kemungkinan besar Anda ingin nomor acak berada pada rentang yang berbeda.

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;

Untungnya, kita dapat dengan mudah menerjemahkan output dari uniform dengan mengalikan dengan skala dan menambahkan offset untuk itu. Kode di atas menunjukkan fungsi yang mengembalikan real secara acak nilai dalam rentang min/maks.

Nilai bilangan bulat acak

Untuk menghasilkan integer acak nilai dalam rentang yang ditentukan, Anda harus mengalikannya dengan skala dan menambahkan offset ke dalamnya. Tapi ada jebakan yang harus Anda hindari. Anda tidak bisa begitu saja membuat real random secara acak nilai dalam rentang dan bulatkan menjadi integer .

Ilustrasi di atas menunjukkan masalah. Dalam contoh, kami bermaksud untuk menghasilkan integer random acak nilai dalam rentang -1 hingga 1. Jika kita mendasarkan integer secara acak real yang berjalan tepat ke titik akhir, bilangan bulat min dan maks hanya mendapatkan setengah dari kemungkinan terpilih. Pembulatan ke 0 integer nilai terjadi separuh waktu, meskipun ada tiga pilihan angka.

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;

Pada kode di atas, kami mengoreksi masalah pembulatan titik akhir dengan menyesuaikan real random acak nilai untuk menyertakan 0,5 tambahan di atas dan di bawah titik akhir.

vektor std_logic_acak

Ada banyak cara untuk mengisi vektor dengan nilai acak, tetapi metode ini bekerja dengan vektor dengan panjang berapa pun. Saya menggunakan for-loop untuk melintasi vektor dan memilih nilai acak untuk setiap bit. Pada kode di bawah ini, len parameter menentukan panjang acak std_logic_vector untuk kembali.

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;

Nilai waktu acak

Terkadang Anda perlu membuat time secara acak nilai di testbench Anda. Mungkin Anda ingin mensimulasikan antarmuka eksternal yang menulis semburan data secara acak. Apapun alasannya, acak time nilai mudah dibuat.

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;

Untuk menghasilkan time random acak nilai dalam VHDL, Anda harus terlebih dahulu mengonversi nilai min dan maks yang diinginkan menjadi real jenis. Kemudian, setelah formula pengacakan melakukan keajaibannya, Anda mengubah hasilnya kembali menjadi time VHDL Tipe. Perhatikan bahwa Anda harus memberikan unit waktu simulasi yang Anda gunakan di simulator sebagai argumen untuk fungsi ini, seperti yang ditunjukkan pada kode di atas.

Paket Acak OSVVM

Terakhir, sebagai alternatif untuk membuat algoritma pengacakan secara manual, Anda dapat menggunakan paket Random dari perpustakaan OSVVM. Ini memiliki beberapa fungsi kelebihan beban untuk menghasilkan nilai acak untuk semua jenis tipe VHDL.

Open Source VHDL Verification Methodology (OSVVM) adalah pustaka VHDL untuk membuat testbenches terstruktur. Paket Acak hanyalah satu dari banyak paket berguna di perpustakaan ini.

library osvvm;
use osvvm.RandomPkg.all;

Kode di atas menunjukkan cara mengimpor paket OSVVM. ModelSim menyertakan perpustakaan di luar kotak, jadi Anda tidak perlu mengunduhnya untuk simulator ini. Lihat file RandomPck.vhd dari repo OSVVM GitHub untuk menemukan fungsi pengacakan yang sesuai dengan kebutuhan Anda.


VHDL

  1. Cara membuat daftar string di VHDL
  2. Bagaimana menghentikan simulasi di testbench VHDL
  3. Cara membuat pengontrol PWM di VHDL
  4. Cara membuat Daftar Tertaut di VHDL
  5. Cara menggunakan Prosedur dalam Proses di VHDL
  6. Cara menggunakan Fungsi Tidak Murni di VHDL
  7. Cara menggunakan Fungsi di VHDL
  8. Cara membuat Mesin Finite-State di VHDL
  9. Cara menggunakan Prosedur di VHDL
  10. Cara Menghasilkan Angka Acak di Jawa