https://mp.weixin.qq.com/s/X5EStKor2DU0-vS_wIO-fg

 
四位加法器。通过FullAdder级联实现。
 
参考链接:
https://github.com/ucb-bar/chisel-tutorial/blob/release/src/main/scala/examples/Adder4.scala
 
1. 引入Chisel3
 
 
2. 继承自Module类
 
 
3. 定义输入输出接口
 
创建输入和输出接口;
 
这些接口都是无符号整型数:val A = Input(UInt(4.W))
a. 使用4.W表示位宽为4位;
b. 使用UInt创建无符号整型数;
c. 使用Input/Output表示接口方向;
d. val 关键字表明定义的变量是所属匿名Bundle子类的数据成员;
 
4. 内部连接
 
创建4个全加器,并与输入和输出接口相连。
 
最终的和(Sum)由4个全加器的和组合而成:
 
val s0 = Adder0.io.sum
val s1 = Cat(Adder1.io.sum, s0)
val s2 = Cat(Adder2.io.sum, s1)
io.Sum := Cat(Adder3.io.sum, s2).asUInt
 
这里为什么使用组合呢?
 
还有其他两种写法:
a. 直接连接io.Sum的每一位:
io.Sum(0) := Adder0.io.sum
io.Sum(1) := Adder1.io.sum
io.Sum(2) := Adder2.io.sum
io.Sum(3) := Adder3.io.sum
 
这种写法会报异常:对io.Sum(0)会调用:
返回的并不是Sum的第0位,而是新建的已经做了ReadOnlyBinding的Bool()。
 
由此可见,当前UInt的位选择(bit-select)只能作为“:=”符号的右值(而不能作为左值),即只能作为“:=”方法的参数。
 
b. 到最后统一组合一次:
io.Sum := Cat(Adder3.io.sum, Adder2.io.sum, Adder1.io.sum, Adder0.io.sum).asUInt()
 
这样做是可以的,我认为这种写法更好。只是生成的Verilog不如人意:
生成了三个组合,而不是直接一个组合。
 
5. 生成Verilog
 
 
可以直接点运行符号运行。
 
也可以使用sbt shell执行:
 
生成Verilog如下:
 
6. 测试
 
参考链接:
 
 
 
7. 附录
 
Adder4.scala:

import chisel3._
import chisel3.util._ //A 4-bit adder with carry in and carry out
class Adder4 extends Module {
val io = IO(new Bundle {
val A = Input(UInt(4.W))
val B = Input(UInt(4.W))
val Cin = Input(UInt(1.W))
val Sum = Output(UInt(4.W))
val Cout = Output(UInt(1.W))
})
//Adder for bit 0
val Adder0 = Module(new FullAdder())
Adder0.io.a := io.A(0)
Adder0.io.b := io.B(0)
Adder0.io.cin := io.Cin
// val s0 = Adder0.io.sum
//Adder for bit 1
val Adder1 = Module(new FullAdder())
Adder1.io.a := io.A(1)
Adder1.io.b := io.B(1)
Adder1.io.cin := Adder0.io.cout
// val s1 = Cat(Adder1.io.sum, s0)
//Adder for bit 2
val Adder2 = Module(new FullAdder())
Adder2.io.a := io.A(2)
Adder2.io.b := io.B(2)
Adder2.io.cin := Adder1.io.cout
// val s2 = Cat(Adder2.io.sum, s1)
//Adder for bit 3
val Adder3 = Module(new FullAdder())
Adder3.io.a := io.A(3)
Adder3.io.b := io.B(3)
Adder3.io.cin := Adder2.io.cout
// io.Sum := Cat(Adder3.io.sum, s2).asUInt
io.Sum := Cat(Adder3.io.sum, Adder2.io.sum, Adder1.io.sum, Adder0.io.sum)
io.Cout := Adder3.io.cout
} object Adder4Main {
def main(args: Array[String]): Unit = {
chisel3.Driver.execute(Array("--target-dir", "generated/Adder4"), () => new Adder4)
// chisel3.Driver.execute(args, () => new FullAdder)
}
}
 

最新文章

  1. arm工作模式笔记
  2. android-详解Android 6.0运行时权限
  3. React生命周期浅析
  4. OC中控制台日志打印
  5. 加密解密(11)HMAC-在sha1,md5基础上加密
  6. 【转】 iOS-Core-Animation-Advanced-Techniques(七)
  7. tomact虚拟目录,虚拟主机,http请求头,相应头
  8. android进度条
  9. PHP中将内容循环出来
  10. Servlet--传参和接参
  11. Java集合之Hashtable
  12. linux下64位汇编的系统调用(3)
  13. 小程序坑之 swiper组件
  14. JAVA实现Word(doc)文件读写
  15. 初识mysql数据库
  16. SPOJ SUBLEX Lexicographical Substring Search - 后缀数组
  17. Centos7使用yum安装程序软件时提示未找到安装包解决方法
  18. zookeeper超时:Unable to connect to zookeeper server within timeout: 5000
  19. C# zedgraph利用另一窗口取得的串口数据绘图
  20. CREATE DATABASE failed

热门文章

  1. 简单谈谈Spring的IoC
  2. 【Spark】通过创建DataFrame读取不同类型文件内容
  3. 选择函数index_select
  4. RESTful设计中的常见疑问
  5. 基于Memcached的Nginx服务器集群session共享
  6. Angular 初体验
  7. 一个排查了大半天儿的问题,差点又让 MyBatis 背锅
  8. HttpServletRequest与HttpServletResponse
  9. PAT 1007 Maximum Subsequence Sum (25分)
  10. html,body设置高度100%后底部有空白的bug