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

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

3天内不再提示

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

FPGA设计论坛 来源:未知 2023-07-19 14:25 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

wKgaomToD9qAYZlLAAADFPiCFw8514.pngwKgaomToD9qAdcLCAAAAuFYhST8844.png

点击上方蓝字关注我们

wKgaomToD9qAeOjPAAAC9hV8I20530.png

一、前言

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

二、FPGA中的加减乘除

1.硬件资源

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

wKgaomToD9qAQtK4AAAsQOBKNvM985.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 <<4  A*20 = A<<4 + A<<2.  A除以2 = 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分为旋转模式和矢量模式,配合圆周坐标、线性坐标和双曲线坐标会有六种组合,具体见下表:

wKgaomToD9qAQAwJAALgSKHryco670.png

从表中发现,基本的乘

wKgaomToD9qAJl5xAAFcD_RjxdU100.png

除法、三角函数、反三角函数、双曲函数、反双曲函数、开根号都能够直接求得,那其他函数怎么办?

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

四、CORDIC计算e^x Demo

1. 算法仿真分析

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

wKgaomToD9uAMmZLAAFF-6ZmYDg769.png

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

wKgaomToD9uAR5UmAADEaSP8HHM443.png

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

2. CORDIC IP核

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

wKgaomToD9uAftduAAEMutKZ7eI359.png

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

wKgaomToD9uAD8hwAACNA7RHLJU174.png

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

wKgaomToD9uAY256AADbDvWlbBs309.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 <1Q14+1Q14 = 2Q14>
always @(posedge clk)begin
dout <= sinh + cosh;
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 <= 1'b1;
end
else
dout_vld <= 0;
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产生两组数据,并将角度值定点化后作为设计模块数据激励:

wKgaomToD9uAGEjaAAI96Vno27o189.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

仿真结果:

wKgaomToD9uASCbRAAChLlKdHqQ793.png

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

wKgaomToD9uAW6dsAAAJM7aZU1A388.png

有你想看的精彩 至芯科技-FPGA就业培训来袭!你的选择开启你的高薪之路!7月12号北京中心开课、欢迎咨询! 如何在FPGA中实现状态机 基于FPGA的电子按键密码锁设计

wKgaomToD9yAQ4akAABUdafP6GM141.jpg

扫码加微信邀请您加入FPGA学习交流群

wKgaomToD9yABZesAAACXWrmhKE308.png

欢迎加入至芯科技FPGA微信学习交流群,这里有一群优秀的FPGA工程师、学生、老师、这里FPGA技术交流学习氛围浓厚、相互分享、相互帮助、叫上小伙伴一起加入吧!

点个在看你最好看


原文标题:利用FPGA进行基本运算及特殊函数定点运算

文章出处:【微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。


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

    关注

    1664

    文章

    22509

    浏览量

    639541

原文标题:利用FPGA进行基本运算及特殊函数定点运算

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【乾芯QXS320F开发板试用】乾芯QXS320F开发板IQMath数学库功能试用报告

    摘要 本报告重点评估乾芯QXS320F开发板所提供的IQMath定点数学库的性能与易用性。通过具体的数学运算示例,验证了该库在定点数表示、三角函数计算等方面的准确性和高效性,展现了其在
    发表于 01-08 09:02

    定点运算案例的程序

    定点运算(Fixed-Poin Arithmetic)在某些嵌入式系统中,浮点运算会较慢或不被支持。因此,使用固定点运算可以提供一种有
    发表于 12-12 06:35

    详解FPGA定点数计算方法

    FPGA定点数计算在高效资源利用运算速度优势、硬件可预测性和成本效益等方面发挥着重要作用。它能节省逻辑和存储资源,实现更快速的运算和更高的
    的头像 发表于 12-02 10:09 712次阅读
    详解<b class='flag-5'>FPGA</b><b class='flag-5'>定点</b>数计算方法

    C语言宏拼接运算符典型使用

    在C语言中,##运算符(称为[size=16.002px]标记拼接运算符)用于宏定义中将两个标记(token)拼接成一个新的标记。它在预处理阶段处理,常用于动态生成变量名、函数名或类型名,以提高代码
    发表于 11-20 08:27

    定点数表示实数的方法以及定点数在硬件上的运算验证

    定点数要长许多。 相比之下,在数值范围较小(相对于浮点数)、精度要求不那么高的运算中,可以利用定点数加速运算。 Q4精度小数
    发表于 10-28 08:13

    卷积运算分析

    卷积运算的基础运算是乘加运算(MAC,Multiplication and Accumulation),本文设计了基本运算单元PE模块来实现MAC
    发表于 10-28 07:31

    蜂鸟内核模块浮点指令运算数据的获取

    函数内部,发现例化后通过rf_r进行输出。 在exu_regfile中,将不同索引的浮点寄存器值赋给read_src1_dat 然后在e203_exu文件中又将其与rf_rs1相接,将
    发表于 10-24 13:39

    浮点数是如何实现开平方运算

    摘要: 本文主要描述浮点数是如何实现开平方运算的。 简介 事实上,浮点数的开平方运算结构与定点数甚至整数的开平方运算结构是十分相似的,我们可以在对
    发表于 10-24 08:42

    Verilog实现使用Booth编码和Wallace树的定点补码乘法器原理

    周期乘法器。乘法器,对于无符号乘法进行一位符号扩展后统一当作有符号数进行运算,因此需要17个迭代周期。为了改良乘法器性能,我们可以使用Booth编码和Wallace树的定点补码乘法器,该乘法器生成
    发表于 10-23 08:01

    浮点运算单元的设计和优化

    普通的加减交替法,同样对于无符号乘法进行一位符号扩展后统一当作有符号数进行运算,最终得到完全准确的除法结果,总共最多需要36个时钟周期。 4.浮点指令扩展:计划先完成单精度浮点指令集(F)的拓展,可以
    发表于 10-22 07:04

    使用Simulink自动生成浮点运算HDL代码(Part 1)

    引言 想要实现浮点运算功能,如果自己写Verilog代码,需要花费较多的时间和精力。好在Simulink HDL Coder工具箱提供了自动代码生成技术。下图展示了HDL Coder如何生成浮点运算
    发表于 10-22 06:48

    优化boot4的乘法运算周期

    优化电路设计:在电路设计中,优化关键路径和信号传输路线,使用更高速的逻辑单元和存储器元件来降低延迟,从而缩短乘法器的运算周期。 利用流水线技术:使用流水线技术将乘法操作分成多个阶段,使每个阶段的操作
    发表于 10-21 13:17

    定点小数运算

    许多 MCU 芯片只支持整数运算,如果要在这些芯片上进行小数运算,定点运算应该是最佳选择了;此外即使芯片支持浮点数,
    发表于 07-25 14:02

    功率分析仪运算原理 什么是同步源?有功功率运算

    横河功率分析仪的通用运算原理则是首先检测出指定信号的周期,并将检测周期的整数倍时间设为测量区间,随后对这段时间内采集到的数据进行平均运算,这一测量方式也被称为“同步源周期平均法”,其中用于定义测量周期的输入信号被称为同步源。
    的头像 发表于 06-30 15:30 1751次阅读
    功率分析仪<b class='flag-5'>运算</b>原理 什么是同步源?有功功率<b class='flag-5'>运算</b>

    FPGA定点和浮点数学运算实例对比

    在创建 RTL 示例时,经常使用 VHDL 2008 附带的 VHDL 包。它提供了出色的功能,可以高效地处理定点数,当然,它们也是可综合的。该包的一些优点包括:
    的头像 发表于 06-23 09:53 1176次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>定点</b>和浮点数学<b class='flag-5'>运算</b>实例对比