cordic算法verilog实现(复杂版)

[复制链接]
2343|2
 楼主| xjsxjtu 发表于 2012-10-17 20:43 | 显示全部楼层 |阅读模式
  1. module cordic (clk,rst_n,ena,phase_in,sin_out,cos_out,eps);

  2. parameter DATA_WIDTH=8;
  3. parameter PIPELINE=8;
  4. input     clk;
  5. input     rst_n;
  6. input     ena;
  7. input  [DATA_WIDTH-1:0]         phase_in;

  8. output [DATA_WIDTH-1:0]  sin_out;   
  9. output [DATA_WIDTH-1:0]  cos_out;
  10. output [DATA_WIDTH-1:0]  eps;

  11. reg    [DATA_WIDTH-1:0]  sin_out;
  12. reg    [DATA_WIDTH-1:0]  cos_out;
  13. reg    [DATA_WIDTH-1:0]  eps;

  14. reg    [DATA_WIDTH-1:0]  phase_in_reg;

  15. reg        [DATA_WIDTH-1:0]     x0,y0,z0;
  16. reg        [DATA_WIDTH-1:0]  x1,y1,z1;
  17. reg        [DATA_WIDTH-1:0]  x2,y2,z2;
  18. reg        [DATA_WIDTH-1:0]  x3,y3,z3;
  19. reg        [DATA_WIDTH-1:0]  x4,y4,z4;
  20. reg        [DATA_WIDTH-1:0]  x5,y5,z5;
  21. reg        [DATA_WIDTH-1:0]  x6,y6,z6;
  22. reg        [DATA_WIDTH-1:0]  x7,y7,z7;

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

  24. integer i;

  25. //get real quadrant and map to first_n quadrant

  26. always@(posedge clk or negedge rst_n)
  27. begin
  28.         if(!rst_n)
  29.                phase_in_reg<=8'b0000_0000;
  30.         else
  31.                if(ena)
  32.                        begin
  33.                                case(phase_in[7:6])
  34.                                       2'b00:phase_in_reg<=phase_in;
  35.                                       2'b01:phase_in_reg<=phase_in-8'h40;  //-pi/2
  36.                                       2'b10:phase_in_reg<=phase_in-8'h80;  //-pi
  37.                                       2'b11:phase_in_reg<=phase_in-8'hc0;  //-3pi/2
  38.                                       default:;
  39.                                 endcase
  40.                         end
  41. end

  42. always@(posedge clk or negedge rst_n)
  43. begin
  44.         if(!rst_n)
  45.                begin
  46.                        x0<=8'b0000_0000;
  47.                        y0<=8'b0000_0000;
  48.                        z0<=8'b0000_0000;
  49.                end
  50.          else
  51.                if(ena)
  52.                        begin
  53.                                x0<=8'h4D;  //define aggregate constant Xi=1/P=1/1.6467=0.60725 (Xi=2^7*P+8'h4D)
  54.                                y0<=8'h00;
  55.                                z0<=phase_in_reg;
  56.                        end
  57. end

  58. //level 1
  59. always@(posedge clk or negedge rst_n)
  60. begin
  61.         if(!rst_n)
  62.                begin
  63.                        x1<=8'b0000_0000;
  64.                        y1<=8'b0000_0000;
  65.                        z1<=8'b0000_0000;
  66.                end
  67.          else
  68.                 if(ena)
  69.                        if(z0[7]==1'b0)
  70.                                begin
  71.                                       x1<=x0-y0;
  72.                                       y1<=y0+x0;
  73.                                       z1<=z0-8'h20;  //45deg
  74.                                end
  75.                else
  76.                        begin
  77.                                       x1<=x0+y0;
  78.                                       y1<=y0-x0;
  79.                                       z1<=z0+8'h20;  //45deg  
  80.                end      
  81. end

  82. //level 2
  83. always@(posedge clk or negedge rst_n)
  84. begin
  85.         if(!rst_n)
  86.                begin
  87.                        x2<=8'b0000_0000;
  88.                        y2<=8'b0000_0000;
  89.                        z2<=8'b0000_0000;
  90.                end
  91.          else
  92.                 if(ena)
  93.                        if(z1[7]==1'b0)
  94.                                begin
  95.                                       x2<=x1-{y1[DATA_WIDTH-1],y1[DATA_WIDTH-1:1]};
  96.                                       y2<=y1+{x1[DATA_WIDTH-1],x1[DATA_WIDTH-1:1]};
  97.                                       z2<=z1-8'h12;  //26deg
  98.                                end
  99.                         else
  100.                                begin
  101.                                       x2<=x1+{y1[DATA_WIDTH-1],y1[DATA_WIDTH-1:1]};
  102.                                       y2<=y1-{x1[DATA_WIDTH-1],x1[DATA_WIDTH-1:1]};
  103.                                       z2<=z1+8'h12;
  104.                                end
  105. end

  106. //level 3   
  107. always@(posedge clk or negedge rst_n)
  108. begin
  109.         if(!rst_n)
  110.                begin
  111.                        x3<=8'b0000_0000;
  112.                        y3<=8'b0000_0000;
  113.                        z3<=8'b0000_0000;
  114.                 end
  115.          else
  116.                 if(ena)
  117.                        if(z2[7]==1'b0)
  118.                                begin
  119.                                       x3<=x2-{{2{y2[DATA_WIDTH-1]}},y2[DATA_WIDTH-1:2]};
  120.                                       y3<=y2+{{2{x2[DATA_WIDTH-1]}},x2[DATA_WIDTH-1:2]};
  121.                                       z3<=z2-8'h09;  //14deg
  122.                                end
  123.                         else
  124.                                begin
  125.                                       x3<=x2+{{2{y2[DATA_WIDTH-1]}},y2[DATA_WIDTH-1:2]};
  126.                                       y3<=y2-{{2{x2[DATA_WIDTH-1]}},x2[DATA_WIDTH-1:2]};
  127.                                       z3<=z2+8'h09;
  128.                                end
  129. end

  130. //level 4
  131. always@(posedge clk or negedge rst_n)
  132. begin
  133.         if(!rst_n)
  134.                begin
  135.                        x4<=8'b0000_0000;
  136.                        y4<=8'b0000_0000;
  137.                        z4<=8'b0000_0000;
  138.                end
  139.          else
  140.                 if(ena)
  141.                        if(z3[7]==1'b0)
  142.                                begin
  143.                                       x4<=x3-{{3{y3[DATA_WIDTH-1]}},y3[DATA_WIDTH-1:3]};
  144.                                       y4<=y3+{{3{x3[DATA_WIDTH-1]}},x3[DATA_WIDTH-1:3]};
  145.                                       z4<=z3-8'h04;  //7deg
  146.                                end
  147.                         else
  148.                                begin
  149.                                       x4<=x3+{{3{y3[DATA_WIDTH-1]}},y3[DATA_WIDTH-1:3]};
  150.                                       y4<=y3-{{3{x3[DATA_WIDTH-1]}},x3[DATA_WIDTH-1:3]};
  151.                                       z4<=z3+8'h04;
  152.                                end
  153. end

  154. //level 5
  155. always@(posedge clk or negedge rst_n)
  156. begin
  157.         if(!rst_n)
  158.                begin
  159.                        x5<=8'b0000_0000;
  160.                        y5<=8'b0000_0000;
  161.                        z5<=8'b0000_0000;
  162.                end
  163.          else
  164.                 if(ena)
  165.                        if(z4[7]==1'b0)
  166.                                begin
  167.                                       x5<=x4-{{4{y4[DATA_WIDTH-1]}},y4[DATA_WIDTH-1:4]};
  168.                                       y5<=y4+{{4{x4[DATA_WIDTH-1]}},x4[DATA_WIDTH-1:4]};
  169.                                       z5<=z4-8'h02;  //4deg
  170.                                end
  171.                         else
  172.                                begin
  173.                                       x5<=x4+{{4{y4[DATA_WIDTH-1]}},y4[DATA_WIDTH-1:4]};
  174.                                       y5<=y4-{{4{x4[DATA_WIDTH-1]}},x4[DATA_WIDTH-1:4]};
  175.                                       z5<=z4+8'h02;
  176.                                end
  177. end

  178. //level 6
  179. always@(posedge clk or negedge rst_n)
  180. begin
  181.         if(!rst_n)
  182.                begin
  183.                        x6<=8'b0000_0000;
  184.                        y6<=8'b0000_0000;
  185.                        z6<=8'b0000_0000;
  186.                end
  187.          else
  188.                 if(ena)
  189.                        if(z5[7]==1'b0)
  190.                                begin
  191.                                       x6<=x5-{{5{y5[DATA_WIDTH-1]}},y5[DATA_WIDTH-1:5]};
  192.                                       y6<=y5+{{5{x5[DATA_WIDTH-1]}},x5[DATA_WIDTH-1:5]};
  193.         z6<=z5-8'h01;  //2deg
  194.                                end
  195.                         else
  196.                               begin
  197.                                       x6<=x5+{{5{y5[DATA_WIDTH-1]}},y5[DATA_WIDTH-1:5]};
  198.                                       y6<=y5-{{5{x5[DATA_WIDTH-1]}},x5[DATA_WIDTH-1:5]};
  199.                                       z6<=z5+8'h01;
  200.                                end
  201. end

  202. always@(posedge clk or negedge rst_n)
  203. begin
  204.         if(!rst_n)
  205.             for(i=0;i<=PIPELINE;i=i+1)
  206.                        quadrant[i]<=2'b00;
  207.         else
  208.                if(ena)
  209.                        begin
  210.                          for(i=0;i<PIPELINE;i=i+1)
  211.                             quadrant[i+1]<= quadrant[i];
  212.                             quadrant[0]<=phase_in[7:6];
  213.                         end
  214. end

  215. always@(posedge clk or negedge rst_n)
  216. begin
  217.      if(!rst_n)
  218.          begin
  219.            sin_out<=8'b0000_0000;
  220.            cos_out<=8'b0000_0000;
  221. eps<=8'b0000_0000;
  222.          end
  223.      else
  224.         if(ena)
  225.            case(quadrant[7])
  226.              2'b00:begin
  227.                 sin_out<=y6;
  228.                 cos_out<=x6;
  229.                 eps<=z6;
  230.              end
  231.               2'b01:begin
  232.                  sin_out<=x6;
  233.                  cos_out<=~(y6)+ 1'b1;
  234.                  eps<=z6;
  235.              end
  236.             2'b10:begin
  237.                  sin_out<=~(y6)+ 1'b1;
  238.                  cos_out<=~(x6)+ 1'b1;
  239.                  eps<=z6;
  240.             end
  241.             2'b11:begin
  242.                  sin_out<=~(x6)+ 1'b1;
  243.                  cos_out<=y6;
  244.                  eps<=z6;
  245.             end
  246.          encase
  247. end
  248. endmodule
zhoumingzr 发表于 2012-10-29 19:26 | 显示全部楼层
带走了- -
GoldSunMonkey 发表于 2012-10-29 23:00 | 显示全部楼层
:lol谢谢分享啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

328

主题

1073

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部