计算机那点事儿~

软件和网站开发以及相关技术探讨
头像
ubuntu777
帖子: 249
注册时间: 2007-03-28 18:40

Re: 计算机那点事儿~

#31

帖子 ubuntu777 » 2015-05-10 19:53

一个四位同步计数器可以通过一个四位二制数字,从0000根据时间脉冲变化一步一步进位到1111。共表示16个不同的时间。如果我们需要在某一个时间控制一些电路做某些事情。比如在第二个时间,打开某个存储单元的读取功能。我们需要得到一根在第二个时间是高电平的电线。然后把它连到这个存储单元的读写功能线上。

要完成这种功能,就需要对这个计数器进行译码。
下面用一个两位的同步计数器来说明这种译码功能怎么实现。大家看图。
jk_ripple_counter_03.jpg
这是一个两位计数器。由编号为FFA和FFB的两个JK触发器组成。FFA有A和A,两个输出值相反的输出端。FFB也一样,有B和B两个输出端。共四个输出端。BA两位组成的二进制数字。注意B是高位。A是低位。图中的时间脉冲是通过非门电路后由FFA的clk端输入。然后FFA输出端A,通过非门电路后,进入FFB的clk输入端。
BA输出端根据时间脉冲从00变到01,然后10,再然后11。共表示四个时间。
根据这四个输出端,我们用与门电路做下面的处理。看图
jk_ripple_counter_04.jpg
分别得到X0、X1、X2、X3四个值。想想这四个值在不同的时间状况下会是什么结果?
看下面的图,就是把AB、A、B四个输出端牵出来四根电线,然后接与门电路进行译码的实际的连接方式。
jk_ripple_counter_05.jpg
右边是一个波形图。大家一看就明白了。X0在第一个时间,BA值为00时,是高电平1值,其它时段都是低电平。X1在第二个时间,BA值为01时,是高电平1值,其它时段都是低电平。X2在第三个时间,BA值是10时,是高电平1值,其它时段都是低电平。X3在第四个时间,BA值是11时,是高电平1值,其它时段都是低电平。
通过这种译码方式,我们可以把一个多位二进制数字任意的一个值转换为一根高电平的输出线。用来控制需要的电路。
如果需要在这个时间值的时候控制多个电路,把多个电路都连到这根线上。有的电路可能在这个特定的时间需要一个相反的值(低电平)来控制,那就在接入之前加一个非门电路。
上次由 ubuntu777 在 2015-05-13 19:35,总共编辑 2 次。
שְׁמַע יִשְׂרָאֵל יְהֹוָה אֱלֹהֵינוּ יְהֹוָה ׀ אֶחָֽד׃
וְאָהַבְתָּ אֵת יְהֹוָה אֱלֹהֶיךָ בְּכׇל־לְבָבְךָ וּבְכׇל־נַפְשְׁךָ וּבְכׇל־מְאֹדֶֽךָ׃
头像
ubuntu777
帖子: 249
注册时间: 2007-03-28 18:40

Re: 计算机那点事儿~

#32

帖子 ubuntu777 » 2015-05-13 19:23

为了让JK触发器完成更多的功能。我们继续对它进行加工。
一个重要的功能就是设置Q和Q的值。有的时候,我们需要把Q清零,有的时候要把Q设置为1。大家记得时钟脉冲在JK端为1的时候,只是令到Q和Q原来的值翻转。并不管它们原来是什么值。所以我们要有办法对Q和Q进行设置。
怎么实现?看图:
JK_flip-flop_02.jpg
在JK触发器的中间上下加了两个输入端。上面一个输入端叫PRESET,英文预置的意思。起到的作用是给Q输出端预置一个1值。下面一个输入端叫CLEAR,英文清除的意思。起的作用是把Q输出端的值清零。
当PRESET端的值是0,CLEAR端的值是1时。预置的功能被激活。不管J、K端是什么值,也不管Clk端是什么值,也不管Q端原来的值是什么。Q端的值都会被设置为1。记住PRESET端的功能在低电平的时候被激活。
当CLEAR端的值是0,PRESET端的值是1时。清除功能被激活。不管J、K端是什么值,也不管Clk端是什么值,也不管Q端原来是什么值。Q端的值都会被清零,变为0值。CLEAR端的清零功能也是在低电平的时候被激活。
注意对于这种类型的JK触发器,PRESET和CLEAR不应同时被激活。
大家可以动脑想一下JK触发器各个输入端在不同状况下的相应输出端Q和Q的变化。我们讲过JK端在都是1值的情况下。Q和Q的值会根据Clk端的时间脉冲翻转。如果J为1,K为0时会怎么样?如果J为0,K为1时又会怎么样?是不是也可以用来设置Q和Q的值?如果JK同为0时又会怎么样?想清楚这些对于我们以后继续加工JK触发器有帮助。如果不愿意思考,就要采取记忆的方法,记住各种状况下的输出值。为了鼓励大家思考。先不给出真值表,以后再说。

加了PRESET和CLEAR功能之后,封装起来。还做一点小改变。看图
JK_flip-flop_03.jpg
JK_flip-flop_03.jpg (7.31 KiB) 查看 13187 次
注意PRESET端改为英文简写Pr来代表。CLEAR端改为英文简写Cl来代表。而且在接入之前加了一个小圈。代表通过一个非门电路把原来那根线上的值反转后再输入。因为PRESET和CLEAR功能都是低电平的时候被激活。而且两端不能同时为低电平激活状态。这样处理之后,接入的线在低电平的时候,被反转为高电平。可以保持JK触发器正常使用。如果需要PRESET预置Q为1,就通过上面那根线发一个高电平过来,反转为0,激活功能。如果需要把Q端的值清零,变为0值。就往下面那根线发一个高电平信号,反转为0值,进入CLEAR端,激活功能。
שְׁמַע יִשְׂרָאֵל יְהֹוָה אֱלֹהֵינוּ יְהֹוָה ׀ אֶחָֽד׃
וְאָהַבְתָּ אֵת יְהֹוָה אֱלֹהֶיךָ בְּכׇל־לְבָבְךָ וּבְכׇל־נַפְשְׁךָ וּבְכׇל־מְאֹדֶֽךָ׃
lord007
帖子: 555
注册时间: 2009-07-13 21:54

Re: 计算机那点事儿~

#33

帖子 lord007 » 2015-05-17 10:33

数字电路 + 计算机组成实例,知识量有点大 :em06
南无阿弥陀佛
头像
ubuntu777
帖子: 249
注册时间: 2007-03-28 18:40

Re: 计算机那点事儿~

#34

帖子 ubuntu777 » 2015-05-17 21:52

继续加工JK触发器。

大家如果在第一次介绍JK触发器的时候就动脑思考过JK触发器的功能。可能会有一个想来想去头晕的地方。在JK端都是1值时,当CLK端的值是1的时候,Q和Q的值会发生翻转。但是一旦翻转了,翻转之后值通过接在Q和Q上的两根电线返回输入端。又会导致下一次翻转,这样翻来翻去可能翻很多次。怎么知道Q和Q最终停留在哪一个值上面?
为了解决这个问题,一个办法就是做一个叫主从触发器(Master-Slave flip-flop)的东西。看图:
JK_flip-flop_04.jpg
左边一部份叫主触发器(Master flip-flop),右边一部份叫从触发器(slave flip-flop)。注意时钟脉冲Clk端通过了一个非门电路接入从触发器。最后从触发器的输出端Q和Q返回接入最开头的两个与门电路。
如果根据第一次给出的图,思考过JK触发器的工作原理。就会知道,当Clk端的值是1时,会翻转Q和Q的值。在Q和Q的值被翻转之后。这两个改变之后值通过两根电线返回到输入端,会因为Clk端的值是1,就再次翻转。造成最后的结果不确定。
经过图中主从触发器的方式处理之后。如果JK端的值都是1的状况下,当Clk端的值是1的时候。会翻转主触发器输出端的值。主触发器的输出端做为从触发器的输入端的值。虽然发生了翻转,但由于从触发器的Clk端的是经过一个非门电路接入。这个值是0。在Clk0值的时候,输出端Q和Q不发生改变。既然没有改变。返回到主触发器的值也不变。就不会导致再次翻转。
当时脉冲Clk端从1变为0值的时候。从触发器的Clk输入端因为非门电路变为1。这个时候Q和Q的值才会根据上次主触发器输出端的值发生改变。这个改变之后Q和Q值。虽然通过两根线返回到了主触发器的输入端。但由于主触发器Clk端的值是0。所以并不会影响到主触发器的输出端,也就是从触发器的输入端。虽然从触发器的Clk端是1值。但由于输入端的值没有发生改变。所以也不会发生多次翻转。
大家如果思考过上次提出的关于JK触发器的JK端是01或10时,输出端Q和Q会发生什么改变的问题。就会发现JK端在01和10时也和PRESET和CLEAR端一样可以设定Q和Q的值。唯一不同之处在于PRESET和CLEAR在任何时候都可以设定Q和Q的值。JK端的值一定要在Clk端是1值时,才能把数值传送到Q和Q端。JK端01和10的翻转,在Clk是1时,才能造成Q和Q翻转。在Clk是0值时,就不能影响Q和Q的值。这个从触发器,就是利用这种原理工作。

动脑的坏处就是想问题的时候可能会头晕,混乱。动脑的好处就是可以享受解决问题之后的快乐。而且一旦知道如何解决问题。这个知识就会牢固地被记住,掌握。还有一个重要的好处就是,仔细思考的各种问题,诚实面对,还能找到出解决方法的话。那么你的知识就会在实际中发生作用。解决问题一个重要的前提是首先要知道问题是什么。

还有一个解决触发器多次翻转问题的方法是把时钟脉冲变成一个尖峰值进入触发器。
看图:
JK_flip-flop_05.jpg
JK_flip-flop_05.jpg (2.54 KiB) 查看 13015 次
左边是一个正常的时钟脉冲波形图。高电平1值要持续一段时间,然后变低电平0值,再持续一段时间。右边是经过处理之后的时钟脉冲。波形图变成上面一个尖,下面一个尖。1值就只有一个很短的时间,刚好导致Q和Q的值改变就可以。等到Q和Q改变之后,通过电线返回到输入端。再想翻转。这个1值就没了。等过了1值持续的时间,再下面冒出一个尖。代表0值到了。可以触发需要低电平触发的电路。
שְׁמַע יִשְׂרָאֵל יְהֹוָה אֱלֹהֵינוּ יְהֹוָה ׀ אֶחָֽד׃
וְאָהַבְתָּ אֵת יְהֹוָה אֱלֹהֶיךָ בְּכׇל־לְבָבְךָ וּבְכׇל־נַפְשְׁךָ וּבְכׇל־מְאֹדֶֽךָ׃
头像
ubuntu777
帖子: 249
注册时间: 2007-03-28 18:40

Re: 计算机那点事儿~

#35

帖子 ubuntu777 » 2015-05-17 22:06

lord007 写了:数字电路 + 计算机组成实例,知识量有点大 :em06
可以说相当大。不过即使是初中生的知识为基础的人。用几个月的时间就可以到可以理解CPU架构是怎么回事,可以理解计算机低层代码工作原理。对于致力于CPU设计、操作系统设计开发、计算机语言、编译器设计开发、计算机安全方面的学习和工作。都是一个很好的基础。也算是超级快。
שְׁמַע יִשְׂרָאֵל יְהֹוָה אֱלֹהֵינוּ יְהֹוָה ׀ אֶחָֽד׃
וְאָהַבְתָּ אֵת יְהֹוָה אֱלֹהֶיךָ בְּכׇל־לְבָבְךָ וּבְכׇל־נַפְשְׁךָ וּבְכׇל־מְאֹדֶֽךָ׃
头像
ubuntu777
帖子: 249
注册时间: 2007-03-28 18:40

Re: 计算机那点事儿~

#36

帖子 ubuntu777 » 2015-05-20 13:44

以前讲过把JK触发器的JK端输入值固定为1,然后把几个JK触发器连起来,形成计数器。输出端的值由二进制数字0000开始,每次加1,一直加到1111。然后通过对这个二制数字解码。在编号为X0、X1、X2、X3的四个输出端上,让4个不同的时间分别对应一个输出端输出一个高电平。如果把每根线上高电平想象成这根控制线上的一个灯亮。最后的效果就是一个灯由0开始亮,然后移动到1、2、3。
现在可以利用JK主从触发器,把它们接特定的方式连接起来形成这个效果。
连成的东西叫环形计数器。看图:
JK_flip-flop_ringcounter_01.jpg
一共是六个带有CLR端,具有清除功能的JK主从触发器,连接起来。注意最右边一个JK触发器是反的。输入端Q和输入端K在上面,输出端Q和输入端J在下面。T1-T6分别代表6个不同时间的输出端。除了最右边的T1连在Q端上,其它T2-T5五个输出端都连在Q上。把一个同样的CLK时间脉冲分别接入每个JK触发器的CLK端。这样形成的效果就是除了最左边的那个JK触发器,其余每一个JK触发器的输出端的值会在时钟脉冲为高电平的时候,传递到它左边JK触发器的输出端。最左边的JK触发器输出端的值,反过来接在最右边的JK触发器上,注意也是反接的。Q接K,Q接J。
所有一根线标有CLR通过每个JK触发器的一个非门电路之后,接入CLR端。因为JK触发器的清除功能是在低电平的时候被激活。所以这根线上有标号上有上划线Q,表示和正常的CLR取值相反时达到清除功能。如果线上有高电平信号,就把所有JK触发器的Q端清零,也就是把Q设置为1。
这样,当所有JK触发器输出端Q被清零后。最右边反过来连接的JK触发器的Q的1值,就会随着时间脉冲变化,被一个接一个往右传。最左边的一个JK触发器的0值也会传过来。由于T1接的是Q端。为达到把0值传到Q的目的,所以最右边的Q是反过来接J,Q接K。
这样就形成根据时间脉冲,一个高电平信号从T1一步一步移动T6,然后再返回T1的循环效果。
每两组JK触发器的上面标有74107的标号。这种两个一组的JK触发器是一种标准的电路,编号叫74107。
这个环形计数器要用在我们最后组装完成的计算机上。C36、C37、C38就是在这个计算上用到的芯片(Chip)编号。大家如果学懂了又有兴趣和一定的经济能力,可以自己购买这些电路组装一个初级的计算机。
74107的实物图片
JK_flip-flop_74107_01.jpg
JK_flip-flop_74107_01.jpg (11.22 KiB) 查看 12853 次
74107内部结构图
JK_flip-flop_74107.jpg
JK_flip-flop_74107.jpg (16.17 KiB) 查看 12853 次
大家看上面的带清零功能的双JK触发器编组的74107的实物,数一下这一面有七个脚。另一面也同样是七个脚。共有14个脚都有编号。我们上面的环形计数器图中标的1、2、3、4、5、6、8、9、10、11、12、13共12个数字就是代表这脚的接线方式。注意没有7号脚和14号脚。7号脚是接地脚,14号脚接一个+5V的高电平电源。我们讲用二极管做逻辑门电路的时候讲过,二极管和三极管都必须有电源的接入才能实现运算功能。所以在实际组芯片的过程中除了要知道参与运算的脚怎么接,接电源的脚在哪里,怎么接,也必须知道。

主从触发器不但是解决了输出端多次反转的问题,而且解决了当CLK端高电平到来时,JK输出端一方面要把原来的值传到Q和Q,同时又被传入新值改变时引起的混乱。

大家看到74107的实物大概一个小手指头大。在现代CPU中的触发器非常之小。懂得数字电路的功能,不仅仅是开发CPU这么复杂庞大的事情。简单的几个触发器,逻辑运算、存储单元,在现实中就可以实现很多的自动化智能功能。比如民用的遥控器,智能冰箱,电饭煲,热水器,血压器,手机,对讲机,收音机,智能机床,智能工程机械,流水线,智能玩具,娱乐影音数码设备,控制,以及对各种传感器连接进行智能控制和数据处理收集等方面的运用。

扎实的基础知识是创造性工作的源泉之一。另外的源泉就是对周围事物的关心,可以谦卑地去服务他人的爱心和灵感。真正有意义的东西不是可以通过刺激别人和自己对名利狂热而得到。子曰:仁者必有勇,勇者不必有仁。孔子说:真正有仁爱之心的人,必然会有行动的勇气。行为很勇猛的人不一定有仁爱之心。勇于行又无仁心的人会对自己、他人和社会造成什么呢?
שְׁמַע יִשְׂרָאֵל יְהֹוָה אֱלֹהֵינוּ יְהֹוָה ׀ אֶחָֽד׃
וְאָהַבְתָּ אֵת יְהֹוָה אֱלֹהֶיךָ בְּכׇל־לְבָבְךָ וּבְכׇל־נַפְשְׁךָ וּבְכׇל־מְאֹדֶֽךָ׃
头像
ubuntu777
帖子: 249
注册时间: 2007-03-28 18:40

Re: 计算机那点事儿~

#37

帖子 ubuntu777 » 2015-05-24 19:25

今天的内容非常少。加工我们讲过的JK触发器组成的同步计数器。做成我们要组装的计算机中的程序计数器(Program Counter)。

看图:
program_counter_00.jpg
和我们以前用JK触发器做的同步计数器基本一样。只有一点小小的改变。同步计数器中的JK端的值恒定为1。这样它会在时间脉冲高电平的时候自动加1。图中所有的JK触发器的JK端连到一个COUNT的线上。当COUNT线上给一个高电平1的时候。计数器四个输出端代表的4位二进制值会在一个时间脉冲高电平时增加1。如果COUNT不是1。计数器保留原来的值。根据内存地址线取内存中的内容方法讲过了。每次我们把存在内存中的指令数据放到数据线上之后。我们就给COUNT端加一个时间脉冲的高电平。这个程序计数器就会自动加1。当一个指令执行完成之后。我们只要把这个程序计数器的Q0、Q1、Q2、Q3共四个输出端连通到内存地址总线上。这样数据线上又会有第二个指令的内容。要让计算机根据一个二进制数字的指令完成不同的工作。我们要设计出完成不同功能所需要的各种控制线在不同时间段的高电平,低电平状况。然后按不同的功能对指令编码。不同的指令来了,要根据不同的指令解码出确定各种控制线状态来完成各种不同的功能。我们以后会慢慢讲明白。

CLK是有上划线的。代表和普通的时间脉冲相反。在CLK线上低电平时,且COUNT线上高电平1时,计数器加1。

然后,还有一个CLR线。具有计数器清零功能。这根线上高电平时,完成的动作是计算机热重启动。不管现在指令是什么,下一个指令就是计算机0000地址的指令内容被读取执行。

注意最上面编号为C1和C2的两个芯片都是74107。一个74107芯片含有两个JK主从触发器。所以两个74107芯片就一共是四个JK主从触发器,组成我们要使用的4位的程序计数器。每个74107都有编号从1到14的14只脚。其中7号脚接地,14号脚接一个+5V的电源,在图中没有标出。其它各个脚的编号和接线方法在图中都有。
שְׁמַע יִשְׂרָאֵל יְהֹוָה אֱלֹהֵינוּ יְהֹוָה ׀ אֶחָֽד׃
וְאָהַבְתָּ אֵת יְהֹוָה אֱלֹהֶיךָ בְּכׇל־לְבָבְךָ וּבְכׇל־נַפְשְׁךָ וּבְכׇל־מְאֹדֶֽךָ׃
头像
ubuntu777
帖子: 249
注册时间: 2007-03-28 18:40

Re: 计算机那点事儿~

#38

帖子 ubuntu777 » 2015-05-27 22:35

讲主从JK触发器的时候讲到过还有一种用尖峰的高电平值来避免输出端的值多次翻转的方法。这种方式叫边沿触发。现在具体讲怎么让正常波形的时钟脉冲形成很短的一段尖峰的一个方法。

看图:
positive_edge_triggered_edc.jpg
正常的时钟脉冲来了。分成两根线。上面一根通过一个非门电路后进入与门电路;下面一根直接进入与门电路。理论上一个数的非逻辑运算后再和自己进行与逻辑运算,结果只能是0。不会是1。但现实中,这样就把一个很宽的高电平时钟脉冲波形变成了一个很窄的高电平1。

大家看下面的波形图。上面是正常Clk脉冲波形,下面是经过非门电路之后的Clk。注意Clk和Clk并不是Clk的高电平段正对Clk的低电平段。理论上应该是正对。但实际,电流经过非门电路处理要花一点时间。这就造成了一点小小的延后。经非门电路后这一点点小延后余留的高电平就可以和正常Clk令到与门电路输出一个很窄的高电平1波形。就是虚线引下去的那么窄一点。

这一点点同时为高电平的状况出现在正常时钟脉冲变为高电平的初始段。这叫上升沿触发。就是时钟脉冲波形刚升起来变为高电平的时候,对应出现一个很窄的高电平值。

还有另外一种下降沿触发。
看图:
negative_edge_triggered_edc.jpg
就是把上图中与门电路输入端前面各加一个非门电路。就是把Clk已经变成的低电平段和Clk因为处理延后还来不及反转为高电平,保留的同时为低电平0的那一小段。同时反转后,把两个0值都变为1,再同时进与门电路。这样就造成在正常的Clk时钟脉冲刚变为低电平的时候,会出一个窄小的高电平值1。

这个就叫下降沿触发。

在触发器的Clk端采用上升沿触发或下降沿触发要采用不同的符号来表示。看图:
edge_triggered_flipflop_symb01.jpg
(a)中的触发器Clk端有一个小三角箭头的,就是上升沿触发的边沿触发器。
(b)中的触发器Clk端除了一个小三角箭头还有一个小圆圈,这就是下降沿的边沿触发器。

现在的内容越来越重细节。细节是完成实际工作必不可少的环节。细节的东西往往很烦人。我看点击量,读者差不多跑一半了。以前发贴的时候,看前贴差不多是240左右的点击。自从我告诉大家进入处理细节,实战组成计算机阶段,劝大家思考后决定继续攀登还是下山之后。到现在差不多跑了一半人,点击量只有120左右。我想应该每次的内容尽量少,这样大家会有时间思考。如果有复杂、需要时间思考的内容,或者会由周日,周三一周两次新内容,改为一个星期出一个新贴。以免跑得太快,有人掉队。希望大家有很长的时间去回想明白一个小问题。我认为这样是值得的,也是必要的。如果内容很多,大家没有时间去想明白,稀里糊涂被拉着跑就会有人跟不下去。
שְׁמַע יִשְׂרָאֵל יְהֹוָה אֱלֹהֵינוּ יְהֹוָה ׀ אֶחָֽד׃
וְאָהַבְתָּ אֵת יְהֹוָה אֱלֹהֶיךָ בְּכׇל־לְבָבְךָ וּבְכׇל־נַפְשְׁךָ וּבְכׇל־מְאֹדֶֽךָ׃
kin3z
帖子: 56
注册时间: 2011-11-01 14:22

Re: 计算机那点事儿~

#39

帖子 kin3z » 2015-05-29 15:09

写得太好了,必须支持个 :em11
头像
ubuntu777
帖子: 249
注册时间: 2007-03-28 18:40

Re: 计算机那点事儿~

#40

帖子 ubuntu777 » 2015-06-03 20:07

我们以前讲过。数据总线上的数据在接入算术逻辑单元ALU(就是我们讲的加法器)之前,要经过一个缓冲寄存器。大家知道那个加法器。两个数据分别接入两个输入端的电线。然后输出端电线就直接会出结果。如果只有一个数据总线。那么就要缓冲一下,因为输出端的线不能和输入端的线同时接到数据总线上。这样会引起混乱。数据来了,先进入缓冲寄存器。把缓冲寄存器输出端接入ALU的输入端。缓冲一下。然后,ALU的计算结果输出再放到数据总线上。就避免了一条线上在同一时间,即有输入数据,又有输出结果的混乱。
下面就讲如何组成这个缓冲寄存器。要用到和组内存同样功能D触发器。不过,要加工。和组内存的D触发器不一样。
先由一个边沿型触发的D触发器开始。
看图:
edge_triggered_d_flipflop00.jpg
数据输入端D不变。原来的Freeze/Copy#端,用来控制读写功能的线上接入Clk时钟脉冲。其它的逻辑电路变了,不过实现的功能还是一样。在读写控制端是高电平的时候。把D端的数据传到Q输出端。Q是和Q端值相反的一个输出端。Clk线上还有一个东西。一条线旁边一条弧线。表示把正常时钟脉冲信号变为只有一个尖峰的高电平的信号的东西。由于是上升型边沿触发器。所以输出结果只会被时钟脉冲变为高电平瞬间时的D端的值改变。然后,会保持到下一个时钟脉冲高电平来到。
下面是波型图。大家看图:
edge_triggered_d_flipflop00_wave.jpg
edge_triggered_d_flipflop00_wave.jpg (10.6 KiB) 查看 12277 次
看左边第一条虚线的位置。对应Clk时钟脉冲的一个高电平到来。这时候D端是高电平,然后Q端变为高电平。看D端后来在时钟脉冲是高电平的时候,又变成了低电平,然后又变成高电平。因为是边沿触发。输出端Q始终保持那个Clk端高电平刚到来时接收到的1值。没有变化。一直保持到下一个高电平到来。也就是第二条虚线的位置。因为那个时刻D端是低电平,所以Q端被改变为低电平。
这样就可以起到缓冲作用。输出端可以保持住数据线上来的值,持续提供给ALU的输入端,让ALU中的电路可以稳定计算。不会受到后来数据总线上值变化的干扰。
שְׁמַע יִשְׂרָאֵל יְהֹוָה אֱלֹהֵינוּ יְהֹוָה ׀ אֶחָֽד׃
וְאָהַבְתָּ אֵת יְהֹוָה אֱלֹהֶיךָ בְּכׇל־לְבָבְךָ וּבְכׇל־נַפְשְׁךָ וּבְכׇל־מְאֹדֶֽךָ׃
头像
ubuntu777
帖子: 249
注册时间: 2007-03-28 18:40

Re: 计算机那点事儿~

#41

帖子 ubuntu777 » 2015-06-07 19:46

继续加工D触发器。
看图:
edge_triggered_d_flipflop01.jpg
加了CLEAR端和PRESET端。这样的电路加入之后。不管D端和CLK端是什么值。只要CLEAR端为低电平0的时候。Q端值为0,低电平。PRESET端为低电平的时候,Q端值为高电平1。如果CLEAR和PRESET端同为0,会发生混乱现象。所以要注意,这两根线不能同时为零值。

装好之后,打包封装起来。看图
edge_triggered_d_flipflop02.jpg
edge_triggered_d_flipflop02.jpg (5.47 KiB) 查看 12133 次
这个就是边沿触发的D触发器的符号。CLK端有一个小三角。代表上升型边沿触发的触发器类型。

把几个这样的上升沿触发器组合起来,就形成可以缓冲多位数据的缓冲寄存器。
看图:
bufferregister_00.jpg
就是这样连接。一共是四个。每个D端分别接收X0、X1、X2、X4。只要一个4位的数据在时钟脉冲刚变为高电平的时候被放在数据线上。那么这个值就会被保持在Q0、Q1、Q2、Q3,提供给别的电路使用。可以一直保持到下一个时钟脉冲高电平的到来。在两个时钟脉冲高电平之间的一段时间内,不管数据线(就是X0、X1、X2、X3端)的值再发生什么变化。都不会影响到Q的值。这样就起到了数据缓冲的作用。数据保持在这里提供给ALU(算术逻辑单元,就是我们讲过的那个全加器)计算用。数据线相当于可以空出来放别的数据。比如计算结果。这个结果又可以被其它连接到数据线上的存储器保存下来。
这个寄存器,就起一个临时缓冲作用。如果没有缓冲,数据直接进全加器输入,全加器的输出结果也放到数据线上。结果影响到数据线上数据变化,又影响全加器输入端,又导致输出变化。这样就会造成混乱。不断循环,没有一个稳定输出结果。
为了使缓冲寄存器和整个计算功能协调,我们还要继续加工它。加上数据清零和输出、输入控制端。如何实现,我们下次再讲。
שְׁמַע יִשְׂרָאֵל יְהֹוָה אֱלֹהֵינוּ יְהֹוָה ׀ אֶחָֽד׃
וְאָהַבְתָּ אֵת יְהֹוָה אֱלֹהֶיךָ בְּכׇל־לְבָבְךָ וּבְכׇל־נַפְשְׁךָ וּבְכׇל־מְאֹדֶֽךָ׃
头像
ubuntu777
帖子: 249
注册时间: 2007-03-28 18:40

Re: 计算机那点事儿~

#42

帖子 ubuntu777 » 2015-06-10 21:34

继续加工缓冲寄存器。看图:
bufferregister_01.jpg
加了两个控制端。下面一个是CLR控制端。我们讲过把一个D触发器Q输出端置0的CLEAR端。4个连在一起。一个信号就可以把寄存器中的值清零。
上面一个是LOAD端。注意一根线,分成了两根。最上面一个LOAD加了一个非门电路。这样LOAD端的信号过来,一个保持原有值。这个LOAD上就是和它相反的值。
两根线分别接入一个与门电路。与门电路有两个输入端,一个控制端可以起到屏蔽功能。如果一端是0值,不管另一端是什么值。输出都是0。两个与门电路的另一个输入端,一个接到D触发器的输出端Q,另一个接到输入端X。这样就可以通过LOAD端的信号,来切换D触发器的输入值。如果屏蔽Q,就放行X。寄存器就接受新值。如果放行Q,就屏蔽X。寄存器就保持原值。
这样LOAD端的就可以用来控制这个寄存器是否接受新值。
有了清零和输入控制功能还不够。还要控制输出。
继续改造。看图:
bufferregister_02.jpg
在每一根输出线上都加了一个三态门电路。四个三态门电路的控制端都连到一根线ENABLE上。三态门的功能大家还记得吧。就是控制端上有电就连通,没电就断开功能。这样就可以控制住输出,让特定的寄存器里面数据在需要用的时候,才放到到数据总线上面。寄存器在不用的时候,可以保持住自己各自的值的同时不会影响到数据总线上正在使用的数据。

加工完成。下面看看寄存器们可以怎么连到数据总线上。
看图:
bufferregister_03.jpg
编号为A、B、C、D的四个东西。每一个就是一个打包好的4位寄存器。打包完成,上面是4位二进制数据输入端,下面是4位二进制数据输出端。旁边三个控制端,编号前加L的是LOAD端,控制输入。编号前加E的是ENABLE端,控制输出。CLK端是时钟脉冲信号。前面有一个小尖,代表上升沿触发的寄存器。
中间四根编号为w0、w1、w2、w3是传输4位数据的数据总线W bus。

好了,现在大家知道CPU里面的寄存器怎么工作了。大家可以思考一下,怎么在寄存器之间传送数据。比如怎么把寄存器A中的数据移动到寄存器B。其实设置一下各个控制端的值就可以。要怎么设置各个寄存器的L端和E端的值?数据在时钟脉冲在什么状态的时候可以传送过去。数据总线什么时间可以空出来,完成其它的工作?现在思考一下这些问题,以后讲指令编码的时候会有帮助。
שְׁמַע יִשְׂרָאֵל יְהֹוָה אֱלֹהֵינוּ יְהֹוָה ׀ אֶחָֽד׃
וְאָהַבְתָּ אֵת יְהֹוָה אֱלֹהֶיךָ בְּכׇל־לְבָבְךָ וּבְכׇל־נַפְשְׁךָ וּבְכׇל־מְאֹדֶֽךָ׃
头像
ubuntu777
帖子: 249
注册时间: 2007-03-28 18:40

Re: 计算机那点事儿~

#43

帖子 ubuntu777 » 2015-06-14 23:02

由四个上升沿触发的D触发器组成4位寄存器也是一种标准的电路。编号是74LS173。
就是这个东西。看图:
74ls173_01.jpg
74ls173_01.jpg (12.31 KiB) 查看 11727 次
数一下,一边有8只脚。另一边也是8只。一共16只脚。
从1-16每只脚都有编号。看图:
74ls173_00.jpg
74ls173_00.jpg (26.63 KiB) 查看 11727 次
1号2号。Output Control就是用来控制输出端的。也就是我们讲的ENABLE端。这里分成两只脚,允许双重控制。分别通过非门电路,然后再接入一个与门电路,然后再接入。起到的作用是两个脚都是0的时候,输出信号是接通的。有一个不是0值。寄存器的4位输出端就全部断开。在使用的时候,如果只有一路控制。就把1、2两个脚连在一起接到一个控制端上。如果不需要控制输出。把两个脚接到保持低电平地线上。那么输出值总是在连通状况。
3、4、5、6四个脚。Output就是寄存器的输出端。也就是里面4个D触发器的Q端。
7号脚是Clock。接时钟脉冲信号。
8号脚是GND,表示地线。接低电平。
9、10号脚。Data Enable Input。用来控制数据输入端的。相当于我们讲的LOAD端。也是可以双重控制。如果不需要双重控制。就把两个脚接到一起。接到LOAD上,就起到控制寄存器数据输入端是否接收新数据的作用。
11、12、13、14是Data Input就是数据输入端。就是里面4个D触发器的D端。可以输入4位数据。
15号脚Clear。起到清零的作用。把寄存器的值置0。
16号脚Vcc。接5V电压的高电平。

这个74LS173,如果两个连在一起用。就是一个8位的寄存器。在组建的计算机中,我们要用它来做缓冲寄存器、累加器、指令寄存器、输出寄存器(输出脚高电平时是有电的,每只脚接一个灯泡,就可以表示2进制结果,让人看见。)。

下面就是输出寄存器的用法:
output_register_00.jpg
两个74LS173连在一起用。可以输出8位的数据。

先看最下面编号3、4、5、6的脚就是输出端。接的R0-R8表示8个电阻(Resistor),其实就是8个灯泡。电线上的用电器就叫电阻。电阻另一端接一个二极管,然后接到低电平地线上。最下面倒三角形状的三根短线表示地线。大家知道手电筒的灯泡,一端接电池的正极高电平,另一端要接上电池的负极低电平后,灯才会亮。如果两头都接负极低电平就不会亮。这样,当输出端是高电平1的脚上灯泡就会亮,是0的脚就不亮。
在计算工作完成之后,把想让人看到的结果放入这个寄存器,就可以了。
做为输出寄存器。不需要控制输出端。也不用清零。所以1、2号脚加一个非门路后,和8号接地脚,15号清零脚一起接到计算机的接地端。
9、10号脚,LOAD线一分为二,通过非门电路后接入9、10,控制输入。数据总线上会有很多的计算过程的数据,中间数据、指令等等。所以,在最后的输出结果放到数据总线上的时候,才让输出寄存器接收新数据。
11-14号脚,接X0-X7共8位数据总线。
这个8位输出寄存器共控制8个灯,非常少。

现在使用的计算机显示器由很多灯组成。比如分辨率为1024×768。就相当于由1024列,768行组成的一共有1024*768个灯的阵列。每个可控制的小灯非常之小,就是一个小亮点,所以称为像素。其实本质上也是一个灯。显示器要通过计算机的显存的内容来显示屏幕图像。显存就相当于我们这个输出寄存器。

如果只控制灯的开关,就只能有黑白屏幕。要控制颜色的话,就会更加复杂。需要更大的数据区别颜色的不同,就要更大的显存容量。
שְׁמַע יִשְׂרָאֵל יְהֹוָה אֱלֹהֵינוּ יְהֹוָה ׀ אֶחָֽד׃
וְאָהַבְתָּ אֵת יְהֹוָה אֱלֹהֶיךָ בְּכׇל־לְבָבְךָ וּבְכׇל־נַפְשְׁךָ וּבְכׇל־מְאֹדֶֽךָ׃
头像
ubuntu777
帖子: 249
注册时间: 2007-03-28 18:40

Re: 计算机那点事儿~

#44

帖子 ubuntu777 » 2015-06-28 18:55

经过一段时间的电路组装。现在要学一点数学方面的知识。因为我们要加工一下全加器。让它还可以做减法的运算。要不然计算机CPU中的ALU(Arithmetic Logical UnitAri-算术逻辑单元)太简单了。另外,加一个功能后,我们以后还可以学到如何设计电路,在程序中利用不同的代码选取不同的计算功能。
计算机的减法功能其实是用加法的方式实现减法运算。
怎么实现?要学习一点补码的知识。
什么是补码?首先看一个钟的图。
clock00.jpg
钟面的圆周被划分为不同的位置可以代表60分钟。分针指到第一位,也就是正对12点钟的那个位置。可以代表第0分钟,也可以代表第60分钟。
我们利用钟面的分针来做加法运算。就是把分针按顺时针方向拨动。如果算10+5。先把钟的分针指到10分钟的位置。然后,顺时针拨动5格。结果就是指向15分钟的位置。得出答案15。
如果计算10+55。分针先放到10分钟的位置,然后顺时针方向拨动55格。大家看看会出现什么结果?分针指到第5分钟的位置。没有得出加法的结果。反而是得出10-5的结果。
因为这样的现象,就可以利用加法方法,进行减法运算。
一个钟面上原本从0到59共有60个位置。代表0~59共60个数字。现在用0~29的位置还是代表0~29这30个数字。30~59的位置代表-30到-1共30个负数。
这样我们就可以完成减法运算。如果要减1就相当于加59,如果要减2就相当于加58。
这样数字1,对应的补码就是59。数字2对应的补码就是58。如果要进行减法运算。我们只需要把数字1变成59。原本做加法操作方法不变。还是把分针往前拨动59格。就可以得出减法的结果。
对于计算机来讲,我们要实现减法功能。通过一个信号,把原来的数字变成它的补码后,再送进全加器。做的还是加法运算。但得出的结果就是减法的结果。
大家思考一下计算机的电路在处理减法时可能遇到的问题。我们下次再详细介绍怎么具体实现。
比如时钟按60分钟取补码。计算时可以自动去掉加超过的60分钟。加超了就回到0。得到减法结果。二进制电路怎么去掉?应该按多少取补码才合理?
本来考虑有些读者需要中考,所以停了两期。后来又因为本人牙疼,疼得头晕脑涨,过了一周才好些。期间基本无法安静思考写东西。所以又停了几期。事发突然,也没有提前通知大家。非常抱歉。 :em06
שְׁמַע יִשְׂרָאֵל יְהֹוָה אֱלֹהֵינוּ יְהֹוָה ׀ אֶחָֽד׃
וְאָהַבְתָּ אֵת יְהֹוָה אֱלֹהֶיךָ בְּכׇל־לְבָבְךָ וּבְכׇל־נַפְשְׁךָ וּבְכׇל־מְאֹדֶֽךָ׃
头像
ubuntu777
帖子: 249
注册时间: 2007-03-28 18:40

Re: 计算机那点事儿~

#45

帖子 ubuntu777 » 2015-07-05 22:52

大家了解了补码用来做减法的道理之后。我们来研究一下二进制数字补码的状况。
看图:
comp00.jpg
comp00.jpg (8.47 KiB) 查看 10620 次
一个数轴。中间是0。左边负数,右边正数。下面是十进制正负数字。
上面对应的是二进制。
0000的右边是对应的二进制数字。左边对称的是表示负数的补码。
0001的补码就是1111表示-1。相应0010对应1110表示-2,0011对应1101表示-3。
计算一下。-1和+1对应的二进制数字相加是10000,-2和+2相加也是10000,-3和+3相加也是10000。如果把最高位去掉。结果就是0000。代表零。相应于那个钟面算法的时候自去减去60。二进制算法的时候,只要去掉最高位的1。余下的位数结果,就代表计算结果。
比如算2-1。就让代表2的二进制数字0010加上代表1的0001的补码1111。0010+1111=10001。然后去掉最高位的1。剩余下来的4位二进制是0001。就是代表1。得到2-1=1的结果。
要计算二进制的减法。做的事情就是把需要减的二进制数变成它的补码,然后再送进全加器的输入端就可以了。
怎么把一个二进制数字变成它的补码?大家看一下。每一个四位二进制数字和它的补码相加之后,结果都是10000。大家记得我们在讲全加器的时候,讲过一个异或门的电路。异或门电路的作用就是如果两个输入端的值相同,那么输出结果就是0;如果不同,输出结果就是1。
我们把一个1位的二进数字接入异或门电路一端。
如果另一端是0。那么输出的结果不会改变。
1和0进行异或运算。因为不同,输出结果是1。0和0进行异或运算,因为相同,输出结果是0。
如果另一端是1。那么输出的结果就和原值相反。原来是1,输出变为0。原来是0,输出变为1。
在每一位上使用一个异或门电路来处理4位的二进制数字会怎么样?
异或门另一输入端是0值,输出结果当然还是不变。
如果另一输入端是1的话呢?
0001,每一位都变成相反的值,就成了1110。
0010,就变成1101。0011,就变成1100。
这样的变化之后,还差一点就可以达到我们的使用要求。
一个原来的二进制数字和进行异或门电路处理后的数字相加。
0001+1110。因为每一位都反应,1变0,0变1。相加之后结果是1111。
其它0010+1101,0011+1100,结果也是1111。
和我们要求的4位二进制数字和它的补码相加之后形成10000。剩余4位都是0的结果还差一点。如果把1111再加1,就可以了。结果就是10000。
看图:
adder_sub_00.jpg
就是这样处理。A、B是输入端,FA代表全加器。S是输出端。
B端都通过一个异或门电路接入全加器。所有异或门电路的另一端,连到一个SUB端。注意这个SUB端还有一根线接到了最右边一个全加器的接收进位端。
SUB是英文subtract(减法)的缩写。
如果要进行减法运算。只要把SUB端加一个代表1的高电平信号。那么B端的数字经异或门处理之后,最右边的全加器还可以接收到一个加1。这样输出端S就是A端数字和B端的数字的补码相加的结果。也就是A-B的结果。
如果SUB是0值,那么就是正常的加法运算的结果。
注意最左边的全加器的进位输出端,写有CARRY not used。意思是进位不用。相当于把最高位,也是就第5位的进位值去掉。只保留剩余的4位结果。
שְׁמַע יִשְׂרָאֵל יְהֹוָה אֱלֹהֵינוּ יְהֹוָה ׀ אֶחָֽד׃
וְאָהַבְתָּ אֵת יְהֹוָה אֱלֹהֶיךָ בְּכׇל־לְבָבְךָ וּבְכׇל־נַפְשְׁךָ וּבְכׇל־מְאֹדֶֽךָ׃
回复