20201210 SpinalHDL实现输入数量可变的加法树ip

本文介绍使用SpinalHDL实现加法树的过程。SpinalHDL是一种基于Scala的硬件描述语言,它利用Scala的面向对象特性提高设计效率。文章详细展示了如何使用递归实现加法树,并自动生成Verilog代码。

最近在学习SpinalHDL,这是一门基于Scala的硬件描述语言,粒度与Verilog/VHDL相当,但是利用了scala的许多面向对象特性以及高级抽象语言的特性,可以大大提高数字IC前端设计的效率。

由于项目需要,决定从一个最简单的加法树结构入手,练习SpinalHDL。

一个典型八输入加法树的结构如下:
八输入加法器结构示意
通过观察可以知道,加法树是通过将输入两两相加得到中间部分和,再将部分和两两相加,直至获得最终输出。这在verilog中的实现不难,只需要定义一些存放中间部分和的信号,再写一些两两相加的逻辑即可。
但是,spinalHDL在这个例子中展现了一个非常不错的地方,即它可以使用高级抽象语言的一些特性,比如递归来实现加法树(加法树的树形结构非常适合用递归来做),且其对数据位宽的自动推断使得无需考虑的中间部分和信号位宽,代码如下:

package mylib
import spinal.core._

//inputNum为参数,代表加法树输入数据个数
class addtree (inputNum: Int) extends Component {
   
   
  require(isPow2(inputNum))		//本代码只支持inputNum为2的幂次情况,实际上任意数量实现也不难
  val tree_stage = log2Up(inputNum) //加法树级数
  val io = new Bundle{
   
   
    val ppen = in Bool
    val data_in = in Vec(SInt(32 bits),inputNum)  //使用Vec类型实现可变数量的port
    val sum_out = out(Reg(SInt(32+tree_stage bits)))
  }
  //函数式编程思想
  def tree(op: Vec[SInt]): Vec[SInt] = {
   
   
    val n = op.length
    if(n == 1) op
    else {
   
   
      val psum = Vec((SInt),n/2)
      for(i <- 0 until n/2){
   
   
        psum(i) :<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值