十二 · 2021年11月02日

SpinalHDL—小练习(三)

本系列适合新手在对Scala及SpinalHDL有初步了解后做练手使用。

题目

参数化模块设计,输入一组信号(位宽相同8bit,信号个数不定,由参数指定),前一半信号寄存器按位取反输出,后一半信号寄存器加1输出。

实现

import spinal.core._
case class example3(sigNum:Int) extends Component{
  val io=new Bundle{
    val dataInVec=in Vec(UInt(8 bits),sigNum)
    val dataOutVec=out Vec(UInt(8 bits),sigNum)
  }
  val _=new Area{
    for(index<-0 until sigNum){
      if(index<sigNum/2)
        io.dataOutVec(index):= ~io.dataInVec(index)
      else
        io.dataOutVec(index):=io.dataInVec(index)+1
    }
  }
}
object example3App extends App{
  SpinalSystemVerilog(example3(256))
}

Key:

  • Vec类型的使用。
  • for、if else的使用。

进阶

输入端口数据类型为无符号数,转换为有符号数处理,前一半若小于0,则取绝对值+1,否则减1.后一半若小于0,则加1,否则+2。

case class example3_1(sigNum:Int) extends Component{
  val io=new Bundle{
    val dataInVec=in Vec(UInt(8 bits),sigNum)
    val dataOutVec=out Vec(UInt(8 bits),sigNum)
  }
  val _=new Area{
    for(index<-0 until sigNum){
      if(index<sigNum/2){
        when(io.dataInVec(index).msb){
          io.dataOutVec(index):=io.dataInVec(index).asSInt.abs+1
        }otherwise{
          io.dataOutVec(index):=io.dataInVec(index)-1
        }
      } else {
        when(io.dataInVec(index).msb){
          io.dataOutVec(index):=io.dataInVec(index)+1
        }otherwise {
          io.dataOutVec(index):=io.dataInVec(index)+2
        }
      }
    }
  }
}

Key:

if为scala中的语法,可用于辅助电路描述(类似脚本的功能),而when则为SpinalHDL中的概念,用于描述电路。

END

作者:玉骐
原文链接:https://mp.weixin.qq.com/s/lb0GO1Wq0iK0qMR8PRxMRQ
微信公众号:
 title=

推荐阅读

更多SpinalHDL技术干货请关注Spinal FPGA专栏。
推荐阅读
关注数
1581
内容数
133
用SpinalHDL提升生产力
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息