本系列适合新手在对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
微信公众号:
推荐阅读
更多SpinalHDL技术干货请关注Spinal FPGA专栏。