vhdl - 使用线性同余生成器的 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算子有那么贵吗?
解决方案
推荐阅读
- java - 我如何在 Spring Boot 嵌入式服务器(tomcat)中部署现有的 Web 应用程序(战争)
- ssh - 无法通过 SSH 连接到 VM 实例
- web-services - Pentaho / Salesforce:如何将 SF-Enterprise-Web-Services-API V48.0 集成到仅支持 v47.0 的 PDI 9.0 中
- r - 如何在相同的 ggplot2 (R) 上拟合负二项式、正态和泊松密度函数但缩放到计数数据?
- python - 将 NIFTI 图像拆分为体素补丁
- php - 运行 heroku 时出错运行 php artisan migrate
- python - 使用 pandas 更改列数据类型
- c# - 当我对我的 XmlElement 使用 SelectSingleNode 方法时,它仍然读取整个文档而不是在我的元素内
- python - 我的 Discord Bot 如何断开与 Voicechannel 的连接
- windows - 两个 QMainWindows:屏幕共享应用程序在前台显示第二个窗口