ALU——调用加法乘法模块

news2024/12/23 1:27:34

只调用加法模块的仿真图:

(注:alu_control 为十六进制

001高位加载 src2的低16位加载到高16位上

002算数右移 src1算数右移  (高位补1)

004逻辑右移 src1逻辑右移 (逻辑右移直接补0)

008逻辑左移 src1逻辑左移

010异或 020或 040或非 080与

100 无符号比较 小于置位

200 有符号比较 小于置位

400 减法

800 加法

没有调用乘法器的ALU (下面那个调用了)

 alu.v

`timescale 1ns / 1ps

module alu(
    input  [11:0] alu_control, 
    input  [31:0] alu_src1, 
    input  [31:0] alu_src2,
    output   [31:0] alu_result 
    );
    reg [31:0] alu_result;
    wire alu_add;   //加法
    wire alu_sub;   //减法
    wire alu_slt;   //有符号比较,小于置位
    wire alu_sltu;  //无符号比较,小于置位
    wire alu_and;   //按位与
    wire alu_nor;   //按位或非
    wire alu_or;    //按位或 
    wire alu_xor;   //按位异或
    wire alu_sll;   //逻辑左移
    wire alu_srl;   //逻辑右移
    wire alu_sra;   //算数右移
    wire alu_lui;   //高位加载

    assign alu_mult = alu_control[11];
    assign alu_add  = alu_control[11];
    assign alu_sub  = alu_control[10];
    assign alu_slt  = alu_control[ 9];
    assign alu_sltu = alu_control[ 8];
    assign alu_and  = alu_control[ 7];
    assign alu_nor  = alu_control[ 6];
    assign alu_or   = alu_control[ 5];
    assign alu_xor  = alu_control[ 4];
    assign alu_sll  = alu_control[ 3];
    assign alu_srl  = alu_control[ 2];
    assign alu_sra  = alu_control[ 1];
    assign alu_lui  = alu_control[ 0];

    wire [31:0] add_sub_result; //加减结果,减法用加法来实现
    wire [31:0] slt_result;     //
    wire [31:0] sltu_result;    //
    wire [31:0] and_result;
    wire [31:0] nor_result;
    wire [31:0] or_result;
    wire [31:0] xor_result;
    wire [31:0] sll_result;
    wire [31:0] srl_result;
    wire [31:0] sra_result;     
    wire [31:0] lui_result;

    wire signed [31:0] temp_src1;   //带符号数的临时变量
    assign temp_src1 = alu_src1;    //方便后面对alu_src1进行算数右移
    assign and_result = alu_src1 & alu_src2;        //按位与
    assign or_result  = alu_src1 | alu_src2;        //按位或
    assign nor_result = ~or_result;                 //或非
    assign xor_result = alu_src1 ^ alu_src2;        //异或
    assign lui_result = {alu_src2[15:0], 16'd0};    //高位加载,第二个操作数的低十六位加载到高十六位上
    assign sll_result = alu_src1 << alu_src2;       //逻辑左移
    assign srl_result = alu_src1 >> alu_src2;       //逻辑右移
    assign slt_result = adder_result[31] ? 1'b1 : 1'b0;   // 带符号数小于置位
    assign sltu_result = adder_cout ? 1'b0 : 1'b1;     //无符号数小于置位
    assign sra_result = temp_src1 >>> alu_src2;     //算数右移

    wire [31:0] adder_operand1;
    wire [31:0] adder_operand2;
    wire        adder_cin     ;
    wire [31:0] adder_result  ;
    wire        adder_cout    ;
    assign adder_operand1 = alu_src1; 
    assign adder_operand2 = alu_add ? alu_src2 : ~alu_src2;     //默认进行减法,为slt和sltu服务
    assign adder_cin      = ~alu_add;  //巧妙到我都以为代码有bug
    adder adder_module(     //调用加法模块
    .A(adder_operand1),
    .B(adder_operand2),
    .Cin     (adder_cin     ),
    .S  (adder_result  ),
    .Cout    (adder_cout    )
    );
assign add_sub_result = adder_result;

	always@(*)
	begin

        if(alu_add | alu_sub)
            alu_result <= add_sub_result;
            else if(alu_slt)
            alu_result <= slt_result;
            else if(alu_sltu)
            alu_result <= sltu_result;
            else if(alu_and)
            alu_result <= and_result;
            else if(alu_nor)
            alu_result <= nor_result;
            else if(alu_or)
            alu_result <= or_result;
            else if(alu_xor)
            alu_result <= xor_result;
            else if(alu_sll)
            alu_result <= sll_result;
            else if(alu_srl)
            alu_result <= srl_result;
            else if(alu_sra)
            alu_result <= sra_result;
            else if(alu_lui)
            alu_result <= lui_result;
         
	end
endmodule

testbench.v 

`timescale 1ns / 1ps

module tb;

    // Inputs
    reg clk;
    reg [11:0] alu_control;
    reg [31:0] alu_src1;
    reg [31:0] alu_src2;

    // Outputs
    wire [31:0] alu_result;

    // Instantiate the Unit Under Test (UUT)
//alu al(
//    input  [11:0] alu_control, 
//    input  [31:0] alu_src1, 
//    input  [31:0] alu_src2,
//    output [31:0] alu_result 
//    );
alu alu_module(
            .alu_control(alu_control),
            .alu_src1   (alu_src1   ),
            .alu_src2   (alu_src2   ),
            .alu_result (alu_result )
        );
    initial begin
        // Initialize Inputs
        clk = 0;
        alu_control = 0;
        alu_src1 = 32'H10001111;
		alu_src2 = 32'H00000004;

        // Wait 100 ns for global reset to finish
        #100;
        alu_control = 12'b0000_0000_0001;
        #400;
        alu_control = 12'b0000_0000_0010;
        #500;
        alu_control = 12'b0000_0000_0100;
        #400;
        alu_control = 12'b0000_0000_1000;
        #500;
        alu_control = 12'b0000_0001_0000;
        #400;
        alu_control = 12'b0000_0010_0000;
        #500;
        alu_control = 12'b0000_0100_0000;
        #400;
        alu_control = 12'b0000_1000_0000;
		#400;
        alu_control = 12'b0001_0000_0000;
		#400;
        alu_control = 12'b0010_0000_0000;
		#400;
        alu_control = 12'b0100_0000_0000;
		#400;
        alu_control = 12'b1000_0000_0000;
        // Add stimulus here
    end
   always #5 clk = ~clk;
endmodule

 alu_display.v

module alu_display(
    //时钟与复位信号
     input clk,
    input resetn,    //后缀"n"代表低电平有效

    //拨码开关,用于选择输入数
    input [1:0] input_sel, //00:输入为控制信号(alu_control)
                           //10:输入为源操作数1(alu_src1)
                           //11:输入为源操作数2(alu_src2)

    //触摸屏相关接口,不需要更改
    output lcd_rst,
    output lcd_cs,
    output lcd_rs,
    output lcd_wr,
    output lcd_rd,
    inout[15:0] lcd_data_io,
    output lcd_bl_ctr,
    inout ct_int,
    inout ct_sda,
    output ct_scl,
    output ct_rstn
    );
//-----{调用ALU模块}begin
    reg   [11:0] alu_control;  // ALU控制信号
    reg   [31:0] alu_src1;     // ALU操作数1
    reg   [31:0] alu_src2;     // ALU操作数2
    wire  [31:0] alu_result;   // ALU结果
    alu alu_module(
        .alu_control(alu_control),
        .alu_src1   (alu_src1   ),
        .alu_src2   (alu_src2   ),
        .alu_result (alu_result )
    );
//-----{调用ALU模块}end

//---------------------{调用触摸屏模块}begin--------------------//
//-----{实例化触摸屏}begin
//此小节不需要更改
    reg         display_valid;
    reg  [39:0] display_name;
    reg  [31:0] display_value;
    wire [5 :0] display_number;
    wire        input_valid;
    wire [31:0] input_value;

    lcd_module lcd_module(
        .clk            (clk           ),   //10Mhz
        .resetn         (resetn        ),

        //调用触摸屏的接口
        .display_valid  (display_valid ),
        .display_name   (display_name  ),
        .display_value  (display_value ),
        .display_number (display_number),
        .input_valid    (input_valid   ),
        .input_value    (input_value   ),

        //lcd触摸屏相关接口,不需要更改
        .lcd_rst        (lcd_rst       ),
        .lcd_cs         (lcd_cs        ),
        .lcd_rs         (lcd_rs        ),
        .lcd_wr         (lcd_wr        ),
        .lcd_rd         (lcd_rd        ),
        .lcd_data_io    (lcd_data_io   ),
        .lcd_bl_ctr     (lcd_bl_ctr    ),
        .ct_int         (ct_int        ),
        .ct_sda         (ct_sda        ),
        .ct_scl         (ct_scl        ),
        .ct_rstn        (ct_rstn       )
    ); 
//-----{实例化触摸屏}end

//-----{从触摸屏获取输入}begin
//根据实际需要输入的数修改此小节,
//建议对每一个数的输入,编写单独一个always块
    //当input_sel为00时,表示输入数控制信号,即alu_control
    always @(posedge clk)
    begin
        if (!resetn)
        begin
            alu_control <= 12'd0;
        end
        else if (input_valid && input_sel==2'b00)
        begin
            alu_control <= input_value[11:0];
        end
    end
    
    //当input_sel为10时,表示输入数为源操作数1,即alu_src1
    always @(posedge clk)
    begin
        if (!resetn)
        begin
            alu_src1 <= 32'd0;
        end
        else if (input_valid && input_sel==2'b10)
        begin
            alu_src1 <= input_value;
        end
    end

    //当input_sel为11时,表示输入数为源操作数2,即alu_src2
    always @(posedge clk)
    begin
        if (!resetn)
        begin
            alu_src2 <= 32'd0;
        end
        else if (input_valid && input_sel==2'b11)
        begin
            alu_src2 <= input_value;
        end
    end
//-----{从触摸屏获取输入}end

//-----{输出到触摸屏显示}begin
//根据需要显示的数修改此小节,
//触摸屏上共有44块显示区域,可显示44组32位数据
//44块显示区域从1开始编号,编号为1~44,
    always @(posedge clk)
    begin
        case(display_number)
            6'd1 :
            begin
                display_valid <= 1'b1;
                display_name  <= "SRC_1";
                display_value <= alu_src1;
            end
            6'd2 :
            begin
                display_valid <= 1'b1;
                display_name  <= "SRC_2";
                display_value <= alu_src2;
            end
            6'd3 :
            begin
                display_valid <= 1'b1;
                display_name  <= "CONTR";
                display_value <={20'd0, alu_control};
            end
            6'd4 :
            begin
                display_valid <= 1'b1;
                display_name  <= "RESUL";
                display_value <= alu_result;
            end
            default :
            begin
                display_valid <= 1'b0;
                display_name  <= 40'd0;
                display_value <= 32'd0;
            end
        endcase
    end
//-----{输出到触摸屏显示}end
//----------------------{调用触摸屏模块}end---------------------//
endmodule

调用乘法器的ALU(代码扔到末尾)

 这里结果我不知道怎么只显示希望的结果(出现了0,这个是个过程值,当时做乘法器的时候,看仿真的时候是配合着mult_end信号看的,我也不会把这个end信号调出来)


slt sltu没看明白:(手册里有以后看 挖坑)

 指令(SLT,SLTI,SLTU,SLTIU)比较两个操作数然后设置目的寄存器,

                                                如果就设置为1,否则就将目的寄存器设置为0。


alu.v

`timescale 1ns / 1ps

module alu(
    input clk,
    input  [12:0] alu_control, 
    input  [31:0] alu_src1, 
    input  [31:0] alu_src2,
    output   [31:0] alu_result 
    );
    reg [31:0] alu_result;
    wire alu_mul;//乘法
    wire alu_add;   //加法
    wire alu_sub;   //减法
    wire alu_slt;   //有符号比较,小于置位
    wire alu_sltu;  //无符号比较,小于置位
    wire alu_and;   //按位与
    wire alu_nor;   //按位或非
    wire alu_or;    //按位或 
    wire alu_xor;   //按位异或
    wire alu_sll;   //逻辑左移
    wire alu_srl;   //逻辑右移
    wire alu_sra;   //算数右移
    wire alu_lui;   //高位加载


    assign alu_mul = alu_control[12];
    assign alu_add  = alu_control[11];
    assign alu_sub  = alu_control[10];
    assign alu_slt  = alu_control[ 9];
    assign alu_sltu = alu_control[ 8];
    assign alu_and  = alu_control[ 7];
    assign alu_nor  = alu_control[ 6];
    assign alu_or   = alu_control[ 5];
    assign alu_xor  = alu_control[ 4];
    assign alu_sll  = alu_control[ 3];
    assign alu_srl  = alu_control[ 2];
    assign alu_sra  = alu_control[ 1];
    assign alu_lui  = alu_control[ 0];

    wire [31:0] mul_result;
    wire [31:0] add_sub_result; //加减结果,减法用加法来实现
    wire [31:0] slt_result;     
    wire [31:0] sltu_result;    
    wire [31:0] and_result;
    wire [31:0] nor_result;
    wire [31:0] or_result;
    wire [31:0] xor_result;
    wire [31:0] sll_result;
    wire [31:0] srl_result;
    wire [31:0] sra_result;     
    wire [31:0] lui_result;

    wire signed [31:0] temp_src1;   //带符号数的临时变量
    assign temp_src1 = alu_src1;    //方便后面对alu_src1进行算数右移
    assign and_result = alu_src1 & alu_src2;        //按位与
    assign or_result  = alu_src1 | alu_src2;        //按位或
    assign nor_result = ~or_result;                 //或非
    assign xor_result = alu_src1 ^ alu_src2;        //异或
    assign lui_result = {alu_src2[15:0], 16'd0};    //高位加载,第二个操作数的低十六位加载到高十六位上
    assign sll_result = alu_src1 << alu_src2;       //逻辑左移
    assign srl_result = alu_src1 >> alu_src2;       //逻辑右移
    assign slt_result = adder_result[31] ? 1'b1 : 1'b0;   // 带符号数小于置位
    assign sltu_result = adder_cout ? 1'b0 : 1'b1;     //无符号数小于置位
    assign sra_result = temp_src1 >>> alu_src2;     //算数右移

    wire [31:0] adder_operand1;
    wire [31:0] adder_operand2;
    wire        adder_cin     ;
    wire [31:0] adder_result  ;
    wire        adder_cout    ;
    assign adder_operand1 = alu_src1; 
    assign adder_operand2 = alu_add ? alu_src2 : ~alu_src2;     //默认进行减法,为slt和sltu服务
    assign adder_cin      = ~alu_add;  //巧妙到我都以为代码有bug
    adder adder_module(     //调用加法模块
    .A(adder_operand1),
    .B(adder_operand2),
    .Cin     (adder_cin     ),
    .S  (adder_result  ),
    .Cout    (adder_cout    )
    );
assign add_sub_result = adder_result;



    wire         clk;      // 时钟
 //   wire        mult_begin; // 乘法开始信号
    wire  [31:0] mult_op1;  // 乘法源操作数1
    wire [31:0] mult_op2;  // 乘法源操作数2
     wire [63:0] product;   // 乘积
     wire        mult_end ;  // 乘法结束信号
     
        assign mult_op1 = alu_src1; 
         assign mult_op2 =alu_src2;
       assign mult_begin=1;
         
         multiply multiply_module//调用乘法模块  
         (     
         .clk(clk),
         .mult_begin(mult_begin),
         .mult_op1     (alu_src1 ),
         .mult_op2  (alu_src2 ),
         .product    ( product ),
         .mult_end ()
         );
      assign mul_result =product ;
      
	always@(*)
	begin

        if(alu_add | alu_sub)
            alu_result <= add_sub_result;
            else if(alu_mul)
            alu_result =mul_result;
            else if(alu_slt)
            alu_result <= slt_result;
            else if(alu_sltu)
            alu_result <= sltu_result;
            else if(alu_and)
            alu_result <= and_result;
            else if(alu_nor)
            alu_result <= nor_result;
            else if(alu_or)
            alu_result <= or_result;
            else if(alu_xor)
            alu_result <= xor_result;
            else if(alu_sll)
            alu_result <= sll_result;
            else if(alu_srl)
            alu_result <= srl_result;
            else if(alu_sra)
            alu_result <= sra_result;
            else if(alu_lui)
            alu_result <= lui_result;
            
	end
endmodule

alu.display (就改了个信号数组的范围)

module alu_display(
    //时钟与复位信号
     input clk,
    input resetn,    //后缀"n"代表低电平有效

    //拨码开关,用于选择输入数
    input [1:0] input_sel, //00:输入为控制信号(alu_control)
                           //10:输入为源操作数1(alu_src1)
                           //11:输入为源操作数2(alu_src2)

    //触摸屏相关接口,不需要更改
    output lcd_rst,
    output lcd_cs,
    output lcd_rs,
    output lcd_wr,
    output lcd_rd,
    inout[15:0] lcd_data_io,
    output lcd_bl_ctr,
    inout ct_int,
    inout ct_sda,
    output ct_scl,
    output ct_rstn
    );
//-----{调用ALU模块}begin
    reg   [12:0] alu_control;  // ALU控制信号
    reg   [31:0] alu_src1;     // ALU操作数1
    reg   [31:0] alu_src2;     // ALU操作数2
    wire  [31:0] alu_result;   // ALU结果
    alu alu_module(
        .alu_control(alu_control),
        .alu_src1   (alu_src1   ),
        .alu_src2   (alu_src2   ),
        .alu_result (alu_result )
    );
//-----{调用ALU模块}end

//---------------------{调用触摸屏模块}begin--------------------//
//-----{实例化触摸屏}begin
//此小节不需要更改
    reg         display_valid;
    reg  [39:0] display_name;
    reg  [31:0] display_value;
    wire [5 :0] display_number;
    wire        input_valid;
    wire [31:0] input_value;

    lcd_module lcd_module(
        .clk            (clk           ),   //10Mhz
        .resetn         (resetn        ),

        //调用触摸屏的接口
        .display_valid  (display_valid ),
        .display_name   (display_name  ),
        .display_value  (display_value ),
        .display_number (display_number),
        .input_valid    (input_valid   ),
        .input_value    (input_value   ),

        //lcd触摸屏相关接口,不需要更改
        .lcd_rst        (lcd_rst       ),
        .lcd_cs         (lcd_cs        ),
        .lcd_rs         (lcd_rs        ),
        .lcd_wr         (lcd_wr        ),
        .lcd_rd         (lcd_rd        ),
        .lcd_data_io    (lcd_data_io   ),
        .lcd_bl_ctr     (lcd_bl_ctr    ),
        .ct_int         (ct_int        ),
        .ct_sda         (ct_sda        ),
        .ct_scl         (ct_scl        ),
        .ct_rstn        (ct_rstn       )
    ); 
//-----{实例化触摸屏}end

//-----{从触摸屏获取输入}begin
//根据实际需要输入的数修改此小节,
//建议对每一个数的输入,编写单独一个always块
    //当input_sel为00时,表示输入数控制信号,即alu_control
    always @(posedge clk)
    begin
        if (!resetn)
        begin
            alu_control <= 12'd0;
        end
        else if (input_valid && input_sel==2'b00)
        begin
            alu_control <= input_value[11:0];
        end
    end
    
    //当input_sel为10时,表示输入数为源操作数1,即alu_src1
    always @(posedge clk)
    begin
        if (!resetn)
        begin
            alu_src1 <= 32'd0;
        end
        else if (input_valid && input_sel==2'b10)
        begin
            alu_src1 <= input_value;
        end
    end

    //当input_sel为11时,表示输入数为源操作数2,即alu_src2
    always @(posedge clk)
    begin
        if (!resetn)
        begin
            alu_src2 <= 32'd0;
        end
        else if (input_valid && input_sel==2'b11)
        begin
            alu_src2 <= input_value;
        end
    end
//-----{从触摸屏获取输入}end

//-----{输出到触摸屏显示}begin
//根据需要显示的数修改此小节,
//触摸屏上共有44块显示区域,可显示44组32位数据
//44块显示区域从1开始编号,编号为1~44,
    always @(posedge clk)
    begin
        case(display_number)
            6'd1 :
            begin
                display_valid <= 1'b1;
                display_name  <= "SRC_1";
                display_value <= alu_src1;
            end
            6'd2 :
            begin
                display_valid <= 1'b1;
                display_name  <= "SRC_2";
                display_value <= alu_src2;
            end
            6'd3 :
            begin
                display_valid <= 1'b1;
                display_name  <= "CONTR";
                display_value <={20'd0, alu_control};
            end
            6'd4 :
            begin
                display_valid <= 1'b1;
                display_name  <= "RESUL";
                display_value <= alu_result;
            end
            default :
            begin
                display_valid <= 1'b0;
                display_name  <= 40'd0;
                display_value <= 32'd0;
            end
        endcase
    end
//-----{输出到触摸屏显示}end
//----------------------{调用触摸屏模块}end---------------------//
endmodule

testbench.v

`timescale 1ns / 1ps

module tb;

    // Inputs
    reg clk;
    reg [12:0] alu_control;
    reg [31:0] alu_src1;
    reg [31:0] alu_src2;
    // Outputs
    wire [31:0] alu_result;

    // Instantiate the Unit Under Test (UUT)
//alu al(
//    input  [11:0] alu_control, 
//    input  [31:0] alu_src1, 
//    input  [31:0] alu_src2,
//    output [31:0] alu_result 
//    );
alu alu_module(
            .clk(clk),
            .alu_control(alu_control),
            .alu_src1   (alu_src1   ),
            .alu_src2   (alu_src2   ),
            .alu_result (alu_result )
        );
    initial begin
        // Initialize Inputs
        clk = 0;
        alu_control = 0;
        alu_src1 = 32'H10001111;
		alu_src2 = 32'H00000004;

        // Wait 100 ns for global reset to finish
        #100;
        alu_control = 13'b00000_0000_0001;
        #400;
        alu_control = 13'b00000_0000_0010;
        #500;
        alu_control = 13'b00000_0000_0100;
        #400;
        alu_control = 13'b00000_0000_1000;
        #500;
        alu_control = 13'b00000_0001_0000;
        #400;
        alu_control = 13'b00000_0010_0000;
        #500;
        alu_control = 13'b00000_0100_0000;
        #400;
        alu_control = 13'b00000_1000_0000;
		#400;
        alu_control = 13'b00001_0000_0000;
		#400;
        alu_control = 13'b00010_0000_0000;
		#400;
        alu_control = 13'b00100_0000_0000;
		#400;
        alu_control = 13'b01000_0000_0000;
        #400;
         alu_control = 13'b10000_0000_0000;
        // Add stimulus here
    end
   always #5 clk = ~clk;
endmodule

multiply.v 和 add.v 之前的记录里有。


 

         一般认为“>>>”在Verilog里是算术右移指令,但实操中发现它有时会在右移时仍然补零,即使符号位为1。这是因为“>>>”会先判断这个操作数是否有符号数。如果是无符号数,则补零,是有符号数,才会补符号位。而一般使用的reg operand; 这种变量定义法默认所定义的变量为无符号数,因此只补零。

Result = operandB >>> operandA;  //错误示范

    解决办法是利用Verilog的内置函数$signed(),将被移位的操作数转为有符号数类型。

Result = ($signed(operandB)) >>> operandA;  //更正后

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

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

相关文章

MagicPods(在Windows电脑上可以实现airpods2弹窗,查看单个耳机电量、充电仓电量)

1.MagicPods的安装方式 Windows电脑下打开Microsoft Store,进入后搜索Magicpods。然后就可以点击下载。&#xff08;软件的费用是12元&#xff0c;可以先免费试用&#xff09; 有可能会出现&#xff1a;下载任何微软商店应用程序都显示错误代码: 0x80240438 解决方法&#xf…

基于HTML+CSS+JS制作商城(web前端网页制作课作业)---手机主题 7页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&#…

ER图到关系模型的转换和练习SQL语言

目录 一、实验要求 二、作业1解答 1&#xff0e;ER图 2&#xff0e;关系模型&#xff1a; 三、作业2解答 1. 建表并插入数据 2. 使用查询语句查询相关信息 查询计算机系男生的信息&#xff1a; 查询鹿晗的年龄 查询姓名第二个字为“丽”的同学的信息 按照性别列出男…

跨境人,是继续坚守还是求新变新?(Starday)

与以往相比&#xff0c;跨境电商行业圈有许多让卖家难以想象的负面新闻&#xff0c;从亚马逊封号潮、海运价格暴涨、服务商跑路、跨境电商公司倒闭等新闻常有耳闻&#xff0c;今年黑五等销售季的单量也让人不忍直视&#xff0c;许多跨境人战战兢兢&#xff0c;心中非常焦虑。如…

ANSYS mechanical如何在Workbench环境中使用高性能计算

ANSYS mechanical属于隐式结构有限元分析求解器&#xff0c;一般完成一个有限元分析过程需要前处理、求解和后处理三个步骤。前处理一般在图形工作站上完成&#xff0c;有限元求解可在工作站、集群及SMP 服务器上进行。 对于中小型问题&#xff08;例如1000 万节点以内的ANSYS…

基于Webrtc的视频通话录制功能-Android实现

基于Webrtc的视频通话录制功能-Android实现 webrtc本身并不支持视频通话的录制。 webrtc的sdk只是暴露了视频数据给开发者&#xff0c;而音频数据并没有向外暴露。 因此如果要进行视频通话的录制&#xff0c;需要修改webrtc的sdk&#xff0c;将音频数据暴露出来。 webrtc的下载…

【OpenCV-Python】教程:3-9 轮廓(4)更多函数

OpenCV Python 轮廓 【目标】 凸性缺陷查找点与多边形的关系不同形状的匹配 【代码】 左图中红色点为凸性检测的缺陷点&#xff0c;即凹点 右图为了验证点与多边形关系而做的图&#xff0c;也是官网要求做的练习。 import cv2 import numpy as np img cv2.imread(star.png…

契约锁电子签助力拍卖业务网上签约,保全证据、不可抵赖,成交快

近年&#xff0c;二手车、房产、股权、数字藏品以及法律诉讼资产的拍卖&#xff0c;逐步从线下向线上转型。电子签章技术的应用&#xff0c;解决了委托拍卖合同、竞买合同以及成交确认书等文件线上签署难题&#xff0c;帮助拍卖机构建立全程数字化的“网上拍卖”渠道&#xff0…

Java本地搭建宝塔部署实战springboot智慧物业管理源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套基于若依开发的springboot智慧物业管理系统的源码&#xff0c;系统是前后端分离的架构&#xff0c;前端使用Vue2&#xff0c;后端使用SpringBoot2。 技术架构 技术框架&#xff1a;SpringBoot…

5G工业互联网的“下半场”该拼什么?

据工信部11月21日最新发布的《2022年1-10月份通信业经济运行情况》显示&#xff0c;截止10月末&#xff0c;国内5G基站总数已达到225万个&#xff0c;占全球5G基站数比例超70%。截止今年8月末&#xff0c;国内已提前完成全年建成200万个5G基站的目标。中国在5G网络建设、终端普…

Echarts-实现3D柱状图显示,并单个柱子变色

如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>模拟3D柱状图渐变色柱子</title><scripttype"text/javascript"src"https://cdn.jsdelivr.net/npm/echarts5/dist/echarts.min.…

java每一练(3)

java每日一练(3) 单选部分 &#xff1a; 1.以下代码运行输出的是 public class Person{private String name "Person";int age0; }class Child extends Person{public String grade;public static void main(String[] args){Person p new Child();System.out.pri…

JavaWeb之Maven学习

目录Maven 简介仓库的分类Maven 坐标Maven 常用命令Maven 生命周期依赖管理删除Maven 项目导入项目最后Maven 简介 Maven的作用&#xff1a; Maven是专门用于管理和构建Java项目的工具 它的主要功能有&#xff1a; 提供了一套标准化的项目结构 提供了一套标准化的构建流程…

sqli-labs/Less-60

这一关还是一如既往的5次机会 一如既往的是以id作为注入点的 我们还是按照先前的做法第一轮先去获取一下注入类型以及决定下一轮要使用的注入方法 第二轮在进行各种爆破操作 首先输入id1 and 12判断注入类型是否属于数字型 回显如下 属于字符型 然后输入1 回显如下 说明不属于…

看世界杯效应下的中东市场,开发攻略来了

卡塔尔世界杯正如火如荼开展中&#xff0c;作为首次在中东地区举办的世界杯&#xff0c;它吸引了全世界目光的同时&#xff0c;也带来了一大波消费和需求。 先看一则新闻&#xff0c;在11月22日晚&#xff0c;沙特队在卡塔尔世界杯首战上演惊天大逆转&#xff0c;以2比1击败夺…

深入浅出DDD编程

作者 | 刘嘿嘿、离夏、立羽 导读 最近几年&#xff0c;微服务拆分大行其道&#xff0c;在业务越来越复杂的情况下&#xff0c;许多业务纷纷抛弃了传统单体架构&#xff0c;拥抱微服务。但随着微服务的拆分结束&#xff0c;大家又发现了新的问题&#xff0c;比如服务间逻辑复杂&…

计算机毕业设计之java+ssm峰值预警停车场管理系统

项目介绍 随着城市建设与经济的不断发展,城市车辆的数量也不断增涨,为解决停车问题修建停车场。基于经营、安全、管理等多角度的考虑&#xff0c;希望在目前传统的大型车库管理系统中有机地结合车牌识别技术&#xff0c;以求得日后在停车库运营时更安全、管理上更细致、经营中…

SuperMap 云原生常见问题解决办法-keycloak启动异常

有些客户在使用iManager for K8S 云套件的产品的时候&#xff0c;偶尔会遇到机器异常重启的情况&#xff0c;比如说服务器断电&#xff0c;重启后可能会出现云套件启动异常的情况&#xff0c;比如说keycloak启动不了&#xff0c;一直抛出异常导致服务无法正常使用。本篇文章就结…

MongoDB故障转移案例详细操作

MOngoDB故障转移 文章目录MOngoDB故障转移1.数据库提权操作1.1.使用命令查询主库信息1.2.给db02升级权重1.3.修改完成后进行加载配置1.4.主库执行降级操作2.恢复主库权限2.1.先给库权重降低2.2.执行降级命令2.3.恢复成功MongoDB的主从目前是我们在配置副本集的时候设置但是如果…

强化深度学习中使用Dyna-Q算法确定机器人问题中不同规划的学习和策略实战(超详细 附源码)

需要源码请点赞关注收藏后评论区留下QQ并且私信~~~ 一、模型、学习、规划简介 1&#xff1a;模型 Agent可以通过模型来预测环境并做出反应&#xff0c;这里所说的模型通常指模拟模型&#xff0c;即在给定一个状态和动作时&#xff0c;通过模型可以对下一状态和奖赏做出预测 …