Random 缩小128位异或移位的比例。-vhdl中的PRNG

Random 缩小128位异或移位的比例。-vhdl中的PRNG,random,vhdl,vivado,Random,Vhdl,Vivado,我试图找到一种使用vivado在vhdl中生成随机值(伪随机值也可以)的方法(这意味着我不能使用math_real库) 这些随机值将确定预分频器将运行的计数数,然后依次生成用于应用程序的随机定时 这意味着生成的值不需要非常特定的值,因为我可以随时调整预分频器的运行速度。一般来说,我寻找的是1000-10000之间的值,但大一点也可以 我在网上找到了下面的代码,它实现了128位的xorshift,并且似乎工作得很好。唯一的问题是,值太大,转换为整数没有意义,因为无符号整数的最大值是2^32 代码如

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

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

这意味着生成的值不需要非常特定的值,因为我可以随时调整预分频器的运行速度。一般来说,我寻找的是1000-10000之间的值,但大一点也可以

我在网上找到了下面的代码,它实现了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;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体XORSHIFT_128为
港口(
CLK:标准逻辑中;
复位:在标准逻辑中;
输出:输出标准逻辑向量(127向下至0)
);
结束XORSHIFT_128;
XORSHIFT_128的体系结构是
信号状态:无符号(127到0):=to_无符号(1128);
开始

输出要将RNG的范围缩小到两个范围的较小幂次方,只需忽略一些位。我猜这类似于
输出(15到0)
,但我根本不懂VHDL

剩余的位代表发电机的工作状态,即使不使用,也无法从设计中删除


如果您的意思是生成器使用了太多的门,那么您需要找到不同的算法。Wikipedia提供了一个C语言版本,您可以对其进行调整。

旧Xilinx应用说明中的表3提供了您所提到的8位随机发生器电路所需的信息。