📄 cordic_atan.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 + -