首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

模块的例化问题

模块的例化问题

我写了一个算法模块
  • module cordic(clk,rst_n,x,out);
  • parameter DATA_Length=16;   //数据长度
  • input     clk;
  • input     rst_n;
  • input  [DATA_Length-1:0]  x;    //输入
  • output [DATA_Length-1:0] out;   //输出
  • reg    [DATA_Length-1:0] out;
  • reg    [DATA_Length-1:0] x0,y0,z0;
  • reg    [DATA_Length-1:0] x1,y1,z1;
  • reg    [DATA_Length-1:0] x2,y2,z2;
  • reg    [DATA_Length-1:0] x3,y3,z3;
  • reg    [DATA_Length-1:0] x4,y4,z4;
  • reg    [DATA_Length-1:0] x5,y5,z5;
  • reg    [DATA_Length-1:0] x6,y6,z6;
  • reg    [DATA_Length-1:0] x7,y7,z7;
  • reg    [DATA_Length-1:0] x8,y8,z8;
  • //初始值赋值//
  • always @(posedge clk or negedge rst_n)
  • begin
  •    if(!rst_n)
  •       begin
  •          x0<=16'b0000_0000_0000_0000;
  •          y0<=16'b0000_0000_0000_0000;
  •          z0<=16'b0000_0000_0000_0000;
  •       end
  •    else
  •        begin
  •             x0 <= x+(1>>2);
  •             y0 <= x-(1>>2);
  •             z0 <=16'b0000_0000_0000_0000;
  •          end
  • end
  • //level 1 流水线一级
  • always @(posedge clk or negedge rst_n)
  • begin
  •    if(!rst_n)
  •       begin
  •          x1<=16'b0000_0000_0000_0000;
  •          y1<=16'b0000_0000_0000_0000;
  •          z1<=16'b0000_0000_0000_0000;
  •       end
  •    else
  •         if(y0[15]==1'b0)
  •             begin
  •                x1 <= x0 + y0;
  •                y1 <= y0 - x0;
  •                z1 <= z0 + 16'h1000;  //45deg
  •             end
  •          else
  •             begin
  •                x1 <= x0 - y0;
  •                y1 <= y0 + x0;
  •                z1 <= z0 - 16'h1000;  //45deg
  •             end
  • end
  • //level 2 流水线二级
  • always @(posedge clk or negedge rst_n)
  • begin
  •    if(!rst_n)
  •       begin
  •          x2<=16'h0000 ;
  •          y2<=16'h0000 ;
  •          z2<=16'h0000 ;
  •       end
  •    else
  •          if(y1[15]==1'b0)
  •             begin
  •                x2 <= x1 + {y1[DATA_Length-1],y1[DATA_Length-1:1]};
  •                y2 <= y1 - {x1[DATA_Length-1],x1[DATA_Length-1:1]};
  •                z2 <= z1 + 16'h096c;  //26.5651deg
  •             end
  •          else
  •             begin
  •                x2 <= x1 - {y1[DATA_Length-1],y1[DATA_Length-1:1]};
  •                y2 <= y1 + {x1[DATA_Length-1],x1[DATA_Length-1:1]};
  •                z2 <= z1 - 16'h096c;  //26.5651deg
  •             end
  • end
  • //level 3
  • always @(posedge clk or negedge rst_n)
  • begin
  •    if(!rst_n)
  •       begin
  •          x3<=16'b0000_0000_0000_0000;
  •          y3<=16'b0000_0000_0000_0000;
  •          z3<=16'b0000_0000_0000_0000;
  •       end
  •    else
  •          if(y2[15]==1'b0)
  •             begin
  •                x3 <= x2 + {{2{y2[DATA_Length-1]}},y2[DATA_Length-1:2]};
  •                y3 <= y2 - {{2{x2[DATA_Length-1]}},x2[DATA_Length-1:2]};
  •                z3 <= z2 + 16'h04fa;  //14.0362deg
  •             end
  •          else
  •             begin
  •               x3 <= x2 - {{2{y2[DATA_Length-1]}},y2[DATA_Length-1:2]};
  •               y3 <= y2 + {{2{x2[DATA_Length-1]}},x2[DATA_Length-1:2]};
  •               z3 <= z2 - 16'h04fa;  //14.0362deg
  •             end
  • end
  • //level 4
  • always @(posedge clk or negedge rst_n)
  • begin
  •    if(!rst_n)
  •       begin
  •          x4<=16'b0000_0000_0000_0000;
  •          y4<=16'b0000_0000_0000_0000;
  •          z4<=16'b0000_0000_0000_0000;
  •       end
  •    else
  •          if(y3[15]==1'b0)
  •             begin
  •                x4 <= x3 + {{3{y3[DATA_Length-1]}},y3[DATA_Length-1:3]};
  •                y4 <= y3 - {{3{x3[DATA_Length-1]}},x3[DATA_Length-1:3]};
  •                z4 <= z3 + 16'h0288;  //7.1250deg
  •             end
  •          else
  •             begin
  •                x4 <= x3 - {{3{y3[DATA_Length-1]}},y3[DATA_Length-1:3]};
  •                y4 <= y3 + {{3{x3[DATA_Length-1]}},x3[DATA_Length-1:3]};
  •                z4 <= z3 - 16'h0288;  //7.1250deg
返回列表