学习cordic算法所得(流水线结构、Verilog标准)
最近学习cordic算法,并利用FPGA实现,在整个学习过程中,对cordic算法原理、FPGA中流水线设计、Verilog标准有了更加深刻的理解。
首先,cordic算法的基本思想是通过一系列固定的、与运算基数有关的角度的不断偏,摆以逼近所需的旋转角度。






module Test(clk,rst,Phase_Word,Sin_Val,Cos_Val); input clk,rst;
input[:] Phase_Word;
output reg [:] Sin_Val,Cos_Val; parameter Data_Width=; //输出数据宽度
parameter Itera_Num=;
parameter Kn = 'h4DBA; //Kn为旋转后缩放比例因子系数,Kn=0.607253*2^16
`define Rot_Angle0
`define Rot_Angle1
`define Rot_Angle2
`define Rot_Angle3
`define Rot_Angle4
`define Rot_Angle5
`define Rot_Angle6
`define Rot_Angle7
`define Rot_Angle8
`define Rot_Angle9
`define Rot_Angle10
`define Rot_Angle11
`define Rot_Angle12
`define Rot_Angle13 reg [Data_Width:] X[Itera_Num:]; //X轴坐标值,最终对应cos
reg [Data_Width:] Y[Itera_Num:]; //Y轴坐标值,最终对应sin
reg [Data_Width:] Z[Itera_Num:]; //角度累加器 reg[:] quadrant[Itera_Num:]; //象限,00:第一象限;01,10,11分别为二、三、四象限 /*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=0
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
X[] <= {'b0,Kn};
Y[] <= ;
Z[] <= {'b0,Phase_Word[13:0]};//相位控制在(0-Pi/2),注意Phase_word需为reg signed类型。
end
/*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=1
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
X[] <= X[] - Y[];
Y[] <= X[] + Y[];
Z[] <= Z[] - `Rot_Angle0;//第一次默认逆时针旋转45度
end
/*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=2
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
if(Z[][])
begin
X[] <= X[] + {{{Y[][]}},Y[][:]};
Y[] <= Y[] - {{{X[][]}},X[][:]};
Z[] <= Z[] + `Rot_Angle1; //顺时针旋转
end
else
begin
X[] <= X[] - {{{Y[][]}},Y[][:]};
Y[] <= Y[] + {{{X[][]}},X[][:]};
Z[] <= Z[] - `Rot_Angle1; //逆时针旋转
end
end
/*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=3
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
if(Z[][])
begin
X[] <= X[] + {{{Y[][]}},Y[][:]};
Y[] <= Y[] - {{{X[][]}},X[][:]};
Z[] <= Z[] + `Rot_Angle2; //顺时针旋转
end
else
begin
X[] <= X[] - {{{Y[][]}},Y[][:]};
Y[] <= Y[] + {{{X[][]}},X[][:]};
Z[] <= Z[] - `Rot_Angle2; //逆时针旋转
end
end
/*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=4
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
if(Z[][])
begin
X[] <= X[] + {{{Y[][]}},Y[][:]};
Y[] <= Y[] - {{{X[][]}},X[][:]};
Z[] <= Z[] + `Rot_Angle3; //顺时针旋转
end
else
begin
X[] <= X[] - {{{Y[][]}},Y[][:]};
Y[] <= Y[] + {{{X[][]}},X[][:]};
Z[] <= Z[] - `Rot_Angle3; //逆时针旋转
end
end
/*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=5
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
if(Z[][])
begin
X[] <= X[] + {{{Y[][]}},Y[][:]};
Y[] <= Y[] - {{{X[][]}},X[][:]};
Z[] <= Z[] + `Rot_Angle4; //顺时针旋转
end
else
begin
X[] <= X[] - {{{Y[][]}},Y[][:]};
Y[] <= Y[] + {{{X[][]}},X[][:]};
Z[] <= Z[] - `Rot_Angle4; //逆时针旋转
end
end
/*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=6
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
if(Z[][])
begin
X[] <= X[] + {{{Y[][]}},Y[][:]};
Y[] <= Y[] - {{{X[][]}},X[][:]};
Z[] <= Z[] + `Rot_Angle5; //顺时针旋转
end
else
begin
X[] <= X[] - {{{Y[][]}},Y[][:]};
Y[] <= Y[] + {{{X[][]}},X[][:]};
Z[] <= Z[] - `Rot_Angle5; //逆时针旋转
end
end
/*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=7
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
if(Z[][])
begin
X[] <= X[] + {{{Y[][]}},Y[][:]};
Y[] <= Y[] - {{{X[][]}},X[][:]};
Z[] <= Z[] + `Rot_Angle6; //顺时针旋转
end
else
begin
X[] <= X[] - {{{Y[][]}},Y[][:]};
Y[] <= Y[] + {{{X[][]}},X[][:]};
Z[] <= Z[] - `Rot_Angle6; //逆时针旋转
end
end
/*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=8
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
if(Z[][])
begin
X[] <= X[] + {{{Y[][]}},Y[][:]};
Y[] <= Y[] - {{{X[][]}},X[][:]};
Z[] <= Z[] + `Rot_Angle7; //顺时针旋转
end
else
begin
X[] <= X[] - {{{Y[][]}},Y[][:]};
Y[] <= Y[] + {{{X[][]}},X[][:]};
Z[] <= Z[] - `Rot_Angle7; //逆时针旋转
end
end
/*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=9
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
if(Z[][])
begin
X[] <= X[] + {{{Y[][]}},Y[][:]};
Y[] <= Y[] - {{{X[][]}},X[][:]};
Z[] <= Z[] + `Rot_Angle8; //顺时针旋转
end
else
begin
X[] <= X[] - {{{Y[][]}},Y[][:]};
Y[] <= Y[] + {{{X[][]}},X[][:]};
Z[] <= Z[] - `Rot_Angle8; //逆时针旋转
end
end
/*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=10
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
if(Z[][])
begin
X[] <= X[] + {{{Y[][]}},Y[][:]};
Y[] <= Y[] - {{{X[][]}},X[][:]};
Z[] <= Z[] + `Rot_Angle9; //顺时针旋转
end
else
begin
X[] <= X[] - {{{Y[][]}},Y[][:]};
Y[] <= Y[] + {{{X[][]}},X[][:]};
Z[] <= Z[] - `Rot_Angle9; //逆时针旋转
end
end
/*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=11
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
if(Z[][])
begin
X[] <= X[] + {{{Y[][]}},Y[][:]};
Y[] <= Y[] - {{{X[][]}},X[][:]};
Z[] <= Z[] + `Rot_Angle10; //顺时针旋转
end
else
begin
X[] <= X[] - {{{Y[][]}},Y[][:]};
Y[] <= Y[] + {{{X[][]}},X[][:]};
Z[] <= Z[] - `Rot_Angle10; //逆时针旋转
end
end
/*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=12
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
if(Z[][])
begin
X[] <= X[] + {{{Y[][]}},Y[][:]};
Y[] <= Y[] - {{{X[][]}},X[][:]};
Z[] <= Z[] + `Rot_Angle11; //顺时针旋转
end
else
begin
X[] <= X[] - {{{Y[][]}},Y[][:]};
Y[] <= Y[] + {{{X[][]}},X[][:]};
Z[] <= Z[] - `Rot_Angle11; //逆时针旋转
end
end
/*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=13
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
if(Z[][])
begin
X[] <= X[] + {{{Y[][]}},Y[][:]};
Y[] <= Y[] - {{{X[][]}},X[][:]};
Z[] <= Z[] + `Rot_Angle12; //顺时针旋转
end
else
begin
X[] <= X[] - {{{Y[][]}},Y[][:]};
Y[] <= Y[] + {{{X[][]}},X[][:]};
Z[] <= Z[] - `Rot_Angle12; //逆时针旋转
end
end
/*****************************************************
功能:流水线实现cordic算法
说明:Itera_Num=14
*****************************************************/
always @(posedge clk or negedge rst)
if(!rst)
begin
X[] <= ;
Y[] <= ;
Z[] <= ;
end
else
begin
if(Z[][])
begin
X[] <= X[] + {{{Y[][]}},Y[][:]};
Y[] <= Y[] - {{{X[][]}},X[][:]};
Z[] <= Z[] + `Rot_Angle13; //顺时针旋转
end
else
begin
X[] <= X[] - {{{Y[][]}},Y[][:]};
Y[] <= Y[] + {{{X[][]}},X[][:]};
Z[] <= Z[] - `Rot_Angle13; //逆时针旋转
end
end
/*****************************************************
功能:获取象限信息
*****************************************************/
always @ (posedge clk or negedge rst)
begin
if(!rst)
begin
quadrant[] <= ;
quadrant[] <= ;
quadrant[] <= ;
quadrant[] <= ;
quadrant[] <= ;
quadrant[] <= ;
quadrant[] <= ;
quadrant[] <= ;
quadrant[] <= ;
quadrant[] <= ;
quadrant[] <= ;
quadrant[] <= ;
quadrant[] <= ;
quadrant[] <= ;
quadrant[] <= ;
end
else
begin
quadrant[] <= Phase_Word[:];
quadrant[] <= quadrant[];
quadrant[] <= quadrant[];
quadrant[] <= quadrant[];
quadrant[] <= quadrant[];
quadrant[] <= quadrant[];
quadrant[] <= quadrant[];
quadrant[] <= quadrant[];
quadrant[] <= quadrant[];
quadrant[] <= quadrant[];
quadrant[] <= quadrant[];
quadrant[] <= quadrant[];
quadrant[] <= quadrant[];
quadrant[] <= quadrant[];
quadrant[] <= quadrant[];
end
end
/*****************************************************
功能:根据象限确定输出值
说明:当角度A=theta+pi/2在(pi/2~pi)时,
cos(theta+pi/2)=-sin(theta).其中,theta为第一象限角
二进制中,负数等于整数取反再加一
*****************************************************/
always @ (posedge clk or negedge rst)
begin
if(!rst)
begin
Sin_Val <= ;
Cos_Val <= ;
end
else
begin
case(quadrant[])
'b00:begin
Cos_Val <= X[];
Sin_Val <= Y[];
end
'b01:begin
Cos_Val <= ~Y[] + 'b1;
Sin_Val <= X[];
end
'b10:begin
Cos_Val <= ~X[] + 'b1;
Sin_Val <= ~Y[] + 'b1;
end
'b11:begin
Cos_Val <= Y[];
Sin_Val <= ~X[] + 'b1;
end
endcase
end
end endmodule
整个源码设计主要参考了aikimi7的设计,连接:http://www.cnblogs.com/aikimi7/p/3929592.html
学习cordic算法所得(流水线结构、Verilog标准)的更多相关文章
- Cordic算法——verilog实现
上两篇博文Cordic算法--圆周系统之旋转模式.Cordic算法--圆周系统之向量模式做了理论分析和实现,但是所用到的变量依然是浮点型,而cordic真正的用处是基于FPGA等只能处理定点的平台.只 ...
- 使用CORDIC算法求解角度正余弦及Verilog实现
本文是用于记录在了解和学习CORDIC算法期间的收获,以供日后自己及他人参考:并且附上了使用Verilog实现CORDIC算法求解角度的正弦和余弦的代码.简单的testbench测试代码.以及在Mod ...
- 基于FPGA的Cordic算法实现
CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数.双曲线.指数.对数的 ...
- cordic算法的verilog实现及modelsim仿真
1. 算法介绍 CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数.双曲 ...
- 基于FPGA的cordic算法的verilog初步实现
最近在看cordic算法,由于还不会使用matlab,真是痛苦,一系列的笔算才大概明白了这个算法是怎么回事.于是尝试用verilog来实现.用verilog实现之前先参考软件的程序,于是先看了此博文h ...
- 定点CORDIC算法求所有三角函数及向量模的原理分析、硬件实现(FPGA)
一.CORDIC算法 CORDIC(Coordinate Rotation DIgital Computer)是一种通过迭代对多种数学函数求值的方法,它可以对三角函数.双曲函数和平面旋转问题进行求解. ...
- 三角函数计算,Cordic 算法入门
[-] 三角函数计算Cordic 算法入门 从二分查找法说起 减少乘法运算 消除乘法运算 三角函数计算,Cordic 算法入门 三角函数的计算是个复杂的主题,有计算机之前,人们通常通过查找三角函数表来 ...
- (转)三角函数计算,Cordic 算法入门
由于最近要使用atan2函数,但是时间上消耗比较多,因而网上搜了一下简化的算法. 原帖地址:http://blog.csdn.net/liyuanbhu/article/details/8458769 ...
- DeepLearning.ai学习笔记(三)结构化机器学习项目--week2机器学习策略(2)
一.进行误差分析 很多时候我们发现训练出来的模型有误差后,就会一股脑的想着法子去减少误差.想法固然好,但是有点headlong~ 这节视频中吴大大介绍了一个比较科学的方法,具体的看下面的例子 还是以猫 ...
随机推荐
- Cookie同域,跨域单点登录
Cookie 同域单点登录 最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下).但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录. 单点登 ...
- tcpdump 使用实践
tcpdump常用配置指导 参考:http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html 1. 指定端口抓包 -i 说明: ...
- 4.ElasticSearch的基本api操作
1. ElasticSearch的Index 1. 索引初始化 在创建索引之前 对索引进行初始化操作 指定shards数量和replicas数量 curl -XPUT 'http://192.168. ...
- ASP.NET MVC 学习笔记 1
1. 什么是ASP.Net MVC ASP.Net MVC是一种开发Web应用程序的工具(is a web application development framework),采用Model-Vie ...
- java中 n-- 和 --n的区别
n--和--n的最终结果都是将n本身减一,区别是现在的值: 比如说: n=10 a=n;此时a=10 b=n--;此时b=10,n=9减号放后面是指先赋值,再自减1 c=--n;此时c=8,n=8减号 ...
- 逆向知识第一讲,IDA的熟悉使用,以及TEB,PEB结构
逆向知识第一讲,IDA的熟悉使用,以及TEB,PEB结构 一丶熟悉IDA,以及手工制作sig文件. IDA,静态分析工具,网上随便找一个即可下载. 首先,我们写一个可执行EXE,最简单的 使用IDA打 ...
- Android———最详细的系统对话框使用
在实际应用开发中,用到系统对话框中的情况几乎是没有的.按开发流程来说,UI工程师都会给出每一个弹窗的样式,故而在实际开发中都是自定义弹窗的. 即使用到的地方不多,但是我们也是需要了解并且能熟练的运用它 ...
- Servlet 笔记-异常处理
当一个 Servlet 抛出一个异常时,Web 容器在使用了 exception-type 元素的 web.xml 中搜索与抛出异常类型相匹配的配置. 必须在 web.xml 中使用 error-pa ...
- python 使用标准库连接linux实现scp和执行命令
import stat import pexpect 只显示关键代码: sqldb = localpath+database //获取database名字 if os.path.exists(sqld ...
- 笔记-java泛型详解
首先,先说明一下,java泛型文章的出处:http://www.cnblogs.com/lzq198754/p/5780426.html 作为学习笔记保存. 1.为什么需要泛型 泛型在Java中有很重 ...