Vivado cordic IP核rotate和translate使用详解(附有代码)

这篇具有很好参考价值的文章主要介绍了Vivado cordic IP核rotate和translate使用详解(附有代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Vivado cordic IP核rotate和translate使用详解(附有代码)

目录

前言

一、cordic简介

二、使用cordic IP核需要知道的预备知识

1.数据端口

2.Q Numbers Format

3.Vector Translation

4.Vector Rotation

三、IP核配置说明

1.translate

2.Rotate

四、Translate仿真

1.顶层代码

2.仿真代码

五、Rotate仿真

1.顶层代码

2.仿真代码

总结

参考链接:http://t.csdn.cn/pha8V


前言

        利用givens旋转可以把一个矩阵分解为一个正交矩阵和一个三角矩阵,在FPGA中要想实现矩阵的上述分解操作,需要用到的就是cordic IP核当中的rotate和translate模式。本文将结合官方的cordic数据手册和自身使用经历详细介绍cordic IP核当中的rotate和translate模式的使用方法。


提示:以下是本篇文章正文内容,写文章实属不易,希望能帮助到各位,转载请附上链接。

一、cordic简介

        CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数、双曲线、指数、对数的计算。该算法通过基本的加和移位运算代替乘法运算,使得矢量的旋转和定向的计算不再需要三角函数、乘法、开方、反三角、指数等函数。

        CORDIC IP核支持的模式如图0所示,本文介绍的为前2个。

Vivado cordic IP核rotate和translate使用详解(附有代码)
图0 功能概述

        CORDIC算法具体介绍和Square root模式操作可见文章末尾附上的链接,本文注重介绍cordic IP核的使用,原理在此不做赘述。

二、使用cordic IP核需要知道的预备知识

        以下说明大多来自于cordic IP核官方给出的英文数据手册,此处作一定解释,帮助大家理解。

1.数据端口

Vivado cordic IP核rotate和translate使用详解(附有代码)
图1 端口介绍

         观察图1,会发现输入的数据(不看相位输入)和输出的数据就只有一个端口,但在rotate和translate模式中被操作的数应该是一个矢量,也就是一个坐标,输入输出应当是成双成对的,而图1所示却只有一个端口,这是为什么呢?

        这里就是大家使用该IP核需要注意的一个地方,它这个数据输入输出拼接到一个端口了。如图2和图3所示。

Vivado cordic IP核rotate和translate使用详解(附有代码)
图2 输入数据格式

 

Vivado cordic IP核rotate和translate使用详解(附有代码)
图3 输出数据格式

         看完图2和图3我们需要注意数据拼接时坐标x在低位,坐标y或者相位输出在高位。

2.Q Numbers Format

        cordic IP核操作数为定点数,坐标x、y输入输出和相位输入输出的格式有所不同。

        首先我们需要知道XQN格式,所谓XQN格式就是1+X+N位补码二进制数,1位符号位,后面跟着X个整数位,后面跟着一个N位尾数(分数)。

        cordic IP核中坐标是1QN格式,相角是2QN格式,其实这个格式与数据范围有一定关系,相角范围比坐标范围要宽一些,所以相交整数位要多一位。

         输入向量(Xin, Yin)和输出向量(Xout, Yout)表示为一对宽度为2位的整数二补数(1QN格式)。输入旋转角度,引脚弧度,也表示为一个固定的二补数,但宽度为3位(2QN格式)。

3.Vector Translation

Vivado cordic IP核rotate和translate使用详解(附有代码)
图4 translation数据范围

 

Vivado cordic IP核rotate和translate使用详解(附有代码)
图5 例子

 

Vivado cordic IP核rotate和translate使用详解(附有代码)
图6 例子MATLAB

 对比图5与图6相位,可见10位误差较大。

4.Vector Rotation

Vivado cordic IP核rotate和translate使用详解(附有代码)
图7 数据范围

 

Vivado cordic IP核rotate和translate使用详解(附有代码)
图8 例子

 图8将输入(x,y)沿坐标轴旋转了-pi/2。

三、IP核配置说明

1.translate

Vivado cordic IP核rotate和translate使用详解(附有代码)
图9 page1配置

 Functional Selection:此处选择Translate

Architectural Configuration: CORDIC核心有两种架构配置,并行和字串行。此处选择并行。

Pipelining Mode:CORDIC核心提供了三种流水线模式:无、最优和最大。流水线模式的选择基于功能配置和体系结构配置的选择。不可用的管道模式在CORDIC GUI中是灰色的。

None: CORDIC核心在没有流水线的情况下实现。

优化:CORDIC核心实现了尽可能多的流水线阶段,而不使用任何额外的lut。

最大:CORDIC核心在每个shift-add子阶段之后都有一个管道实现。

此处选择优化。

Data Format: Translate默认不可选。

Phase Format:CORDIC核心提供两种相位格式选项。

Radians:相位表示为3位整数宽度的定点二补数,以弧度单位表示。例如:01100000代表3.0弧度。

 Scaled Radians:相位表示为3位整数宽度的定点二补数,以π弧度为单位。一个缩放弧度等于π * 1弧度。例如:11110000表示-0.5 * Pi弧度。

此处选择Radians。

Input Width:输入坐标位宽。

Output Width:输出坐标位宽。

Round Mode:CORDIC核心提供四种舍入模式。

Truncate: The X_OUT, Y_OUT, and PHASE_OUT outputs are truncated.
Positive Infinity: The X_OUT, Y_OUT, and PHASE_OUT outputs are rounded such 
that 1/2 is rounded up (towards positive infinity). It is equivalent to the MATLAB
function floor(x + 0.5)
Pos Neg Infinity: The outputs X_OUT, Y_OUT, and PHASE_OUT are rounded such 
that 1/2 is rounded up (towards positive infinity) and -1/2 is rounded down 
(towards negative infinity). It is equivalent to the MATLAB function round(x).
Nearest Even: The X_OUT, Y_OUT, and PHASE_OUT outputs are rounded toward the 
nearest even number such that a 1/2 is rounded down and 3/2 is rounded up.

此处选择Round Pos Neg Inf。

Iterations和 Precision:不选设为0 IP核根据其他设置默认设置。

Coarse Rotation:如果关闭粗旋转,输入/输出范围将限制在第一象限(-Pi/4到+ Pi/4)。所以应该勾上。

Compensation Scaling:补偿方式。

No Scale Compensation: 输出X和Y没有补偿,并生成,按比例Zi缩放。

LUT Based:输出X和Y补偿使用基于LUT的常系数乘法器。

BRAM: 输出X和Y使用块ram为基础的常系数乘法器进行补偿。

Embedded Multiplier: 输出X和Y使用DSP Slice进行补偿。

此处如果选No,不会补偿,输出结果不对。以保证结果正确,必须选择一项补偿方式。此处默认选LUT Based。

Vivado cordic IP核rotate和translate使用详解(附有代码)
图10 page2配置

 第2页的配置全部不用管,默认即可,几乎无影响。

2.Rotate

Rotate配置同Translate。模式选择Rotate即可。

四、Translate仿真

1.顶层代码

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2023/01/10 13:04:52
// Design Name: 
// Module Name: cordic_translate_test
// Project Name: 
// Target Devices: 
// Tool Versions: 2017.4
// Description: 
// Dependencies: 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//

module cordic_translate_test(
input clk,                    //输入时钟信号
input start,                  //输入开始计算信号
input [31:0] x_in,            //输入坐标x
input [31:0] y_in,            //输入坐标y
output wire over,              //输出计算完成标志
output wire [31:0] x_out,      //输出坐标x
output wire [31:0] pha_out     //输出相角
);


cordic_translate_ip u_cordic_translate_ip(
  .aclk(clk),                                        // input wire aclk
  .s_axis_cartesian_tvalid(start),  // input wire s_axis_cartesian_tvalid
  .s_axis_cartesian_tdata({y_in,x_in}),    // input wire [63 : 0] s_axis_cartesian_tdata
  .m_axis_dout_tvalid(over),            // output wire m_axis_dout_tvalid
  .m_axis_dout_tdata({pha_out,x_out})              // output wire [63 : 0] m_axis_dout_tdata
);

endmodule

2.仿真代码

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2023/01/10 13:06:20
// Design Name: 
// Module Name: cordic_translate_test_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 2017.4
// Description: 
// Dependencies: 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//

module cordic_translate_test_tb();

// cordic_translate_test Parameters
parameter PERIOD  = 2;

// cordic_translate_test Inputs
reg   clk                                  = 0 ;
reg   start                                = 0 ;
reg   [31:0]  x_in                         = 0 ;
reg   [31:0]  y_in                         = 0 ;

// cordic_translate_test Outputs
wire  over                                 ;
wire  [31:0]  x_out                        ;
wire  [31:0]  pha_out                      ;

initial
begin
    forever #(PERIOD/2)  clk=~clk;
end

cordic_translate_test  u_cordic_translate_test (
    .clk                     ( clk             ),
    .start                   ( start           ),
    .x_in                    ( x_in     [31:0] ),
    .y_in                    ( y_in     [31:0] ),

    .over                    ( over            ),
    .x_out                   ( x_out    [31:0] ),
    .pha_out                 ( pha_out  [31:0] )
);


initial
begin
    #5  start<=1;
    x_in<=32'b00110000000000000000000000000000;
    y_in<=32'b00110000000000000000000000000000;
    #2  
    x_in<=32'b11100000000000000000000000000000;
    y_in<=32'b11100000000000000000000000000000;
end

endmodule
Vivado cordic IP核rotate和translate使用详解(附有代码)
图11 translate仿真结果

 

Vivado cordic IP核rotate和translate使用详解(附有代码)
图12 MATLAB结果

 对比图11和图12可知仿真正确。

五、Rotate仿真

1.顶层代码

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2023/01/10 14:40:46
// Design Name: 
// Module Name: cordic_rotate_test
// Project Name: 
// Target Devices: 
// Tool Versions: 2017.4
// Description: 
// Dependencies: 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//

module cordic_rotate_test(
input clk,                    //输入时钟信号
input start,                  //输入开始计算信号
input [31:0] x_in,            //输入坐标x
input [31:0] y_in,            //输入坐标y
input [31:0] pha_in,          //输入相角
output wire over,             //输出计算完成标志
output wire [31:0] x_out,     //输出坐标x
output wire [31:0] y_out      //输出坐标y
    );
    
cordic_rotate_ip u_cordic_rotate_ip (
  .aclk(clk),                                        // input wire aclk
  .s_axis_phase_tvalid(start),          // input wire s_axis_phase_tvalid
  .s_axis_phase_tdata(pha_in),            // input wire [31 : 0] s_axis_phase_tdata
  .s_axis_cartesian_tvalid(start),  // input wire s_axis_cartesian_tvalid
  .s_axis_cartesian_tdata({y_in,x_in}),    // input wire [63 : 0] s_axis_cartesian_tdata
  .m_axis_dout_tvalid(over),            // output wire m_axis_dout_tvalid
  .m_axis_dout_tdata({y_out,x_out})              // output wire [63 : 0] m_axis_dout_tdata
);


endmodule

2.仿真代码

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2023/01/10 14:41:21
// Design Name: 
// Module Name: cordic_rotate_test_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 2017.4
// Description: 
// Dependencies: 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//

module cordic_rotate_test_tb();

// cordic_rotate_test Parameters
parameter PERIOD  = 2;

// cordic_rotate_test Inputs
reg   clk                                  = 0 ;
reg   start                                = 0 ;
reg   [31:0]  x_in                         = 0 ;
reg   [31:0]  y_in                         = 0 ;
reg   [31:0]  pha_in                       = 0 ;

// cordic_rotate_test Outputs
wire  over                                 ;
wire  [31:0]  x_out                        ;
wire  [31:0]  y_out                        ;


initial
begin
    forever #(PERIOD/2)  clk=~clk;
end

cordic_rotate_test  u_cordic_rotate_test (
    .clk                     ( clk            ),
    .start                   ( start          ),
    .x_in                    ( x_in    [31:0] ),
    .y_in                    ( y_in    [31:0] ),
    .pha_in                  ( pha_in  [31:0] ),

    .over                    ( over           ),
    .x_out                   ( x_out   [31:0] ),
    .y_out                   ( y_out   [31:0] )
);


initial
begin
    #5  start<=1;
  pha_in<=32'b00110010010000111111011010101000;
    x_in<=32'b00110000000000000000000000000000;
    y_in<=32'b00110000000000000000000000000000;
    #2  
  pha_in<=32'b10011011011110000001001010101111;
    x_in<=32'b11100000000000000000000000000000;
    y_in<=32'b11100000000000000000000000000000;
end



endmodule
Vivado cordic IP核rotate和translate使用详解(附有代码)
图13 Rotate仿真结果

 如图13所示,(-0.5,-0.5)旋转-pi后为(0.5,0.5)。


总结

        以上就是今天要讲的内容,本文主要介绍了xilinx提供的CORDIC IP核当中Translate和Rotate模式的使用方法。文章来源地址https://www.toymoban.com/news/detail-426768.html

参考链接:http://t.csdn.cn/pha8V

到了这里,关于Vivado cordic IP核rotate和translate使用详解(附有代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vivado_FFT IP核 使用详解

    本文介绍Vivado中Fast Fourier Transform V9.1的使用方法。 参考资料:pg109 FFT是用于计算样本大小为2的正整数幂的离散傅里叶变换(DFT)的高效计算方法。序列的DFT定义为 X ( k ) = ∑ n = 0 N − 1 x ( n ) e − j n k 2 π / N    k = 0 , … N − 1 X(k) = sum_{n=0}^{N-1}x(n)e^{-jnk2pi /N} k = 0,dots N-1

    2023年04月15日
    浏览(44)
  • Eigen::Isometry3d的用法(pretranslate、translate、prerotate、rotate的区别)

    pretranslate、prerotate表示左乘,即以世界坐标为参考 translate、rotate表示右乘,即以局部坐标系为参考 下面以直线L做45度旋转和向X方向移动200像素两次线性变换为例子:              isometry1.rotate(axisd);//右乘(局部坐标参考)     isometry1.translate(Eigen::Vector3d(200,0,0));     i

    2024年02月07日
    浏览(30)
  • 【FPGA】Xilinx Cordic IP 内核使用记录(输入输出数据格式介绍)及实验仿真

    Rotate 实现的功能是坐标的旋转。 输入 X, Y, Phase 输出X’, Y’ 具体实现的功能对应的数学表达形式如下: 在做FFT 复乘旋转因子时也可以用这个IP核的Rotate功能来实现。旋转因子-旋转! Translation 实现的功能是求模,以及向量的夹角 输入 X, Y 输出X’ and Phase 具体实现的功能对应

    2024年02月07日
    浏览(47)
  • CSS -- CSS3中3D转换相关属性讲解(translate3d,rotate3d,perspective,transform-style)

    我们生活的环境是3D的,照片就是3D物体在2D平面呈现的例子。 3D特点: 近大远小。 物体后面遮挡不可见 当我们在网页上构建3D效果的时候参考这些特点就能产出3D效果。 三维坐标系其实就是指立体空间,立体空间是由3个轴共同组成的。 x轴:水平向右 注意:X右边是正值,左

    2024年02月05日
    浏览(65)
  • CSS3过渡、过渡练习——进度条案例、2D转换(translate、rotate、scale、转换中心点transform-origin)、动画、3D、案例(两面翻转的盒子、3D导航栏、旋转木马案例)

    目录 一、CSS3过渡(transition)(重点) 二、CSS3过渡练习——进度条案例 三、CSS3 2D转换(translate、rotate、scale、转换中心点transform-origin) 四、CSS3 动画 五、CSS3动画常见属性 五、热点图案例(动画) 六、速度曲线之steps步长(案例——奔跑的熊大) 七、CSS3 3D转换(3D 位移:t

    2024年02月03日
    浏览(47)
  • Vivado中的IP核——uartlite详解

    如果想要使用uartlite这个模块,则需要其驱动程序,这些驱动程序中包含对寄存器的直接操作。赛灵思在BSP中提供了uartlite的驱动函数,但是感觉不好用,所以本文详细介绍uartlite的寄存器空间,以便于可以自己编写相应的驱动函数。 资料ID:PG142 文档查找软件:DocNav,在安装

    2024年02月04日
    浏览(31)
  • Vivado中的IP核——GPIO详解

    资料ID:PG144 文档查找软件:DocNav,在安装vivado时可以选择一并安装 Vivado中的GPIO模块框图如下。 下表展示了AXI GPIO的寄存器和相对于基地址的地址偏移值。 这些寄存器是否可用取决于一些配置参数的值。若某个寄存器是不可用的,一个写信号对该寄存器没有效果;当尝试读

    2024年02月08日
    浏览(37)
  • 使用Java导入、导出excel详解(附有封装好的工具类)

    😜 作           者 :是江迪呀 ✒️ 本文 : Java 、 Excel 、 导出 、 工具类 、 后端 ☀️ 每日   一言 :有些事情不是对的才去坚持,而是坚持了它才是对的! 我们在日常开发中,一定遇到过要将数据导出为 Excel 的需求,那么怎么做呢?在做之前,我们需要思考

    2024年02月06日
    浏览(51)
  • Cordic算法原理详解

    目录 坐标旋转分析 Cordic算法原理 应用举例1:求sin值与cos值 应用举例2:求反正切值 cosθ的还原补偿 坐标旋转数字计算机CORDIC(COordinate Rotation DIgital Computer)算法,通过移位和加减运算,能递归计算常用函数值,如Sin,Cos,Sinh,Cosh等函数,由J. Volder于1959年提出,首先用于导航

    2024年02月04日
    浏览(81)
  • DDR3 控制器 MIG IP 详解完整版 (VIVADO&Verilog)

    DDR系列文章分类地址: (1)DDR3 基础知识分享 (2)DDR3 控制器 MIG IP 详解完整版 (AXI4VivadoVerilog) (3)DDR3 控制器 MIG IP 详解完整版 (nativeVivadoVerilog) (4)基于 DDR3 的串口传图帧缓存系统设计实现 (5)基于 DDR3 的native接口串口局部传图缓存系统设计实现 (6)基于 DDR3 的

    2024年02月06日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包