用JS自制表格软件玩数据11. 虚拟机电路仿真加法运算器

Posted 妇男主任

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用JS自制表格软件玩数据11. 虚拟机电路仿真加法运算器相关的知识,希望对你有一定的参考价值。

虚拟机

简述

原本只是打算仿真一下计算机的架构即可,但是最近思考了一下整体的架构,既然浏览器的V8性能也不差,干脆就一撸到底吧。直接从数字电路仿真搞起来。该系列的文章写得确实比较毛糙,我这边会陆续整理好代码,再慢慢整理完善这些文章。

这个加法机只能工作于二进制数,假设如下运算:

1+1 = 1
001 + 001 = 010

看下面的运算表

  001
 +001
 -----
  010

加法计算对照表

+01
001
1110

布尔运算器的实现

第一步:与门运算

01
000
101

用JS代码表示

function _and(a,b)
  return a && b;

第二步:或门运算

01
001
111

用JS代码表示

function _or(a,b)
    return a || b;

第三步:非门运算

01
取反10

用JS代码表示

function _non(a)
   	return !a&1;


//如果a 为 0 , 首先会运行 !a 得到 true,接着就变成 true&1,true&1 的运行结果就会变成 1.
//如果a 为 1 , 首先会运行 !a 得到 false,接着就变成 false&1,false&1 的运行结果就会变成 1.

第四步:或非运算

或非01
010
100

用JS代码表示

function _nor(a,b)
    return !(a||b)&1;

第五步:与非运算

与非01
011
110

用JS代码表示

function _nand(a,b)
    return !(a && b)&1;

第六步:半加器运算

进位01
000
101
求和01
001
110

用JS代码表示

function _HalfAdder(a,b)
    let _or = a || b;
    let _nand = !(a && b)&1;
    return [
        a && b, // 进位
        _or && _nand] // 和

第七步:全加器的实现

全加器由半加器组合而成,所以全加器的代码实现需要调用半加器封装好的模块。同时,为了使用更加方便,我直接把代码全部封装在类里面,最后面会贴上全部代码以供参考。

用JS代码表示

/**
 * 全加器
 * @param * a 加数a
 * @param * b 加数b
 * @param * cin 进位输入
 * @returns 返回进位结果与加法的和
 */
_FullAdder(a,b,cin)
    let out1 = _HalfAdder(a,b);
    let out2 = _HalfAdder(cin,out1[1]);
    return [
        out1[0] || out2[0],
        out2[1]
    ]

第八步:8位二进制加法器的实现

8位二进制成为一个BIT。所以我们把加法器的最基本实现以1个BIT为基础。它由8个全加器串联而成。

用JS代码表示

/**
 * 8位串行加法器
 * @param * a 加数a (以数组的形式传入)
 * @param * b 加数b (以数组的形式传入)
 * @returns 返回运算是否溢出与加法的和
 */
_BitAdder(a,b)
    let result = [0,0,0,0,0,0,0]
    let carry = 0;
    let t;
    for (let index = 7; index > -1; index--) 
        t = this._FullAdder(a[index],b[index],carry) // 全加器
        carry = t[0];
        result[index] = t[1];
    
    // carry如果为1,则溢出
    return [carry,result]

运行测试

全代码

贴上全代码,下一章会分享减法器的实现。

/**
 * 逻辑门组件
 */
class boolgate
    constructor()

    

    /**
     * 与逻辑门
     * @param * a 
     * @param * b 
     * @returns 
     */
    _and(a,b)
        return a && b;
    

    /**
     * 或逻辑门
     * @param * a 
     * @param * b 
     * @returns 
     */
    _or(a,b)
        return a || b;
    

    /**
     * 非逻辑门
     * @param * a 
     * @returns 
     */
    _non(a)
        return !a&1;
    

    /**
     * 或非逻辑门
     * @param * a 
     * @param * b 
     * @returns 
     */
    _nor(a,b)
        return !(a||b)&1;
    

    /**
     * 与非逻辑门
     * @param * a 
     * @param * b 
     * @returns 
     */
    _nand(a,b)
        return !(a && b)&1;
    

    /**
     * 半加器
     * @param * a 
     * @param * b 
     * @returns 
     */
    _HalfAdder(a,b)
        let _or = a || b;
        let _nand = !(a && b)&1;
        return [
            a && b, // 进位
            _or && _nand] // 和
    
    
    /**
     * 全加器
     * @param * a 
     * @param * b 
     * @param * cin 
     */
    _FullAdder(a,b,cin)
        let out1 = this._HalfAdder(a,b);
        let out2 = this._HalfAdder(cin,out1[1]);
        return [
            out1[0] || out2[0],
            out2[1]
        ]
    

    /**
     * 8位串行加法器
     * @param * a 
     * @param * b 
     * @returns 
     */
    _BitAdder(a,b)
        let result = [0,0,0,0,0,0,0]
        let carry = 0;
        let t;
        for (let index = 7; index > -1; index--) 
            t = this._FullAdder(a[index],b[index],carry) // 全加器
            carry = t[0];
            result[index] = t[1];
        
        // carry如果为1,则溢出
        return [carry,result]
    

以上是关于用JS自制表格软件玩数据11. 虚拟机电路仿真加法运算器的主要内容,如果未能解决你的问题,请参考以下文章

用JS自制表格软件玩数据9. 自制三维 K线图 蜡烛图

用JS自制表格软件玩数据9. 自制三维 K线图 蜡烛图

用JS自制表格软件玩数据2.分析Excel的文件结构

用JS自制表格软件玩数据1.页面布局

用JS自制表格软件玩数据5. 渲染出整个Excel单元格

用JS自制表格软件玩数据1.页面布局