【【迭代16次的CORDIC算法-verilog实现】】

2023-12-22 07:01

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

迭代16次的CORDIC算法-verilog实现 -32位迭代16次verilog代码实现

CORDIC.v

module cordic32#(parameter         DATA_WIDTH    =      8'd32  ,     // we set data widthparameter         PIPELINE      =      5'd16        // Optimize waveform)(input                              clk       ,input                              rst_n     ,input    signed    [DATA_WIDTH - 1 : 0]   phase     ,input                              ena       ,output  reg signed [DATA_WIDTH - 1  : 0]   sin_out   ,output  reg signed [DATA_WIDTH - 1  : 0]   cos_out);// -----------------------------------------------  \\//    next is define and parameter                  \\// ------------------------------------------------- \\
reg    signed     [DATA_WIDTH - 1 : 0]     phase_reg    ;reg    signed     [DATA_WIDTH - 1 : 0]     phase_reg1    ;reg    signed     [DATA_WIDTH - 1 : 0]     X0           ;reg    signed     [DATA_WIDTH - 1 : 0]     Y0           ;reg    signed     [DATA_WIDTH - 1 : 0]     Z0           ;wire   signed     [DATA_WIDTH - 1 : 0]     X1 , Y1 , Z1 ;wire   signed     [DATA_WIDTH - 1 : 0]     X2 , Y2 , Z2 ;wire   signed     [DATA_WIDTH - 1 : 0]     X3 , Y3 , Z3 ;wire   signed     [DATA_WIDTH - 1 : 0]     X4 , Y4 , Z4 ;wire   signed     [DATA_WIDTH - 1 : 0]     X5 , Y5 , Z5 ;wire   signed     [DATA_WIDTH - 1 : 0]     X6 , Y6 , Z6 ;wire   signed     [DATA_WIDTH - 1 : 0]     X7 , Y7 , Z7 ;wire   signed     [DATA_WIDTH - 1 : 0]     X8 , Y8 , Z8 ;wire   signed     [DATA_WIDTH - 1 : 0]     X9 , Y9 , Z9 ;wire   signed     [DATA_WIDTH - 1 : 0]     X10 , Y10 , Z10 ;wire   signed     [DATA_WIDTH - 1 : 0]     X11 , Y11 , Z11 ;wire   signed     [DATA_WIDTH - 1 : 0]     X12 , Y12 , Z12 ;wire   signed     [DATA_WIDTH - 1 : 0]     X13 , Y13 , Z13 ;wire   signed     [DATA_WIDTH - 1 : 0]     X14 , Y14 , Z14 ;wire   signed     [DATA_WIDTH - 1 : 0]     X15 , Y15 , Z15 ;wire   signed     [DATA_WIDTH - 1 : 0]     X16 , Y16 , Z16 ;reg    signed     [DATA_WIDTH - 1 : 0]     XN15 , YN15     ;reg [1:0] quadrant[PIPELINE : 0] ;integer i ;// We will convert all new angles to the first quadrant//always@(posedge clk or negedge rst_n)beginif( rst_n == 0 )beginphase_reg <= 0 ;phase_reg1 <= 0 ;endelse if( ena == 1)beginphase_reg1 <= phase ;case(phase[DATA_WIDTH - 1 : DATA_WIDTH - 2])2'b00 :phase_reg <= phase                 ;2'b01 :phase_reg <= phase - 32'h40000000  ;   // -902'b10 :phase_reg <= phase - 32'h80000000  ;   // -1802'b11 :phase_reg <= phase - 32'hC0000000  ;   // -270default :phase_reg <= 32'h00   ; endcaseendend// We begin the initialization operation// we set 0.607253*???2^31-1???,32'h4DBA775Falways@(posedge clk or negedge rst_n)beginif(rst_n == 0 )beginX0 <= 0 ;Y0 <= 0 ;Z0 <= 0 ;endelse if(ena == 1)beginX0 <= 32'h4DBA775F ;Y0 <= 0            ;Z0 <= phase_reg    ;endend// for instantiation - 16
INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift      ( 5'd0 ),.ANGLE      ( 32'h20000000 )
)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 ( 8'd32 ),.shift      ( 5'd1 ),.ANGLE      ( 32'h12E4051D )
)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 ( 8'd32 ),.shift      ( 5'd2 ),.ANGLE      ( 32'h09FB385B )
)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 ( 8'd32 ),.shift      ( 5'd3 ),.ANGLE      ( 32'h051111D4 )
)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 ( 8'd32 ),.shift      ( 5'd4 ),.ANGLE      ( 32'h028B0D43 )
)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 ( 8'd32 ),.shift      ( 5'd5 ),.ANGLE      ( 32'h0145D7E1 )
)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 ( 8'd32 ),.shift      ( 5'd6 ),.ANGLE      ( 32'h00A2F61E )
)u_INTERATION6(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X6         ),.Y0         ( Y6         ),.Z0         ( Z6         ),.X1         ( X7         ),.Y1         ( Y7         ),.Z1         ( Z7         )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift      ( 5'd7 ),.ANGLE      ( 32'h00517C55 )
)u_INTERATION7(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X7         ),.Y0         ( Y7         ),.Z0         ( Z7         ),.X1         ( X8         ),.Y1         ( Y8         ),.Z1         ( Z8         )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift      ( 5'd8 ),.ANGLE      ( 32'h0028BE53 )
)u_INTERATION8(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X8         ),.Y0         ( Y8         ),.Z0         ( Z8         ),.X1         ( X9         ),.Y1         ( Y9         ),.Z1         ( Z9         )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift      ( 5'd9 ),.ANGLE      ( 32'h00145F2F )
)u_INTERATION9(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X9         ),.Y0         ( Y9         ),.Z0         ( Z9         ),.X1         ( X10         ),.Y1         ( Y10         ),.Z1         ( Z10         )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift      ( 5'd10 ),.ANGLE      ( 32'h000A2F98 )
)u_INTERATION10(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X10         ),.Y0         ( Y10         ),.Z0         ( Z10         ),.X1         ( X11         ),.Y1         ( Y11         ),.Z1         ( Z11         )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift      ( 5'd11 ),.ANGLE      ( 32'h000517CC )
)u_INTERATION11(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X11         ),.Y0         ( Y11         ),.Z0         ( Z11         ),.X1         ( X12         ),.Y1         ( Y12         ),.Z1         ( Z12         )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift      ( 5'd12 ),.ANGLE      ( 32'h00028BE6 )
)u_INTERATION12(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X12         ),.Y0         ( Y12         ),.Z0         ( Z12         ),.X1         ( X13         ),.Y1         ( Y13         ),.Z1         ( Z13         )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift      ( 5'd13 ),.ANGLE      ( 32'h000145F3 )
)u_INTERATION13(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X13         ),.Y0         ( Y13         ),.Z0         ( Z13         ),.X1         ( X14         ),.Y1         ( Y14         ),.Z1         ( Z14         )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift      ( 5'd14 ),.ANGLE      ( 32'h0000A2FA )
)u_INTERATION14(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X14         ),.Y0         ( Y14         ),.Z0         ( Z14         ),.X1         ( X15         ),.Y1         ( Y15         ),.Z1         ( Z15         )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift      ( 5'd15 ),.ANGLE      ( 32'h0000517D )
)u_INTERATION15(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X15         ),.Y0         ( Y15         ),.Z0         ( Z15         ),.X1         ( X16         ),.Y1         ( Y16         ),.Z1         ( Z16         )
);// iteration over 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_reg1[DATA_WIDTH - 1 : DATA_WIDTH - 2] ;end
end//------------------------------------------  \\//------------------------------------------  \\
//  Prevent overflow caused by small decimals and negative complement
//always @(posedge clk or negedge rst_n)if(rst_n == 0)XN15<=0;else if(X15[31:30] == 2'b11)//小于0XN15<=~X15 + 1'b1;else if(X15[31:30] == 2'b10)//大于1XN15<=32'h80000000 - X15 + 32'h80000000;else XN15 <= X15;always @(posedge clk or negedge rst_n )if(rst_n == 0)YN15 <=0;else if(Y15[31:30] == 2'b11)//小于0 YN15 <=~Y15 + 1'b1;else if(Y15[31:30] == 2'b10)//大于1YN15 <=32'h80000000 -Y15 + 32'h80000000;else YN15 <=Y15;// 
//   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[16]) 2'b00 :begincos_out <= XN15 ;sin_out <= YN15 ;end2'b01 :begincos_out <= ~YN15 + 1'b1;sin_out <= XN15        ;end2'b10 :begincos_out <= ~XN15 + 1'b1  ;sin_out <= ~YN15 + 1'b1 ;end2'b11 :begincos_out <= YN15        ;sin_out <= ~XN15 + 1'b1 ;endendcaseend
end
endmodule

ITERATION.v

module INTERATION #(parameter   DATA_WIDTH       =    8'd32       ,parameter   shift            =    5'd0        ,parameter   ANGLE            =    32'h20000000)(input                                  clk     ,input                                  rst_n   ,input                                  ena     ,input       signed  [DATA_WIDTH - 1 : 0]      X0      ,input       signed  [DATA_WIDTH - 1 : 0]      Y0      ,input       signed  [DATA_WIDTH - 1 : 0]      Z0      ,output  reg signed  [DATA_WIDTH - 1 : 0]      X1      ,output  reg signed  [DATA_WIDTH - 1 : 0]      Y1      ,output  reg signed  [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 )begin// X1 <= X0 - {{shift{ Y0[DATA_WIDTH - 1] }} ,Y0[DATA_WIDTH - 1 : shift] } ;// Y1 <= Y0 + {{shift{ X0[DATA_WIDTH - 1] }} ,X0[DATA_WIDTH - 1 : shift] } ;X1 <= X0 - (Y0>>>shift);Y1 <= Y0 + (X0>>>shift);Z1 <= Z0 - ANGLE                                                    ;endelse if(Z0[DATA_WIDTH - 1] == 1 )begin//X1 <= X0 + {{shift{ Y0[DATA_WIDTH - 1 ] }} ,Y0[DATA_WIDTH - 1 : shift] } ;// Y1 <= Y0 - {{shift{ X0[DATA_WIDTH - 1 ] }} ,X0[DATA_WIDTH - 1 : shift] } ;X1 <= X0 + (Y0>>>shift) ;Y1 <= Y0 - {X0>>>shift} ;Z1 <= Z0 + ANGLE                                                    ;endendendendmodule

CORDIC_tb.v

module cordic_tb #(parameter         DATA_WIDTH    =      8'd32  ,     // we set data widthparameter         PIPELINE      =      5'd16        // Optimize waveform    
);
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   ;integer i;
cordic32#(.DATA_WIDTH ( DATA_WIDTH ),.PIPELINE   ( PIPELINE )
)u_cordic32(.clk        ( clk        ),.rst_n      ( rst_n      ),.phase      ( phase      ),.ena        ( ena        ),.sin_out    ( sin_out    ),.cos_out    ( cos_out    )
);initial
begin#0 clk = 1'b0;ena   = 1'b1 ;#10 rst_n = 1'b0;#10 rst_n = 1'b1;#20000000 $stop;
end initial
beginrepeat(10)begin#0 phase = 32'd0;for(i=0;i<131072;i=i+1)begin#10;phase <= phase + 32'h8000;endend
end
always #10
beginclk = ~clk;
endendmodule 

README.md

在完成CORDIC的7次迭代之后 我在思考一个问题 8位进行了7次迭代 最后迭代至0号称没有误差了
我们是否可以通过 扩展至32位 进行多次迭代  将误差不断的缩小 本次数据参考至 网上的其他教程 我并没有自己去计算 我把结构优化一下 修改成更加便于理解使用的形式还有一件事 是 进制 与 Π 转化的问题 
对于 8位 其实我们 一开始将Π 设定为 1000_0000
那么对于 Π/4 是否就是1000_0000 的 四分之一 对于二进制 其实就是整体的数字进行移位 
我们将1000_0000 移动至 0010_0000 于此 而对于 32位我们32'h8000000 就是一个Π
而 32’h2000_0000 就是四分之Π 还有一件事 说明 我在写例化的时候 将数据完全完整的例化了下来 写的很长 这样并不是很好 
后面学习中 我看别人是 这么处理的 
genvar die;
generatefor (die = 0; die <Pipeline; die=die+1)begin: dieLoopalways @(posedge CLK_SYS or negedge RST_N)if (!RST_N) beginxn[die+1] <= 32'h0;yn[die+1] <= 32'h0;zn[die+1] <= 32'h0;endelse begin             if(zn[die][31]==1'b0)//角度符号判断beginxn[die+1] <= xn[die] - (yn[die]>>>die);yn[die+1] <= yn[die] + (xn[die]>>>die);zn[die+1] <= zn[die] - rot[die];  endelse beginxn[die+1] <= xn[die] + (yn[die]>>>die);yn[die+1] <= yn[die] - (xn[die]>>>die);zn[die+1] <= zn[die] + rot[die];  endendend
endgenerate# 还有一件事 对于溢出的考量 
我们所作溢出的考量 其实我们设定了32'h8000_0000 这既是Π的值 也是 1的设定 
但是在实际的运用和计算中 我们其实永远也达不到1 嘿嘿 
因为我们把最高位设计成了 符号位 
那么最大 也就是1 我们约等于 32'h7fff_ffff
这里需要注意的是[31:28] 是 7 也就是0111 非常重要的一个结论 我们最高位0代表了符号位
那么对于设计到第一象限的[31:30] 的值可以取 00 01 但是 10 11我们要对其进行合适的转化
所以便有了我们  对溢出的操作 always @(posedge clk or negedge rst_n)if(rst_n == 0)XN15<=0;else if(X15[31:30] == 2'b11)//小于0XN15<=~X15 + 1'b1;else if(X15[31:30] == 2'b10)//大于1XN15<=32'h80000000 - X15 + 32'h80000000;else XN15 <= X15;always @(posedge clk or negedge rst_n )if(rst_n == 0)YN15 <=0;else if(Y15[31:30] == 2'b11)//小于0 YN15 <=~Y15 + 1'b1;else if(Y15[31:30] == 2'b10)//大于1YN15 <=32'h80000000 -Y15 + 32'h80000000;else YN15 <=Y15;注意在设计的时候 定义成reg signed 的形式 将其设计为有符号位 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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



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

相关文章

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

springboot filter实现请求响应全链路拦截

《springbootfilter实现请求响应全链路拦截》这篇文章主要为大家详细介绍了SpringBoot如何结合Filter同时拦截请求和响应,从而实现​​日志采集自动化,感兴趣的小伙伴可以跟随小... 目录一、为什么你需要这个过滤器?​​​二、核心实现:一个Filter搞定双向数据流​​​​三、完整代码