亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> VHDL

VHDL 生成随机数:从均匀分布到 OSVVM

VHDL 内置伪随机生成器产生 [0, 1] 区间浮点值。通过缩放和偏移,可创建任意类型随机数据——实数、整数、std_logic_vector 或 time,适用于测试平台。以下指南展示如何用 IEEE MATH_REAL 包的 uniform 过程构建这些生成器,并利用 OSVVM Random 包获得更大灵活性。

下面示例基于 IEEE MATH_REAL 包定义的 uniform 过程:

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

它需两个种子变量,每次调用更新。输出 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 time 类型:

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. 构建VHDL时钟触发进程实战指南
  12. Java 生成随机数实战:Random 与 Math.random 详解