FPGA 高速接口Aurora8B/10B 协议详解与仿真
FPGA 高速接口Aurora8B/10B 协议详解与IP仿真
1 摘要
Aurora 8B/10B 是一种用于高速串行通信的协议,通常用于 FPGA 设计和其他数字通信应用。即一种编码方案,旨在在传输数据时提供可靠性、时钟恢复和错误检测。主要用于在点对点串行链路间移动数据的可扩展轻量级链路层协议,为板对板、芯片对芯片以及一些单向链接提供低成本低资源的解决方案。
2 Aurora8B/10B协议IP原理及适用场景及
2.1 IP核的结构原理
Aurora 8B/10B IP 核心框如图

①Lane Logic :每一个驱动一个GT(GTP,GTX,GTH)收发器,并且初始化对应的GT收发器和处理控制字符的编码和解码以及错误检测。
②Global Logic:执行通道初始化的绑定和验证阶段。在运行过程中,该模块生成 Aurora 协议所需的随机空闲字符,并监控所有通道逻辑模块是否存在错误。
③RX User Interface:AXI4-Stream RX 用户接口将数据从通道移动到应用程序并执行流控制功能。
④TX User Interface:AXI4-Stream TX 用户界面将数据从应用程序移动到通道并执行流控制 TX 功能。标准时钟补偿模块嵌入在内核中。该模块控制时钟补偿 (CC) 字符的定期传输
2.2 适用场景
Aurora 8B/10B协议常用于芯片与芯片之间的通信,特别是在FPGA与FPGA之间的通信中。它可以通过一个或多个收发器在设备之间传输数据,支持全双工和单工模式。最多可实现16个收发器,吞吐量可从480 Mb/s扩展到84.48 Gb/s。Aurora 8B/10B IP核是全双工模式,数据通过多条Lane发送到另一个Aurora IP核,并通过用户接口将接收到的数据发送给用户。

1)、芯片到芯片的链路:
替换高速串行连接的芯片之间的并联连接可以显着减少 PCB 上所需的迹线和层数。 核心提供了使用 GTP,GTX 和 GTH 收发器所需的逻辑,FPGA 资源成本最低。
2)、板对板和背板连接:
IP CORE 使用标准的 8B / 10B 编码,使其与现有的电缆和背板硬件标准兼容。 Aurora 8B / 10B内核可以在线速率和通道宽度上进行缩放,以便在新的高性能系统中使用便宜的传统硬件。
3)、单向连接(单向):
Aurora 协议提供了替代方法执行单向通道初始化,使 GTP,GTX 和 GTH 收发器在没有反向通道的情况下使用,并降低由于未使用的全双工资源而造成的成本。
3 信号定义
3.1 时钟
| 信号 | 源 | 信号描述 |
| ref_clk | 时钟源 | GT的外部时钟 |
| INIT CLK | 时钟源 | 全局复位,低电平有效 |
| DRP CLK | 时钟源 | DRP时钟,动态重配置时钟 |
| user_clk_out | 时钟源 | 用户传输的数据钟及逻辑时钟域 |
3.2 状态信号
Aurora IP还提供了一系列的指示接口信号

| 信号 | 方向 | 信号描述 |
| loopback | 输入 | 回环模式,实际使用一般接到低 |
| power down | 输入 | 掉电信号,GT会进入非工作、低功耗的模式 |
| lane_up | 输出 | 当对应的Lane初始化完成指示信号 |
| hard_err | 输出 | 硬件类错误指示 |
| soft_er | 输出 | 软件类错误指示 |
| frame_err | 输出 | 帧类错误指示 |
3.3 用户信号
用户接口完全兼容使用 axi-stream协议,我们最关注的信号主要是:TVALID、TREADY、TLAST、TDATA。

发送端接口主要使用的信号
| 信号 | 方向 | 信号描述 |
| s_axi_tx_tdata[(8n–1):0] | 输入 | 用户要发送的数据 |
| s_axi_tx_tready | 输出 | 准备接收数据指示信号 |
| s_axi_tx_tlast | 输入 | 发送的最后一个数据指示信号 |
| s_axi_tx_tkeep[(n–1):0] | 输入 | 指示发送的最后一个数据的有效字节 |
| s_axi_tx_tvalid | 输入 | 用户发送的数据有效信号 |
接收端接口主要使用的信号
| 信号 | 方向 | 信号描述 |
| m_axi_rx_tdata[8(n–1):0] | 输出 | 接收到的数据 |
| m_axi_rx_tlast | 输出 | 接收的最后一个数据指示信号 |
| m_axi_rx_tkeep[(n–1):0] | 输出 | 指示接收的最后一个数据的有效字节 |
| m_axi_rx_tvalid | 输入 | 指示当前接收的数据有效 |
4 用户数据接口
用户接口主要分为两种
(1)Framing接口(帧传输接口)。在AXI4-Stream的基础上添加了帧头、帧尾等控制信号,使得传输更准确,但是会降低传输效率和使用较多资源

(2)Streaming接口(流传输接口)。基本上就是一个非常简化的AXI4-Stream接口,只有数据有效、握手和数据信号,此种方式传输效率高,但无法保证传输的准确性

4.1 Framing接口
1)帧组成结构
发送子模块将每个接收的用户帧通过TX接口转换为Aurora 8B / 10B帧。 帧开始(SOF)通过在帧开始处添加2字节的SCP代码组来指示。 帧结束(EOF)是通过在帧的末尾添加一个2字节的信道结束通道协议(ECP)码组来确定。 数据不可用时插入空闲代码组。 代码组是8B / 10B编码字节对,所有数据都作为代码对发送,因此具有奇数个字节的用户帧具有称为PAD的控制字符,附加到帧的末尾以填写最终的代码组。 下图显示了具有偶数数据字节的典型Aurora 8B / 10B帧。

2)发送案例
①Simple Data Transfer(简单数据传输)

时序图可知,当valid信号与ready信号握手成功期间传输数据,传输到最后一个数据DATA2时,拉高tlast信号,表明此时传输的是最后一个数据。tkeep信号表示最后一个数据的那些字节是有效的。
②Data Transfer with Pad(奇数字节数据传输)

时序图可知,当valid信号与ready信号握手成功期间传输数据,传输到最后一个数据DATA2时,拉高tlast信号,表明此时传输的是最后一个数据。tkeep信号表示最后一个数据的那些字节是有效的。根据协议要求,Aurora 8B/10B 内核会为字节数为奇数的帧添加一个填充字符。由于此时传输的是奇数个字节,所以最后一个数据中存在无效字节,故tkeep信号的值为N-1。
③Data Transfer with Pause(带有暂停的数据传输)

时序图可知,当valid信号与ready信号握手成功期间传输数据,传输到最后一个数据DATA2时,拉高tlast信号,表明此时传输的是最后一个数据。tkeep信号表示最后一个数据的那些字节是有效的。在握手期间,用户通过拉低valid信号中断了握手,实现了数据发送的暂停(流控)。用户应用程序在传输完前 n 个字节后,会通过断开 s_axi_tx_tvalid 来暂停数据流,转而传输空闲数据。暂停将一直持续到 s_axi_tx_tvalid 失效。
④Data Transfer with Clock Compensation(带时钟补偿的数据传输)

在Aurora 8B/10B 内核发送时钟补偿序列时会自动中断数据传输。时钟补偿序列每 10,000 字节对每个通道会造成 12 字节的开销。
4.2 Streaming接口
相比于 Framing接口Streaming接口用法比较简,使用Framing接口的帧框架使得需要使用keep和last这两个信号来控制帧的长度,而Streaming接口则没有帧框架,使用数据流模式通道,不再关注keep和last这两个信号。在发送端发送数据只要在tvalid信号和tready信号握手成功时就可以发送;而接收端接收数据就只要关注tvalid信号,当tvalid为高时接收的数据有效。
典型的数据发送

典型的数据接收

5 仿真实践
5.1 工程搭建及IP使用
1)使用官方IP生成例程

2)选择共享逻辑

3)生成工程
)
5.2 仿真测试
TestBench代码
`timescale 1 ns / 1 psmodule aurora_8b10b_0_TB;//*************************Parameter Declarations**************************parameter SIM_MAX_TIME = 9500000; //To quit the simulation//125.0MHz GT Reference clock
parameter CLOCKPERIOD_1 = 8.0 ;
parameter CLOCKPERIOD_2 = 8.0 ;
//parameter CLOCKPERIOD_1 = 8.0;
//parameter CLOCKPERIOD_2 = 8.0;
parameter DRP_CLOCKPERIOD = 20.000 ; //GT DRP Clock
parameter INIT_CLOCKPERIOD = 20.0 ; // Board/System Clock//************************Internal Register Declarations*****************************//Freerunning Clock
reg reference_clk_1_n_r;
reg reference_clk_2_n_r;
reg drp_clk_r;
reg init_clk_p;//Global signals
reg gt_reset_in;
reg gsr_r;
reg gts_r;
reg reset_i;//********************************Wire Declarations**********************************//Freerunning Clock
wire reference_clk_1_p_r;
wire reference_clk_2_p_r; wire init_clk_n;
//Dut1//Error Detection Interface
wire hard_err_1_i;
wire soft_err_1_i; //Status
wire channel_up_1_i;
wire lane_up_1_i;//GT Serial I/O
wire rxp_1_i;
wire rxn_1_i; wire txp_1_i;
wire txn_1_i; // Error signals from the Local Link packet checker
wire [0:7] err_count_1_i; //Dut2//Error Detection Interface
wire hard_err_2_i;
wire soft_err_2_i; //Status
wire channel_up_2_i;
wire lane_up_2_i;//GT Serial I/O
wire rxp_2_i;
wire rxn_2_i; wire txp_2_i;
wire txn_2_i; // Error signals from the Local Link packet checker
wire [0:7] err_count_2_i; //*********************************Main Body of Code**********************************//_________________________Serial Connections________________assign rxn_1_i = txn_2_i;assign rxp_1_i = txp_2_i;assign rxn_2_i = txn_1_i;assign rxp_2_i = txp_1_i;//__________________________Global Signals_____________________________//Simultate the global reset that occurs after configuration at the beginning//of the simulation. Note that both GT smart models use the same global signals.assign glbl.GSR = gsr_r;assign glbl.GTS = gts_r;initialbegingts_r = 1'b0; gsr_r = 1'b1;gt_reset_in = 1'b1;#5000;gsr_r = 1'b0;gt_reset_in = 1'b0;repeat(10) @(posedge init_clk_p);gt_reset_in = 1'b1;repeat(10) @(posedge init_clk_p);gt_reset_in = 1'b0;end//____________________________Clocks____________________________initialreference_clk_1_n_r = 1'b0;always #(CLOCKPERIOD_1 / 2) reference_clk_1_n_r = !reference_clk_1_n_r;assign reference_clk_1_p_r = !reference_clk_1_n_r;initialreference_clk_2_n_r = 1'b0;always #(CLOCKPERIOD_2 / 2) reference_clk_2_n_r = !reference_clk_2_n_r;assign reference_clk_2_p_r = !reference_clk_2_n_r;initialdrp_clk_r = 1'b0;always #(DRP_CLOCKPERIOD / 2) drp_clk_r = !drp_clk_r;initialinit_clk_p = 1'b0;always #(INIT_CLOCKPERIOD / 2) init_clk_p = !init_clk_p;assign init_clk_n = !init_clk_p;//____________________________Resets____________________________initialbeginreset_i = 1'b1;#1000 reset_i = 1'b0;end//________________________Instantiate Dut 1 ________________aurora_8b10b_0_exdes example_design_1_i
(// User IO.RESET(reset_i),// Error signals from Aurora .HARD_ERR(hard_err_1_i),.SOFT_ERR(soft_err_1_i),// Status Signals.LANE_UP(lane_up_1_i),.CHANNEL_UP(channel_up_1_i),.INIT_CLK_P(init_clk_p),.INIT_CLK_N(init_clk_n),.DRP_CLK_IN(drp_clk_r), .GT_RESET_IN(gt_reset_in),// Clock Signals.GTXQ0_P(reference_clk_1_p_r),.GTXQ0_N(reference_clk_1_n_r),// GT I/O.RXP(rxp_1_i),.RXN(rxn_1_i),.TXP(txp_1_i),.TXN(txn_1_i),// Error signals from the Local Link packet checker.ERR_COUNT(err_count_1_i)
);//________________________Instantiate Dut 2 ________________aurora_8b10b_0_exdes example_design_2_i
(// User IO.RESET(reset_i),// Error signals from Aurora .HARD_ERR(hard_err_2_i),.SOFT_ERR(soft_err_2_i),// Status Signals.LANE_UP(lane_up_2_i),.CHANNEL_UP(channel_up_2_i),.INIT_CLK_P(init_clk_p),.INIT_CLK_N(init_clk_n),.DRP_CLK_IN(drp_clk_r), .GT_RESET_IN(gt_reset_in),// Clock Signals.GTXQ0_P(reference_clk_2_p_r),.GTXQ0_N(reference_clk_2_n_r),// GT I/O.RXP(rxp_2_i),.RXN(rxn_2_i),.TXP(txp_2_i),.TXN(txn_2_i),// Error signals from the Local Link packet checker.ERR_COUNT(err_count_2_i)
);always @ (posedge channel_up_1_i or posedge channel_up_2_i)
beginif((channel_up_1_i == 1'b1) && (channel_up_2_i == 1'b1)) begin $display("\naurora_8b10b_0_TB : INFO : @Time : %t CHANNEL_UP is asserted in both DUT\n", $time);#5000 $display("\naurora_8b10b_0_TB : INFO : Test Completed Successfully\n");$finish;end
endalways @ (posedge err_count_1_i[7] or posedge err_count_2_i[7])
beginif((err_count_1_i >= 8'b0000_0001) || (err_count_2_i >= 8'b0000_0001)) begin $display("\nAURORA_TB : ERROR : TEST FAIL\n");$display("\nAURORA_TB : INFO : ERR_COUNT1 = %b ERR_COUNT2 = %b\n",err_count_1_i,err_count_2_i);#1000 $display("AURORA_TB : INFO : Exiting from simulation ....\n");$finish;end
end//Abort the simulation when it reaches to max time limit
initial
begin#(SIM_MAX_TIME) $display("\nAURORA_TB : INFO : Reached max. simulation time limit\n");$finish;
endendmodule
5.3 仿真工程结构说明
①support模块(aurora_8b10b_0_support.v):核心,包含了对IP、GT等的例化处理等一系列操作;后续在应用中此部分不需要修改。
②frame_gen( aurora_8b10b_0_FRAME_GEN.v):数据生成模块,采用LFSR的方式生成伪随机序列;后续在我们的应用中此部分可替换成我们的数据输入模块(建议加入FIFO,这样代码的复用性更佳)。
③frame_check(aurora_8b10b_0_FRAME_CHECK.v):数据检验模块,对接受的数据进行检验以验证传输的正确性;后续在应用中此部分可替换成数据检查模块或者删除。
④LL_AXI(aurora_8b10b_0_LL_TO_AXI_EXDES.v):LL总线转AXI总线(据说该例程原本的接口是LL接口,后面Xilinx为了推广AXI总线。
5.4 Aurora 8B/10B IP核 延迟开销
Aurora 8B/10B IP的延迟是由协议引擎(编解码、流水线处理、)和GT收发器的管道延迟引起的。随着用户接口数据宽度的增加,协议引擎的延迟也会增加;GT收发器的延迟取决于所选收发器的功能和属性。在K7器件的仿真实验大约在34个User_clk周期,其他器件请另测试,手册给出V7系列最小37个周期。

5.5 发送和接收数据
1)channel_up信号

2)s_axi_tx_tdata用户发送数据

3)m_axi_rx_tdata用户接收数据

通过仿真当channel_up信号置位拉高时,意味着Aurora 8b/10b IP核成功建立链路通道。s_axi_tx_tready和s_axi_tx_tvalid高有效时,用户发送数据有效,接收数据当m_axi_rx_tvalid有效时,接收端数据有效。在设计使用时需要注意:
①数据: 在用户发送每一帧数据的时候,Aurora8B10都会在数据的开始位置增加2byte的SCP和末尾增加2btye的EOF来表示数据帧的开始和结束标志(如果用户的数据btye数为奇数的话,会为其增加额外的一个PAD byte来使数据为偶数)。所以为了最大传输带宽,用户每次传输的数据byte数最好为偶数。
②时钟补偿: 传输通道每10000 bytes需要进行一次时钟补偿,每次时钟补偿需要发送12 bytes的数据,需要消耗6个或者3个时钟周期开销。
③传输延时:从发送端发送第一个数据开始,到接收端接收到第一个数据结束所消耗的时间,最小的延时为37/41个用户时钟周期,如有对时延有要求。
6 总结
本文介绍了高速接口Aurora8B/10B 协议,通过对协议的接口时序理解及握手机制及一些相关术语的学习,详细了解了高速接口Aurora8B/10B 协议的使用方法。通过FPGA仿真验证了该IP的使用方法和一些主要的关键信号。为使用高速串行接口设计提供基础。后续则继续总结分享FPGA中的一些技术应用,开发不易珍惜每一分原创和劳动成果,同时注意平时开发过程中的经验积累总结。
相关文章:
FPGA 高速接口Aurora8B/10B 协议详解与仿真
FPGA 高速接口Aurora8B/10B 协议详解与IP仿真 1 摘要 Aurora 8B/10B 是一种用于高速串行通信的协议,通常用于 FPGA 设计和其他数字通信应用。即一种编码方案,旨在在传输数据时提供可靠性、时钟恢复和错误检测。主要用于在点对点串行链路间移动数据的可…...
大白话Vue 源码
大白话Vue 源码 整体介绍 Vue 源码就像是一个超厉害的“魔法工具箱”,它能帮咱们轻松地做出各种漂亮又好用的网页。这个工具箱里有好几个关键的“魔法道具”,分别是响应式系统、虚拟 DOM、模板编译、组件系统和生命周期钩子,下面咱一个一个…...
grpc工具使用
工具安装 protoc 访问protoc release,根据系统型号,下载对应版本的protoc工具,并将下载到的可执行文件存放于$path中 安装完成后,可通过protoc --version指令校验是否安装成功 protoc --version # 输出: # libprotoc…...
ESP8266连接网络实时上传数据
要实现这个功能,可以按照以下步骤进行编程。我们将使用Arduino IDE来编写代码,并结合ESP8266的WiFi库、MQTT库以及Web服务器库来实现。 1. 准备工作 硬件:ESP8266开发板、温度传感器(如DS18B20)、显示屏(如OLED)。软件:Arduino IDE、ESP8266库、PubSubClient库(MQTT)…...
【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘
摘要 支持向量机(SVM)是机器学习中的经典算法!本文将深入解析最大间隔分类原理,手撕对偶问题推导过程,并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南,助力你掌握这一核心算法…...
定制化开发的WooCommerce独立站商城更安全
定制化开发的WooCommerce独立站商城在安全性、交易风险控制以及整体用户体验方面有显著优势。以下是定制化开发在这些方面的具体表现: 1. 安全性更高 定制化开发允许开发者从底层架构开始设计和优化,确保网站的安全性。以下是具体表现: (1…...
AORO P9000 PRO三防平板携手RTK高精度定位,电力巡检效率倍增
电网系统覆盖幅员辽阔,每年因设备故障导致的巡检耗时超过百万工日。传统巡检模式受限于定位误差、设备防护不足和作业效率低下三大核心痛点,亟需智能化工具的突破性革新。为了满足这一需求,遨游通讯推出AORO P9000 PRO三防平板,以…...
游戏引擎学习第135天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中,不使用任何现成的游戏引擎或第三方库,而是直接基于 Windows 进行开发,因为 Windows 目前仍然是游戏的标准平台,因此首先在这个环境中进行…...
安全渗透测试的全面解析与实践
引言 随着网络安全威胁的日益增加,企业和组织对自身系统的安全性提出了更高的要求。安全渗透测试(Penetration Testing,简称渗透测试)作为主动发现和修复系统安全漏洞的重要手段,已成为安全防护体系中的关键环节。本文…...
关联封号率降70%!2025最新IP隔离方案实操手册
高效运营安全防护,跨境卖家必看的风险规避指南 跨境账号管理的核心挑战:关联封号风险激增 2024年,随着全球电商平台对账号合规的审查日益严苛,“关联封号”已成为跨境卖家最头疼的问题之一。无论是同一IP登录多账号、员工操作失误…...
【深度学习CV】【图像分类】从CNN(卷积神经网络)、ResNet迁移学习到GPU高效训练优化【案例代码】详解
摘要 本文分类使用的是resNet34,什么不用yolo v8,yolo v10系列,虽然他们也可以分类,因为yolo系列模型不纯粹,里面包含了目标检测的架构,所以分类使用的是resNet 本文详细介绍了三种不同的方法来训练卷积神经网络进行 CIFAR-10 图…...
【Java基础-51.5】字节流与字符流的转换:Java I/O 中的桥梁
在 Java 的 I/O 操作中,字节流和字符流是两种常见的数据处理方式。字节流以字节为单位进行读写,适合处理二进制数据(如图片、音频等);而字符流以字符为单位进行读写,适合处理文本数据。在实际开发中&#x…...
如何设置爬虫的访问频率?
设置爬虫的访问频率是确保爬虫行为合法且不给目标网站服务器造成过大压力的重要措施。合理的访问频率可以有效避免被网站封禁IP,同时也能保证爬虫的效率。以下是一些设置爬虫访问频率的方法和策略: 一、设置请求间隔 (一)固定间隔…...
如何排查服务器内存泄漏问题
服务器内存泄漏是一种常见的问题,可能导致系统性能下降甚至系统崩溃。以下是一般情况下用于排查服务器内存泄漏问题的步骤: 排查服务器内存泄漏问题的步骤: 监控系统资源: 使用系统监控工具(如top、htop、free&#x…...
Ubuntu20.04双系统安装及软件安装(九):谷歌浏览器
Ubuntu20.04双系统安装及软件安装(九):谷歌浏览器 打开终端,下载谷歌浏览器软件包: wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb下载完成后直接在原终端执行: sudo…...
有关Java中的集合(1):List<T>和Set<T>
学习目标 核心掌握List集合了解Set集合 1.List<T> ● java.util.List。有序列表。 ● List集合元素的特点:有序表示存取有序(因为有索引)而且可以重复 ● List常用实现类: ArrayList、LinkedList、Vector等 1.1 常用方法…...
【C++STL之vector】vector容器浅析
文章目录 🌟 深入探索C vector:从青铜到王者的动态数组进阶指南 🌟🚀 开篇:为什么vector是C程序员的瑞士军刀?🔍 一、vector的本质解密:不只是智能数组那么简单1.1 动态数组的华丽蜕…...
如何通过卷积神经网络(CNN)有效地提取图像的局部特征,并在CIFAR-10数据集上实现高精度的分类?
目录 1. CNN 提取图像局部特征的原理 2. 在 CIFAR - 10 数据集上实现高精度分类的步骤 2.1 数据准备 2.2 构建 CNN 模型 2.3 定义损失函数和优化器 2.4 训练模型 2.5 测试模型 3. 提高分类精度的技巧 卷积神经网络(Convolutional Neural Network, CNN&#…...
Redis的持久化-RDBAOF
文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发 RDB 持久化过程分为手动触发和自动触发。 …...
Redis 的几个热点知识
前言 Redis 是一款内存级的数据库,凭借其卓越的性能,几乎成为每位开发者的标配工具。 虽然 Redis 包含大量需要掌握的知识,但其中的热点知识并不多。今天,『知行』就和大家分享一些 Redis 中的热点知识。 Redis 数据结构 Redis…...
Rust WebAssembly 入门教程
一、开发环境搭建 1. 基础工具安装 # 安装 Rust curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh# 安装 wasm-pack cargo install wasm-pack# 安装开发服务器 cargo install basic-http-server# 安装文件监听工具 cargo install cargo-watch2. VSCode 插件安装…...
靶场之路-VulnHub-DC-6 nmap提权、kali爆破、shell反连
靶场之路-VulnHub-DC-6 一、信息收集 1、扫描靶机ip 2、指纹扫描 这里扫的我有点懵,这里只有两个端口,感觉是要扫扫目录了 nmap -sS -sV 192.168.122.128 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10deb9u6 (protoc…...
机器视觉开发教程——封装Halcon通用模板匹配工具【含免费教程源码】
目录 引言前期准备Step1 设计可序列化的输入输出集合【不支持多线程】Step2 设计程序框架1、抽象层【IProcess】2、父类【HAlgorithm】3、子类【HFindModelTool】 Step3 设计UI结果展示 引言 通过仿照VisionPro软件二次开发Halcon的模板匹配工具,便于在客户端软件中…...
Android 中 ConstrantLayout 与 RelativeLayout 区别
ConstraintLayout 和 RelativeLayout 都是 Android 开发中常用的布局容器,它们都可以用于构建复杂的用户界面,但在功能、性能、使用方式等方面存在一些区别,下面为你详细介绍: 1. 布局原理 RelativeLayout:RelativeL…...
【3DMAX室内设计】2D转3D平面图插件2Dto3D使用方法
【一键筑梦】革新性2Dto3D插件,轻松实现2D平面图向3D空间的华丽蜕变。这款专为3DMAX室内设计师设计的神器,集一键式墙体、门、窗自动生成功能于一身,能够将2D图形无缝转化为3D网格对象(3D平面图、鸟瞰图),一…...
vscode 查看3d
目录 1. vscode-3d-preview obj查看ok 2. vscode-obj-viewer 没找到这个插件: 3. 3D Viewer for Vscode 查看obj失败 1. vscode-3d-preview obj查看ok 可以查看obj 显示过程:开始是绿屏,过了1到2秒,后来就正常看了。 2. vsc…...
自动驾驶---不依赖地图的大模型轨迹预测
1 前言 早期传统自动驾驶方案通常依赖高精地图(HD Map)提供道路结构、车道线、交通规则等信息,可参考博客《自动驾驶---方案从有图迈进无图》,本质上还是存在问题: 数据依赖性高:地图构建成本昂贵…...
perl初试
我手头有一个脚本,用于从blastp序列比对的结果文件中,进行文本处理, 获取序列比对最优的hit记录 #!/usr/bin/perl -w use strict;my ($blast_out) ARGV; my $usage "This script is to get the best hit from blast output file wit…...
VS Code C++ 开发环境配置
VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…...
Web Snapshot 网页截图 模块代码详解
本文将详细解析 Web Snapshot 模块的实现原理和关键代码。这个模块主要用于捕获网页完整截图,特别优化了对动态加载内容的处理。 1. 模块概述 snapshot.py 是一个功能完整的网页截图工具,它使用 Selenium 和 Chrome WebDriver 来模拟真实浏览器行为&am…...
