使用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. 【Spark】SparkStreaming从不同基本数据源读取数据

    文章目录 基本数据源 文件数据源 注意事项 步骤 一.创建maven工程并导包 二.在HDFS创建目录,并上传要做测试的数据 三.开发SparkStreaming代码 四.运行代码后,往HDFS文件夹 ...

  2. 【HBase】HBase基本介绍和基础架构

    目录 基本介绍 概述 特点 HBase和Hadoop的关系 RDBMS与HBase的对比 特征 基础架构 基本介绍 概述 HBase是bigtable的开源java版本,是建立在HDFS之上,提供高可 ...

  3. SVN 分支代码合并到主线

    SVN 分支代码合并到主线 步骤一安装TortoiseSVN 客户端,在本地 checkout主线代码 步骤二:创建branches分支 步骤三.branches修改提交代码 步骤四:分支代码合并到主 ...

  4. GP1UM26(78)1RK远程红外遥控接收IC数据手册学习

    1.Features 该系列IC具有多种BMP带通频率可供选择,典型的GP1UM261RK带通频率为38KHz,内部的前置放大器等放大电路工作频率均为38KHz. Compact紧凑型,体积小 2.i ...

  5. [hdu5360]贪心

    题意:一个人想邀请n个人出去玩,假设当前同意和他一起去的人数为cnt,那么他去邀请i的时候,i同意的条件是L[i]<=cnt<=R[i],L[i],R[i]是给定的,问怎样安排邀请顺序,使 ...

  6. leeCode刷题 1078

    给出第一个词 first 和第二个词 second,考虑在某些文本 text 中可能以 "first second third" 形式出现的情况,其中 second 紧随 firs ...

  7. git --添加多个文件

    今天测试,发现之前写的auto testcase,有好多发生了改变,因此需要修改脚本重新上传至git当中. 对好几个test case script 进行了修改,之前只是一个一个的修改,这次是多个,经 ...

  8. POI 导入excel数据自动封装成model对象--代码

    所有的代码如下: import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; ...

  9. 2018-06-18 Javascript 基础1

    js是一门基于对象的若类型语言,他和JAVA没有关系: js标签放置位置:1.内联 2.外部 3.内部: js代码是有执行顺序的,这点和css代码有所区别:当对象没有加载完或者还没加载的情况下js代码 ...

  10. nth-of-child和nth-of-type的区别

    p:nth-of-child(2)     翻译过来就是,必需是p元素,并且是父标签的第二个元素,满足以上两个条件,这些样式才会渲染. p:nth-of-type(2)     翻译过来就是,必需是p ...