3059|4

16

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

CORDIC算法基于FPGA的信号发生器设计。 [复制链接]

我做一个CORDIC算法产生正弦波的程序,用Q2编写,但是modelsim能仿真出来正弦波波形,但是signaltap抓的波形是上下相反的,一直找不到原因,希望高手能帮帮忙,谢谢啦!

下面是我的程序:

module NCO(clk,rst_n,ena,fre_chtr,pha_chtr,sin_out_r,cos_out_r,eps_out,da_clk,da_mode);
 
  parameter DATA_WIDTH=28;
  input                   clk;
  input                   rst_n;
  input                   ena;
  input  [DATA_WIDTH-1:0] fre_chtr;
  input  [DATA_WIDTH-1:0] pha_chtr;
 
  output [9:0] sin_out_r;
  output [9:0] cos_out_r;
  output [DATA_WIDTH-1:0] eps_out;
  output da_clk;          //D/A时钟
  output da_mode;          //D/A数据模式选择

 
  wire  [DATA_WIDTH-1:0] cos_out;
  wire [DATA_WIDTH-1:0] sin_out;
  reg [DATA_WIDTH-1:0] phase_in;
  reg [DATA_WIDTH-1:0] fre_chtr_reg;
 
 
  assign da_mode = 1'b0;                  //D/A数据模式选择以二进制输入                         
  assign da_clk = clk;           //D/A时钟输出
        

 
  always@(posedge clk or negedge rst_n)
  begin
       if(!rst_n)
         fre_chtr_reg<=28'd0;
       else
         if(ena)
           begin
                fre_chtr_reg<=28'd5368709+fre_chtr_reg;  //fre_chtr_reg;  
           end
  end
 
  always@(posedge clk or negedge rst_n)
  begin
       if(!rst_n)
         phase_in<=28'd0;
       else
         if(ena)
           begin
                phase_in<=pha_chtr+fre_chtr_reg;
           end
  end    
 
  sincos u(.clk(clk),.rst_n(rst_n),.ena(ena),.phase_in(phase_in),.sin_out(sin_out),.cos_out(cos_out),.eps(eps_out));

assign sin_out_r=sin_out[27:18];
assign cos_out_r=cos_out[27:18];         
endmodule

 

QQ截图21111111.jpg (71.9 KB, 下载次数: 0)

QQ截图21111111.jpg
此帖出自FPGA/CPLD论坛

最新回复

位数不够  详情 回复 发表于 2012-6-2 17:45
点赞 关注
 

回复
举报

16

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

附件上面的图就是signaltap抓到的图形。

还有算法实现程序在下面:

module sincos(clk,rst_n,ena,phase_in,sin_out,cos_out,eps);

parameter DATA_WIDTH=28;
parameter PIPELINE=28;

input                     clk,rst_n,ena;
input   [DATA_WIDTH-1:0]  phase_in;

output  [DATA_WIDTH-1:0]  sin_out,cos_out,eps;

reg     [DATA_WIDTH-1:0]  sin_out,cos_out,eps;

reg     [DATA_WIDTH-1:0]  phase_in_reg;

reg     [DATA_WIDTH-1:0]  x[PIPELINE:0];
reg     [DATA_WIDTH-1:0]  y[PIPELINE:0];
reg     [DATA_WIDTH-1:0]  z[PIPELINE:0];

reg     [1:0]             quadrant[PIPELINE: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<=28'd0;
     else
        if(ena)
           begin
               case(phase_in[27:26])
                   2'b00:phase_in_reg<=phase_in;
                   2'b01:phase_in_reg<=phase_in-28'd67108864; //-pi/2
                   2'b10:phase_in_reg<=phase_in-28'd134217728;
                   2'b11:phase_in_reg<=phase_in-28'd201326592;
                   default: ;
               endcase
           end
end

always@(posedge clk or negedge rst_n)
begin
     if(!rst_n)
         begin
             x[0]<=28'd0;
             y[0]<=28'd0;
             z[0]<=28'd0;
         end
     else
         if(ena)
            begin
                x[0]<=28'd81503715;// 0.60725*2^27
                y[0]<=28'd0;
                z[0]<=phase_in_reg;
            end
end

//level1-level26
//level1
always@(posedge clk or negedge rst_n)
begin
     if(!rst_n)
         begin
             x[1]<=28'd0;
             y[1]<=28'd0;
             z[1]<=28'd0;
         end
     else
         if(ena)
            begin
                if(z[0][27]==1'b0)
                   begin
                       x[1]<=x[0]-y[0];
                       y[1]<=y[0]+x[0];
                       z[1]<=z[0]-28'd33554432; //45deg
                   end
                 else
                   begin
                       x[1]<=x[0]+y[0];
                       y[1]<=y[0]-x[0];
                       z[1]<=z[0]+28'd33554432; //45deg
                   end
            end
end
//level2
always@(posedge clk or negedge rst_n)
begin
     if(!rst_n)
         begin
             x[2]<=28'd0;
             y[2]<=28'd0;
             z[2]<=28'd0;
         end
     else
         if(ena)
            begin
                if(z[1][27]==1'b0)
                   begin
                       x[2]<=x[1]-{y[1][DATA_WIDTH-1],y[1][DATA_WIDTH-1:1]};
                       y[2]<=y[1]+{x[1][DATA_WIDTH-1],x[1][DATA_WIDTH-1:1]};
                       z[2]<=z[1]-28'd19808338; //26deg
                   end
                 else
                   begin
                       x[2]<=x[1]+{y[1][DATA_WIDTH-1],y[1][DATA_WIDTH-1:1]};
                       y[2]<=y[1]-{x[1][DATA_WIDTH-1],x[1][DATA_WIDTH-1:1]};
                       z[2]<=z[1]+28'd19808338;
                   end
            end
end
//level3
always@(posedge clk or negedge rst_n)
begin
     if(!rst_n)
         begin
             x[3]<=28'd0;
             y[3]<=28'd0;
             z[3]<=28'd0;
         end
     else
         if(ena)
            begin
                if(z[2][27]==1'b0)
                   begin
                       x[3]<=x[2]-{{2{y[2][DATA_WIDTH-1]}},y[2][DATA_WIDTH-1:2]};
                       y[3]<=y[2]+{{2{x[2][DATA_WIDTH-1]}},x[2][DATA_WIDTH-1:2]};
                       z[3]<=z[2]-28'd10466181; //14deg
                   end
                 else
                   begin
                       x[3]<=x[2]+{{2{y[2][DATA_WIDTH-1]}},y[2][DATA_WIDTH-1:2]};
                       y[3]<=y[2]-{{2{x[2][DATA_WIDTH-1]}},x[2][DATA_WIDTH-1:2]};
                       z[3]<=z[2]+28'd10466181;
                   end
            end
end

//level26
always@(posedge clk or negedge rst_n)
begin
     if(!rst_n)
         begin
             x[26]<=28'd0;
             y[26]<=28'd0;
             z[26]<=28'd0;
         end
     else
         if(ena)
            begin
                if(z[25][27]==1'b0)
                   begin
                       x[26]<=x[25]-{{25{y[25][DATA_WIDTH-1]}},y[25][DATA_WIDTH-1:25]};
                       y[26]<=y[25]+{{25{x[25][DATA_WIDTH-1]}},x[25][DATA_WIDTH-1:25]};
                       z[26]<=z[25]-28'd1; //1deg
                   end
                 else
                   begin
                       x[26]<=x[25]+{{25{y[25][DATA_WIDTH-1]}},y[25][DATA_WIDTH-1:25]};
                       y[26]<=y[25]-{{25{x[25][DATA_WIDTH-1]}},x[25][DATA_WIDTH-1:25]};
                       z[26]<=z[25]+28'd1; //1deg
                   end
            end
end


always@(posedge clk or negedge rst_n)
begin
     if(!rst_n)
        for(i=0;i<PIPELINE;i=i+1)
           quadrant<=2'b00;
     else
        if(ena)
           begin
              for(i=0;i<PIPELINE;i=i+1)
                 quadrant[i+1]<=quadrant;
           quadrant[0]<=phase_in[27:26];
           end
       
end


always@(posedge clk or negedge rst_n)
begin
     if(!rst_n)
        begin
            sin_out<=28'd0;
            cos_out<=28'd0;
            eps<=28'd0;
        end
     else
        if(ena)
           case(quadrant[27])
              2'b00:begin
                    sin_out<=y[26];
                    cos_out<=x[26];
                    eps<=z[26];
                    end
              2'b01:begin
                    sin_out<=x[26];
                    cos_out<=~y[26]+1'b1;
                    eps<=z[26];
                    end 
              2'b10:begin
                    sin_out<=~y[26]+1'b1;
                    cos_out<=~x[26]+1'b1;
                    eps<=z[26];
                    end  
              2'b11:begin
                    sin_out<=~x[26]+1'b1;
                    cos_out<=y[26];
                    eps<=z[26];
                    end 
           endcase                      
end
endmodule

 

中间省略了一部分流水线。

希望哪位高手能给我说下问题,万分感谢啊。

此帖出自FPGA/CPLD论坛
 
 

回复

6892

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 

慢慢看才能发现问题!

此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 
 

回复

202

帖子

0

TA的资源

一粒金砂(高级)

4
 

溢出了

位数不够
此帖出自FPGA/CPLD论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼 mr.king 的帖子

怎么说?我是新手,能讲具体一点吗?位数不够应该怎么修改呢?
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表