verilog笔记

Verilog学习笔记(一)入门和基础语法BY电棍233

由于某些不可抗拒的因素和各种的特殊原因,主要是因为我是微电子专业的,我需要去学习一门名为verilog的硬件解释语言,由于我是在某西部地区的神秘大学上学,这所大学的数字系统设计基础课程的考试居然是手写代码,十分的令人好笑,教育资源的匮乏可见一斑。这种编程课靠听课记笔记显然是没有办法学好的,怎么办,只有敲代码。下面的笔记是我借助AI+网上帖子+自己实践手敲代码验证写出来的。这部分笔记是从verilog入门到基础知识部分。

引入与描述性解释

verilog是硬件描述语言,诞生于1988年,现在所用的verilog标准是2005年的。

Verilog 主要用于以下领域:

  • 数字电路设计:描述数字系统的行为和结构。
  • 仿真:验证设计是否按预期工作。
  • 综合:将 Verilog 代码转换成门级网表,进而可以用于制造芯片。
  • 测试和验证:编写测试平台来验证设计的正确性。

语言特点

  • 模块化:Verilog 设计是基于模块的,每个模块代表设计中的一个功能单元。
  • 并行性:Verilog 代码模拟硬件的并行行为,模块内的语句并行执行。
  • 时序:可以描述信号的时序关系,如延迟和时序控制。
  • 数据流:通过连续赋值语句(assign)和过程块(always)来描述数据流。

基本语法

以下是一些 Verilog 的基本语法元素:

  • 模块定义:使用 module 关键字定义模块,endmodule 结束模块定义。
  • 端口声明:模块的输入和输出通过端口声明来定义。
  • 变量类型:包括 wire(用于连接逻辑门),reg(用于存储值),integer 等。
  • 逻辑操作:使用 &&(逻辑与),||(逻辑或),!(逻辑非)等。
  • 算术操作:加(+),减(-),乘(*),除(/)等。
  • 条件语句:if-else,case,casex,casez 等。
  • 循环语句:for,while,repeat 等。

模块

模块是verilog语法中的基础,module可以视为verilog中的基础,是一个具备输入和输出的黑盒子。verilog中的每一个模块必须是以.v为后缀的,且文件名即为模块名称。

module top_module(input in1,input in2,output out)***
end module

但是在实际过程中往往不可能只用到一个模块,通常是会用到多个模块,类似于c语言中的头文件,在verilog中也可以相互去引入。在 Verilog 中,模块实例化是将一个模块(module)的实例(instance)放入另一个模块中的过程。这是构建复杂硬件设计的基础,允许设计者重用和组合较小的设计单元来创建更大的系统。举个例子,在主模块中调用与门模块。

module and_gate (input wire A, input wire B, output wire Y);assign Y = A & B;//输出Y=A&B
endmodule

把上面的模块保存为and_gate.v
然后再定义一个top_module.v文件,在其中实例化应用and_gate 模块。

module top_module;// 声明内部信号wire A, B, Y;// 实例化 and_gate 模块and_gate instance_name (.A(A),      // 将 and_gate 的 A 端口连接到 top_module 的 A 信号.B(B),      // 将 and_gate 的 B 端口连接到 top_module 的 B 信号.Y(Y)       // 将 and_gate 的 Y 端口连接到 top_module 的 Y 信号);// 其他模块逻辑...
endmodule

逻辑块

在verilog中,逻辑块被用来描述硬件的行为和结构,主要有两种类型的逻辑块,分别是initial块和always块。

always逻辑块可以用来构建组合逻辑和时序逻辑,复杂的逻辑操作都需要出于此该逻辑块中。当然了,always逻辑块需要被写在模块module中。

下面是一些简单的always逻辑块的示例代码:

首先是组合逻辑的always逻辑块,其次是时许逻辑的always逻辑块。

always @(*) beginout = a & b; // 输出是输入 a 和 b 的逻辑与
end
reg data_reg;//reg是一种数据存储类型
always @(posedge clk or negedge rstn) beginif (!rstn) begindata_reg <= 1'b0; // 当复位信号为低时,将寄存器清零end else begindata_reg <= data_in; // 在时钟上升沿,将输入数据赋值给寄存器end
end

其中posedge是上升沿,negedge是下降沿。

完整的示例代码如下,在模块中嵌套逻辑块:

module top_module();always @(posedge clk) begin....endendmodule

generate逻辑块通常是结合for循环使用的,在 Verilog 中,generate 逻辑块是一个非常有用的结构,它允许你根据参数或循环来生成硬件结构。这可以用来创建可参数化的模块,或者生成大量的相同或相似的硬件结构,而不需要手动编写重复的代码。主要的用途有:

1.操作向量

2.模块重复多次实例化。

Verilog 中有三种类型的 generate 逻辑块:

  1. generate-for:用于基于循环生成多个相同的硬件实例。

  2. generate-if:用于基于条件判断生成或不生成硬件。

  3. generate-case:用于基于多个条件生成不同的硬件结构。

下面是一个generate-for的实例:

module register_array(input wire clk,input wire reset,input wire [3:0] data_in,output wire [3:0] data_out
);parameter NUM_REGISTERS = 4;generate//generate-for逻辑块genvar i;for (i = 0; i < NUM_REGISTERS; i = i + 1) begin : gen_registersreg [3:0] reg_i;always @(posedge clk or posedge reset) beginif (reset) beginreg_i <= 4'b0000;end else beginreg_i <= data_in;endendassign data_out[i] = reg_i;end
endgenerateendmodule//结束module的定义

initial逻辑块

在 Verilog 中,initial 逻辑块用于在仿真开始时执行一次性的初始化操作。它与 always 块不同,always 块在仿真过程中会无限循环执行,而 initial 块只在仿真开始时执行一次,之后就不会再执行。

initial 块通常用于以下几种情况:

  1. 初始化寄存器的值。

  2. 定义测试平台的激励(stimulus)。

  3. 配置仿真环境,如设置初始时间分辨率。

  4. 打印仿真开始时的消息。

initial逻辑块的示例代码如下:

module testbench;reg my_reg;initial begin// 在仿真时间0时初始化my_reg为0my_reg = 0;#10; // 等待10个时间单位my_reg = 1; // 在仿真时间10时将my_reg设置为1#20; // 再等待20个时间单位my_reg = 0; // 在仿真时间30时将my_reg重新设置为0$display("Simulation ended at time %t",$time);end
endmodule

赋值方式

在verilog中有三种赋值方式,分别是连续赋值,阻塞赋值与非阻塞赋值,如下:

在Verilog硬件描述语言中,赋值语句用于定义信号的行为。根据赋值的类型,Verilog中的赋值可以分为以下几种:阻塞赋值(Blocking Assignment)、非阻塞赋值(Non-Blocking Assignment)和连续赋值(Continuous Assignment)。阻塞赋值使用等号(=)表示。在执行过程中,当前语句必须等待赋值完成之后,才会执行下一条语句。这意味着在同一个always块中,阻塞赋值的执行是顺序的。非阻塞赋值使用小于等于号(<=)表示。在执行过程中,当前语句不会阻塞后续语句的执行。在同一个always块中,非阻塞赋值的操作是并行的,即它们同时开始但完成时间不一定相同。连续赋值使用等号(=)表示,但它不同于阻塞赋值,因为它没有放在always块中。连续赋值描述的是组合逻辑,只要右侧的表达式发生变化,赋值就会立即更新左侧的信号。

示例代码如下:

assign x=y//此为连续赋值,用assign关键词
// 组合块
always @(*)  begin//此为阻塞赋值out1 = a ;a = b ;out2 = a ;
end
// 时序块
always @(posedge clk)  begin//此为非阻塞赋值out1 <= a ;a <= b ;out2 <= a ;
end

基础语法

逻辑值与逻辑运算

逻辑值

在Verilog中,主要有以下四种逻辑值:

  1. 0:表示逻辑低电平,通常对应于电压的0V或GND。
  2. 1:表示逻辑高电平,通常对应于电源电压(如5V或3.3V)。
  3. x:表示未知逻辑值,可以是0或1。
  4. z:表示高阻态,通常用于三态门或双向端口,表示输出既不是高电平也不是低电平,而是处于不驱动状态。

逻辑运算

Verilog支持以下逻辑运算,下面这些是按位运算,假如要做逻辑运算,则用&&,||这些

  1. 逻辑与(&)
    • 运算规则:只有当两个操作数都为1时,结果才为1;否则结果为0。
    • 示例:4'b1010 & 4'b1100 的结果为 4'b1000
  2. 逻辑或(|)
    • 运算规则:只要有一个操作数为1,结果就为1;只有当两个操作数都为0时,结果才为0。
    • 示例:4'b1010 | 4'b1100 的结果为 4'b1110
  3. 逻辑异或(^)
    • 运算规则:当两个操作数不相同时,结果为1;当两个操作数相同时,结果为0。
    • 示例:4'b1010 ^ 4'b1100 的结果为 4'b0110
  4. 逻辑同或(~^ 或 ^~)
    • 运算规则:当两个操作数相同时,结果为1;当两个操作数不相同时,结果为0。
    • 示例:4'b1010 ~^ 4'b1100 的结果为 4'b1000
  5. 逻辑非(! 或 ~)
    • 运算规则:将操作数的逻辑值取反。
    • 示例:!4'b1010 的结果为 4'b0101~4'b1010 的结果也是 4'b0101

这里补充一下在verilog中的数字表示形式:'b在verilog中是二进制的意思,4’b1100是4位二进制数1100,这种表示方法我没学习的时候是一头雾水的。'b是二进制,'h是八进制,'d是十进制。

变量(wire,reg)

在Verilog中,wirereg是两种不同的变量类型,它们用于表示硬件电路中的不同信号和功能。

wire

wire类型用于表示硬件电路中的物理连线。它通常用于表示模块间的连接、组合逻辑的输出以及芯片上的实际电线。以下是关于wire的一些特点:

  • wire用于表示线网(net),即它是一个无状态的变量,它的值由驱动它的逻辑门或模块的输出决定。

  • wire不能存储值,它的值是连续分配的,即它的值在任何时刻都是由连接到它的驱动器所决定的。

  • wire主要用于表示组合逻辑的输出。

  • wire可以在连续赋值语句(assign statement)中使用,用于连续赋值。

reg

reg类型用于表示寄存器类型的变量,它通常用于表示时序逻辑中的存储元素。以下是关于reg的一些特点:

  • reg用于表示变量,它可以存储值,通常用于在always块中赋值。
  • reg并不总是代表硬件寄存器,它也可以用于表示用于仿真的内部变量。
  • reg可以在过程赋值语句(procedural assignment)中使用,如always块、initial块等。
  • reg通常用于表示触发器(flip-flop)的输出。
wire a, b, sum;assign sum = a & b; // 使用assign语句将a和b的逻辑与结果赋值给sum,wire用在assign 语句中reg a, b, q;always @(posedge clk) beginq <= a & b; // 在时钟上升沿将a和b的逻辑与结果赋值给q,reg用在always逻辑块中
end

区别如下

  • wire用于组合逻辑,而reg用于时序逻辑。
  • wire通过连续赋值语句赋值,而reg通过过程赋值语句赋值。
  • wire不能在always块中直接赋值,而reg可以在always块中赋值。

值得注意的是即使register(reg)暗示了其是一个寄存器,但实际上这还要和其在电路中是如何使用的对应上。

向量与参数(常量)

parameter 参数:

parameter是一种常量,通常出现在module内部,常被用于定义状态、数据位宽等

vector(向量):

在Verilog中,向量变量是一种表示多位宽信号的方式,它允许我们以单个变量的形式处理一组位。向量可以是线网(wire)或变量(reg)类型,并且可以用于表示组合逻辑或时序逻辑的输出。以下是关于Verilog中向量变量形式的详细介绍:

向量通过在变量名后面加上方括号[]来定义,方括号内指定了向量的位宽。位宽可以是确定的数字,也可以是参数化的表达式。向量的位宽定义了向量包含的位数。

wire [3:0] w;  // 定义一个4位的wire类型向量,位宽从3到0
reg  [7:0] r;  // 定义一个8位的reg类型向量,位宽从7到0

向量索引:

Verilog允许通过索引来访问向量中的单个位或连续的位段。索引可以是常数或计算得到的表达式。

reg [7:0] r;// 访问单个位
r[0] = 1'b1;  // 设置r的第0位为1
r[7] = 1'b0;  // 设置r的最高位为0// 访问连续的位段
r[3:1] = 3'b101;  // 设置r的第3位到第1位为101

向量拼接:

允许将向量进行相连,如此看来向量和c语言中的字符串更加相似。

wire [3:0] a = 4'b1010;
wire [3:0] b = 4'b1100;
wire [7:0] c;// 向量拼接
c = {a, b};  // c将会是8'b10101100

向量赋值:

向量赋值允许整体赋值和部分赋值。

reg [7:0] r;//八位向量,[7:0]// 整体赋值
r = 8'b10101010;// 部分选择赋值
r[7:4] = 4'b1111;  // r现在为8'b11111010

向量的操作:

向量间允许进行逻辑运算,算术运算和比较运算。向量间运算的时候,需要保持其长度一样。

reg [3:0] a = 4'b1010;
reg [3:0] b = 4'b1100;
reg [3:0] result;// 逻辑运算
result = a & b;  // 结果为4'b1000

在verilog中的向量一般来说是从最高位到最低位这样设定的,比如reg [4:0] a中就是从第四位到第0位如此设定的。

三元表达式

在Verilog中,三元表达式是一种简洁的书写方式,用于在单个表达式中实现条件赋值。它类似于C语言中的条件运算符 ? :。三元表达式的语法如下:

condition ? expression1 : expression2

部分使用示例如下:

reg a, b, c;
wire d;// 如果a为1,则d赋值为b,否则赋值为c
d = a ? b : c;
reg [3:0] a, b, result;// 如果a的最高位为1,则result的最高4位赋值为b,否则赋值为a
result[3:0] = a[3] ? b[3:0] : a[3:0];

分支语句

在Verilog中,分支语句用于根据条件的真假来执行不同的代码块。Verilog提供了两种主要的分支语句:if语句和case语句。下面将详细介绍这两种分支语句的用法。

if语句:

if语句是最基本的分支结构,它根据条件的真假来决定是否执行某个代码块。

reg [1:0] a;
reg b;always @(posedge clk) beginif (a == 2'b01) beginb <= 1'b1; // 如果a等于01,则b赋值为1endelse beginb <= 1'b0; // 否则,b赋值为0end
end

case语句:

case语句是一种多路分支结构,它允许根据表达式的值选择多个代码块中的一个来执行。case语句中假如不满足所有的值就执行default条件。示例代码如下,类似于c语言中的case语句:

reg [1:0] a;
reg [2:0] b;always @(posedge clk) begincase (a)2'b00: b <= 3'b000; // 如果a等于00,则b赋值为0002'b01: b <= 3'b001; // 如果a等于01,则b赋值为0012'b10: b <= 3'b010; // 如果a等于10,则b赋值为010default: b <= 3'b111; // 如果a不匹配上述任何值,则b赋值为111endcase
end

for循环语句

在Verilog中,for循环语句是一种重复执行代码块的构造,它允许你根据给定的条件重复执行一系列操作。这在初始化寄存器数组或执行重复计算时非常有用。以下是for循环的基本语法和用法。在verilog中的for循环语句和c语言中的for循环语句相似。

reg [7:0] my_array [0:99]; // 声明一个包含100个8位寄存器的数组initial beginfor (int i = 0; i < 100; i = i + 1) beginmy_array[i] = 8'h00; // 将数组中的每个元素初始化为0end
end
  • 循环变量通常声明为整数类型(int),这是Verilog中的一个4态变量,可以表示正值、负值、0和x(未知)。
  • 在Verilog中,for循环通常用于initialalways块中。
  • 在可综合的Verilog代码中,for循环必须保证在有限的时间内完成。这意味着循环的迭代次数必须是可预测的,通常基于常数或参数。
  • 在仿真中,for循环可以无限运行,但在实际硬件中,循环必须在一个时钟周期内完成,或者分解为多个时钟周期内的操作。
  • 在可综合的代码中,for循环的索引变量不应在循环体内被赋值,除非是按照循环迭代的固定模式更新。

拼接运算符

在Verilog中,拼接运算符(Concatenation Operator)用于将多个位宽不同的信号或变量组合成一个连续的位宽更大的信号。拼接运算符有两种形式:连续拼接运算符 {} 和重复拼接运算符 {n{}}。连续拼接运算符允许你将多个信号或值按顺序拼接起来,形成一个更大的向量。重复拼接运算符允许你将一个信号或值重复多次,形成一个更大的向量。示例代码如下:

wire [3:0] a = 4'b1010;
wire [1:0] b = 2'b11;
wire [5:0] c;assign c = {a, b}; // c 将被赋值为 6'b101011
wire [1:0] a = 2'b11;
wire [7:0] b;assign b = {4{a}}; // b 将被赋值为 8'b11111111

while循环

在Verilog中,while循环是一种过程性语句,它允许在initial块或always块中根据给定的条件重复执行一段代码。while循环的行为类似于C语言中的while循环,它在每次迭代之前检查条件,如果条件为真(即非零),则执行循环体内的代码;如果条件为假(即零),则退出循环。示例代码如下:

reg [7:0] accumulator; // 8位累加器
reg [7:0] counter;     // 8位计数器initial beginaccumulator = 0; // 初始化累加器counter = 0;     // 初始化计数器while (counter < 100) beginaccumulator = accumulator + counter; // 累加计数器的值counter = counter + 1;              // 计数器递增end$display("Accumulator value: %d", accumulator); // 显示累加器的最终值
end

在下面的示例中编写了test_bench文件并编译和查看结果:

在这里插入图片描述

repeat循环

在Verilog中,repeat 循环是一个用于重复执行一段代码的循环结构。它类似于 C 语言中的 for 循环,但是 repeat 循环的语法更简单,因为它只指定了循环次数,而不需要初始化表达式和递增表达式。示例代码如下:

module repeat_test;
reg [3:0] count; // 4位计数器
initial begin//initial逻辑块count = 0; // 初始化计数器repeat (10) begin#5; // 等待5个时间单位count = count + 1; // 计数器递增$display("Count is %d", count); // 打印计数器的值end
end
endmodule

实际上说明在verilog编译的时候不需要test_bench也是可行的,仅仅编写一个module文件也是可以编译并查看结果的,具体如下所示:

在这里插入图片描述

函数与任务

在Verilog中,函数(function)和任务(task)是两种用于封装和重用代码块的重要机制。它们在模块内部定义,可以用来执行特定的操作或计算。函数是一种返回单个值的操作,它不能包含任何时间延迟(#)或非阻塞赋值(<=)。函数通常用于计算和返回一个结果。

函数的特点:

  • 函数必须有一个返回类型,可以是线网(wire)或寄存器(reg)类型,并且可以指定宽度。
  • 函数可以接受输入参数,但不能有输出参数。
  • 函数不能包含任何时间延迟(#)或非阻塞赋值(<=)。
  • 函数在调用时必须有一个返回值。
function [7:0] add_bytes(input [7:0] a, input [7:0] b);//定义函数,输出是[7:0]的向量,输入是[7:0]a和[7:0]b,这是system verilog的语法,传统的verilog实际上不支持参数的声明在括号中add_bytes = a + b;
endfunction

任务是一种可以执行多个操作的块,它可以包含时间延迟和非阻塞赋值。任务可以没有返回值,但可以有输入和输出参数。

任务的特点:

  • 任务可以没有返回值,因此不需要指定返回类型。
  • 任务可以接受输入参数和输出参数。
  • 任务可以包含时间延迟(#)和非阻塞赋值(<=)。
  • 任务可以调用其他任务或函数。

值得注意的是,任务的特点在于其可以包含时间延迟和非阻塞赋值,且其不一定得有一个返回值。

task delay_and_print(input [7:0] data, output reg done);#10; // 延迟10个时间单位$display("Data is %h", data);done = 1'b1; // 设置完成标志
endtask

下面的代码示例展示了如何在verilog中编写并调用函数。

module task_test;// 函数定义(传统Verilog语法)function [7:0] myfunction;input [7:0] a;  // 在函数体内声明输入参数input [7:0] b;beginmyfunction = a + b; // 通过赋值给函数名返回结果endendfunctionreg [7:0] out;initial beginout = myfunction(8'b11000011, 8'b10101010);$display("out is %b", out); end
endmodule

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的城乡商城协作系统【附源码】

基于SpringBoot的城乡商城协作系统 效果如下&#xff1a; 系统登陆页面 系统管理员主页面 商品信息管理页面 系统用户主页面 社区交流页面 用户充值页面 订单提交页面 商品信息页面 研究背景 随着互联网技术的飞速发展&#xff0c;电子商务在我国城乡地区的普及程度越来越高…

tortoiseSVN 如何克隆项目到本地

导入项目成功&#xff0c;如下图&#xff1a;

1.1 go环境搭建及基本使用

golang下载地址&#xff1a; Download and install - The Go Programming Language (google.cn) 验证安装是否成功&#xff1a; go version 查看go环境 go env 注意&#xff1a;Go1.11版本之后无需手动配置环境变量,使用go mod 管理项目&#xff0c;也不需要把项目放到GO…

使用Ubuntu搭建Java部署环境

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f439;今日诗词:小舟从此逝&#xff0c;江海寄余生&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小…

从零搭建微服务项目Pro(第1-1章——Quartz实现定时任务模块)

前言&#xff1a; 在企业项目中&#xff0c;往往有定时任务发布的需求&#xff0c;比如每天晚9点将今日数据备份一次&#xff0c;或每月一号将上月的销售数据邮件发送给对应的工作人员。显然这些操作不可能是人工到时间点调用一次接口&#xff0c;需要编写专门的模块完成任务的…

深蓝学院自主泊车第3次作业-IPM

目录 1 题目介绍2 求解 1 题目介绍 已知鱼眼相机的参数&#xff0c; image_width&#xff0c;表示图像的宽度image_height&#xff0c;表示图像的高度 ξ \xi ξ&#xff0c;表示鱼眼相机参数 k 1 k_1 k1​、 k 2 k_2 k2​&#xff0c;表示径向相机参数 p 1 p_1 p1​、 p 2 p…

中兴G7615AV5

参考文献&#xff1a; G7615AV5 光猫新版固件通过修改备份配置文件固化Telnet 中兴7615AV5光猫配置指南 前言&#xff1a;&#xff08;不如咸鱼30远程全权搞定&#xff0c;花小钱办大事&#xff09;截至2025年2月22号&#xff0c;这个设备开启Telnet只能去咸鱼找别人远程开&…

记录:Docker 安装记录

今天在安装 ollama 时发现无法指定安装目录&#xff0c;而且它的命令行反馈内容很像 docker &#xff0c;而且它下载的模型也是放在 C 盘&#xff0c;那么如果我 C 盘空间不足&#xff0c;就装不了 deepseek-r1:70b &#xff0c;于是想起来之前安装 Docker 的时候也遇到过类似问…

大数据学习之任务流调度系统Azkaban、Superset可视化系统

一.任务流调度系统Azkaban 1.课程介绍 2.为什么需要工作流调度系统 3.AZKABAN是什么 4.AZKABAN下载 5.制作安装包 6.tar包准备 7.MYSQL配置AZKABAN 8.配置EXECUTOR SERVER 9.配置WEBSERVER 10.单作业实战_yaml语言(今天稍晚更新) 11.单作业实战 12.多作业依赖实战 13.失败自动重…

PiscTrace的开发者版

基于 PiscTrace 架构的视图处理的纯开发板&#xff0c;支持静态图片、实时视频流、摄像头视频流和网络视频流的处理。与 PiscTrace 应用版相比&#xff0c;开发者版通过直接的代码开发&#xff0c;提供了更高的灵活性和可定制性&#xff0c;适用于需要深度定制和复杂处理的应用…

excel中VBA宏的使用方法?

先编写宏代码&#xff1a;&#xff08;随便新建打开一个记事本文档 或者 word文档&#xff09; 然后&#xff1a;

selenium爬取苏宁易购平台某产品的评论

目录 selenium的介绍 1、 selenium是什么&#xff1f; 2、selenium的工作原理 3、如何使用selenium&#xff1f; webdriver浏览器驱动设置 关键步骤 代码 运行结果 注意事项 selenium的介绍 1、 selenium是什么&#xff1f; 用于Web应用程序测试的工具。可以驱动浏览…

USC安防平台之元数据检索

平台基于深度学习技术&#xff0c;支持CPU和NVIDIA GPU推理&#xff0c;支持周界和违法行为实时分析&#xff0c;并存储元数据到流式视频数据库中&#xff0c;可以根据不同的条件搜索&#xff0c;从而提供更强大的安全防范策略和事后调查手段。 平台根据用户自定义规则来检测异…

基于VirtualBox虚拟机部署完全分布式Hadoop环境

搭建 一、Ubuntu系统搭建 系统搭建 二、host配置 首先创建一个新用户hadoop并且分配权限&#xff0c;切换到hadoop用户下 成功切换 然后可以先克隆一下另一个虚拟机&#xff0c;为了之后的相互通信 直接点击虚拟机右键克隆即可 但是这里有一个问题&#xff0c;就是在…

正则表达式–断言

原文地址&#xff1a;正则表达式–断言 – 无敌牛 欢迎参观我的个人博客&#xff1a;正则表达式特殊字符 – 无敌牛 断言assertions 1、(?...)&#xff1a;正向预查&#xff08;positive lookahead&#xff09;&#xff0c;表示某个字符串后面应该跟着什么。但这个字符串本身…

【DeepSeek-R1背后的技术】系列九:MLA(Multi-Head Latent Attention,多头潜在注意力)

【DeepSeek背后的技术】系列博文&#xff1a; 第1篇&#xff1a;混合专家模型&#xff08;MoE&#xff09; 第2篇&#xff1a;大模型知识蒸馏&#xff08;Knowledge Distillation&#xff09; 第3篇&#xff1a;强化学习&#xff08;Reinforcement Learning, RL&#xff09; 第…

UE_C++ —— Gameplay Classes

目录 一&#xff0c;Adding Classes 二&#xff0c;Class Headers Class Declaration Class Specifiers Metadata Specifiers 三&#xff0c;Class Implementation Class Constructor 引擎中每个游戏类都由一个类头文件&#xff08;.h&#xff09;和一个类源文件&#x…

使用AI创建流程图和图表的 3 种简单方法

你可能已经尝试过使用 LLMs 生成图像&#xff0c;但你有没有想过用它们来创建 流程图和图表&#xff1f;这些可视化工具对于展示流程、工作流和系统架构至关重要。 通常&#xff0c;在在线工具上手动绘制图表可能会耗费大量时间。但你知道吗&#xff1f;你可以使用 LLMs 通过简…

二叉树(中等题)

1、先序&#xff0c;中序遍历确定二叉树 105 方法一、 前提 ① 必须不能有重复元素② 只有先序&#xff0b;中序和后序&#xff0b;中序才能实现唯一树 思考要点&#xff1a; 不要想着用for循环&#xff0c;递归一定更好解决输入是vector&#xff0c;递归就得考虑传入索…

蓝思科技赋能灵伴科技:AI眼镜产能与供应链双升级

2月22日&#xff0c;蓝思科技宣布与AI交互领军企业杭州灵伴科技&#xff08;Rokid&#xff09;达成深度战略合作&#xff0c;通过整机组装与全产业链整合&#xff0c;为2025年全球AI眼镜出货量爆发式增长&#xff08;预计达400万-1200万台&#xff09;提供核心支撑。 双方合作通…