当前位置:网站首页>吃透Chisel语言.06.Chisel基础(三)——寄存器和计数器
吃透Chisel语言.06.Chisel基础(三)——寄存器和计数器
2022-07-04 12:49:00 【github-3rr0r】
Chisel基础(三)——寄存器和计数器
Chisel基础的上一部分我们介绍了Chisel中的运算符和组合逻辑,但是要构造复杂的数字逻辑电路,光有组合电路是不够的,因为组合电路是没有状态信息的。这一部分就介绍用于描述数字电路状态信息的基本组件,也就是大家耳熟能详的寄存器(Register)。介绍完寄存器和寄存器上的操作之后,我们将会用寄存器实现一个计数器。
寄存器
Chisel中提供了寄存器组件,本质是D-触发器(D flip-flops)的集合,D-触发器的概念属于数字逻辑电路的范畴,在此不展开讲述,我们将其抽象为寄存器即可。
Chisel中的寄存器隐式地连接到全局时钟,并在每个时钟的上升沿更新寄存器的值。
在寄存器声明时提供一个初始化值时,寄存器会使用连接到全局复位信号的同步复位信号。
寄存器中存放的值可以是能够表示为位的集合的任意Chisel类型,下面的代码就定义了一个位宽为8的寄存器,复位时会初始化为0:
val reg = RegInit(0.U(8.W))
输入使用更新操作符:=
连接到寄存器,而寄存器的输出可以用寄存器名直接引用,用在表达式中:
reg := d
val q = reg
上面三行代码定义的寄存器电路如下图所示,包括一个隐式的时钟信号clock
、一个初始化寄存器为0.U
的隐式同步复位信号reset
、输入信号d
和输出信号q
,全局信号global
和reset
都是隐式连接到每个寄存器的:
寄存器也可以用RegNext()
来定义,参数分别为它的输入和一个作为初始值的常数:
val bothReg = RegNext(d, 0.U)
为了在写代码的时候区分组合逻辑和寄存器的信号,通常在命名的时候会给寄存器后面加上后缀Reg
。另一种常见的方法,常用于Java和Scala,就是使用camelCase(驼峰命名法),用多个单词来作为标识符。在这种方式中,函数和变量都是小写开头,而类(类型),比如模块名,就使用大写开头。
Chisel中的命名相对自由,不过最好用好看又有描述性的命名。还有要注意的是,Scala和Chisel中的关键字不能作为命名。而关于Chisel的编码规范,后面会专门写一篇文章。
Chisel中用寄存器和Mux实现计数器
计数器是数字系统中很基础的组件,比如性能计数器、程序计数器等。我们可能会用寄存器记录事件发生的次数,但更多的情况是用于定义一个时间间隔。也就是计数器记录时钟周期数,在达到一定数目的时候(经过这个时间间隔时)触发一个操作。
简单的方法就是计数器计数到某个上限值就复位。要注意的是,计算机科学和数字设计里面,计数都是从0开始的,所以如果想计数到10,那就是从0数到9。
下面的代码就实现了一个计数器,最多计数到9,然后再重新从0计数到9:
val cntReg = RegInit(0.U(8.W))
cntReg := Mux(cntReg === 9.U, 0.U, cntReg + 1.U)
当然了,Chisel标准组件中是有计数器Counter
的,这个我们后面再说!
虽然说Chisel会为信号和寄存器推断需要的位宽,但是最好还是在创建硬件对象的时候指定想要的位宽。在大多数场合,给寄存器一个已知的复位初始化值也是最好的:
val reg = RegInit(0.S(8.W))
如果不给定初始化值,让寄存器值在复位时是未定义的,可能会节省一条复位加载线网,但是在测试和验证的时候如果已知复位值会容易很多。
结语
关于寄存器的内容并不多,但寄存器是有状态信息的模块,还隐式引入了时钟,因此是时序电路的基础。那么组合电路有了,时序电路也有了,理论上就可以为所欲为实现任何我们想实现的数字电路了,实现一个处理器也自然不在话下。下一节我们会对Chisel中的Bundle
和Vec
进行介绍,这是上节挖的坑,而这两个结构可以为我们编写代码带来超多的便利!
边栏推荐
- mac redis安装与使用,连接远程服务器 redis
- Secretary of Homeland Security of the United States: domestic violent extremism is one of the biggest terrorist threats facing the United States at present
- 吃透Chisel语言.05.Chisel基础(二)——组合电路与运算符
- 1200. Minimum absolute difference
- Huahao Zhongtian sprint Technology Innovation Board: perte annuelle de 280 millions de RMB, projet de collecte de fonds de 1,5 milliard de Beida Pharmaceutical est actionnaire
- JVM series - stack and heap, method area day1-2
- 2022危险化学品经营单位主要负责人练习题及模拟考试
- 学习项目是自己找的,成长机会是自己创造的
- XML入门一
- C foundation in-depth learning II
猜你喜欢
Dgraph: large scale dynamic graph dataset
博士申请 | 西湖大学学习与推理系统实验室招收博后/博士/研究实习等
MySQL 5 installation and modification free
2022 Shandong Province safety officer C certificate examination question bank and online simulation examination
逆向调试入门-PE结构-资源表07/07
Huahao Zhongtian sprint Technology Innovation Board: perte annuelle de 280 millions de RMB, projet de collecte de fonds de 1,5 milliard de Beida Pharmaceutical est actionnaire
结合案例:Flink框架中的最底层API(ProcessFunction)用法
面试官:Redis中哈希数据类型的内部实现方式是什么?
One of the solutions for unity not recognizing riders
小程序直播 + 电商,想做新零售电商就用它吧!
随机推荐
FS7867S是一款应用于数字系统供电电源电压监控的电压检测芯片
学习项目是自己找的,成长机会是自己创造的
硬件基础知识-二极管基础
Introduction to XML II
Interviewer: what is the internal implementation of hash data type in redis?
做事的真正意义和目的,真正想得到什么
Applet live + e-commerce, if you want to be a new retail e-commerce, use it!
2022KDD预讲 | 11位一作学者带你提前解锁优秀论文
1200. 最小绝对差
1200. Minimum absolute difference
2022危险化学品经营单位主要负责人练习题及模拟考试
Introduction to XML I
高质量软件架构的唯一核心指标
美国土安全部部长警告移民“不要踏上危险的旅程”
逆向调试入门-PE结构-资源表07/07
Node の MongoDB安装
结合案例:Flink框架中的最底层API(ProcessFunction)用法
One of the solutions for unity not recognizing riders
CommVault cooperates with Oracle to provide metallic data management as a service on Oracle cloud
易周金融 | Q1保险行业活跃人数8688.67万人 19家支付机构牌照被注销