红石电路吧 关注:32,301贴子:153,468

回复:计算机组成原理及ProjecRed技术实用教程——从零开始构建计算

取消只看楼主收藏回复

有了以上的理论就可以构造算术单元啦~
实际上,两数相减时,还需要对第二个数求补码,求补的话,至少需要求反,另外我们不仅仅需要加法、减法,还需要增1、减1。增1可以通过低位进位端实现,减一可以通过加负一的补码实现,也就是加全一,
所以综合以上,还需要在输入端加一个实现取反、全0、全1或保持原样的模块。
取反可以用非门实现,然后用数据选择器选择不同的通路,即可实现上述功能。


IP属地:广东35楼2014-10-20 19:48
收起回复

    一个简单的4选一数据选择器和一个加法器就构建出了一个算术单元,神奇吧!
    其中的A和B是8路数据输入,S1、S0和Cin进行功能选择,右侧输出结果。
    实现的功能表很容易写出来:


    IP属地:广东37楼2014-10-20 22:02
    收起回复
      2026-01-08 05:12:19
      广告
      不感兴趣
      开通SVIP免广告
      那么接下来就是逻辑单元了
      逻辑单元最简单了,与或非和异或就够用了吧!
      原理还是一样的,由两路信号输入,通过选择功能,输出结果!
      原理图So easy!

      功能表So easy!


      IP属地:广东38楼2014-10-20 22:21
      收起回复
        接下来就是最最最重要的【ALU】即【算术逻辑单元】了
        说白了就是把算术单元和逻辑单元组合起来~
        分析:算术逻辑单元要实现的功能是对A和B进行特定操作,而进行哪种操作是需要选择的,所以输入端A、B和功能选择端是应该共用的,对于输出端,应该对算术和逻辑两者进行选择。
        ALU电路~

        功能表~


        IP属地:广东40楼2014-10-20 22:45
        收起回复
          八位桶形向左移位器
          可以一次移动0~7位
          需要注意的是连线


          IP属地:广东44楼2014-10-21 00:46
          收起回复
            在以上各个部件的基础上,就能组成一个运算器了,当然这样的运算器还很简单,不过基本的运算能够满足了。

            当然,单有数据输入/输出和功能选择还是不够的,很多时候我们都希望了解运算的状态,如溢出/进位/结果是否为零等,因此还需要添加一些标志的输出。


            IP属地:广东46楼2014-10-21 13:26
            收起回复
              状态标志这里设置了溢出OV、符号SI、进位CA、零ZO。
              其中OV和SI只对算术运算有效,CA对算术和移位运算有效(移出位放入CA),ZO对算术和逻辑运算有效。
              (无效并不意味着输出一定为0)
              另外,将移位器的方向选择线IL,IR并入了S0,S1中,并且添加了一个算术左移(与逻辑左移实质是一样的)和算术右移(最高位不变)。
              溢出OV检测:上面说过可以通过比较源操作数和结果的符号位判定,但是这样电路不容易实现,在这里,采用了对加法器的符号进位和最高进位进行异或运算以实现溢出判定,因此在布线时将加法器拆成了7bit+1bit。1表示溢出。
              符号SI检测:通过检测加法器输出的符号位即可得出符号,为1时表示负数。
              进位CA检测:移位操作移出的位或者是加法器最高位进位,因此需要在不同的操作时选用不同的线路,1表示进位。
              零ZO检测:当输出为零时,所有位一定为零,因此逻辑就是全零得一,可用或非门实现。为1时,表示结果为0。

              功能表:

              至此,一个完整的运算器已经完成好了!


              IP属地:广东48楼2014-10-22 02:23
              收起回复
                【寄存器组】
                PS:各个组件名字叫法可能各种资料上不相同,但一般容易辨别的~
                首先考虑通用寄存器
                对于寄存器,需要实现的基本功能就是写数、储存、读数,一般至少要有输入端、时钟端(异步也有叫送数端)、输出端,另外根据具体情况,可能还需要使能端和清零端。
                注意寄存器的时钟信号(送数信号)必须要是边沿触发的!
                不能用锁存器代替触发器,因为锁存器会有空翻现象,控制时钟必须保持高度一致,对于毛刺(冒险竞争)现象很难处理。
                (PS:好像MC许多人把锁存器当成寄存器了
                (PS2:在MC中,可以用锁存器加一个冲击函数实现寄存器,但是现实当中千万不能这样做,因为MC中有最小间隔时间,而现实中的最小时间是不稳定的)
                这里需要区分寄存器和锁存器,最主要的区别就是寄存器是边沿触发,锁存器是根据电平来送数或保持(也即同步触发)。
                另外还需要区分的是触发方式,可能是由于翻译的原因,国内很多资料对触发方式的叫法不一致,这里列出不同名称的对应关系:
                Latch----锁存器--同步触发器(电平信号激活)
                Flip flop-触发器--边沿触发器(边沿信号激活)
                另外RS触发器=基本RS锁存器
                同步RS触发器=门控RS锁存器
                另外Flip flop在台湾叫正反器。


                IP属地:广东52楼2014-10-22 14:05
                收起回复
                  2026-01-08 05:06:19
                  广告
                  不感兴趣
                  开通SVIP免广告
                  这个是标准的门控D锁存器(同步D触发器),只能用来构造锁存器

                  这是利用门控D锁存器组建的8bit锁存器:

                  不过在MC中,有一个取巧的办法可以将锁存器变成寄存器,那就是在时钟端加一个上升沿检测器


                  IP属地:广东53楼2014-10-22 14:29
                  回复
                    对于寄存器组,由于寄存器共用输入线,需要对寄存器进行选择,选择的寄存器允许送数,其他寄存器不允许送数,所以这里的寄存器单元必须要带有使能端,使能端可以这样构造:

                    在EN=0时,总是保持不变,在EN=1时允许送数。
                    (Logisim的D触发器本身带有使能端,这里为了演示不使用EN端)。


                    IP属地:广东54楼2014-10-22 15:10
                    回复
                      留下两个思考题:
                      一、使能端可以这样构造吗?为什么?

                      二、对于MC,有更简单的方法构造使能端吗?


                      IP属地:广东55楼2014-10-22 15:49
                      收起回复
                        有了以上的基础就可以开始构建寄存器组了!
                        首先,我们考虑对寄存器的写入。
                        需要对寄存器写入,这就需要数据输入端,此外,还需要指定对哪个寄存器写,这可以把多个寄存器编址,用地址来表示一个具体的寄存器,比如四个寄存器可以用两位地址指定一个寄存器,八个需要三位。
                        但如果一个都不写怎么办呢?时钟是不会变的,一旦时钟来了就会写,这时候,使能端就发挥作用了,我们利用使能端结合地址实现指定一个寄存器,利用读写端和使能端结合实现要不要写入。
                        然后考虑对寄存器的读取
                        寄存器的输出端是一个持续不断的输出,而根据前面的运算器,我们需要从寄存器取两个操作数输入运算器,因此,寄存器组需要有两个输出,这两个输出要能够分别选择连接到两个寄存器,也就是要实现选择两个寄存器分别输出到A、B端,这个好解决,两个通道分别设置两个数据选择器,每个选择器能够选择任意的寄存器。


                        IP属地:广东56楼2014-10-22 17:17
                        收起回复
                          补充:寄存器的时钟端是只针对写操作而言的,一旦上升沿到来并且读写端为1且寄存器被选中,那么输入端的数就会送到寄存器中。对于输出端,不管时钟怎样,也不管读写端是0还是1,输出端时时刻刻都是寄存器的值。
                          至此,【通用寄存器组】就构建完成啦


                          IP属地:广东57楼2014-10-22 17:27
                          回复
                            推荐一个棒极了的网站:
                            http://www.nand2tetris.org/
                            这个网站免费提供教学,教学的内容就是从与非门开始构建计算机,一直到写出操作系统并运行一个俄罗斯方块的程序。
                            教学分为13个主题,配有书本、讲座、项目、软件。

                            当然计算机远远没有这么简单,教程注重的是原理,通过一些简单的典型模型来教学,能够让你在短期内了解整个计算机体系的大致结构。


                            IP属地:广东61楼2014-10-23 14:57
                            收起回复
                              2026-01-08 05:00:19
                              广告
                              不感兴趣
                              开通SVIP免广告
                              【控制器】
                              控制器顾名思义,是整个CPU的控制中心,用来控制数据的流向,程序的转移。
                              一般来说,控制器包括程序计数器(PC),指令译码器(ID),有时也将指令寄存器(IR)归入到控制器中。
                              总的控制功能是这样实现的:
                              程序计数器负责保存程序执行到的位置,指令寄存器保存当前指令,指令译码器把指令转化成控制字(控制字后面会将)。
                              首先需要知道指令在哪里:
                              一般来说,程序包括三种结构:顺序、分支和循环,其中分支和循环实际上可以由跳转实现,所以程序的执行方式可以归纳为顺序和跳转,对于顺序执行,只需要对程序计数器每次加一个固定的数即可实现,对于跳转,有两种方式实现,一种是绝对跳转,一种是相对跳转,绝对跳转直接给出下一条指令的地址,对程序计数器直接置数,对于相对跳转,则通过程序计数器加上或者减去某个值实现,一般来说大多数情况下用的是相对跳转。
                              程序计数器可以用寄存器、加法器和数据选择器实现

                              如果要顺序执行,则MUX选择常数01,指令所在地址每次加一
                              如果要跳转,则MUX选择下方的通路,下一条指令地址为当前地址加上偏移量。


                              IP属地:广东66楼2014-10-24 19:55
                              回复