⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cordic_atan.v

📁 使用verilog语言完成了基于cordic算法求反正切的计算
💻 V
字号:
module CORDIC_ATAN(aclr, clk, imag_in, real_in, angle_out);
	parameter  DATA_WIDTH  = 11;
	parameter  ANGLE_WIDTH = 12;
	input             aclr;
	input 			 	    clk;
	input [DATA_WIDTH-1:0]   imag_in, real_in;
	output[ANGLE_WIDTH-1:0]  angle_out;
	
	reg signed [DATA_WIDTH-1:0]     x[8:0], y[8:0];
	reg signed [ANGLE_WIDTH-1:0]    z[8:0];
	always @(posedge clk or posedge aclr)
	    begin
	    	  if (aclr == 1'b1)
	    // 复位
	    	  begin
		          x[0] <= 11'b0;	  			
		          y[0] <= 11'b0;	
		          z[0] <= 12'b0;
		      end
		      
		  // 初始化
		      else
		      begin
		         if(!real_in[DATA_WIDTH-1]) 
		         begin 
			           x[0] <= real_in;	
			           y[0] <= imag_in;	
			           z[0] <= 12'h0;
		         end
		         else if(!imag_in[DATA_WIDTH-1])
		         begin
		         	   x[0] <= imag_in;	
			           y[0] <= -real_in;	
			           z[0] <= 12'h192;
			       end
			       else
			       begin
			       	   x[0] <= -imag_in;	
			           y[0] <= real_in;	
			           z[0] <= 12'hE6E;
			       end
		
		  // 旋转45度
		         if(y[0][DATA_WIDTH-1])
		         begin 
			           x[1] <= x[0] - y[0];
			           y[1] <= y[0] + x[0];
			           z[1] <= z[0] - 12'h0C9;
		         end
		         else 
		         begin 
			           x[1] <= x[0] + y[0];
			           y[1] <= y[0] - x[0];
			           z[1] <= z[0] + 12'h0C9;
		         end
		         
		  // 旋转26.57度
		         if(y[1][DATA_WIDTH-1])
		         begin 
			           x[2] <= x[1] - {y[1][DATA_WIDTH-1],y[1][DATA_WIDTH-1:1]};
			           y[2] <= y[1] + {x[1][DATA_WIDTH-1],x[1][DATA_WIDTH-1:1]};
			           z[2] <= z[1] - 12'h076;
		         end
		         else 
		         begin 
			           x[2] <= x[1] + {y[1][DATA_WIDTH-1],y[1][DATA_WIDTH-1:1]};
			           y[2] <= y[1] - {x[1][DATA_WIDTH-1],x[1][DATA_WIDTH-1:1]};
			           z[2] <= z[1] + 12'h076;
		         end
		         
		  // 旋转14.04度
		         if(y[2][DATA_WIDTH-1])
		         begin 
			           x[3] <= x[2] - {{2{y[2][DATA_WIDTH-1]}},y[2][DATA_WIDTH-1:2]};
			           y[3] <= y[2] + {{2{x[2][DATA_WIDTH-1]}},x[2][DATA_WIDTH-1:2]};
			           z[3] <= z[2] - 12'h03E;
		         end
		         else 
		         begin 
			           x[3] <= x[2] + {{2{y[2][DATA_WIDTH-1]}},y[2][DATA_WIDTH-1:2]};
			           y[3] <= y[2] - {{2{x[2][DATA_WIDTH-1]}},x[2][DATA_WIDTH-1:2]};
			           z[3] <= z[2] + 12'h03E;
		         end
		         
		  // 旋转7.13度
		         if(y[3][DATA_WIDTH-1])
		         begin 
			           x[4] <= x[3] - {{3{y[3][DATA_WIDTH-1]}},y[3][DATA_WIDTH-1:3]};
			           y[4] <= y[3] + {{3{x[3][DATA_WIDTH-1]}},x[3][DATA_WIDTH-1:3]};
			           z[4] <= z[3] - 12'h01F;
		         end
		         else 
		         begin 
			           x[4] <= x[3] + {{3{y[3][DATA_WIDTH-1]}},y[3][DATA_WIDTH-1:3]};
			           y[4] <= y[3] - {{3{x[3][DATA_WIDTH-1]}},x[3][DATA_WIDTH-1:3]};
			           z[4] <= z[3] + 12'h01F;
		         end
		         
		  // 旋转3.58度
		         if(y[4][DATA_WIDTH-1])
		         begin 
			           x[5] <= x[4] - {{4{y[4][DATA_WIDTH-1]}},y[4][DATA_WIDTH-1:4]};
			           y[5] <= y[4] + {{4{x[4][DATA_WIDTH-1]}},x[4][DATA_WIDTH-1:4]};
			           z[5] <= z[4] - 12'h00F;
		         end
		         else 
		         begin 
			           x[5] <= x[4] + {{4{y[4][DATA_WIDTH-1]}},y[4][DATA_WIDTH-1:4]};
			           y[5] <= y[4] - {{4{x[4][DATA_WIDTH-1]}},x[4][DATA_WIDTH-1:4]};
			           z[5] <= z[4] + 12'h00F;
		         end
		         
		  // 旋转1.79度
		         if(y[5][DATA_WIDTH-1])
		         begin 
			           x[6] <= x[5] - {{5{y[5][DATA_WIDTH-1]}},y[5][DATA_WIDTH-1:5]};
			           y[6] <= y[5] + {{5{x[5][DATA_WIDTH-1]}},x[5][DATA_WIDTH-1:5]};
			           z[6] <= z[5] - 12'h007;
		         end
		         else 
		         begin 
			           x[6] <= x[5] + {{5{y[5][DATA_WIDTH-1]}},y[5][DATA_WIDTH-1:5]};
			           y[6] <= y[5] - {{5{x[5][DATA_WIDTH-1]}},x[5][DATA_WIDTH-1:5]};
			           z[6] <= z[5] + 12'h007;
		         end
		         
		  // 旋转0.90度
		         if(y[6][DATA_WIDTH-1])
		         begin 
			           x[7] <= x[6] - {{6{y[6][DATA_WIDTH-1]}},y[6][DATA_WIDTH-1:6]};
			           y[7] <= y[6] + {{6{x[6][DATA_WIDTH-1]}},x[6][DATA_WIDTH-1:6]};
			           z[7] <= z[6] - 12'h003;
		         end
		         else 
		         begin 
			           x[7] <= x[6] + {{6{y[6][DATA_WIDTH-1]}},y[6][DATA_WIDTH-1:6]};
			           y[7] <= y[6] - {{6{x[6][DATA_WIDTH-1]}},x[6][DATA_WIDTH-1:6]};
			           z[7] <= z[6] + 12'h003;
		         end
		         
		  // 旋转0.45度
		         if(y[7][DATA_WIDTH-1])
		         begin 
			           x[8] <= x[7] - {{7{y[7][DATA_WIDTH-1]}},y[7][DATA_WIDTH-1:7]};
			           y[8] <= y[7] + {{7{x[7][DATA_WIDTH-1]}},x[7][DATA_WIDTH-1:7]};
			           z[8] <= z[7] - 12'h001;
		         end
		         else 
		         begin 
			           x[8] <= x[7] + {{7{y[7][DATA_WIDTH-1]}},y[7][DATA_WIDTH-1:7]};
			           y[8] <= y[7] - {{7{x[7][DATA_WIDTH-1]}},x[7][DATA_WIDTH-1:7]};
			           z[8] <= z[7] + 12'h001;
		         end
		  
	       end
	    end
	        
	assign angle_out = z[8];
	      
endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -