Verilog仿真模块--真随机数生成器

前言
在进行功能仿真时,总是希望仿真条件能覆盖尽量多的情况,因此,经常需要产生随机数作为仿真的输入。Verilog 和 SV 中有能够产生随机数的系统函数 $random,可惜的是此函数产生的随机数是伪随机数,重新再跑一次仿真,它还是产生那些数,这使得两次仿真没有什么区别,覆盖的测试条件是一样的。这种情况不便于测试出模块在某些特殊输入时可能出现的问题,我们希望的是每次仿真都不一样。因此,就有了在仿真文件中产生真随机数的需求。
一、随机数函数 urandom、random 和 srandom
本章参考:
-
SystemVerilog IEEE 1800-2017 -- 18.13 Random number system functions and methods -
SystemVerilog IEEE 1800-2017 -- 20.15.1 $random function
SV 标准中提供了多个用于产生随机数的函数,简介如下。
1.1 $urandom
SystemVerilog 中加入了新的随机数生成函数 urandom()
,此函数相较于 $random()更加方便,函数原型:
function int unsigned $urandom[(int seed );
输入:可选参数 seed。
返回值:int unsigned 类型,无符号 32 位整数,数值大小为 0 ~ 2**32-1。
种子(seed)是一个可选参数,用于确定生成的随机数序列。种子可以是任何整数表达式。每次使用相同的种子时,随机数生成器(RNG)应生成相同的随机数序列。
RNG 是确定性的。每次程序执行时,它都会循环相同的随机序列。通过使用外部随机变量,如一天中的时间,来初始化 $urandom 函数,可以使该序列变得非确定性。
1.1.1 $urandom_range(推荐使用)
更常用的函数为 $urandom_range
,函数原型:
function int unsigned $urandom_range( int unsigned maxval,
int unsigned minval = 0 );
输入 1:maxval,最大值,32 位无符号数,必须指定此参数;
输入 2:minval,最小值,32 位无符号数,默认为 0,即可省略此参数。
返回值:32 位无符号数,数值大小为 0 ~ 2**32-1。
另外,$urandom_range
函数内部有判断 maxval 和 minval 大小的逻辑,如果输入参数 maxval < minval,此函数会自动反转输入参数。例如:
$urandom_range(20, 100) // 产生20 ~ 100的整数
$urandom_range(100, 20) // 与上式等价
另一个例子:
$urandom_range(2652) // 产生0 ~ 2562的整数
$urandom_range(0, 2562) // 与上式等价
$urandom_range(2562, 0) // 与上式等价
1.1.2 Vivado 中关于 $urandom_range 的 BUG
理论上,$urandom_range
输入参数 maxval 的最大值应该是 2**32-1(4294967295)。但在,Vivado 仿真中 maxval 的值指定为 2^32-1(4294967295)会有问题,正常应该是 0~4294967295 范围内产生随机数,但实测时随机数只有两个,0 或者 4294967295,就好像 $urandom_range(0,-1)
一样,这显然是不符合 SV 标准中的描述的。
经过在 Vivado 2024.2 中的详细测试,maxval 的上限
是应该是 2**31-1
,实测 $urandom_range(0,2**31-1)
可以正常产生随机数,而 $urandom_range(0,2**31)
就不太正常。调换 maxval 和 minval 的位置还是一样。
但是,在 modelsim SE-64 2020.4 中进行仿真时,$urandom_range(0,2**32-1)
能够正常工作,进行各种其它范围的测试都能够正常工作,完全符合 $urandom_range
在 SV 标准中的描述。
结论:函数 $urandom_range
在 Vivado 2024.2 的仿真工具 XSIM 中 存在BUG
。
建议,在 Vivado 中使用 $urandom_range
时,maxval 赋值不要大于 2**31-1,即 2147483647。
猜测,Vivado 中 $urandom_range
的内部实现逻辑就是给后文介绍的 $random
取绝对值,简单粗暴,但显然会造成错误。
1.1.3 不要使用带 seed 的 $urandom(seed)函数
注意:不要使用带 seed 的 $urandom(seed)
函数,很容易造成问题,原本 urandom 是自动管理 seed,此函数又主动指定了 seed,可能导致 urandom_range 函数失去作用,总是产生同一个值。可以试着运行一下这段代码,就会发现每次 $urandom_range 产生的值都是一样的,都是 823。
//++ 生成随机数 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int num1;
int num2;
initial begin
repeat(10) begin
num1 = $urandom(100);
$display("num1 = ", num1);
num2 = $urandom_range(0, 1000);
$display("num2 = ", num2);
#1;
end
$stop;
end
//-- 生成随机数 ------------------------------------------------------------
并且必须使用 num1 = $urandom(seed); 这种形式,
直接用 $urandom(seed),如下所示,运行仿真时会报错。
initial begin
$urandom(100);
$stop;
end
ERROR: [XSIM 43-3122] " C:/_myOpenSource/verilog-simulation-module--RandomNum/SIM/genRandomNum.sv " Line 57. urandom system task is not supported.
在 Vivado 2024.2 中仿真报 urandom 系统任务不被支持的错误。
综上,总是应该使用 $urandom_range
,禁止使用 $urandom(seed)
,当需要固定种子时,请使用 $srandom(seed)
函数,本文后续会讲。
1.2 $random(不推荐)
SystemVerilog 中的 $random
是 Verilog 遗留的随机数生成函数,主要用于生成 32 位有符号整数 的随机数。其语法和行为与 $urandom
存在显著差异,需谨慎使用。函数原型:
function int $random([int seed]);
输入:seed,可选参数,手动指定随机数种子。若省略,使用内部状态生成随机序列。
返回值:返回 -2^31 ~ 2^31-1
之间的 有符号整数(即 int
类型)。
示例用法:
int num1;
initial begin
num1 = $random; // -2**31 ~ 2**31-1
num1 = $random % 60; // -59 ~ 59
num1 = {$random} % 60; // 0 ~ 59
end
带 seed 的用法示例:
int num2;
initial begin
num2 = $random(100); // -2**31 ~ 2**31-1
$display("00 num2 = ", num2);
num2 = $random(100) % 60; // -59 ~ 59
$display("01 num2 = ", num2);
num2 = {$random(100)} % 60; // 0 ~ 59
$display("02 num2 = ", num2);
end
带了种子,产生的值就是固定的。
注意:
-
不要同时使用 $random
和$urandom
,二者的种子管理逻辑冲突,可能导致随机序列异常。 -
$random
在 SystemVerilog 中 不推荐用于新设计,优先使用更安全的$urandom
和$urandom_range
。
1.3 $srandom
SystemVerilog 提供了 $srandom()
函数用于显式设置随机数生成器的种子,函数原型:
function void $srandom(int seed);
示例用法:
initial begin
$srandom(100); //* 指定此initial块的种子
end
通过手动设置种子值,可以 精确控制随机数序列的起始点。相同种子会产生完全相同的随机序列,这对测试场景的复现至关重要。
设置的种子会影响后续所有 $urandom
和 $urandom_range
的调用,直到再次调用 $srandom
改变种子。
注意事项:
-
不要同时使用 $srandom()
和带参数的$urandom(seed)
,两者均会修改随机数生成器状态,可能导致序列混乱。 -
SV 中有线程的概念, 一个 initial 块为一个线程,每个线程都是独立的,$srandom(seed)只能改变所在 initial 块的种子,无法全局改变种子。
二、产生真随机数的方案
要产生真随机数,其实就是要改变每次仿真时,初始用到的种子,通常的做法是使用系统时间作为种子,有的方案里使用的是 $time
或者 $realtime
作为种子,实际上是不行的,这两个函数返回的是仿真时间,仿真初始时刻 $time
为 0
,但随仿真推进递增。若在初始阶段(如 initial
块开头)使用,其值可能相同,导致种子重复,如:
initial begin
#1;
seed = $time; // 此时函数固定返回1
end
那么如何获取系统时钟呢?SV 中并没有函数可以直接使用,需要借助其它语言,有两种方案经测试可行。
2.1 使用 tcl 脚本获取系统时钟,并传参给仿真文件
使用 tcl 可以实现获取系统时钟,用到的函数为:
# 获取系统以us/ms/s为单位的时间戳,
set timestamp_us [clock microseconds]
set timestamp_ms [clock milliseconds]
set timestamp_s [clock seconds]
所有精度的时间戳均以 1970 年 1 月 1 日 00:00:00 UTC 为起点(即 UNIX 纪元)。
使用 tcl 可给 SV 传参,用的函数为:
# 将seed的值传递给目标仿真进程的SEED参数
set_property generic "SEED=$seed" $target_simset
此语句等价于在 Vivado 设置中进行如下配置。若后续不再使用此参数传递方式,需手动删除相关配置。

要正常实现传参需要 在仿真顶层文件
中定义 parameter SEED。
除此之外,在实际应用时,还考虑到,保存波形配置文件与恢复波形的问题。波形配置文件包括波形窗口中有哪些波形,顺序是什么,用什么颜色,用 16 进制/10 进制进行显示等等信息。
因为波形配置文件(如 genRandomNum_behav.wcfg),文件内部是保存了参数值 SEED 值,所以再次运行 tcl,SEED 值改变,原本的波形配置文件会因为 SEED 值改变而失效(会报警告),所以,在重启仿真之前,需要读取 wcfg 文件,替换 SEED 值为新值,这部分代码对应以下 tcl 文件的 修改波形配置文件中的 SEED 值部分。
最终的 tcl 文件如下。
# ------------------------ Global Settings ------------------------
# 动态获取仿真顶层模块名
set TOP_MODULE [get_property TOP [current_fileset -simset]]
if {$TOP_MODULE eq ""} {
puts "== ERROR: Simulation top module not set! =="
return 1
}
# 波形配置文件(强制绝对路径)
set WAVE_CONFIG_FILE "[file normalize "${TOP_MODULE}_behav.wcfg"]"
puts "== WaveConfig Path: [file nativename $WAVE_CONFIG_FILE] =="
# ----------------- 动态种子生成(高随机性)-----------------
set timestamp_us [clock microseconds]
set pid [pid]
set seed [expr { ($timestamp_us ^ $pid) % 999983 + 1 }] ;# 质数取模
# ----------------- 获取仿真文件集 -----------------
set sim_sets [get_filesets -filter {FILESET_TYPE == "SimulationSrcs"}]
if {[llength $sim_sets] == 0} {
puts "== ERROR: No simulation fileset found! =="
return 1
}
set target_simset [lindex $sim_sets 0]
# ----------------- 保存当前波形配置 关闭现有仿真 -----------------
if {[current_sim -quiet] ne ""} {
# 保存当前波形配置
save_wave_config $WAVE_CONFIG_FILE
# 关闭仿真
close_sim -force
}
# ----------------- 修改波形配置文件中的SEED值 -----------------
if {[file exists $WAVE_CONFIG_FILE]} {
# 读取配置文件内容
set fp [open $WAVE_CONFIG_FILE r]
set content [read $fp]
close $fp
# 使用正则表达式精确替换SEED值
# 匹配模式:(SEED=\d+) → 替换为当前种子值
set updated_content [regsub -all {\(SEED=\d+\)} $content "(SEED=$seed)"]
# 写回修改后的配置
set fp [open $WAVE_CONFIG_FILE w]
puts $fp $updated_content
close $fp
puts "== Updated SEED value in wave config: $seed =="
}
# ----------------- 传递新的SEED值 启动新仿真 -----------------
set_property generic "SEED=$seed" $target_simset
puts "== Starting simulation with SEED = $seed =="
launch_simulation -simset $target_simset
对应的仿真顶层文件中,相关代码如下:
//++ 随机种子 与 种子数组 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*
* 通过外部TCL命令获取系统时间,再传递给SEED参数作为种子
* 需关闭仿真再启动仿真种子才会变化,重启仿真种子不变
*/
parameter int SEED = 0;
initial begin
timestamp_seed = SEED;
$display("the timestamp_seed is %d", timestamp_seed);
$display("timestamp_seed initial success!!!!!!!!!!");
-> timestamp_seed_ready;
end
int seeds [20];
event seeds_ready;
initial begin
wait(timestamp_seed_ready.triggered); //* 等待系统时间种子初始化完成
$srandom(timestamp_seed);
foreach (seeds[i]) begin
seeds[i] = $urandom(); //* 使用 $urandom() 初始化 seeds 数组
end
for (int i=0; i<20; i++) begin
$display("seeds[%0d] = 0x%08x", i, seeds[i]);
end
$display("seeds initial success!!!!!!!!!!");
-> seeds_ready; //* 种子数组初始化完成
end
//-- 随机种子 与 种子数组 ------------------------------------------------------------
//++ 生成随机数 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int unsigned num1;
initial begin
wait(seeds_ready.triggered); //* 等待种子数组初始化完成
$srandom(seeds[0]); //* 指定此initial线程的初始种子
repeat(10) begin
num1 = $urandom_range(0, 2**31-1);
$display("num1 = ", num1);
#1;
end
$finish;
end
//-- 生成随机数 ------------------------------------------------------------
操作方法:直接运行 tcl 文件即可。

仿真开始之后,点击 relaunch simulation 按钮重启仿真并不能更新 SEED,因为此时 tcl 文件没有运行,需要再运行 tcl 文件重新开始仿真,SEED 才会更新,相对来说没那么方便。
当然,tcl 文件还有很多玩法,可实现自动化仿真。
另外,点上图中的 Run Tcl Script...运行脚本,等价于在 Tcl Console 窗口输入命令:
source C:/_myOpenSource/verilog-simulation-module--RandomNum/SIM/run_sim.tcl
注意,修改路径和反斜杠。
2.2 在仿真文件中调用 C 语言获取系统时间(推荐)
使用C语言是更推荐的方法
,它的所有操作和原 SV 文件一样,只是通过 DPI-C 接口 调用 C 语言函数扩展了 SV 的功能,让 SV 可以获取到系统时间,这无疑更加方便。
SV 文件示例:
//++ 随机种子 与 种子数组 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*
* 通过调用C语言函数获取系统时间作为种子,
* 重启仿真种子会变化
*/
import "DPI-C" function longint get_system_time();
longint timestamp_us;
int timestamp_seed;
event timestamp_seed_ready;
initial begin
timestamp_us = get_system_time();
$display("timestamp_us = ", timestamp_us);
timestamp_seed = int'(timestamp_us ^ (timestamp_us >> 32)); // 高低位异或
$display("timestamp_seed = ", timestamp_seed);
$display("timestamp_seed initial success!!!!!!!!!!");
-> timestamp_seed_ready;
end
int seeds [20];
event seeds_ready;
initial begin
wait(timestamp_seed_ready.triggered); //* 等待系统时间种子初始化完成
$srandom(timestamp_seed);
foreach (seeds[i]) begin
seeds[i] = $urandom(); //* 使用 $urandom() 初始化 seeds 数组
end
for (int i=0; i<20; i++) begin
$display("seeds[%0d] = 0x%08x", i, seeds[i]);
end
$display("seeds initial success!!!!!!!!!!");
-> seeds_ready; //* 种子数组初始化完成
end
//++ 随机种子 与 种子数组 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++ 生成随机数 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int unsigned num1;
initial begin
wait(seeds_ready.triggered); //* 等待种子数组初始化完成
$srandom(seeds[0]); //* 指定此initial线程的初始种子
repeat(10) begin
num1 = $urandom_range(0, 2**31-1);
$display("num1 = ", num1);
#1;
end
$finish;
end
//-- 生成随机数 ------------------------------------------------------------
SystemVerilog 的 DPI-C(Direct Programming Interface - C) 是用于实现 SystemVerilog 与 C/C++ 代码直接交互的接口机制。它允许在 SystemVerilog 环境中无缝调用 C/C++ 函数,或在 C/C++ 中调用 SystemVerilog 函数,极大提升了系统级建模和验证的能力。
DPI-C 的核心特性:
-
双向交互
-
Import 函数:从 C/C++ 导入函数到 SystemVerilog 中调用。 -
Export 函数:将 SystemVerilog 函数导出到 C/C++ 中使用。
-
无中间层
-
直接通过函数调用实现交互,无需 PLI/VPI 的复杂接口层, 性能更高。
-
数据类型映射
-
支持基本数据类型( int
,real
等)和复杂类型(结构体、数组)的自动转换。 -
SystemVerilog 与 C/C++ 之间的数据通过 值传递 或 指针引用 交换。
C 文件示例:
#include <stdio.h>
#if defined(_WIN32)
#include <windows.h>
#else
#include <sys/time.h>
#endif
long long get_system_time() {
#if defined(_WIN32)
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
ULARGE_INTEGER uli;
uli.LowPart = ft.dwLowDateTime;
uli.HighPart = ft.dwHighDateTime;
// 转换为 1970-01-01 基准的微秒数
const long long EPOCH_OFFSET = 116444736000000000LL; // 1601至1970的100ns间隔
return (uli.QuadPart - EPOCH_OFFSET) / 10; // 100ns -> μs
#else
struct timeval tv;
gettimeofday(&tv, NULL);
return (long long)tv.tv_sec * 1000000 + tv.tv_usec;
#endif
}
利用 DPI-C 可实现各种复杂功能,这里仅使用了 C 语言中获取系统时间的函数。
在 Vivado 中进行仿真时,需要将 C 文件,如下图的 time.c 添加到仿真文件中,这样仿真器就能够找到相关 C 语言函数了。

注意,添加仿真文件时,文件类型注意选择 all files,否则可能不显示后缀名为.c 的文件。
此方案,不需要先关闭仿真,再运行仿真,直接点击 Relaunch Simulation按钮
(如下图所示),即可更新种子,实现真随机数。

三、总结
推荐使用 SV 支持的 DPI-C 特性,通过 C 语言函数扩展 SV 的功能,获取到系统时间戳,再通过 $srandom(seed)函数设置每个 initial 块的种子,即可实现每次仿真产生真随机数。
四、分享
相关源码分享,两平台同步。
Verilog 仿真模块--生成真随机数[1]
zhengzhideakang/verilog-simulation-module--RandomNum[2]
后续如有更改将不再更新文章,会直接推送到上面两个平台仓库中。
如果本文对你有所帮助,欢迎点赞、转发、收藏、评论让更多人看到,赞赏支持就更好了。
如果对文章内容有疑问,请务必清楚描述问题,留言评论或私信告知我,我看到会回复。

徐晓康的博客 持续分享高质量硬件、FPGA 与嵌入式知识,软件,工具等内容,欢迎大家关注。
Verilog 仿真模块--生成真随机数: https://gitee.com/xuxiaokang/verilog-simulation-module--RandomNum
[2]zhengzhideakang/verilog-simulation-module--RandomNum: https://github.com/zhengzhideakang/verilog-simulation-module--RandomNum
相关文章:
Verilog仿真模块--真随机数生成器
前言 在进行功能仿真时,总是希望仿真条件能覆盖尽量多的情况,因此,经常需要产生随机数作为仿真的输入。Verilog 和 SV 中有能够产生随机数的系统函数 $random,可惜的是此函数产生的随机数是伪随机数,重新再跑一次仿真&…...
融合AI助力医疗提效,华奥系医务系统助力医院数字化升级!
医疗资源供需优化一直是医院关注的重点问题。据此,华奥系科技推出华奥系智能医务管理系统,并基于DeepSeek-R1大模型,自主研发将AI智能诊疗助手融入系统。以“智能驱动效率、数据赋能管理”为核心,打造覆盖医院全场景的数字化解决方…...
UDP报文结构
文章目录 简介UDP报文结构解析UDP的特点使用 UDP 的注意事项 简介 用户数据报协议(User Datagram Protocol,UDP)是传输层的一种无连接协议,它与TCP相比,没有复杂的连接建立、维护和拆解过程,在传输效率上具…...
综合开发-手机APP远程控制PLC1500柱灯的亮灭
要通过 Unity3D 开发的手机 App 控制 电气柜上面的柱灯,需要WIFI模块作为桥梁,按照以下步骤实现: 1. 硬件准备(硬件部分) 所需材料 ESP32开发板(如ESP32-WROOM-32&a…...
4:机器人目标识别无序抓取程序二次开发
判断文件是否存在 //判断文件在不在 int HandEyeCalib::AnsysFileExists(QString FileAddr) {QFile File1(FileAddr);if(!File1.exists()){QMessageBox::warning(this,QString::fromLocal8Bit("提示"),FileAddrQString::fromLocal8Bit("文件不存在"));retu…...
数据结构篇:线性表的另一表达—链表之单链表(下篇)
目录 1.前言 2.是否使用二级指针 3.插入/删除 3.1 pos位置前/后插入 3.2 查找函数 3.3 pos位置删除 3.4 pos位置后面删除 3.5 函数的销毁 4.断言问题 4.1 断言pphead 4.2 断言*pphead 5.三个文件的代码 5.1 头文件 5.2 具体函数实现 5.3 测试用例 1.前言 之前是讲…...
C# 异步详解
C# 异步编程详解 一、异步编程基础概念 1. 同步 vs 异步 同步(Synchronous):任务按顺序执行,前一个任务完成后才会执行下一个异步(Asynchronous):任务可以非阻塞地启动,主线程可以继续执行其他操作 2. 异步编…...
X²+1素数问题
X1素数问题是与哥德巴赫猜想和孪生素数猜想同时代的著名数学难题。是否有无穷个正整数x,使得x1总是素数? 其困难程度不亚于哥德巴赫猜想。特别是100多年以来,许许多多一流数论学者对这个问题进行了研究。 X1素数 X1素数是一个著名的猜想&…...
【自定义控件实现最大高度和最大宽度实现】
背景 开发中偶尔遇到控件宽度或者高度在自适应的情况下,有个边界值,也就是最大值。 比如高度自适应的情况下最大高度300dp这种场景。 实现 关键节点代码: Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)…...
基于C++的IOT网关和平台4:github项目ctGateway交互协议
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 …...
DeepSeek谈《凤凰项目 一个IT运维的传奇故事》
《凤凰项目:一个IT运维的传奇故事》(The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win)是Gene Kim、Kevin Behr和George Spafford合著的一部小说,通过虚构的故事生动展现了IT运维中的核心挑战和Dev…...
Spyglass:官方Hands-on Training(一)
相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 本文是对Spyglass Hands-on Training中第一个实验的翻译(有删改),Lab文件可以从以下链接获取。Spyglass Hands-on Traininghttps:…...
10.idea中创建springboot项目_jdk17
10.idea中创建springboot项目_jdk17 1. 准备工作 安装 JDK 17: 确保已安装 JDK 17,并配置环境变量 JAVA_HOME 指向 JDK 17 的安装路径。在 IntelliJ IDEA 中验证 JDK 配置:File → Project Structure → SDKs。 安装 IntelliJ IDEA&#x…...
指令级并行(ILP)和线程级并行(TLP)的区别,GCC -O3优化会展开循环吗?
1. GCC 自动循环展开是怎么展开的? 当你使用 -O3 这样的优化选项时,GCC 会分析你的循环。如果它认为展开循环有利可图,它会做类似这样的事情(概念上的): 原始循环 (Conceptual C Code): for (int i 0; i …...
hadoop伪分布式模式
以下是 Hadoop 伪分布式模式(Pseudo-Distributed Mode)的环境搭建步骤。伪分布式模式下,Hadoop 的各个组件(如 HDFS、YARN、MapReduce)以独立进程运行,但所有服务均部署在单台机器上,模拟多节点…...
C++入门小馆: 模板
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...
# 基于 Python 和 jieba 的中文文本自动摘要工具
基于 Python 和 jieba 的中文文本自动摘要工具 在信息爆炸的时代,快速准确地提取文本核心内容变得至关重要。今天,我将介绍一个基于 Python 和 jieba 的中文文本自动摘要工具,帮助你高效地从长文本中提取关键信息。 一、背景与需求 在处理…...
.NET平台用C#在PDF中创建可交互的表单域(Form Field)
在日常办公系统开发中,涉及 PDF 处理相关的开发时,生成可填写的 PDF 表单是一种常见需求,例如员工信息登记表、用户注册表、问卷调查或协议确认页等。与静态 PDF 不同,带有**表单域(Form Field)**的文档支持…...
Azure AI Foundry实战:从零开始构建智能应用
1. 引言 在人工智能快速发展的今天,如何高效地开发和部署AI应用已成为众多开发者和企业关注的焦点。微软的Azure AI Foundry应运而生,为AI应用开发提供了一站式解决方案。本文将带您深入了解Azure AI Foundry,并通过实战指南,帮助您从零开始构建智能应用。 2. Azure AI Found…...
YOLO视觉模型可视化训练与推理测试工具
推荐一款YOLO可视化训练测试工具: 对于yolo的训练,新手小白往往无从下手,本章推荐的这款工具可以非常轻易的帮您从模型训练到测试到部署。 下载地址http://www.voouer.com/yolo 可以点击此处跳转。 下载成功后打开这款工具,将会出现图形化界面,类似于下图所示: 当前页是可视…...
数据清洗的定义跟实际操作
数据清洗的定义 数据清洗(Data Cleaning) 是指对原始数据进行处理,以纠正、删除或填补不完整、不准确、重复或无关的数据,使其符合分析或建模的要求。数据清洗是数据预处理的关键步骤,直接影响后续分析和机器学习模型…...
如何用AI生成个人职业照/西装照?
一、核心工具推荐与对比 1. 搜狐简单AI • 特点: • 一键生成:上传1张生活照,AI自动生成职业照/西装照,支持商务精英、韩系女主等20模板。 • 自然微调:优化五官比例、柔化法令纹,保留个人特色࿰…...
Ecology中拦截jquery.ajax请求接口后的数据
功能:获取调用接口之后的数据在进行返回参数重写 首先ecology中一般直接看不到源码的,为什么知道是jquery.ajax请求呢,需要用到开发者工具 点开这里之后就能知道调用接口具体走的是什么逻辑然后返回值又做了哪些操作 一般来说,文…...
基于站点观测的中国1km土壤湿度日尺度数据集(2000-2022)
A 1 km daily soil moisture dataset over China based on in-situ measurement (2000-2022) 关键数据集分类地表参数数据集时间分辨率日空间分辨率1km - 10km共享方式开放获取数据大小592.76 GB数据时间范围 1999-12-31 — 2022-12-31 元数据更新时间2024-08-09 数据集摘要 …...
Django 自定义celery-beat调度器,查询自定义表的Cron表达式进行任务调度
学习目标: 通过自定义的CronScheduler调度器在兼容标准的调度器的情况下,查询自定义任务表去生成调度任务并分配给celery worker进行执行 不了解Celery框架的小伙伴可以先看一下我的上一篇文章:Celery框架组件分析及使用 学习内容ÿ…...
第 12 届蓝桥杯 C++ 青少组中 / 高级组省赛 2021 年 4 月 24 日真题
一、选择题 第 1 题 单选题 题目:在 C++ 中下列哪个不属于字符型常量 ( )。 A. ‘a’ B. ‘\x2A’ C. ‘@’ D. “F” 答案:D 解析:字符型常量使用单引号括起单个字符(如 A、C),或转义字符(如 B 中的十六进制转义字符)。D 选项 “F” 使用双引号,属于字符串常量,而…...
windows远程服务器数据库的搭建和远程访问(Mysql忘记密码通过Navicat连接记录解密密码)
服务器数据库的搭建和远程访问 mysql数据库安装(详细) window安装mysql详细流程 路程:重设MySQL5密码,发现远程服务器原本有一个MySQL5,尝试在服务器本地建立连接被拒绝,因为不知道密码。 (1…...
w~大模型~合集14
我自己的原文哦~ https://blog.51cto.com/whaosoft/13884560 #Attention as an RNN Bengio等人新作:注意力可被视为RNN,新模型媲美Transformer,但超级省内 , 既能像 Transformer 一样并行训练,推理时内存需求又不随 token 数…...
2025平航杯—团队赛
2025平航杯团队赛 计算机取证 分析起早王的计算机检材,起早王的计算机插入过USB序列号是什么(格式:1)分析起早王的计算机检材,起早王的便签里有几条待干(格式:1)分析起早王的计算机检材,起早王的计算机默认浏览器是什…...
5、SpringBoot整合RabbitMQ
5.1 工作队列模式 1、生产者 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</gro…...
深度学习论文: Describe Anything: Detailed Localized Image and Video Captioning
深度学习论文: Describe Anything: Detailed Localized Image and Video Captioning Describe Anything: Detailed Localized Image and Video Captioning PDF: https://arxiv.org/pdf/2504.16072 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: htt…...
Seata客户端@GlobalTransactional核心源码解析
文章目录 前言一、GlobalTransactional1.1、wrapIfNecessary1.2、handleGlobalTransaction1.3、invoke 二、总结 前言 Seata是阿里开源的分布式事务解决方案。在Spring传统的事务中,开启事务,执行事务,回滚/提交事务,统一由Spring…...
某大麦某眼手机端-抢票
引言 仅供学习研究,欢迎交流 抢票难,难于上青天!无论是演唱会、话剧还是体育赛事,大麦网的票总是秒光。作为一名技术爱好者,你是否想过用技术手段提高抢票成功率?本文将为你揭秘大麦手机端抢票的核心技术…...
深入探索ChatClient:简化AI模型交互的强大工具
深入探索ChatClient:简化AI模型交互的强大工具 前言 在人工智能飞速发展的当下,大语言模型(LLM)的应用越来越广泛。然而,构建基于LLM的应用程序并非易事,通常需要多个组件协同工作,如提示词模…...
AI 知识库:企业知识管理的利器
在数字化转型的今天,企业每天都会产生海量的信息和数据。从客户资料到内部文档,从市场调研到项目经验,这些宝贵的知识资源构成了企业的核心竞争力。然而,你是否注意到这样一个问题:很多企业在快速发展的同时࿰…...
【STM32实物】基于STM32的RFID多卡识别语音播报系统设计
演示视频: 基于STM32的RFID多卡识别语音播报系统设计 前言:本项目可实现多个电子标签IC卡RFID识别,刷卡识别后进行中文语音播报反馈,同时进行控制对应的灯光开关。以此也可扩展开发更多功能。 本项目所需主要硬件包括:STM32F103C8T6最小系统板、RFID-RC522模块、五个IC电…...
[实战] Petalinux驱动开发以及代码框架解读
目录 Petalinux驱动开发以及代码框架解读一、引言二、步骤2.1 创建PetaLinux工程2.2 配置硬件描述文件2.3 设备树配置2.4 建立驱动框架2.5 编辑 .bb 文件2.6 编写驱动文件2.7 编写 Makefile2.8 验证配方配置2.9 集成驱动到 RootFS2.10 全系统编译与部署2.11 启动验证 三、框架解…...
ArcGIS Pro几个小知识点分享
相信熟悉ArcGIS 10.X系统的朋友接触ArcGIS Pro或者QGIS的上手难度都很低,因此向大家分享我最近才注意到的一些ArcGIS Pro小的知识点或者注意事项等,用来查缺补漏。如果是GIS新手小白,建议先去了解GIS相关理论基础,再摸索GIS相关软…...
运维仙途 第1章 灵机突现探监控
第1章 灵机突现探监控 情节梗概 凌运维本是青云门杂役弟子,负责看守藏经阁灵脉枢纽。某日子夜,护山大阵突然灵力紊乱,阁中古籍无风自动。危急时刻,他意外触发祖师留下的「混沌钟」,获得观测灵脉状态的能力… 技术映…...
深入解析Java架构师面试:从核心技术到AI应用
深入解析Java架构师面试:从核心技术到AI应用 在互联网大厂的Java求职者面试中,技术深度和项目经验是成功的关键。本文以严肃的面试官与资深Java架构师马架构(拥有十年研发及架构设计经验)之间的对话为背景,详细展示了…...
Grounding DINO
论文标题: Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection 代码地址: GitHub - IDEA-Research/GroundingDINO: [ECCV 2024] Official implementation of the paper "Grounding DINO: Marrying DINO …...
MCP协议:自然语言与结构化数据的双向桥梁 ——基于JSON-RPC 2.0的标准化实践
MCP协议:自然语言与结构化数据的双向桥梁 ——基于JSON-RPC 2.0的标准化实践 一、MCP的本质:标准化共识的协议框架 MCP(Model Context Protocol)是Anthropic于2024年提出的开放通信协议,其核心价值在于建立自然语言…...
区块链+医疗:破解数据共享困局,筑牢隐私安全防线
在医疗健康领域,数据共享与隐私保护一直是一对难以调和的矛盾。一方面,分散在不同机构的医疗数据(如电子病历、检查报告、用药记录)阻碍了诊疗效率和科研进展;另一方面,患者隐私泄露事件频发,加…...
Arduino IDE中更新esp32 3.2.0版本的办法
在Arduino IDE中更新esp32-3.2.0版本是个不可能的任务,下载文件速度极慢。网上提供了离线的办法,提供了安装文件,但是没有3.2.0的版本。 下面提供了一种离线安装方法 一、腾讯元宝查询解决办法 通过打开开发板管理地址:通过在腾…...
关于 live555延迟优化之缓存区优化“StreamParser::afterGettingBytes() warning: read”” 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/146354088 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
毫米波通信的技术挑战与解决方案
毫米波通信的技术挑战与解决方案 随着5G技术的迅速发展,毫米波通信(Millimeter Wave, mmWave)作为一种具有巨大潜力的通信技术,正在成为实现超高速数据传输、低延迟和大规模连接的关键。然而,毫米波通信虽然在理论上具…...
软考中级-软件设计师 数据库(手写笔记)
基本概念 数据库分析设计过程 E-R模型 关系模式 关系模式相关名词和完整性约束和关系的三种类型 七种基本算法 并交查和笛卡尔积 投影选择和连接 题 规范化-函数依赖 求候选码 非规范化可能处于的问题 问题 题 关系-模型分解 事务管理 备份和恢复 数据仓库和数据挖掘...
Compose笔记(二十一)--AnimationVisibility
这一节主要了解一下Compose的AnimationVisibility,AnimatedVisibility 是 Jetpack Compose 里用于实现组件可见性动画效果的组件,借助它能让组件在显示和隐藏时带有平滑的过渡动画,从而提升用户体验。现总结如下: API 1. visible 含义:这是一…...
生物化学笔记:神经生物学概论05 感受野 视觉中枢 高级视皮层中的信息走向
信息传递中的“击鼓传花” 新特性的突现 功能柱:简化节点 高级视皮层中的信息走向...
记录idea可以运行但是maven install打包却找不到问题
解决idea使⽤maven多模块install报依赖模块的包找不到的问题 如果被依赖项⽬是springboot项⽬,那么可以把相关的springboot的东西移除掉,改造成普通项⽬。如果不想改造项⽬,那就添加部分的配置,因为springboot项⽬打包的时候会⽣…...