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

本地大模型编程实战(32)用websocket显示大模型的流式输出

在与 LLM(大语言模型) 对话时,如果每次都等 LLM 处理完毕再返回给客户端,会显得比较卡顿,不友好。如何能够像主流的AI平台那样:可以一点一点吐出字符呢?
本文将模仿后端流式输出文字,前端一块一块的显示文字。主要的实现路径是:

  • LLM 采用 qwen3 ,使用 stream 方式输出
  • 后端使用 langchain 框架
  • 使用 fastapi 实现后端接口
  • 前后端之间使用 websocket 长连接通信
  • 前端使用一个简单的 html5 网页做演示

下面是最终实现的效果:
显示大模型的流式输出

文章目录

    • LLM流式输出
    • 实现后端接口
    • 实现前端页面
    • 见证效果
    • 总结
    • 代码

LLM流式输出

langchain 框架中,LLM(大语言模型) 可以用 stream 的方式一点一点吐出内容。请看代码:

from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage,AIMessagemodel_name = "qwen3"llm = ChatOllama(model=model_name,temperature=0.3,verbose=True)import asyncio
async def ask_stream(question,websocket=None):"""与大模型聊天,流式输出"""for chunk in llm.stream([HumanMessage(content=question)]):if isinstance(chunk, AIMessage) and chunk.content !='':print(chunk.content,end="^")if websocket is not None:await websocket.send_json({"reply": chunk.content})await asyncio.sleep(0.1)    # sleep一下后,前端就可以一点一点显示内容。

ask_stream 中使用 websocket 做参数只是为了演示便利,不适合用在实际生产环境。

实现后端接口

下面使用 fastapi 实现后端的 websocket 接口,前后端通信使用 json 格式,用 uvicorn 可以启动api。

from fastapi import FastAPI, WebSocket
from fastapi.responses import HTMLResponseapp = FastAPI()@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):await websocket.accept()try:while True:data = await websocket.receive_json()user_message = data.get("message", "")print(f"收到用户消息: {user_message}")await ask_stream(user_message,websocket=websocket)"""reply_message = ask(user_message)await websocket.send_json({"reply": reply_message})"""except Exception as e:print(f"连接关闭: {e}")import uvicornif __name__ == '__main__':# 交互式API文档地址:# http://127.0.0.1:8000/docs/ # http://127.0.0.1:8000/redoc/uvicorn.run(app, host="0.0.0.0", port=8000)

从上面的代码我们可以看出:fastapiwebsocket 支持的不错,实现起来也比较简洁。

实现前端页面

为了方便演示,我们做了一个 html5 静态网页,并实现一个 get 方法将网页发送给浏览器。

  • 发送网页的接口
import os@app.get("/")
async def get():"""返回聊天页面"""file_path = os.path.join(os.path.dirname(__file__), "chat.html")with open(file_path, "r", encoding="utf-8") as f:html_content = f.read()return HTMLResponse(content=html_content)
  • chat.html
<!DOCTYPE html>
<html><head><title>用WebSocket与大模型聊天</title><style>#chat-box {width: 90%;height: 600px;border: 1px solid #ccc;overflow-y: scroll;margin-bottom: 10px;padding: 10px;}#user-input {width: 80%;padding: 5px;}#send-button {padding: 5px 10px;}.user-message {color: blue;}.server-message {color: green;}</style>
</head><body><h1>WebSocket 聊天测试</h1><div id="chat-box"></div><input type="text" id="user-input" placeholder="请输入你的消息..." /><button id="send-button" onclick="sendMessage()">发送</button><script>var ws = new WebSocket("ws://localhost:8000/ws");var chatBox = document.getElementById("chat-box");var input = document.getElementById("user-input");var currentServerMessageDiv = null; // 记录正在追加的服务器消息元素ws.onmessage = function(event) {var data = JSON.parse(event.data);handleServerReply(data.reply);};function sendMessage() {var message = input.value.trim();if (message === "") return;appendMessage("你", message, "user-message");ws.send(JSON.stringify({ "message": message }));input.value = "";// 清空服务器回复正在构建的divcurrentServerMessageDiv = null;}function appendMessage(sender, message, className) {var messageElement = document.createElement("div");messageElement.className = className;messageElement.textContent = sender + ": " + message;chatBox.appendChild(messageElement);chatBox.scrollTop = chatBox.scrollHeight;return messageElement;}function handleServerReply(partialText) {if (!currentServerMessageDiv) {// 第一次,创建一个新的divcurrentServerMessageDiv = appendMessage("服务器", partialText, "server-message");} else {// 后续,直接在当前div后面追加currentServerMessageDiv.textContent += partialText;chatBox.scrollTop = chatBox.scrollHeight;}}// 按回车发送消息input.addEventListener("keydown", function(event) {if (event.key === "Enter") {sendMessage();}});</script></body></html>

见证效果

现在我们可以启动后端接口,然后打开浏览器,输入地址:http://127.0.0.1:8000 ,体验与大语言模型聊天的快乐了。

总结

使用 qwen3langchianfastapiwebsockethtml5 实现一个像主流AI工具那样与 LLM(大语言模型) 聊天的功能很有意思。
当我看到前端一块一块的显示大语言模型的回复的时候,心底不由得涌出一点小震撼:没错,它在改变世界!


代码

本文涉及的所有代码以及相关资源都已经共享,参见:

  • github
  • gitee

为便于找到代码,程序文件名称最前面的编号与本系列文章的文档编号相同。

🪐感谢您观看,祝好运🪐

相关文章:

本地大模型编程实战(32)用websocket显示大模型的流式输出

在与 LLM(大语言模型) 对话时&#xff0c;如果每次都等 LLM 处理完毕再返回给客户端&#xff0c;会显得比较卡顿&#xff0c;不友好。如何能够像主流的AI平台那样&#xff1a;可以一点一点吐出字符呢&#xff1f; 本文将模仿后端流式输出文字&#xff0c;前端一块一块的显示文字…...

MySQL数据库上篇

#作者&#xff1a;允砸儿 #日期&#xff1a;乙巳青蛇年 四月初五 笔者好久没有更新。今天来写一下MySQL数据库的内容还是老样子分为上中下三篇来写&#xff0c;话不多说咱们直接进入正题。 什么是数据库 数据库是统一管理的、长期储存在计算机内非仍、有组织的相关数据集合…...

Webug4.0靶场通关笔记13- 第22关越权修改密码

目录 第22关 越权修改密码 1.打开靶场 2.源码分析 3.越权修改密码 &#xff08;1&#xff09;获取渗透账号 &#xff08;2&#xff09;越权修改aaaaa账号的密码 &#xff08;3&#xff09;修改aaaaa用户密码渗透成功 &#xff08;4&#xff09;水平越权修改mooyuan账号…...

Python 基于 lstm,cnn 算法的网络舆情可视化系统

大家好&#xff0c;我是Python徐师兄&#xff0c;一个有着7年大厂经验的程序员&#xff0c;也是一名热衷于分享干货的技术爱好者。平时我在 CSDN、掘金、华为云、阿里云和 InfoQ 等平台分享我的心得体会。 &#x1f345;文末获取源码联系&#x1f345; 2025年最全的计算机软件毕…...

【免费】2007-2021年上市公司对外投资数据

2007-2021年上市公司对外投资数据 1、时间&#xff1a;2007-2021年 2、指标&#xff1a;股票代码、统计截止日期、货币编码、货币类型、投资事件类型编码、投资事件类型、报告期末投资金额总计、占报告期对外投资总额的比例(%) 3、范围&#xff1a;上市公司 4、来源&#x…...

每天学一个 Linux 命令(33):uniq

每天学一个 Linux 命令(33):uniq 命令简介 uniq 是 Linux 系统中一个非常实用的文本处理命令,全称为 “unique”。它主要用于从已排序的文本文件中检测、过滤或统计重复的行。该命令通常与 sort 命令配合使用,是 Shell 脚本编程和日常文本处理中的常用工具之一。 命令语…...

WebRtc11:SDP详解

SDP规范 会话层&#xff08;全局&#xff09;媒体层&#xff08;局部&#xff09; 会话层 会话的名称和目的会话的存活时间会话中包含多个媒体信息 SDP媒体信息 媒体格式传输协议传输IP和端口媒体负载类型 SDP格式 由多个< type > < value > 组成一个会话级…...

51单片机驱动 矩阵键盘

连接方式为8-1顺序连接P1端口P10-P17&#xff0c;代码返回键值 0-15. // 矩阵键盘扫描 uchar key_scan(void) {u8 key_value 255;u8 row, col;// 设置P1.0-P1.3为输出&#xff0c;P1.4-P1.7为输入P1 0xF0; // 1111 0000if((P1 & 0xF0) ! 0xF0) { // 有按键按下delay_m…...

解决The‘InnoDB’feature is disabled; you need MySQL built with ‘InnoDB’ to have it

出现如下语句&#xff1a;The ‘InnoDB feature is disabled; you need MySQL built with ‘InnoDB to have it working&#xff1b; 是mysql配置文件禁掉了这个选项&#xff01; 关闭mysql数据库 在mysql的安装目录中找到my.ini文件 找到skip-innodb&#xff0c;在前面加上#号…...

大模型压缩技术详解(2025最新进展)

在2025年的AI技术格局中&#xff0c;像DeepSeek这样的顶尖模型开源已成为现实。那是否存在一种可行路径&#xff0c;让企业能够使用专注于自身领域的强力AI模型&#xff0c;同时大幅降低部署成本&#xff0c;仅需一张普通的4090显卡&#xff1f;本文将深入探讨两种主流的模型压…...

第 5 篇:红黑树:工程实践中的平衡大师

上一篇我们探讨了为何有序表需要“平衡”机制来保证 O(log N) 的稳定性能。现在&#xff0c;我们要认识一位在实际工程中应用最广泛、久经考验的“平衡大师”——红黑树 (Red-Black Tree)。 如果你用过 Java 的 TreeMap​ 或 TreeSet​&#xff0c;或者 C STL 中的 map​ 或 s…...

spring-- 事务失效原因及多线程事务失效解决方案

事务失效原因 类的自调用&#xff1a;直接调用本类的方法&#xff0c;没有通过代理对象来调用方法&#xff0c;代理对象内部的事务拦截器不会拦截到这次行为。则不可能开启事务 使用私有方法&#xff1a;因为spring的事务管理是基于AOP实现的&#xff0c;AOP代理无法拦截目标对…...

MLPerf基准测试工具链定制开发指南:构建领域特异性评估指标的实践方法

引言&#xff1a;基准测试的领域适配困局 MLPerf作为机器学习性能评估的"黄金标准"&#xff0c;其通用基准集在实际科研中常面临‌领域适配鸿沟‌&#xff1a;医疗影像任务的Dice系数缺失、NLP场景的困惑度指标偏差等问题普遍存在。本文通过逆向工程MLPerf v3.1工具…...

深度理解linux系统—— 进程切换和调度

前言&#xff1a; 了解了进程的状态和进程的优先级&#xff0c;我们现在来看进程是如何被CPU调度执行的。 在单CPU的系统在&#xff0c;程序是并发执行的&#xff1b;也就是说在一段时间呢&#xff0c;进程是轮番执行的&#xff1b; 这也是说一个进程在运行时不会一直占用CPU直…...

【凑修电脑的小记录】vscode打不开

想把vscode的数据和环境从c盘移到d盘 大概操作和这篇里差不多 修改『Visual Studio Code&#xff08;VS Code&#xff09;』插件默认安装路径的方法 - 且行且思 - 博客园 在原地址保留了个指向新地址的链接文件。 重新安装vscode后双击 管理员身份运行均无法打开&#xff0…...

2025五一数学建模竞赛A题完整分析论文(共45页)(含模型、可运行代码、数据)

2025年五一数学建模竞赛A题完整分析论文 摘 要 一、问题分析 二、问题重述 三、模型假设 四、符号定义 五、 模型建立与求解 5.1问题1 5.1.1问题1思路分析 5.1.2问题1模型建立 5.1.3问题1参考代码 5.1.4问题1求解结果 5.2问题2 5.2.1问题2思路分析 …...

从0搭建Transformer

0. 架构总览&#xff1a; 1. 位置编码模块&#xff1a; import torch import torch.nn as nn import mathclass PositonalEncoding(nn.Module):def __init__ (self, d_model, dropout, max_len5000):super(PositionalEncoding, self).__init__()self.dropout nn.Dropout(pdrop…...

生物化学笔记:神经生物学概论07 躯体感受器 传入方式 自主神经系统

功能各异的躯体感受器 解释张力&#xff1a; 形形色色的传入方式 脑中的“倒立小人” 自主神经系统...

滑动窗口leetcode 209和76

一、leetcode 209. 长度最小的子数组 代码&#xff1a; class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int n nums.size();int left 0;int sum 0;int res 100001;for(int right 0;right <n;right){sum nums[right];while(s…...

FPGA:介绍几款高速ADC及其接口形式

本文介绍了几款采样率至少为500Msps的高速ADC芯片&#xff0c;并详细介绍ADC与FPGA之间的常见接口形式&#xff0c;以及FPGA如何正确读取高速ADC的输出数据。以下内容基于当前的高速ADC技术趋势和常见的工程实践。 一、推荐的高速ADC芯片&#xff08;采样率≥500Msps&#xff0…...

未使用连接池或配置不当的性能陷阱与优化实践

目录 前言一、传统连接管理的性能缺陷与风险1. 未使用连接池的致命代价2. 连接池配置不当的典型表现 二、高性能连接池选型与核心参数优化1. HikariCP&#xff1a;零开销连接池的标杆2. Druid&#xff1a;功能完备的国产连接池 三、连接池性能调优的黄金法则1. 科学设定最大连接…...

亚马逊云服务器性能深度优化方案(2025版)

亚马逊云服务器性能深度优化方案&#xff08;2025版&#xff09; 一、计算架构全面升级 1. 新一代AI算力引擎 • Trn2 UltraServer实例&#xff1a;搭载64颗第二代Trainium芯片&#xff0c;单节点FP8算力达83.2 PFlops&#xff0c;支持千亿参数大模型训练&#xff0c;训…...

【IPMV】图像处理与机器视觉:Lec9 Laplace Blending 拉普拉斯混合

【IPMV】图像处理与机器视觉 本系列为2025年同济大学自动化专业**图像处理与机器视觉**课程笔记 Lecturer: Rui Fan、Yanchao Dong Lec0 Course Description Lec3 Perspective Transformation Lec7 Image Filtering Lec8 Image Pyramid Lec9 Laplace Blending 持续更新中 …...

【东枫电子】AMD / Xilinx Alveo™ UL3422 加速器

AMD / Xilinx Alveo™ UL3422 加速器 AMD / Xilinx Alveo™ UL3422 加速器提供超低延迟网络和灵活应变的硬件&#xff0c;支持纳秒级交易策略。AMD Virtex™ UltraScale™ VU2P FPGA 为 AMD / Xilinx Alveo UL3422 加速器提供强大的支持。该加速器采用延迟优化的收发器技术&am…...

Linux架构篇、第一章_03安装部署nginx

Linux_基础篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;安装部署nginx 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.02 适用环境: Centos7 文档说明 本文档聚焦于 CentOS 7 环境下 Nginx 的安装部…...

Semantic Kernel 快速入门

文章目录 Semantic Kernel 快速入门一、什么是 Semantic Kernel&#xff1f;1.1 核心特性 二、安装和配置2.1 安装 .NET SDK2.2 创建新的 .NET 项目2.3 安装 Semantic Kernel 三、快速入门3.1 导入依赖包3.2 添加 AI 服务3.3 添加企业服务3.4 生成内核并检索服务3.5 添加插件创…...

MySQL进阶(一)

一、存储引擎 1. MySQL体系结构 连接层&#xff1a; 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限 服务层&#xff1a; 第二层架构主要完成大多数的核心服务…...

ThreadLocal理解

1.thread是线程&#xff0c;threadLocal是对象&#xff1f; 在 Java 中&#xff1a; Thread 是线程类&#xff0c;其实例代表线程&#xff1a;Thread 类用于创建和管理线程&#xff0c;每个线程都是 Thread 类的一个实例&#xff0c;用于执行具体的任务&#xff0c;例如&…...

PyTorch、Flash-Attn、Transformers与Triton技术全景解析+环境包

PyTorch、Flash-Attn、Transformers与Triton技术全景解析 包好难找 这里是下载链接 添加链接描述 摘要 本文系统性地介绍了深度学习领域的四大关键技术框架&#xff1a;PyTorch、Flash-Attn、Hugging Face Transformers和Triton&#xff0c;分别从核心特性、技术优势、应用场…...

mindyolo填坑

1、按照gitee上的文档跑预测代码&#xff0c;跑不通 更改&#xff1a; 将predict.py复制到跟目录。如果是cpu&#xff08;本地测试比较常见&#xff09;&#xff0c;那么正确的命令行是&#xff1a; python predict.py --device_targetCPU --config ./configs/yolov7/yolov7.…...

【C++】平衡二叉树(AVL树)迭代版

目录 前言&#xff1a; 一&#xff1a;判断一棵树是否为平衡二叉树 二&#xff1a;明确思路 1.为什么使用平衡二叉树 2.旋转 2.1 左旋 2.2 右旋 3.冲突节点 4.平衡因子 5.双旋 5.1 左右双旋(LR) 5.2 右左双旋(RL) 6.平衡因子的更新 7.冲突节点问题补充 三&…...

双链表详解

一、双向链表介绍 二、实现双向链表 1.定义双向链表的结构 2.双向链表的初始化 3.双向链表的尾插 4.双向链表的头插 5.双向链表的打印 6.双向链表的尾删 7.双向链表的头删 8.查找指定位置的数据 9.在指定位置之后插入数据 10.删除指定位置的数据 11.链表的销毁 三、…...

6.9.单源最短路径问题-BFS算法

一.前言&#xff1a; 问题1&#xff1a; 以上述图片为例&#xff0c;比如从G港到Y城&#xff0c;可以是G港->R城->Y城&#xff0c;也可以是G港->P城->Y城等&#xff0c;有很多条路径都可以实现从G港到Y城&#xff0c;但要从中找出G港到Y城距离最短的那一条路径&am…...

react js 查看字体效果

起因&#xff0c; 目的: 想查看某个字体&#xff0c;对中英文的支持情况。 效果图: 完整项目见这里&#xff0c; 需要积分下载&#xff0c;不然的话&#xff0c;显得太水了。 过程: AI 对话&#xff0c; 生成代码。我检查运行&#xff0c; 来回修改。写个博客&#xff0c;…...

GZIPInputStream 类详解

GZIPInputStream 类详解 GZIPInputStream 是 Java 中用于解压缩 GZIP 格式数据的流类,属于 java.util.zip 包。它是 InflaterInputStream 的子类,专门处理 GZIP 压缩格式(.gz 文件)。 1. 核心功能 解压 GZIP 格式数据(RFC 1952 标准)自动处理 GZIP 头尾信息(校验和、时…...

数字智慧方案6206丨智慧园区大数据整体解决方案(45页PPT)(文末有下载方式)

资料解读&#xff1a;智慧园区大数据整体解决方案 详细资料请看本解读文章的最后内容。 在数字化快速发展的当下&#xff0c;智慧园区成为推动产业升级和城市发展的关键力量。这份智慧园区大数据整体解决方案&#xff0c;融合前沿技术与创新理念&#xff0c;为园区的高效管理、…...

Linux系统常用命令、标准C库函数和系统调用

目录 一、常用命令 env echo $name 键值 export name unset name gcc -c xxx.c ar 命令 ar -r libxxx.a xxx1.o xxx2.o gcc -c -fpic xxx.c gcc -shared -fpic xxx1.c xxx2.c -o libxxx.so kill [-信号] PID kill -l 软链接&#xff1a;ln -s xxx yyy 硬链接&…...

【Linux】基础指令(2)

man linux中有很多指令&#xff0c;我们不可能全部记住&#xff0c;man是linux/unix系统中的手册页指令&#xff0c;当我们遇到不熟悉的命令可以用man来查看命令&#xff0c;函数&#xff0c;配置文件的详细使用说明。 man手册分为多个章节&#xff0c;详情如下&#xff1a; …...

“会话技术”——Cookie_(2/2)原理与使用细节

经过Cookie的快速入门与代码使用。如果想深入理解Cookie的技术实现&#xff0c;就得去理解它的原理。 且有些时候使用Cookie&#xff0c;还要根据需求设置存活期限以及确定Cookie获取范围等其他细节。最后&#xff0c;我们会总结Cookie这门客户端会话技术的作用。 一、原理 注…...

Linux操作系统--进程间通信(中)(命名管道)

目录 1.命名管道&#xff1a; 1.1创建一个命名管道 1.2匿名管道与命名管道的区别 1.3命名管道的打开规则 1.4例子1-用命名管道实现文件拷贝 1.5例子2-用命名管道实现server&client通信 1.命名管道&#xff1a; 毫不相关的进程进行进程间通信管道应用的一个限制就是只能…...

数据结构6 · BinaryTree二叉树模板

代码函数功能顺序如下&#xff1a; 1&#xff1a;destroy&#xff1a;递归删除树 2&#xff1a;copy&#xff1a;复制二叉树 3&#xff1a;preOrder&#xff1a;递归前序遍历 4&#xff1a;inOrder&#xff1a;递归中序遍历 5&#xff1a;postOrder&#xff1a;递归后续遍…...

ubuntu的libc 库被我 sudo apt-get --reinstall install libc6搞没了

我系统的libc 没了 今天为了运行一个开源的yuv 播放器&#xff0c;在运行的时候提醒 Inconsistency detected by ld.so: dl-call-libc-early-init.c: 37: _dl_call_libc_early_init: Assertion sym ! NULL failed!然后听从AI 的建议 当我去执行ls 时&#xff0c;系统提示 就这…...

cat file.tar.gz | tar -xzf - -C /target/dir两个减号之间为什么有个空格?是写错了吗?(管道命令后续)

在 tar 命令的参数 -xzf - -C 中&#xff0c;两个减号&#xff08;-&#xff09;之间的空格是故意保留的语法&#xff0c;没有写错。具体原因如下&#xff1a; 1. -xzf - 的语法解析 -xzf 是 tar 命令的组合参数&#xff1a; x&#xff1a;表示解压&#xff08;extract&#x…...

手机的数据楚门世界是如何推送的

手机推送&#xff0c;也叫茧影算法&#xff0c;手机的数据“楚门世界”&#xff1a;信息推送机制的深度剖析与社会影响 在数字化时代&#xff0c;手机已然成为人们生活中不可或缺的伴侣。当我们沉醉于手机带来的便捷与娱乐时&#xff0c;或许未曾察觉&#xff0c;自己正置身于…...

体系结构论文(八十二):A Comprehensive Analysis of Transient Errors on Systolic Arrays

研究背景与动机 TPU架构&#xff08;Tensor Processing Unit&#xff09;广泛应用于DNN推理&#xff0c;其核心是脉动阵列&#xff0c;由大量的乘加单元&#xff08;MAC&#xff09;组成。 由于使用了纳米级CMOS技术&#xff0c;TPU对辐射引发的瞬态错误&#xff08;SET&#…...

综合案例:使用vuex对购物车的商品数量和价格等公共数据进行状态管理

文章目录 0.实现需求1.新建购物车模块cart2.使用json-server模拟向后端请求数据3.在vuex请求获取并存入数据,并映射到组件中,在组件中渲染【重点】3.1.安装axios3.2.准备actions和mutations,获取和存入数据到vuex中3.3.动态渲染:用mapState映射 其他1.为什么在axios在项目中要局…...

二叉搜索树的判断(双指针解决)

98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:TreeNode*preNULL;bool isValidBST(TreeNode* root) {if(rootNULL){return true;}bool leftisValidBST(root->left);if(pre!NULL&&pre->val>root->val){return fals…...

关于CSDN创作的常用模板内容

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 好文评论新文推送 &#x1f4c3;文章前言 &…...

不小心误删了文件,找Windows数据恢复工具来帮忙

相信很多人都遇到过这样的情况&#xff1a;不小心在电脑上删除了一些重要的文件&#xff0c;等到想要找回来时&#xff0c;却感觉特别棘手。 今天我要给大家推荐一款超棒的Windows数据恢复工具&#xff0c;它能轻松帮你找回那些被误删的文件。 &#xff08;文末附下载链接&…...

[Verilog]跨时钟域数据传输解决方案

跨时钟域数据传输解决方案 摘要:跨时钟域数据传输 (Clock Domain Crossing, CDC) 是 SoC 设计中常见且关键的问题,因为现代 SoC 通常包含多个时钟域,不同模块可能运行在不同频率或相位的时钟下。跨时钟域传输数据时,如果处理不当,可能会导致亚稳态 (Metastability)…...