按比例缩小 128 位 Xorshift。 - vhdl 中的 PRNG

Scaling down a 128 bit Xorshift. - PRNG in vhdl

我正在尝试找出一种使用 vivado 在 vhdl 中生成随机值(伪随机就可以)的方法(这意味着我不能使用 math_real 库)。

这些随机值将决定预分频器将 运行 的计数数量,然后将生成用于应用程序的随机时序。

这意味着生成的值不需要非常具体的值,因为我总是可以调整预分频器的速度 运行s。一般来说,我正在寻找 1000 - 10,000 之间的值,但大一点也可以。

我在网上找到了以下代码,它实现了 128 位 xorshift,并且看起来工作得很好。唯一的问题是值太大,转换为整数毫无意义,因为无符号整数的最大值为 2^32。

这是代码:

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

entity XORSHIFT_128 is
    port (
        CLK : in std_logic;
        RESET : in std_logic;
        OUTPUT : out std_logic_vector(127 downto 0)
    );
end XORSHIFT_128;

architecture Behavioral of XORSHIFT_128 is
    signal STATE : unsigned(127 downto 0) := to_unsigned(1, 128);

begin
    OUTPUT <= std_logic_vector(STATE);

    Update : process(CLK) is
        variable tmp : unsigned(31 downto 0);
    begin
        if(rising_edge(CLK)) then
            if(RESET = '1') then
                STATE <= (others => '0');
            end if;
            tmp := (STATE(127 downto 96) xor (STATE(127 downto 96) sll 11));
            STATE <= STATE(95 downto 0) &
                ((STATE(31 downto 0) xor (STATE(31 downto 0) srl 19)) xor (tmp xor (tmp srl 8)));
        end if;
    end process;
end Behavioral;

在过去的几个小时里,我一直在尝试将这个 128 位 xorshift PRNG 缩小到 8 位、16 位甚至 32 位 PRNG,但每次我都没有输出或我的模拟(测试台)冻结一个周期后。

我试过只除以某种方式有效的值,但是 128 位 xorshift 的输出大小太大,以致于它成为处理这种情况的一种非常笨拙的方法。

非常欢迎任何想法或指示。

要将 RNG 的范围缩小到较小的两个范围的幂,只需忽略某些位即可。我想这有点像 OUTPUT(15 downto 0) 但我根本不懂 VHDL。

其余位表示发生器的工作状态,即使不使用也不能从设计中删除。

如果您的意思是生成器使用了太多的门,那么您需要找到不同的算法。维基百科在 C 中给出了一个 example 32-bit xorshift generator,您可以对其进行改编。

Table 旧的 Xilinx 应用笔记中的 3 包含制作您提到的 8 位随机发生器电路所需的信息。 https://www.xilinx.com/support/documentation/application_notes/xapp052.pdf