Barrel Shifter RTL Combinational Circuit

news2024/10/7 18:23:52

在本博客中,将围绕许多设计中存在的非常有用的电路(桶形移位器电路)设计电路。将从最简单的方法开始实现固定位宽字的单向旋转桶形移位器,最后设计一个具有可参数化字宽的多功能双向桶形移位器电路。

Barrel Shifter

桶形移位器是一种数字电路,可以将数据字移位指定位数,而不使用任何顺序逻辑,仅使用纯组合逻辑。它有一个控制输入,指定它移动的位数。桶移位器类似于移位寄存器(多位),不同之处在于寄存器的移位位被移回寄存器的另一端。例如,在右移操作中,从寄存器移出的 LSB 被移入 MSB。

桶形移位器适用于数字信号处理器和处理器。

实现桶形移位器的一种方法是作为一系列多路复用器,其中一个多路复用器的输出以取决于移位距离的方式连接到下一个多路复用器的输入。当使用一系列移位多路复用器实现桶式移位器时,对于不同的 k k k 值,每个多路复用器将一个字移位 2 k 2^k 2k 位位置( 1 , 2 , 4 , 8 , 16 , 32... 1,2,4,8,16,32... 1,2,4,8,16,32...)。复用级的数量与输入向量的宽度有关。

下图显示了 32 位字的右移桶形移位器。
在这里插入图片描述
通过更复杂的多路复用器和一些用于处理末端填充选项的额外电路,桶形移位器可以处理处理器指令集中的所有标准位移指令。

Simple 8-bit right rotator

从最简单、最直接的方法开始,使用包含所有可能旋转组合的 case 语句,在 Verilog HDL 中对右移桶形移位器进行编程。

将设计一个简单的 8 位桶式移位器,它可以向右旋转任意位数。该电路有一个 8 位数据输入 data 和一个 3 位控制信号 amt,它指定要旋转的量。
该设计使用选定的信号分配语句来详尽地列出 amt 信号和相应旋转结果的所有组合。
使用 case 语句的 SystemVerilog 实现

`timescale 1ns / 10ps

module barrel_shifter_built_case(
    input logic [7:0] data,
    input logic [2:0] amt,
    output logic [7:0] out
);

    always_comb
    begin
        case (amt)
            3'o0: out = data;
            3'o1: out = {data[0], data[7:1]};
            3'o2: out = {data[1:0], data[7:2]};
            3'o3: out = {data[2:0], data[7:3]};
            3'o4: out = {data[3:0], data[7:4]};
            3'o5: out = {data[4:0], data[7:5]};
            3'o6: out = {data[5:0], data[7:6]};
            default  out = {data[6:0], data[7]};
        endcase
    end
endmodule

Test bench and simulation
测试台使用 for 循环来迭代指示旋转量的信号的所有可能性。

`timescale 1ns / 10ps

module barrel_shifter_built_case_testbench;
    logic [7:0] data;
    logic [2:0] amt;
    logic [7:0] out;

    barrel_shifter_built_case uut(.*);

    initial begin
        for (byte i = 0; i < 8; ++i)
            begin
                data = 8'b1111_0000; amt = 3'(i); #10;
            end
        $stop;
    end

endmodule

在示波器图像中,可以看到值如何移至右侧 amt 位、LSB 位,以及 MSB 如何填充溢出位,从而从左到右旋转信息。
在这里插入图片描述#### RTL Elaborated Design Schematics

这种设计桶形移位器的方法意味着使用宽 3 至 8 多路复用器

在这里插入图片描述
该代码很简单,但意味着一个宽复用器,这使得合成变得困难并导致较大的传播延迟。

如果输入位数增加就会很麻烦。

综合设计原理图

在这里插入图片描述

Simple staged 8-bit right rotator

或者,我们可以分阶段构建电路。在第 n n n 级中,输入信号要么直接传递到输出,要么向右旋转 2 n 2^n 2n 个位置。第 n n n级由 a m t amt amt 信号的第 n n n 位控制。
如果 a m 2 , a m 1 , a m 0 {am2, am1, am0} am2,am1,am0 a m t amt amt 信号的3位,则三级后总旋转量为 a m 2 ∗ 2 2 + a m 1 ∗ 2 + a m 0 am2 * 2^2 + am1 * 2 + am0 am222+am12+am0,这就是所需的旋转量。

`timescale 1ns / 10ps

module barrel_shifter_staged(
    input logic [7:0] data,
    input logic [2:0] amt,
    output logic [7:0] out
);

    logic [7:0] stage0;
    logic [7:0] stage1;

    always_comb
    begin
        //stage 0, shift 0 or 1 bit
        if(amt[0]) begin
            stage0 = {data[0], data[7:1]};
        end else
            begin
                stage0 = data;
            end

        //stage 1, shift 0 or 2 bits
        if(amt[1]) begin
            stage1 = {stage0[1:0], stage0[7:2]};
        end else
            begin
                stage1 = stage0;
            end

        //stage 2, shift 0 or 4 bits
        if(amt[2]) begin
            out = {stage1[3:0], stage1[7:4]};
        end else
            begin
                out = stage1;
            end
    end

endmodule

或者使用“?:”三元表达式更紧凑但并不更清晰。

module barrel_shifter_staged(
    input logic [7:0] data,
    input logic [2:0] amt,
    output logic [7:0] out
);

    logic [7:0] s0;
    logic [7:0] s1;

    assign s0  = amt[0]? {data[0], data[7:1]} :data ;
    assign s1  = amt[1]? {s0[1:0], s0[7:2]} :s0 ;
    assign out = amt[2]? {s1[3:0], s1[7:4]} :s1;
endmodule

该电路现在使用一系列 2 比 1 多路复用器
The circuit now uses a series of 2 to 1 multiplexors

在这里插入图片描述在这里插入图片描述

Multi-function barrel shifter. Rotating right or left.

将通过添加一个新信号使我们的桶式移位器变得复杂一些,该信号允许控制位移位的方向。通过这个信号,可以告诉桶形移位器电路,是否希望输出的位向右或向左移动一定数量的位。
这个8位移位电路可以执行右旋转和左旋转操作。附加的 1 位控制信号 dir_lr 指定所需的方向。
首先,将使用一个右循环电路、一个左循环电路和 2 对 1 多路复用器来设计电路来选择所需的结果。
A possible SystemVerilog implementation

`timescale 1ns / 10ps
const logic ROTATE_LEFT = 1'b1;
const logic ROTATE_RIGHT = 1'b0;

module barrel_shifter_multifunction(
    input logic [7:0] data,
    input logic [2:0] amt,
    input logic dir_lr, // 1 rotate left, 0 rotate right
    output logic [7:0] out
);
    logic [7:0] outl;
    logic [7:0] outr;
    barrel_shifter_right bsr(.*, .out(outr));
    barrel_shifter_left bsl(.*, .out(outl));

    assign out = dir_lr == ROTATE_LEFT ? outl:outr;

endmodule

// rotates amt bits of data to the right
module barrel_shifter_right(
    input logic [7:0] data,
    input logic [2:0] amt,
    output logic [7:0] out
);

    logic [7:0] s0;
    logic [7:0] s1;
    //stage 0, shift 0 or 1 bit
    assign s0 =  amt[0]? {data[0], data[7:1]} :data ;
    //stage 1, shift 0 or 2 bits
    assign s1 =  amt[1]? {s0[1:0], s0[7:2]} :s0 ;
    //stage 1, shift 0 or 4 bits
    assign out = amt[2]?{s1[3:0], s1[7:4]} :s1;
endmodule

// rotates amt bits of data to the left
module barrel_shifter_left(
    input logic [7:0] data,
    input logic [2:0] amt,
    output logic [7:0] out
);

    logic [7:0] s0;
    logic [7:0] s1;
    //stage 0, shift 0 or 1 bit
    assign s0 = amt[0]? { data[6:0], data[7]} :data ;
    //stage 1, shift 0 or 2 bits
    assign s1 = amt[1]? { s0[5:0], s0[7:6]} :s0 ;
    //stage 1, shift 0 or 4 bits
    assign out = amt[2]?{s1[3:0], s1[7:4]} :s1;
endmodule

该代码包括两个 8 位旋转移位器,一个向右,一个向左。使用 1 至 2 多路复用器,选择移位器之一的输出。

在这里插入图片描述
两个扩展移位器,每个移位器有3个1对2多路复用器,用于3位移位量信号所需的每一级。
在这里插入图片描述
Test-bench and simulation
测试台代码循环遍历两种可能的移位情况(左和右)的所有可能的移位量可能性。

module barrel_shifter_multifunction_testbench;
    logic [7:0] data;
    logic [2:0] amt;
    logic [7:0] out;
    logic dir_lr;

    barrel_shifter_multifunction uut(.*);

    initial begin
        assign dir_lr = ROTATE_LEFT;
        for (byte i = 0; i < 8; ++i)
            begin
                data = 8'b1111_0000; amt = 3'(i); #10;
            end
        assign dir_lr = ROTATE_RIGHT;
        for (byte i = 0; i < 8; ++i)
            begin
                data = 8'b1111_0000; amt = 3'(i); #10;
            end
        $stop;
    end

Simulation

范围视图首先显示原始字符串 8’b1111_0000 的所有左移情况,然后显示所有右移情况
在这里插入图片描述
综合设计使用 44 个cells
在这里插入图片描述

Multi-function 8-bit barrel shifter with pre and post reversing circuits

该电路也可以通过一个带有前置和后置反转电路的旋转移位器来实现,因此基本的多路复用功能可以执行这两种操作。反转电路要么传递原始输入,要么按位反转输入。

`timescale 1ns / 10ps
const logic ROTATE_LEFT = 1'b1;
const logic ROTATE_RIGHT = 1'b0;

// Barrel Shifter using a Rotate-right-shifter with pre- and post-reversing circuits
module barrel_shifter_multi_rev(
    input logic [7:0] data,
    input logic [2:0] amt,
    input logic dir_lr, // 1 rotate left, 0 rotate right
    output logic [7:0] out
);
    logic [7:0] out_right; // output result
    logic [7:0] reversed_outr; // reversed output rotation for right rotation
    logic [7:0] reversed_data; // reversed input data for left rotation

    // if rotate left use rotated input data
    barrel_shifter_8_right bsr(.data((dir_lr == ROTATE_LEFT) ? reversed_data:data), .amt(amt) , .out(out_right));
    // reverse input circuit
    inverter_8 input_inverter(.data(data), .out(reversed_data));
    //  reverse output circuit
    inverter_8 output_inverter(.data(out_right), .out(reversed_outr));
    
     // if rotate right use rotated output  
    assign  out = (dir_lr == ROTATE_LEFT) ? reversed_outr:out_right;

endmodule

// reverse 8-bit data
module inverter_8(
    input logic [7:0] data,
    output logic [7:0] out
);
// reverse a vector using right-to-left streaming with the default block size of 1 bit 
  assign out = {<<{data}};  
endmodule
// rotates amt bits of data to the right
module barrel_shifter_8_right(
    input logic [7:0] data,
    input logic [2:0] amt,
    output logic [7:0] out
);

    logic [7:0] s0;
    logic [7:0] s1;
    //stage 0, shift 0 or 1 bit
    assign s0 =  amt[0]? {data[0], data[7:1]} :data ;
    //stage 1, shift 0 or 2 bits
    assign s1 =  amt[1]? {s0[1:0], s0[7:2]} :s0 ;
    //stage 1, shift 0 or 4 bits
    assign out = amt[2]?{s1[3:0], s1[7:4]} :s1;
endmodule

为了反转日期,使用从右到左的流式传输,默认块大小为 1 位:分配 out = {<<{data}};
Test bench

使用与前一个案例相同的测试平台。

`timescale 1ns / 10ps

module barrel_shifter_multi_rev_testbench;
    logic [7:0] data;
    logic [2:0] amt;
    logic [7:0] out;
    logic dir_lr;

    barrel_shifter_multi_rev uut(.*);

    initial begin
        assign dir_lr = ROTATE_LEFT;
        for (byte i = 0; i < 8; ++i)
            begin
                data = 8'b0000_0001; amt = 3'(i); #10;
            end
        assign dir_lr = ROTATE_RIGHT;
        for (byte i = 0; i < 8; ++i)
            begin
                data = 8'b0000_0001; amt = 3'(i); #10;
            end
        $stop;
    end

endmodule

Simulation
在本例中,使用字符串 8’b0000_0001 进行模拟
在这里插入图片描述
在精心设计的原理图中,可以观察到两个反转电路,它们反转输入和输出处的位位置。两个多路复用器根据移位方向和右移位电路选择非反相或反相输出输入。在这种情况下只需要一个移位器电路。

在这里插入图片描述综合设计使用了 44 cells.
在这里插入图片描述

Multi-function 32-bit barrel shifter with pre and post reversing circuits

将扩展之前的电路,使其能够处理 32 位长的字。

`timescale 1ns / 10ps
const logic ROTATE_LEFT = 1'b1;
const logic ROTATE_RIGHT = 1'b0;

module barrel_shifter_32_multi_rev(
    input logic [31:0] data,
    input logic [4:0] amt,
    input logic dir_lr, // 1 rotate left, 0 rotate right
    output logic [31:0] out
);
    logic [31:0] out_right;
    logic [31:0] reversed_outr;
    logic [31:0] reversed_data;
    
    barrel_shifter_32_right bsr(.data((dir_lr == ROTATE_LEFT) ? reversed_data:data), .amt(amt) , .out(out_right));
   
     // reverse input circuit
    inverter_32 input_inverter(.data(data), .out(reversed_data));
    //  reverse output circuit
    inverter_32 output_inverter(.data(out_right), .out(reversed_outr));
    
     // if rotate right use rotated output  
    assign  out = (dir_lr == ROTATE_LEFT) ? reversed_outr:out_right;

endmodule

// rotates amt bits of data to the right
module barrel_shifter_32_right(
    input logic [31:0] data,
    input logic [4:0] amt,
    output logic [31:0] out
);

    logic [31:0] s0;
    logic [31:0] s1;    
    logic [31:0] s2;
    logic [31:0] s3;

    //stage 0, shift 0 or 1 bit
    assign s0 =  amt[0]? {data[0], data[31:1]} :data ;
    //stage 1, shift 0 or 2 bits
    assign s1 =  amt[1]? {s0[1:0], s0[31:2]} :s0 ;
    //stage 2, shift 0 or 4 bits
    assign s2 = amt[2]?{s1[3:0], s1[31:4]} :s1;
    //stage 3, shift 0 or 8 bits
    assign s3 = amt[3]?{s2[7:0], s2[31:8]} :s2;
    //stage 4, shift 0 or 16 bits
    assign out = amt[4]?{s3[15:0], s3[31:16]} :s3;

endmodule

// reverse 32-bit data
module inverter_32(
    input logic [31:0] data,
    output logic [31:0] out    
);
// reverse a vector using right-to-left streaming with the default block size of 1 bit 
  assign out = {<<{data}};  
endmodule

主要变化影响数据信号的长度以及指示要移位量的信号。在这种情况下,对于 32 位,移位信号必须为 5 位长才能循环到所有情况。
右移电路也发生了变化,必须添加新的移位级才能达到所需的 5 个级。
Test bench
测试程序还必须适应新的尺寸。

`timescale 1ns / 10ps
module barrel_shifter_32_multi_rev_testbench;
    logic [31:0] data;
    logic [4:0] amt;
    logic [31:0] out;
    logic dir_lr;

    barrel_shifter_32_multi_rev uut(.*);

    initial begin         
        for (int i = 0; i < 32; ++i)
            begin
                data = 32'b1; amt = i; dir_lr = ROTATE_LEFT; #10;
            end
        for (int i = 0; i < 32; ++i)
            begin
                data = 32'b1; amt =i; dir_lr = ROTATE_RIGHT;  #10;
            end
        $stop;
    end

endmodule

Simulation
在本例中,使用字符串 32’b0000_0000_0000_0000_0000_0000_0000_0001 进行模拟
在这里插入图片描述
详细设计的方案与针对8位详细设计的方案类似,可以看到数据总线的大小发生了变化,它们已扩大到新的大小。
在这里插入图片描述
扩展桶形移位器块,发现由于需要新的移位级,多路复用器的数量有所增加。

综合设计变得越来越复杂。
在这里插入图片描述

Multi-function 32-bit barrel shifter with left shifter and right shifter multiplexing

可以使用 32 位长度执行与之前相同的练习,但在这种情况下,我们不使用前后反转电路,而是使用两个桶形移位器,一个向右,一个向左,可通过另一个多路复用器进行选择。

`timescale 1ns / 10ps
const logic ROTATE_LEFT = 1'b1;
const logic ROTATE_RIGHT = 1'b0;

module barrel_shifter_32_multi(
    input logic [31:0] data,
    input logic [4:0] amt,
    input logic dir_lr, // 1 rotate left, 0 rotate right
    output logic [31:0] out
);
    logic [31:0] out_right;
    logic [31:0] out_left;

    
    barrel_shifter_32_right bsr(.data(data), .amt(amt) , .out(out_right));
    barrel_shifter_32_left bsl(.data(data), .amt(amt) , .out(out_left));
    
     // if rotate right use rotated output  
    assign  out = (dir_lr == ROTATE_LEFT) ? out_left:out_right;

endmodule

// rotates amt bits of data to the right
module barrel_shifter_32_right(
    input logic [31:0] data,
    input logic [4:0] amt,
    output logic [31:0] out
);

    logic [31:0] s0;
    logic [31:0] s1;    
    logic [31:0] s2;
    logic [31:0] s3;

    //stage 0, shift 0 or 1 bit
    assign s0 =  amt[0]? {data[0], data[31:1]} :data ;
    //stage 1, shift 0 or 2 bits
    assign s1 =  amt[1]? {s0[1:0], s0[31:2]} :s0 ;
    //stage 2, shift 0 or 4 bits
    assign s2 = amt[2]?{s1[3:0], s1[31:4]} :s1;
    //stage 3, shift 0 or 8 bits
    assign s3 = amt[3]?{s2[7:0], s2[31:8]} :s2;
    //stage 4, shift 0 or 16 bits
    assign out = amt[4]?{s3[15:0], s3[31:16]} :s3;

endmodule

// rotates amt bits of data to the left
module barrel_shifter_32_left(
    input logic [31:0] data,
    input logic [4:0] amt,
    output logic [31:0] out
);

    logic [31:0] s0;
    logic [31:0] s1;    
    logic [31:0] s2;
    logic [31:0] s3;

    //stage 0, shift 0 or 1 bit
    assign s0 =  amt[0]? {data[30:0], data[31]} :data ;
    //stage 1, shift 0 or 2 bits
    assign s1 =  amt[1]? {s0[29:0], s0[31:30]} :s0 ;
    //stage 2, shift 0 or 4 bits
    assign s2 = amt[2]?{s1[27:0], s1[31:28]} :s1;
    //stage 3, shift 0 or 8 bits
    assign s3 = amt[3]?{s2[23:0], s2[31:24]} :s2;
    //stage 4, shift 0 or 16 bits
    assign out = amt[4]?{s3[15:0], s3[31:16]} :s3;

endmodule

module barrel_shifter_32_multi_testbench;
    logic [31:0] data;
    logic [4:0] amt;
    logic [31:0] out;
    logic dir_lr;

    barrel_shifter_32_multi uut(.*);

    initial begin         
        for (int i = 0; i < 32; ++i)
            begin
                data = 32'b1; amt = i; dir_lr = ROTATE_LEFT; #10;
            end
        for (int i = 0; i < 32; ++i)
            begin
                data = 32'b1; amt =i; dir_lr = ROTATE_RIGHT;  #10;
            end
        $stop;
    end

endmodule

该代码包括之前的右桶形移位器,并在左侧的相反方向添加一个新的移位器。根据地址信号 dir_lr 选择其中之一。
在这里插入图片描述
扩展两个桶形移位器,可以看到该解决方案比前一个解决方案需要更多的多路复用器。
在这里插入图片描述Test bench
可以使用与之前的情况类似的测试平台,但更改被测单元 uut 的实例化。

module barrel_shifter_32_multi_testbench;
    logic [31:0] data;
    logic [4:0] amt;
    logic [31:0] out;
    logic dir_lr;

    barrel_shifter_32_multi uut(.*);

    initial begin         
        for (int i = 0; i < 32; ++i)
            begin
                data = 32'b1; amt = i; dir_lr = ROTATE_LEFT; #10;
            end
        for (int i = 0; i < 32; ++i)
            begin
                data = 32'b1; amt =i; dir_lr = ROTATE_RIGHT;  #10;
            end
        $stop;
    end

endmodule

Simulation

在模拟中,可以以图形方式看到偏移如何影响高位的单个位。
在这里插入图片描述
综合设计与前一个类似,有 198 cells

在这里插入图片描述

Parameterizable word width multifunction barrel shifter

最后制作一个具有可参数化数据长度的版本。
在这个参数化的桶形移位器中,输入宽度可以由参数 N N N 指定。输入的宽度将为 2 N 2^N 2N

`timescale 1ns / 1ps
const logic ROTATE_LEFT = 1'b1;
const logic ROTATE_RIGHT = 1'b0;
// The width of input will be 2^N  ie N=5 width 32
module barrel_shifter_N #(parameter N=4) (
    input logic [2**N-1:0] data,
    input logic [N-1:0] amt,
    input logic dir_lr, // 1 rotate left, 0 rotate right
    output logic [2**N-1:0] out
);
    localparam WIDTH = 2**N;
    logic [WIDTH-1:0] out_right;
    logic [WIDTH-1:0] reversed_outr;
    logic [WIDTH-1:0] reversed_data;

    barrel_shifter_N_right #(.N(N)) bsr(.data((dir_lr == ROTATE_LEFT) ? reversed_data:data), .amt(amt) , .out(out_right));

    // reverse input circuit
    inverter_width #(.WIDTH(WIDTH)) input_inverter(.data(data), .out(reversed_data));
    //  reverse output circuit
    inverter_width #(.WIDTH(WIDTH))output_inverter(.data(out_right), .out(reversed_outr));

    // if rotate right use rotated output  
    assign  out = (dir_lr == ROTATE_LEFT) ? reversed_outr:out_right;

endmodule

// rotates amt bits of data to the right staged implementation
//
module barrel_shifter_N_right #(parameter N = 4)(
    input logic [2**N-1:0] data,
    input logic [N-1:0] amt,
    output logic [2**N-1:0] out
);

    localparam WIDTH = 2**N;
    logic  [N-1:0][WIDTH-1:0] stage_out;

    generate
        genvar  stage ;
        assign stage_out[0] = amt[0] ? { data[0], data[WIDTH-1:1]} : data;
        for (stage = 1; stage < N ; ++stage)
        begin
            assign stage_out[stage] = amt[stage] ?
                {stage_out[stage-1][stage**2:0], stage_out[stage-1][WIDTH-1:2**stage]}
                : stage_out[stage -1];
        end
        assign out = stage_out[N-1];
    endgenerate

endmodule

// reverse 32-bit data
module inverter_width #(parameter WIDTH=32) (
    input logic [WIDTH-1:0] data,
    output logic [WIDTH-1:0] out
);
    // reverse a vector using right-to-left streaming with the default block size of 1 bit 
    assign out = {<<{data}};
endmodule

module barrel_shifter_N_testbench;

    localparam N = 3;
    localparam WIDTH = 2**N;
    
    logic [WIDTH-1:0] data;
    logic [N-1:0] amt;
    logic [WIDTH-1:0] out;
    logic dir_lr;

    barrel_shifter_N #(.N(N)) uut(.*);

    initial begin
        for (int i = 0; i < WIDTH; ++i)
            begin
                data = 5; amt = i; dir_lr = ROTATE_LEFT; #10;
            end
        for (int i = 0; i < WIDTH; ++i)
            begin
                data = 5; amt =i; dir_lr = ROTATE_RIGHT;  #10;
            end
        $stop;
    end

endmodule

由于现在移动数据的阶段数是可变的,可以使用生成块在循环中生成不同的必要阶段。

在这里插入图片描述
模拟 N = 3,字宽 = 8,
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【Python学习】Python学习22- CGI编程

目录 【Python学习】Python学习22- CGI编程 前言CGI工作流程Web 服务器支持及配置Http头部参考 文章所属专区 Python学习 前言 本章节主要说明Python的CGI接口 CGI 目前由 NCSA 维护&#xff0c;NCSA 定义 CGI 如下&#xff1a; CGI(Common Gateway Interface)&#xff0c;通…

机器学习没那么难,Azure AutoML帮你简单3步实现自动化模型训练

在Machine Learning 这个领域&#xff0c;通常训练一个业务模型的难点并不在于算法的选择&#xff0c;而在于前期的数据清理和特征工程这些纷繁复杂的工作&#xff0c;训练过程中的问题在于参数的反复迭代优化。 AutoML 是 Azure Databricks 的一项功能&#xff0c;它自动的对…

GRU门控循环单元神经网络的MATLAB实现(含源代码)

在深度学习领域&#xff0c;循环神经网络&#xff08;RNN&#xff09;因其在处理序列数据方面的卓越能力而受到广泛关注。GRU&#xff08;门控循环单元&#xff09;作为RNN的一种变体&#xff0c;以其在捕捉时间序列长距离依赖关系方面的高效性而备受推崇。在本文中&#xff0c…

ros2学习笔记-CLI工具,记录命令对应操作。

目录 环境变量turtlesim和rqt以初始状态打开rqt node启动节点查看节点列表查看节点更多信息命令行参数 --ros-args topic话题列表话题类型话题列表&#xff0c;附加话题类型根据类型查找话题名查看话题发布的数据查看话题的详细信息查看类型的详细信息给话题发布消息&#xff0…

推荐两个工具:DeepSpeed-FastGen和DataTrove

DeepSpeed-FastGen 通过 MII 和 DeepSpeed-Inference 加速LLM生成文本 仓库地址&#xff1a;https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen GPT-4 和 LLaMA 等大型语言模型 (LLM) 已成为服务于各个级别的人工智能应用程序的主要工作负载。从一…

UE5 独立程序的网络TCP/UDP服务器与客户端基础流程

引擎源码版&#xff0c;复制\Engine\Source\Programs\路径下的BlankProgram空项目示例。 重命名BlankProgram&#xff0c;例如CustomTcpProgram&#xff0c;并修改项目名称。 修改.Build.cs内容 修改Target.cs内容 修改Private文件夹内.h.cpp文件名并修改.cpp内容 刷新引擎 …

SpringMVC获取参数与页面跳转

获取参数 第一种 直接当成方法的参数&#xff0c;需要与前台的name一致 相当于Request.getAttribute("username") Controller 第二种 使用对象接收 页面的name也要和对象的字段一致 创建一个对应的实体类 Controller 将参数更换为User对象就行 SpringMVC获取到…

【设计模式】你知道游戏SL大法是什么设计模式吗?

什么是备忘录模式&#xff1f; 老规矩&#xff0c;我们先来看看备忘录模式 (Memento) 的定义&#xff1a;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 它的UML类图如下&a…

keep-alive组件缓存

keep-alive组件缓存 从a跳b&#xff0c;a已经销毁&#xff0c;b重新渲染&#xff1b;b跳a&#xff0c;b销毁a重新渲染 源组件销毁&#xff0c;目标组件渲染 组件缓存&#xff1a;组件实例等相关&#xff08; 包括vnode&#xff09;存储起来 重新渲染指的是&#xff1a;把视图重…

MySQL---多表查询综合练习

创建dept表 CREATE TABLE dept ( deptno INT(2) NOT NULL COMMENT 部门编号, dname VARCHAR (15) COMMENT 部门名称, loc VARCHAR (20) COMMENT 地理位置 ); 添加dept表主键 mysql> alter table dept add primary key(deptno); Query OK, 0 rows affected (0.02 s…

正则表达式初版

一、简介 REGEXP&#xff1a; Regular Expressions&#xff0c;由一类特殊字符及文本字符所编写的模式&#xff0c;其中有些字符&#xff08;元字符&#xff09;不表示字符字面意义&#xff0c;而表示控制或通配的功能&#xff0c;类似于增强版的通配符功能&#xff0c;但与通…

YOLOv5改进 | 主干篇 | 华为GhostnetV1一种移动端的专用特征提取网络

一、本文介绍 本文给大家带来的改进机制是华为移动端模型Ghostnetv1,华为GhostnetV1一种移动端的专用特征提取网络,旨在在计算资源有限的嵌入式设备上实现高性能的图像分类。GhostNet的关键思想在于通过引入Ghost模块,以较低的计算成本增加了特征图的数量,从而提高了模型的…

消除噪音:Chain-of-Note (CoN) 强大的方法为您的 RAG 管道提供强大动力

论文地址&#xff1a;https://arxiv.org/abs/2311.09210 英文原文地址&#xff1a;https://praveengovindaraj.com/cutting-through-the-noise-chain-of-notes-con-robust-approach-to-super-power-your-rag-pipelines-0df5f1ce7952 在快速发展的人工智能和机器学习领域&#x…

数据结构 | 红黑树

二叉搜索树 节点的左边比节点的值小&#xff0c;右边比节点的值大。 红黑树 红黑树的性质 节点要么是红色&#xff0c;要么是黑色根节点是黑色叶子节点都是黑色的空节点红黑树中红色节点的子节点都是黑色从任一节点到叶子节点的所有路径都包含相同数目的黑色节点 在添加或者…

Rustdesk自建服务搭建好了,打开Win10 下客户端下面状态一直正在接入网络,无法成功连接服务器

环境: Rustdesk1.2.3 自建服务器 有域名地址 问题描述: Rustdesk自建服务搭建好了,打开Win10 下客户端下面状态一直正在接入网络,无法成功连接服务器 解决方案: RustDesk是一款免费的远程桌面软件,它允许用户通过互联网远程连接和控制其他计算机。它是用Rust编程语…

爬虫进阶之selenium模拟浏览器

爬虫进阶之selenium模拟浏览器 简介环境配置1、建议先安装conda2、创建虚拟环境并安装对应的包3、下载对应的谷歌驱动以及与驱动对应的浏览器 代码setting.py配置scrapy脚本参考中间件middlewares.py 附录&#xff1a;selenium教程 简介 Selenium是一个用于自动化浏览器操作的…

web开发学习笔记(10.postman请求响应,后端接口基础知识)

1.springboot使用get请求接受简单参数 上述写法不去别get或者post请求 2.postman各种提交方式的区别 1、form-data: 就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息&#xff0c;以标签为单元&#xff0c;用分隔符分开。既可以上传键值对&#xff0c;也可…

huggingface学习 | 云服务器使用hf_hub_download下载huggingface上的模型文件

系列文章目录 huggingface学习 | 云服务器使用git-lfs下载huggingface上的模型文件 文章目录 系列文章目录一、hf_hub_download介绍二、找到需要下载的huggingface文件三、准备工作及下载过程四、全部代码 一、hf_hub_download介绍 hf_hub_download是huggingface官方支持&…

【C++】文件操作

文件操作 一、文本文件&#xff08;一&#xff09;写文件读文件 二、二进制文件&#xff08;一&#xff09;写文件&#xff08;二&#xff09;读文件 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会被释放&#xff0c;通过文件可以将数据持久化&#xff…

支付宝小程序开发踩坑笔记(支付宝、学习强国小程序)

1、接口请求安卓端回调 success&#xff0c;IOS 端回调 fail 原因&#xff1a;dataType 设置不对&#xff0c;默认是 json 格式&#xff0c;对返回数据会进行 json 解析&#xff0c;如果解析失败&#xff0c;就会回调 fail 。加密传输一般是 text 格式。 2、input 禁止输入空格…