산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
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); 

두 시드 변수 필요, 호출마다 업데이트. 출력 X는 0~1 사이 유사 난수 실수. 알고리즘이 결정론적이므로 같은 초기 시드 쌍이면 정확한 같은 수열 생성 - 반복 가능한 테스트벤치에 필수적 속성.

기반 알고리즘 깊은 이해 위해 Pierre L'Ecuyer의 Efficient and Portable Combined Random Number Generators 논문 참조, 또는 GHDL 시뮬레이터에 번들된 구현 검토.

테스트 케이스

아래 모든 예제는 두 시드 값 모두 999 사용. 시드들을 프로세스 선언부에 선언, 난수화 함수를 동일 프로세스 내 순수 함수(impure function)로 구현:

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 FSM 설계 깔끔하게 만들기
  6. VHDL 비순수 함수 활용: FSM 가독성과 유지보수성 높이기
  7. VHDL 함수 마스터하기: 효율적 설계를 위한 실전 가이드
  8. VHDL 유한 상태 머신 설계: 신호등 실전 예제
  9. VHDL 프로시저 활용: 재사용 코드로 설계 단순화하기
  10. Java 난수 생성: Random 클래스와 Math.random 실전 가이드