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
相关文章推荐
- 基于FPGA的cordic算法的verilog初步实现
- Cordic算法——verilog实现
- verilog实现:比流水线法更简单的cordic算法
- cordic算法原理及verilog实现
- verilog实现基于Cordic算法的双曲函数计算
- 基于FPGA的CORDIC算法实现——Verilog版
- verilog实现基于Cordic算法的双曲函数计算
- cordic算法原理及verilog实现
- 数据结构(基于python实现)02-算法复杂度分析
- 一种可实时处理 O(1)复杂度图像去雾算法的实现。
- 一种可实时处理 O(1)复杂度图像去雾算法的实现。
- 一种可实时处理 O(1)复杂度图像去雾算法的实现。
- CRC算法原理及其Verilog实现
- 已知一个整数数组A[n],写出算法实现将奇数元素放在数组的左边,将偶数放在数组的右边。要求时间复杂度为O(n)。
- 算法的verilog实现-FIR滤波器的设计实现
- 实现数组元素倒序的算法,写出两种实现,时间复杂度为O(n)和O(n/2)
- CRC算法原理及其Verilog实现
- 任意半径中值滤波(扩展至百分比滤波器)O(1)时间复杂度算法的原理、实现及效果。
- CORDIC的硬件算法实现(摘录整理)
- 一种可实时处理 O(1)复杂度图像去雾算法的实现。