生成随机数VHDL

时间:2015-03-13 11:24:52

标签: vhdl

我需要在test_bench中生成13位的随机二进制数。然后,当开始信号设置为1时,生成随机num_bin。因为在我的代码中没有生成?即生成0000000000000,何时应生成13位数。有什么不对?谢谢

注意:num_bin输入是我必须在另一个进程中提供的数字。

  .
  .
  .
 reset <= '1', '0' after 75 ns;
 inicio <='0', '1' after 100 ns;

 process
 variable seed1 :integer ;
 variable seed2 :integer ;
 variable re1 : integer;
 variable re2 : real ;
 begin  

    if inicio = '1' then
    uniform (seed1,seed2,re2);
    re1 := integer (re2 * real(2**13 -1));  
   num_bin <= std_logic_vector ( to_unsigned (re1,13));
    end if;
 wait;
 end process;

2 个答案:

答案 0 :(得分:1)

如果要在VHDL中生成随机数,请查看开源OSVVM库。 http://www.osvvm.org

答案 1 :(得分:0)

删除流程中的条件并将seed1,seed2更改为正数并让流程生成多个num_bin值:

library ieee;
use ieee.std_logic_1164.all;
use ieee.math_real.all;
use ieee.numeric_std.all;

entity uni is
end entity;

architecture foo of uni is
    signal num_bin: std_logic_vector (12 downto 0);
begin

NOLABEL:
    process
    variable seed1 :positive ;
    variable seed2 :positive ;
    variable re1 : integer;
    variable re2 : real ;
    begin  

       -- if inicio = '1' then
       uniform (seed1,seed2,re2);
       re1 := integer (re2 * real(2**13 -1));  
      num_bin <= std_logic_vector ( to_unsigned (re1,13));
       -- end if;
    wait for 10 ns;
    if Now > 50 ns then
        wait;
    end if;
    end process;

MONITOR:
    process (num_bin)
    begin
        report "uniform = " & to_string(num_bin) severity NOTE;
    end process;
end architecture;

我们得到:

  

$ GHDL -r uni
  uni.vhdl:44:9:@ 0ms :(报告说明):制服= uuuuuuuuuuuuu
  uni.vhdl:44:9:@ 0ms :(报告单):uniform = 1111111111111
  uni.vhdl:44:9:@ 10ns :(报告说明):制服= 1111100101110
  uni.vhdl:44:9:@ 20ns :(报告说明):制服= 1010010111000
  uni.vhdl:44:9:@ 30ns :(报告说明):制服= 0101010101000
  uni.vhdl:44:9:@ 40ns :(报告说明):制服= 0000100101111
  uni.vhdl:44:9:@ 50ns :(报告说明):制服= 0010100101101

所有&#39; 1的第一个非初始值可能是seed1和seed2的初始值为类型为正的结果。

如果除了所有人之外没有得到任何其他内容,你是否正在将num_bin初始化为&#39; 0&#39;

重新添加条件评估并初始化num_bin:

architecture fum of uni is
    signal num_bin: std_logic_vector (12 downto 0) := (others => '0');
    signal inicio: std_logic;
begin
    inicio <='0', '1' after 100 ns;
NOLABEL:
    process
    variable seed1 :positive ;
    variable seed2 :positive ;
    variable re1 : integer;
    variable re2 : real ;
    begin  
        if inicio = '1' then
            uniform (seed1,seed2,re2);
            re1 := integer (re2 * real(2**13 -1));  
            num_bin <= std_logic_vector ( to_unsigned (re1,13));
        end if;
        wait;
    end process;

MONITOR:
    process (num_bin)
    begin
        report "uniform = " & to_string(num_bin) severity NOTE;
    end process;
end architecture;

我们得到:

  

$ GHDL -r uni
  uni.vhdl:71:9:@ 0ms :(报告说明):uniform = 0000000000000

如果我们没有初始化num_bin,我们就会得到所有人。

原因在于未标记过程中的等待语句。您的进程将只执行一次,遇到等待,再也不会执行。该执行发生在初始化期间。

IEEE Std 1076-2008 14.7.5模型执行,14.7.5.1概述

  

模型的执行包括初始化阶段,然后在该模型的描述中重复执行流程语句。 ......

我将切换到1076-1993 12.6.4模拟周期,因为它不受在此上下文中不感兴趣的事物的阻碍。它是执行-2008模型时发生的事情的一个子集。

  

在初始化开始时,假设当前时间Tc为0 ns。

     

初始化阶段包括以下步骤:

     
    

- 计算每个明确声明的信号的驱动值和有效值,并且将信号的当前值设置为有效值。假设该值在模拟开始之前的无限长时间内是信号的值。

  

VHDL中的所有对象都有一个值。如果没有提供inicio声明中的默认值,默认值就是它的LEFT值,在这种情况下是&#39; U&#39;。

如果没有为if语句中的条件传递集合的inicio的默认值,我们就不会调用if语句所包含的语句序列的执行。以下等待语句确保该过程不会再次执行。我们从未为num_bin生成随机数值。

以inicio为条件删除if语句是不够的。我们可以看到,如果没有为seed1和seed2之一或两者生成随机或至少非1值,将获得num_bin上所有&#39; 1的第一个值。 (并且没有随机种子优先值,UNIFORM调用产生的值序列是可重复的。)