산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> VHDL

VHDL에서 난수를 생성하는 방법

VHDL에는 의사 난수 생성기가 내장되어 있지만 0과 1 사이의 부동 소수점 수만 생성할 수 있습니다. 다행히도 이로부터 필요한 다른 임의의 데이터 형식을 파생할 수 있습니다. 이 기사를 계속 읽고 real를 생성하는 방법을 알아보세요. 또는 integer 임의의 std_logic_vector 뿐만 아니라 모든 범위의 값 시퀀스 및 time 가치.

uniform IEEE MATH_REAL 패키지의 절차는 이 기사에서 설명하는 알고리즘의 기초입니다. uniform 난수를 생성하는 소프트웨어에 의존합니다. 따라서 이러한 알고리즘 중 어느 것도 합성할 수 없습니다. 테스트벤치에서만 사용할 수 있습니다.

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

위의 목록은 uniform의 프로토타입을 보여줍니다. 절차. 작동하려면 두 개의 시드 변수가 필요하며 프로시저를 호출할 때마다 수정됩니다. 출력 X는 항상 0과 1 사이의 값을 갖는 난수입니다.

다른 의사 난수 생성기와 마찬가지로 uniform 동일한 초기 시드 값으로 호출될 때 동일한 숫자 시퀀스를 생성합니다. 이 동작으로 인해 테스트 벤치를 다시 실행하고 동일한 seed 값을 사용할 때 동일한 결과를 얻을 수 있습니다.

이 알고리즘의 작동 방식에 대한 자세한 설명은 Pierre L'Ecuyer의 Efficient and Portable Combined Random Number Generators 문서를 참조하십시오. GHDL 오픈 소스 VHDL 시뮬레이터에서 알고리즘의 실제 구현을 볼 수도 있습니다.

테스트 케이스

이 문서의 모든 예제에서는 두 시드에 대해 값 999를 사용합니다. 프로세스의 선언적 영역에서 아래와 같이 시드 변수를 선언합니다. 그런 다음 동일한 프로세스 내에서 순수하지 않은 함수로 사용자 지정 무작위 알고리즘을 구현합니다.

variable seed1, seed2 : integer := 999;

아래 양식을 사용하여 이 기사의 모든 예제가 포함된 완전한 테스트벤치를 다운로드할 수 있습니다. Zip 파일에는 시뮬레이션을 컴파일하고 실행하는 스크립트가 포함된 ModelSim 프로젝트도 포함되어 있습니다.

임의의 실수값

uniform 프로시저는 임의의 real를 생성합니다. 0.0과 1.0 사이의 값. real type은 VHDL의 부동 소수점 형식입니다. 그러나 난수가 다른 범위에 있기를 원할 가능성이 있습니다.

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;

다행히도 uniform의 출력을 쉽게 번역할 수 있습니다. 스케일을 곱하고 오프셋을 추가합니다. 위의 코드는 임의의 real을 반환하는 함수를 보여줍니다. 최소/최대 범위 내의 값입니다.

임의의 정수값

임의의 integer를 생성하려면 지정된 범위 내에서 값을 얻으려면 눈금을 곱하고 오프셋을 추가해야 합니다. 그러나 피해야 할 함정이 있습니다. 단순히 임의의 real를 생성할 수 없습니다. 범위 내에서 값을 반환하고 integer으로 반올림 .

위의 그림은 문제를 보여줍니다. 이 예에서는 임의의 integer을 생성하려고 합니다. -1에서 1 사이의 값입니다. integer을 기반으로 하는 경우 임의의 real에서 정확히 끝점으로 이동하면 최소 및 최대 정수가 선택될 확률의 절반만 얻습니다. 0 integer로 반올림 3개의 숫자 선택이 있더라도 가치는 절반으로 발생합니다.

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;

위의 코드에서 임의의 real를 조정하여 끝점 반올림 문제를 수정합니다. 끝점 위와 아래에 추가로 0.5를 포함하는 값입니다.

임의의 std_logic_vector

임의의 값으로 벡터를 채우는 방법에는 여러 가지가 있지만 이 방법은 모든 길이의 벡터에서 작동합니다. 저는 for 루프를 사용하여 벡터를 탐색하고 모든 비트에 대해 임의의 값을 선택합니다. 아래 코드에서 len 매개변수는 임의의 std_logic_vector 길이를 결정합니다. 반환합니다.

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;

임의의 시간 값

때때로 임의의 time를 생성해야 합니다. 테스트 벤치의 가치. 무작위로 데이터 버스트를 기록하는 외부 인터페이스를 시뮬레이션하고 싶을 수 있습니다. 이유가 무엇이든 임의의 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;

임의의 time을 생성하려면 VHDL의 값을 사용하려면 먼저 원하는 최소값과 최대값을 real으로 변환해야 합니다. 유형. 그런 다음 임의화 공식이 마법을 수행한 후 결과를 다시 VHDL time으로 변환합니다. 유형. 위의 코드와 같이 시뮬레이터에서 사용하는 시뮬레이션 시간 단위를 이 함수에 대한 인수로 지정해야 합니다.

OSVVM 랜덤 패키지

마지막으로 무작위화 알고리즘을 손으로 만드는 대신 OSVVM 라이브러리에서 Random 패키지를 사용할 수 있습니다. 모든 종류의 VHDL 유형에 대해 임의 값을 생성하기 위한 여러 오버로드된 기능이 있습니다.

OSVVM(Open Source VHDL Verification Methodology)은 구조화된 테스트벤치를 만들기 위한 VHDL 라이브러리입니다. Random 패키지는 이 라이브러리에 있는 많은 유용한 패키지 중 하나일 뿐입니다.

library osvvm;
use osvvm.RandomPkg.all;

위의 코드는 OSVVM 패키지를 가져오는 방법을 보여줍니다. ModelSim에는 기본 제공되는 라이브러리가 포함되어 있으므로 이 시뮬레이터용으로 다운로드할 필요가 없습니다. OSVVM GitHub 리포지토리에서 RandomPck.vhd 파일을 참조하여 필요에 적합한 무작위화 기능을 찾으십시오.


VHDL

  1. VHDL에서 문자열 목록을 만드는 방법
  2. VHDL 테스트벤치에서 시뮬레이션을 중지하는 방법
  3. VHDL에서 PWM 컨트롤러를 만드는 방법
  4. VHDL에서 연결 목록을 만드는 방법
  5. VHDL의 프로세스에서 프로시저를 사용하는 방법
  6. VHDL에서 불순 함수를 사용하는 방법
  7. VHDL에서 함수를 사용하는 방법
  8. VHDL에서 유한 상태 기계를 만드는 방법
  9. VHDL에서 프로시저를 사용하는 방법
  10. Java에서 난수를 생성하는 방법