按比例缩小 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
我正在尝试找出一种使用 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