使用FullAdder级联实现加法器
 
参考链接:
 
 
1.创建Add.java, 并生成构造方法和logic()方法
 
2. 根据逻辑原理图,添加输入输出线
 
 
3. 在构造方法中搜集输入输出线并调用construct()方法
 
4. 在logic()方法中创建子节点并连线
 
这里首先从input ports牵出线,并创建连接到output ports的线。其中,最后一个input port使用in(-1)取出。最后一个output port使用out(-1)取出。
 
cout作为一个游标,逐次指向每一级的进位线进行连接。最开始为cin,第一级之后代表这一级FullAdder的进位线...直到最后,代表最后一个进位线连接到Add节点的最后一个output port.
 
5. 创建inst静态方法方便后续使用
 
6. 创建main方法执行验证
 
 
运行结果为:
 
 
 
7. 生成Verilog
 
执行结果如下:
 
module Add_8后面多出来一个8?这样就可以把不同位宽的Add模块区分开来。
需要覆盖getName()方法:
 
原子节点需要覆盖primitive()方法,以返回原语的名称。比如与门,需要返回and:
 
 
更多实例请参考如下链接:
 
package org.jchdl.model.gsl.operator.arithmetic;
 
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.value.Value;
 
// treat operands as plain bits
public class Add extends Node {
private int nBits = 0;
 
private WireVec in1;
private WireVec in2;
private Wire cin;
private WireVec sum;
private Wire cout;
 
public Add(WireVec sum, Wire cout, WireVec in1, WireVec in2, Wire cin) {
nBits = in1.nBits();
in(in1.wires());
in(in2.wires());
in(cin);
out(sum.wires());
out(cout);
construct();
}
 
@Override
public void logic() {
in1 = new WireVec(inputs(0, nBits));
in2 = new WireVec(inputs(nBits, 2*nBits));
cin = new Wire(in(-1));
 
sum = new WireVec(outputs(0, nBits));
 
cout = cin;
for (int i = 0; i < nBits; i++) {
Wire coutNext = new Wire();
FullAdder.inst(sum.wire(i), coutNext, in1.wire(i), in2.wire(i), cout);
cout = coutNext;
}
cout.connect(out(-1));
}
 
@Override
public String getName() {
return this.getClass().getSimpleName() + "_" + nBits;
}
 
public static Add inst(WireVec sum, Wire cout, WireVec in1, WireVec in2, Wire cin) {
return new Add(sum, cout, in1, in2, cin);
}
 
public static void main(String args[]) {
WireVec in1 = new WireVec(8);
WireVec in2 = new WireVec(8);
WireVec out = new WireVec(8);
Wire cin = new Wire();
Wire cout = new Wire();
 
Add.inst(out, cout, in1, in2, cin);
 
in1.assign(new Value[] { //0b0000_0010
Value.V0, Value.V1, Value.V0, Value.V0,
Value.V0, Value.V0, Value.V0, Value.V0,
});
in2.assign(new Value[] { // 0b1111_1111
Value.V1, Value.V1, Value.V1, Value.V1,
Value.V1, Value.V1, Value.V1, Value.V1,
});
cin.assign(Value.V1);
 
in1.propagate();
in2.propagate();
cin.propagate();
 
System.out.println("c_sum: " + cout + "_" + out);
 
Add.inst(out, cout, in1, in2, cin).toVerilog();
}
}
 
 
 

jchdl - GSL实例 - Add的更多相关文章

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

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

  2. jchdl - GSL实例 - ComplementTwo(二的补码)

    https://mp.weixin.qq.com/s/Gh2xJJvfg1SlyuayK4LRyQ   二的补码指对二进制数的所有位数整体求补.二进制运算下0,1互为补数,n位二进制数a的补数为2^n ...

  3. jchdl - GSL实例 - DFlipFlop(D触发器)

    https://mp.weixin.qq.com/s/7N3avTxTd2ZUnAcKg4w3Ig   D触发器对边沿敏感,只有当相应的边沿出现时,才会触发D的值传播到输出Q.   ​​ 引自:htt ...

  4. jchdl - GSL实例 - Div

    因为对除法研究不深,这里略去不表.   有兴趣可以参考链接: https://github.com/wjcdx/jchdl/blob/master/src/org/jchdl/model/gsl/op ...

  5. jchdl - GSL实例 - MulC2(有符号数的乘法)

      这里的实现,先把符号位取出来,使用两个正数相乘,然后在把符号加到乘积上.   参考链接 https://github.com/wjcdx/jchdl/blob/master/src/org/jch ...

  6. jchdl - GSL实例 - Mul(无符号数的乘法)

      这里实现最原始的阵列乘法,逐位相乘然后加到一起.   参考链接 https://github.com/wjcdx/jchdl/blob/edcc3e098d4f1cb21677e86e87a114 ...

  7. jchdl - GSL实例 - LogicalLeft

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

  8. jchdl - GSL实例 - Shifter

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

  9. jchdl - GSL实例 - Concat

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

随机推荐

  1. Coursera课程笔记----C程序设计进阶----Week 1&2

    C程序中的函数(Week 1&2) 函数 函数的定义 对函数的普遍认识:y=f(x) C语言中的常用函数: 平方根: r = sqrt(100.0) 底数x的y次幂:k = pow(x,y) ...

  2. [hdu5319]二进制表示,简单模拟

    题意:给一个矩形,矩形里面画了4种符号,'.'表示没画线,'R'表示画了红线,'B'表示画了蓝线,'G'表示红线和蓝线同时画了,并且矩形主对角线上只能画红线,副对角线上只能画蓝线,问最少画多少条线才能 ...

  3. springData表关系:一对一

    一.编写两个实体类 1.一对一关系实现:a:使用外键关联 b:使用主键关联,两个表的主键相同 2.外键方案:配置关联关系:两个实体类互相关联,并且在关联的属性上添加一个@OneToOne代表一个对一个 ...

  4. 罗马数字转int

    // I(1).V(5).X(10).L(50).C(100).D(500)和M(1000) 1.重复数次:一个罗马数字重复几次,就表示这个数的几倍.2.右加左减:2.1 在较大的罗马数字的右边记上较 ...

  5. appium——如何导出夜神模拟器下载“微信”app的apk

    背景:夜神模拟器是一款功能强大的安卓模拟器,但是当我们在上面下载APP应用后,通常不知道apk文件在哪里,下面以“微信”APP为例做一下详细介绍. 一般情况下,使用夜神安卓模拟器下载的文件只能在夜神安 ...

  6. Java开发架构篇:DDD模型领域层决策规则树服务设计

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一章节介绍了领域驱动设计的基本概念以及按照领域驱动设计的思想进行代码分层,但是仅 ...

  7. The Apache Tomcat Connector

    http://tomcat.apache.org/connectors-doc/generic_howto/quick.html 搭建最简单的tomcat connector 用到了apapche 的 ...

  8. P4015 运输问题 最大/最小费用最大流

    P4015 运输问题 #include <bits/stdc++.h> using namespace std; , inf = 0x3f3f3f3f; struct Edge { int ...

  9. 9.1 Go 反射

    9.1 Go 反射 反射:可以在运行时,动态获取变量的信息,比如变量的类型,类别 1.对于结构体变量,还可以获取到结构体的字段,方法 2.实现这个功能的是 reflect包 reflect.TypeO ...

  10. 如何将你的node服务放到线上服务器

    最近在用node写后端数据处理,以前虽然也用node写数据来进行测试,但是一直都是处于本地使用, 今天想将node作为后端服务来处理数据, 特此,以此博客记录. 第一步,写node 接口, 在本地我们 ...