https://mp.weixin.qq.com/s/yJx_dV6ScUStJtPWVuD38w

原理图

参考链接

https://github.com/wjcdx/jchdl/blob/master/src/org/jchdl/model/gsl/example/Mux4.java

1.创建Mux4.java, 并生成构造方法和logic()方法

2. 根据逻辑原理图,添加输入输出线

需要注意的是,这里使用了WireVec,而不是Wire来声明输入线,以便统一处理一排线。

3. 在构造方法中搜集输入输出线并调用construct()方法

这里一次性的把dat, sel中的所有线都加到输入线中。

4. 在logic()方法中创建子节点并连线

创建WireVec时可以直接与input/output相连;使用时从WireVec中取出某一条线使用即可。

这里更通用的做法,是记录输入WireVec dat的位数,这样在logic()取的时候,就不需要把数字写死了:

5. 创建inst静态方法方便后续使用

6. 创建main方法执行验证

运行结果为:

四种组合逐个选择i0~i3中的值。

7. 生成Verilog

执行结果如下:

package vec;

import org.jchdl.model.gsl.core.datatype.helper.WireVec;

import org.jchdl.model.gsl.core.datatype.net.Wire;

import org.jchdl.model.gsl.core.meta.Node;

import org.jchdl.model.gsl.core.meta.PropagateManager;

import org.jchdl.model.gsl.core.value.Value;

import org.jchdl.model.gsl.operator.conditional.Mux;

public class Mux4 extends Node {

private int nDatBits = 0;

private WireVec dat;

private WireVec sel;

private Wire out;

private Wire o0 = new Wire();

private Wire o1 = new Wire();

public Mux4(Wire out, WireVec dat, WireVec sel) {

nDatBits = dat.nBits();

in(dat.wires());

in(sel.wires());

out(out);

construct();

}

@Override

public void logic() {

dat = new WireVec(inputs(0, nDatBits));

sel = new WireVec(inputs(nDatBits));

out = new Wire(out(0));

Mux.inst(o0, dat.wire(0), dat.wire(1), sel.wire(0));

Mux.inst(o1, dat.wire(2), dat.wire(3), sel.wire(0));

Mux.inst(out, o0, o1, sel.wire(1));

}

public static Mux4 inst(Wire out, WireVec dat, WireVec sel) {

return new Mux4(out, dat, sel);

}

public static void main(String[] args) {

WireVec dat = new WireVec(4);

WireVec sel = new WireVec(2);

Wire out = new Wire();

Mux4 mux4 = Mux4.inst(out, dat, sel);

dat.assign(new Value[]{Value.V0, Value.V1, Value.V0, Value.V1});

sel.assign(new Value[]{Value.V0, Value.V0});

PropagateManager.propagateParallel(dat, sel);

System.out.println("out: " + out.getValue().toString());

sel.assign(new Value[]{Value.V1, Value.V0});

PropagateManager.propagateParallel(sel);

System.out.println("out: " + out.getValue().toString());

sel.assign(new Value[]{Value.V0, Value.V1});

PropagateManager.propagateParallel(sel);

System.out.println("out: " + out.getValue().toString());

sel.assign(new Value[]{Value.V1, Value.V1});

PropagateManager.propagateParallel(sel);

System.out.println("out: " + out.getValue().toString());

mux4.toVerilog();

}

}

jchdl - GSL实例 - Mux4(使用WireVec简化输入线声明)的更多相关文章

  1. jchdl - GSL实例 - Mux4

    https://mp.weixin.qq.com/s/hh0eExVFC6cxzpvNI1cA9A 使用门实现四选一选择器. 原理图 ​​ 参考链接 https://github.com/wjcdx/ ...

  2. jchdl - GSL实例 - Mux4(使用Mux)

    https://mp.weixin.qq.com/s/GrYJ4KXEFRoLLmLnAGoMSA 原理图 ​​ 参考链接 https://github.com/wjcdx/jchdl/blob/ma ...

  3. jchdl - GSL实例 - Concat

    https://mp.weixin.qq.com/s/oJY6Xj9_oM1gSmvH_dHkJg   Concat节点把多根输入线线组合成一排线输出.   参考链接 https://github.c ...

  4. jchdl - GSL实例 - Add

    https://mp.weixin.qq.com/s/6xcYYdYZTBPTf25xFluzBQ   使用FullAdder级联实现加法器   参考链接: https://github.com/wj ...

  5. jchdl - GSL实例 - Assign

    https://mp.weixin.qq.com/s/MtHR3iolPd5VQq6AUE-JPg   Assign是一个节点,把输入线直接赋值给输出线.在转换成Verilog时,这种类型的节点会直接 ...

  6. jchdl - GSL实例 - LogicalLeft

    https://mp.weixin.qq.com/s/WNm4bLWzZ0oWHWa7HQ6Y6w   逻辑左移,继承自Shifter类.只需要实现shift方法即可.   参考链接 https:// ...

  7. jchdl - GSL实例 - Shifter

    https://mp.weixin.qq.com/s/ngQji-xi4FCCbL_2ihUi_A   Shifter是移位节点的父类,定义了输入输出线,但是没有定义具体的移位方式,这个留给子类去实现 ...

  8. jchdl - GSL实例 - Sub(二的补码实现)

    https://mp.weixin.qq.com/s/10fgjqPt2pRvIJzjDGYgBg   概念辨析   <IC-二进制, 自然数, 有符号数>:https://mp.weix ...

  9. jchdl - GSL实例:HalfAdder

    https://mp.weixin.qq.com/s/Y97bIro7UlPPFCoPlzgmOQ 半加器电路是指对两个输入相加,输出一个结果位和,没有进位输入的电路. 是实现两个一位二进制数的加法运 ...

随机推荐

  1. 王颖奇 20171010129《面向对象程序设计(java)》第十七周学习总结

    实验十七  线程同步控制 实验时间 2018-12-10 学习总结: 1.Java通过多线程的并发运行提高系统资源利用 率,改善系统性能. 2.假设有两个或两个以上的线程共享 某个对象,每个线程都调用 ...

  2. Mybatis使用ResultMap

    解决字段名和属性名不一致的问题 - 新建数据库表的字段-这里就不贴上了 在下面链接有 https://www.cnblogs.com/rzkwz/p/12853899.html 设置实体类和数据库字段 ...

  3. leetcode必刷200题

    一.数据结构相关 链表 1. 相交链表 2. 反转链表 3. 合并两个有序链表 4. 删除排序链表中的重复元素 5. 删除链表的倒数第 n 个节点 6. 两两交换链表中的节点 7. 两数相加 II 8 ...

  4. qt获取指定目录下符合条件的文件路径

    1)设置名称过滤器 QDir * dir = new QDir(路径); QStringList filter; Filter << QStringLiteral(“筛选的文件条件,如.x ...

  5. gather函数

    gather(input, dim, index):根据  index,在  dim  维度上选取数据,输出的  size  与  index  一致 # input (Tensor) – 源张量 # ...

  6. python--递归函数的学习

    递归:函数间接或者直接调用自己 递归分两个过程 1.往下调用,分解的过程 2.往上回溯,综合的过程 递归的条件: 一定要有结束的条件 例子:阶乘: def fun_a(n): #print(n) if ...

  7. Springboot Mybatis 打包jar扫描bean与mapper问题研究与解决

    SpringBootLean 是对springboot学习与研究项目,是根据实际项目的形式对进行配置与处理,欢迎star与fork. [oschina 地址] http://git.oschina.n ...

  8. java ->斗地主洗牌

    import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util ...

  9. java -> StringBuffer与StringBuilder类

    字符串缓冲区 StringBuffer类 在学习String类时,API中说字符串缓冲区支持可变的字符串,什么是字符串缓冲区呢?接下来我们来研究下字符串缓冲区. 查阅StringBuffer的API, ...

  10. MFC带参数启动指令发送与接收

    MFC带参数启动指令发送与接收 发送 使用ShellExecute函数打开文件或执行程序. 函数原型: HINSTANCE ShellExecute( _In_opt_ HWND hwnd,//父窗口 ...