Vivado 综合约束实用命令(更新中……)

news2025/1/10 17:04:55

引言

本文记录一些用于 Vivado 综合约束的实用命令,欢迎补充~

本文会适当结合一些特定设计进行解释,并结合相关工程进行具体的综合实现分析,不只是理论知识还有实际操作。

演示使用的Vivado 版本:2018.3

FPGA芯片型号:xc7a35tfgg484-2

本篇博文,建议在电脑端网页/pad上查看~


综合阶段

综合设置

综合设置的打开方式:

注意:凡是出现在综合设置区的设置均为 全局设置 ,即对设计工程中的所有模块都有效。

-flatten_hierarchy

解释说明

对于此设置项,Vivado给出 3 个可选项:full、none、rebuilt(默认)

那么此设置选项是什么意思呢?

flatten:打平、压平的意思

hierarchy:层次化的意思

连起来,此设置项表示将工程中的设计模块之间的层次打平(主要在LUT映射期间),是不同模块之间的层次化边界变得模糊,这有利于工具对我们写的RTL代码进行最大程度的优化。

对于此设置项的不同取值,在这里做简单解释:

取值

含义

full

将原始设计打平,只保留顶层设计,执行边界优化

none

完全保留原始设计的层次,不执行边界优化

rebuilt

将原始设计打平,执行边界优化,将网表文件按照原始设计层次显示,故与原始设计层次相同

如果希望某个模块的层次优化策略与 -flatten_hierarchy中选择的值不同,可以使用综合属性中的 KEEP_HIERARCHY 其仅可在RTL代码中使用,优先级高于 -flatten_hierarchy 中的设置值。KEEP_HIERARCHY 指保留层级结构,不被优化。

KEEP_HIERARCHY 的 使用方法(Verilog HDL ,示例):
(* KEEP_HIERARCHY = "yes" *) module UART_TX_MDL( );

🔶对于-flatten_hierarchy ,通常保持默认值 rebuilt 即可。使用 rebuilt 的益处在于,使用内嵌的逻辑分析仪(ILA时),可以快速地根据层级找到待观测信号。

🔷KEEP_HIERARCHY 的优先级高于 -flatten_hierarchy ,可根据需要对某些层次设置此属性。

设计实践

此处我想用一个运算模块来试验-flatten_hierarchy 在不同设置特性下综合的结果,同时也验证 KEEP_HIERARCHY 的设置功能。

顶层模块实现:Y = (A + B) * C - D;其中操作数 A B C D 均为有符号 16位数据;

设计源码
加法模块
// | ============================== 有符号加法运算模块 ==============================
// | 作者:Xu Y. B.(CSDN 用户名:在路上,正出发)
// | 时间:2023-01-05
// | 功能:实现同位宽的两个有符号数相加
// | ================================================================================


`timescale 1ns / 1ps
module SIGNED_ADD_MDL #(
// 模块参数声明
parameter                 P_OPR_DATA_WIDTH         =        32'd16
)(
// 输入输出端口声明
input                                                     I_OPR_CLK,
input                                                     I_OPR_RSTN,
input                     [P_OPR_DATA_WIDTH-1:0]            I_OPR_DATA_A,
input                     [P_OPR_DATA_WIDTH-1:0]            I_OPR_DATA_B,
input                                                     I_OPR_DATA_VAL,
output reg                 [P_OPR_DATA_WIDTH:0]            O_ADD_RES,
output reg                                                O_ADD_RES_VAL
    );

always @ (posedge I_OPR_CLK)
begin
    if(~I_OPR_RSTN)
    begin
        O_ADD_RES <= {(P_OPR_DATA_WIDTH+1){1'b0}};
        O_ADD_RES_VAL <= 1'b0;
    end
    else
    begin
        if(I_OPR_DATA_VAL)
        begin
            O_ADD_RES <= {I_OPR_DATA_A[P_OPR_DATA_WIDTH-1],I_OPR_DATA_A} + {I_OPR_DATA_B[P_OPR_DATA_WIDTH-1],I_OPR_DATA_B};
            O_ADD_RES_VAL <= I_OPR_DATA_VAL;    
        end
        else
        begin
            O_ADD_RES <= {(P_OPR_DATA_WIDTH+1){1'b0}};
            O_ADD_RES_VAL <= 1'b0;    
        end
    end
end
endmodule
减法模块
// | ============================== 有符号减法运算模块 ==============================
// | 作者:Xu Y. B.(CSDN 用户名:在路上,正出发)
// | 时间:2023-01-05
// | 功能:实现同位宽的两个有符号数相减
// | ================================================================================


`timescale 1ns / 1ps
module SIGNED_SUB_MDL #(
// 模块参数声明
parameter                 P_OPR_DATA_WIDTH         =        32'd16
)(
// 输入输出端口声明
input                                                     I_OPR_CLK,
input                                                     I_OPR_RSTN,
input                     [P_OPR_DATA_WIDTH-1:0]            I_OPR_DATA_A,
input                     [P_OPR_DATA_WIDTH-1:0]            I_OPR_DATA_B,
input                                                     I_OPR_DATA_VAL,
output reg                 [P_OPR_DATA_WIDTH:0]            O_SUB_RES,
output reg                                                O_SUB_RES_VAL
    );

always @ (posedge I_OPR_CLK)
begin
    if(~I_OPR_RSTN)
    begin
        O_SUB_RES <= {(P_OPR_DATA_WIDTH+1){1'b0}};
        O_SUB_RES_VAL <= 1'b0;
    end
    else
    begin
        if(I_OPR_DATA_VAL)
        begin
            O_SUB_RES <= {I_OPR_DATA_A[P_OPR_DATA_WIDTH-1],I_OPR_DATA_A} - {I_OPR_DATA_B[P_OPR_DATA_WIDTH-1],I_OPR_DATA_B};
            O_SUB_RES_VAL <= I_OPR_DATA_VAL;    
        end
        else
        begin
            O_SUB_RES <= {(P_OPR_DATA_WIDTH+1){1'b0}};
            O_SUB_RES_VAL <= 1'b0;    
        end
    end
end
endmodule
乘法模块
// | ============================== 有符号乘法运算模块 ==============================
// | 作者:Xu Y. B.(CSDN 用户名:在路上,正出发)
// | 时间:2023-01-05
// | 功能:实现不同位宽的两个有符号数相乘
// | ================================================================================


`timescale 1ns / 1ps
module SIGNED_MULT_MDL #(
// 模块参数声明
parameter                 P_OPR_DATA_WIDTH_A         =        32'd16,
parameter                 P_OPR_DATA_WIDTH_B         =        32'd16
)(
// 输入输出端口声明
input                                                     I_OPR_CLK,
input                                                     I_OPR_RSTN,
input                     [P_OPR_DATA_WIDTH_A-1:0]        I_OPR_DATA_A,
input                     [P_OPR_DATA_WIDTH_B-1:0]        I_OPR_DATA_B,
input                                                     I_OPR_DATA_VAL,
output reg [P_OPR_DATA_WIDTH_A+P_OPR_DATA_WIDTH_B-1:0]    O_MULT_RES,
output reg                                                O_MULT_RES_VAL
    );

always @ (posedge I_OPR_CLK)
begin
    if(~I_OPR_RSTN)
    begin
        O_MULT_RES <= {(P_OPR_DATA_WIDTH_A+P_OPR_DATA_WIDTH_B){1'b0}};
        O_MULT_RES_VAL <= 1'b0;
    end
    else
    begin
        if(I_OPR_DATA_VAL)
        begin
            O_MULT_RES <= {{(P_OPR_DATA_WIDTH_B){I_OPR_DATA_A[P_OPR_DATA_WIDTH_A-1]}},I_OPR_DATA_A} * {{(P_OPR_DATA_WIDTH_A){I_OPR_DATA_B[P_OPR_DATA_WIDTH_B-1]}},I_OPR_DATA_B};
            O_MULT_RES_VAL <= I_OPR_DATA_VAL;    
        end
        else
        begin
            O_MULT_RES <= {(P_OPR_DATA_WIDTH_A+P_OPR_DATA_WIDTH_B){1'b0}};
            O_MULT_RES_VAL <= 1'b0;    
        end
    end
end
endmodule
顶层模块
// | ============================== 有符号运算测试顶层模块 ==============================
// | 作者:Xu Y. B.(CSDN 用户名:在路上,正出发)
// | 时间:2023-01-05
// | 功能:实现有符号数混合运算 (A+B)*C-D
// | ====================================================================================


`timescale 1ns / 1ps
module SIGNED_CAL_TOP_MDL(
// 输入输出端口声明
input                                                     I_OPR_CLK,
input                                                     I_OPR_RSTN,

input         [15:0]                                        I_OPR_DATA_A,
input                                                     I_OPR_VAL_A,
input         [15:0]                                        I_OPR_DATA_B,
input                                                     I_OPR_VAL_B,
input         [15:0]                                        I_OPR_DATA_C,
input                                                     I_OPR_VAL_C,
input         [15:0]                                        I_OPR_DATA_D,
input                                                     I_OPR_VAL_D,

output         [33:0]                                        O_OPR_RES,
output                                                     O_OPR_RES_VAL
    );
wire         [16:0]                                        W_ADD_RES;
wire                                                     W_ADD_RES_VAL;
reg         [15:0]                                        R_I_OPR_DATA_C;
reg                                                     R_I_OPR_VAL_C;
wire         [32:0]                                        W_MULT_RES;
wire                                                     W_MULT_RES_VAL;
reg         [15:0]                                        R_I_OPR_DATA_D[1:0];
reg         [1:0]                                        R_I_OPR_VAL_D;

always @ (posedge I_OPR_CLK)
begin
    if(~I_OPR_RSTN)
    begin
        R_I_OPR_DATA_C <= 16'd0;
        R_I_OPR_VAL_C  <= 1'b0;
        R_I_OPR_DATA_D[0] <= 16'd0;
        R_I_OPR_DATA_D[1] <= 16'd0;
        R_I_OPR_VAL_D <= 2'b0;
    end
    else
    begin
        R_I_OPR_DATA_C <= I_OPR_DATA_C;
        R_I_OPR_VAL_C  <= I_OPR_VAL_C;
        R_I_OPR_DATA_D[0] <= I_OPR_DATA_D;
        R_I_OPR_DATA_D[1] <= R_I_OPR_DATA_D[0];
        R_I_OPR_VAL_D <= {R_I_OPR_VAL_D[0],I_OPR_VAL_D};
    end
end
SIGNED_ADD_MDL #(
        .P_OPR_DATA_WIDTH(32'd16)
    ) INST_SIGNED_ADD_MDL (
        .I_OPR_CLK      (I_OPR_CLK),
        .I_OPR_RSTN     (I_OPR_RSTN),
        .I_OPR_DATA_A   (I_OPR_DATA_A),
        .I_OPR_DATA_B   (I_OPR_DATA_B),
        .I_OPR_DATA_VAL (I_OPR_VAL_A & I_OPR_VAL_B),
        .O_ADD_RES      (W_ADD_RES),
        .O_ADD_RES_VAL  (W_ADD_RES_VAL)
    );
SIGNED_SUB_MDL #(
        .P_OPR_DATA_WIDTH(32'd33)
    ) INST_SIGNED_SUB_MDL (
        .I_OPR_CLK      (I_OPR_CLK),
        .I_OPR_RSTN     (I_OPR_RSTN),
        .I_OPR_DATA_A   (W_MULT_RES),
        .I_OPR_DATA_B   ({{17{R_I_OPR_DATA_D[1][15]}},R_I_OPR_DATA_D[1]}),
        .I_OPR_DATA_VAL (R_I_OPR_VAL_D[1] & W_MULT_RES_VAL),
        .O_SUB_RES      (O_OPR_RES),
        .O_SUB_RES_VAL  (O_OPR_RES_VAL)
    );
SIGNED_MULT_MDL #(
        .P_OPR_DATA_WIDTH_A(32'd17),
        .P_OPR_DATA_WIDTH_B(32'd16)
    ) INST_SIGNED_MULT_MDL (
        .I_OPR_CLK      (I_OPR_CLK),
        .I_OPR_RSTN     (I_OPR_RSTN),
        .I_OPR_DATA_A   (W_ADD_RES),
        .I_OPR_DATA_B   (R_I_OPR_DATA_C),
        .I_OPR_DATA_VAL (W_ADD_RES_VAL & R_I_OPR_VAL_C),
        .O_MULT_RES     (W_MULT_RES),
        .O_MULT_RES_VAL (W_MULT_RES_VAL)
    );


endmodule
仿真文件

编写测试文件:

`timescale 1ns / 1ps

module TB_SIGNED_CAL_TOP_MDL();
// 输入输出端口声明
reg                                                     I_OPR_CLK;
reg                                                     I_OPR_RSTN;

reg         [15:0]                                        I_OPR_DATA_A;
reg                                                     I_OPR_VAL_A;
reg         [15:0]                                        I_OPR_DATA_B;
reg                                                     I_OPR_VAL_B;
reg         [15:0]                                        I_OPR_DATA_C;
reg                                                     I_OPR_VAL_C;
reg         [15:0]                                        I_OPR_DATA_D;
reg                                                     I_OPR_VAL_D;

wire         [33:0]                                        O_OPR_RES;
wire                                                     O_OPR_RES_VAL;

initial I_OPR_CLK = 1'b0;
always #10 I_OPR_CLK = ~I_OPR_CLK;

initial
begin
    I_OPR_RSTN = 1'b0;
    I_OPR_DATA_A = 16'd0;
    I_OPR_VAL_A  = 1'b0;
    I_OPR_DATA_B = 16'd0;
    I_OPR_VAL_B  = 1'b0;
    I_OPR_DATA_C = 16'd0;
    I_OPR_VAL_C  = 1'b0;
    I_OPR_DATA_D = 16'd0;
    I_OPR_VAL_D  = 1'b0;

    #204;
    I_OPR_RSTN = 1;
    #100;
    TASK_SIM(16'd100,-16'd120,-16'd200,16'd390);
    TASK_SIM(16'd10,-16'd1200,-16'd200,16'd390);
    TASK_SIM(16'd50,-16'd120,-16'd200,16'd3900);
    TASK_SIM(16'd1000,-16'd12,-16'd200,16'd390);
    TASK_SIM(16'd120,-16'd120,-16'd210,16'd390);
    TASK_SIM(16'd180,-16'd120,-16'd250,16'd390);
    $finish;
end
SIGNED_CAL_TOP_MDL INST_SIGNED_CAL_TOP_MDL
    (
        .I_OPR_CLK     (I_OPR_CLK),
        .I_OPR_RSTN    (I_OPR_RSTN),
        .I_OPR_DATA_A  (I_OPR_DATA_A),
        .I_OPR_VAL_A   (I_OPR_VAL_A),
        .I_OPR_DATA_B  (I_OPR_DATA_B),
        .I_OPR_VAL_B   (I_OPR_VAL_B),
        .I_OPR_DATA_C  (I_OPR_DATA_C),
        .I_OPR_VAL_C   (I_OPR_VAL_C),
        .I_OPR_DATA_D  (I_OPR_DATA_D),
        .I_OPR_VAL_D   (I_OPR_VAL_D),
        .O_OPR_RES     (O_OPR_RES),
        .O_OPR_RES_VAL (O_OPR_RES_VAL)
    );
task TASK_SIM;
    input [15:0]    I_A;
    input [15:0]    I_B;
    input [15:0]    I_C;
    input [15:0]    I_D;
    
    begin
        @(posedge I_OPR_CLK)
        I_OPR_DATA_A <= I_A;
        I_OPR_VAL_A  <= 1'b1;
        I_OPR_DATA_B <= I_B;
        I_OPR_VAL_B  <= 1'b1;
        I_OPR_DATA_C <= I_C;
        I_OPR_VAL_C  <= 1'b1;
        I_OPR_DATA_D <= I_D;
        I_OPR_VAL_D  <= 1'b1;
        @(posedge I_OPR_CLK)
        I_OPR_DATA_A <= 16'd0;
        I_OPR_VAL_A  <= 1'b0;
        I_OPR_DATA_B <= 16'd0;
        I_OPR_VAL_B  <= 1'b0;
        I_OPR_DATA_C <= 16'd0;
        I_OPR_VAL_C  <= 1'b0;
        I_OPR_DATA_D <= 16'd0;
        I_OPR_VAL_D  <= 1'b0;
        #120;
    end
    
endtask 
endmodule
仿真结果

仿真波形:

综合分析

仿真发现功能准确后,对RTL代码进行综合:

对于-flatten_hierarchy执行不同的综合策略选项:

如何切换不同策略?
点击 Apply 以后会跳出如下对话框:

我的建议是选择 No,否则每切换一次综合策略就会生成一个新的综合文件夹,导致垃圾文件堆积。

rebuilt

none

full
通过上面对同一RTL源代码,进行不同策略的综合分析,当 -flatten_hierarchy的综合策略为full时,会将原本模块与模块之间的界限打破,从综合的结果来看,仅剩一个DSP48E1。而其余两个均在网表中保留了原本RTL设计中的模块层次界限。
(*KEEP_HIERARCHY = "yes"*)

在 -flatten_hierarchy的综合策略为full的情况下,使用综合属性 (*KEEP_HIERARCHY = "yes"*) 对加法运算模块进行约束,综合后的网表结果:

可以看到加法模块的层级仍然保留,其他模块的层级不见了,乘法和减法用DSP48E1代替了。

总结

🔶对于-flatten_hierarchy ,通常保持默认值 rebuilt 即可。使用 rebuilt 的益处在于,使用内嵌的逻辑分析仪(ILA时),可以快速地根据层级找到待观测信号。

🔷KEEP_HIERARCHY 的优先级高于 -flatten_hierarchy ,可根据需要对某些层次设置此属性。对于此属性在 Verilog HDL 中的使用再补充两点:

  1. (*KEEP_HIERARCHY = "yes"*) 可以约束在 设计文件 中,类似下图这种,当约束在设计文件中时,该模块在任何一个地方例化,都会保持原本的层级结构

  1. (*KEEP_HIERARCHY = "yes"*) 也可以约束在 模块例化 时,类似下图这种,当约束在模块例化处时,仅对约束的例化模块有效。

上述代码的综合结果:

-control_set_opt_threshold

解释说明

对于此设置项,Vivado给出18个可选项:0~16,auto(默认)

官方的说法是:

Threshold for synchronous control set optimization to lower number of control sets .The higher the number, the more control set optimization will be performed and fewer control sets will result.To disable control set optimization completely, set to 0.
百度翻译的结果:
用于同步控制集优化的阈值,以减少控制集的数量。数量越高,将执行的控制集优化越多,产生的控制集越少。若要完全禁用控制集优化,请设置为0。

设计实践

总结

-no_lc

解释说明

设计实践

总结

-keep_equivalent_registers

解释说明

设计实践

总结

-resource_sharing

解释说明

设计实践

总结

-gated_clock_conversion

解释说明

设计实践

总结

-fanout_limit

解释说明

设计实践

总结

-shreg_min_size、-no_srlextract

解释说明

设计实践

总结

-fsm_extraction

解释说明

设计实践

总结

综合属性

ASYNC_REG

解释说明

设计实践

总结

MAX_FANOUT

解释说明

设计实践

总结

SRL_STYLE、SHREG_EXTRACT

解释说明

设计实践

总结

USE_DSP

解释说明

设计实践

总结

RAM_STYLE、ROM_STYLE

解释说明

设计实践

总结

EXTRACT_ENABLE、EXTRACT_RESET

解释说明

设计实践

总结

MARK_DEBUG

解释说明

设计实践

总结

实现阶段

设计分析相关

查看逻辑级数 tcl 脚本命令:

report_design_analysis -logic_level_distribution -logic_level_dist_paths 5000 -name design_analysis_prePlace

参考声明

【1】高亚军,Vivado 从此开始(进阶篇).北京:电子工业出版社. 2020.1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java+SpringBoot+vue+elementui药品商城采购系统详细设计实现

基于JavaSpringBootvueelementui药品商城采购系统详细设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文…

【vue2】常见指令的用法与示例

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;vue指令的声明与使用&#xff08;v-text、v-html、v-on、v-bind、v-for、v-model、v-if、…

C++继承与类的静态成员

什么是继承&#xff1f; 继承(inheritance)机制是面向对象程序设计中使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能。这样产生的新类&#xff0c;称派生类&#xff08;或子类&#xff09;&#xff0c;被继承的类…

【多标签文本分类】《基于标签语义注意力的多标签文本分类》

阅读摘要&#xff1a;   为了建立标签的语义信息和文档的内容信息之间的联系并加以利用&#xff0c;文章提出了一种基于标签语义注意力的多标签文本分类(LAbel Semantic Attention Multi-label Classification,简称 LASA)方法。 参考文献&#xff1a;   [1] 基于标签语义注…

【nowcoder】笔试强训Day17

目录 一、选择题 二、编程题 2.1杨辉三角的变形 2.2计算某字符出现次数 一、选择题 1.一个查询语句执行后显示的结果为&#xff1a; 1班 80 2班 75 3班 NULL &#xff0c;则最有可能的查询语句是&#xff08;&#xff09; A.SELECT AVG(成绩) FROM 成绩表 WHERE class<…

WindowManager

1 Window、WindowManager 和 WMS Window 是一个抽象类&#xff0c;具体的实现类为 PhoneWindow&#xff0c;它对 View 进行管理。WindowManager 是一个接口类&#xff0c;继承自接口ViewManager&#xff0c;它是用来管理 Window 的&#xff0c;它的实现类为 WindowManagerImpl…

[Leetcode] 二叉树的深度、平衡二叉树

题目链接&#xff1a;二叉树的最大深度 https://leetcode.cn/problems/maximum-depth-of-binary-tree/submissions/二叉树的最小深度 https://leetcode.cn/problems/minimum-depth-of-binary-tree/平衡二叉树 https://leetcode.cn/problems/balanced-binary-tree1.二叉树的最大…

微信小程序实现上下左右滑动触发联动选项卡、绝对值、事件、parse、stringify、Math、atan、abs、findIndex

文章目录序言1、HTML部分2、JavaScript部分&#xff08;上下左右滑动均触发&#xff09;3、JavaScript部分&#xff08;左右滑动触发&#xff09;4、效果演示序言 最近在写原生微信小程序项目的时候遇到了左右滑动内容更新数据&#xff0c;同时改变tabBar的高亮效果。于是就写了…

B. Camp Schedule(KMPnext数组)

Problem - 1137B - Codeforces 在全国范围内广为人知的春季编程训练营即将开始。因此&#xff0c;所有友好的策展人和教师团队开始组成营地的时间表。经过不断的讨论&#xff0c;他们想出了一个时间表&#xff0c;可以表示为一个二进制字符串&#xff0c;其中第i个符号是 "…

前后端的身份认证

1、Web 开发模式 目前主流的 Web 开发模式有两种&#xff0c;分别是&#xff1a; 基于服务端渲染的传统 Web 开发模式基于前后端分离的新型 Web 开发模式 1.1、服务端渲染的 Web 开发模式 服务端渲染的概念&#xff1a;服务器发送给客户端的 HTML 页面&#xff0c;是在服务器…

【Linux】进程间通信(万字详解) —— 下篇

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…

我的周刊(第073期)

我的信息周刊&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。&#x1f3af; 项目zlib-searcher[1]zlib 开源搜索方案&#xff08;zli…

基于朴素贝叶斯算法的激光雷达点云分类

前言激光雷达技术是一种采集三维数据的、重建三维模型的手段&#xff0c;运用在各个行业&#xff0c;随着激光雷达技术的发展与广泛运用本文采用监督分类中的朴素贝叶斯算法进行地基于激光雷达的地物分类。首先根据点云的几何位置建立邻域范围&#xff0c;借助邻域点的集合计算…

分享98个PHP源码,总有一款适合您

PHP源码 分享98个PHP源码&#xff0c;总有一款适合您 PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1ZNcdj0bLY51UXNoXq8tgFg?pwdwn4b 提取码&#xff1a;wn4b 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0…

ORB-SLAM2 --- LoopClosing::ComputeSim3 函数

目录 1.什么是sim3&#xff0c;为什么要做sim3 2.函数流程 3.code 4.函数解析 4.1 准备工作 4.2 遍历闭环候选帧集&#xff0c;初步筛选出与当前关键帧的匹配特征点数大于20的候选帧集合&#xff0c;并为每一个候选帧构造一个Sim3Solver 4.3 对每一个候选帧用Sim3Sol…

实例分析Linux内存泄漏检测方法

一、mtrace分析内存泄露 mtrace&#xff08;memory trace&#xff09;&#xff0c;是 GNU Glibc 自带的内存问题检测工具&#xff0c;它可以用来协助定位内存泄露问题。它的实现源码在glibc源码的malloc目录下&#xff0c;其基本设计原理为设计一个函数 void mtrace ()&#x…

解决Tinkphp的success跳转“使用路由别名后模块和路由器访问不了”问题

遇到的问题&#xff1a;我的thinkphp5网站添加了以下路由别名&#xff1a;Route::alias([ index>index/index, ]);使用http://域名/Index/user/password.html访问正常但使用http://域名/index/user/password.html就访问失败使用$this->success(修改密码成功);进行提示跳转…

Java 链表与LinkedList

链表的组合形式 ①有头结点、无头结点 ②单向链表、双向链表 ③循环链表、非循环链表 根据自由组合&#xff0c;可以得到8种不同形式的链表&#xff0c;那么在刷题种常碰到的是不带有头结点的单向非循环链表和不带头结点的双向非循环链表。 模拟实现不带头结点的单向非循环链表…

Notes可以手动签名了

大家好&#xff0c;才是真的好。 Notes/Domino 12.0.2陆续有人下载测试了&#xff0c;关于Notes的新功能中&#xff0c;我们上一篇也介绍到了可以手动签名。 字面上的意思&#xff0c;就是你可以调出手写板&#xff0c;然后使用触屏或鼠标来进行签名&#xff0c;可以在Nomad …

javaEE 初阶 — 定时器

文章目录定时器1 什么是定时器2 标准库中定时器3 实现一个定时器3.1 实现的思路3.2 为什么要使用优先级队列来保存任务3.3 开始实现定时器 1 什么是定时器 定时器 类似于一个 “闹钟”&#xff0c;达到一个设定的时间之后&#xff0c;就执行某个指定好的代码。 定时器是一种实…