《编码——隐匿在计算机软硬件背后的语言》精炼——第17章(自动操作)

夫道成于学而藏于书,学进于振而废于穷。

文章目录

  • 完善加法器
  • 加入代码的加法器
  • 扩大加数范围
  • 自由调用地址的加法器
  • 合并代码RAM和数据RAM
  • Jump指令
    • 硬件实现
    • 条件Jump指令
      • 零转移的硬件实现
      • 条件Jump指令的例子
  • 总结

完善加法器

我们在第14章介绍了一个可以进行连加的加法器,接下来我们对它进行扩展:
在这里插入图片描述
我们将数据用之前讲到的RAM进行存储,以达到回看这些数据的效果。在这里插入图片描述
振荡器和16位计数器连接起来既可以计时,又可以计数,这也是上一篇文章讲过的。在这里,我们用它来计数,通过顺序存储所需要的数据,我们做到将RAM中的数据依次加入加法器中进行相加。

十六位计数器从0000h开始,每隔一段时间输出+1,一直到FFFFh。那么只要从0000h开始存储数据就可以了。

通过同步时钟(Clk),可以保证完成一个完整的加法过程;当摁下清零开关(Clr)时,锁存器和计数器同时清零,重新从第一个数开始计算。
我们也可以把计算结果直接写回到RAM中,这样虽然将原来的加数覆盖掉了,但胜在省掉了灯泡。
在这里插入图片描述
接下来,我们将进入另一个阶段的完善。

加入代码的加法器

上面的加法器有一个明显的缺点,就是它的加法过程一旦开始,便不能再结束,计数器到FFFFh后会回到0000h重新计数。因此我们需要进行改进,即引入代码,让它能够自动执行额外的操作。
我们用例子说明这些代码是怎样加到装置中去且在装置中发挥作用的。假设我们先对三个数相加,再对两个数相加,再对三个数相加,那么只用上图装置可以表示为:
在这里插入图片描述
最左边是地址,表格中是存储的具体数值,最右边是说明。我们用这种形式来表示加入代码后加法器的操作。
首先思考一下我们暂时需要什么样的操作。下表是我们现在需要的操作:
在这里插入图片描述

  1. Load:将RAM中的数加载到加法器中作为第一个加数。
  2. Store:将锁存器中的数存储到RAM中。
  3. Add:将RAM中的数加载到加法器中与之前的数相加。
  4. Halt:停止所有操作。

思考一下Load操作和Add操作的区别。Load操作不需要将锁存器中的结果存到加法器中,但Add操作需要。
这样的话,我们就能表示在上面的例子中,我们需要进行什么样的操作:
在这里插入图片描述

要实现这些操作,我们需要再加上一些硬件。第一,我们需要加入一个存储代码的RAM,它和存储数据的RAM一起同时被计数器控制,称为代码RAM阵列;第二,执行Load指令时,锁存器的输入直接从数据RAM阵列中得到,而执行Add指令时,则从加法器中得到,这样的话就需要加入一个2-1选择器。具体如下所示:
在这里插入图片描述
我们可以通过输出不同的代码来控制电路中的控制信号,这可以通过加入一些逻辑门实现,这里省略。
接下来,再次完善代码,我们加入减法:
在这里插入图片描述
这里减法的代码是21h,与加法代码只在最后一位不同。检测到这个不同后,将从数据RAM阵列中取出的数进行取反。如下图所示,在该图中,减法与加法不同的位称为C0
在这里插入图片描述
其他操作的问题暂时解决,接下来我们将扩展加数的范围,将它们从8位扩展到16位。

扩大加数范围

我们的目标是不改动加法器的位数,使装置能进行16位加数的运算。很容易想到,我们将16位的数分成两半,先将低字节相加,再将高字节相加即可:
在这里插入图片描述
结果的低字节存储在0002h,高字节存储在0005h。
接下来,我们需要解决进位的问题。这个问题实际上在前面已经解决,只需要存储一个信号作为进位就可以了,用一位存储器来存储即可。
加入进位信号存储器后,原来的Add代码就不能完全进行自动操作了,我们需要再引入一个专门用于进位情况的代码,就称作Add with Carry(进位加法)。在执行Add操作时,我们将最高位的进位输出存储到一位存储器中;在进行16位的高字节数相加时,我们使用进位加法代码,它将进位存储器中的信号也当作加数一起在加法器内相加。进行16位的减法运算时,这个存储器也可以存储对高字节的借位,可以再引入一个代码Subtract with Borrow(借位减法)进行操作。
加入Add with Carry和Subtract with Borrow后,我们的代码如下所示:
在这里插入图片描述
注意,当进行16位加法高字节运算时,我们一般都使用进位加法进行运算。减法同理。

自由调用地址的加法器

我们通过扩展指令的方式,将要调用的地址单独编码在指令RAM而非直接用计数器指明地址,这样就可以实现对地址的自由调用。具体实现方案如下所示:
在这里插入图片描述
16位计数器连接代码RAM阵列,在代码RAM中依次取出代码。将每个代码扩展为三个字节,第一个字节指明执行什么操作,余下两个字节指明调用数据RAM的16位地址。
由于计数器依次前进1,因此一个指令需要三个时钟周期,而一个完整的指令周期需要四个时钟周期,因此需要更为复杂的控制信号,这里省略。不论如何,这个加法器的速度只有原来的1/4,但是它拥有更完善的功能。

合并代码RAM和数据RAM

事实上,我们可以将这两个RAM合为一个。例如,如果我们有一个指令为10h 32h 52h。不难解释这个指令:加载3252h处的数据到加法器中。正常情况下,我们会用后两个字节在数据RAM的3252h处找到数据。但如果我们将3252h处的数据也存入代码RAM的3252h处,我们就可以省略掉数据RAM而用代码RAM来同时存储代码和数据。实现如下:
在这里插入图片描述
我们先选择计数器作为2-1选择器的输出,从RAM中取出代码,代码的后两个字节被锁存器保存后折回作为2-1选择器的第二个输出(32h,52h),这样就能从RAM中取出3252h处的数据,这个数据最后从右上角输出到加法器中。我们用FFh(Halt指令)来分割存储代码的区域和存储数据的区域。

Jump指令

还存在一个问题是,如果我们还想要重新写入更多的指令,我们就必须用其他指令替换掉Halt指令,但这样的话,我们就可能把原本是数据的区域当成存储代码的区域。为了解决这个问题,我们引入一个新的Jump指令,这个指令可以指定下一次执行的指令地址而不一定必须顺序执行。有了这个指令,就不需要用Halt指令来分割区域了。将这个指令加入指令表;
在这里插入图片描述
Jump指令后面跟一个16位的数,表示要跳转的地址。

硬件实现

不难想到,Jump指令通过控制16位计数器来实现其功能。进一步讲,它通过控制Pre和Clr信号来控制计数器的输出。Pre信号强制Q=1,Clr信号强制Q=0。我们新增的电路如下:
在这里插入图片描述

  • 置位信号为0,复位信号为0时,三个门的输出都为0,A无法控制Pre和Clr信号。
  • 置位信号为0,复位信号为1时,Pre信号为0,Clr信号为1,A无法控制Pre和Clr信号
  • 置位信号为1,复位信号为0时,设A信号为a,则Pre信号输入为a,Clr信号输入为¬a,计数器的输出取决于A输入,达到Jump指令的目的
  • 置位信号为1,复位信号为1的情况不合法

在实际电路中,由于只增加了A信号和置位输入,且A信号输入来源于RAM阵列中Jump指令的操作数,置位信号遇到30h(Jump指令操作数)时就设为1,因此对电路改动不是很大:
在这里插入图片描述

条件Jump指令

在有些情况下,我们需要达到一些条件时再进行Jump指令,这需要引入条件Jump指令。下面是引入条件Jump指令后的指令表:
在这里插入图片描述
我们可以看到,在指令表中,我们一共有四个标准:零,非零,进位,非进位。其中进位很好理解,当进位锁存器输出值满足要求时进行Jump指令。对于零转移(非零转移)来说,当加法器最后一次相加得到的值为0(不为0)的时候,我们执行Jump指令。

零转移的硬件实现

为了实现零转移和非零转移,我们需要新增一个零锁存器:
在这里插入图片描述
当加减相关的四条指令被执行时,锁存器进行锁存最后的结果并输出到零标志位,根据零标志位,决定是否执行Jump指令。

条件Jump指令的例子

下面是一个用到条件Jump指令的例子:执行相乘A7h和1Ch运算。
很容易想到将A7h相加28(1Ch)遍即可,循环相加利用Jump指令很好实现,如果想要控制相加遍数,那么利用非零转移指令即可。用某种方式存储1Ch,每一次相加后将1Ch减1,未减到0时,Jump指令使循环相加过程继续;减到0时,Jump指令不执行,直接结束。
下面是实际实现的指令序列:
在这里插入图片描述
这一部分存储了乘数、被乘数和结果要保存的地方。
在这里插入图片描述
这一部分执行相加运算,将上一次相加的结果再次与被乘数相加。
在这里插入图片描述
这一部分是重点,包含了五条指令。在前三条指令中,我们将乘数与FFh相加。注意,这里的FFh被看作一个数,乘数和FFh相加就相当于将乘数减1.第四条指令是条件Jump指令,它对当前加法器的输出,即乘数的当前值进行检测,如果乘数不为0,那么Jump指令执行,回到加法部分继续进行相加运算;如果乘数为0,说明加法过程已经进行28遍,Jump指令不再调用,直接执行FFh,即Halt指令。

总结

到这里,我们已经完成了一个计算机应有的功能,通过这些简单的指令,我们可以做到各种运算:乘除法,平方,开根……计算机也就此诞生。
请添加图片描述
我是霜_哀,在算法之路上努力前行的一位萌新,感谢你的阅读!如果觉得好的话,可以关注一下,我会在将来带来更多更全面的知识讲解!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/19963.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT都有些什么好玩的玩法?

ChatGPT是一个智能聊天机器人,可以进行多种有趣的玩法,以下是其中一些: 1. 问答游戏:ChatGPT可以回答各种问题,你可以和它玩问答游戏,看看谁更聪明。 2. 聊天互动:ChatGPT可以进行自然语言聊天…

自学黑客【网络安全】,一般人我劝你还是算了吧

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 我一直强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而且实际向安全过渡后可用到的关键…

分区计量管理项目应用

为充分发挥分区计量管理项目在漏损控制的效用,应构建科学完备的应用体系,如下图 分区计量应用体系 1. 基于水量平衡分析的漏损现状评估方法 分区计量管理项目通过监控分析DMA 分区内流量、压力、水质、大用户用水等情况,结合营业抄收系统的营…

win10中rclone挂载minio的多实例安装方式

1.下载rclone安装包&#xff0c;复制多个.exe并重命名 2.1添加rclone1server.xml <service><id>rclone1</id><name>rclone1</name><description>rclone1service</description><executable>rclone</executable><argum…

LeetCode_二叉树_简单_112.路径总和

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum。判断该树中是否存在 根节点到叶子节点的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum。如果存在&#xff0c;返回 true&#…

【学习笔记】低速数字输入电路

1、方案设计&#xff1a;单通道、单向、反相器 该电路采用单通道&#xff0c;单向光耦&#xff0c;只支持漏型输入&#xff0c;电路的输入端压差满足24V DC10%(21.6V DC-26.4V DC)&#xff0c;输出端电压在0~3.3V范围摆动。 1.1关键技术规格 1.2具体原理图 1.3电路原理详解 …

Java版本电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

营造全面规范安全的电子招投标环境&#xff0c;促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标…

如何利用生产管理系统提高粉末治金工业的生产调度能力

在粉末冶金工业中&#xff0c;生产管理系统的应用已经成为了一个必不可少的部分。生产管理系统可以帮助企业实现自动化、信息化、智能化的生产&#xff0c;提高生产效率、降低生产成本、提高产品质量。生产管理系统可以对生产流程进行全面的监控和管理&#xff0c;从而实现生产…

Android还要继续学习吗?高薪高级开发领先位置占据一席之地

Android开发还有必要学习吗 &#xff1f; 我们来看Android从业大佬的回答&#xff1b;从回答中可以读取出一些信息&#xff0c;Android市场仍有岗位需求&#xff0c;只不过减少许多初级Android开发岗位。对于中高端市场还是面临着缺少人才&#xff1b;因为初级开发人员多啊&am…

Adobe Photoshop 2022版 功能介绍及使用技巧

目录 版本介绍&#xff1a; 使用技巧&#xff1a; 截图展示&#xff1a; 分享 版本介绍&#xff1a; Adobe Photoshop 2022是Adobe公司的一款专业的图像处理软件&#xff0c;它提供了强大的图像处理功能&#xff0c;从色彩调整&#xff0c;图层处理到高级合成等功能。新版…

AP3266 DC-DC大功率同步降压恒流芯片 过EMC三级 摩托电动汽车灯IC

1&#xff0c;产品描述 AP3266 是高效率、外围简单、内置功率管的同步降压恒流芯片&#xff0c;适用于4-40V输入的降压LED恒流驱动芯片。输出功率可达 40W&#xff0c;电流3.6A。AP3266 可通过调节 OVP 端口的分压电阻&#xff0c;设定输出空载电压 保护&#xff0c;避免高压 空…

Jmeter和Postman那个工具更适合做接口测试?

软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大部分人在做的接口测试&#xff0c;小白变高手…

基于梯度提升决策树的组合特征方法,《百面机器学习》学习笔记

《百面机器学习》学习笔记&#xff1a;基于梯度提升决策树的组合特征方法 基于梯度提升决策树的组合特征方法梯度提升决策树这里举一个例子来说明梯度提升决策树的思想方法为了更好地说明如何使用梯度提升决策树来实现对特征的组合&#xff0c;再举一个例子假设对于某种类型的输…

Nuxt学习笔记

创建项目 npx create-nuxt-app projectName SSR 渲染流程 客户端发送 URL 请求到服务端&#xff0c;服务端读取对应的 URL 的模板信息&#xff0c;在服务端做出 HTML 和数据的渲染&#xff0c;渲染完成之后返回整个 HTML 结构给客户端。所以用户在浏览首屏的时候速度会比较快…

物联网| 定时器计数器开发之中断方法|定时器中断处理函数|完整测试代码|物联网之蓝牙4.0 BLE基础-学习笔记(6)

文章目录 11 定时器计数器开发之中断方法定时器中断处理函数:完整测试代码&#xff1a; 11 定时器计数器开发之中断方法 LED控制电路同前节&#xff1a; CC2530的T3定时器(8位&#xff09;需要了解T3GJL,T3CCTLO,T3CCO,T3CCTL1,T3CC寄存器。如下表所示&#xff1a; 按照表格…

像素画板-第14届蓝桥杯省赛Scratch初级组真题第4题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第133讲。 像素画板&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程初级组真题第4题&#xf…

从C出发 31 --- 指针专题经典问题剖析

int a 0; int* p &a; //p作为指针指向了a, p 保存的是a 变量的内存地址&#xff0c;// p 这个指针本质是变量&#xff0c;这个变量有没有内存地址&#xff1f;// 有内存地址&#xff0c;为什么&#xff1f;// 因为它作为变量&#xff0c;肯定要占用内存空间的// p 这个变…

Java EE 初阶---多线程(三)

五、阻塞队列 目录 五、阻塞队列 5.1 阻塞队列是什么 &#xff1f; 5.1.1 生产者消费者模型 ​编辑 5.1.2 标准库中的阻塞队列 5.1.3 消息队列 5.1.4 消息队列的作用 5.2 实现一个阻塞队列 虚假唤醒 六、线程池 6.1 线程池是什么&#xff1f; 6.2 怎么使用线程池&#xf…

多媒体基础

第九章、多媒体基础 1、多媒体技术基本概念 1.1、音频相关概念 超声波的频率通常在20千赫兹以上&#xff0c;无法被人类的耳朵听到&#xff0c;常用于医疗诊断、非破坏性材料测试、清洗、测量等领域 次声波的频率通常在20赫兹以下&#xff0c;同样无法被人类的耳朵听到&…

数据库缓存服务——NoSQL之Redis配置与优化

一、缓存概念 缓存是为了调节速度不一致的两个或多个不同的物质的速度&#xff0c;在中间对速度较慢的一方起到加速作用&#xff0c;比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据&#xff0c;内存是保存CPU经常访问硬盘的数据&#xff0c;而且硬盘也有大小不一的缓存…