基于Verilog的CORDIC算法

上传人:ning****hua 文档编号:65563596 上传时间:2022-03-24 格式:DOC 页数:10 大小:67KB
返回 下载 相关 举报
基于Verilog的CORDIC算法_第1页
第1页 / 共10页
基于Verilog的CORDIC算法_第2页
第2页 / 共10页
基于Verilog的CORDIC算法_第3页
第3页 / 共10页
点击查看更多>>
资源描述
module cordic(clk, phi, cos, sin);parameter W = 13, W_Z = 14;input clk;input W_Z-1:0 phi;outputW-1:0 cos, sin;reg W-1:0 cos, sin;reg W-1:0 x8:0, y8:0;reg W_Z-1:0 z7:0;always (posedge clk)beginx0 = 13h4D;/ 修正CORDIC算法的比例因子,An的倒数y0 = 13h00;z0 = phi;/ 旋转45度if(z0W_Z-1) beginx1 = x0 + y0;y1 = y0 - x0;z1 = z0 + 14h65;endelse beginx1 = x0 - y0;y1 = y0 + x0;z1 = z0 - 14h65;end/ 旋转26.57度if(z1W_Z-1)beginx2 = x1 + 1y1W-1, y1W-1:1;y2 = y1 - 1x1W-1, x1W-1:1;z2 = z1 + 14h3B;endelse beginx2 = x1 - 1y1W-1, y1W-1:1;y2 = y1 + 1x1W-1, x1W-1:1;z2 = z1 - 14h3B;end/ 旋转14.04度if(z2W_Z-1)beginx3 = x2 + 2y2W-1, y2W-1:2;y3 = y2 - 2x2W-1, x2W-1:2;z3 = z2 + 14h1F;endelse beginx3 = x2 - 2y2W-1, y2W-1:2;y3 = y2 + 2x2W-1, x2W-1:2;z3 = z2 - 14h1F;end/ 旋转7.13度if(z3W_Z-1)beginx4 = x3 + 3y3W-1, y3W-1:3;y4 = y3 - 3x3W-1, x3W-1:3;z4 = z3 + 14h10;endelse beginx4 = x3 - 3y3W-1, y3W-1:3;y4 = y3 + 3x3W-1, x3W-1:3;z4 = z3 - 14h10;end/ 旋转3.58度if(z4W_Z-1)beginx5 = x4 + 4y4W-1, y4W-1:4;y5 = y4 - 4x4W-1, x4W-1:4;z5 = z4 + 14h8;endelse beginx5 = x4 - 4y4W-1, y4W-1:4;y5 = y4 + 4x4W-1, x4W-1:4;z5 = z4 - 14h8;end/ 旋转1.79度if(z5W_Z-1)beginx6 = x5 + 5y5W-1, y5W-1:5;y6 = y5 - 5x5W-1, x5W-1:5;z6 = z5 + 14h4;endelse beginx6 = x5 - 5y5W-1, y5W-1:5;y6 = y5 + 5x5W-1, x5W-1:5;z6 = z5 - 14h4;end/ 旋转0.90度if(z6W_Z-1)beginx7 = x6 + 6y6W-1, y6W-1:6;y7 = y6 - 6x6W-1,x6W-1:6;z7 = z6 + 14h2;endelse beginx7 = x6 - 6y6W-1, y6W-1:6;y7 = y6 + 6x6W-1, x6W-1:6;z7 = z6 - 14h2;end/ 旋转0.45度if(z7W_Z-1)beginx8 = x7 + 7y7W-1, y7W-1:7;y8 = y7 - 7x7W-1, x7W-1:7;endelse beginx8 = x7 - 7y7W-1, y7W-1:7;y8 = y7 + 7x7W-1, x7W-1:7;endcos = x8;sin = y8;endendmodule简单版 module cordic (clk,rst_n,ena,phase_in,sin_out,cos_out,eps);parameter DATA_WIDTH=8; parameter PIPELINE=8; input clk; input rst_n; input ena; 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:0quadrantPIPELINE:0; integer i; /get real quadrant and map to first_n quadrant always(posedge clk or negedge rst_n) begin if(!rst_n) phase_in_reg=8b0000_0000; else if(ena) begin case(phase_in7:6) 2b00:phase_in_reg=phase_in; 2b01:phase_in_reg=phase_in-8h40; /-pi/2 2b10:phase_in_reg=phase_in-8h80; /-pi 2b11:phase_in_reg=phase_in-8hc0; /-3pi/2 default:; endcase end end always(posedge clk or negedge rst_n) begin if(!rst_n) begin x0=8b0000_0000; y0=8b0000_0000; z0=8b0000_0000; end else if(ena) begin x0=8h4D; /define aggregate constant Xi=1/P=1/1.6467=0.60725 (Xi=27*P+8h4D) y0=8h00; z0=phase_in_reg; end end /level 1 always(posedge clk or negedge rst_n) begin if(!rst_n) begin x1=8b0000_0000; y1=8b0000_0000; z1=8b0000_0000; end else if(ena) if(z07=1b0) begin x1=x0-y0; y1=y0+x0; z1=z0-8h20; /45deg end else begin x1=x0+y0; y1=y0-x0; z1=z0+8h20; /45deg end end /level 2 always(posedge clk or negedge rst_n) begin if(!rst_n) begin x2=8b0000_0000; y2=8b0000_0000; z2=8b0000_0000; end else if(ena) if(z17=1b0) begin x2=x1-y1DATA_WIDTH-1,y1DATA_WIDTH-1:1; y2=y1+x1DATA_WIDTH-1,x1DATA_WIDTH-1:1; z2=z1-8h12; /26deg end else begin x2=x1+y1DATA_WIDTH-1,y1DATA_WIDTH-1:1; y2=y1-x1DATA_WIDTH-1,x1DATA_WIDTH-1:1; z2=z1+8h12; end end /level 3 always(posedge clk or negedge rst_n) begin if(!rst_n) begin x3=8b0000_0000; y3=8b0000_0000; z3=8b0000_0000; end else if(ena) if(z27=1b0) begin x3=x2-2y2DATA_WIDTH-1,y2DATA_WIDTH-1:2; y3=y2+2x2DATA_WIDTH-1,x2DATA_WIDTH-1:2; z3=z2-8h09; /14deg end else begin x3=x2+2y2DATA_WIDTH-1,y2DATA_WIDTH-1:2; y3=y2-2x2DATA_WIDTH-1,x2DATA_WIDTH-1:2; z3=z2+8h09; end end /level 4 always(posedge clk or negedge rst_n) begin if(!rst_n) begin x4=8b0000_0000; y4=8b0000_0000; z4=8b0000_0000; end else if(ena) if(z37=1b0) begin x4=x3-3y3DATA_WIDTH-1,y3DATA_WIDTH-1:3; y4=y3+3x3DATA_WIDTH-1,x3DATA_WIDTH-1:3; z4=z3-8h04; /7deg end else begin x4=x3+3y3DATA_WIDTH-1,y3DATA_WIDTH-1:3; y4=y3-3x3DATA_WIDTH-1,x3DATA_WIDTH-1:3; z4=z3+8h04; end end /level 5 always(posedge clk or negedge rst_n) begin if(!rst_n) begin x5=8b0000_0000; y5=8b0000_0000; z5=8b0000_0000; end else if(ena) if(z47=1b0) begin x5=x4-4y4DATA_WIDTH-1,y4DATA_WIDTH-1:4; y5=y4+4x4DATA_WIDTH-1,x4DATA_WIDTH-1:4; z5=z4-8h02; /4deg end else begin x5=x4+4y4DATA_WIDTH-1,y4DATA_WIDTH-1:4; y5=y4-4x4DATA_WIDTH-1,x4DATA_WIDTH-1:4; z5=z4+8h02; end end /level 6 always(posedge clk or negedge rst_n) begin if(!rst_n) begin x6=8b0000_0000; y6=8b0000_0000; z6=8b0000_0000; end else if(ena) if(z57=1b0) begin x6=x5-5y5DATA_WIDTH-1,y5DATA_WIDTH-1:5; y6=y5+5x5DATA_WIDTH-1,x5DATA_WIDTH-1:5; z6=z5-8h01; /2deg end else begin x6=x5+5y5DATA_WIDTH-1,y5DATA_WIDTH-1:5; y6=y5-5x5DATA_WIDTH-1,x5DATA_WIDTH-1:5; z6=z5+8h01; end end always(posedge clk or negedge rst_n) begin if(!rst_n) for(i=0;i=PIPELINE;i=i+1) quadranti=2b00; else if(ena) begin for(i=0;iPIPELINE;i=i+1) quadranti+1= quadranti; quadrant0=phase_in7:6; endendalways(posedge clk or negedge rst_n) begin if(!rst_n) begin sin_out=8b0000_0000; cos_out=8b0000_0000;eps=8b0000_0000; end else if(ena) case(quadrant7) 2b00:begin sin_out=y6; cos_out=x6; eps=z6; end 2b01:begin sin_out=x6; cos_out=(y6)+ 1b1; eps=z6; end 2b10:begin sin_out=(y6)+ 1b1; cos_out=(x6)+ 1b1; eps=z6; end 2b11:begin sin_out=(x6)+ 1b1; cos_out=y6; eps=z6; end encaseendendmodule
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 商业管理 > 营销创新


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!