当前位置: 首页 > news >正文

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$为累加器位数。

  1. 查找表的构建与压缩技术
    DDS中通常将一个完整周期的标准正弦波数据存入ROM中。当输出波形为正弦波时,查找表中的数据直接映射到波形幅值。而为了在资源受限的FPGA中节省存储空间,可采用压缩算法,如只存储0°到90°的数据并利用对称性扩展至全周期。

  2. 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波形发生器,其设计架构主要分为以下模块:

  1. 相位累加器与频率控制模块
    实现频率控制字的计算和累加器的更新,确保波形生成的频率与分辨率满足10 Hz至5 MHz范围且分辨率小于1 kHz的要求。

  2. 查找表与波形数据生成模块
    采用压缩ROM技术构建正弦波查找表,并通过相位映射生成所需波形数据。当生成方波时,通过对相位数据的高位进行比较,直接输出逻辑电平,从而产生方波信号。

  3. DAC与滤波电路模块
    数模转换器将DDS产生的数字波形转换为模拟信号,而低通滤波器则用于滤除高频噪声,重建出平滑的模拟波形。

  4. 嵌入式逻辑分析与调试模块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 MHz32位≈0.0233 Hz超高精度
工程应用要求100 MHz部分位截断≥1 kHz控制软件限制步进字
实际调整方案示例50 MHz32位≈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系统时,应注意以下步骤:

  1. 仪器配置

    • 选择需要监测的信号,如相位累加器输出、查找表数据访问信号及DAC接口信号;
    • 配置触发条件,如特定波形边沿或周期性状态,以捕获关键数据流。
  2. 采样设置

    • 根据时钟频率设置合适的采样率,确保采集数据能够完整反应DDS内部工作状态;
    • 设置内存深度与采样窗口,以覆盖整个波形周期。
  3. 数据捕获与分析

    • 采集的数据可以用图形波形显示工具观察波形形态,验证正弦波查找表和方波生成逻辑是否工作正常;
    • 对比捕获波形与设计预期,通过误差分析调整设计参数,确保产品达到设计规格。

图 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 MHz10 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 常见问题与解决方案

在实际设计和调试过程中,初学者可能遇到以下常见问题:

  1. 时钟抖动问题

    • 原因:PLL配置不当或时钟信号受到干扰。
    • 解决方法:检查PLL参数,确保时钟稳定,并在PCB设计中注意时钟线路的屏蔽与隔离。
  2. 查找表存储错误

    • 原因:ROM初始化数据错误或映射逻辑出错。
    • 解决方法:验证ROM初始化文件(如sine_table.hex)的正确性,调试查找表映射过程并使用SignalTap II捕捉ROM地址信号。
  3. 相位累加器精度不足

    • 原因:步进字设置不合理或数据截断处理错误。
    • 解决方法:重新计算步进字,确保输出频率与累加器精度匹配,并在仿真中逐步验证。
  4. 输出波形畸变

    • 原因: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. 引言 在现代数字信号处理、电路设计以及通信系统中&#xff0c;直接数字频率合成&#xff08;DDS&#xff09;技术因其高速、精细的频率分辨率以及连续相位输出等优点而得到广泛应用。本文主要探讨在DE2-115开发板平台上基于DDS技术实现波形发生器的设计与实践。通过该设计…...

Java使用ANTLR4解析IDL文件

文章目录 前言解析IDL文件准备两个IDL文件准备一个IDL Grammar文件maven配置生成Lexer Parser Listener Visitor代码新建实体类IDL解析遍历器单元测试 参考 前言 接着上篇&#xff1a;Java使用ANTLR4对Lua脚本语法校验&#xff0c;介绍了什么是ANTLR&#xff1f;/ 举了一个hel…...

04-Seata 深度解析:从分布式事务原理到 Seata 实战落地

Seata 深度解析&#xff1a;从分布式事务原理到 Seata 实战落地 一、分布式事务核心理论与挑战 1.1 分布式事务的本质难题 在微服务架构中&#xff0c;一次业务操作可能涉及多个服务的数据库操作&#xff0c;传统单体事务&#xff08;ACID&#xff09;无法跨越服务边界&…...

2025企业增长新引擎:AI Agent驱动人效跃迁|白皮书2.0发布

2025年伊始&#xff0c;一款名为DeepSeek-R1的国产AI大模型以其高性能、低成本等核心优势成功霸榜热搜&#xff0c;在全国乃至全球掀起一场以AI为核心的技术革新与管理变革。 面对这样极具颠覆性的革新命题&#xff0c;易路人力资源科技王天扬先生自2022年起就率团队持续专注于…...

IJCV-2025 | 深圳大学记忆增强的具身导航!ESceme:基于情景记忆的视觉语言导航

作者&#xff1a;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单位&#xff1a; 1 ^{1} 1深圳大学电子与信息工程学院&#xff0c; 2 ^{2} 2悉尼大学计算机科学学院&#xff0c;…...

[第十六届蓝桥杯 JavaB 组] 真题 + 经验分享

A&#xff1a;逃离高塔(AC) 这题就是简单的签到题&#xff0c;按照题意枚举即可。需要注意的是不要忘记用long&#xff0c;用int的话会爆。 &#x1f4d6; 代码示例&#xff1a; import java.io.*; import java.util.*; public class Main {public static PrintWriter pr ne…...

《分布式软总线:网络抖动下的数据传输“定海神针”》

在当下&#xff0c;智能设备之间的互联互通已成为生活与工作的刚需。分布式软总线作为实现这一愿景的关键技术&#xff0c;正日益凸显其重要性。然而&#xff0c;网络环境的复杂性&#xff0c;尤其是网络抖动频繁的情况&#xff0c;给分布式软总线的数据传输带来了严峻挑战。如…...

C++函数

函数 为什么要使用函数 已经有main函数&#xff0c;为什么还要自定义函数&#xff1f;&#xff1a;“避免重复制造轮子”&#xff0c;提高开发效率 函数的定义 函数的设计方法&#xff1a;先确定函数的功能、确定函数的参数、是否需要参数&#xff0c;参数的个数&#xff0c…...

FreeRTOS菜鸟入门(五)·空闲任务与阻塞延时的实现

目录 1. 实现空闲任务 1.1 定义空闲任务的栈 1.2 定义空闲任务的任务控制块 1.3 创建空闲任务 2. 实现阻塞延时 2.1 vTaskDelay()函数 2.2 修改 vTaskSwitchContext()函数 3. SysTick 中断服务函数 4. SysTick 初始化函数 通过之前我们了解知道&#xff0c;任…...

PCIe 学习笔记(一)

系列文章目录 【PCIe】链路测试&#xff0c;数字工程师也要会看高速信号眼图&#xff01; 【PCIe】链路训练状态机(LTSSM) - PCIe链路建立过程概述 【PCIe】PCIe设备的BDF与系统枚举过程 文章目录 系列文章目录PCIe LTSSM**1. 链路训练状态&#xff08;Training States&#…...

【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——LED、按键测试

1&#xff09;实验平台&#xff1a;正点原子ATK-DLMP257B开发板 2&#xff09;浏览产品&#xff1a;https://www.alientek.com/Product_Details/135.html 3&#xff09;全套实验源码手册视频下载&#xff1a;正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试4.1 LED…...

深度为16,位宽8bit的单端口SRAM——学习记录

链接&#xff1a; 【Verilog HDL 训练】第 13 天&#xff08;存储器、SRAM&#xff09;-云社区-华为云 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_…...

面向对象编程

在面向对象编程中&#xff0c;除了通过创建类的实例来访问其属性和方法外&#xff0c;还可以通过在一个类里创建另一个类的属性&#xff08;本质上也是持有另一个类的实例引用&#xff09;的方式来访问该类的属性和方法。下面为你详细解释这两种方式&#xff1a; 1. 通过创建实…...

远程登录一个Linux系统,如何用命令快速知道该系统属于Linux的哪个发行版,以及该服务器的各种配置参数,运行状态?

远程登录一个Linux系统&#xff0c;如何用命令快速知道该系统属于Linux的哪个发行版&#xff0c;以及该服务器的各种配置参数&#xff0c;运行状态&#xff1f; 查看Linux发行版信息 查看发行版名称和版本&#xff1a; cat /etc/*-release或 lsb_release -a查看内核版本&#…...

简单socket通信,回显 服务器程序与客户端程序之间的通信。

Socket 通信编程是一种基于网络的通信方式&#xff0c;允许不同主机上的程序通过网络进行数据交换。 实现结构try catch&#xff1a; 前情了解&#xff1a; 1.如何创建服务器端 定义ServerSocket套接字&#xff0c;需要等待客户端连接&#xff0c;阻塞&#xff0c;直到接入连接…...

C# 基类型和派生类型之间的转型

1.什么是基类型和派生类 基类型&#xff1a;父类&#xff0c;所有子类都继承自它。 派生类型&#xff1a;子类&#xff0c;继承了父类的属性和方法&#xff0c;还可以添加自己的新功能。 例子&#xff1a; class Animal { }//基类型 class Dog : Animal { }//派生类型 这…...

深度学习--激活函数

激活函数通过计算加权和并加上偏置来确定神经元是否应该倍激活&#xff0c;它们将输入信号转换为输出的可微运算。大多数激活函数都是非线性的&#xff0c;由于激活函数是深度学习的基础&#xff0c;下面简要介绍一些常见的激活函数。 1 RelU函数 最受欢迎的激活函数是修正线性…...

MySQL 缓存机制全解析:从磁盘 I/O 到性能优化

MySQL 缓存机制全解析&#xff1a;从磁盘 I/O 到性能优化 MySQL 的缓存机制是提升数据库性能的关键部分&#xff0c;它通过多级缓存减少磁盘 I/O 和计算开销&#xff0c;从而提高查询和写入的效率。 1. 为什么需要缓存&#xff1f; 数据库的性能瓶颈通常集中在磁盘 I/O 上。…...

【项目管理】第17章 项目干系人管理-- 知识点整理

项目管理-相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应:第6章-第19章 第6章 项目管理概论 4分第13章 项目资源管理 3-4分第7章 项目…...

编程语言到mysql ‘\‘到数量关系

在 MySQL 的模糊查询中&#xff0c;反斜杠 \ 的转义规则需要根据 转义层级 和 SQL 模式 来确定。以下是详细说明及示例&#xff1a; 一、默认模式下&#xff08;未启用 NO_BACKSLASH_ESCAPES&#xff09; 1. 规则说明 反斜杠转义&#xff1a;\ 是 MySQL 的默认转义字符。 转义…...

本地生活服务平台搭建方案详解:同城跑腿外卖系统源码一体化开发

在数字化浪潮不断推进的今天&#xff0c;本地生活服务平台正逐渐成为人们日常生活中不可或缺的一部分。从点餐外卖到同城帮买、帮送、帮取&#xff0c;用户对即时服务的需求愈发强烈。与此同时&#xff0c;创业者和本地商家也纷纷看好“同城服务 外卖配送”的一体化平台模式&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++)

有向⽆环图 若⼀个有向图中不存在回路&#xff0c;则称为有向⽆环图(directed acycline graph)&#xff0c;简称 DAG 图 AOV⽹ 举⼀个现实中的例⼦&#xff1a;课程的学习是有优先次序的&#xff0c;如果规划不当会严重影响学习效果。课程间的先后次序可以⽤有向图表⽰ 在…...

Rust泛型与特性

文章目录 泛型函数中的泛型结构体与枚举中的泛型特性&#xff08;trait&#xff09;默认特性Trait作为参数特性做返回值 给结构体实现方法 泛型 泛型编程是现代编程语言中重要的机制 C是通过模板来实现泛型的&#xff0c;而C语言中是没有泛型的 泛型是用来表达抽象类型的机制…...

Day08【基于预训练模型分词器实现交互型文本匹配】

基于预训练模型分词器实现交互型文本匹配 目标数据准备参数配置数据处理模型构建主程序测试与评估总结 目标 本文基于预训练模型bert分词器BertTokenizer&#xff0c;将输入的文本以文本对的形式&#xff0c;送入到分词器中得到文本对的词嵌入向量&#xff0c;之后经过若干网络…...

基于uniapp 实现画板签字

直接上效果图 代码 <template><view class"container"><!-- 签名画布 --><view class"canvas-container"><canvas canvas-id"signCanvas" class"sign-canvas"touchstart"handleTouchStart"touc…...

5.跳表(skiplist)

1. 什么是跳表 -skiplist skiplist 本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树和哈希表的价值是一样的&#xff0c;可以作为key 或者 key/value 的查找模型。 skiplist &#xff0c;顾名思义&#xff0c;首先它是一个 list 。实际上…...

GitHub 封禁中国 IP:影响、原因及应对

在技术全球化的当下&#xff0c;代码托管平台如同开发者的 “数字仓库”&#xff0c;而 GitHub 无疑是其中最广为人知的一座。但在 2025 年 4 月 13 日&#xff0c;一则令人震惊的消息在国内开发者社群中炸开了锅 ——GitHub 疑似封禁中国 IP。一时间&#xff0c;这一事件迅速成…...

基于工业操作系统构建企业数字化生态的实践指南

一、工业操作系统选型策略 工业操作系统&#xff08;IIoT OS&#xff09;的选型需从功能适配性、技术成熟度、生态兼容性三个维度综合评估。以玉麟科技DIOS平台为例&#xff0c;其 "云端 终端" 架构支持全球设备管理&#xff0c;通过工业知识模型实现设备健康度预测…...

金能电力领跑京东工业安全工器具赛道 2025年首季度数据诠释“头部效应”

金能电力领跑京东工业安全工器具赛道 2025年首季度数据诠释“头部效应” 在2025年第一季度京东工业平台“电料辅件-安全工器具”热销品牌的激烈竞争中&#xff0c;金能电力以一组极具说服力的数据&#xff0c;向行业展示了何为“绝对头部”。从成交金额、销量到流量、客群覆…...

基于大模型的反流食管炎手术全流程风险预测与治疗方案研究报告

目录 一、引言 1.1 研究背景 1.2 研究目的 1.3 研究方法与创新点 二、反流食管炎概述 2.1 定义与发病机制 2.2 临床症状与诊断标准 2.3 流行病学现状 三、大模型技术原理与应用现状 3.1 大模型基本原理 3.2 在医疗领域的应用案例 3.3 用于反流食管炎预测的优势 四…...

探索 C 与 Java/Kotlin 的语言差异:从指针到高阶函数

作为一名熟悉 Java 和 Kotlin 的开发者&#xff0c;初次接触 C/C 时常会遇到一系列概念上的“文化冲击”。本文将从几个关键点出发&#xff0c;帮助你更好地理解 C/C 与 Java/Kotlin 在语言设计上的核心区别。 1. 指向未知类型的指针 void*、结构体指针访问 ->、空指针常量 …...

Redis之缓存过期淘汰策略

面试切入点 Redis内存满了怎么办&#xff1f; redis的默认内存多少&#xff1f;在哪里查看&#xff1f;如何设置修改&#xff1f; 查看redis最大占用内存 打开redis配置文件&#xff0c;设置maxmemory参数&#xff0c;maxmemory是bytes字节类型&#xff0c;注意转换。 redi…...

Rust-引用借用规则

目录 一、概述 二、借用规则 三、详细解释 3.1 第一条规则 3.2 第二条规则 3.3 第三条规则 四、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [Rust-引用借用规则] ❤博主广交技术好友&#xff0c;喜欢文章的可以关注一下❤ 一、概述 Rust为确保程序在运行时不…...

【报错】解决pytorch出现RuntimeError: An attempt has been made to start a new process...

此错误是由于在 Windows 系统中使用多进程时&#xff0c;没有正确使用 if __name__ __main__: 语句块造成的。在 Windows 里&#xff0c;多进程的启动方式是 spawn&#xff0c;并非 fork&#xff0c;所以必须在主模块中使用 if __name__ __main__: 语句块来避免子进程重复执行…...

游戏引擎学习第228天

对上次的内容进行回顾&#xff0c;并为今天的开发环节做铺垫。 目前大部分功能我们已经完成了&#xff0c;唯一剩下的是一个我们知道存在但目前不会实际触发的 bug。这个 bug 的本质是在某些线程仍然访问一个已经被销毁的游戏模式&#xff08;mode&#xff09;之后的状态&…...

Pytorch Hook 技巧

通过 functools.partial 扩展 Pytorch Hook 机制 阅读 atom 文章源码时学习到的技巧&#xff0c;mark一下 通过 functools.partial&#xff0c;开发者无需修改原始函数或 PyTorch 的 Hook 机制&#xff0c;即可实现​​参数扩展与接口适配​​&#xff0c;这是 Python 函数式编…...

Python multiprocessing模块介绍

multiprocessing 是 Python 标准库中的一个模块&#xff0c;用于实现多进程并行计算&#xff0c;可以在多核 CPU 上显著提升程序性能&#xff0c;尤其适用于 CPU 密集型任务。Python 的多线程由于 GIL&#xff08;全局解释器锁&#xff09;限制&#xff0c;在进行 CPU 密集型任…...

[特殊字符] LoRA微调大模型实践:从MAC到Web的全流程指南

&#x1f680; 实践步骤概览 今天我们要在MAC上完成一个完整的AI项目闭环&#xff1a; 微调一个大模型 → 2. 导出模型并部署 → 3. 暴露API给web后端 → 4. 前端展示 &#x1f6e0;️ 微调模型准备 核心配置 框架&#xff1a;LLama-Factory &#x1f3ed; 算法&#xff1a…...

第二天 通过脚本控制物体移动和旋转

一、Unity脚本编程基础认知 1.1 为什么说脚本是Unity的灵魂&#xff1f; Unity引擎的核心架构采用ECS&#xff08;Entity-Component-System&#xff09;模式&#xff0c;脚本作为组件的具体实现&#xff0c;控制着游戏对象的所有行为。统计显示&#xff0c;一个中等规模的Uni…...

在SpringBoot中访问 static 与 templates 目录下的内容

目录 步骤一&#xff1a;添加 Thymeleaf 依赖 (处理 Templates 目录)步骤二&#xff1a;配置静态资源路径 (可选但建议了解)步骤三&#xff1a;访问不同目录下的 HTML 文件访问 static 目录下的 HTML 文件访问 templates 目录下的 HTML 文件 总结 在使用 Spring Boot 开发 Web …...

常见的 API 设计风格

在软件开发中&#xff0c;常见的 API 设计风格主要有以下几种&#xff0c;每种风格适用于不同的场景和需求&#xff1a; 1. RESTful API (主流) 特点&#xff1a; 基于 HTTP 协议&#xff0c;使用标准方法&#xff08;GET/POST/PUT/DELETE&#xff09;资源导向&#xff08;UR…...

Grass.io项目现状:DePIN亮眼明星,扩张中的AI数据银行

Grass.io项目现状:DePIN亮眼明星,扩张中的AI数据银行 Grass如何在DePIN项目丛林中脱颖而出? 答案在于其"零门槛"策略——用户是基石,其他一切皆为杠杆。 Grass通过"技术+模式"双轮驱动打破行业内卷:零知识证明技术与Solana Layer2架构确保数据真实…...

ERR_PNPM_DLX_NO_BIN No binaries found in tailwindcss

场景复现&#xff1a; 最近在vue3项目中安装了tailwindcss&#xff0c;但是它默认帮我安装的版本是4XX的&#xff0c;导致我执行 npx tailwindcss init -p报错了。 解决方案&#xff1a; 更改tailwindcss的版本为3 pnpm add -D tailwindcss3再次执行生成tailwindcss的初始…...

2025“钉耙编程”中国大学生算法设计春季联赛(6)(1001,1003,1008):1007

不知道为啥&#xff0c;感觉后面的联赛题目有挺多出的是模拟题目&#xff08;这三道题目难度依次递增&#xff09; 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&#xff0c;目前你站在为 “S” 的单元格上&#xff0c;你需要到达为 “D” 的单元格。在这片区域上还有另外三种类型的单元格&#xff1a; “.”&#xff1a;这些单元格是空的。 “X”…...

4.15【A】pc homework3~

5 假设read_document函数可以实现读取第m个文件&#xff0c;并返回该文本文档的每行数据 那么考虑双层并行结构&#xff0c;外层为文档级并行&#xff0c;内层为每个文档内的行级并行 动态分配文档任务&#xff0c;避免线程闲置 #include <omp.h> int total_words …...

aslist和list的区别

‌Arrays.asList和List的主要区别在于它们的固定长度和不可变性、与原始数组的关系、性能以及使用场景。 一、固定长度和不可变性 ‌Arrays.asList‌&#xff1a;通过Arrays.asList方法创建的List是一个固定长度的List&#xff0c;其长度与原始数组相同。这意味着你不能通过添…...

Notepad++中将文档格式从Windows(CR LF)转换为Unix(LF)

在Windows中用记事本写了一个.sh的Linux运行脚本&#xff0c;是无法直接在Linux中执行&#xff0c;需要首先把文本编码格式转换为Unix的&#xff0c;特别是换行符这些&#xff0c;转换步骤如下&#xff1a; 1、打开文档 在Notepad中打开需要转换的文件。 2、进入文档格式转换…...