FPGA跨时钟域处理
文章目录
- 一、为什么要做跨时钟域处理
- 二、单bit信号从慢时钟到快时钟处理
- 2.1 使用同步寄存器链(打两拍)
- 2.2 仿真代码编写
- 2.3 仿真结果观察
- 三、单bit信号从快时钟域到慢时钟域处理
- 3.1 使用脉冲展宽
- 3.2 仿真代码编写
- 3.3 仿真结果观察
- 四、在任意时钟域跨单bit信号
- 4.1 使用握手协议传输单bit脉冲信号
- 4.2 从快到慢仿真代码编写
- 4.3 从快到慢仿真结果观察
- 4.4 从慢到快仿真结果观察
- 五、多bit数据跨时钟域
一、为什么要做跨时钟域处理
在之前的文章《FPGA静态时序分析与约束(一)、理解亚稳态》中,我知道了什么是亚稳态以及亚稳态对系统的危害。通常我们的系统工程中不止有一个处理时钟,当不同时钟域下的信号进行交互的时候就涉及到跨时钟域的问题了。由于不同时钟的频率、相位都可能不同,所以就存在目标时钟在采集源时钟域信号时发生亚稳态情况,如下图所示:

此时源时钟域下的信号变化刚好在目标时钟域的上升沿建立或保持时间范围内,因此发生了建立或保持时间违规从而造成亚稳态的输出。因此我们必须对这种情况进行处理,处理方式分为三种情况:
- 单bit信号从慢时钟到快时钟
- 单bit信号从快时钟到慢时钟
- 多bit信号跨时钟域
二、单bit信号从慢时钟到快时钟处理
2.1 使用同步寄存器链(打两拍)
在快时钟域频率高于慢时钟域时,理论上一个慢时钟域周期的信号可以百分百被快时钟采集到,为了防止亚稳态的产生可以通过打两拍的方式处理,如下图所示:

就算第一级寄存器产生了亚稳态,但是经过自身寄存器输出后能够使信号快速回落至稳定状态,稳定输出的概率为70%~80%左右,第二级寄存器可以稳定输出的概率为99%左右,再后面改善就不明显了,所以一般情况下进行两级寄存就能消除大多数情况下的亚稳态。代码如下:
`timescale 1ns / 1ps
module single_bit_slow2fast(input i_signal_a , //慢时钟域的信号input i_clk_b , //快时钟input i_rst_b , //快时钟域复位信号,高电平有效 output o_signal_b , //快时钟域同步后的信号output o_signal_b_pos , //同步后的信号上升沿output o_signal_b_neg //同步后的信号下降沿
);reg r_signal_a_d1 ;
reg r_signal_a_d2 ;
reg r_signal_a_d3 ; //再打一拍是用最稳定的两拍检测边沿信号assign o_signal_b = r_signal_a_d2;
assign o_signal_b_pos = r_signal_a_d2 & (~r_signal_a_d3);
assign o_signal_b_neg = (~r_signal_a_d2) & r_signal_a_d3;always @(posedge i_clk_b or posedge i_rst_b) beginif(i_rst_b == 1'b1)beginr_signal_a_d1 <= 1'b0;r_signal_a_d2 <= 1'b0;r_signal_a_d3 <= 1'b0;endelse beginr_signal_a_d1 <= i_signal_a;r_signal_a_d2 <= r_signal_a_d1;r_signal_a_d3 <= r_signal_a_d2;end
endendmodule
2.2 仿真代码编写
仿真代码产生两个不同快慢时钟,以及慢时钟域的信号,代码如下:
`timescale 1ns / 1ns
module tb_single_bit_slow2fast();reg i_clk_b ;reg clk_a ;reg i_rst_b ;reg i_signal_a ;initial begini_clk_b = 0;clk_a = 0;i_rst_b = 1;i_signal_a = 0;#300 @(posedge i_clk_b) i_rst_b = 0;
endalways #2 i_clk_b = ~ i_clk_b;
always #15 clk_a = ~clk_a;always @(posedge clk_a) beginrepeat(20)begini_signal_a <= {$random}%2;#30i_signal_a <= 0;#200;end
endsingle_bit_slow2fast u_single_bit_slow2fast(.i_signal_a ( i_signal_a ),.i_clk_b ( i_clk_b ),.i_rst_b ( i_rst_b ),.o_signal_b ( o_signal_b ),.o_signal_b_pos ( o_signal_b_pos ),.o_signal_b_neg ( o_signal_b_neg )
);endmodule
2.3 仿真结果观察

从仿真来看,慢时钟信号无论什么时候发送,快时钟依然能采集到。
三、单bit信号从快时钟域到慢时钟域处理
3.1 使用脉冲展宽
对于快时钟域的信号让慢时钟来采集,不能使用打两拍来处理,因为快时钟信号宽度太小很可能慢时钟采集不到,如下图这种情况:

在这种情况下,我们可以将快时钟下的信号进行展宽至慢时钟能采集到为止,然后再用慢时钟打两拍进行同步处理,如下所示:

具体展宽多长,需要看两个时钟频率之间的比值,例如快时钟频率是175.5M,慢时钟是27M,快慢时钟之比=6.5,所以要将快时钟的脉冲展宽至7个时钟周期宽度才能确保被慢时钟采到。代码如下:
`timescale 1ns / 1ps
module single_bit_fast2slow#
(parameter CLKA_FPQ = 100_000_000,parameter CLKB_FPQ = 33_000_000
)
(input i_clk_a , //快时钟input i_rst_a , //快时钟域复位信号,高电平有效input i_signal_a , //快时钟脉冲信号input i_clk_b , //慢时钟input i_rst_b , //慢时钟复位信号,高电平有效output o_signal_b //慢时钟同步后的信号
);localparam CLK_NUM = CLKA_FPQ / CLKB_FPQ;/***********a时钟域*******************/ reg [7:0] clk_cnt ; //快时钟域下的计数器
reg r_i_signal_a ; //需要展宽的信号always @(posedge i_clk_a) beginif(i_rst_a)r_i_signal_a <= 1'b0;else if(clk_cnt == CLK_NUM)r_i_signal_a <= 1'b0;else if(i_signal_a == 1'b1)r_i_signal_a <= 1'b1;elser_i_signal_a <= r_i_signal_a;
endalways @(posedge i_clk_a) beginif(i_rst_a)clk_cnt <= 'd0;else if(clk_cnt == CLK_NUM)clk_cnt <= 'd0;else if(r_i_signal_a == 1'b1)clk_cnt <= clk_cnt + 1'b1;elseclk_cnt <= 'd0;
end/******************b时钟域**************/
reg r_signal_b1 ;
reg r_signal_b2 ;assign o_signal_b = r_signal_b2;always @(posedge i_clk_b) beginif(i_rst_b)beginr_signal_b1 <= 1'b1;r_signal_b2 <= 1'b1;endelse beginr_signal_b1 <= r_i_signal_a;r_signal_b2 <= r_signal_b1;endendendmodule
3.2 仿真代码编写
`timescale 1ns / 1nsmodule tb_single_bit_fast2slow();reg i_clk_a;
reg i_rst_a;
reg i_signal_a;
reg i_clk_b;
reg i_rst_b;initial begini_clk_a = 0;i_rst_a = 1;i_clk_b = 0;i_rst_b = 1;#150i_rst_a = 0;#100i_rst_b = 0;
endalways#5 i_clk_a = ~i_clk_a;
always#15 i_clk_b = ~i_clk_b;always @(posedge i_clk_a) beginif(i_rst_a == 1'b1)i_signal_a <= 1'b0;else begini_signal_a <= {$random}%2;#10;i_signal_a <= 1'b0;#100;endendsingle_bit_fast2slow#(.CLKA_FPQ ( 100_000_000 ),.CLKB_FPQ ( 30_000_000 )
)u_single_bit_fast2slow(.i_clk_a ( i_clk_a ),.i_rst_a ( i_rst_a ),.i_signal_a ( i_signal_a ),.i_clk_b ( i_clk_b ),.i_rst_b ( i_rst_b ),.o_signal_b ( o_signal_b )
);endmodule
3.3 仿真结果观察

仿真设置快时钟频率为100M,慢时钟频率为30M,因此需要将脉冲宽度展宽四个快时钟周期,然后慢时钟再打两拍同步一下,由仿真结果观察结果正确,我们下面将快时钟设置为500M,结果如下:

由上面可以看出,快时钟为500M,慢时钟为30M依然也能正确的采集到快时钟的脉冲信号。
四、在任意时钟域跨单bit信号
前面两种情况,我们实现了单bit时钟从快到慢,或者从慢到快时钟之间的传输。除了使用以上两种方式外,我们还可以通过握手信号来实现任意时钟域之间的单bit信号传输。
4.1 使用握手协议传输单bit脉冲信号
从A时钟域向B时钟域传输脉冲信号,可以在A时钟检测脉冲信号,然后随即拉高一个valid信号,直到B时钟检测到valid信号后拉高一个周期的同步信号,同时给出ack信号,然后A时钟检测到ack信号后,拉低valid信号表示一次传输完成。

代码如下:
`timescale 1ns / 1ps
module single_bit_handshake#
(parameter CLKA_FPQ = 100_000_000,parameter CLKB_FPQ = 20_000_000
)
(input i_clk_a , //A时钟input i_rst_a , //A时钟域复位信号,高电平有效input i_signal_a , //A时钟脉冲信号input i_clk_b , //B时钟input i_rst_b , //B时钟复位信号,高电平有效output o_signal_b //B时钟同步后的信号
);localparam CLK_NUM = (CLKA_FPQ >= CLKB_FPQ) ? 1 : (CLKB_FPQ / CLKA_FPQ);/****************A时钟域*********************/
reg r_signal_a_valid ;
reg r_ack_a1 ;
reg r_ack_a2 ;
/****************B时钟域*********************/
reg r_signal_b1 ;
reg r_signal_b2 ;
reg r_signal_b3 ;
reg r_signal_b_ack ;
reg [7:0] r_clk_cnt_b ;assign o_signal_b = r_signal_b3;/****************A时钟域*********************/
always @(posedge i_clk_a) beginif(i_rst_a == 1'b1)r_signal_a_valid <= 1'b0;else if(r_ack_a2 == 1'b1)r_signal_a_valid <= 1'b0;else if(i_signal_a == 1'b1)r_signal_a_valid <= 1'b1;elser_signal_a_valid <= r_signal_a_valid;
endalways @(posedge i_clk_a) beginif(i_rst_a == 1'b1)beginr_ack_a1 <= 1'b0;r_ack_a2 <= 1'b0;endelse beginr_ack_a1 <= r_signal_b_ack;r_ack_a2 <= r_ack_a1;endend/****************B时钟域*********************/
always @(posedge i_clk_b) beginif(i_rst_b == 1'b1)beginr_signal_b1 <= 1'b0;r_signal_b2 <= 1'b0; endelse if(r_signal_a_valid == 1'b1)beginr_signal_b1 <= 1'b1;r_signal_b2 <= r_signal_b1;endelse beginr_signal_b1 <= 1'b0;r_signal_b2 <= 1'b0;end
endalways @(posedge i_clk_b) beginif(i_rst_b == 1'b1)r_signal_b3 <= 1'b0;else if((r_signal_b1 ==1'b1)&&(r_signal_b2 == 1'b0))r_signal_b3 <= 1'b1;elser_signal_b3 <= 1'b0;
endalways @(posedge i_clk_b) beginif(i_rst_b == 1'b1)r_signal_b_ack <= 1'b0;else if(r_clk_cnt_b == CLK_NUM)r_signal_b_ack <= 1'b0;else if((r_signal_b1 ==1'b1)&&(r_signal_b2 == 1'b0))r_signal_b_ack <= 1'b1;elser_signal_b_ack <= r_signal_b_ack;
endalways @(posedge i_clk_b) beginif(i_rst_b == 1'b1)r_clk_cnt_b <= 'd0;else if(r_clk_cnt_b == CLK_NUM)r_clk_cnt_b <= 'd0;else if(r_signal_b_ack == 1'b1)r_clk_cnt_b <= r_clk_cnt_b + 1'b1;elser_clk_cnt_b <= 'd0;
endendmodule
4.2 从快到慢仿真代码编写
先设置从快时钟到慢时钟
`timescale 1ns / 1ps
module tb_single_bit_handshake();reg i_clk_a;
reg i_rst_a;
reg i_signal_a;
reg i_clk_b;
reg i_rst_b;initial begini_clk_a = 0;i_rst_a = 1;i_clk_b = 0;i_rst_b = 1;#150i_rst_a = 0;#100i_rst_b = 0;
endalways#1 i_clk_a = ~i_clk_a;
always#15 i_clk_b = ~i_clk_b;always @(posedge i_clk_a) beginif(i_rst_a == 1'b1)i_signal_a <= 1'b0;else begini_signal_a <= {$random}%2;#2;i_signal_a <= 1'b0;#100;endendsingle_bit_handshake#(.CLKA_FPQ ( 500_000_000 ),.CLKB_FPQ ( 30_000_000 )
)u_single_bit_handshake(.i_clk_a ( i_clk_a ),.i_rst_a ( i_rst_a ),.i_signal_a ( i_signal_a ),.i_clk_b ( i_clk_b ),.i_rst_b ( i_rst_b ),.o_signal_b ( o_signal_b )
);endmodule
4.3 从快到慢仿真结果观察

由图可看出,从500M的快时钟到30M的慢时钟能成功传输。
4.4 从慢到快仿真结果观察
将仿真代码的AB时钟互换一下,变成从30M慢时钟传输到500M快时钟,仿真代码如下:
`timescale 1ns / 1ps
module tb_single_bit_handshake();reg i_clk_a;
reg i_rst_a;
reg i_signal_a;
reg i_clk_b;
reg i_rst_b;initial begini_clk_a = 0;i_rst_a = 1;i_clk_b = 0;i_rst_b = 1;#150i_rst_a = 0;#100i_rst_b = 0;
endalways#15 i_clk_a = ~i_clk_a;
always#1 i_clk_b = ~i_clk_b;always @(posedge i_clk_a) beginif(i_rst_a == 1'b1)i_signal_a <= 1'b0;else begini_signal_a <= {$random}%2;#30;i_signal_a <= 1'b0;#100;endendsingle_bit_handshake#(.CLKA_FPQ ( 30_000_000 ),.CLKB_FPQ ( 500_000_000 )
)u_single_bit_handshake(.i_clk_a ( i_clk_a ),.i_rst_a ( i_rst_a ),.i_signal_a ( i_signal_a ),.i_clk_b ( i_clk_b ),.i_rst_b ( i_rst_b ),.o_signal_b ( o_signal_b )
);endmodule
仿真结果如下:

由图可以看出,从慢时钟到快时钟依然能够同步成功。值得注意的是,前面这几种单bit跨时钟处理方法不适合连续的触发信号,如果需要同步连续的脉冲信号,则需要考虑使用异步fifo或者ram。
五、多bit数据跨时钟域
对于多bit情况,设计者必须习惯于采用例如双时钟 FIFO 这样的电路(DCFIFO)来存取数据和进行握手。FIFO 逻辑仅使用同步器传输转换两个时钟域之间的控制信号,而数据的读和写则使用双端口的存储器,具体FIFO的使用参考《详解Xilinx Native FIFO的使用以及RST复位的注意事项》。
相关文章:
FPGA跨时钟域处理
文章目录 一、为什么要做跨时钟域处理二、单bit信号从慢时钟到快时钟处理2.1 使用同步寄存器链(打两拍)2.2 仿真代码编写2.3 仿真结果观察 三、单bit信号从快时钟域到慢时钟域处理3.1 使用脉冲展宽3.2 仿真代码编写3.3 仿真结果观察 四、在任意时钟域跨单bit信号4.1 使用握手协…...
【Docker深入浅出】Docker镜像
文章目录 一. Docker镜像简介二. Docker镜像详解1. 镜像和容器的关系2. 镜像通常比较小3. 拉取镜像4. 镜像命名4.1. 镜像仓库服务4.2. 官方和非官方镜像仓库4.3. 镜像的命名和标签 5. 为镜像打多个标签6. 过滤镜像内容6.1. 虚空镜像6.2. 删除虚空镜像6.3. 过滤器与格式化输出 7…...
“LOCAL_LISTENER”参数导致业务无法连接数据库,文末附Oracle连接故障检查监听的排查流程
1. 背景及问题 今天在Oracle BCV技术[1]做数据同步,建立生产库的测试库,需要DBA配合同步前后的停库和起库。在同步完起库后,有部门反应同步好的测试库连接不上去。 2. 问题排查 以我当前的知识储备,能想到的可能就是以下几点进…...
Vmware虚拟机接入物理机路由器网络
网络适配器增加至两个,一个选NAT, 另一个选host-only,再加一个桥接,不勾选使用物理网卡,然后重启即可!...
yolov8旋转框+关键点检测
一、Yolov8obb_kpt -----------------------------------现已在v8官方库上更新旋转框分割算法和旋转框关键点检测算法-------------------------- ------------------------------------------- https://github.com/yzqxy/ultralytics-obb_segment---------------------------…...
Qt-QWidget的windowTitle属性(13)
目录 描述 相关API 使用观察 描述 这个我们之前用过很多次了,就不再赘述了,简单说就是可以给那个边框设置标题,但是这里有一个小细节需要我们注意,就是谁的窗口谁设置 相关API 使用观察 我们这样写的话会发现一个问题&#x…...
RCE编码绕过--php://filter妙用
目录 代码 如何绕过 payload构造 代码 <?php $content <?php exit; ?>; $content . $_POST[txt]; file_put_contents($_POST[filename],$content); 当你想要输入代码的时候前面会有<?php exit;?>;,代码没有办法执行下去,所以…...
FactoryBean 与 BeanFactory
首先从字面理解: FactoryBean -->工厂Bean; BeanFactory -->Bean工厂。 即: FacttoryBean 是一个bean, BeanFactory 是bean的工厂。 使用: 1、BeanFactory: 提供获取bean的API。 2、FactoryBean: p…...
【迅为RK3568开发板】OpenHarmony学习开发系列教程(第2期 南向基础篇一)
P1P1_搭建Ubuntu开发环境-8:23 P2P2_获取OpenHarmony源码-10:21 P3P3_初次编译OpenHarmony源码-7:11 P4P4_OpenHarmony镜像简介以及烧写工具配置-9:18 P5P5_优化开发流程-搭建windows开发环境-5:34 P6P6_优化开发流程-搭建ubuntu开发环境-2:09 P7P7_优化开发流程-配置远程访问环…...
编程修炼之Hibernate--- springboot启动初始化ddl过程与如何自定义修改 table 字段长度
文章目录 springboot启动初始化ddl过程如何自定义修改 table springboot启动初始化ddl过程 跟踪Springboot整合hibernate的启动代码: SessionFactoryImpl 的初始化里做了非常多的事情,初始化各种资源,并调用 SchemaManagementToolCoordinat…...
TOMCAT入门到精通
目录 一 WEB技术 1.1 HTTP协议和B/S 结构 1.2 前端三大核心技术 1.2.1 HTML 1.2.2 CSS(Cascading Style Sheets)层叠样式表 1.2.3 JavaScript 二 WEB框架 2.2后台应用架构 2.2.1单体架构 2.2.2微服务 2.2.3单体架构和微服务比较 三 tomcat的…...
Android笔试面试题AI答之Kotlin(18)
文章目录 86. 阐述Kotlin中性能优化之局部函数 ?局部函数的优点间接的性能优化注意事项 87. 简述Kotlin中性能优化之数组使用 ?1. 选择合适的数组类型2. 避免不必要的数组创建3. 优化数组访问4. 合理使用数组遍历方式5. 利用Kotlin的集合操作API6. 注意数…...
Linux基础知识学习(五)
1. 用户组管理 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理(开发、测试、运维、root)。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户…...
股票买卖的思路与代码
题目 1302:股票买卖 时间限制: 1000 ms 内存限制: 65536 KB 提交数:8660 通过数: 4290 【题目描述】 最近越来越多的人都投身股市,阿福也有点心动了。谨记着“股市有风险,入市需谨慎”,阿福决定先来研究一下简化版的股…...
Eureka Server与Eureka Client详解:服务注册与发现的交互机制
Eureka Server与Eureka Client详解:服务注册与发现的交互机制 Eureka 是 Netflix 开源的一个服务发现框架,它是 Spring Cloud 微服务架构中的核心组件之一。Eureka 主要由两个关键组件构成:Eureka Server 和 Eureka Client。它们之间通过一定…...
php-fpm 如何查看哪个正在执行死循环 并终止
php-fpm 如何查看哪个正在执行死循环 并终止 1. 检查 PHP-FPM 进程的 CPU 使用情况 首先,使用 top 或 htop 命令检查哪个 PHP-FPM 进程占用了大量的 CPU 资源。这个进程很可能是在死循环中。 top -c在 top 命令输出中,按 P 键可以按 CPU 使用率排序。…...
电脑硬盘坏了怎么恢复数据?
在数字化时代,电脑硬盘作为存储核心,承载着我们的工作文档、学习资料、家庭照片以及无数珍贵的回忆。然而,硬盘作为机械设备,也有其寿命和脆弱性,一旦出现故障,数据恢复便成为了一个紧迫而棘手的问题。本文…...
cdga|某大型企业数据治理的成功转型:构建数据驱动的竞争力新引擎
在当今这个数据爆炸的时代,数据已成为企业最宝贵的资产之一,其有效管理和利用直接关系到企业的核心竞争力。某大型企业,作为行业内的领军企业,面对海量数据带来的机遇与挑战,果断启动了一项全面而深入的数据治理项目&a…...
C#使用 ModeBusTCP读取汇川Easy521PLC
Modbus TCP是一种基于以太网TCP/IP的Modbus协议变种,它允许Modbus协议在以太网网络上运行,使得设备之间可以通过IP网络交换数据。Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准,广泛应用于工业自动化领域。 #regio…...
PostgreSQL的postgres主进程
PostgreSQL的postgres主进程 在PostgreSQL数据库系统中,主要的后台进程各司其职,保证数据库的高效运行。其中,主进程postgres(也称为Postmaster)是整个数据库的核心,它负责管理和协调所有其他后台进程&…...
AI“龙虾热”背后:机遇与挑战并存
2026年,代号OpenClaw的AI智能体“龙虾”迅速引爆全球。它不仅能对话问答,还能独立完成多项任务。众多厂商跟进推出对标产品,产业链全面扩张,但背后也存在诸多问题。热潮背后的三重驱动“龙虾热”表层是春节AI红包大战流量普及与大…...
基于RIME-CNN-LSSVM回归模型的优化与预测应用——以MATLAB环境为例
RIME-CNN-LSSVM回归 基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测(可以更换为分类/单、多变量时序预测/回归,前私我),Matlab代码,可直接运行,适合小白新手 程序已经调试好,无需更改…...
美团天天神券自动化脚本终极指南:告别手动抢券,每月轻松省下200元
美团天天神券自动化脚本终极指南:告别手动抢券,每月轻松省下200元 【免费下载链接】meituan-shenquan 美团 天天神券 地区活动 自动化脚本 项目地址: https://gitcode.com/gh_mirrors/me/meituan-shenquan 你是否经常在11点、17点、21点这三个关键…...
单台三相模块化多电平(MMC)小信号建模之旅
单台三相模块化多电平(mmc)小信号建模 内含功率外环、环流抑制、电流内环、PLL等控制部分完整建模在电力电子领域,三相模块化多电平(MMC)变换器因其诸多优点而备受关注。今天咱就唠唠单台MMC的小信号建模,这…...
【Spring 面试突击 · 03】大厂高频面试题:从IoC容器底层原理到Spring Boot自动配置解析
目录 一、Spring Boot如何启动Tomcat? 二、Spring Boot配置文件加载顺序 三、MyBatis的优缺点 四、Hibernate与MyBatis的区别 五、Spring Context模块的理解 六、什么是Spring依赖注入? 七、什么是Spring Bean? 八、Spring AOP与Aspec…...
springboot-vue+nodejs大学生社团管理系统
目录技术栈选择系统模块划分开发阶段安排部署与优化测试重点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术栈选择 后端采用Spring Boot框架,提供RESTful API接口,处理业务逻辑与数据库交互。 前端…...
RTX3090也能跑!Qwen2.5-Omni本地部署避坑指南(含vLLM配置)
RTX3090也能跑!Qwen2.5-Omni本地部署避坑指南(含vLLM配置) 当消费级显卡遇上多模态大模型,总会碰撞出令人惊喜的火花。Qwen2.5-Omni作为当前最热门的开源多模态模型之一,其7B版本在RTX3090这类24GB显存的显卡上完全具备…...
PLSduino:嵌入式平台轻量级偏最小二乘建模库
1. PLSduino:面向嵌入式平台的偏最小二乘建模与预测库1.1 技术定位与工程价值PLSduino 是一个专为资源受限嵌入式平台(Arduino Uno/Nano/Leonardo、ESP32 等)设计的轻量化偏最小二乘(Partial Least Squares, PLS)算法实…...
Qwen3-32B-Chat模型微调指南:提升OpenClaw任务执行准确率
Qwen3-32B-Chat模型微调指南:提升OpenClaw任务执行准确率 1. 为什么需要微调Qwen3-32B-Chat模型? 在使用OpenClaw进行自动化任务时,我发现某些特定场景下的任务执行准确率始终不理想。比如截图识别文字时,模型经常混淆相似字符&…...
OpenClaw技能扩展:Qwen3.5-9B加持下的Markdown文章自动发布
OpenClaw技能扩展:Qwen3.5-9B加持下的Markdown文章自动发布 1. 从手动到自动的内容发布革命 作为一个技术博客作者,我每天最耗时的不是写作本身,而是反复复制粘贴内容到各个平台。上周尝试用OpenClawQwen3.5-9B实现公众号自动发布时&#x…...
