verilog实现大位宽加减法
0 2023-03-22

使用FPGA进行算法处理时加减乘除是非常普遍的操作。

正常的加减处理直接使用+ -符号即可,但是对于有符号数的加减要注意位宽的扩展,如下图,计算a+b时首先要对a,b进行位宽扩展,一般原则是每两个数据的累加扩1位。比如2数据累加扩1bit,四个数据累加扩2bit,以此类推。

但是随着数据位宽的不断增加,较大位宽的加法在高速场景中的时序收敛是非常难的,因此要对大位宽的加法进行优化,优化思路就是FPGA通用的原则:用面积换速度,插入流水线。

代码如下,代码中将大位宽的信号分为两半,分别做减法后打一拍,然后拼接为最终的输出结果,其将大位宽的加法划分为两个小位宽的加法。
















































// ============================================================// File Name: cm_add// VERSION  : V1.0// DATA     : 2022/9/28// Author   : FPGA干货分享// ============================================================// 功能:大位宽累加器 // delay 2clk// ============================================================ `timescale 1ns/1psmodule cm_add #( parameter           C_DATA_WITH     = 32 ) //  ( input  wire                     i_sys_clk    , // 输入时钟 input  wire [C_DATA_WITH-1:0]   i_data_ina   , // 输入信号 input  wire [C_DATA_WITH-1:0]   i_data_inb   , // 输入信号 output reg  [C_DATA_WITH  :0]   o_data_out   );// 输出信号位宽加1 // ============================================================// 内部参数// ============================================================localparam  C_DATA_WITH_HALF    = C_DATA_WITH/2 ;// ============================================================// 变量// ============================================================reg  [C_DATA_WITH_HALF:0]                s_add_pre1   ;reg  [C_DATA_WITH:C_DATA_WITH_HALF]      s_add_pre2   ;wire [C_DATA_WITH:C_DATA_WITH_HALF]      s_add_pre2_d ;// ============================================================// main code// ============================================================ always @(posedge i_sys_clk) begin s_add_pre1 <= {1'b0,i_data_ina[C_DATA_WITH_HALF-1:0]} + {1'b0,i_data_inb[C_DATA_WITH_HALF-1:0]}; s_add_pre2 <= {i_data_ina[C_DATA_WITH-1],i_data_ina[C_DATA_WITH-1:C_DATA_WITH_HALF]} + {i_data_inb[C_DATA_WITH-1],i_data_inb[C_DATA_WITH-1:C_DATA_WITH_HALF]} ; end  assign s_add_pre2_d = s_add_pre2 + s_add_pre1[C_DATA_WITH_HALF]; always @(posedge i_sys_clk) o_data_out <= {s_add_pre2_d,s_add_pre1[C_DATA_WITH_HALF-1:0]};  endmodule

实现如下:

对于更大位宽的加法,可以将其拆分为更多个小位宽的加法,思路不变。

由于数据使用补码的原因,FPGA减法的操作与加法相同,注意数据位宽扩展防止溢出即可。



声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 【直播】是德科技前沿技术交流会


  • 相关技术文库
  • FPGA
  • 可编程
  • PLC
  • verilog
  • 时钟发生器的相位噪声和抖动性能

    系统设计师通常侧重于为应用选择最合适的数据转换器,在向数据转换器提供输入的时钟发生器件的选择上往往少有考虑。然而,如果不慎重考虑时钟发生器的相位噪声和抖动性能,

    06-02
  • 雷达信号处理上是选FPGA还是GPU,它们各自的特点又是什么?

      FPGA和CPU一直是雷达信号处理不可分割的组成部分。传统上FPGA用于前端处理,CPU用于后端处理。随着雷达系统的处理能力越来越强,越来越复杂,对信息处理

    05-29
  • PLC的相关知识分析

    写点纯理论的东西,最近一直在思考怎么跟零基础的人讲PLC。也就是当你面对一个门外汉时,怎么让他对PLC感兴趣,然后慢慢的带着学习PLC。思考了很多,又把学校的里

    05-27
  • 一文分析DDR线长匹配与时序

    DDR布线在PCB设计中占有举足轻重的地位,设计成功的关键就是要保证系统有充足的时序裕量。要保证系统的时序,线长匹配又是一个重要的环节。我们来回顾一下,DDR布

    05-27
  • 带你区分时序图、活动图、状态图、协作图

      时序图  时序图用于描述对象之间的传递消息的时间顺序,即用例中的行为顺序。  当执行一个用例时,时序图中的每条消息对应了一个类操作或者引起转换的触发事件。 

    05-26
  • 区分FPGA与DSP特点及用途

      FPGA是一种可编程的硅芯片,DSP是数字信号处理,当系统设计人员在项目的架构设计阶段就面临到底采用FPGA还是DSP的重要问题。本文将首先分别介绍FPGA

    05-26
  • FPGA概念对比CPU架构有啥特点

      你还没听过FPGA?那你一定是好久没有更新自己在企业级IT领域的知识了。今天笔者就和大家聊聊何为FPGA?FPGA主要应用场景是什么?有人说FPGA是替代传

    05-26
  • 时序收敛十大准则

    本文摘自《Vivado使用误区与进阶》,作者为Xilinx工具与方法学应用专家Ally Zhou。 时序收

    05-26
  • 仿真软件ModelSim及其应用

    如果您是FPGA开发方面的初学者,那么这个教程一定能够帮助你在仿真技术上越过新人的台阶;如果您是FPGA开发的老手,这篇文档也并非对您没有帮助,您可以把教程发给其他刚入门的同事,免去您亲自上阵指导的麻烦,把主要的精力放在更有价值的地方。

    05-25
  • 快速认识FPGA

      学习FPGA,在不同层次的人明显有不同的答案。先说一句,说不要开发版的都是菜鸟级选手。  我把FPGA层次划分为,鸡蛋级别,菜鸟级别,老鸟级别,高手级别四类

    05-25
  • 分析FPGA与CPLD的差别在哪

      1.CPLD  CPLD主要是由可编程逻辑宏单元(LMC,LogicMacroCell)围绕中心的可编程互连矩阵单元组成,其中LMC逻辑结构较复杂,并具有复

    05-25
  • FPGA与CPLD的作用及不同之处

      FPGA/CPLD能完成任何数字器件的功能,上至高性能CPU,下至简单的74电路,都可以用FPGA/CPLD来实现。  FPGA/CPLD如同一张白纸或是一

    05-24
下载排行榜
更多
广告