【【迭代16次的CORDIC算法-verilog实现】】

news2024/11/25 4:48:27

迭代16次的CORDIC算法-verilog实现 -32位迭代16次verilog代码实现

CORDIC.v

module cordic32#(
    parameter         DATA_WIDTH    =      8'd32  ,     // we set data width
    parameter         PIPELINE      =      5'd16        // Optimize waveform
  )(
    input                              clk       ,
    input                              rst_n     ,
    input    signed    [DATA_WIDTH - 1 : 0]   phase     ,
    input                              ena       ,
    output  reg signed [DATA_WIDTH - 1  : 0]   sin_out   ,
    output  reg signed [DATA_WIDTH - 1  : 0]   cos_out
  );


  // -----------------------------------------------  \\
  //    next is define and parameter                  \\
  // ------------------------------------------------- \\


  reg    signed     [DATA_WIDTH - 1 : 0]     phase_reg    ;
  reg    signed     [DATA_WIDTH - 1 : 0]     phase_reg1    ;
  reg    signed     [DATA_WIDTH - 1 : 0]     X0           ;
  reg    signed     [DATA_WIDTH - 1 : 0]     Y0           ;
  reg    signed     [DATA_WIDTH - 1 : 0]     Z0           ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X1 , Y1 , Z1 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X2 , Y2 , Z2 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X3 , Y3 , Z3 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X4 , Y4 , Z4 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X5 , Y5 , Z5 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X6 , Y6 , Z6 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X7 , Y7 , Z7 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X8 , Y8 , Z8 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X9 , Y9 , Z9 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X10 , Y10 , Z10 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X11 , Y11 , Z11 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X12 , Y12 , Z12 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X13 , Y13 , Z13 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X14 , Y14 , Z14 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X15 , Y15 , Z15 ;
  wire   signed     [DATA_WIDTH - 1 : 0]     X16 , Y16 , Z16 ;
  reg    signed     [DATA_WIDTH - 1 : 0]     XN15 , YN15     ;





    reg [1:0] quadrant[PIPELINE : 0] ;
    integer i ;











  // We will convert all new angles to the first quadrant
  //
  always@(posedge clk or negedge rst_n)
  begin
    if( rst_n == 0 )
    begin
      phase_reg <= 0 ;
      phase_reg1 <= 0 ;
    end
    else if( ena == 1)
    begin
      phase_reg1 <= phase ;
      case(phase[DATA_WIDTH - 1 : DATA_WIDTH - 2])
        2'b00 :
          phase_reg <= phase                 ;
        2'b01 :
          phase_reg <= phase - 32'h40000000  ;   // -90
        2'b10 :
          phase_reg <= phase - 32'h80000000  ;   // -180
        2'b11 :
          phase_reg <= phase - 32'hC0000000  ;   // -270
        default :
        phase_reg <= 32'h00   ; 
          
      endcase
    end
  end



  // We begin the initialization operation
  // we set 0.607253*???2^31-1???,32'h4DBA775F
  always@(posedge clk or negedge rst_n)
  begin
    if(rst_n == 0 )
    begin
      X0 <= 0 ;
      Y0 <= 0 ;
      Z0 <= 0 ;
    end
    else if(ena == 1)
    begin
      X0 <= 32'h4DBA775F ;
      Y0 <= 0            ;
      Z0 <= phase_reg    ;
    end
  end



// for instantiation - 16
INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd0 ),
    .ANGLE      ( 32'h20000000 )
)u_INTERATION0(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X0         ),
    .Y0         ( Y0         ),
    .Z0         ( Z0         ),
    .X1         ( X1         ),
    .Y1         ( Y1         ),
    .Z1         ( Z1         )
);



INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd1 ),
    .ANGLE      ( 32'h12E4051D )
)u_INTERATION1(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X1         ),
    .Y0         ( Y1         ),
    .Z0         ( Z1         ),
    .X1         ( X2         ),
    .Y1         ( Y2         ),
    .Z1         ( Z2         )
);

INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd2 ),
    .ANGLE      ( 32'h09FB385B )
)u_INTERATION2(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X2         ),
    .Y0         ( Y2         ),
    .Z0         ( Z2         ),
    .X1         ( X3         ),
    .Y1         ( Y3         ),
    .Z1         ( Z3         )
);

INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd3 ),
    .ANGLE      ( 32'h051111D4 )
)u_INTERATION3(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X3         ),
    .Y0         ( Y3         ),
    .Z0         ( Z3         ),
    .X1         ( X4         ),
    .Y1         ( Y4         ),
    .Z1         ( Z4         )
);


INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd4 ),
    .ANGLE      ( 32'h028B0D43 )
)u_INTERATION4(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X4         ),
    .Y0         ( Y4         ),
    .Z0         ( Z4         ),
    .X1         ( X5         ),
    .Y1         ( Y5         ),
    .Z1         ( Z5         )
);


INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd5 ),
    .ANGLE      ( 32'h0145D7E1 )
)u_INTERATION5(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X5         ),
    .Y0         ( Y5         ),
    .Z0         ( Z5         ),
    .X1         ( X6         ),
    .Y1         ( Y6         ),
    .Z1         ( Z6         )
);

INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd6 ),
    .ANGLE      ( 32'h00A2F61E )
)u_INTERATION6(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X6         ),
    .Y0         ( Y6         ),
    .Z0         ( Z6         ),
    .X1         ( X7         ),
    .Y1         ( Y7         ),
    .Z1         ( Z7         )
);



INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd7 ),
    .ANGLE      ( 32'h00517C55 )
)u_INTERATION7(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X7         ),
    .Y0         ( Y7         ),
    .Z0         ( Z7         ),
    .X1         ( X8         ),
    .Y1         ( Y8         ),
    .Z1         ( Z8         )
);

INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd8 ),
    .ANGLE      ( 32'h0028BE53 )
)u_INTERATION8(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X8         ),
    .Y0         ( Y8         ),
    .Z0         ( Z8         ),
    .X1         ( X9         ),
    .Y1         ( Y9         ),
    .Z1         ( Z9         )
);


INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd9 ),
    .ANGLE      ( 32'h00145F2F )
)u_INTERATION9(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X9         ),
    .Y0         ( Y9         ),
    .Z0         ( Z9         ),
    .X1         ( X10         ),
    .Y1         ( Y10         ),
    .Z1         ( Z10         )
);


INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd10 ),
    .ANGLE      ( 32'h000A2F98 )
)u_INTERATION10(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X10         ),
    .Y0         ( Y10         ),
    .Z0         ( Z10         ),
    .X1         ( X11         ),
    .Y1         ( Y11         ),
    .Z1         ( Z11         )
);

INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd11 ),
    .ANGLE      ( 32'h000517CC )
)u_INTERATION11(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X11         ),
    .Y0         ( Y11         ),
    .Z0         ( Z11         ),
    .X1         ( X12         ),
    .Y1         ( Y12         ),
    .Z1         ( Z12         )
);

INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd12 ),
    .ANGLE      ( 32'h00028BE6 )
)u_INTERATION12(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X12         ),
    .Y0         ( Y12         ),
    .Z0         ( Z12         ),
    .X1         ( X13         ),
    .Y1         ( Y13         ),
    .Z1         ( Z13         )
);

INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd13 ),
    .ANGLE      ( 32'h000145F3 )
)u_INTERATION13(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X13         ),
    .Y0         ( Y13         ),
    .Z0         ( Z13         ),
    .X1         ( X14         ),
    .Y1         ( Y14         ),
    .Z1         ( Z14         )
);

INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd14 ),
    .ANGLE      ( 32'h0000A2FA )
)u_INTERATION14(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X14         ),
    .Y0         ( Y14         ),
    .Z0         ( Z14         ),
    .X1         ( X15         ),
    .Y1         ( Y15         ),
    .Z1         ( Z15         )
);


INTERATION#(
    .DATA_WIDTH ( 8'd32 ),
    .shift      ( 5'd15 ),
    .ANGLE      ( 32'h0000517D )
)u_INTERATION15(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .ena        ( ena        ),
    .X0         ( X15         ),
    .Y0         ( Y15         ),
    .Z0         ( Z15         ),
    .X1         ( X16         ),
    .Y1         ( Y16         ),
    .Z1         ( Z16         )
);



// iteration over 


always@(posedge clk or negedge rst_n)
begin
  if(rst_n == 0)
    for(i = 0 ; i < PIPELINE ; i=i+1)
      quadrant[i] <= 0 ;
  else
    if(ena == 1)
    begin
      for(i = 0 ; i < PIPELINE ; i=i+1)
        quadrant[i+1] <= quadrant[i] ;
      quadrant[0] <= phase_reg1[DATA_WIDTH - 1 : DATA_WIDTH - 2] ;
    end
end
 //------------------------------------------  \\
 //------------------------------------------  \\
//  Prevent overflow caused by small decimals and negative complement
//
	
always @(posedge clk or negedge rst_n)
     if(rst_n == 0)
		XN15<=0;
	else if(X15[31:30] == 2'b11)//小于0
		XN15<=~X15 + 1'b1;
	else if(X15[31:30] == 2'b10)//大于1
		XN15<=32'h80000000 - X15 + 32'h80000000;
	else 
		XN15 <= X15;
		
always @(posedge clk or negedge rst_n )
     if(rst_n == 0)
		YN15 <=0;
	else if(Y15[31:30] == 2'b11)//小于0 
		YN15 <=~Y15 + 1'b1;
	else if(Y15[31:30] == 2'b10)//大于1
		YN15 <=32'h80000000 -Y15 + 32'h80000000;
	else 
		YN15 <=Y15;

// 
//   The results of different phases are also different
  //   phase[DATA_WIDTH -1 : DATA_WIDTH -2]
  //  00 first  quadrant
  //  01 second quadrant
  //  10 third  quadrant
  //  11 Fourth Quadrant



always@(posedge clk or negedge rst_n)
begin
  if(rst_n == 0)
  begin
    cos_out <= 0 ;
    sin_out <= 0 ;
  end
  else if( ena == 1)
  begin
    case(quadrant[16]) 
      2'b00 :
      begin
        cos_out <= XN15 ;
        sin_out <= YN15 ;
      end
      2'b01 :
      begin
        cos_out <= ~YN15 + 1'b1;
        sin_out <= XN15        ;
      end
      2'b10 :
      begin
        cos_out <= ~XN15 + 1'b1  ;
        sin_out <= ~YN15 + 1'b1 ;
      end
      2'b11 :
      begin
        cos_out <= YN15        ;
        sin_out <= ~XN15 + 1'b1 ;
      end
    
    endcase
  end
end
endmodule

ITERATION.v

module INTERATION #(
    parameter   DATA_WIDTH       =    8'd32       ,
    parameter   shift            =    5'd0        ,
    parameter   ANGLE            =    32'h20000000
  )(
    input                                  clk     ,
    input                                  rst_n   ,
    input                                  ena     ,
    input       signed  [DATA_WIDTH - 1 : 0]      X0      ,
    input       signed  [DATA_WIDTH - 1 : 0]      Y0      ,
    input       signed  [DATA_WIDTH - 1 : 0]      Z0      ,
    output  reg signed  [DATA_WIDTH - 1 : 0]      X1      ,
    output  reg signed  [DATA_WIDTH - 1 : 0]      Y1      ,
    output  reg signed  [DATA_WIDTH - 1 : 0]      Z1
  );

  always@(posedge clk or negedge rst_n)
  begin
    if( rst_n == 0)
    begin
      X1 <= 0 ;
      Y1 <= 0 ;
      Z1 <= 0 ;
    end
    else if( ena == 1)
    begin
      if(Z0[DATA_WIDTH - 1] == 0 )
      begin
       // X1 <= X0 - {{shift{ Y0[DATA_WIDTH - 1] }} ,Y0[DATA_WIDTH - 1 : shift] } ;
       // Y1 <= Y0 + {{shift{ X0[DATA_WIDTH - 1] }} ,X0[DATA_WIDTH - 1 : shift] } ;
        X1 <= X0 - (Y0>>>shift);
        Y1 <= Y0 + (X0>>>shift);
        Z1 <= Z0 - ANGLE                                                    ;
      end
      else if(Z0[DATA_WIDTH - 1] == 1 )
      begin
        //X1 <= X0 + {{shift{ Y0[DATA_WIDTH - 1 ] }} ,Y0[DATA_WIDTH - 1 : shift] } ;
       // Y1 <= Y0 - {{shift{ X0[DATA_WIDTH - 1 ] }} ,X0[DATA_WIDTH - 1 : shift] } ;
        X1 <= X0 + (Y0>>>shift) ;
        Y1 <= Y0 - {X0>>>shift} ;
        Z1 <= Z0 + ANGLE                                                    ;
      end
    end
  end

endmodule

CORDIC_tb.v

module cordic_tb #(
    parameter         DATA_WIDTH    =      8'd32  ,     // we set data width
    parameter         PIPELINE      =      5'd16        // Optimize waveform    
);
reg                                 clk       ;
reg                                 rst_n     ;
reg          [DATA_WIDTH - 1 : 0]   phase     ;
reg                                 ena       ;
wire         [DATA_WIDTH - 1  : 0]   sin_out   ;
wire         [DATA_WIDTH - 1 : 0]   cos_out   ;



integer i;
cordic32#(
    .DATA_WIDTH ( DATA_WIDTH ),
    .PIPELINE   ( PIPELINE )
)u_cordic32(
    .clk        ( clk        ),
    .rst_n      ( rst_n      ),
    .phase      ( phase      ),
    .ena        ( ena        ),
    .sin_out    ( sin_out    ),
    .cos_out    ( cos_out    )
);


initial
begin
     #0 clk = 1'b0;
    ena   = 1'b1 ;
   
    #10 rst_n = 1'b0;
    #10 rst_n = 1'b1;
    
    #20000000 $stop;
end 

initial
begin
	repeat(10)
	begin
		#0 phase = 32'd0;
		for(i=0;i<131072;i=i+1)
			begin
				#10;
				phase <= phase + 32'h8000;
			end
	end
end
always #10
begin
    clk = ~clk;
end


endmodule 

README.md

在完成CORDIC的7次迭代之后 我在思考一个问题 8位进行了7次迭代 最后迭代至0号称没有误差了
我们是否可以通过 扩展至32位 进行多次迭代  将误差不断的缩小 


本次数据参考至 网上的其他教程 我并没有自己去计算 我把结构优化一下 修改成更加便于理解使用的形式

还有一件事 是 进制 与 Π 转化的问题 
对于 8位 其实我们 一开始将Π 设定为 1000_0000
那么对于 Π/4 是否就是1000_0000 的 四分之一 对于二进制 其实就是整体的数字进行移位 
我们将1000_0000 移动至 0010_0000 于此 

而对于 32位我们32'h8000000 就是一个Π
而 32’h2000_0000 就是四分之Π 


还有一件事 说明 我在写例化的时候 将数据完全完整的例化了下来 写的很长 这样并不是很好 
后面学习中 我看别人是 这么处理的 
genvar die;
generate
    for (die = 0; die <Pipeline; die=die+1)
    begin: dieLoop
        always @(posedge CLK_SYS or negedge RST_N)
            if (!RST_N) begin
                xn[die+1] <= 32'h0;
				yn[die+1] <= 32'h0;
				zn[die+1] <= 32'h0;
            end
        	else begin             
				if(zn[die][31]==1'b0)//角度符号判断
					begin
				     xn[die+1] <= xn[die] - (yn[die]>>>die);
				     yn[die+1] <= yn[die] + (xn[die]>>>die);
				     zn[die+1] <= zn[die] - rot[die];  
				    end
				else begin
				      xn[die+1] <= xn[die] + (yn[die]>>>die);
				      yn[die+1] <= yn[die] - (xn[die]>>>die);
				      zn[die+1] <= zn[die] + rot[die];  
				      end
            end
    end
endgenerate


# 还有一件事 对于溢出的考量 
我们所作溢出的考量 其实我们设定了32'h8000_0000 这既是Π的值 也是 1的设定 
但是在实际的运用和计算中 我们其实永远也达不到1 嘿嘿 
因为我们把最高位设计成了 符号位 
那么最大 也就是1 我们约等于 32'h7fff_ffff
这里需要注意的是[31:28] 是 7 也就是0111 非常重要的一个结论 我们最高位0代表了符号位
那么对于设计到第一象限的[31:30] 的值可以取 00 01 但是 10 11我们要对其进行合适的转化
所以便有了我们  对溢出的操作 


always @(posedge clk or negedge rst_n)
     if(rst_n == 0)
		XN15<=0;
	else if(X15[31:30] == 2'b11)//小于0
		XN15<=~X15 + 1'b1;
	else if(X15[31:30] == 2'b10)//大于1
		XN15<=32'h80000000 - X15 + 32'h80000000;
	else 
		XN15 <= X15;
		
always @(posedge clk or negedge rst_n )
     if(rst_n == 0)
		YN15 <=0;
	else if(Y15[31:30] == 2'b11)//小于0 
		YN15 <=~Y15 + 1'b1;
	else if(Y15[31:30] == 2'b10)//大于1
		YN15 <=32'h80000000 -Y15 + 32'h80000000;
	else 
		YN15 <=Y15;



注意在设计的时候 定义成reg signed 的形式 将其设计为有符号位 

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

在这里插入图片描述

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

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

相关文章

数字化时代的智能支持:亚马逊云科技轻量应用服务器技术领先

轻量应用服务器是一种简化运维、门槛低的弹性服务器&#xff0c;它的"轻"主要体现在几个方面&#xff1a;开箱即用、应用优质、上手简洁、投入划算、运维简便以及稳定可靠。相较于普通的云服务器&#xff0c;轻量应用服务器简化了云服务的操作难度、使用和管理流程&a…

全链路压测之分布式架构/SkyWalking链路追踪/中间件

最近刷题&#xff0c;学习了些压测的知识&#xff0c;大多是在小破站上的笔记&#xff0c;仅供大家参考~ 一、分布式微服务架构 微服务&#xff1a;多个系统之间相互调用 全链路&#xff1a;简单理解&#xff0c;就是一个系统调用另一个系统 二、SkyWalking链路追踪平台 链路…

阿里云经济型、通用算力型、计算型、通用型、内存型云服务器最新活动报价

阿里云作为国内领先的云计算服务提供商&#xff0c;提供了多种规格的云服务器供用户选择。为了满足不同用户的需求&#xff0c;阿里云推出了经济型、通用算力型、计算型、通用型和内存型等不同类型的云服务器。下面将详细介绍这些云服务器的最新活动报价。 一、阿里云特惠云服…

01-Go语言介绍以及win环境搭建

1、Go 语言介绍 Go 即 Golang&#xff0c;是 Google 公司 2009 年 11 月正式对外公开的一门编程语言。 根据 Go 语言开发者自述&#xff0c;近 10 多年&#xff0c;从单机时代的 C 语言到现在互联网时代的 Java&#xff0c; 都没有令人满意的开发语言&#xff0c;而 C往往给人…

python学习笔记--异常捕获

异常场景 numinput("input you number:") n9000 try:resultn/int(num)print({} 除以num 结果为{}.format(n,result)) except ZeroDivisionError as err:print("0不可以作为除数&#xff0c;出现报错{}".format(err)) except ValueError as err:print(&quo…

【超图】SuperMap iClient3D for WebGL/WebGPU ——地形影像

作者&#xff1a;taco 号外&#xff01;号外&#xff01;开新坑了&#xff01;开新坑了&#xff01;对于一个代码小白来讲&#xff0c;设置可能是刚接触开发的人&#xff08;还没接触准备接触&#xff09;的人来说。对于读代码或是在对产品的使用上会存在许许多多的疑惑。接下来…

Mybatis基本操作

目录 准备工作 删除操作 预编译SQL 增加操作 获取返回的主键 更新操作 准备工作 准备数据库表 emp创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动、lombok&#xff09;application.properties中引入数据库连接信息创建对应…

HTML+CSS做一个冰立方体时钟

文章目录 💕效果展示💕代码展示HTMLJS💕效果展示 💕代码展示 HTML <!DOCTYPE html> <html lang

Python简介:一种强大的编程语言

Python是一种高级、通用的编程语言&#xff0c;以其简洁易读的语法和强大的功能而闻名。它广泛应用于各种领域&#xff0c;包括软件开发、数据分析、人工智能等。本文将详细介绍Python的特点、应用领域以及如何开始学习Python。 &#xfeff; &#xfeff;一、Python的特点 1…

vue2 el-table 行按钮过多,按钮超出指定个数,显示为下拉菜单(简单的自定义组件)01

vue2 el-table 行按钮过多&#xff0c;按钮超出指定个数&#xff0c;显示为下拉菜单&#xff08;简单的自定义组件01&#xff09; 上图 优化前 按钮太多不美观 优化后 默认展示三个按钮 超出显示下拉菜单 上代码 封装按钮组件 OperateBtn.vue // OperateBtn.vue<templ…

mysql中的事务和索引

1. 索引 索引&#xff1a;index&#xff08;下标&#xff09;->目录 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c; 并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 1.1 索引的作用 MyS…

MVVM响应式

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介MVVM响应式1. 什么是MVVM模式?2. Vue中的响应式数据3. 数据绑定与视图更新⭐ 写在最后⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏!创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习…

SWUST-会理财的小明

一波操作之后我发现我在乱写&#xff0c;发现原来利息是这样算的 然后我一波操作之后发现也不是这样算的。原来利息是这样算的 原来是幂运算&#xff01; 什么东西。。。 原来总金额就是本金*&#xff08;1利率&#xff09;^年限。利息就是总金额-本金&#xff01;&#xff01…

一款DC-DC控制器应用方案

一、General Description The TX5121 is a step-up DC/DC converter specifically designed to drive up to 6 series white LEDs with constant current. Series connection of the LEDs provides identical LED currents resulting in uniform brightness and eliminates th…

要使自己用C++制作的游戏可以多人在不同电脑上对战要学什么?

要使自己用C制作的游戏可以多人在不同电脑上对战要学什么&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享…

揭秘 Go 中 Goroutines 轻量级并发

理解 Goroutines、它们的效率以及同步挑战 并发是现代软件开发的一个基本概念&#xff0c;使程序能够同时执行多个任务。在 Go 编程领域&#xff0c;理解 Goroutines 是至关重要的。本文将全面概述 Goroutines&#xff0c;它们的轻量级特性&#xff0c;如何使用 go 关键字创建…

【Mode Management】CanSM详细介绍

1. Introduction and functional overview AUTOSAR BSW栈为每个通信总线指定一个总线特定的状态管理器。CANSM实现CAN总线的数据流控制。CanSM隶属于通信服务层。CanSM和通信硬件抽象层以及系统服务层交互。 CanSM只用用于控制CAN通信。CanSM的任务就是操作CanIf模块去控制一个…

实现单链表的基本操作(力扣、牛客刷题的基础笔试题常客)

本节来学习单链表的实现。在链表的刷题中&#xff0c;单链表占主导地位&#xff0c;很多oj题都在在单链表的背景下进行&#xff1b;而且很多链表的面试题都是以单链表为背景命题。所以&#xff0c;学好单链表的基本操作很重要 目录 一.介绍单链表 1.链表及单链表 2.定义一个…

【设计模式--结构型--代理模式】

设计模式--结构型--代理模式 代理模式概述结构静态代理案例&#xff1a;卖车票jdk动态代理cglib代理三种代理对比优缺点使用场景 代理模式 概述 由于某些原因需要给某对象提供一个代理以控制该对象的访问。这时&#xff0c;访问对象不适合或者不能直接引用目标对象&#xff0…

Java集合大家族(学习推荐版,通俗易懂)

4.集合&#xff08;ArrayList&#xff09;、其他集合框架及容器遍历方式 1.ArrayList 注意&#xff1a;索引从0开始 该集合可以添加任意类型的数据&#xff0c;要约束添加数据的类型&#xff0c;需用泛型约束&#xff08;jdk1.7开始支持泛型&#xff09; 删除遍历集合方式1&a…