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 @(*) begin
    out = a & b; // 输出是输入 a 和 b 的逻辑与
end

reg data_reg;//reg是一种数据存储类型
always @(posedge clk or negedge rstn) begin
    if (!rstn) begin
        data_reg <= 1'b0; // 当复位信号为低时,将寄存器清零
    end else begin
        data_reg <= data_in; // 在时钟上升沿,将输入数据赋值给寄存器
    end
end

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

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

module top_module();
 
    always @(posedge clk) begin
        ....
    end
 
endmodule

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_registers
        reg [3:0] reg_i;
        always @(posedge clk or posedge reset) begin
            if (reset) begin
                reg_i <= 4'b0000;
            end else begin
                reg_i <= data_in;
            end
        end
        assign data_out[i] = reg_i;
    end
endgenerate

endmodule//结束module的定义

initial逻辑块

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

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

  1. 初始化寄存器的值。

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

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

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

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

module testbench;
    reg my_reg;
    initial begin
        // 在仿真时间0时初始化my_reg为0
        my_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) begin
    q <= 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) begin
    if (a == 2'b01) begin
        b <= 1'b1; // 如果a等于01,则b赋值为1
    end
    else begin
        b <= 1'b0; // 否则,b赋值为0
    end
end

case语句:

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

reg [1:0] a;
reg [2:0] b;

always @(posedge clk) begin
    case (a)
        2'b00: b <= 3'b000; // 如果a等于00,则b赋值为000
        2'b01: b <= 3'b001; // 如果a等于01,则b赋值为001
        2'b10: b <= 3'b010; // 如果a等于10,则b赋值为010
        default: b <= 3'b111; // 如果a不匹配上述任何值,则b赋值为111
    endcase
end

for循环语句

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

reg [7:0] my_array [0:99]; // 声明一个包含100个8位寄存器的数组

initial begin
    for (int i = 0; i < 100; i = i + 1) begin
        my_array[i] = 8'h00; // 将数组中的每个元素初始化为0
    end
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 begin
    accumulator = 0; // 初始化累加器
    counter = 0;     // 初始化计数器

    while (counter < 100) begin
        accumulator = 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;
        begin
            myfunction = a + b; // 通过赋值给函数名返回结果
        end
    endfunction

    reg [7:0] out;
    initial begin
        out = myfunction(8'b11000011, 8'b10101010);
        $display("out is %b", out); 
    end
endmodule

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Three.js 快速入门教程【六】相机控件 OrbitControls

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…

抗辐照加固CAN FD芯片的商业航天与车规级应用解析

在工业自动化、智能汽车、航空航天及国防装备等关键领域&#xff0c;数据传输的安全性、可靠性与极端环境适应能力是技术升级的核心挑战。国科安芯推出全新一代CANFD&#xff08;Controller Area Network Flexible Data Rate&#xff09;芯片&#xff0c;以高安全、高可靠、断电…

经验分享—WEB渗透测试中遇到加密内容的数据包该如何测试!

经验分享—WEB渗透测试中遇到加密内容的数据包该如何测试&#xff01; 01 加解密的意义 现阶段的渗透测试让我发现越来越多的系统不只是在漏洞修补方面做了功夫&#xff0c;还对一些参数进行加密&#xff0c;干扰爬虫或者渗透测试的进行。 在我小白阶段看到下图这种加密方式…

在群晖上使用Docker安装思源笔记

​​ 最近一段时间&#xff0c;docker的镜像地址都失效了&#xff0c;在群晖系统中&#xff0c;无论是早期版本的docker&#xff0c;还是最新版本中的Container Manager&#xff0c;注册表中都无法链接到docker的镜像&#xff0c;于是&#xff0c;就花了点时间查找资料&#x…

网络安全营运周报

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 第三章网络安全基础 一、网络安全概述 1、网络安全现状及安全挑战 网络安全范畴极其广泛&#xff0c;可以说是涉及多方面。 因为计算机病毒层出不穷以及黑客的…

Linux 进程通信——管道

目录 一、什么是进程通信 二、为什么要进行进程通信 三、如何进行通信 四、管道 1、什么是管道 2、管道的原理 3、接口 4、编码实现 5、管道的特征 6、管道的4种情况 一、什么是进程通信 进程通信是两个或多个进程实现数据层面的交互。 因为进程具有独立性&#xff0…

Linux中DataX使用第四期

简介 紧接着上期关于定义如何一个简单的插件&#xff0c;本期了解下关系型数据库的数据读取和数据写入。 环境 Windows10 (linux中命令相似&#xff0c;为了方面调试就用windows的)JDK(1.8以上&#xff0c;推荐1.8)Python(2或3都可以)Apache Maven (推荐3.x版本)IntelliJ IDEA…

Java计算机毕业设计基于SSM宠物美容信息管理系统数据库源代码+LW文档+开题报告+答辩稿+部署教程+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

核货宝助力连锁门店订货数字化转型升级

在竞争激烈的连锁零售行业&#xff0c;传统订货模式弊端日益凸显&#xff0c;严重制约着企业的发展。核货宝订货系统以其卓越的数字化解决方案&#xff0c;为连锁门店订货带来了全方位的变革&#xff0c;助力企业实现数字化转型升级&#xff0c;在市场中抢占先机。 一、增强总部…

论文解读 | AAAI'25 Cobra:多模态扩展的大型语言模型,以实现高效推理

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 个人信息 作者&#xff1a;赵晗&#xff0c;浙江大学-西湖大学联合培养博士生 内容简介 近年来&#xff0c;在各个领域应用多模态大语言模型&#xff08;MLLMs&…

java中的Entry类,map接口

看Redisson源码时候发现有个Entry&#xff0c;眼熟&#xff0c;遂查资料 Map.Enty<KV> 是在Map接口中的一个内部接口Entry 作用&#xff1a;当Map集合一创建那么就会在Map集合中创建一个Enty对象&#xff0c;用来记录键与值&#xff08;键值对对象&#xff0c;键与值的…

HarmonyOS学习第4天: DevEco Studio初体验

初次邂逅&#xff1a;DevEco Studio 在数字化浪潮汹涌澎湃的当下&#xff0c;移动应用开发领域始终是创新与变革的前沿阵地。鸿蒙系统的横空出世&#xff0c;宛如一颗璀璨新星&#xff0c;照亮了这片充满无限可能的天空&#xff0c;为开发者们开启了一扇通往全新世界的大门。而…

ue5地面上出现preview字样

如图&#xff1a; 解决办法 将光源修改为moveable 参考博客&#xff08;UE光影有preview字样、输出也有_ue5阴影preview消除-CSDN博客

Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)

文章目录 功能包括如何使用 功能包括 红点数据本地持久化 如果子节点有红点&#xff0c;父节点也要显示红点&#xff0c;父节点红点数为子节点红点数的和&#xff1b; 当子节点红点更新时&#xff0c;对应的父节点也要更新&#xff1b; 当所有子节点都没有红点时&#xff0c…

个人环境配置--安装记录

根据显卡下载对应的cuda和cudnn 我使用的是docker,首先拉取镜像,我用的是ubuntu20.04 加速&#xff1a;pull hub.1panel.dev/ devel是开发版本 sudo docker pull hub.1panel.dev/nvidia/cuda:11.6.1-devel-ubuntu20.04先测试一下cuda有没有安装好 nvcc -V更新&#xff0c;安装…

代码审计初探

学会了基础的代码审计后&#xff0c;就该提高一下了&#xff0c;学一下一些框架的php代码审计 先从一些小众的、已知存在漏洞的cms入手 phpems php的一款开源考试系统 源码下载 https://down.chinaz.com/soft/34597.htm 环境部署 windows审计&#xff0c;把相关文件放到phps…

记录Qt 虚拟键盘样式修改与使用

文章目录 概述 一、使用虚拟键盘 二、项目文件定义 1.VirtualKeyboard.qml 2.main.qml 3.main.cpp 三、编译运行 1.编译 2.运行 3.运行效果 总结 概述 在 Qt 开发中&#xff0c;虚拟键盘是移动设备和嵌入式设备中常用的输入工具。本文将详细介绍如何通过 QML 修改虚拟键盘样式…

国产开源PDF解析工具MinerU

前言 PDF的数据解析是一件较困难的事情&#xff0c;几乎所有商家都把PDF转WORD功能做成付费产品。 PDF是基于PostScript子集渲染的&#xff0c;PostScript是一门图灵完备的语言。而WORD需要的渲染&#xff0c;本质上是PDF能力的子集。大模型领域&#xff0c;我们的目标文件格…

基于单片机的智能电表设计(论文+源码)

2.1 系统整体方案设计 本课题为基于单片机的电子式单项智能电表&#xff0c;在此设计如图2.1所示的系统总体架构&#xff0c;其采用STM32单片机作为主控制器&#xff0c;搭配外设HLW8032模块实现对电压&#xff0c;电流&#xff0c;功率因数&#xff0c;电能消耗等参数进行检…

Kafka在Windows系统使用delete命令删除Topic时出现的问题

在使用Windows的Kafka时&#xff0c;想要删除某一个主题&#xff0c;发现使用了delete之后会一直报警告。下面是我发现错误之后重新实测的Bug 先创建2个topic kafka-topics.bat --bootstrap-server localhost:9092 --topic test1 --createkafka-topics.bat --bootstrap-serve…