zoukankan      html  css  js  c++  java
  • CORDIC的硬件算法实现(摘录整理)

    该系统完成的是一个平面坐标旋转如图 1所示,可以看出,将向量(X i ,Y i ) 旋转image 角,得到一个新的向量
    ( Xj,Yj)。

    image

    image 将Rcos()展开

    image 矩阵形式

    硬件上用乘除法很耗资源,未来节省资源采用这样的思路:最常用的代替乘法的方式是移位运算

    来看下把这乘法最终转换为移位的思路:

    移位运算只能做乘除2.    但这些运算组合可形成大的乘除法

    将要旋转的角度分解,每次完成一小块,多次后就可逼近角度值

    分解(逼近)方式入下:

    image 其中的第n次旋转过程

    image 第n次的旋转角度必须是这个(n为任意值)(arctan(1)= 45度)

    image Sn为符号(-,+)image ,各种image 组合成image (即真正要旋转的角度)

    image Zn为未旋转的角度

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    image 先看下如何消去image

    image

    image 随着迭代的增加他将收敛与常数K(或1/P),故可用预先计算来消除.

    image

    image

    ··········································································································································································

    未旋转的角度减少到0,用伪代码表示为

    For n=0 to [inf]

    If (Z(n) >= 0) then

          Z(n + 1) := Z(n) – atan(1/2^n);

    Else

          Z(n + 1) := Z(n) + atan(1/2^n);

    End if;

    End for;

    预先计算好arctan(1/2^n)的值,形成查找表的形式,[inf]为需要的迭代次数,每一位需要1次(16轮的迭代将产生16位的结果),如果加入X,Y的计算,用伪代码的表示如下:

    For n=0 to [inf]

    If (Z(n) >= 0) then

           X(n + 1) := X(n) – (Yn/2^n);

           Y(n + 1) := Y(n) + (Xn/2^n);

           Z(n + 1) := Z(n) – atan(1/2^n);

    Else

           X(n + 1) := X(n) + (Yn/2^n);

           Y(n + 1) := Y(n) – (Xn/2^n);

           Z(n + 1) := Z(n) + atan(1/2^n);

    End if;

    End for;

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    使Z趋向于0

    image

    存在以下有趣的情况:

    image

    image 就是把矢量旋转到x轴上,这时候 x的坐标就是矢量的模啦

    注意:参数范围

     image

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    算法硬件实现原理图:

    image

    X,Y的输入为最原始的x,y值;k的输入为确定arctan(1/2^k)  ; image 要旋转的角度

    数据最高位为符号位1为负 0为正

    image ··· image  左移右移k =n来完成·····image

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    image···image ···image image image ····image 这个反馈回路来完成迭代,一次次小的旋转最终完成大的旋转

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    预先计算好arctan(1/2^k)的值,形成查找表的形式image

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

     image···image

    image image 这个回路·····   Z(n + 1) := Z(n) +atan(1/2^n);

                                                                                             Z(n + 1) = Z(n) -atan(1/2^n);

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    image image

    判断Z(n),看是加还是减(imageimage? )

    If (Z(n) >= 0) then

           X(n + 1) := X(n) – (Yn/2^n);

           Y(n + 1) := Y(n) + (Xn/2^n);

           Z(n + 1) := Z(n) – atan(1/2^n);

    Else

           X(n + 1) := X(n) + (Yn/2^n);

           Y(n + 1) := Y(n) – (Xn/2^n);

           Z(n + 1) := Z(n) + atan(1/2^n);

    End if;

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    image 的硬件实现:

    先给出RTL的图:

    image

    思路:

    这里k有三位,故整个移位过程分3步进行  即 single ; double; triple

    这三部分是将数依次移动 2^0, 2^1, 2^2

    实例:

    k = 3’b101;

    k[0] = 1;     故数右移1*2^0位

    k[1] = 0;      故数右移0*2^1位

    k[2] = 1;      故数右移1*2^2位

     image 最终右移啦5位

    image

    k控制的的选择器

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    image 二进制角度表示查找表表 硬件实现

    Look-Up Table

    这儿用12位2进制数表示角度(bit[11],bit[10]……bit[0]

    首先确定12位数与角度的关联:

    bit[11] 表示-180度 (1:出现-180;0:不出现-180; 方便与后边的数累加  即可表示-180~ +180的值)

    bit[10] 表示+90度

    bit[9:0] 表示+90/(2^n) 

    (n值得确定方式为:

    1 为bit[9]

    `

    `

    `

    10 为bit[0]

    )(其实就是角度减半减半再减半)

    verilog 描述:

     image

    另外由于旋转因子需要进行0°、-90°或+90°三种预旋转,所以预旋转还要分配两位二进制数,这样存储旋转系数就为12位的

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    image 硬件实现

    12-bit Full Adder

    有点像异或门做选择器,呵呵

    image 二进制与1异或 相当于取反  取反后二进制的位置与原先的位置是对称的 故可以此表示-180  ~ +180

    当与0异或时 原数不变

    当sign = 0 时做加法

    当sign = 1 时做减法 (其实是改变后的加法)

    image

    image4 Bit Full Adder

    这个4位的全加器就多讲啦

    image

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    ·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~``

    最后:

    Vectoring CORDIC  用于计算复数的模

    用迭代使Y趋向0 就是将矢量旋转到x轴上 此时x轴坐标就是 矢量的模;

    需要注意的是:

    在迭代之前要保证矢量在(-90,,90)之间

    操作方法是 当矢量在地1,2象限(0,180)是-90度

              当矢量在地3,4象限(-180,0)时+90度

    image

    参考资料:

    image

    image

    image

  • 相关阅读:
    How To Change Database Name
    Oracle备份与恢复案例
    Linux 下安装 Oracle9i
    在 Linux x86 上安装 Oracle 数据库 10g_1
    在 Linux x86 上安装 Oracle 数据库 10g_2
    Oracle9i数据库DataGuard实施及维护手册2
    在 Linux x86 上安装 Oracle 数据库 10g_3
    流程企业(钢铁企业)的制造执行系统
    理解和使用Oracle分析工具LogMiner
    Oracle9i数据库Data Guard实施及维护手册 1
  • 原文地址:https://www.cnblogs.com/sleepy/p/2103391.html
Copyright © 2011-2022 走看看