您的位置:首页 > 其它

cordic算法verilog实现(复杂版)

2011-01-14 16:42 435 查看
modulecordic(clk,rst_n,ena,phase_in,sin_out,cos_out,eps);

parameterDATA_WIDTH=8;

parameterPIPELINE=8;

inputclk;

inputrst_n;

inputena;

input[DATA_WIDTH-1:0]phase_in;


output[DATA_WIDTH-1:0]sin_out;

output[DATA_WIDTH-1:0]cos_out;

output[DATA_WIDTH-1:0]eps;


reg[DATA_WIDTH-1:0]sin_out;

reg[DATA_WIDTH-1:0]cos_out;

reg[DATA_WIDTH-1:0]eps;


reg[DATA_WIDTH-1:0]phase_in_reg;


reg[DATA_WIDTH-1:0]x0,y0,z0;

reg[DATA_WIDTH-1:0]x1,y1,z1;

reg[DATA_WIDTH-1:0]x2,y2,z2;

reg[DATA_WIDTH-1:0]x3,y3,z3;

reg[DATA_WIDTH-1:0]x4,y4,z4;

reg[DATA_WIDTH-1:0]x5,y5,z5;

reg[DATA_WIDTH-1:0]x6,y6,z6;

reg[DATA_WIDTH-1:0]x7,y7,z7;


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


integeri;


//getrealquadrantandmaptofirst_nquadrant


always@(posedgeclkornegedgerst_n)

begin

if(!rst_n)

phase_in_reg<=8'b0000_0000;

else

if(ena)

begin

case(phase_in[7:6])

2'b00:phase_in_reg<=phase_in;

2'b01:phase_in_reg<=phase_in-8'h40;//-pi/2

2'b10:phase_in_reg<=phase_in-8'h80;//-pi

2'b11:phase_in_reg<=phase_in-8'hc0;//-3pi/2

default:;

endcase

end

end


always@(posedgeclkornegedgerst_n)

begin

if(!rst_n)

begin

x0<=8'b0000_0000;

y0<=8'b0000_0000;

z0<=8'b0000_0000;

end

else

if(ena)

begin

x0<=8'h4D;//defineaggregateconstantXi=1/P=1/1.6467=0.60725(Xi=2^7*P+8'h4D)

y0<=8'h00;

z0<=phase_in_reg;

end

end


//level1

always@(posedgeclkornegedgerst_n)

begin

if(!rst_n)

begin

x1<=8'b0000_0000;

y1<=8'b0000_0000;

z1<=8'b0000_0000;

end

else

if(ena)

if(z0[7]==1'b0)

begin

x1<=x0-y0;

y1<=y0+x0;

z1<=z0-8'h20;//45deg

end

else

begin

x1<=x0+y0;

y1<=y0-x0;

z1<=z0+8'h20;//45deg

end

end


//level2

always@(posedgeclkornegedgerst_n)

begin

if(!rst_n)

begin

x2<=8'b0000_0000;

y2<=8'b0000_0000;

z2<=8'b0000_0000;

end

else

if(ena)

if(z1[7]==1'b0)

begin

x2<=x1-{y1[DATA_WIDTH-1],y1[DATA_WIDTH-1:1]};

y2<=y1+{x1[DATA_WIDTH-1],x1[DATA_WIDTH-1:1]};

z2<=z1-8'h12;//26deg

end

else

begin

x2<=x1+{y1[DATA_WIDTH-1],y1[DATA_WIDTH-1:1]};

y2<=y1-{x1[DATA_WIDTH-1],x1[DATA_WIDTH-1:1]};

z2<=z1+8'h12;

end

end


//level3

always@(posedgeclkornegedgerst_n)

begin

if(!rst_n)

begin

x3<=8'b0000_0000;

y3<=8'b0000_0000;

z3<=8'b0000_0000;

end

else

if(ena)

if(z2[7]==1'b0)

begin

x3<=x2-{{2{y2[DATA_WIDTH-1]}},y2[DATA_WIDTH-1:2]};

y3<=y2+{{2{x2[DATA_WIDTH-1]}},x2[DATA_WIDTH-1:2]};

z3<=z2-8'h09;//14deg

end

else

begin

x3<=x2+{{2{y2[DATA_WIDTH-1]}},y2[DATA_WIDTH-1:2]};

y3<=y2-{{2{x2[DATA_WIDTH-1]}},x2[DATA_WIDTH-1:2]};

z3<=z2+8'h09;

end

end


//level4

always@(posedgeclkornegedgerst_n)

begin

if(!rst_n)

begin

x4<=8'b0000_0000;

y4<=8'b0000_0000;

z4<=8'b0000_0000;

end

else

if(ena)

if(z3[7]==1'b0)

begin

x4<=x3-{{3{y3[DATA_WIDTH-1]}},y3[DATA_WIDTH-1:3]};

y4<=y3+{{3{x3[DATA_WIDTH-1]}},x3[DATA_WIDTH-1:3]};

z4<=z3-8'h04;//7deg

end

else

begin

x4<=x3+{{3{y3[DATA_WIDTH-1]}},y3[DATA_WIDTH-1:3]};

y4<=y3-{{3{x3[DATA_WIDTH-1]}},x3[DATA_WIDTH-1:3]};

z4<=z3+8'h04;

end

end


//level5

always@(posedgeclkornegedgerst_n)

begin

if(!rst_n)

begin

x5<=8'b0000_0000;

y5<=8'b0000_0000;

z5<=8'b0000_0000;

end

else

if(ena)

if(z4[7]==1'b0)

begin

x5<=x4-{{4{y4[DATA_WIDTH-1]}},y4[DATA_WIDTH-1:4]};

y5<=y4+{{4{x4[DATA_WIDTH-1]}},x4[DATA_WIDTH-1:4]};

z5<=z4-8'h02;//4deg

end

else

begin

x5<=x4+{{4{y4[DATA_WIDTH-1]}},y4[DATA_WIDTH-1:4]};

y5<=y4-{{4{x4[DATA_WIDTH-1]}},x4[DATA_WIDTH-1:4]};

z5<=z4+8'h02;

end

end


//level6

always@(posedgeclkornegedgerst_n)

begin

if(!rst_n)

begin

x6<=8'b0000_0000;

y6<=8'b0000_0000;

z6<=8'b0000_0000;

end

else

if(ena)

if(z5[7]==1'b0)

begin

x6<=x5-{{5{y5[DATA_WIDTH-1]}},y5[DATA_WIDTH-1:5]};

y6<=y5+{{5{x5[DATA_WIDTH-1]}},x5[DATA_WIDTH-1:5]};

z6<=z5-8'h01;//2deg

end

else

begin

x6<=x5+{{5{y5[DATA_WIDTH-1]}},y5[DATA_WIDTH-1:5]};

y6<=y5-{{5{x5[DATA_WIDTH-1]}},x5[DATA_WIDTH-1:5]};

z6<=z5+8'h01;

end

end


always@(posedgeclkornegedgerst_n)

begin

if(!rst_n)

for(i=0;i<=PIPELINE;i=i+1)

quadrant[i]<=2'b00;

else

if(ena)

begin

for(i=0;i<PIPELINE;i=i+1)

quadrant[i+1]<=quadrant[i];

quadrant[0]<=phase_in[7:6];

end

end


always@(posedgeclkornegedgerst_n)

begin

if(!rst_n)

begin

sin_out<=8'b0000_0000;

cos_out<=8'b0000_0000;

eps<=8'b0000_0000;

end

else

if(ena)

case(quadrant[7])

2'b00:begin

sin_out<=y6;

cos_out<=x6;

eps<=z6;

end

2'b01:begin

sin_out<=x6;

cos_out<=~(y6)+1'b1;

eps<=z6;

end

2'b10:begin

sin_out<=~(y6)+1'b1;

cos_out<=~(x6)+1'b1;

eps<=z6;

end

2'b11:begin

sin_out<=~(x6)+1'b1;

cos_out<=y6;

eps<=z6;

end

encase

end

endmodule


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: