基于Cortex-M3的硬件加速模块

本文介绍了基于Cortex-M3的SOC设计,包括AHB、APB总线和32KB SRAM。重点在于设计了一个硬件加速模块Accelerate,通过APB总线接口实现对三角函数(如sin、cos)的硬件计算,以提高计算效率。文章详细阐述了CORDIC算法的工作原理和硬件实现,并展示了软件与硬件计算时间的对比。最终,实现了完整的SOC软硬件协同仿真测试。
摘要由CSDN通过智能技术生成

要求:
1、基于m3搭建一个soc,具备ahb、apb两条总线、具备32KB sram 存储器 
2、基于apb总线接口设计一个计算模块,该计算模块可以用于加速某种计算,比如sin/cos/pi等,全部由硬件来计算,与软件计算用时进行比较
软件计算用时:
t=5.391s/100000000=53.91ns

#include “stdio.h”    
#include “stdlib.h”    
#include “time.h”    
int main( void )    
{    
   int Q=1;
   int i;
   double b=0;
   clock_t start, finish;    
   double  duration;    
   /* 测量一个事件持续的时间*/    
   printf( "Time to do %ld loops is ", i );    
   start = clock();    
   for (i=0;i<100000000;i++) b=sin(Q)    ;    
   finish = clock();    
   duration = (double)(finish - start) / CLOCKS_PER_SEC;    
   printf( "%f seconds\n", duration );    
   system("pause");    
}

SOC设计:包含M3内核/AHB/APB/32K的SRAM(接AHB)/加速模块Accelerate(接APB)

加速模块Accelerate(接APB):
本模块主要针对三角函数的加速计算,计算机出来之前主要通过查表法来进行三角函数求值,即通过已知值重复应用半角和差公式生成;同时还可以用泰勒级数/切比雪夫/最佳一致等概率学方法来实现三角函数值的逼近,这些方法都是通过多项式函数进行近似求值,这种求解方法会涉及到大量浮点运算,对于缺乏硬件乘法器的设备,通过这些方法计算三角函数就非常费时。1959年为解决这种问题,提出了CORDIC(Coordinated Rotation DIgital Computer)算法并在1974年进一步改进,此算法利用移位和加减运算进行三角函数求值,由于只用移位和加法,采用纯硬件方式可以实现。下面对CORDIC算法的原理进行阐述。

CORDIC原理:
CORDIC有两种工作模式,包括旋转/向量模式,在圆/线性/双曲线中可以进行8种不同的运算,具体对应如下:

具体的Cordic算法的原理推导可以参考这篇博客
https://blog.csdn.net/Pieces_thinking/article/details/83512820?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159419919019195188447152%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159419919019195188447152&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_blog_default-5-83512820.pc_v2_rank_blog_default&utm_term=cordic
我觉得它讲的很详细了。因为本文主要是求解正余弦值,所以只对圆坐标系下的旋转模式部分进行分析:
事实上这个算法可以看作是从0°角向目标角度不断旋转逼近的过程,旋转方向可顺可逆(di=+1/-1),每次的旋转值为设定的

在每次旋转的过程中,旋转的角度是正确的,但是模长变为原来的1/cosb倍,因此再最后要对整个旋转过程中的模长变化进行补偿,引入校模因子,当旋转(迭代)次数趋向于16次时,cosb趋于1,角度已经基本符合所求角度,此时校模因子的多次旋转累积值近似1/An≈0.6072529351。求解过程如下:

取X0=1/An,Y0=0,Z0=求的角度值,迭代计算后即可求得正余弦值。
下面进行Cordic算法的硬件模块实现,

上图为APB接口的Cordic模块。其中使用了apb_slave的PORT3,端口地址为0x4000_3000-0x4000_3FFF,使能寄存器地址0x00,输入相位寄存器地址0x04,输出的sin/cos寄存器地址存放在0x08/0x0c。
软件(Matlab)Cordic算法:(https://blog.csdn.net/qq_39210023/article/details/77456031?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.nonecase)

close all;
clear;
clc;
% 初始化
K = 16;%迭代次数
x = zeros(K+1,1);
y = zeros(K+1,1);
z = zeros(K+1,1);
x(1) = 0.607253;%初始设置
z(1) = pi/4;%待求角度θ
%迭代操作
for i = 1:K
    if z(i) >= 0
        d = 1;
    else
        d = -1;
    end
    x(i+1) = x(i) - d*y(i)*(2^(-(i-1)));
    y(i+1) = y(i) + d*x(i)*(2^(-(i-1)));
    z(i+1) = z(i) - d*atan(2^(-(i-1)));
end
cosa = vpa(x(17),10)
sina = vpa(y(17),10)
c &
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值