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

  FPGA中的硬件逻辑与软件程序的区别,相信你们在作除法运算时会有深刻体会。若其中一个操做数为常数,可经过简单的移位与求和操做代替,但用硬件逻辑完成两变量间除法运算会占用较多的资源,电路结构复杂,且一般没法在一个时钟周期内完成。所以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将全部有符号数视为二进制补码形式,运算的结果一样为补码。再来看看除法器IP核配置界面。ide

   总共就两页,很是简单。须要重点关注的有三个地方:1 算法实现结构(algorithm type)2 被除数与除数的位宽 3 第二页flow control模式。现来一一说明:ui

  就算法结构来讲官方文档pg151 LogiCORE IP Product Guide中说得很详细:LUTMult结构操做数最好不要高于12bit,且充分利用DSP slice和BRAM以下降对FPGA 逻辑资源的消耗。Radix-2操做数不要超过16bit,且利用资源与LUTMulti相反,大量使用register和LUT从而将DSP slice和BRAM资源节省出来用在别的地方。最后一个High Radix结构支持超过16bit的大位宽操做数,利用DSPslice等专用硬件资源。根据本身的需求选择便可。spa

  位宽问题没什么好说的,须要特别注意保留位宽知足计算范围,也就是运算以前的“补码符号位扩展”。至于flow control 模式与接口和AXI总线有关。设计

  接口划分得十分清晰,被除数 除数和商通道以及必要的时钟和复位逻辑接口。每一个AXI总线通道老是包括tdata tuser tlast 和握手信号tvalid tready,其中tuser为附加信息,tlast表示流模式下最后一个数据,至关于数据包中的包尾处。数据传输仅在tvalid和tready同时拉高时有效并更新。blog

  而Non Blocking Mode在除法运算时较经常使用,一句话归纳:IP核接口不带有FIFO缓存,输出通道数据必须被下游模块实时处理。上图就明白了:接口

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

   整体来讲,在FPGA中作基本的数学运算没什么难度,即便是指数 对数 开根号之类的复杂运算也有浮点IP Core的支持。本人后续用到复杂算法时,会采用HLS方式开发,仅用于算法验证,欢迎关注。
开发

相关文章
相关标签/搜索