【【迭代七次的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

相关文章

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

Redis分片集群的实现

《Redis分片集群的实现》Redis分片集群是一种将Redis数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性,本文主要介绍了Redis分片集群的实现,具有一定的参考价值,感兴趣的可以了解一... 目录1. Redis Cluster的核心概念哈希槽(Hash Slots)主从复制与故障转移2.

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态