tag 标签: cordic

相关博文
  • 热度 11
    2017-9-2 16:42
    1874 次阅读|
    0 个评论
    一、背景介绍          Cordic(Coordinate Rotation Digital Computer) ,坐标旋转数字计算机算法。由Volder于1959年在设计美国航空控制系统的过程中首先提出,主要用于解决导航系统中三角函数、反三角函数和开方等运算的实时计算问题。1971年,Walther将圆周系统、线性系统和双曲系统统一到一个Cordic迭代方程,从而提出了一种统一的算法形式。        因为CORDIC算法本身是一种逐位逼近的算法,所以一般不论旋转级数 n 是多少,都直接应用其极限的二进制码作为模校正因子。        现代数字信号处理的一个主要发展趋势是,算法结构日趋复杂,计算量大,实时性要求高,且包含大量三角函数、开方等复杂函数计算。但是MAC单元并不适合此类函数的计算,而CORDIC算法可以将多种难以用硬件电路直接实现的复杂算法分解为简单的加减、移位运算,故非常适合硬件电路的实现。CORDIC算法应用广泛,如离散傅里叶变换、离散余弦变换、离散Hartley变换、Chirp-Z变换、各种滤波以及矩阵的奇异值分解中都可应用CORDIC算法。从广义上讲,CORDIC算法提供了一种数学计算的逼近方法。例如,在工程领域可以用它实现直接数字频率合成器。 二、FPGA实现 (1)vivado CORDIC IP 核的调用     用它求平方根,输入位宽32bit,输出位宽16bit。在IP Catalog 下的Math Funtion中找到CORDIC,双击弹出IP的配置界面。 从此处可以看到输出有16个时钟的延迟 (2)编写IP例化代码 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2017/09/02 14:31:20 // Design Name: // Module Name: sqrt_test // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module sqrt_test( input d_in, input clk, input ce, output d_out ); cordic_0 cordic_inst ( .aclk(clk),                                        // input wire aclk .s_axis_cartesian_tvalid(ce),  // input wire s_axis_cartesian_tvalid .s_axis_cartesian_tdata(d_in),    // input wire s_axis_cartesian_tdata .m_axis_dout_tvalid(m_axis_dout_tvalid),            // output wire m_axis_dout_tvalid .m_axis_dout_tdata(d_out)              // output wire m_axis_dout_tdata );     endmodule (3)编写测试文件 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2017/09/02 14:36:17 // Design Name: // Module Name: simu // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module simu( ); reg d_in; reg clk; reg ce; wire d_out;     sqrt_test U1 ( .clk(clk), .d_in(d_in), .ce(ce), .d_out(d_out) ); initial begin d_in = 0; clk = 0; ce = 0; #20;   ce = 1; end   always #5 clk = ~clk; always #10 d_in = d_in + 1000; endmodule (4)仿真波形 ​ ​
  • 热度 25
    2015-4-23 19:42
    26549 次阅读|
    11 个评论
        最近出于项目需要,对CORDIC算法深入学习下。刚开始的时候上网搜了下资料发现一上来就直接是推导公式,然后工程运用与理论推导联系太少感觉无从下手!对于像我们数学丢了很多年的同学来说实在是痛苦啊。    好在痛苦归痛苦,几天下来也略有小小收获,分享给大家。    CORDIC算法应该能够称为非线性运算的“大杀器”了,包括了“sin,cos,sinh,cosh,tan -1 ”等等...。cordic算法全称叫做坐标旋转计算法,既然是有坐标那(x,y)是无疑的,旋转的话角度也就清楚了,根据这两个量利用数学知识即可求出上述算式。但是人可以把笔在纸上拿笔算算,可机器做不到啊,于是美国佬绞尽脑汁想出一种便于计算机计算的方法,下面我就直接列出它里面的精华部分做一次实例推导,看看他的神奇之处!    前面的推导就不放上来了,大家看着头疼。其中x y分别表示对应坐标轴上的两点,d表示判断他旋转的方向,                                                                                                                                                                              那我们设x=1,y=0,d=30度 d=1,通过上述公式如何得到确切值                                                                 好,到这部我们可以看到z1 为负角度也就是说转过头了,接下来继续转 d1=-1.                                                                  继续旋转这次z2 为正d=1。                                                   迭代三次之后发现有些苗头啊,越来越靠近说要计算的值了。再来一次这次d=-1.                                                                                            第四次,,  第五次。。       这么机械的活还是交给计算机吧~   clear; clc; close all; N = 30; x_i = ;%   y_i = ;% z_i = ; d =  1 ;%  for n=1:30   if(z_i(n)0)         d=1;     else         d=-1;   end %x_temp_i = x_i; x_i(n+1) = x_i(n) - (   y_i(n)   *d    *2^(-n)    ); y_i(n+1) = y_i(n) + (   x_i(n)   *d    *2^(-n)    ); z_i(n+1) = z_i(n) -    (1 *atan(2^(-n))*d        );  end sin_30 = y_i./(sqrt(x_i.^2+y_i.^2)); cos_30 = x_i./(sqrt(x_i.^2+y_i.^2));   figure(1)  plot(1:31,sin_30,'r-')  xlabel('迭代次数')  ylabel('正弦余弦值')  grid on;  hold on;  plot(1:31,cos_30,'b--')  legend('r-=sin30°','b--=cos30°')   grid on;      按照上述公式编写程序,迭代30次。 最终sin30=0.5000;     cos30= 0.8660     细心的同学可以观察到,在迭代过程中只含有加减,唯一一个乘运算可以用位移得到。所以通过硬件实现是非常方便的,不得不佩服当时美帝数学家的良苦用心啊!                                                                                                                      
  • 热度 9
    2014-10-9 16:32
    2110 次阅读|
    1 个评论
            上一篇博客我从算法的原理出发,进而通过公式步步推导,完成圆周系统中旋转模式的验证工作。这次我打算从一个小实例出发,来说说我这个 cordic 算法除了能做些干什么!     有很多同学知道可以用来做DDS 但是对于现在这个“内存过剩”的年代,采用运算的方式实现 DDS 远远不如 LUT 来得方便。。。。 PS ( cordic 算法提出的年代,那是在遥远的 20 世纪五六十年代,那时候内存非常的宝贵!)于是乎我也就不介绍DDS实现方式。。。 众所周知想要得到 FFT 的运算结果前一步必须取模,这里取模运算包括了平方,相加,开根这三个基本运算,其中前两个运算没啥问题,关键是开根!单片机通过调用数学函数可以解决这个问题,但是 FPGA 实现就没这么容易了,需要自己写这套取模的电路。      于是乎我就搬来了大杀器(圆周系统之向量模式): 仔细观察这个得到结果,不要有畏惧心理。发现得到的xn正是我们想要的答案!有同学会说不是还要乘上一个 An ?放心 An 约等于一个常数 1.64676 到时候除去就行。另外再仔细观察学过通信基础的可以发现 这个公式很眼熟,稍微改改不就可以求相位了么。。。做过载波同步的同学笑了。。。   接下来我们理理思路开始考虑如何编写硬件电路,好,首先我们知道在这个向量模式下初始角度为 0 ,并输入向量值假定他为( 1,2 ) 随后观察上述运算公式发现这是个迭代的过程,这就好办了,如果是 C 的话就用 for 循环好了,在 verilog 里面为了提高运算速度,把运算一次作为一个运算单元,然后输入输出相连,把 n 的结果作为 n+1 的初始值,循环往复。    最后 在运算的过程中,存在 tan-1 这个值那我们做查找表好了,在做查找表的过程中我们要对其进行定点化, 45/1   45/2   45/4  45/8… 把这些数通通乘上 256 保证其精度。然后带入其中运算。    好下面给出一个运算单元的 veriliog ,其余大家复制粘贴,你懂得。。。 always @ ( posedge clk or negedge rst_n)  //cell 2 begin   if (!rst_n)     begin        x1_buf = 16'd0;         y1_buf = 16'd0;         z1_buf = 16'd0;       end   else     begin       if (y0_buf ==1'b1)             begin                 x1_buf = x0_buf - ( y0_buf 1);                 y1_buf = y0_buf + ( x0_buf 1);                 z1_buf = z0_buf - 16'sd6801;             end         else             begin                 x1_buf = x0_buf + ( y0_buf 1);                 y1_buf = y0_buf - ( x0_buf 1);                 z1_buf = z0_buf + 16'sd6801;             end      end end 这段小程序很快就能分析清楚,通过判断 y 的符号位,来得到其旋转方向。 最后献上仿真结果:   结果是945,好我们这样算945/255/1.64676=2.24 那么根号5的结果:2.236可以说是基本吻合了。
  • 热度 22
    2014-2-9 14:19
    1436 次阅读|
    2 个评论
    基于 FPGA 的 CORDIC 算法设计 -- 源码仿真以及实际的工程验证   KevinWan CORDIC 算法 坐标旋转数字计算机( CORDIC:Coordinate Rotation Digitial Computer )由 Volder.J 1959 年提出的, 1971 年 J.S.Walther 提出统一 CORDIC 算法,把圆周旋转 , 双曲旋转和直线旋转统一到一个 CORDIC 迭代方程里,为统一硬件实现多功能提供了前提。在硬件设计中,浮点三角函数、指数函数、对数函数等超越函数都是一种非常耗时和占用资源的运算,而 CORDIC 算法从运算本身入手,将这些复杂的超越函数分解为简单的加法和移位运算,而且该算法是一种规则的算法,可以很容易在硬件上实现,目前 CORDIC 算法已经被成功地运用于 FFT 、 DCT 等数字信号处理等领域。 而采用 CORDIC 算法来实现 NCO 时,则无需使用乘法器,它只需要一个最小的查找表 (LUT) ,利用简单的移位和相加运算,即可产生高精度的正余弦波形,尤其适合于 FPGA 的实现。          本设计采用 Verilog 来设计,通过 Modelsim 和 Matlab 仿真,实际工程上运用。          Cordic 模块输出的 Sin 和 Cos 时域波形 (Modelsim 中的仿真波形 )            输出数据得到的频域特性(仿真数据通过 matlab 仿真出的频谱) 部分源代码如下:   实际运用只需要更改 PHA_WORD 即可,他是 100KHZ 的整数倍,比如需要输出 1MHZ 的正余弦信号,即赋值为 PHA_WORD=10 即可。 内外:如果输出的频率变化不大的话,也可以采用查表的方式产生 NCO ,这样只需要 Memory ,需要较少的 LE 资源即可实现 NCO 。  
相关资源
  • 所需E币: 1
    时间: 2022-5-4 11:45
    大小: 284.75KB
    上传者: czd886
    针对数字通信中CORDIC算法的优化
  • 所需E币: 3
    时间: 2022-1-5 22:40
    大小: 362.6KB
    上传者: czd886
    CORDIC算法在基于FPGA的PMSM控制器中的应用
  • 所需E币: 2
    时间: 2022-1-5 22:41
    大小: 2.78MB
    上传者: czd886
    CORDIC算法在基于FPGA的旋变解码和PMSM矢量控制中的应用
  • 所需E币: 1
    时间: 2022-1-2 14:47
    大小: 1.15MB
    上传者: czd886
    基于CORDIC算法数字下变频的FPGA实现
  • 所需E币: 0
    时间: 2021-3-18 16:26
    大小: 266.67KB
    上传者: Argent
    FPGA是一个技术密集型的行业,没有坚实的技术功底,很难形成有竞争力的产品。从技术上来看FPGA未来的发展,至少在几年内还是遵循摩尔定律的规则,工艺不断升级,目前xilinx16nm工艺的FPGA已经成熟商用,xilinx下一代产品会升级到7nm,重点应该还是瞄准通信和可能出现的新兴行业如大数据处理等。有这方面需求的网友不妨来共同学习探讨。
  • 所需E币: 0
    时间: 2021-3-18 16:40
    大小: 416.28KB
    上传者: Argent
    FPGA是一个技术密集型的行业,没有坚实的技术功底,很难形成有竞争力的产品。从技术上来看FPGA未来的发展,至少在几年内还是遵循摩尔定律的规则,工艺不断升级,目前xilinx16nm工艺的FPGA已经成熟商用,xilinx下一代产品会升级到7nm,重点应该还是瞄准通信和可能出现的新兴行业如大数据处理等。有这方面需求的网友不妨来共同学习探讨。
  • 所需E币: 3
    时间: 2020-4-7 14:08
    大小: 381.34KB
    上传者: quw431979_163.com
    正交调制解调中所用到的角度快速计算方法CODIC的文章,Cordic……
  • 所需E币: 4
    时间: 2019-12-25 15:16
    大小: 133.48KB
    上传者: 二不过三
    在介绍基本CORDIC算法原理的基础上,介绍了其改进的并行算法原理.对并行CORDIC算法进行了详细叙述,并且使用VerilogHDL描述了该算法.通过模块复用,并且采用两相门控时钟等方法,节省了FPGA资源,保持了信号的同步性.最后在QuartusⅡ下进行了综合、仿真,取得了良好的仿真结果.……
  • 所需E币: 5
    时间: 2019-12-25 09:48
    大小: 111.61KB
    上传者: wsu_w_hotmail.com
    CORDIC计算三角函数……
  • 所需E币: 4
    时间: 2019-12-25 02:46
    大小: 4.25MB
    上传者: rdg1993
    cordic最全的资料……
  • 所需E币: 3
    时间: 2019-12-24 11:03
    大小: 9.43MB
    上传者: givh79_163.com
    资料包含了Matlab模拟Cordic算法的原理文档和源代码。……
  • 所需E币: 3
    时间: 2019-5-26 19:05
    大小: 1.57MB
    上传者: royalark_912907664
    论文对比了基于ROM查找表法和CORDIC算法实现数控振荡器(NCO)的芯片面积和速度,基于改进CORDIC算法,提出了一种时域交织结构的NCO设计,该结构可以在相同系统工作频率的前提下,大幅度提高输出信号的采样率和带宽。在Xilinx的FPGA平台完成设计功能仿真,仿真结果表明:设计的NCO工作速度可达500MHz,采样率可达4GHz,输出信号带宽可达2GHz,输出频率分辨率可达0.95kHz,输出信号频率50MHz时,无杂散动态范围为88.11dBc。设计还基于40nmCMOS工艺,完成NCO的后端实现,并进行了流片,版图面积260×582μm2,为5G通信系统中超过GHz的数控振荡器设计提供了一种可供选择的方案。