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

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

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次迭代的结果。

image.png

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

2.png
3.png
4.png

2.仿真效果预览
vivado2019.2仿真如下:

image.png

3.verilog核心程序

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
相关文章
|
6月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
1月前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
6月前
|
算法 异构计算
m基于FPGA的MPPT最大功率跟踪算法verilog实现,包含testbench
该内容包括三部分:1) 展示了Vivado 2019.2和Matlab中关于某种算法的仿真结果图像,可能与太阳能光伏系统的最大功率点跟踪(MPPT)相关。2) 简述了MPPT中的爬山法原理,通过调整光伏电池工作点以找到最大功率输出。3) 提供了一个Verilog程序模块`MPPT_test_tops`,用于测试MPPT算法,其中包含`UI_test`和`MPPT_module_U`两个子模块,处理光伏电流和电压信号。
69 1
|
4月前
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(二)
FPGA强化(10):基于Sobel算法的边缘检测(二)
59 0
|
4月前
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(一)
FPGA强化(10):基于Sobel算法的边缘检测
34 0
|
6月前
|
存储 算法 异构计算
m基于FPGA的多功能信号发生器verilog实现,包含testbench,可以调整波形类型,幅度,频率,初始相位等
使用Vivado 2019.2仿真的DDS信号发生器展示了正弦、方波、锯齿波和三角波的输出,并能调整幅度和频率。DDS技术基于高速累加器、查找表和DAC,通过频率控制字和初始相位调整产生各种波形。Verilog程序提供了一个TEST模块,包含时钟、复位、信号选择、幅度和频率控制输入,以生成不同波形。
182 18
|
6月前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到&quot;result.txt&quot;以供MATLAB显示图像分割效果。
|
6月前
|
算法 计算机视觉 异构计算
基于直方图相似性的图像分类算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容包含了一段关于图像处理算法的摘要,主要包括: 1. 展示了MATLAB和FPGA的测试结果图像,显示了图像读取完成的标志和相似性指标,其中图1与图2有较强相似性,图1与图3相似性较弱。 2. 算法使用的是vivado 2019.2和matlab 2022A版本。 3. 算法原理涉及图像直方图统计和直方图相似性度量,通过计算直方图的差异来衡量图像相似度,FPGA实现包括图像采集、直方图计算、比较和分类决策步骤。 4. 提供了一个部分核心Verilog程序,用于读取图像数据并在FPGA上进行直方图相似性计算。
|
6月前
|
存储 算法 算法框架/工具
基于HSV色度空间的图像深度信息提取算法FPGA实现,包含testbench和MATLAB辅助验证程序
该文档介绍了在一个FPGA项目中使用HSV色彩模型提取图像深度信息的过程。通过将RGB图像转换为HSV,然后利用明度与深度的非线性映射估计深度。软件版本为Vivado 2019.2和MATLAB 2022a。算法在MATLAB中进行了对比测试,并在FPGA上实现了优化,包括流水线并行处理和查找表技术。提供的Verilog代码段展示了RGB到灰度的转换。实验结果和核心程序的图片未显示。
|
6月前
|
编解码 算法 计算机视觉
基于FPGA的图像最近邻插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
基于FPGA的图像最近邻插值算法verilog实现,包括tb测试文件和MATLAB辅助验证