首页 > 解决方案 > 使用线性同余生成器的 VHDL 随机数

问题描述

首先,我承认我在 VHDL 上无论如何都不是专业人士,这就是为什么我在这方面寻求帮助的原因。

我想创建一个处理使用 LCG 生成随机数的模块,所以基本上使用这个公式:

random_number = (a * seed + c) rem m;

这是代码:

    process(S_AXI_ACLK,slv_reg4) is 
variable a : integer := 10;
variable c : integer := 15;
variable m : integer := 200;
variable seed : integer := to_integer(s_slv_reg3); -- converts register to integer
variable upperLimit : integer := to_integer(s_slv_reg2);
variable lowerLimit : integer := to_integer(s_slv_reg1);

begin
    s_slv_reg1 <= unsigned(slv_reg1(7 downto 0));
    s_slv_reg2 <= unsigned(slv_reg2(7 downto 0));
    s_slv_reg3 <= unsigned(slv_reg3(7 downto 0));
    s_slv_reg4 <= unsigned(slv_reg4(7 downto 0));
    if (rising_edge (S_AXI_ACLK)) then
        if(  s_slv_reg4 = x"0002" ) then
            next_rand : for k in 0 to 2 loop
               seed := ( a * seed + c ) rem m;
            end loop next_rand;
            seed := lowerLimit + seed mod upperLimit; -- limits the value to the limit ranges defined by the user
            s_slv_reg0 <= to_unsigned(seed,s_slv_reg0'length); -- converts seed to an unsigned and then to std logic vector
            s_slv_reg4 <= x"01"; -- tells main program that its ready to be read
        end if;
    end if;
end process;

所以这段代码在实现阶段一直给我带来麻烦,它总是给出一个时序约束错误(大的负松弛)。有没有更好的方法来解决这个问题?即使我删除循环并执行此操作:

种子 := ( a * 种子 + c ) 雷姆米;

它仍然失败,将无符号数从 32 位更改为 16 位再到 8 位也没有多大帮助。怎么办呢,rem算子有那么贵吗?

标签: vhdlrandom-seed

解决方案


推荐阅读