【【Verilog典型电路设计之CORDIC算法的Verilog HDL 实现】】

Verilog典型电路设计之CORDIC算法的Verilog HDL 实现

典型电路设计之CORDIC算法的Verilog HDL 实现

坐标旋转数字计算机CORDIC(Coordinate Rotation Digital Computer)算法,通过移位和加减运算,能递归计算常用函数值,如sin,cos,sinh,cosh等函数,最早用于导航系统,使得矢量的旋转和定向运算不需要做查三角函数表、乘法、开方及反三角函数等复杂运算。J.Walther在1971年用它研究了一种能计算出多种超越函数的统一算法。引入参数m将CORDIC实现的三种迭代模式:三角运算、双曲运算和线性运算统一于同一个表达式下。形成目前所用的CORDIC算法的最基本的数学基础。该算法的基本思想是通过一系列固定的、与运算基数相关的角度不断偏摆以逼近所需的旋转角度。可用下列等式进行描述。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
迭代结构
简单地将CORDIC算法的公式复制到硬件描述上,就可以实现迭代的cORDIC算法,其结构如下图所示。
在这里插入图片描述
流水线结构
流水线结构虽然比迭代结构占用的资源多,但是它大大的提高了数据的吞吐率。流水线结构是将迭代结构展开,因此n个处理单元中的每一个都可以同时并行处理一个相同的迭代运算。其结构如下图所示。
在这里插入图片描述
例:用Verilog HDL设计基于7级流水结构求正余弦的CORDIC算法在CORDIC算法中有一个初始的X、Y值。输入变量Z是角度变量,首先将X、Y输入到固定移位次数的移位寄存器进行移
位,然后将结果输入到加/减就完成了一次迭代,符庥次进行下去,当达到果加减操作,这样就完成了一次迭代,将此次迭代运算进行下去,当达到所需要的迭代次数(本例为((次) 的的恢付石联的加/减法器阵列。。所以整个CORDIC处理器就是一个内部互联的加/减法器阵列。
在这里插入图片描述

module sincos(clk,rst_n,ena,phase_in,sin_out,cos_out,eps);
parameter DATA_WIDTH=8;
parameter PIPELINE=8;
input    clk;
input    rst_n;
input     ena;
input       [DATA_WIDTH-1:0] phase_in;
output     [DATA_WIDTH-1:0] sin_out;
output     [DATA_WIDTH-1:0] cos_out;
output     [DATA_WIDTH-1:0] eps;
reg  [DATA_WIDTH-1:0] sin_out;
reg  [DATA_WIDTH-1:0] cos_out;
reg  [DATA_WIDTH-1:0] eps;
reg  [DATA_WIDTH-1:0] phase_in_reg;
reg   [DATA_WIDTH-1:0] x0,y0,z0;
wire  [DATA_WIDTH-1:0]x1,y1,z1;
wire  [DATA_WIDTH-1:0]x2,y2,z2;
wire  [DATA_WIDTH-1:0]x3,y3,z3;
wire  [DATA_WIDTH-1:0]x4,y4,z4;
wire  [DATA_WIDTH-1:0]x5,y5,z5;
wire  [DATA_WIDTH-1:0]x6,y6,z6;
wire  [DATA_WIDTH-1:0]x7,y7,z7;
reg    [1:0] quadrant[PIPELINE:0];
integer i;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
phase_in_reg<=8'b0000_0000;
else
if(ena)
begin
case(phase_in[7:6])
2'b00:phase_in_reg<=phase_in;
2'b01:phase_in_reg<=phase_in-8'h40; 2'b10:phase_in_reg<=phase_in-8'h80;
2'b11:phase_in_reg<=phase_in-8'hc0;
default:;
endcase 
end
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
x0<=8'b0000_0000;
y0<=8'b0000_0000;
z0<=8'b0000_0000;
end
else
if(ena)
begin
x0<=8'h4D;
y0<=8'h00;
z0<=phase_in_reg;
end
end
lteration #(8,0,8'h20)u1(.clk(clk),.rst_n(rst_n),.ena(ena),.xO(xO),.y0(y0),.z0(zO),.x1(x1),.y1(y1),.z1(z1));
lteration #(8,1,8'h12)u2(.clk(clk),.rst_n(rst_n),.ena(ena),
.xO(×1),.yo(y1),.z0(z1),.x1(×2),.y1(y2),.z1(z2));
lteration #(8,2,8'h09)u3(.clk(clk),.rst_n(rst_n),.ena(ena),
.xO(x2),.y0(y2),.z0(z2),.x1(×3),.y1(y3),.z1(z3));
lteration#(8,3,8'h04)u4(.clk(clk),.rst_n(rst_n),.ena(ena),
.xO(x3)..yo(y3),.z0(z3),.x1(x4),.y1(y4),.Z1(z4));
lteration #(8,4,8'h02)u5(.clk(clk),..rst_n(rst_n),.ena(ena),
.x0(x4),.yo(y4),.z0(z4),.x1(×5),.y1(y5),.Z1(z5));
lteration #(8,5,8'ho1)u6(.clk(clk),.rst_n(rst_n),.ena(ena),
.x0(x5),.y0(y5),.z0(z5),.x1(x6),.y1(y6),.z1(z6));
lteration #(8,6,8'ho0)u7(.clk(clk),.rst_n(rst_n),.ena(ena),
.x0(×6),.yo(y6),.z0(z6),.x1(×7),.y1(y7),.z1(z7));
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
for(i=0;i<=PIPELINE;i=i+1)
quadrant[i]<=2'b00;
else
if(ena)
begin
for(i=0;i<=PIPELINE;i=i+1)
quadrant[i+1]<=quadrant[i];
quadrant[0]<=phase_in[7:6];
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
sin_out<=8'b0000_0000;
cos_out<=8'b0000_0000;
eps<=8'b0000_0000;
end
else
if(ena)
case(quadrant[7])
2'b00:begin
sin_out<=y6;
cos_out<=x6;
eps<=z6;
end
2'b01:begin
sin_out<=x6;
cos_out<=~(y6)+1'b1;
eps<=z6;
end
2'b10:begin
sin_out<=~(y6)+1'b1;
cos_out<=~(x6)+1'b1;
eps<=z6;
end
2'b11:begin
sin_out<=~(x6)+1'b1;
cos_out<=y6;
eps<=z6;
end
endcase
end
endmodule
//迭代模块:
module lteration(clk,rst_n,ena,x0,y0,z0,x1,y1,z1);
parameter DATA_WIDTH=8;
parameter shift=0;
parameter constant=8'h20;
input clk,rst_n,ena;
input [DATA_WIDTH-1:0]x0,y0,z0;
output[DATA_WIDTH-1:0]x1,y1,z1;
reg [DATA_WIDTH-1:0]x1,y1,z1;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
x1<=8'b0000_0000;
y1<=8'b0000_0000;
z1<=8'b0000_0000;
end
else
if(ena)
if(z0[7]==1'b0)
begin
x1<=x0-{{shift{yO[DATA_WIDTH-1]1},y0[DATA_WIDTH-1:shift]};
y1<=y0+{[shift{xO[DATA_WIDTH-1]),x0[DATA_WiDTH-1:shift]};
z1<=z0-constant;
end
else
begin
x1<=x0+{fshift{yO[DATA_WIDTH-1],y0[DATA_WIDTH-1:shift]};
y1<=y0-f{shift{xO[DATA_WIDTH-1])}.x0[DATA_WIDTH-1:shift]};
z1<=z0+constant;
end
end
endmodule

下面是testbench

module sincos_tb;
reg clk,rst_n,ena;
reg [7:0]phase_in;
wire [7:0]sin_out,cos_out,eps;
sincos U1(.clk(clk),.rst_n(rst_n),.ena(ena),.phase_in(phase_in),.sin_out(sin_out),.cos_out(cos_out),.eps(eps));
initial
begin
clk=0; 
rst_n=0;ena=1;
phase_in=8'b0000_0000;
#3 rst_n=1;
end
always #5 clk=~clk;
always #10
phase_in=phase_in+1;
endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/81905.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch 集成---框架集成SpringData-集成测试-索引操作

1.Spring Data 框架介绍 Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的 开源框架。其主要目标是使得对数据的访问变得方便快捷&#xff0c;并支持 map-reduce 框架和云计 算数据服务。 Spring Data 可以极大的简化 JPA &a…

如何安装指定版本node.js,安装旧版本node

1、查看当前是否安装node&#xff0c;如果安装了需要先卸载当前版本node 搜索控制面板 -> 找到程序/卸载程序 -> 在里面找到node -> 然后右击卸载 2、卸载完成后就要安装其他版本得node.js 找到想要安装的对应版本&#xff0c;安装.msi格式的安装包 注&#xff…

矢量调制分析基础

前言 本文介绍VSA 的矢量调制分析和数字调制分析测量能力。某些扫频调谐频谱分析仪也能通过使用另外的数字无线专用软件来提供数字调制分析。然而&#xff0c;VSA 通常在调制格式和解调算法配置等方面提供更大的测量灵活性&#xff0c;并提供更多的数据结果和轨迹轨迹显示。本…

mysql--数据库的操作

数据库&#xff0c;是数据存储的最大单元。 1 创建数据库 create database mydatabase; 每次创建数据库的时候&#xff0c;都会多一个文件夹&#xff0c;关系型数据库是存储在磁盘当中的&#xff0c;所以这时候可以查看新建的数据库 2 指定字符集 MySQL中的字符集转换过程 制…

selenium案例之RAM 用户登录 aliyun

文章目录 0x00 Selenium0x01 整体流程 思路1.1 打开浏览器并且访问 登录页面 url: https://signin.aliyun.com/login.htm#/main1.2 定位 "用户名" input 和 "下一步" button 点击下一步1.3 定位 "密码" input 和 "登录" button 点击登…

基于JAVA SpringBoot和UniAPP的宠物服务预约小程序

随着社会的发展和人们生活水平的提高&#xff0c;特别是近年来&#xff0c;宠物快速进入人们的家中&#xff0c;成为人们生活中重要的娱乐内容之一&#xff0c;过去宠物只是贵族的娱乐&#xff0c;至今宠物在中国作为一种生活方式得到了广泛的认可&#xff0c;随着人们精神文明…

rtmp直播

技术要求&#xff1a;nginxnginx-rtmpffmpegVLC 跟着大佬走的&#xff1a; 传送门 准备工作&#xff1a; 首先需要一台公网ip的服务器 这是使用天翼云的弹性云主机&#xff1a;免费试用1个月 天翼云官网 点击关机&#xff0c;更多里面选择重置密码&#xff0c; 默认用户名为…

智能电视与win10电脑后续无法实现DLNA屏幕共享

问题背景&#xff1a; 我用的是TCL电视&#xff0c;但是并不是最新&#xff0c;打开的方式是U盘->电脑&#xff0c;各位看自己情况&#xff0c;很多问题都大概率是智能电视问题。 情景假设&#xff1a; 假设你已经完成原先智能电视该有的步骤&#xff0c;通过DLNA&#xf…

Mybatis-动态sql和分页

目录 一.什么是Mybatis动态分页 二.mybatis中的动态SQL 在BookMaaper.xml中写sql BookMapper BookBiz接口类 BookBizImpl实现接口类 demo测试类 ​编辑 测试结果 三.mybatis中的模糊查询 mybatis中的#与$有是什么区别 在BookMapper.xml里面建立三个模糊查询 ​编辑 …

06-Numpy基础-线性代数

线性代数&#xff08;如矩阵乘法、矩阵分解、行列式以及其他方阵数学等&#xff09;是任何数组库的重要组成部分。 NumPy提供了一个用于矩阵乘法的dot函数&#xff08;既是一个数组方法也是numpy命名空间中的一个函数&#xff09; x.dot(y)等价于np.dot(x, y) 符&#xff08;…

照片怎么转换成pdf?几种照片转pdf方法看一看

照片怎么转换成pdf&#xff1f;照片转换成PDF是一个非常有用的技能&#xff0c;可以将多张照片合并为一个文件&#xff0c;方便保存和分享。现在也有很多方法可以将照片转换为PDF&#xff0c;下面就给大家介绍几种转换方法。 转换方法一&#xff1a;迅捷PDF转换器 这是一款功能…