|
`timescale 1ns/1ns
module cordic_arctan(clk, clk_en,reset,done,result,dataa,datab);
parameter W = 32, W_Z = 32;
input clk;
//input[W-1:0] x_in;
//input[W-1:0] y_in;
//output reg[W-1:0] x_out;
//output reg[W-1:0] y_out;
//output reg[W_Z-1:0] z_out;
input clk_en;
input reset;
output reg done;
input [31:0] dataa;
input [31:0] datab;
output reg[31:0] result;
reg [W-1:0] x[10:0], y[10:0];
reg [W_Z-1:0] z[10:0];
always @(posedge clk or posedge reset)
begin
if(reset)
z[0] <= 32'h0;
else
begin
x[0] <= dataa;
y[0] <= datab;
z[0] <= 32'h0;
// 旋转45度
if(~y[0][W-1]) begin
x[1] <= x[0] + y[0];
y[1] <= y[0] - x[0];
z[1] <= z[0] + 32'h20000;
end
else begin
x[1] <= x[0] - y[0];
y[1] <= y[0] + x[0];
z[1] <= z[0] - 32'h20000;
end
// 旋转26.57度
if(~y[1][W-1])begin
x[2] <= x[1] + {{1{y[1][W-1]}}, y[1][W-1:1]};
y[2] <= y[1] - {{1{x[1][W-1]}}, x[1][W-1:1]};
z[2] <= z[1] + 32'h12e40;
end
else begin
x[2] <= x[1] - {{1{y[1][W-1]}}, y[1][W-1:1]};
y[2] <= y[1] + {{1{x[1][W-1]}}, x[1][W-1:1]};
z[2] <= z[1] - 32'h12e40;
end
// 旋转14.04度
if(~y[2][W-1])begin
x[3] <= x[2] + {{2{y[2][W-1]}}, y[2][W-1:2]};
y[3] <= y[2] - {{2{x[2][W-1]}}, x[2][W-1:2]};
z[3] <= z[2] + 32'h09fb4;
end
else begin
x[3] <= x[2] - {{2{y[2][W-1]}}, y[2][W-1:2]};
y[3] <= y[2] + {{2{x[2][W-1]}}, x[2][W-1:2]};
z[3] <= z[2] - 32'h09fb4;
end
// 旋转7.13度
if(~y[3][W-1])begin
x[4] <= x[3] + {{3{y[3][W-1]}}, y[3][W-1:3]};
y[4] <= y[3] - {{3{x[3][W-1]}}, x[3][W-1:3]};
z[4] <= z[3] + 32'h05111;
end
else begin
x[4] <= x[3] - {{3{y[3][W-1]}}, y[3][W-1:3]};
y[4] <= y[3] + {{3{x[3][W-1]}}, x[3][W-1:3]};
z[4] <= z[3] - 32'h05111;
end
// 旋转3.58度
if(~y[4][W-1])begin
x[5] <= x[4] + {{4{y[4][W-1]}}, y[4][W-1:4]};
y[5] <= y[4] - {{4{x[4][W-1]}}, x[4][W-1:4]};
z[5] <= z[4] + 32'h028b1;
end
else begin
x[5] <= x[4] - {{4{y[4][W-1]}}, y[4][W-1:4]};
y[5] <= y[4] + {{4{x[4][W-1]}}, x[4][W-1:4]};
z[5] <= z[4] - 32'h028b1;
end
// 旋转1.79度
if(~y[5][W-1])begin
x[6] <= x[5] + {{5{y[5][W-1]}}, y[5][W-1:5]};
y[6] <= y[5] - {{5{x[5][W-1]}}, x[5][W-1:5]};
z[6] <= z[5] + 32'h0145d;
end
else begin
x[6] <= x[5] - {{5{y[5][W-1]}}, y[5][W-1:5]};
y[6] <= y[5] + {{5{x[5][W-1]}}, x[5][W-1:5]};
z[6] <= z[5] - 32'h0145d;
end
// 旋转0.90度
if(~y[6][W-1])begin
x[7] <= x[6] + {{6{y[6][W-1]}}, y[6][W-1:6]};
y[7] <= y[6] - {{6{x[6][W-1]}}, x[6][W-1:6]};
z[7] <= z[6] + 32'h00a2f;
end
else begin
x[7] <= x[6] - {{6{y[6][W-1]}}, y[6][W-1:6]};
y[7] <= y[6] + {{6{x[6][W-1]}}, x[6][W-1:6]};
z[7] <= z[6] - 32'h00a2f;
end
// 旋转0.45度
if(~y[7][W-1])begin
x[8] <= x[7] + {{7{y[7][W-1]}}, y[7][W-1:7]};
y[8] <= y[7] - {{7{x[7][W-1]}}, x[7][W-1:7]};
z[8] <= z[7] + 32'h00518;
end
else begin
x[8] <= x[7] - {{7{y[7][W-1]}}, y[7][W-1:7]};
y[8] <= y[7] + {{7{x[7][W-1]}}, x[7][W-1:7]};
z[8] <= z[7] - 32'h00518;
end
//0.225
if(~y[8][W-1])begin
x[9] <= x[8] + {{8{y[8][W-1]}}, y[8][W-1:8]};
y[9] <= y[8] - {{8{x[8][W-1]}}, x[8][W-1:8]};
z[9] <= z[8] + 32'h0028c;
end
else begin
x[9] <= x[8] - {{8{y[8][W-1]}}, y[8][W-1:8]};
y[9] <= y[8] + {{8{x[8][W-1]}}, x[8][W-1:8]};
z[9] <= z[8] - 32'h0028c;
end
//0.1125
if(~y[9][W-1])begin
x[10] <= x[9] + {{9{y[9][W-1]}}, y[9][W-1:9]};
y[10] <= y[9] - {{9{x[9][W-1]}}, x[9][W-1:9]};
z[10] <= z[9] + 32'h00146;
done <= 1;
end
else begin
x[10] <= x[9] - {{9{y[9][W-1]}}, y[9][W-1:9]};
y[10] <= y[9] + {{9{x[9][W-1]}}, x[9][W-1:9]};
z[10] <= z[9] - 32'h00146;
done <= 1;
end
//x_out <= x[10];
//y_out <= y[10];
result <= z[10];
end
end
endmodule
我遇到的问题是:自定义指令里面的控制信号start,done和clk_en,,,不知道怎样用到我的程序里面,,,求详细解答!!!
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|