FPGA中的除法运算及初识AXI总线

  PGA中的硬件逻辑与软件程序的区别,相信大家在做除法运算时会有深入体会。若其中一个操作数为常数,可通过简单的移位与求和操作代替,但用硬件逻辑完成两变量间除法运算会占用较多的资源,电路结构复杂,且通常无法在一个时钟周期内完成。因此FPGA实现除法运算并不是一个“/”号可以解决的。

  好在此类基本运算均有免费的IP核使用,本人使用的VIVADO 2016.4开发环境提供的divider gen IP核均采用AXI总线接口,已经不再支持native接口。故做除法运算的重点从设计算法电路转变成了调用AXI总线IP核以及HDL中有符号数的表示问题,极大降低了开发难度。以下就上述两个方面进行探讨。

  VerilogHDL中默认数据类型为无符号数,因此需要数学运算的场合必须使用“signed”声明,如:reg signed [8-1:0] signal_a; wire signed [32-1:0] signal_b;需要注意一点,FPGA将所有有符号数视为二进制补码形式,运算的结果同样为补码。

   总是就两页,非常简单。需要重点关注的有三个地方:1算法实现结构(算法类型)2被除数与除数的位宽3第二页流控制模式。现在一一说明:

  就算法结构来说官方文档pg151 LogiCORE IP产品指南中说得很详细:LUTMult结构操作数最好不要高于12bit,且充分利用DSP slice和BRAM以降低FPGA逻辑资源的消耗.Radix-2操作数不要超过16bit,且利用资源与LUTMulti相反,大量使用寄存器和LUT从而将DSP片和BRAM资源节省出来用在别的地方。最后一个高级基数结构支持超过16bit的大位宽操作数,利用DSPslice等专用硬件资源。根据自己的需求选择即可。

  位置问题没什么好说的,需要特别注意保留位宽满足计算范围,也就是运算之前的“补码符号位扩展”。至于流量控制模式与接口和AXI总线有关。

  每个AXI总线通道总是包括tdata tuser tlast和握手信号tvalid tready,其中tuser为附加信息,tlast表示流程式下最后一个数据,相当于数据包中的包尾处。数据传输仅在tvalid和TREADY同时拉高时有效并更新。

  而非阻塞模式在除法运算时较常用,一句话概括:IP核接口不带有FIFO缓存,输出通道数据必须被下游模块实时处理。上图就明白了:

扫描二维码关注公众号,回复: 1729432 查看本文章

  这一模式实际上是对AXI总线的简化,很多场合下并不完全需要AXI总线强大的流控功能,特别是在AXI总线模块的上下游均为可进行实时处理的FPGA逻辑电路的情况下。 AXI总线的另一个特点就是数据打包,需要将不是8bit倍数位宽的数据高位填充从而确保数据最小单位是1byte,具体填充方式有所不同。很容易想到,这样的数据打包功能对SOC中PL与PS部分的交互是十分友好的。

猜你喜欢

转载自blog.csdn.net/qiuzhongweiwei/article/details/80270025