0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基本数学运算在FPGA中的实现算法仿真分析

电子设计 来源:博客园 作者:没落骑士 2020-12-25 14:02 次阅读

作者:没落骑士

一、前言

FPGA以擅长高速并行数据处理而闻名,从有线/无线通信到图像处理中各种DSP算法,再到现今火爆的AI应用,都离不开卷积、滤波、变换等基本的数学运算。但由于FPGA的硬件结构和开发特性使得其对很多算法不友好,之前本人零散地总结和转载了些基本的数学运算在FPGA中的实现方式,今天做一个系统的总结归纳。

二、FPGA中的加减乘除

1.硬件资源

Xilinx 7系列的FPGA中有DSP Slice ,叫做“DSP48E1”这一专用硬件资源,这是一个功能强大的计算单元,单就用于基本运算的部分有加减单元和乘法器。详见参考文献1.

o4YBAF9uH6KAcCDkAAB5s7i_M8w954.png

因此可以直接用HDL语言中的加、减、乘符号实现变量与常量间运算操作以及变量与变量间操作。而四则运算中的除法没有基本的逻辑计算单元可以对应,因此计算除法需要调用除法器IP核。

2.确认数据的表示范围

有符号数:(补码)-2^(N-1) ~ 2^(N-1)-1 如N = 8,则表示范围是:-128 ~ 127.

无符号数:0~2^N-1 如N = 8,则表示范围是:0~255.

定点数:2Q13 范围是:-4~4-2^(-13) 精度是:2^(-13)

3.结果有效位宽

首先讨论结果位宽问题。在FPGA中往往采用定点运算替代浮点运算来降低硬件资源占用率和计算延迟,其中的精髓就是精度与资源的权衡。若按照保留计算结果的全部精度,N bit数与Mbit数相加结果需要N+1bit(N>M)。N bit数与M bit数相乘之积需要N+M bit。而减法可以转化为加法,除法则转换为乘法和加减法的组合。如果操作数是定点小数,则在满足以上准则的前提下,A与B相加(A小数点位数>B小数点位数),结果小数点位数与A相同;A与B相乘(小数点位数分别为p和q),结果小数点位数是p+q。

4.定点运算步骤

然而(话锋一转),在大多数场合下,不需要以上这么多位来保留计算结果,因为我们在进行数学运算时,已经知道输入数据的大致范围,一个数除以1000和除以1结果数据所需最小位宽能一样么?加减运算的操作步骤是先对齐小数点位数,后加减。而乘法是先计算后取小数点。这实际上与十进制运算一致,我们看看具体的计算步骤:

整数之间加减以及乘法的统一步骤:预估结果位宽N --> 按照结果位宽扩展操作数符号位以防止溢出 --> 运算取低N位。

定点小数加减运算步骤:预估结果位宽N --> 得到结果小数点后位数 --> 对齐操作数整数位和小数位,确定扩展位宽M(M≥N) --> 加减运算取低M位。

定点小数乘法运算步骤:预估结果位宽N --> 得到结果小数点后位数 --> 扩展操作数位宽 --> 相乘取低N位

5. 变量与常量运算化简

以上讨论的均是两变量之间的运算规则,当然结果位宽及格式准则是适用的。变量与常量的运算的优势在于,可以将乘除法转换成加减以及移位运算实现,从而降低计算复杂度和延迟。当常数项C为2的整数次幂(C = 2^p),则乘C等于变量左移p位,除以C等于变量右移p位。几个在书中看到的几个简单示例:A*16 = A >1A除以3 = A*(0.25+0.0625+0.0156) = A>>2+A>>4+A>>6A除以5 = A*(0.125+0.0625+0.0156) = A>>3 + A>>4 + A>>6.其中乘法完全等价对应的移位相加操作,而除法的移位代替会损失精度。

三、如何计算特殊函数

FPGA内部的DSP Slice可以直接进行最基本的加法和乘法运算,但是对于其他比如对数、指数、三角函数、开根号等特殊函数就无能为力了。这时需要借助算法对这些特殊函数进行变换和简化。FPGA实现复杂函数的常用手段一个是级数展开,再一个就是CORDIC算法。关于CORDIC的理论知识和具体内容详见参考文献2,这里主要阐述CORDIC的IP核调用以及应用示例。CORDIC算法就是通过一定的手段,将很多复杂的特殊函数变为相加移位运算,这一点对于硬件芯片实现来说非常友好。CORDIC分为旋转模式和矢量模式,配合圆周坐标、线性坐标和双曲线坐标会有六种组合,具体见下表:

o4YBAF9uH6eAYHStAAUPTubgJdM481.png

从表中发现,基本的乘除法、三角函数、反三角函数、双曲函数、反双曲函数、开根号都能够直接求得,那其他函数怎么办?

o4YBAF9uH6uAdk1gAAKsIU8Rl24196.png

常见的函数计算需求基本都能满足,虽上述变换式对自变量定义域有限制,但同样可以分析输入数据的取值范围并利用简单的数学变换得到想要的结果。Xilinx同时提供了浮点IP核以及CORDIC IP核,前者调用简单但占用资源大,延迟高,因此利用CORDIC算法计算函数是个较好的选择。

四、CORDIC计算e^x Demo

1. 算法仿真分析

要计算e^x数值需要让CORDIC工作在双曲坐标的旋转模式下,通过e^x = sinhx+coshx关系式间接求得。首先看下sinh和cosh函数的曲线,有个直观认识。

我们用MATLAB毫不费力地验证一下公式正确性:

在设计后也同样要借助MATLAB进行仿真验证。

2. CORDIC IP核

现在通过查看user guide得知CORDIC IP核的接口及主要特性。

o4YBAF9uH7GAeoe_AAEXmjcb690888.png

接口包括输入笛卡尔数据输入通道、相位输入通道、全局信号以及数据输出通道。该IP核有两种结构:串行和并行,可根据数据吞吐量需求选择,并行结构可以每个时钟输出一个计算结果。如果计算sinh和cosh,要向phase通道输入相位信息,X_OUT是cosh(phase),Y_OUT是sinh(phase).输入phase必须满足数据范围,否则出现不可预计结果。输出帧结构及数据范围如下:

pIYBAF9uH7OARASKAACJBvr-Sog572.png

其中输入数据格式为2QN,输出则是1QN。由于均是有符号数,也就是输入整数部分3bit,输出整数部分2bit。接下来对IP核进行配置,重点是第一页,此处将其配置为计算sinh和cosh模式,采用并行优化的流水线结构。相位以角度为单位,输入输出位宽设置成16bit。

o4YBAF9uH7WAWgPKAAEbXDGFtVk789.png

3.HDL代码设计及仿真验证

设计代码:
`timescale 1ns / 1ps

module cordic_ex#(parameter DIN_W = 16,
DOUT_W = 16)
(
input clk,
input [DIN_W-1:0] din,//2Q13
input din_vld,

output reg [DOUT_W+1-1:0] dout = 0,//2Q14
output reg dout_vld = 0
);

wire [DOUT_W*2-1 : 0] m_axis_dout_tdata;
wire m_axis_dout_tvalid;
wire signed [DOUT_W-1:0] sinh,cosh;

// ex = sinhx + coshx
always @(posedge clk)begin
dout end

assign sinh = m_axis_dout_tdata[DOUT_W*2-1 -:DOUT_W];
assign cosh = m_axis_dout_tdata[DOUT_W-1 -:DOUT_W];

always @(posedge clk)begin
if(m_axis_dout_tvalid)begin
dout_vld end
else
dout_vld end

cordic_0 cordic_cosh_sinh (
.aclk(clk), // input wire aclk
.s_axis_phase_tvalid(din_vld), // input wire s_axis_phase_tvalid
.s_axis_phase_tdata(din), // input wire [15 : 0] s_axis_phase_tdata
.m_axis_dout_tvalid(m_axis_dout_tvalid), // output wire m_axis_dout_tvalid
.m_axis_dout_tdata(m_axis_dout_tdata) // output wire [31 : 0] m_axis_dout_tdata
);

endmodule

cordic_ex

用MATLAB产生两组数据,并将角度值定点化后作为设计模块数据激励:

pIYBAF9uH7uAccWfAAX_UP1GgPU919.png

testbench:
`timescale 1ns / 1ps

module cordic_ex_tb();

parameter CYC = 20;

reg clk;
reg [16-1:0] din;
reg din_vld;

wire signed [17-1:0] dout;
wire dout_vld;

cordic_ex#(.DIN_W(16),
.DOUT_W(16))
uut(
.clk (clk) ,
.din (din) ,//2Q13
.din_vld (din_vld) ,
.dout (dout) ,//2Q14
.dout_vld (dout_vld)
);

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

initial begin
#1;
din = 0;
din_vld = 0;
#(CYC*10);

din_vld = 1;
din = 16'b0001010000011011;//pi * 1/5
#(CYC*1);
din = 16'b1110011011011110;//-pi * 1/4
#5;
$stop;
end

endmodule

cordic_ex_tb

仿真结果:

仿真波形表明,计算结果与MATLAB浮点运算相近,满足一般计算需求。若想提高精度,可以增加CORDIC输出数据位宽。

参考文献:

1 ug479 7 Series DSP48E1 Slice User Guide.

2 Xilinx CORDIC算法(非常经典)_图文_百度文库 https://wenku.baidu.com/view/6c623aa8910ef12d2bf9e732.html

编辑:hfy


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • dsp
    dsp
    +关注

    关注

    544

    文章

    7680

    浏览量

    344324
  • FPGA
    +关注

    关注

    1602

    文章

    21302

    浏览量

    593109
  • Xilinx
    +关注

    关注

    70

    文章

    2119

    浏览量

    119361
  • 无线通信
    +关注

    关注

    56

    文章

    4193

    浏览量

    142293
收藏 人收藏

    评论

    相关推荐

    基于多速率DA的根升余弦滤波器的FPGA实现

    运算速度较慢。分布式算法(Distribute Arithmetic,DA)是另一种应用在FPGA中计算乘积和的算法。根据文献[2],分布式算法
    发表于 03-25 14:21

    运算放大器的工作原理和基本电路 使用运算放大器的电路设计

    ,其输出信号可以是输入信号加、减或微分、积分等数学运算的结果。由于早期应用于模拟计算机中用以实现数学运算,因而得名“运算放大器”。
    的头像 发表于 02-25 16:43 952次阅读
    <b class='flag-5'>运算</b>放大器的工作原理和基本电路 使用<b class='flag-5'>运算</b>放大器的电路设计

    运算放大器的工作原理和基本电路

    运算放大器(Operational Amplifier,简称“运放”)是一种具有极高放大倍数的电路单元,通常结合反馈网络共同组成某种功能模块。它的核心特性是,其输出信号可以是输入信号经过加、减、微分、积分等数学运算后的结果。由于早期主要被应用于模拟计算机中以
    的头像 发表于 02-06 11:36 2816次阅读
    <b class='flag-5'>运算</b>放大器的工作原理和基本电路

    浮点LMS算法FPGA实现

    运算运算步骤远比定点运算繁琐,运算速度慢且所需硬件资源大大增加,因此基于浮点运算的LMS算法
    的头像 发表于 12-21 16:40 292次阅读

    基于FPGA的线性插值-

    与调试等主要步骤。 考虑到本算法需要做多次的迭代运算,如果程序没有设计好,可能导致陷入死循环,导致无法输出的结果。此时就需要利用仿真测试查找逻辑上的问题。 FPGA通常可以通过编写测试
    发表于 11-23 23:09

    C语言中关于数学运算的相关知识

    数学运算的主要目的是进行数值计算,这其实可以衍生出很多应用,如模数/数模转换、数据处理、寻址、控制算法实现等。
    的头像 发表于 11-08 10:04 302次阅读
    C语言中关于<b class='flag-5'>数学运算</b>的相关知识

    MATLAB数学建模编程资料

    它已经成为世界上应用最广泛的数学软件之一,尤其在工程计算领域、高校应用最广。该软件以矩阵运算为基础,将计算、可视化、程序设计融合在简单易用的交互式环境。u3000u3000运用MATLAB可以
    发表于 09-22 08:19

    hash算法FPGA中的实现(1)

    FPGA的设计中,尤其是在通信领域,经常会遇到hash算法实现。hash算法FPGA的设计中,它主要包括2个部分,第一个就是如何选择一
    的头像 发表于 09-07 17:01 589次阅读
    hash<b class='flag-5'>算法</b>在<b class='flag-5'>FPGA</b>中的<b class='flag-5'>实现</b>(1)

    FPGA进行基本运算和特殊函数定点运算

    FPGA以擅长高速并行数据处理而闻名,从有线/无线通信到图像处理中各种DSP算法,再到现今火爆的AI应用,都离不开卷积、滤波、变换等基本的数学运算。但由于FPGA的硬件结构和开发特性使
    的头像 发表于 09-05 11:45 302次阅读

    如何使用Keil M4 DSP图书馆的基本数学功能帮助用户获得DSP高性能优势

    本数学功能,如矢量点产品、矢量倍增、矢量添加等。 在此示例,执行矢量操作有两种方法。 其中一种是使用 Keil M4 DSP 库进行矢量操作,其他则使用 C 函数。 与 C 函数相比, DSP 库
    发表于 08-22 06:53

    怎么用FPGA算法 如何在FPGA实现最大公约数算法

    FPGA算法是指在FPGA(现场可编程门阵列)上实现算法FPGA是一种可重构的硬件设备,可以
    的头像 发表于 08-16 14:31 1826次阅读
    怎么用<b class='flag-5'>FPGA</b>做<b class='flag-5'>算法</b> 如何在<b class='flag-5'>FPGA</b>上<b class='flag-5'>实现</b>最大公约数<b class='flag-5'>算法</b>

    fpga实现加法和减法运算的方法是什么

    FPGA实现加法和减法运算非常简单,实现乘法和除法可以用IP,那实现对数和指数运算该用什么呢?
    发表于 08-05 09:37 918次阅读
    <b class='flag-5'>fpga</b><b class='flag-5'>实现</b>加法和减法<b class='flag-5'>运算</b>的方法是什么

    利用FPGA进行基本运算及特殊函数定点运算

    的硬件结构和开发特性使得其对很多算法不友好,之前本人零散地总结和转载了些基本的数学运算在FPGA中的实现方式,今天做一个系统的总结归纳。 二、FPG
    的头像 发表于 07-19 14:25 1028次阅读
    利用<b class='flag-5'>FPGA</b>进行基本<b class='flag-5'>运算</b>及特殊函数定点<b class='flag-5'>运算</b>

    如何在FPGA中进行简单和复杂的数学运算

    由于FPGA可以对算法进行并行化,所以FPGA 非常适合在可编程逻辑中实现数学运算
    发表于 05-15 11:29 2266次阅读
    如何在<b class='flag-5'>FPGA</b>中进行简单和复杂的<b class='flag-5'>数学运算</b>?

    采用FPGA实现FFT算法示例

    用低、开发周期短、升级简单的特点。针对某OFDM系统中FFT运算的实际需要,提出了基于FPGA的设计来实现FFT算法,并以16位长数据,64点FFT为例,在QuartusⅡ软件上通
    的头像 发表于 05-11 15:31 1901次阅读
    采用<b class='flag-5'>FPGA</b><b class='flag-5'>实现</b>FFT<b class='flag-5'>算法</b>示例