数字信号处理-04-FPGA常⽤运算模块-除法器
恐怖传说写在前⾯
本⽂是本系列的第四篇,本⽂主要介绍FPGA常⽤运算模块-除法器,xilinx提供了相关的IP以便于⽤户进⾏开发使⽤。
除法器
除法器⽣成器IP 创建了⼀个基于基数 2 ⾮恢复除法或具有预分频的⾼基数除法的整数除法电路。 Radix-2 算法利⽤ FPGA 逻辑来实现⼀系列吞吐量选项,包括单周期,⽽⾼基数算法在较低吞吐量下利⽤ DSP 切⽚,但通过重⽤来减少资源。
该IP符合 AXI4-Stream 的接⼝。操作数最⼤为 64 位宽的整数除法。提供Radix-2、LUTMult 和High Radix 实现算法以允许选择资源和延迟权衡。可选操作数宽度、同步控制和可选延迟。可选的除以零检测。
三种除法器实现⽅式
LUTMult
除数倒数的简单查找估计,后跟乘数。 由于倒数估计中需要偏差,因此仅⽀持余数输出类型。 如果⽤于创建⼩数输出,此偏差会引⼊偏移(错误)。 推荐⽤于⼩于或等于 12 位的操作数宽度。 此实现⽅式使⽤ DSP Slice、块 RAM 和少量 FPGA 逻辑原语(寄存器和LUT)。 对于可以使⽤ Radix2 或 LUTMult 选项的操作数宽度,由于使⽤了 DSP 和块 RAM 原语,LUTMult 解决⽅案提供了使⽤较少FPGA 逻辑资源的解决⽅案。
该实现⽅式特点如下:
提供了带有整数余数的商;
可以使⽤流⽔线并⾏架构以提⾼吞吐量;
可配置延迟;
2 到 17 位的分频宽度;
2 到 12 位的除数宽度(被除数宽度和除数宽度之和限制为 2
3 位);
独⽴的除数和除数位宽;
使⽤单个时钟的完全同步设计;
⽀持⽆符号或⼆进制补码有符号数。
Radix-2
使⽤整数操作数的基数 2 ⾮恢复整数除法,允许⽣成⼩数或整数余数。 对于⼩于 16 位左右的操作数宽度或需要⾼吞吐量的应⽤程序,建议使⽤该种实现⽅式。 实现使⽤ FPGA 逻辑原语(寄存器和 LUT)。Radix2 解决⽅案不使⽤ DSP 或块 RAM 原语,因此当其他地⽅需要这些原语时,建议使⽤此实现。
该实现⽅式特点如下:
提供整数或⼩数余数的商;
流⽔线并⾏架构以提⾼吞吐量;
减少流⽔线⼤⼩与吞吐量可选;
阳光下的阴影被除数宽度从 2 到 64 位;
除数宽度从 2 到 64 位;
独⽴的被除数、除数和⼩数位宽;
使⽤单个时钟的同步设计;
⽀持⽆符号数或⼆进制补码有符号数;
可以实现 1/X(倒数)功能。
High Radix
带有预缩放的⾼基数除法。 对于⼤于 16 位左右的操作数宽度,建议这样做。 此实现使⽤ DSP Slice 和 Block RAM。
该实现⽅式特点如下:
通过预缩放启⽤⾼基数除法;
提供可选的商和⼩数输出;
可配置宽度、同步控制、可选延迟和除以零检测;
使⽤ DSP Slices。
Divider Generator 内核使⽤三种实现中的⼀种。 LUTMult 推荐⽤于⾮常⼩的操作数宽度、⾼吞吐量以及必须最⼩化切⽚使⽤的情况。 对于较⼩的操作数宽度、⾼吞吐量或必须最⼩化 DSP 切⽚使⽤的情况,建议使⽤ Radix-2 解决⽅案。 对于较⼤的操作数宽度,建议使⽤⾼基数解决⽅案。
三种实现⽅式延迟对⽐
分频器内核的延迟是 AXI4-Stream 配置参数和所选算法延迟的函数。 当 AXI4-Stream 模式设置为⾮阻塞且核⼼算法和吞吐量设置为每个时钟周期输⼊⼀个样本时,延迟仅是⼀个常数。 如果选择了完整的 AXI4-Stream ⾏为。 这是因为 FIFO ⽤于管理此模式的数据,并且FIFO 的深度增加了延迟。
LUTMult
完全流⽔线化的 LUTMult 的延迟为 8。
Radix-2
完全流⽔线分频器的延迟(内核⽣成第⼀个有效输出之前所需的启⽤时钟周期数)是被除数位宽的函数。 如果需要⼩数输出,则完全流⽔线延迟也是⼩数位宽的函数。 ⼀般来说:
对于整数余数除法器,完全流⽔线延迟的数量级为 M,其中 M 是商的宽度。
对于分数余数除法器,完全流⽔线延迟的数量级为 M + F,其中 F 是分数输出的宽度。
下表提供了⽤于分频器选择的完全流⽔线延迟公式的列表。 通过完整的流⽔线,可以实现最⼤可能的性能。 当每格时钟数为 1 时,可以⼿动将延迟设置为介于 0 和表 2-1 中所⽰值之间的数字。 这允许以降低内核可以计时的最⼤时钟频率为代价来减少内核的延迟。 减少延迟会减少使⽤的寄存器数量,但 LUT 计数保持⼤致相同。
Signed Fractional Clocks Per Division Fully Pipelined Latency
FALSE FALSE1M+A+2
FALSE FALSE>1M+A+3
FALSE TRUE1M+F+A+2
FALSE TRUE>1M+F+A+3
TRUE FALSE1M+A+4
牛奶品牌
城市规划原理TRUE FALSE>1M+A+5
TRUE TRUE1M+F+A+4
TRUE TRUE>1M+F+A+5
M = 被除数和商宽度,F = ⼩数宽度,A = AXI 接⼝的总延迟。
High Radix
表中位宽范围为被除数和商宽度 + 分数宽度。
4 to 1213 to 2627 to 4041 to 545
5 to 6869 to 82
234567
4 to 1213 to 2627 to 4041 to 545
5 to 6869 to 82
表中⾏位宽范围为被除数和商宽度 + 分数宽度。
山东酒
Divisor Width 4 to 1213 to 2641 to 5427 to 4055 to 6869 to 82
4 to 8162029243337
9 to 18172130253438
19 to 32182231263539
33 to 35192332273640
36 to 48202433283741
49 to 52222635303943
53 to 54232736314044
三种实现⽅式吞吐量对⽐
LUTMult
此解决⽅案始终⽀持全吞吐量。
Radix-2
Clocks per Division 参数允许对吞吐量与资源进⾏⼀系列选择。当 Clocks per Division 设置为 1 时,内核是完全流⽔线化的,因此每个时钟周期的最⼤吞吐量为⼀个分频,但使⽤的资源最多。 Clock per Division 设置为 2、4 和 8,对于较⼩的内核尺⼨,这些相应的因素会降低吞吐量。AXI 接⼝为⾮阻塞提供 0 的额外延迟,⽆输出线程的阻塞为 1,输出线程为阻塞 (m_axis_dout_tready) 为 3。但是,当选择阻塞模式时,延迟会随运⾏时间⽽变化。
High Radix
迭代过程是作为循环来实现的,以减少资源。 这意味着必须推迟新输⼊,直到在迭代电路中完成先前的计算。 因此,最⼤可能的吞吐量是每个时钟 1/N 分频,其中 N 是所需的迭代次数。 然⽽,为了达到这个最⼤吞吐量,输⼊可能需要是突发的。 这是因为迭代引擎可以通过管道的每个阶段进⾏流⽔线化,为隔⾏分割提供⼀个轮播位置。
添加 AXI4-Stream 接⼝后,平均吞吐量保持不变。 阻塞模式为数据提供了 FIFO 缓冲元素,因此⽆法对内核何时准备好接受新数据进⾏确定性预测。 对于 NonBlocking 模式,时序更可预测。 Vivado ID
E 中的分频器⽣成器接⼝提供分频器以恒定间隔连续接受输⼊的速率(N 中的 1)的反馈。 这在接⼝的吞吐量字段上表⽰,并表⽰为每 N 个启⽤的时钟周期 1 个输⼊。
IP核图⽰及端⼝介绍
IP核图⽰如下图所⽰:
Signal I/O Optional Description aclk I No时钟ACLKEN I Yes⾼有效使能
ARESETn I Yes Active-Low 同步清零(可选,始终优先于 ACLKEN) ARESETn 应被置位或置位不少于两个 aclk 周
期。
s_axis_dividend_tvalid I No s_axis_dividend 通道的 tvalid。(被除数)s_axis_dividend_tready O Yes s_axis_dividend 通道的 tready。(被除数)s_axis_dividend_tdata I No s_axis_dividend 通道的 tdata。 (被除数)s_axis_dividend_tur I Yes s_axis_dividend 通道的 tur。(被除数)s_axis_dividend_tlast I Yes s_axis_dividend 通道的 tlast。(被除数)s_axis_divisor_tvalid I No s_axis_divisor 通道的 tvalid。(除数)
s_axis_divisor_tready O Yes s_axis_divisor 通道的 tready 。(除数)s_axis_divisor_tdata I No s_axis_divisor 通道的 tdata。 (除数)
s_axis_divisor_tur I Yes s_axis_divisor 通道的 tur。 (除数)
s_axis_divisor_tlast I Yes s_axis_divisor 通道的 tlast。(除数)
m_axis_dout_tvalid O No m_axis_dout 通道的 tvalid。(结果)
m_axis_dout_tready I Yes m_axis_dout 通道的 tready。(结果)
m_axis_dout_tdata O No m_axis_dout 通道的 tdata。(结果)
m_axis_dout_tur O Yes m_axis_dout 通道的 tur。(结果)
rtrimm_axis_dout_tlast O Yes m_axis_dout 通道的 tlast。(结果)
运算⽅式区别
LUTMult
此参数化解决⽅案将M位宽的变量除数除以N位宽的变量除数。输出由商和整数余数组成。除法的结果是M位宽的商和N位宽的整数余数。
被除数=商×除数+整数余数
当选择有符号运算时,所有操作数和结果都使⽤两个补号,但会导致结果的⼤⼩减少⼀位。
整数余数×2F−1
分数余数=除数
LUTMult解决⽅案⽀持可选的零除输出。对于除零,商和余数结果是未定义的。LUTMult解决⽅案始终⽀持全吞吐量(每个时钟周期⼀个结果)。延迟可以配置为完全流⽔线所需的最⼤值(超过该值,进⼀步的寄存器将⽆法提⾼性能)。由于LUTMult解使⽤倒数的常数有限精度估计乘以被除数,从⽽获得结果,因此除数的最⼤宽度是被除数宽度的函数。操作数宽度之和限制为23位。就商和余数的符号⽽
⾔,LUTMult解决⽅案以与Radix2解决⽅案相同的⽅式处理负操作数。
Radix-2
此参数化解决⽅案将M位宽的变量除数除以N位宽的变量除数。输出由商和整数余数或分数结果(商继续超过⼆进制点)组成。在整数余数情况下,除法的结果是商的M位宽字段和整数余数的N位宽字段。对于带整数余数的有符号模式,商和余数的正负也对应于下式。
被除数=商×除数+整数余数
在分数情况下,结果是商的M位宽字段,结果的分数部分为F位宽字段。
整数余数×2F
分数余数=除数
当选择有符号运算时,所有操作数和结果都使⽤⼀个2补符号位,从⽽使结果的⼤⼩减少⼀位。
deal成交
中国最低工资标准整数余数×2F−1
分数余数=除数
对于带分数输出的带符号模式,在商和分数字段中都有符号位。对于除零,商、余数和分数结果未定义。IP是⾼度流⽔化的。核⼼的吞吐量是可配置的,可以从每个分区1个时钟周期减少到每个分区2、4或8个时钟周期,以减少资源。可以独⽴设置被除数和除数的位宽度。商的位宽度等于被除数的位宽度。整数余数的位宽度等于除数的宽度。对于分数输出,余数位宽度与被除数和除数⽆关。核⼼处理2到64位的数据范围,⽤于被除数、除数和分数输出。
除法器可⽤于实现X的倒数;这就是1/X函数。为此,将被除数位宽度设置为2,并选择分数模式。然后,对于⽆符号或有符号运算,被除数输⼊都绑定到01,并且X值通过除数输⼊提供。上电复位或ARESETn后,IP的输出商和分数的零,直到出现新结果。
High Radix Solution
⾼基数实现在采⽤加速⾼基数除法算法之前,通过预缩放操作数执⾏除法。该设计是完全流⽔线的最⼤时钟频率。⾸先,对除数进⾏归⼀化,然后对其倒数进⾏估计。两个操作数都乘以此估计值,使除
数更接近1。预刻度的精度和精确度决定了在每次后续迭代中可以解析的商位数。预缩放除数接近于1的事实允许新商位的估计正好是上⼀次迭代剩余的顶部位。迭代操作本⾝以进位保存表⽰法执⾏,因此没有长进位链限制性能。由于只使⽤剩余的顶部位作为估计值,且除数不完全为1,因此每次迭代的内部结果中都会出现错误;因此,在每次迭代中解析的商位与先前解析的位略微重叠,以允许在后续迭代中校正错误。
由于迭代计算由进位-保存乘法和减法组成,因此它⾮常适合于DSP(乘法-加法)切⽚,从⽽提供⾼效、低延迟的迭代。
协议描述