首页 > 编程语言 >m基于FPGA的cordic算法实现,输出sin和cos波形

m基于FPGA的cordic算法实现,输出sin和cos波形

时间:2023-02-07 19:34:39浏览次数:41  
标签:cos 三角函数 FPGA cordic 算法 计算 CORDIC 移位 运算

1.算法描述

       CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数、双曲线、指数、对数的计算。该算法通过基本的加和移位运算代替乘法运算,使得矢量的旋转和定向的计算不再需要三角函数、乘法、开方、反三角、指数等函数。

 

       Cordic算法可以利用简单的移位和加减来计算复杂的三角函数、双曲函数、对数、指数等。

 

       Cordic算法核心思想有两点,通过已知的角度来逼近输入的角度(用移位来代替tanθ),已知角度的cosθ经过多次积累相乘趋于常数。

 

       CORDIC为Coordinate rotation digital computer的缩写,来自于J.E.Volder发表于1959年的论文中,是一种不同于“paper and pencil”思路的一种数字计算方法,当时专为用于实时数字计算如导航方程中的三角关系和高速率三角函数坐标转换而开发。如今看来,CORDIC非但没有局限于以上方面,反而在各个数字计算如信号处理、图像处理、矩阵计算、自动控制和航空航天等各领域获得了广泛的使用并成为了各行业不可替代的基石。所谓万物皆可信号处理,信号处理相关行业的各位与CORDIC自然难舍难分。又所谓“为人不识CORDIC,读尽算法也枉然”,CORDIC算法并不新鲜,今天老生常谈下CORDIC算法,尽量将每一步公式的变换展示清楚,希望对新手有用。

 

       ROM资源,作为产生离散正弦信号的另一种有效途径,CORDIC(坐标旋转数值计算)算法已越来越受到青睐。其基本思想是通过一系列逐次递减的、与运算基数相关的往复偏摆以逼近最终需要达到的旋转角度。该算法仅利用加法和移位两种运算通过迭代方式进行矢量旋转, CORDIC算法由于只采用加法和移位运算,因此很适合在FPGA中实现,它可以用来实现数字下变频中的NCO、混频器和坐标变换等功能。

 

       实现NCO的另一种方法是采用基于坐标旋转数字式计算机的算法,即CORDIC算法,基本思想是采用逐次逼近的方法实现三角函数的计算。该算法的突出优点是,仅做加减和移位运算,结合流水线,可以实现每一个时钟周期输出一个经过n次迭代的结果。

 

 

 

 

 

 通过迭代的方式,可以用如下的式子可以知道其表达式为:

 

 

 

2.仿真效果预览

vivado2019.2仿真如下:

 

 

 

 

 

3.verilog核心程序

 

//?????1?
always @(posedge i_clk or posedge i_reset)
begin
     if(i_reset)
     begin
         x1<=8'b0000_0000;
         y1<=8'b0000_0000;
         z1<=8'b0000_0000;
     end
else begin
          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
end
 
//?????2?
always @(posedge i_clk or posedge i_reset)
begin
     if(i_reset)
     begin
         x2<=8'b0000_0000;
         y2<=8'b0000_0000;
         z2<=8'b0000_0000;
     end
else begin
          if(z1[7]==1'b0)
          begin
          x2 <= x1 - {y1[7],y1[7:1]};
          y2 <= y1 + {x1[7],x1[7:1]};
          z2 <= z1 - 8'h12;  //26deg
          end
     else begin
          x2 <= x1 + {y1[7],y1[7:1]};
          y2 <= y1 - {x1[7],x1[7:1]};
          z2 <= z1 + 8'h12;  //26deg
          end
     end
end
 
//?????3?
always @(posedge i_clk or posedge i_reset)
begin
     if(i_reset)
     begin
         x3<=8'b0000_0000;
         y3<=8'b0000_0000;
         z3<=8'b0000_0000;
     end
else begin
          if(z2[7]==1'b0)
          begin
          x3 <= x2 - {{2{y2[7]}},y2[7:2]};
          y3 <= y2 + {{2{x2[7]}},x2[7:2]};
          z3 <= z2 - 8'h09;  //14deg
          end
     else begin
          x3 <= x2 + {{2{y2[7]}},y2[7:2]};
          y3 <= y2 - {{2{x2[7]}},x2[7:2]};
          z3 <= z2 + 8'h09;  //14deg
          end
     end            
end
  
//?????4?
always @(posedge i_clk or posedge i_reset)
begin
     if(i_reset)
     begin
     x4<=8'b0000_0000;
     y4<=8'b0000_0000;
     z4<=8'b0000_0000;
     end
else begin
          if(z3[7]==1'b0)
          begin
          x4 <= x3 - {{3{y3[7]}},y3[7:3]};
          y4 <= y3 + {{3{x3[7]}},x3[7:3]};
          z4 <= z3 - 8'h04;  //7deg
          end
     else begin
          x4 <= x3 + {{3{y3[7]}},y3[7:3]};
          y4 <= y3 - {{3{x3[7]}},x3[7:3]};
          z4 <= z3 + 8'h04;  //7deg
          end
     end       
end 
 
//?????5?
always @(posedge i_clk or posedge i_reset)
begin
     if(i_reset)
     begin
         x5<=8'b0000_0000;
         y5<=8'b0000_0000;
         z5<=8'b0000_0000;
     end
else begin
          if(z4[7]==1'b0)
          begin
          x5 <= x4 - {{4{y4[7]}},y4[7:4]};
          y5 <= y4 + {{4{x4[7]}},x4[7:4]};
          z5 <= z4 - 8'h02;  //4deg
          end
     else begin
          x5 <= x4 + {{4{y4[7]}},y4[7:4]};
          y5 <= y4 - {{4{x4[7]}},x4[7:4]};
          z5 <= z4 + 8'h02;  //4deg
          end
     end
end 
01_115m

 

  

 

标签:cos,三角函数,FPGA,cordic,算法,计算,CORDIC,移位,运算
From: https://www.cnblogs.com/51matlab/p/17099567.html

相关文章

  • m基于FPGA的cordic算法实现,输出sin和cos波形
    1.算法描述CORDIC(CoordinateRotationDigitalComputer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数、双曲线、指数、对数的计算。该算法通......
  • AD7793 ADC FPGA控制逻辑实现
    AD7793简介https://www.analog.com/media/en/technical-documentation/data-sheets/AD7792_7793.pdf特点如下,有16bit和24bit2个版本可选,使用4线制SPI接口:控制ADC现......
  • Nacos服务注册原理分析
    在分布式服务中,原来的单体服务会被拆分成一个个微服务,服务注册实例到注册中心,服务消费者通过注册中心获取实例列表,直接请求调用服务。服务是如何注册到注册中心,服务如......
  • Nacos注册中心
    入门1.引入依赖父工程:<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.6.......
  • 【FPGA 芯片设计】FPGA 简介 ( FPGA 芯片架构 | FPGA 芯片相对于传统芯片的优点 )
    文章目录​​一、FPGA简介​​​​二、FPGA架构​​​​三、FPGA芯片相对于传统芯片的优点​​一、FPGA简介摩尔定律:价格不变,在集成电路上电子元器件的数量,1......
  • 解决MacOS13 Ventura 经常性的出现xxx软件不可用的问题
    解决MacOS13Ventura经常性的出现xxx软件不可用的问题前提型号:Macbookpro14(M1pro)问题:在更新MacOS13Ventura系统经常会出现软件不可用的现象尝试过很多种命令行......
  • macOS M1安装HomeBrew
    macOSM1安装HomeBrewHomebrew是什么?Homebrew是一款MacOS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理......
  • 在macOS系统中编译FFmpeg(简单编译)
    官方文档:https://trac.ffmpeg.org/wiki/CompilationGuide/macOS步骤:gitclonehttps://git.ffmpeg.org/ffmpeg.git./configure--disable-x86asmmakemakeinstall(......
  • MacOS Ventura13.2连上wifi无法上网问题
    1、进入系统设置2、点击wi-fi点击链接网络的详细信息3、点击代理,关掉所有的网络代理,点击好。问题解决!......
  • Cocos rgb代码修改颜色
    项目中遇到美术给的rgb代码要通过代码改变颜色代码实现如下:colorOfString(value:string):Color{if(value==null||value.length!=7){retur......