【verilog】verilog语法刷题知识点总结

news2024/11/18 13:40:38

verilog语法刷题知识点总结

  • 1.状态机
  • 2.任务和函数的区别
  • 3.case,casez和casex
  • 4.随机数产生关键字
  • 5.运算符优先级
  • 6.运算符的特殊注意点及特殊运算符
    • (1)移位运算符
    • (2)等式运算符
    • (3)动态位宽截取运算符
    • (4)求余运算符(%)
  • 7.testbench知识点
  • 8.乘法器
    • (1)分类
    • (2)串行移位加法器
    • (3)并行乘法器
    • (4)查找表乘法器和加法树乘法器这里不再详述
  • 9.用户定义原语(UDP)
    • (1)简述
    • (2)语法
    • (3)注意事项
  • 10.generate-for注意点
  • 11.标识符要求
  • 12.有符号数与无符号数
    • (1)**注意**
    • (2)变量
    • (3)有符号数和无符号数运算
    • (4) #### **注意**

1.状态机

(1)三段式状态机的组成:三段式状态机,第一段用时序逻辑描述(现态);第二段用组合逻辑描述状态转移(次态);第三段用时序逻辑描述输出,第三段可以是多个always块。
(2)二段状态机中,不能为了减少代码长度,以便综合的面积,可以减少else情况,if else中少写else会产生锁存器。

2.任务和函数的区别

不同点函数(function)任务(task)
时序逻辑不能包含延时和时序控制逻辑,不能有非阻塞性赋值可以包含延时和时序控制逻辑
输入至少有一个输入可以没有输入或可以有多个输入
输出没有输出可以没有输出或有多个输出
返回值有一个返回值没有返回值
调用关系可以调用其他函数,不能调用任务可以调用函数和任务
综合性可综合有的编译器可综合,有的编译器不可综合

3.case,casez和casex

(1)case:敏感事件表达式和各项之间的匹配是一种全等匹配,完全相同才匹配;
(2)casez:敏感事件表达式和各项之间的匹配不考虑高阻态z
(3)casex:敏感事件表达式和各项之间的匹配不考虑高阻态z和随机状态x
在这里插入图片描述

4.随机数产生关键字

(1)情况一:b>0,产生一个(-b+1)~(b-1)间的随机数;

	parameter  b = 60;
	reg	[23:0] rand;
	rand = $random%b;

(2)情况二:b>0,产生一个0~(b-1)间的随机数;

	parameter  b = 60;
	reg	[23:0] rand;
	rand = {$random}%b;

(2)情况二:max>0且min>0,产生一个min~max间的随机数;

	parameter  max = 60;
	parameter  min = 30;
	reg	[23:0] rand;
	rand = min+{$random}%(max-min+1);

5.运算符优先级

在这里插入图片描述

6.运算符的特殊注意点及特殊运算符

(1)移位运算符

移位运算符分为分为两种,逻辑移位运算符算数移位运算符
A逻辑移位运算符
特点:用0填补空位
“>>”:逻辑右移运算符;
“<<”:逻辑左移运算符;
B算术移位运算符
特点:只有算术右移运算符,用原最高位填补空位,通过算术右移可以实现有符号数的除法;
“>>>”:逻辑右移运算符;

(2)等式运算符

有四个运算符:
等于:=====
不等于:!=!==
区别:
==!= 不考虑高阻态z未知状态x
===!== 要考虑高阻态z未知状态x
注意:(与casez和casex不同)
==!=:只要表达式两边有一个存在高阻态z未知状态x,判定结果为未知状态x
casez和casex:只要表达式中存在高阻态z高阻态z未知状态x时,对应位判定为匹配。
===== 为例:
在这里插入图片描述

(3)动态位宽截取运算符

语法:vect[base ± \pm ±:width]
说明:base表示起始位,+表示升序截取,-表示降序截取,width表示截取位宽;
注意:base可变但是width必须为常量;
例子:将data_in,从第3位起,正序截取4位给data_out
代码

module function_test_top(
    input       [7:0]   data_in,
    output      [3:0]   data_out  
);
    assign data_out = data_in[3+:4];
endmodule

testbench

`timescale 1ns/1ns
module function_test_tb();
    reg     [7:0]   data_in     ;
    wire    [3:0]   data_out    ;
    initial begin
        data_in = 8'b0000_0000;
        #20;
        data_in = 8'b0110_1100;
        #20;
        data_in = 8'b1101_0110;
        #20;
        data_in = 8'b1001_1100;
    end
    function_test_top u_function_test_top(
        .data_in    (data_in),
        .data_out   (data_out)
    );
endmodule

结果:
在这里插入图片描述

(4)求余运算符(%)

问题:10%(3),10%(-3),(-10)%3,(-10)%(-3)四个表达式结果为多少?
答案:1,1,-1,-1
注意点:前面的数决定符号
代码:

`timescale 1ns / 1ps
module remainder(
    output          [7:0]       out_one     ,
    output          [7:0]       out_two     ,
    output          [7:0]       out_three   ,
    output          [7:0]       out_four    
);
    assign out_one = 10%(3);
    assign out_two = 10%(-3);
    assign out_three = (-10)%(3);
    assign out_four = (-10)%(-3);
endmodule

testbench

`timescale 1ns / 1ps
module remainder_tb();
    wire          [7:0]       out_one       ;
    wire          [7:0]       out_two       ;
    wire          [7:0]       out_three     ;
    wire          [7:0]       out_four      ;
    remainder u_remainder(
        .out_one     (out_one   ),
        .out_two     (out_two   ),
        .out_three   (out_three ),
        .out_four    (out_four  )
);
endmodule

结果:
在这里插入图片描述

7.testbench知识点

(1)初始化时用阻塞赋值非阻塞赋值的不同
A描述
当初始化采用阻塞赋值,值的变化和时钟跳变同时发生,当前时钟边沿时可以采到数据变化的;
当初始化采用非阻塞赋值,值的变化会在时钟跳变发生,下一个时钟边沿才能采集到数据变化;
B例子:采集一拍数据变化
a代码

module function_test_top(
    input       sys_clk     ,
    input       sys_rst_n   ,
    input       data_in     ,
    output  reg data_out    
);
    always@(posedge sys_clk or negedge sys_rst_n)begin
        if(!sys_rst_n)
            data_out <= 1'b0;
        else
            data_out <= data_in;
    end
endmodule

b 情况一:testbench初始化阻塞赋值
testbench

`timescale 1ns/1ns
module function_test_tb();
    reg     sys_clk     ;
    reg     sys_rst_n   ;
    reg     data_in     ;
    wire    data_out    ;

    parameter T = 20;
    initial begin
        sys_clk   = 1'b1;
        sys_rst_n = 1'b0;
        data_in   = 1'b0;
        #(2*T);
        sys_rst_n = 1'b1;
        #(2*T);
        data_in  = 1'b1;
    end   
    // initial begin
    //     sys_clk   <= 1'b1;
    //     sys_rst_n <= 1'b0;
    //     data_in   <= 1'b0;
    //     #(2*T);
    //     sys_rst_n <= 1'b1;
    //     #(2*T);
    //     data_in  <= 1'b1;
    // end
    always#(T/2) sys_clk = !sys_clk;
    function_test_top u_function_test_top(
        .sys_clk     (sys_clk  ),
        .sys_rst_n   (sys_rst_n),
        .data_in     (data_in  ),
        .data_out    (data_out )
    );
endmodule

结果:
在这里插入图片描述
c 情况一:testbench初始化非阻塞赋值

`timescale 1ns/1ns
module function_test_tb();
    reg     sys_clk     ;
    reg     sys_rst_n   ;
    reg     data_in     ;
    wire    data_out    ;

    parameter T = 20;
    // initial begin
    //     sys_clk   = 1'b1;
    //     sys_rst_n = 1'b0;
    //     data_in   = 1'b0;
    //     #(2*T);
    //     sys_rst_n = 1'b1;
    //     #(2*T);
    //     data_in  = 1'b1;
    // end   
    initial begin
        sys_clk   <= 1'b1;
        sys_rst_n <= 1'b0;
        data_in   <= 1'b0;
        #(2*T);
        sys_rst_n <= 1'b1;
        #(2*T);
        data_in  <= 1'b1;
    end
    always#(T/2) sys_clk = !sys_clk;
    function_test_top u_function_test_top(
        .sys_clk     (sys_clk  ),
        .sys_rst_n   (sys_rst_n),
        .data_in     (data_in  ),
        .data_out    (data_out )
    );
endmodule

结果:
在这里插入图片描述
(2)begin end语句块和fork join语句块的不同
A begin end
描述:串行语句块
特点:
块内语句顺序执行,块内上一条语句执行完才能执行下一条语句;
最后一条语句执行完,程序跳出该语句块。
例子:

`timescale 1ns/1ns
module function_test_tb();
    reg     data_a      ;
    reg     data_b      ;
    reg     data_c      ;
    initial begin
        data_a = 1'b0;
        data_b = 1'b0;
        data_c = 1'b0;
        #(20) data_a = 1'b1;
        #(10) data_b = 1'b1;
        #(30) data_c = 1'b1;
    end
endmodule

结果:数据变化发生在20ns,30ns和60ns
在这里插入图片描述B fork join
描述:并行语句块
特点:
块内语句同时执行;
耗时最长的语句块执行完后,程序跳出该语句块。
例子

`timescale 1ns/1ns
module function_test_tb();
    reg     data_a      ;
    reg     data_b      ;
    reg     data_c      ;
    initial fork
        data_a = 1'b0;
        data_b = 1'b0;
        data_c = 1'b0;
        #(20) data_a = 1'b1;
        #(10) data_b = 1'b1;
        #(30) data_c = 1'b1;
    join 
endmodule

结果:数据变化发生在20ns,10ns和30ns
在这里插入图片描述
C 两种语句块可以嵌套使用
例子:

`timescale 1ns/1ns
module function_test_tb();
    reg     data_a      ;
    reg     data_b      ;
    reg     data_c      ;
    initial begin
        data_a = 1'b0;
        data_b = 1'b0;
        data_c = 1'b0;
        #(10) data_a = 1'b1;
        #(20) data_b = 1'b1;
        #(30) data_c = 1'b1;
        fork
            #(10) data_a = 1'b0;
            #(20) data_b = 1'b0;
            #(30) data_c = 1'b0;
        join
    end
endmodule

结果:数据上升沿发生于10ns,30ns,60ns;数据下降沿发生于70ns,80ns,90ns。
在这里插入图片描述

8.乘法器

(1)分类

verilog中根据实现方法的不同,将乘法器分为串行移位乘法器、并行乘法器、查找表乘法器和加法树乘法器。

(2)串行移位加法器

优缺点:优点是资源消耗较少,缺点是比较慢(低位算了才能算高位);
实现方法:(和我们小学学的乘法运算步骤一样,只不过需要先转换为2进制)
第一步:将被乘数和乘数换算为二进制;
第二步:将被乘数乘以乘数的每一位;
第三步:将上一步的结果左移乘数的对应位;
第四步:结果相加输出;
例子:4d’11乘以4’d5

module function_test_top(
    input           [3:0]       mul_one,
    input           [3:0]       mul_two,
    output    reg   [7:0]       data_out
);
    integer i;
    always@(*)begin
        data_out = 'd0;
        for(i=0;i<8;i=i+1)begin
            if(mul_two[i])
                data_out = data_out + (mul_one<<i);
        end
    end
endmodule
`timescale 1ns/1ns
module function_test_tb();
    reg     [3:0]   mul_one ;
    reg     [3:0]   mul_two ;
    wire    [7:0]   data_out;
    initial begin
        mul_one  = 'd0;
        mul_two  = 'd0;
        #20;
        mul_one  = 4'd11;
        mul_two  = 4'd5;      
        #20;
        mul_one  = 4'd6;
        mul_two  = 4'd3;       
    end
    function_test_top u_function_test_top(
        .mul_one        (mul_one ),
        .mul_two        (mul_two ),
        .data_out       (data_out)
);
endmodule

电路:
在这里插入图片描述

结果:(结果以10进制数显示)
在这里插入图片描述

(3)并行乘法器

优缺点:优点速度快(高低位同时算),缺点是资源消耗较多;
实现方法:直接用乘法运算符实现;
例子:4d’11乘以4’d5

`timescale 1ns / 1ps
module mutplier_test(
    input           [3:0]       mul_one,
    input           [3:0]       mul_two,
    output          [7:0]       data_out
);
    assign data_out = mul_one*mul_two;
endmodule

testbench

`timescale 1ns / 1ps
module mutiplier_test_tb();
    reg     [3:0]   mul_one ;
    reg     [3:0]   mul_two ;
    wire    [7:0]   data_out;
    initial begin
        mul_one  = 'd0;
        mul_two  = 'd0;
        #20;
        mul_one  = 4'd11;
        mul_two  = 4'd5;      
        #20;
        mul_one  = 4'd6;
        mul_two  = 4'd3;       
    end
    mutplier_test u_mutplier_test(
        .mul_one        (mul_one ),
        .mul_two        (mul_two ),
        .data_out       (data_out)
);
endmodule

电路:
在这里插入图片描述

在这里插入图片描述

(4)查找表乘法器和加法树乘法器这里不再详述

9.用户定义原语(UDP)

(1)简述

用户定义原语由User Defined Primitives直接翻译得到,简称UDP。主要是用来自定义仿真使用的基本逻辑器件模块。UDP是由查找表的方法确定输出,用仿真器仿真时,速度快只能描述能用简单真值表表示的组合或者时序逻辑

(2)语法

primitive  元件名(输出端口名,输入端口名1,输入端口名2,输入端口名3,...... ,输入端口名n)
    output  输出端口名;
    input   输入端口名1,输入端口名2,输入端口名3,...... ,输入端口名n;
    reg     输出端口名;
    initial begin
        输出端口寄存器或时序逻辑内部寄存器赋初值(0,1或X);
    end
    table
     //输入1    输入2    输入3    输入4    ...    输入n       :输出     ;
      逻辑值    逻辑值   逻辑值   逻辑值   ...     逻辑值      :逻辑值   ;
      逻辑值    逻辑值   逻辑值   逻辑值   ...     逻辑值      :逻辑值   ;
      逻辑值    逻辑值   逻辑值   逻辑值   ...     逻辑值      :逻辑值   ;
      逻辑值    逻辑值   逻辑值   逻辑值   ...     逻辑值      :逻辑值   ;
      endtable

endprimitive

(3)注意事项

A 可以有多个输入端,但是只能有一个输出端;
B 所有端口只能有一位位宽;
C 在真值表中只能出现0,1,x三种逻辑,高阻态z是不允许的;
D initial语句用于时序电路内部寄存器赋初值,只允许0,1,x三种逻辑值;
E 表示时序逻辑的UDP输出必须声明位reg类型,并且可以使用initial进行初始化;
F 表示时序逻辑的UDP,状态表:<输入1><输入2>…<输入N> : <当前状态> : <下一状态>

10.generate-for注意点

(1)generate-for循环必须使用genvar关键字定义循环变量;
(2)generate-for循环中的内容必须使用begin-end包括起来,哪怕只有一句;
(3)generate-for循环begin后的名字不可以省略;
(4)generate-for循环同一个模块内的begin-end块名字不能一样。

11.标识符要求

(1)标识符可以由字母、数字、下划线和$组成;
(2)标识符必须以字母或下划线(_)开头;
(3)标识符的长度不能超过1024个字符;
(4)标识符区分大小写;
(5)标识符不能是Verilog关键字,例如"module"、"endmodule"等;
(6)标识符不能包含特殊字符,例如空格、制表符等。
请注意,虽然Verilog标识符允许使用数字,但是最好将数字用于表示信号位宽或者其它与数字相关的意义,而不是用作变量名的一部分。这有助于提高代码的可读性和可维护性
在这里插入图片描述

12.有符号数与无符号数

(1)注意

本题均以求余运算为例,求余运算注意点:被余数决定符号。
(2)整数
A)10进制数
特点:10进制数默认为有符号数。
例子:2%3和4294967294%3
说明
因为10进制数默认位宽为32位,所以2和4294967294分别表示32’b0000_0000_0000_0000_0000_0000_0000_0010和32’b1111_1111_1111_1111_1111_1111_1111_1110,实际分别为有符号数2和-2,所以余3的结果为2和-2。
代码:

`timescale 1ns / 1ps
module remainder(
    output [31:0]   out_data_1,
    output [31:0]   out_data_2
    );
    assign out_data_1 = 2%3;
    assign out_data_2 = 4294967294%3;
endmodule
`timescale 1ns / 1ps
module remainder_tb();
    wire [31:0] out_data_1;
    wire [31:0] out_data_2;
    remainder u_remainder(
        .out_data_1 (out_data_1),
        .out_data_2 (out_data_2)
    );
endmodule

结果:
在这里插入图片描述
B)未声明符号位的
特点:未声明符号位的默认为无符号数。
例子:8’b0000_0010%3和8’b1111_1110%3。
说明:
8’b0000_0010和8’b1111_1110,实际分别为无符号数2和254,所以余3的结果均为2。
代码:

`timescale 1ns / 1ps
module remainder(
    output  [7:0]   out_data_1,
    output  [7:0]   out_data_2
    );
    assign out_data_1 = (8'b0000_0010)%3;
    assign out_data_2 = (8'b1111_1110)%3;
endmodule

testbench

`timescale 1ns / 1ps
module remainder_tb();
    wire [7:0] out_data_1;
    wire [7:0] out_data_2;
    remainder u_remainder(
        .out_data_1 (out_data_1 ),
        .out_data_2 (out_data_2 )
    );
endmodule

结果:
在这里插入图片描述
C)声明了符号位的
特点:声明符号位的为有符号数。
例子:(声明有符号在进制符号前加s
8’sb0000_0010%3和8’sb1111_1110%3。
说明:
8’sb0000_0010和8’sb1111_1110%3,实际分别为有符号数2和-2,所以余3的结果为2和-2。
代码:

`timescale 1ns / 1ps
module remainder(
    output  [7:0]   out_data_1,
    output  [7:0]   out_data_2
    );
    assign out_data_1 = (8'sb0000_0010)%3;
    assign out_data_2 = (8'sb1111_1110)%3;
endmodule

testbench

`timescale 1ns / 1ps
module remainder_tb();
    wire [7:0] out_data_1;
    wire [7:0] out_data_2;
    remainder u_remainder(
        .out_data_1 (out_data_1 ),
        .out_data_2 (out_data_2 )
    );
endmodule

结果:
在这里插入图片描述

(2)变量

A)注意点
一个任意类型的数(无论是有符号数还是无符号),赋值给一个变量后,其类型由被赋值的类型确定;
wire和reg类型变量,默认类型为无符号数,要定义其为有符号数要用关键字signed;
integer类型变量默认为有符号数,不用声明其类型;
B wirereg
例子+说明:
四个无符号数8’b0000_0010,8’b1111_1110和8’b0000_0010,8’b1111_1110;
赋值给无符号变量后实际值为2,254和2,-2;
所以余3的结果为:2,2,和2,-2。
代码:

`timescale 1ns / 1ps
module remainder(
        input               [7:0]   indata_uns_one ,
        input               [7:0]   indata_uns_two ,
        input     signed    [7:0]   indata_sig_one ,
        input     signed    [7:0]   indata_sig_two ,
        output              [7:0]   out_data_1     ,
        output              [7:0]   out_data_2     ,
        output              [7:0]   out_data_3     , 
        output              [7:0]   out_data_4        
    );
    assign out_data_1 = indata_uns_one%3;
    assign out_data_2 = indata_uns_two%3;
    assign out_data_3 = indata_sig_one%3;
    assign out_data_4 = indata_sig_two%3;
endmodule
`timescale 1ns / 1ps
module remainder_tb();
    reg             [7:0]  indata_uns_one;
    reg             [7:0]  indata_uns_two;
    reg  signed     [7:0]  indata_sig_one;
    reg  signed     [7:0]  indata_sig_two;
    wire            [7:0]  out_data_1;
    wire            [7:0]  out_data_2;
    wire            [7:0]  out_data_3;
    wire            [7:0]  out_data_4;
    initial begin
        indata_uns_one = 8'b0;
        indata_uns_two = 8'b0;
        indata_sig_one = 8'b0;
        indata_sig_two = 8'b0;
        #20;
        indata_uns_one = 8'b0000_0010;
        indata_uns_two = 8'b1111_1110;
        indata_sig_one = 8'b0000_0010;
        indata_sig_two = 8'b1111_1110;
    end
    remainder u_remainder(
        .indata_uns_one (indata_uns_one),
        .indata_uns_two (indata_uns_two),
        .indata_sig_one (indata_sig_one),
        .indata_sig_two (indata_sig_two),
        .out_data_1     (out_data_1 ),
        .out_data_2     (out_data_2 ),
        .out_data_3     (out_data_3 ),
        .out_data_4     (out_data_4 )
    );
endmodule

结果
在这里插入图片描述

(3)有符号数和无符号数运算

规则:
两个无符号数,按照无符号数规则运算;
两个有符号数,按照无符号数规则运算;
一个有符号数一个无符号数,按照无符号数规则运算。
例子+说明:
情况一:两个无符号数8’b1111_1110和8’b0000_0011,实际值为254和3,求余结果为8‘b0000_0010即2;
情况二:两个有符号数8’b1111_1110和8’b0000_0011,实际值为-2和3,求余结果为8‘b1111_1110即-2;
情况二:有符号数8’b1111_1110和无符号数8’b0000_0011,实际值为-2和3均转换为无符号数为254和3,求余结果为8‘b0000_0010即-2。

(4) #### 注意

所有运算分两步看:以(3)情况二为例
第一步:在求赋值前的值,两个有符号数-3余3为-2,即8’b1111_1110;
第二步:由被赋值变量看形式,8’b1111_1110是无符号数254还是有符号数-2,由存储他的变量out_data_2决定。out_data_2是无符号变量,结果8’b1111_1110就是无符号数254;out_data_2是有符号变量,结果8’b1111_1110就是有符号数-2。

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

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

相关文章

CTFSHOW -SQL 注入

重新来做一遍 争取不看wp web171 基本联合注入 拿到题目我们已经知道了是sql注入 所以我们可以直接开始 第一题 不会难道哪里去 所以我们直接进行注入即可 1 and 12-- 1 and 11-- 实现闭合 -1unionselect1,2,3--%2b 查看字段数-1unionselect1,database(),3--%2b 查看数据…

【vue】虚拟dom的原理是什么?手写实现虚拟dom !

1.虚拟dom的原理 虚拟 DOM 是对 DOM 的抽象&#xff0c;本质上就是用 JavaScript 对象来描述 DOM 结构。Vue.js 中关于虚拟 DOM 的实现主要进行了以下几个步骤&#xff1a; 1.生成虚拟 DOM&#xff1a; Vue.js 使用 render 函数来依据模板代码生成虚拟 DOM。在这个过程中&a…

Ansible playbook详解

playbook是ansible用于配置&#xff0c;部署&#xff0c;和被管理被控节点的剧本 playbook常用的YMAL格式&#xff1a;&#xff08;文件名称以 .yml结尾&#xff09; 1、文件的第一行应该以 "---" (三个连字符)开始&#xff0c;表明YMAL文件的开始。    2、在同一…

颜值实力“C位出道”:起亚EV6综合实力究竟怎么样?

作为起亚电动化转型的标杆之作&#xff0c;起亚EV6已在全球赢得广泛赞誉&#xff0c;连续斩获“2022欧洲年度汽车”及“2023北美年度汽车”等多项国际大奖&#xff0c;其GT版本更是荣获“2023年度世界性能车”&#xff0c;这些荣誉不仅标志着其设计和技术的国际认可&#xff0c…

安全区域边界(设备和技术注解)

网络安全等级保护相关标准参考《GB/T 22239-2019 网络安全等级保护基本要求》和《GB/T 28448-2019 网络安全等级保护测评要求》 密码应用安全性相关标准参考《GB/T 39786-2021 信息系统密码应用基本要求》和《GM/T 0115-2021 信息系统密码应用测评要求》 1边界防护 1.1应保证跨…

数据结构与算法之美学习笔记:18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?

目录 前言散列思想散列函数散列冲突解答开篇 前言 本节课程思维导图&#xff1a; Word 的单词拼写检查功能&#xff0c;虽然很小但却非常实用。你有没有想过&#xff0c;这个功能是如何实现的呢&#xff1f;其实啊&#xff0c;一点儿都不难。只要你学完今天的内容&#xff0c;…

DDD领域驱动设计模式结构图面向接口编程

DDD领域驱动设计模式结构图面向接口编程 9.资源库 在刚接触资源库(Repository)时&#xff0c;第一反应便是这就是个 DAO 层&#xff0c;访问数据库&#xff0c;然后吧啦吧啦&#xff0c;但是&#xff0c;当接触的越久&#xff0c;越发认识到第一反应是错的&#xff0c;资源库更…

HTML5学习系列之主结构

HTML5学习系列之主结构 前言HTML5主结构定义页眉定义导航定义主要区域定义文章块定义区块定义附栏定义页脚 具体使用总结 前言 学习记录 HTML5主结构 定义页眉 head表示页眉&#xff0c;用来表示标题栏&#xff0c;引导和导航作用的结构元素。 <header role"banner…

YTM32的循环冗余校验CRC外设模块详解

YTM32的循环冗余校验CRC外设模块详解 文章目录 YTM32的循环冗余校验CRC外设模块详解引言原理与机制CRC算法简介从CRC算法到CRC硬件外设 应用要点&#xff08;软件&#xff09;CRC16 用例CRC32 用例 总结参考文献 引言 在串行通信帧中&#xff0c;为了保证数据在传输过程中的完…

尝试使用php给pdf添加水印

在开发中增加pdf水印的功能是很常见的&#xff0c;经过实验发现这中间还是会有很多问题的。第一种模式&#xff0c;采用生成图片的方式把需要添加的内容保存成图片&#xff0c;再将图片加到pdf中间&#xff0c;这种方法略麻烦一些&#xff0c;不过可以解决中文乱码的问题&#…

【MySQL】库的相关操作 + 库的备份和还原

库的操作 前言正式开始创建数据库删除数据库编码集查看系统默认字符集以及校验规则字符集校验规则 所有支持的字符集和校验规则所有字符集所有校验规则 指明字符集和校验规则创建数据库相同的字符集用不同的校验规则读取会出现什么情况 alter修改数据库show create databasealt…

全国各区县平均降水月数据!多时间版本可查询

本周给大家推荐一些环境监测数据~ 今天分享的是全国平均降水数据~ 全国平均降水是指全国各个地区降水的平均值。这个值是通过收集和统计全国各地的降雨和降雪数据得出的。由于各地的气候条件和地形不同&#xff0c;因此全国平均降水并不是简单的平均数&#xff0c;而是根据各…

lora微调模版

lora微调模版 1、版一&#xff1a;使用peft包的lora微调&#xff08;1&#xff09;设置超参方式一&#xff1a;代码中设置&#xff08;便于debug&#xff09;方式二&#xff1a; .sh文件指定 &#xff08;2&#xff09;加载数据集I、对应的.jsonl或json文件, 原始格式为&#x…

【Linux】第十三站:进程状态

文章目录 一、进程状态1.运行状态2.阻塞状态3.挂起状态 二、具体Linux中的进程状态1.Linux中的状态2.R状态3.S状态4.D状态5.T、t状态6.X状态(dead)7.Z状态&#xff08;zombie&#xff09;8.僵尸进程总结9.孤儿进程总结 一、进程状态 在我们一般的操作系统学科中&#xff0c;它…

基于springboot实现家具商城管理系统项目【项目源码】

基于springboot实现家具商城系统演示 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著的优势…

Linux学习第41天:Linux SPI 驱动实验(二):乾坤大挪移

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章的思维导图如下&#xff1a; 二、I.MX6U SPI主机驱动分析 主机驱动一般都是由SOC厂商写好的。不作为重点需要掌握的内容。 三、SPI设备驱动编写流程 1、SP…

Unity中Shader的雾效

文章目录 前言一、Unity中的雾效在哪开启二、Unity中不同种类雾的区别1、线性雾2、指数雾1&#xff08;推荐用这个&#xff0c;兼具效果和性能&#xff09;3、指数雾2&#xff08;效果更真实&#xff0c;性能消耗多&#xff09; 三、在我们自己的Shader中实现判断&#xff0c;是…

Java常用类和基础API

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

Spark SQL 每年的1月1日算当年的第一个自然周, 给出日期,计算是本年的第几周

一、问题 按每年的1月1日算当年的第一个自然周 (遇到跨年也不管&#xff0c;如果1月1日是周三&#xff0c;那么到1月5号&#xff08;周日&#xff09;算是本年的第一个自然周, 如果按周一是一周的第一天) 计算是本年的第几周&#xff0c;那么 spark sql 如何写 ? 二、分析 …

蓝桥杯 插入排序

插入排序的思想 插入排序是一种简单直观的排序算法&#xff0c;其基本思想是将待排序的元素逐个插入到已排序序列 的合适位置中&#xff0c;使得已排序序列逐渐扩大&#xff0c;从而逐步构建有序序列&#xff0c;最终得到完全有序的序 列。 它类似于我们打扑克牌时的排序方式&…