DDS波形发生器仿真及技术原理
1. 引言
在现代数字信号处理、电路设计以及通信系统中,直接数字频率合成(DDS)技术因其高速、精细的频率分辨率以及连续相位输出等优点而得到广泛应用。本文主要探讨在DE2-115开发板平台上基于DDS技术实现波形发生器的设计与实践。通过该设计方案,可以实现正弦波与方波两种基本波形的生成,并且实现输出频率范围覆盖从10 Hz至5 MHz的要求,同时保证频率分辨率小于1 kHz。文章详细介绍了DDS系统的原理、FPGA实现过程、时钟与频率控制、以及利用嵌入式逻辑分析仪SignalTap II进行调试和测试的方法。此文面向初学者对DDS技术进行系统性讲解,同时兼顾设计细节与实际验证,并引用了相关技术文献中的关键研究内容以确保论证的严谨性。
2. DDS技术原理简介
直接数字频率合成(DDS)技术是一种基于数字电路直接生成所需波形的方法,其基本原理包括利用相位累加器、查找表(ROM)以及数模转换器(DAC)等模块。整个DDS系统利用固定时钟频率下不断更新的相位累加器值,通过查找表映射到波形幅值,实现连续的数字波形输出。其核心思想可以归纳为以下三个要点:
相位累加器与步进字控制
相位累加器根据固定数位(如32位)不断累加步进值,每个累加器输出的高位地址用于访问存储波形数据的查找表。步进值的设定直接决定了输出频率,满足公式:
$$
f_{out} = \frac{M \times f_{clk}}{2^N}
$$
其中,$f_{clk}$为系统时钟频率,$M$为频率控制字,$N$为累加器位数。
-
查找表的构建与压缩技术
DDS中通常将一个完整周期的标准正弦波数据存入ROM中。当输出波形为正弦波时,查找表中的数据直接映射到波形幅值。而为了在资源受限的FPGA中节省存储空间,可采用压缩算法,如只存储0°到90°的数据并利用对称性扩展至全周期。 -
DAC与低通滤波器
数模转换器(DAC)的作用是将数字波形转换为模拟信号,而低通滤波器则去除由数模转换过程中引入的高频噪声和采样抖动,重构出平滑的输出波形。
DDS技术不仅能实现高速频率切换,还保证了输出信号的连续相位特性,这在现代雷达、通信以及信号处理系统中具有重要应用价值。
3. FPGA平台与DE2-115开发板概述
DE2-115基于Altera FPGA平台,拥有较高的逻辑资源、高速I/O接口以及多种嵌入式调试工具,使其成为开展DDS波形发生器设计的理想实验平台。
3.1 DE2-115开发板主要特点
高性能FPGA器件:配备Altera Cyclone系列FPGA,提供足够的逻辑单元用于实现DDS核心功能。
丰富的I/O接口:支持多路数模转换器输出,可直接连接外部DAC模块,实现模拟信号输出。
嵌入式调试工具:内嵌SignalTap II逻辑分析仪,方便实时采集与调试数字信号,验证DDS系统的工作状态。
时钟与复位管理:内建多个PLL模块,可灵活配置系统时钟,为DDS设计提供稳定、高频率的时钟信号。
3.2 FPGA实现DDS系统的优势
基于FPGA实现DDS技术具有以下优势:
高度集成性:将复杂的数字运算及数据存储功能整合在单一芯片上,简化系统设计。
灵活的波形生成:通过软件配置即可更改频率、相位及波形类型,适应不同应用场景。
实时调试能力:利用内嵌的SignalTap II工具,可以实时捕获内部信号状态,定位错误与优化设计。
4. 基于DDS技术的波形发生器设计方案
本设计方案旨在利用DE2-115开发板实现DDS波形发生器,其设计架构主要分为以下模块:
-
相位累加器与频率控制模块
实现频率控制字的计算和累加器的更新,确保波形生成的频率与分辨率满足10 Hz至5 MHz范围且分辨率小于1 kHz的要求。 -
查找表与波形数据生成模块
采用压缩ROM技术构建正弦波查找表,并通过相位映射生成所需波形数据。当生成方波时,通过对相位数据的高位进行比较,直接输出逻辑电平,从而产生方波信号。 -
DAC与滤波电路模块
数模转换器将DDS产生的数字波形转换为模拟信号,而低通滤波器则用于滤除高频噪声,重建出平滑的模拟波形。 -
嵌入式逻辑分析与调试模块SignalTap II
在设计中预留内部信号采集接口,通过SignalTap II实现实时波形捕获与调试,检测相位累加器的更新、查找表访问以及DAC输出情况。
下面是设计方案的整体框图:
图 1:基于DE2-115的DDS波形发生器系统框图
flowchart TD A["系统时钟(PLL模块生成)"] --> B["相位累加器模块"] B --> C["频率控制模块"] C --> D["查找表(ROM)模块"] D --> E["数模转换器DAC"] E --> F["低通滤波器"] F --> G["模拟波形输出"] B --> H["SignalTap II调试模块"] D --> H E --> H H --> I[END]
图中展示了从时钟信号到波形输出的整个DDS实现流程,同时在关键数据链路处接入SignalTap II模块进行调试和采样监控,使实时数据分析成为可能。
5. 正弦波与方波生成方法
在DDS波形发生器设计中,正弦波与方波的生成方法有所不同,但都依赖于相位累加器和查找表技术。
5.1 正弦波生成
正弦波的生成主要依靠存储在ROM中的查找表数据。设计时,可以采用如下步骤:
查找表构建:利用正弦函数公式生成一个周期内的采样点,并仅存储0°到90°内的数据,利用正弦函数的对称性扩展至360°。
压缩算法:为节约FPGA的存储资源,采用压缩ROM技术,利用相位数据高位信号生成完整波形,即只存储四分之一周期内的数据,运行时根据相位判断数据的正负并生成完整波形。
数据精度与采样点数:采样点数直接决定了波形的精度和存储资源的消耗。在本设计中,可选择合适的采样点数以平衡精度和资源消耗。
5.2 方波生成
方波由于其简单的波形结构,可以通过相位累加器的高位比较来实现:
逻辑判断:根据相位累加器输出数据的最高位(或部分位)进行比较,当数据达到设定的阈值后,输出高电平;低于阈值时输出低电平,从而产生周期性的方波信号。
频率可调:调整相位步进字$M$能够直接改变方波的频率,这与正弦波生成的频率控制具有一致性。
这两种波形生成方法均可通过简单的FPGA逻辑实现,既能满足应用需求,又能降低设计复杂度。
6. 频率控制与时钟系统设计
DDS的输出频率与相位累加器内的步进字直接相关。
本设计中,为满足10 Hz至5 MHz的输出需求,选取合适的时钟频率和累加器位数至关重要。
6.1 频率分辨率计算
例如,在采用32位相位累加器及100 MHz时钟频率的情况下,输出频率公式为:
f_{out} = \frac{M \times 100,\text{MHz}}{2^{32}}
由此可计算分辨率为:
\Delta f = \frac{100,\text{MHz}}{2^{32}} \approx 0.0233,\text{Hz}
显然,系统能达到极高的分辨率,远低于1 kHz的要求。因此,在设计中可以通过软件限制步进字$M$的最小单位,保证实际输出分辨率满足工程需求。
表 1:不同设置下DDS频率分辨率比较
参数设置 | 时钟频率 | 累加器位数 | 频率分辨率 | 备注 |
---|---|---|---|---|
设计方案 | 100 MHz | 32位 | ≈0.0233 Hz | 超高精度 |
工程应用要求 | 100 MHz | 部分位截断 | ≥1 kHz控制 | 软件限制步进字 |
实际调整方案示例 | 50 MHz | 32位 | ≈0.0116 Hz | 可调整范围 |
表中展示了在不同参数设定下的频率分辨率计算情况,可通过调整时钟频率或对相位累加器数据进行截断处理,达到工程应用中的频率调控需求。
6.2 时钟系统设计
为保证DDS模块稳定工作,高精度的时钟是必需的。DE2-115上通常采用PLL锁相环生成稳定的多路时钟信号。设计时应注意以下几点:
时钟频率的选择:在本方案中,为覆盖最高5 MHz的输出,建议选择至少50-100 MHz的外部晶振信号,经由PLL倍频和分频处理后提供给DDS核心模块。
时钟分配与同步:确保各模块时钟同步,避免因时钟抖动影响DDS输出信号质量。
SignalTap II采样时钟:为在逻辑分析中精确捕捉DDS内部信号,需额外分配专用采样时钟,从而提高测试数据的准确性。
7. SignalTap II逻辑分析仪调试应用
SignalTap II是Altera Quartus II开发环境中提供的嵌入式逻辑分析仪,通过在FPGA设计中嵌入采样点和触发条件,实现针对内部信号的实时监控和采集。使用SignalTap II调试DDS系统时,应注意以下步骤:
-
仪器配置
- 选择需要监测的信号,如相位累加器输出、查找表数据访问信号及DAC接口信号;
- 配置触发条件,如特定波形边沿或周期性状态,以捕获关键数据流。
-
采样设置
- 根据时钟频率设置合适的采样率,确保采集数据能够完整反应DDS内部工作状态;
- 设置内存深度与采样窗口,以覆盖整个波形周期。
-
数据捕获与分析
- 采集的数据可以用图形波形显示工具观察波形形态,验证正弦波查找表和方波生成逻辑是否工作正常;
- 对比捕获波形与设计预期,通过误差分析调整设计参数,确保产品达到设计规格。
图 2:SignalTap II调试配置示意图
flowchart TD A["启动SignalTap II"] --> B["选择采集信号:相位累加器/ROM/输出DAC"] B --> C["设置触发条件与采样率"] C --> D["采集并显示数据波形"] D --> E["数据对比与错误定位"] E --> F[END]
图中详细示意了SignalTap II的配置流程,从采集信号选择到数据捕获以及后期分析,帮助用户了解如何在设计中进行实时调试和验证。
8. 仿真验证、示例代码与测试结果
在实际设计过程中,通过仿真平台(如ModelSim)和FPGA板卡测试,都可验证DDS系统的设计合理性。下面给出部分关键设计模块的示例代码以及仿真波形截图说明:
8.1 示例代码解析
以下为基于Verilog描述的相位累加器模块示例代码:
module phase_accumulator ( input wire clk, // 系统时钟 input wire rst, // 复位信号 input wire [31:0] freq_word, // 频率控制字 output reg [31:0] phase // 相位累加器输出
); always @(posedge clk or posedge rst) begin if (rst) phase <= 32'd0; else phase <= phase + freq_word;
end endmodule
代码中,32位相位累加器通过不断累加频率控制字,实现相位的更新,并为查找表提供地址信号。
查找表模块通过ROM查找生成正弦波数据,示例代码如下:
module sine_lookup ( input wire [7:0] addr, // ROM地址,取自相位累加器高位 output reg [11:0] sine // 输出正弦波幅值(12位DAC)
); reg [11:0] rom [0:255]; initial begin $readmemh("sine_table.hex", rom);
end always @(*) begin sine = rom[addr];
end endmodule
在此代码中,通过将ROM地址和输出数据进行映射,实现正弦波数据输出。方波信号的生成较为简单,通过相位高位取决于设定阈值实现。
这些示例代码均可通过Quartus II软件进行综合,并加载至DE2-115开发板进行测试和验证。
8.2 仿真波形与测试数据展示
利用仿真工具生成的波形结果验证了DDS系统设计的正确性。从以下两个方面可以看出设计的有效性:
- 相位累加器输出波形:仿真结果显示,相位累加器的数值以恒定步进方式递增,与计算公式吻合。
- 正弦波输出波形:映射到查找表后,DAC输出的正弦波形平滑、连续,符合预期的正弦波形状。
图 3:仿真波形截面示意图
图 3 显示了DDS输出正弦波在不同频率设定下的仿真波形;测试数据进一步验证了频率控制与查找表设计的有效性
此外,通过SignalTap II采集到的实际板卡数据,也显示了相似的波形特征。下表汇总了实际测试与仿真结果的对比情况:
项目 | 仿真测试 | 实际板卡测试 | 备注 |
---|---|---|---|
正弦波幅值 | 平滑连续 | 平滑连续 | 数据一致 |
频率响应范围 | 10 Hz ~ 5 MHz | 10 Hz ~ 5 MHz | 满足设计要求 |
分辨率 | <1 kHz | <1 kHz | 可通过软件设定精调 |
相位累加器输出 | 恒定步进递增 | 恒定步进递增 | 与计算公式吻合 |
测试结果表明,基于DDS技术实现的波形发生器设计在DE2-115上运行稳定,频率调控精确,且硬件与仿真结果高度一致。
9. 资源优化与常见问题
在FPGA资源有限及设计复杂度较高的情况下,优化设计与解决常见问题尤为重要。
9.1 FPGA资源优化
采用压缩ROM技术可大幅降低查找表存储需求。例如:
仅存储0°~90°正弦波数据,通过数学逻辑利用对称性扩展至全周期;
使用压缩算法后,ROM存储需求仅为传统存储所需的四分之一,有效节省FPGA内部RAM资源。
此外,在实现DDS逻辑时,可对相位累加器部分采用流水线设计,保证时钟频率的同时降低逻辑延迟。对于功耗问题,优化设计中的数据转换和DAC接口逻辑,也有助于整体能耗降低,有研究中记录功耗低至0.081W。
9.2 常见问题与解决方案
在实际设计和调试过程中,初学者可能遇到以下常见问题:
-
时钟抖动问题
- 原因:PLL配置不当或时钟信号受到干扰。
- 解决方法:检查PLL参数,确保时钟稳定,并在PCB设计中注意时钟线路的屏蔽与隔离。
-
查找表存储错误
- 原因:ROM初始化数据错误或映射逻辑出错。
- 解决方法:验证ROM初始化文件(如sine_table.hex)的正确性,调试查找表映射过程并使用SignalTap II捕捉ROM地址信号。
-
相位累加器精度不足
- 原因:步进字设置不合理或数据截断处理错误。
- 解决方法:重新计算步进字,确保输出频率与累加器精度匹配,并在仿真中逐步验证。
-
输出波形畸变
- 原因:DAC性能或滤波器参数设置不匹配。
- 解决方法:调整DAC转换速率和低通滤波器截止频率,确保输出波形平滑,还可采用带状仿真验证滤波效果。
对于以上问题,建议初学者在设计过程中结合仿真工具和SignalTap II实时监控关键信号状态,以便及时发现和解决问题。
10. 结论
本文详细介绍了基于DDS技术在DE2-115开发板上实现波形发生器设计的全过程。全文主要内容包括:
DDS技术原理:
介绍了相位累加器、查找表及DAC与滤波器组件的工作机理,以及利用压缩ROM技术节省FPGA资源的原理。
FPGA与DE2-115平台优势:
分析了DE2-115板卡的硬件优势以及内建调试工具SignalTap II对调试设计的重要性。
系统设计方案:
提出了基于DDS技术的波形发生器整体架构,包括频率与相位控制、正弦波与方波生成方法,并通过详细框图描述了整个实现流程。
仿真与测试验证:
通过示例代码、仿真波形与实际测试数据的对比,证明了设计方案的正确性和实用性。
资源优化及问题反馈:
针对初学者常见问题,提供了优化设计和故障排查的有效方法,确保设计在实际应用中达到高稳定性与低能耗要求。
综上所述,本设计方案不仅实现了在10 Hz至5 MHz范围内频率输出可调的正弦波与方波信号,而且通过高精度时钟、压缩ROM技术和内部逻辑分析工具的有机结合,实现了DDS技术的成功实践。对于想要在FPGA平台上探索DDS系统的初学者,该设计为入门与进阶提供了有效参考,也为未来更为复杂的频率合成与波形生成项目奠定了坚实基础。
主要结论概述
利用32位相位累加器与压缩ROM技术,DDS系统能实现超高频率分辨率(远超1 kHz要求)。
DE2-115开发板提供了充足的硬件资源和强大的调试工具,确保设计实现和调试的高效性。
通过严谨的仿真和SignalTap II捕获数据,验证了设计在不同波形、频率条件下的稳定性和高精度输出。
在资源和功耗优化方面,通过采用压缩存储技术和流水线设计,可实现低至0.081W的功耗,适合嵌入式应用。
相关文章:
DDS波形发生器仿真及技术原理
1. 引言 在现代数字信号处理、电路设计以及通信系统中,直接数字频率合成(DDS)技术因其高速、精细的频率分辨率以及连续相位输出等优点而得到广泛应用。本文主要探讨在DE2-115开发板平台上基于DDS技术实现波形发生器的设计与实践。通过该设计…...
Java使用ANTLR4解析IDL文件
文章目录 前言解析IDL文件准备两个IDL文件准备一个IDL Grammar文件maven配置生成Lexer Parser Listener Visitor代码新建实体类IDL解析遍历器单元测试 参考 前言 接着上篇:Java使用ANTLR4对Lua脚本语法校验,介绍了什么是ANTLR?/ 举了一个hel…...
04-Seata 深度解析:从分布式事务原理到 Seata 实战落地
Seata 深度解析:从分布式事务原理到 Seata 实战落地 一、分布式事务核心理论与挑战 1.1 分布式事务的本质难题 在微服务架构中,一次业务操作可能涉及多个服务的数据库操作,传统单体事务(ACID)无法跨越服务边界&…...
2025企业增长新引擎:AI Agent驱动人效跃迁|白皮书2.0发布
2025年伊始,一款名为DeepSeek-R1的国产AI大模型以其高性能、低成本等核心优势成功霸榜热搜,在全国乃至全球掀起一场以AI为核心的技术革新与管理变革。 面对这样极具颠覆性的革新命题,易路人力资源科技王天扬先生自2022年起就率团队持续专注于…...
IJCV-2025 | 深圳大学记忆增强的具身导航!ESceme:基于情景记忆的视觉语言导航
作者:Qi Zheng 1 , 2 ^{1,2} 1,2, Daqing Liu 3 ^{3} 3, Chaoyue Wang 3 ^{3} 3, Jing Zhang 2 ^{2} 2, Dadong Wang 4 ^{4} 4, Dacheng Tao 2 ^{2} 2单位: 1 ^{1} 1深圳大学电子与信息工程学院, 2 ^{2} 2悉尼大学计算机科学学院,…...
[第十六届蓝桥杯 JavaB 组] 真题 + 经验分享
A:逃离高塔(AC) 这题就是简单的签到题,按照题意枚举即可。需要注意的是不要忘记用long,用int的话会爆。 📖 代码示例: import java.io.*; import java.util.*; public class Main {public static PrintWriter pr ne…...
《分布式软总线:网络抖动下的数据传输“定海神针”》
在当下,智能设备之间的互联互通已成为生活与工作的刚需。分布式软总线作为实现这一愿景的关键技术,正日益凸显其重要性。然而,网络环境的复杂性,尤其是网络抖动频繁的情况,给分布式软总线的数据传输带来了严峻挑战。如…...
C++函数
函数 为什么要使用函数 已经有main函数,为什么还要自定义函数?:“避免重复制造轮子”,提高开发效率 函数的定义 函数的设计方法:先确定函数的功能、确定函数的参数、是否需要参数,参数的个数,…...
FreeRTOS菜鸟入门(五)·空闲任务与阻塞延时的实现
目录 1. 实现空闲任务 1.1 定义空闲任务的栈 1.2 定义空闲任务的任务控制块 1.3 创建空闲任务 2. 实现阻塞延时 2.1 vTaskDelay()函数 2.2 修改 vTaskSwitchContext()函数 3. SysTick 中断服务函数 4. SysTick 初始化函数 通过之前我们了解知道,任…...
PCIe 学习笔记(一)
系列文章目录 【PCIe】链路测试,数字工程师也要会看高速信号眼图! 【PCIe】链路训练状态机(LTSSM) - PCIe链路建立过程概述 【PCIe】PCIe设备的BDF与系统枚举过程 文章目录 系列文章目录PCIe LTSSM**1. 链路训练状态(Training States&#…...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——LED、按键测试
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:https://www.alientek.com/Product_Details/135.html 3)全套实验源码手册视频下载:正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试4.1 LED…...
深度为16,位宽8bit的单端口SRAM——学习记录
链接: 【Verilog HDL 训练】第 13 天(存储器、SRAM)-云社区-华为云 module sram #(parameter ADDR_BITS4)(input clk,input [ 7:0] addr,input [ 7:0] din,input ce,input we,output reg [ 7:0] dout);localparam MEM_DEPTH 1<<ADDR_…...
面向对象编程
在面向对象编程中,除了通过创建类的实例来访问其属性和方法外,还可以通过在一个类里创建另一个类的属性(本质上也是持有另一个类的实例引用)的方式来访问该类的属性和方法。下面为你详细解释这两种方式: 1. 通过创建实…...
远程登录一个Linux系统,如何用命令快速知道该系统属于Linux的哪个发行版,以及该服务器的各种配置参数,运行状态?
远程登录一个Linux系统,如何用命令快速知道该系统属于Linux的哪个发行版,以及该服务器的各种配置参数,运行状态? 查看Linux发行版信息 查看发行版名称和版本: cat /etc/*-release或 lsb_release -a查看内核版本&#…...
简单socket通信,回显 服务器程序与客户端程序之间的通信。
Socket 通信编程是一种基于网络的通信方式,允许不同主机上的程序通过网络进行数据交换。 实现结构try catch: 前情了解: 1.如何创建服务器端 定义ServerSocket套接字,需要等待客户端连接,阻塞,直到接入连接…...
C# 基类型和派生类型之间的转型
1.什么是基类型和派生类 基类型:父类,所有子类都继承自它。 派生类型:子类,继承了父类的属性和方法,还可以添加自己的新功能。 例子: class Animal { }//基类型 class Dog : Animal { }//派生类型 这…...
深度学习--激活函数
激活函数通过计算加权和并加上偏置来确定神经元是否应该倍激活,它们将输入信号转换为输出的可微运算。大多数激活函数都是非线性的,由于激活函数是深度学习的基础,下面简要介绍一些常见的激活函数。 1 RelU函数 最受欢迎的激活函数是修正线性…...
MySQL 缓存机制全解析:从磁盘 I/O 到性能优化
MySQL 缓存机制全解析:从磁盘 I/O 到性能优化 MySQL 的缓存机制是提升数据库性能的关键部分,它通过多级缓存减少磁盘 I/O 和计算开销,从而提高查询和写入的效率。 1. 为什么需要缓存? 数据库的性能瓶颈通常集中在磁盘 I/O 上。…...
【项目管理】第17章 项目干系人管理-- 知识点整理
项目管理-相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应:第6章-第19章 第6章 项目管理概论 4分第13章 项目资源管理 3-4分第7章 项目…...
编程语言到mysql ‘\‘到数量关系
在 MySQL 的模糊查询中,反斜杠 \ 的转义规则需要根据 转义层级 和 SQL 模式 来确定。以下是详细说明及示例: 一、默认模式下(未启用 NO_BACKSLASH_ESCAPES) 1. 规则说明 反斜杠转义:\ 是 MySQL 的默认转义字符。 转义…...
本地生活服务平台搭建方案详解:同城跑腿外卖系统源码一体化开发
在数字化浪潮不断推进的今天,本地生活服务平台正逐渐成为人们日常生活中不可或缺的一部分。从点餐外卖到同城帮买、帮送、帮取,用户对即时服务的需求愈发强烈。与此同时,创业者和本地商家也纷纷看好“同城服务 外卖配送”的一体化平台模式&a…...
索引语法SQL性能分析索引的使用
目录 准备: 一.索引语法 1). 创建索引 2). 查看索引 3). 删除索引 4).使用索引查询和普通查询的区别 二.SQL性能分析 1.SQL执行频率 2.慢查询日志 3.profile详情 4.explain 三.索引的使用 1.最左前缀法则 2.范围查询 3.索引失效情况 索引列运算 字符串不加引号…...
Docker技术基础新手入门教程
Docker技术深度解析:从架构到实战的运维指南 一、Docker核心架构与组件详解1. 什么是Docker?1. Docker引擎(Docker Engine)2. Docker对象模型二、关键技术深度剖析1. 容器隔离机制2. 容器网络模型网络驱动类型自定义网络实战3. 存储卷与数据持久化三种挂载方式对比示例:My…...
NO.93十六届蓝桥杯备战|图论基础-拓扑排序|有向无环图|AOV网|摄像头|最大食物链计数|杂物(C++)
有向⽆环图 若⼀个有向图中不存在回路,则称为有向⽆环图(directed acycline graph),简称 DAG 图 AOV⽹ 举⼀个现实中的例⼦:课程的学习是有优先次序的,如果规划不当会严重影响学习效果。课程间的先后次序可以⽤有向图表⽰ 在…...
Rust泛型与特性
文章目录 泛型函数中的泛型结构体与枚举中的泛型特性(trait)默认特性Trait作为参数特性做返回值 给结构体实现方法 泛型 泛型编程是现代编程语言中重要的机制 C是通过模板来实现泛型的,而C语言中是没有泛型的 泛型是用来表达抽象类型的机制…...
Day08【基于预训练模型分词器实现交互型文本匹配】
基于预训练模型分词器实现交互型文本匹配 目标数据准备参数配置数据处理模型构建主程序测试与评估总结 目标 本文基于预训练模型bert分词器BertTokenizer,将输入的文本以文本对的形式,送入到分词器中得到文本对的词嵌入向量,之后经过若干网络…...
基于uniapp 实现画板签字
直接上效果图 代码 <template><view class"container"><!-- 签名画布 --><view class"canvas-container"><canvas canvas-id"signCanvas" class"sign-canvas"touchstart"handleTouchStart"touc…...
5.跳表(skiplist)
1. 什么是跳表 -skiplist skiplist 本质上也是一种查找结构,用于解决算法中的查找问题,跟平衡搜索树和哈希表的价值是一样的,可以作为key 或者 key/value 的查找模型。 skiplist ,顾名思义,首先它是一个 list 。实际上…...
GitHub 封禁中国 IP:影响、原因及应对
在技术全球化的当下,代码托管平台如同开发者的 “数字仓库”,而 GitHub 无疑是其中最广为人知的一座。但在 2025 年 4 月 13 日,一则令人震惊的消息在国内开发者社群中炸开了锅 ——GitHub 疑似封禁中国 IP。一时间,这一事件迅速成…...
基于工业操作系统构建企业数字化生态的实践指南
一、工业操作系统选型策略 工业操作系统(IIoT OS)的选型需从功能适配性、技术成熟度、生态兼容性三个维度综合评估。以玉麟科技DIOS平台为例,其 "云端 终端" 架构支持全球设备管理,通过工业知识模型实现设备健康度预测…...
金能电力领跑京东工业安全工器具赛道 2025年首季度数据诠释“头部效应”
金能电力领跑京东工业安全工器具赛道 2025年首季度数据诠释“头部效应” 在2025年第一季度京东工业平台“电料辅件-安全工器具”热销品牌的激烈竞争中,金能电力以一组极具说服力的数据,向行业展示了何为“绝对头部”。从成交金额、销量到流量、客群覆…...
基于大模型的反流食管炎手术全流程风险预测与治疗方案研究报告
目录 一、引言 1.1 研究背景 1.2 研究目的 1.3 研究方法与创新点 二、反流食管炎概述 2.1 定义与发病机制 2.2 临床症状与诊断标准 2.3 流行病学现状 三、大模型技术原理与应用现状 3.1 大模型基本原理 3.2 在医疗领域的应用案例 3.3 用于反流食管炎预测的优势 四…...
探索 C 与 Java/Kotlin 的语言差异:从指针到高阶函数
作为一名熟悉 Java 和 Kotlin 的开发者,初次接触 C/C 时常会遇到一系列概念上的“文化冲击”。本文将从几个关键点出发,帮助你更好地理解 C/C 与 Java/Kotlin 在语言设计上的核心区别。 1. 指向未知类型的指针 void*、结构体指针访问 ->、空指针常量 …...
Redis之缓存过期淘汰策略
面试切入点 Redis内存满了怎么办? redis的默认内存多少?在哪里查看?如何设置修改? 查看redis最大占用内存 打开redis配置文件,设置maxmemory参数,maxmemory是bytes字节类型,注意转换。 redi…...
Rust-引用借用规则
目录 一、概述 二、借用规则 三、详细解释 3.1 第一条规则 3.2 第二条规则 3.3 第三条规则 四、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [Rust-引用借用规则] ❤博主广交技术好友,喜欢文章的可以关注一下❤ 一、概述 Rust为确保程序在运行时不…...
【报错】解决pytorch出现RuntimeError: An attempt has been made to start a new process...
此错误是由于在 Windows 系统中使用多进程时,没有正确使用 if __name__ __main__: 语句块造成的。在 Windows 里,多进程的启动方式是 spawn,并非 fork,所以必须在主模块中使用 if __name__ __main__: 语句块来避免子进程重复执行…...
游戏引擎学习第228天
对上次的内容进行回顾,并为今天的开发环节做铺垫。 目前大部分功能我们已经完成了,唯一剩下的是一个我们知道存在但目前不会实际触发的 bug。这个 bug 的本质是在某些线程仍然访问一个已经被销毁的游戏模式(mode)之后的状态&…...
Pytorch Hook 技巧
通过 functools.partial 扩展 Pytorch Hook 机制 阅读 atom 文章源码时学习到的技巧,mark一下 通过 functools.partial,开发者无需修改原始函数或 PyTorch 的 Hook 机制,即可实现参数扩展与接口适配,这是 Python 函数式编…...
Python multiprocessing模块介绍
multiprocessing 是 Python 标准库中的一个模块,用于实现多进程并行计算,可以在多核 CPU 上显著提升程序性能,尤其适用于 CPU 密集型任务。Python 的多线程由于 GIL(全局解释器锁)限制,在进行 CPU 密集型任…...
[特殊字符] LoRA微调大模型实践:从MAC到Web的全流程指南
🚀 实践步骤概览 今天我们要在MAC上完成一个完整的AI项目闭环: 微调一个大模型 → 2. 导出模型并部署 → 3. 暴露API给web后端 → 4. 前端展示 🛠️ 微调模型准备 核心配置 框架:LLama-Factory 🏭 算法:…...
第二天 通过脚本控制物体移动和旋转
一、Unity脚本编程基础认知 1.1 为什么说脚本是Unity的灵魂? Unity引擎的核心架构采用ECS(Entity-Component-System)模式,脚本作为组件的具体实现,控制着游戏对象的所有行为。统计显示,一个中等规模的Uni…...
在SpringBoot中访问 static 与 templates 目录下的内容
目录 步骤一:添加 Thymeleaf 依赖 (处理 Templates 目录)步骤二:配置静态资源路径 (可选但建议了解)步骤三:访问不同目录下的 HTML 文件访问 static 目录下的 HTML 文件访问 templates 目录下的 HTML 文件 总结 在使用 Spring Boot 开发 Web …...
常见的 API 设计风格
在软件开发中,常见的 API 设计风格主要有以下几种,每种风格适用于不同的场景和需求: 1. RESTful API (主流) 特点: 基于 HTTP 协议,使用标准方法(GET/POST/PUT/DELETE)资源导向(UR…...
Grass.io项目现状:DePIN亮眼明星,扩张中的AI数据银行
Grass.io项目现状:DePIN亮眼明星,扩张中的AI数据银行 Grass如何在DePIN项目丛林中脱颖而出? 答案在于其"零门槛"策略——用户是基石,其他一切皆为杠杆。 Grass通过"技术+模式"双轮驱动打破行业内卷:零知识证明技术与Solana Layer2架构确保数据真实…...
ERR_PNPM_DLX_NO_BIN No binaries found in tailwindcss
场景复现: 最近在vue3项目中安装了tailwindcss,但是它默认帮我安装的版本是4XX的,导致我执行 npx tailwindcss init -p报错了。 解决方案: 更改tailwindcss的版本为3 pnpm add -D tailwindcss3再次执行生成tailwindcss的初始…...
2025“钉耙编程”中国大学生算法设计春季联赛(6)(1001,1003,1008):1007
不知道为啥,感觉后面的联赛题目有挺多出的是模拟题目(这三道题目难度依次递增) 1001 #include<bits/stdc.h> using namespace std; #define int long long const int op1e97; const int o1e34;inline void solve(){int n,a,b,c;cin>…...
Leetcode 2814. 避免淹死并到达目的地的最短时间
1.题目基本信息 1.1.题目描述 现给定一个 n * m 的索引从 0 开始的二维字符串网格 land,目前你站在为 “S” 的单元格上,你需要到达为 “D” 的单元格。在这片区域上还有另外三种类型的单元格: “.”:这些单元格是空的。 “X”…...
4.15【A】pc homework3~
5 假设read_document函数可以实现读取第m个文件,并返回该文本文档的每行数据 那么考虑双层并行结构,外层为文档级并行,内层为每个文档内的行级并行 动态分配文档任务,避免线程闲置 #include <omp.h> int total_words …...
aslist和list的区别
Arrays.asList和List的主要区别在于它们的固定长度和不可变性、与原始数组的关系、性能以及使用场景。 一、固定长度和不可变性 Arrays.asList:通过Arrays.asList方法创建的List是一个固定长度的List,其长度与原始数组相同。这意味着你不能通过添…...
Notepad++中将文档格式从Windows(CR LF)转换为Unix(LF)
在Windows中用记事本写了一个.sh的Linux运行脚本,是无法直接在Linux中执行,需要首先把文本编码格式转换为Unix的,特别是换行符这些,转换步骤如下: 1、打开文档 在Notepad中打开需要转换的文件。 2、进入文档格式转换…...