jchdl Module类在概念上对应Verilog的module,作为所有用户自定义模块的父类。
所有用户创建的节点,必须继承Module类。Module为用户创建模块提供了很多支持方法,但把logic()方法留给子类自行定义。
 
如同Verilog一样,Module的logic()中,只包含Assign和Always这两种块的构建。
 
一. 类结构
 
 
主要属性
  1. parent: 父模块;
  1. children:子模块;
  1. blocks:包含的Assign和Always Block;
 
主要方法
  1. 构造方法
Module(Module parent): 声明本模块的父模块,并把本模块作为父模块的子模块。如此即可构建模块层次结构(hierarchy)。
用户自定义模块的构造方法,需要把parent参数作为第一个参数,并调用这个构造方法(参考下面实例)。
 
  1. 模块构建方法: construct()
当前实现比较简单,直接调用logic()方法;
 
  1. 模块内部逻辑构建方法:logic()
该方法为抽象方法,留给子类自行实现。即用户覆盖这个方法,实现自己的模块内部逻辑。
 
  1. 支持构建Assign Block的方法
assign(Bit): 对Bit赋值,返回一个Assign Block,方便后续使用。
assign(Bits): 对Bits赋值,返回一个Assign Block,方便后续使用。
 
示例:
assign(bitA).from(bitB, bitC...).with(() -> bitA.assign(bitB.and(bitC)))
即Verilog的:assign bitA = bitB & bitC;
 
  1. 支持构建Always Block的方法
when(Event...): 返回一个依赖于参数里的事件的Always Block,方便后续使用。即如果发生参数里的事件,则执行Always Block中的runnable。
 
示例:
always(PosEdgeEvent.of(clk)).run(() -> regA.set(regB))
即Verilog的:
always @(posedge clk)
regA <= regB;
 
  1. 转换为Verilog的方法:toVerilog()
把Module转换为Verilog的RTL实现。
 
 
二. 用户自定义逻辑
 
  1. 添加构造方法
构造方法第一个参数为父模块的对象,如果本身为顶层模块,则实例化时可以传入null;
构造方法后续的参数,是与模块的输入和输出对接的线或寄存器;
最后调用construct()方法,构造模块的子模块和blocks;
 
  1. 声明模块输入和输出
模块的输入和输出,是模块的一个组成部分,作为类的属性声明;
模块的输入和输出,使用@Input和@Output注解;位数可以使用@Width(8)注解。
 
  1. 声明内部使用的线和寄存器
模块内部使用的线和寄存器,也是模块的一个组成部分,作为类的属性声明:
 
  1. 实现logic()方法
在logic()方法内部构建模块内部的子模块和逻辑块:
 
 
三. 实例Mux
 
  1. 构造方法
 
  1. 输入和输出
Bit全部为1位;
 
  1. 其他内部线和寄存器
Mux没有。
 
  1. 自定义逻辑
这也是一种lambda写法。
assign(out)意为要对out赋值,返回一个对out赋值的Assign Block;
.from(a, b, sel)意为赋值时需要使用a, b, sel。即如果a, b, sel的值发生变化,则会对out进行赋值;
.with(): 提供对out赋值的方法,即如果值变化事件发生,则使用this::assign0方法对out进行赋值;
 
assign0()方法,根据sel的值把a或者b赋值给out。
 
  1. 创建Mux模块
 
  1. 验证
 
结果:
 
 
  1. 转换为Verilog
 
 
 

最新文章

  1. 写在MongoCola在Github上获得200个Star之后
  2. 《PHP开发APP接口》笔记
  3. Selenium自动化测试实践 公开班(广州)
  4. IIS Express 及 vs2008下使用IIS Express
  5. c#中SqlHelper类的编写(三)
  6. linux信息查找
  7. android应用分析之apk文件结构
  8. HW5.9
  9. c++动态绑定与静态绑定
  10. Java排序之排序大综合
  11. linux分区工具fdisk的使用
  12. C#路径,文件,目录,I/O常见操作
  13. C#入门经典第六章函数-2-委托
  14. 如何添加在eclipse 中添加 window Builder
  15. 将Ext JS 6应用程序导入Web项目
  16. Python 中包/模块的 `import` 操作
  17. 模板 RMQ问题ST表实现/单调队列
  18. ci框架nginx访问
  19. 获取DataSet中某行某列的数据
  20. 一、Composer

热门文章

  1. MySQL——关于索引的总结
  2. 3-JVM垃圾回收算法和垃圾收集器
  3. 使用IR2104S搭建的H桥-机器人队比赛经典版(原作者答疑)
  4. springBoot第二种配置文件yaml书写方式及读取数据、整合myBatis和整合junit
  5. electron——通知
  6. android 百度地图v3.2.0获取实际地址
  7. post请求导出表单。
  8. JVM系列(2)-GC
  9. Docker之从零开始制作docker镜像
  10. MySQL 数据库的基本使用