如何在FPGA中生成伪随机数?

发布于 2024-07-27 18:48:19 字数 22 浏览 7 评论 0原文

如何在FPGA中生成伪随机数?

How to generate pseudo random number in FPGA?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

水水月牙 2024-08-03 18:48:19

这已经被涵盖了(我会选择 LFSR):
Spartan-3E 上的随机数生成

This has been covered (I'd go for an LFSR):
Random number generation on Spartan-3E

半步萧音过轻尘 2024-08-03 18:48:19

Xilinx 有一篇关于在 FPGA 中高效生成伪随机数序列的优秀应用说明。 它是XAPP052

There's an excellent Xilinx application note on generating pseudo-random number sequences efficiently in an FPGA. It's XAPP052.

掩耳倾听 2024-08-03 18:48:19

如果不是用于密码学或其他具有智能对手的应用程序(例如赌博),我会使用 线性反馈移位注册方法。

它只使用异或和移位,因此在硬件中实现非常简单。

If it's not for cryptography or other applications with an intelligent adversary (e.g. gambling) I'd use a linear feedback shift register approach.

It only uses exclusive or and shift, so it is very simple to implement in hardware.

金橙橙 2024-08-03 18:48:19

正如其他人所说,LFSR 可用于 FPGA 中的伪随机数。 这是最大长度 32 位 LFSR 的 VHDL 实现。

process(clk)

  -- maximal length 32-bit xnor LFSR based on xilinx app note XAPP210
  function lfsr32(x : std_logic_vector(31 downto 0)) return std_logic_vector is
  begin
    return x(30 downto 0) & (x(0) xnor x(1) xnor x(21) xnor x(31));
  end function;

begin
  if rising_edge(clk) then
    if rst='1' then
      pseudo_rand <= (others => '0');
    else
      pseudo_rand <= lfsr32(psuedo_rand);
    end if;
  end if;
end process;

As others have said, LFSRs can be used for pseudo random numbers in an FPGA. Here is a VHDL implementation of a maximal length 32-bit LFSR.

process(clk)

  -- maximal length 32-bit xnor LFSR based on xilinx app note XAPP210
  function lfsr32(x : std_logic_vector(31 downto 0)) return std_logic_vector is
  begin
    return x(30 downto 0) & (x(0) xnor x(1) xnor x(21) xnor x(31));
  end function;

begin
  if rising_edge(clk) then
    if rst='1' then
      pseudo_rand <= (others => '0');
    else
      pseudo_rand <= lfsr32(psuedo_rand);
    end if;
  end if;
end process;
々眼睛长脚气 2024-08-03 18:48:19

如果您需要一个随机单词,例如 C rand() 函数,则 LFSR 本身无法完成这项工作。 为此,我制作了一个小型开源 FPGA rand() 模块。

它针对初始状态和输出宽度进行参数化。 它是使用 Xilinx DSP48 内核编写的,运行速度非常快。 与 Mersenne Twister 相比,单个 DSP48 可以提供良好的结果。

https://github.com/hdlguy/pg_prng

如果您需要的话,该项目还包含参数化 LFSR 模块。

If you need a randomized word, like the C rand() function, an LFSR by itself will not do the job. I made a little open-source FPGA rand() module for that purpose.

It is parameterized for initial state and output width. It is written to use the Xilinx DSP48 core and runs very fast. A single DSP48 gives good results compared to the Mersenne Twister.

https://github.com/hdlguy/pg_prng

This project also contains parameterized LFSR modules if that's what you need.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文