【【迭代七次的CORDIC算法-Verilog实现】】

2023-12-21 09:28

本文主要是介绍【【迭代七次的CORDIC算法-Verilog实现】】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

迭代七次的CORDIC算法-Verilog实现求解正弦余弦函数

COEDIC.v

module CORDIC #(parameter         DATA_WIDTH    =      4'd8  ,     // we set data widthparameter         PIPELINE      =      4'd8)(input                              clk       ,input                              rst_n     ,input       [DATA_WIDTH - 1 : 0]   phase     ,input                              ena       ,output  reg [DATA_WIDTH - 1 : 0]   sin_out   ,output  reg [DATA_WIDTH - 1 : 0]   cos_out);//  ------------------------------------------------  \\//         next is define and parameter               \\//  -------------------------------------------------\\
reg      [DATA_WIDTH - 1 : 0]    phase_reg     ;reg      [DATA_WIDTH - 1 : 0]    X0            ;reg      [DATA_WIDTH - 1 : 0]    Y0            ;reg      [DATA_WIDTH - 1 : 0]    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)beginif(rst_n == 0)for(i = 0 ; i <= PIPELINE ; i=i+1)quadrant[i] <= 0 ;elseif(ena == 1)beginfor(i = 0 ; i <= PIPELINE ; i=i+1)quadrant[i+1] <= quadrant[i] ;quadrant[0] <= phase[DATA_WIDTH - 1 : DATA_WIDTH - 2] ;endend//  we set a new phase to Unify the phase in the first quadrant//  we set 8'h      0010 0000 =>  45度     and  1000 0000 => 180度always@(posedge clk or negedge rst_n)beginif(rst_n == 0)beginphase_reg <= 0 ;endelse if(ena == 1)begincase(phase[DATA_WIDTH -1 : DATA_WIDTH -2])2'b00 :phase_reg <= phase          ;2'b01 :phase_reg <= phase - 8'h40  ; // subtract 902'b10 :phase_reg <= phase - 8'h80  ; // subtract 1802'b11 :phase_reg <= phase - 8'hC0  ; // subtract 270default :;endcaseendend//  start to calculate// we should set x0= 0.607252935    y0= 0  z0always@(posedge clk or negedge rst_n )beginif( rst_n == 0)beginX0 <= 0     ;Y0 <= 0     ;Z0 <= 0     ;endelse if(ena == 1 )beginX0 <= 8'h4D      ;Y0 <= 0          ;Z0 <= phase_reg  ;endend// next is iterationINTERATION#(.DATA_WIDTH ( 4'd8 ),.shift      ( 4'd0 ),.ANGLE      ( 8'h20 ))u_INTERATION0(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X0         ),.Y0         ( Y0         ),.Z0         ( Z0         ),.X1         ( X1         ),.Y1         ( Y1         ),.Z1         ( Z1         ));INTERATION#(.DATA_WIDTH ( 4'd8 ),.shift      ( 4'd1 ),.ANGLE      ( 8'h12 ))u_INTERATION1(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X1         ),.Y0         ( Y1         ),.Z0         ( Z1         ),.X1         ( X2         ),.Y1         ( Y2         ),.Z1         ( Z2         ));INTERATION#(.DATA_WIDTH ( 4'd8 ),.shift      ( 4'd2 ),.ANGLE      ( 8'h09 ))u_INTERATION2(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X2         ),.Y0         ( Y2         ),.Z0         ( Z2         ),.X1         ( X3         ),.Y1         ( Y3         ),.Z1         ( Z3         ));INTERATION#(.DATA_WIDTH ( 4'd8 ),.shift      ( 4'd3 ),.ANGLE      ( 8'h04 ))u_INTERATION3(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X3         ),.Y0         ( Y3         ),.Z0         ( Z3         ),.X1         ( X4         ),.Y1         ( Y4         ),.Z1         ( Z4         ));INTERATION#(.DATA_WIDTH ( 4'd8 ),.shift      ( 4'd4 ),.ANGLE      ( 8'h02 ))u_INTERATION4(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X4         ),.Y0         ( Y4         ),.Z0         ( Z4         ),.X1         ( X5         ),.Y1         ( Y5         ),.Z1         ( Z5         ));INTERATION#(.DATA_WIDTH ( 4'd8 ),.shift      ( 4'd5 ),.ANGLE      ( 8'h01 ))u_INTERATION5(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X5         ),.Y0         ( Y5         ),.Z0         ( Z5         ),.X1         ( X6         ),.Y1         ( Y6         ),.Z1         ( Z6         ));INTERATION#(.DATA_WIDTH ( 4'd8 ),.shift      ( 4'd6 ),.ANGLE      ( 8'h00 ))u_INTERATION6(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X6         ),.Y0         ( Y6         ),.Z0         ( Z6         ),.X1         ( X7         ),.Y1         ( Y7         ),.Z1         ( Z7         ));//   The results of different phases are also different//   phase[DATA_WIDTH -1 : DATA_WIDTH -2]//  00 first  quadrant//  01 second quadrant//  10 third  quadrant//  11 Fourth Quadrantalways@(posedge clk or negedge rst_n)beginif(rst_n == 0)begincos_out <= 0 ;sin_out <= 0 ;endelse if( ena == 1)begincase(quadrant[7])2'b00 :begincos_out <= X6 ;sin_out <= Y6 ;end2'b01 :begincos_out <= ~(Y6) + 1 ;sin_out <= X6        ;end2'b10 :begincos_out <= ~(X6) + 1 ;sin_out <= ~(Y6) + 1 ;end2'b11 :begincos_out <= Y6        ;sin_out <= ~(X6) + 1 ;enddefault:;endcaseendend
endmodule

Interation.v

module INTERATION #(parameter   DATA_WIDTH       =    4'd8      ,parameter   shift            =    4'd0      ,parameter   ANGLE            =    8'h20)(input                                  clk     ,input                                  rst_n   ,input                                  ena     ,input        [DATA_WIDTH - 1 : 0]      X0      ,input        [DATA_WIDTH - 1 : 0]      Y0      ,input        [DATA_WIDTH - 1 : 0]      Z0      ,output  reg  [DATA_WIDTH - 1 : 0]      X1      ,output  reg  [DATA_WIDTH - 1 : 0]      Y1      ,output  reg  [DATA_WIDTH - 1 : 0]      Z1);always@(posedge clk or negedge rst_n)beginif( rst_n == 0)beginX1 <= 0 ;Y1 <= 0 ;Z1 <= 0 ;endelse if( ena == 1)beginif(Z0[DATA_WIDTH - 1] == 0 )beginX1 <= X0 - {{shift{ Y0[DATA_WIDTH - 1] }} ,Y0[DATA_WIDTH - 1 : shift] } ;Y1 <= Y0 + {{shift{ X0[DATA_WIDTH - 1] }} ,X0[DATA_WIDTH - 1 : shift] } ;Z1 <= Z0 - ANGLE                                                    ;endelse if(Z0[DATA_WIDTH - 1] == 1 )beginX1 <= X0 + {{shift{ Y0[DATA_WIDTH - 1 ] }} ,Y0[DATA_WIDTH - 1 : shift] } ;Y1 <= Y0 - {{shift{ X0[DATA_WIDTH - 1 ] }} ,X0[DATA_WIDTH - 1 : shift] } ;Z1 <= Z0 + ANGLE                                                    ;endendendendmodule

cordic_tb.v

module cordic_tb #(parameter       DATA_WIDTH   =    4'd8      
);
reg                                 clk       ;
reg                                 rst_n     ;
reg          [DATA_WIDTH - 1 : 0]   phase     ;
reg                                 ena       ;
wire         [DATA_WIDTH - 1 : 0]   sin_out   ;
wire         [DATA_WIDTH - 1 : 0]   cos_out   ;CORDIC#(.DATA_WIDTH    ( DATA_WIDTH )
)u_CORDIC(.clk           ( clk           ),.rst_n         ( rst_n         ),.phase         ( phase         ),.ena           ( ena           ),.sin_out       ( sin_out       ),.cos_out       ( cos_out       )
);always #5 clk = ~clk ;initial 
begin clk      = 0     ;rst_n    = 0     ; ena      = 1     ;phase    = 8'h00 ;#10rst_n   = 1      ;
end
always #10
phase = phase + 1    ; endmodule 

README.md

# 本文参考自 西电的verilog 课程实验 还有网上的 CORDIC算法详解
对于CORDIC的算法 关键是学会迭代和 掌握自 不同象限角度的换算
我在参阅网上资料的时候 发现有些角度的换算存在了错误这里我再写入一下 
| 第一象限 | 第二象限 | 第三象限 | 第四象限 |
| --------| --------| --------| --------|
| (x,y)   | (x,y)   | (x,y)    |  (x,y)   |
| (x,y)   | (-y,x)  | (-x ,-y) | (y , -x) |最关键的是在于理清如何计算的 实际操作起来的  圆周旋转求旋转模式下的正余弦
并不用考虑太多的 角度旋转 选取初始值之后 直接迭代开干 

在这里插入图片描述

## 波形很奇怪 我也不懂为什么做不到像其他人的这么顺滑 但是应该没错吧

纠正一下 把进制改成 Signed Decimal 就可以得到顺滑的常规正弦函数波形
在这里插入图片描述

这篇关于【【迭代七次的CORDIC算法-Verilog实现】】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/519442

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文