精华内容
下载资源
问答
  • 单枪匹马造出一个CPU乃至完整的电脑需要多长时间?有位大牛在《我的世界》游戏里用实际行动回答了这个问题:可能要花费一年多。 这篇造计算机的教程一经转载就在知乎上火了。 这并不是一篇游戏攻略,而是来自...

                             

    一块小小的CPU里有多少个晶体管?几十亿个。

    单枪匹马造出一个CPU乃至完整的电脑需要多长时间?有位大牛在《我的世界》游戏里用实际行动回答了这个问题:可能要花费一年多

    这篇造计算机的教程一经转载就在知乎上火了。

    这并不是一篇游戏攻略,而是来自复旦大学的季文瀚,写的一篇课程论文。他在大二时就有了大胆的设想,经过一年的精心营造,建起了一个计算机雏形,取名Alpha21016

    虽然它不能与现实中的计算机相比,只能实现一些简单的功能,但这台计算机体积惊人,光看它复杂的结构就已经能感受工程量的巨大。

    有网友感叹,发课程论文可惜了,简直可以发学术论文啊。

    这台计算机能做什么

    季文瀚计算机使用的是哈佛结构,而非更常见的冯·诺依曼结构。程序储存器和数据储存器分开放置。程序储存器1kb,数据储存器0.5kb。

    它可以实现各种函数运算:加减乘除、三角函数还有矩阵运算。它包含一个16bit的CPU和一个32bit的浮点运算单元 (FPU) 。

    从硬件上看,它是个超大规模集成电路,逻辑门总数大概在5万-10万门之间。光是存储器堆叠起来就有8层。

    要造出这样一台计算机,数字电路、微机原理、汇编语言、编译原理都不能少。想想你挂过哪几门课,从学会到熟练运用就更难了。

    有了专业知识的支持,就能将计算机拆解成基本的部件。

    我们都知道计算机的基础是数字电路,数字电路的基础是“门”,季文瀚用游戏里基本的“红石电路”搭建出了逻辑门。

    从逻辑门出发,再搭建出组合电路、时序电路、触发器,有了这些就能组成CPU的一些基本单元,最终造出整个计算机。

    现实世界中,晶体管是数字电路的基础;在《我的世界》中,红石电路是构成复杂电路的基本单元。

    红石电路玩家,只用火把和方块,就能造出基本的逻辑门:或门和非门。或门和非门的组合可以造出与门、异或门等任意逻辑门。

    但仅仅知道怎么制造逻辑门离造出计算机还很远,可能大致相当于造出汉字笔画到写出《红楼梦》的距离。

    季文瀚先给自己的CPU架构画了一个草图:

    其中每一个方框都代表一个或若干个硬件单元,小一点的大约一两百个门电路,大的有几千个门电路。这个密密麻麻的部分,也只是架构的右半部分而已:

    知道了CPU的基本架构,再按照架构图分别造出每个部分,比如CPU的重要模块“算数逻辑单元”(ALU)和“指令寄存器”(IR),工程量很大。

    算数逻辑单元还能进一步拆解,它的加法器由数个全加器组成,上面基本的逻辑门可以组成加法器中最基本的全加器 (下图) 。

    全加器也是计算机的一个核心部件。

    同时,《我的世界》还提供的基于活塞机械的断路,用信号控制电路的通断,也就是继电器。利用继电器和逻辑门的组合可以造出存储器。

    计算器→单片机→计算机

    大概是因为太复杂,季文瀚一开始也没想直接搭个计算机。

    最初,他的目标是造出一台16 bit的简单计算器。

    但做到一半,他就觉得可以实现更复杂的东西,于是想改成单片机:这是具有“图灵完备性”,可以执行一切计算机程序的简单计算机。

    他规划了指令集架构,储存器架构,以及指令发射方式等等。

    后来,触发器、可读写储存器、缓冲队列等等重要电路,季文翰都设计成功了。

    有了这些,少年又做了更雄伟的计划:做个16 bit 的 CPU

    CPU旁边,还有一个包含超越函数的单精度32 bit浮点处理器 (FPU) 。

    这里,计算器作为片外系统,并没有被抛弃。季文翰把16 bit计算器,改成了完全时序逻辑电路控制、且有溢出判断的计算器——这在Minecraft红石电路玩家里,已是前所未有

    它借用CPU的ALU部分进行运算,并经过总线传输数据。

    CPU和计算器的大部分硬件,都在这张表格里:

    表上的40个硬件,除了指令译码器、指令发射端、异常中断响应没有做完,其他都做好了。还有一些小的硬件单元没有列出来。

    目前,CPU的ALU、主储存器、和寄存器等 EU 部分已经完工,内部环状总线已竣工,CU 部分,也就是最繁琐的部分,还没有完工。

    肉眼可见的威力

    季文翰说,虽然还没完全竣工,但CPU已经可以执行许多种机器指令 (以MOV为主) :通用寄存器赋值,按字/字节+立即数/间接/直接寻址。

    其中,最容易用肉眼感受到威力的,还是借用CPU的ALU完成运算的计算器

    他在视频里展现了加减乘除正余弦,以及平方根的计算。

    从养着小猪的地方走楼梯下来,就是计算器的所在地了。这里有两排按钮,还有显示屏,如上图。

    屏幕后面,可以看到运转的电路。

    先做加减乘除。比如加法:

    减法也是同理。只不过,负号和减号在这里分成了两个按钮。

    乘法和除法的运算量比较大:三位数乘三位数,大概需要20秒;除法更慢一些,电脑还会卡。

    下图就是除法,因为打了反除号 () ,所以被除数在右边。左下是商,右下是余数。

    空间限制了算力,所以计算器要有溢出判断,超过±32627的范围就会报错,显示“E”。

    不论是输入的数还是计算结果,超出范围都会报错:

    除以“0”,也会报错。

    注意,计算机用二进制来计算,算好之后还要从二进制转成十进制,才是最终的答案。这里用到了 BCD/BIN 转换算法,把二进制BIN码,转成十进制BCD码。

    四则运算做完了,还有正余弦,用的是Cordic旋转迭代算法:

    需要多次迭代,所以运算比较慢,大概花了两分钟。

    相比之下开根号就快许多,用的是快速平方根算法:

    20秒 (就) 开好了。

    计算能力就展示到这里。

    而机智的你可能已经也感受到了,显示器对于一台计算机有多重要。那么:

    显示器怎么做?

    游戏空间太狭窄,造显卡是不现实的:2×2个红石灯,就是游戏能控制的最小像素了。

    所以,季文翰做了字符显示器。

    首先,用七段显示器来表示数字。

    一个“日”字,是7根小棒组成的

    比如,“4”就有左上、右上、中、右下,一共四根小棒。

    每根小棒又由三个方块组成。把这些方块的活塞往回抽,就显示出凹陷的“4”了。

    而每个十进制数,都可以对应二进制的四位数,比如3是0011,9是1001。输入二进制数,屏幕就能显示成十进制。

    数字搞定了,还有其他字符。季文翰用了自己设计的缩减版ASCII码,只有不到64个字符:

    给每个字符编个号:0,1,2,…,63。每个号码,都可以转成二进制数00000-111111。

    然后,显示出来长这样:

    打开夜视,萤火一般,美不胜收。

    其实,这些字是“印”在了显示器的键盘上,白天长这样:

    也就是说,计算机有了,显示器有了,键盘也有了。

    而这样的杰作,居然来自一位“业余选手”。

    “我学的不是计算机”

    现在来回顾一下,从逻辑门到计算机,都要经历什么:

    或门,非门

    →与门,异或门

    →全加器,信号长度转换器,多态选择器,储存器单元,译码器单元,求补码单元,移位器单元

    →可读写储存器,译码器,加法器,移位器,时钟发生器

    →加减法器,乘法器,除法器,可读写储存器阵列,寄存器,程序计数器

    →总线,ALU,CU

    →计算机

    令人意外的是,造出这项复杂工程的季文瀚,是复旦大学2011级生命科学学院的本科生,没有受过系统地计算机科学专业教育。他说,看到国外玩家的作品很感兴趣,才自学了一些专业课。

    大二便启动了Alpha21016计算机的开发,作为《网络虚拟环境与计算机应用》这门课的项目来做的。

    从他对技术细节的解读来看,那时的季文翰,已经硬件和软件上拥有无比充分的准备。

    普通人的话,可能了解逻辑电路的基础。普通红石玩家的话,可以把逻辑电路的基础知识,用来搭建简单或复杂的红石电路。

    高阶红石玩家,也曾经在季文瀚的项目开始之前,造出过计算器。

    但制造一台计算机,并没有多少人敢想。季文翰不但想到,还用了一整年去实现,几近完成。

    毕竟,如果有个容量惊人的大脑,总归要拿来用的吧。

    技术博客原文传送门:

    http://blog.renren.com/blog/263123705/911088369

    一期视频传送门:
    https://v.youku.com/v_show/id_XNTkyNTg0NTEy.html

    二期视频传送门:
    https://www.bilibili.com/video/av4221161/

    相关阅读

    计算机存储技术入门

    一步步做个集成电路(IC)

     --------  END  ---------

    程序员成长充电站

    长按扫码关注,每天一分钟学习计算机最基础的知识和原理  

            朕已阅 

    展开全文
  • 单枪匹马造出一个CPU乃至完整的电脑需要多长时间?有位大牛在《我的世界》游戏里用实际行动回答了这个问题:可能要花费一年多。这篇造计算机的教程一经转载就在知乎上火了。这并不是一篇游戏攻略,而是来自复旦大学...
    微信改版,置顶本公众号避免遗漏最新文章!
    栗子 晓查 发自 凹非寺 
    量子位 报道 | 公众号 QbitAI

    3c3d2423f4016432b739b49e28ae5e4e.gif

    一块小小的CPU里有多少个晶体管?几十亿个。

    单枪匹马造出一个CPU乃至完整的电脑需要多长时间?有位大牛在《我的世界》游戏里用实际行动回答了这个问题:可能要花费一年多

    这篇造计算机的教程一经转载就在知乎上火了。

    9c48b37ae3059346a0666214597b49d6.png

    a0d6eb3b6cffc13fb6b42a791d3f6200.png

    这并不是一篇游戏攻略,而是来自复旦大学的季文瀚,写的一篇课程论文。他在大二时就有了大胆的设想,经过一年的精心营造,建起了一个计算机雏形,取名Alpha21016

    虽然它不能与现实中的计算机相比,只能实现一些简单的功能,但这台计算机体积惊人,光看它复杂的结构就已经能感受工程量的巨大。

    有网友感叹,发课程论文可惜了,简直可以发学术论文啊。

    这台计算机能做什么

    季文瀚计算机使用的是哈佛结构,而非更常见的冯·诺依曼结构。程序储存器和数据储存器分开放置。程序储存器1kb,数据储存器0.5kb。

    它可以实现各种函数运算:加减乘除、三角函数还有矩阵运算。它包含一个16bit的CPU和一个32bit的浮点运算单元 (FPU) 。

    7f9ca5e793d7c9086f380da5e5410139.gif

    从硬件上看,它是个超大规模集成电路,逻辑门总数大概在5万-10万门之间。光是存储器堆叠起来就有8层。

    8e0e753a0b5d3fd737a890b316f2c58b.png

    要造出这样一台计算机,数字电路、微机原理、汇编语言、编译原理都不能少。想想你挂过哪几门课,从学会到熟练运用就更难了。

    5abfabac328dc11d606afdd917afd69c.png

    有了专业知识的支持,就能将计算机拆解成基本的部件。

    我们都知道计算机的基础是数字电路,数字电路的基础是“门”,季文瀚用游戏里基本的“红石电路”搭建出了逻辑门。

    从逻辑门出发,再搭建出组合电路、时序电路、触发器,有了这些就能组成CPU的一些基本单元,最终造出整个计算机。

    现实世界中,晶体管是数字电路的基础;在《我的世界》中,红石电路是构成复杂电路的基本单元。

    9fb6546733398422f62fb5da3e101439.png

    红石电路玩家,只用火把和方块,就能造出基本的逻辑门:或门和非门。或门和非门的组合可以造出与门、异或门等任意逻辑门。

    但仅仅知道怎么制造逻辑门离造出计算机还很远,可能大致相当于造出汉字笔画到写出《红楼梦》的距离。

    季文瀚先给自己的CPU架构画了一个草图:

    3f203b8c3340eb4e61997d605669c36d.png

    其中每一个方框都代表一个或若干个硬件单元,小一点的大约一两百个门电路,大的有几千个门电路。这个密密麻麻的部分,也只是架构的右半部分而已:

    61e07936ce8100fe7462cd6a4271bb54.png

    知道了CPU的基本架构,再按照架构图分别造出每个部分,比如CPU的重要模块“算数逻辑单元”(ALU)和“指令寄存器”(IR),工程量很大。

    算数逻辑单元还能进一步拆解,它的加法器由数个全加器组成,上面基本的逻辑门可以组成加法器中最基本的全加器 (下图) 。

    f0214e210810ebfd0f1b7603db48f033.png

    全加器也是计算机的一个核心部件。

    同时,《我的世界》还提供的基于活塞机械的断路,用信号控制电路的通断,也就是继电器。利用继电器和逻辑门的组合可以造出存储器。

    c6ad607930b4944a8215b4edca59f503.gif

    计算器→单片机→计算机

    大概是因为太复杂,季文瀚一开始也没想直接搭个计算机。

    最初,他的目标是造出一台16 bit的简单计算器。

    但做到一半,他就觉得可以实现更复杂的东西,于是想改成单片机:这是具有“图灵完备性”,可以执行一切计算机程序的简单计算机。

    他规划了指令集架构,储存器架构,以及指令发射方式等等。

    后来,触发器、可读写储存器、缓冲队列等等重要电路,季文翰都设计成功了。

    a0224535b1a203624d9538c22ad1f20a.png

    有了这些,少年又做了更雄伟的计划:做个16 bit的CPU

    CPU旁边,还有一个包含超越函数的单精度32 bit浮点处理器 (FPU) 。

    这里,计算器作为片外系统,并没有被抛弃。季文翰把16 bit计算器,改成了完全时序逻辑电路控制、且有溢出判断的计算器——这在Minecraft红石电路玩家里,已是前所未有

    它借用CPU的ALU部分进行运算,并经过总线传输数据。

    CPU和计算器的大部分硬件,都在这张表格里:

    b3cc4121e4659a96db0279f87934f28b.png

    表上的40个硬件,除了指令译码器、指令发射端、异常中断响应没有做完,其他都做好了。还有一些小的硬件单元没有列出来。

    目前,CPU的ALU、主储存器、和寄存器等EU部分已经完工,内部环状总线已竣工,CU部分,也就是最繁琐的部分,还没有完工。

    ee1e723a3f7fc26533b5d052fcffc956.gif

    肉眼可见的威力

    季文翰说,虽然还没完全竣工,但CPU已经可以执行许多种机器指令 (以MOV为主) :通用寄存器赋值,按字/字节+立即数/间接/直接寻址。

    其中,最容易用肉眼感受到威力的,还是借用CPU的ALU完成运算的计算器

    他在视频里展现了加减乘除正余弦,以及平方根的计算。

    9587082774512ac1921cde85ca42e1ab.gif

    从养着小猪的地方走楼梯下来,就是计算器的所在地了。这里有两排按钮,还有显示屏,如上图。

    1bb35a8c4f39201eb25ef80a5524ae31.gif

    屏幕后面,可以看到运转的电路。

    先做加减乘除。比如加法:

    减法也是同理。只不过,负号和减号在这里分成了两个按钮。

    乘法和除法的运算量比较大:三位数乘三位数,大概需要20秒;除法更慢一些,电脑还会卡。

    下图就是除法,因为打了反除号 () ,所以被除数在右边。左下是商,右下是余数。

    38b5919eeb07dc7f70a5d584244c4268.png

    空间限制了算力,所以计算器要有溢出判断,超过±32627的范围就会报错,显示“E”。

    不论是输入的数还是计算结果,超出范围都会报错:

    7c3fbfb51b69162405cdce08008d8e67.gif

    除以“0”,也会报错。

    注意,计算机用二进制来计算,算好之后还要从二进制转成十进制,才是最终的答案。这里用到了BCD/BIN转换算法,把二进制BIN码,转成十进制BCD码。

    四则运算做完了,还有正余弦,用的是Cordic旋转迭代算法:

    f8f3bb1e0be769419bde0cc85411b5da.png

    需要多次迭代,所以运算比较慢,大概花了两分钟。

    相比之下开根号就快许多,用的是快速平方根算法:

    03994b8e02b4c12b95f3c0ea2ec4bf00.png

    20秒 (就) 开好了。

    计算能力就展示到这里。

    而机智的你可能已经也感受到了,显示器对于一台计算机有多重要。那么:

    显示器怎么做?

    游戏空间太狭窄,造显卡是不现实的:2×2个红石灯,就是游戏能控制的最小像素了。

    所以,季文翰做了字符显示器

    首先,用七段显示器来表示数字。

    edb6eb2018ec40d25b6228d6572f137d.png

    一个“日”字,是7根小棒组成的

    比如,“4”就有左上、右上、中、右下,一共四根小棒。

    每根小棒又由三个方块组成。把这些方块的活塞往回抽,就显示出凹陷的“4”了。

    而每个十进制数,都可以对应二进制的四位数,比如3是0011,9是1001。输入二进制数,屏幕就能显示成十进制。

    数字搞定了,还有其他字符。季文翰用了自己设计的缩减版ASCII码,只有不到64个字符:

    947f2e8a889b55316e47132232fef0d0.png

    给每个字符编个号:0,1,2,…,63。每个号码,都可以转成二进制数00000-111111。

    然后,显示出来长这样:

    2cd5301de3b446eb6082169f96aa4cba.png

    打开夜视,萤火一般,美不胜收。

    其实,这些字是“印”在了显示器的键盘上,白天长这样:

    b3c44a0adf404ba02f1802875464c8ab.png

    也就是说,计算机有了,显示器有了,键盘也有了。

    而这样的杰作,居然来自一位“业余选手”。

    “我学的不是计算机”

    现在来回顾一下,从逻辑门到计算机,都要经历什么:

    或门,非门

    →与门,异或门

    →全加器,信号长度转换器,多态选择器,储存器单元,译码器单元,求补码单元,移位器单元

    →可读写储存器,译码器,加法器,移位器,时钟发生器

    →加减法器,乘法器,除法器,可读写储存器阵列,寄存器,程序计数器

    →总线,ALU,CU

    →计算机

    令人意外的是,造出这项复杂工程的季文瀚,是复旦大学2011级生命科学学院的本科生,没有受过系统地计算机科学专业教育。他说,看到国外玩家的作品很感兴趣,才自学了一些专业课。

    b3e9cec6bda15bd9b08d8cae8514fed0.png

    大二便启动了Alpha21016计算机的开发,作为《网络虚拟环境与计算机应用》这门课的项目来做的。

    b714a8ec1c9274b742e073fb37369bf1.png

    从他对技术细节的解读来看,那时的季文翰,已经硬件和软件上拥有无比充分的准备。

    普通人的话,可能了解逻辑电路的基础。普通红石玩家的话,可以把逻辑电路的基础知识,用来搭建简单或复杂的红石电路。

    高阶红石玩家,也曾经在季文瀚的项目开始之前,造出过计算器。

    但制造一台计算机,并没有多少人敢想。季文翰不但想到,还用了一整年去实现,几近完成。

    毕竟,如果有个容量惊人的大脑,总归要拿来用的吧。

    微信改版,置顶本公众号避免遗漏最新文章!
    展开全文
  • 单枪匹马造出一个CPU乃至完整的电脑需要多长时间?有位大牛在《我的世界》游戏里用实际行动回答了这个问题:可能要花费一年多。这篇造计算机的教程一经转载就在知乎上火了。这并不是一篇游戏攻略,而是来自复旦大学...
    微信改版,置顶本公众号避免遗漏最新文章!
    栗子 晓查 发自 凹非寺 
    量子位 报道 | 公众号 QbitAI

    3359869bd15c9c32eccd91c83d838d60.gif

    一块小小的CPU里有多少个晶体管?几十亿个。

    单枪匹马造出一个CPU乃至完整的电脑需要多长时间?有位大牛在《我的世界》游戏里用实际行动回答了这个问题:可能要花费一年多

    这篇造计算机的教程一经转载就在知乎上火了。

    e558ae3d1b015fc3adc02a4a6fb15afc.png

    88b8ab07b1e6c2e58d70e346a3a23b87.png

    这并不是一篇游戏攻略,而是来自复旦大学的季文瀚,写的一篇课程论文。他在大二时就有了大胆的设想,经过一年的精心营造,建起了一个计算机雏形,取名Alpha21016

    虽然它不能与现实中的计算机相比,只能实现一些简单的功能,但这台计算机体积惊人,光看它复杂的结构就已经能感受工程量的巨大。

    有网友感叹,发课程论文可惜了,简直可以发学术论文啊。

    这台计算机能做什么

    季文瀚计算机使用的是哈佛结构,而非更常见的冯·诺依曼结构。程序储存器和数据储存器分开放置。程序储存器1kb,数据储存器0.5kb。

    它可以实现各种函数运算:加减乘除、三角函数还有矩阵运算。它包含一个16bit的CPU和一个32bit的浮点运算单元 (FPU) 。

    c67b5a9e4501f947e1419a0ce4dd25d6.gif

    从硬件上看,它是个超大规模集成电路,逻辑门总数大概在5万-10万门之间。光是存储器堆叠起来就有8层。

    8e3d32a4459cc277d1d95d54ee576a4a.png

    要造出这样一台计算机,数字电路、微机原理、汇编语言、编译原理都不能少。想想你挂过哪几门课,从学会到熟练运用就更难了。

    0f5b0dcb81f4d3cb34ac42e0debc7a93.png

    有了专业知识的支持,就能将计算机拆解成基本的部件。

    我们都知道计算机的基础是数字电路,数字电路的基础是“门”,季文瀚用游戏里基本的“红石电路”搭建出了逻辑门。

    从逻辑门出发,再搭建出组合电路、时序电路、触发器,有了这些就能组成CPU的一些基本单元,最终造出整个计算机。

    现实世界中,晶体管是数字电路的基础;在《我的世界》中,红石电路是构成复杂电路的基本单元。

    51223c881bf071611600b9de4e591b6a.png

    红石电路玩家,只用火把和方块,就能造出基本的逻辑门:或门和非门。或门和非门的组合可以造出与门、异或门等任意逻辑门。

    但仅仅知道怎么制造逻辑门离造出计算机还很远,可能大致相当于造出汉字笔画到写出《红楼梦》的距离。

    季文瀚先给自己的CPU架构画了一个草图:

    3899390fe0875b58c02c494cad2df481.png

    其中每一个方框都代表一个或若干个硬件单元,小一点的大约一两百个门电路,大的有几千个门电路。这个密密麻麻的部分,也只是架构的右半部分而已:

    c9a3d3790323cc7650308ea258bb87eb.png

    知道了CPU的基本架构,再按照架构图分别造出每个部分,比如CPU的重要模块“算数逻辑单元”(ALU)和“指令寄存器”(IR),工程量很大。

    算数逻辑单元还能进一步拆解,它的加法器由数个全加器组成,上面基本的逻辑门可以组成加法器中最基本的全加器 (下图) 。

    458bf9374587fdb09cf05cc1cb350f70.png

    全加器也是计算机的一个核心部件。

    同时,《我的世界》还提供的基于活塞机械的断路,用信号控制电路的通断,也就是继电器。利用继电器和逻辑门的组合可以造出存储器。

    bb5f27d8660bce5336e3f1fa1f40ff7e.gif

    计算器→单片机→计算机

    大概是因为太复杂,季文瀚一开始也没想直接搭个计算机。

    最初,他的目标是造出一台16 bit的简单计算器。

    但做到一半,他就觉得可以实现更复杂的东西,于是想改成单片机:这是具有“图灵完备性”,可以执行一切计算机程序的简单计算机。

    他规划了指令集架构,储存器架构,以及指令发射方式等等。

    后来,触发器、可读写储存器、缓冲队列等等重要电路,季文翰都设计成功了。

    d0acb1fe99eba38a5e54c0854f19cfe6.png

    有了这些,少年又做了更雄伟的计划:做个16 bit的CPU

    CPU旁边,还有一个包含超越函数的单精度32 bit浮点处理器 (FPU) 。

    这里,计算器作为片外系统,并没有被抛弃。季文翰把16 bit计算器,改成了完全时序逻辑电路控制、且有溢出判断的计算器——这在Minecraft红石电路玩家里,已是前所未有

    它借用CPU的ALU部分进行运算,并经过总线传输数据。

    CPU和计算器的大部分硬件,都在这张表格里:

    b61f55c9535fbd8ddcef4256180ce4bd.png

    表上的40个硬件,除了指令译码器、指令发射端、异常中断响应没有做完,其他都做好了。还有一些小的硬件单元没有列出来。

    目前,CPU的ALU、主储存器、和寄存器等EU部分已经完工,内部环状总线已竣工,CU部分,也就是最繁琐的部分,还没有完工。

    f20a3ba7c43ff7c796ec4e9283cacb4e.gif

    肉眼可见的威力

    季文翰说,虽然还没完全竣工,但CPU已经可以执行许多种机器指令 (以MOV为主) :通用寄存器赋值,按字/字节+立即数/间接/直接寻址。

    其中,最容易用肉眼感受到威力的,还是借用CPU的ALU完成运算的计算器

    他在视频里展现了加减乘除正余弦,以及平方根的计算。

    f97f592abb143bf211421f8e3e6af501.gif

    从养着小猪的地方走楼梯下来,就是计算器的所在地了。这里有两排按钮,还有显示屏,如上图。

    f9cfc05a56207402c78ac4b28eb26962.gif

    屏幕后面,可以看到运转的电路。

    先做加减乘除。比如加法:

    减法也是同理。只不过,负号和减号在这里分成了两个按钮。

    乘法和除法的运算量比较大:三位数乘三位数,大概需要20秒;除法更慢一些,电脑还会卡。

    下图就是除法,因为打了反除号 () ,所以被除数在右边。左下是商,右下是余数。

    45fa9744b9079347b09b9d549a5c8b69.png

    空间限制了算力,所以计算器要有溢出判断,超过±32627的范围就会报错,显示“E”。

    不论是输入的数还是计算结果,超出范围都会报错:

    9d8df0e44276c738afe1ac87f4c2b30d.gif

    除以“0”,也会报错。

    注意,计算机用二进制来计算,算好之后还要从二进制转成十进制,才是最终的答案。这里用到了BCD/BIN转换算法,把二进制BIN码,转成十进制BCD码。

    四则运算做完了,还有正余弦,用的是Cordic旋转迭代算法:

    20360c2cc3004b9c2f69e58991fb12d1.png

    需要多次迭代,所以运算比较慢,大概花了两分钟。

    相比之下开根号就快许多,用的是快速平方根算法:

    7aef7d4ac64069133be9a65925453e44.png

    20秒 (就) 开好了。

    计算能力就展示到这里。

    而机智的你可能已经也感受到了,显示器对于一台计算机有多重要。那么:

    显示器怎么做?

    游戏空间太狭窄,造显卡是不现实的:2×2个红石灯,就是游戏能控制的最小像素了。

    所以,季文翰做了字符显示器

    首先,用七段显示器来表示数字。

    d5fadaf8b1965796e8a77d0e3ed25290.png

    一个“日”字,是7根小棒组成的

    比如,“4”就有左上、右上、中、右下,一共四根小棒。

    每根小棒又由三个方块组成。把这些方块的活塞往回抽,就显示出凹陷的“4”了。

    而每个十进制数,都可以对应二进制的四位数,比如3是0011,9是1001。输入二进制数,屏幕就能显示成十进制。

    数字搞定了,还有其他字符。季文翰用了自己设计的缩减版ASCII码,只有不到64个字符:

    d94695da26e7f1e0eefb46346de5b1ca.png

    给每个字符编个号:0,1,2,…,63。每个号码,都可以转成二进制数00000-111111。

    然后,显示出来长这样:

    6ed9feafc3169e2aa13d0ade4160e2a8.png

    打开夜视,萤火一般,美不胜收。

    其实,这些字是“印”在了显示器的键盘上,白天长这样:

    fd2e124a423d82e3ae15b4cb1141a28f.png

    也就是说,计算机有了,显示器有了,键盘也有了。

    而这样的杰作,居然来自一位“业余选手”。

    “我学的不是计算机”

    现在来回顾一下,从逻辑门到计算机,都要经历什么:

    或门,非门

    →与门,异或门

    →全加器,信号长度转换器,多态选择器,储存器单元,译码器单元,求补码单元,移位器单元

    →可读写储存器,译码器,加法器,移位器,时钟发生器

    →加减法器,乘法器,除法器,可读写储存器阵列,寄存器,程序计数器

    →总线,ALU,CU

    →计算机

    令人意外的是,造出这项复杂工程的季文瀚,是复旦大学2011级生命科学学院的本科生,没有受过系统地计算机科学专业教育。他说,看到国外玩家的作品很感兴趣,才自学了一些专业课。

    7c2776ba51564e5d72be2837b80b1c9d.png

    大二便启动了Alpha21016计算机的开发,作为《网络虚拟环境与计算机应用》这门课的项目来做的。

    f1a2c17d3affa95689b28fc6661862a8.png

    从他对技术细节的解读来看,那时的季文翰,已经硬件和软件上拥有无比充分的准备。

    普通人的话,可能了解逻辑电路的基础。普通红石玩家的话,可以把逻辑电路的基础知识,用来搭建简单或复杂的红石电路。

    高阶红石玩家,也曾经在季文瀚的项目开始之前,造出过计算器。

    但制造一台计算机,并没有多少人敢想。季文翰不但想到,还用了一整年去实现,几近完成。

    毕竟,如果有个容量惊人的大脑,总归要拿来用的吧。

    微信改版,置顶本公众号避免遗漏最新文章!
    展开全文
  • 逛街 最短距离+花费

    2018-07-27 12:04:49
    假设渣渣灰有一个女朋友,的女朋友要他陪着一起去公园。由于渣渣灰不喜欢运动,所以想找一条最短的路到达公园。由于途中会有许多消费点,而每到一个消费点女朋友就要购物,而渣渣灰比较抠,所以假如有条最短路...

    逛街

    时间限制: 1 Sec 内存限制: 128 MB

    题目描述

    假设渣渣灰有一个女朋友,他的女朋友要他陪着一起去公园。由于渣渣灰不喜欢运动,所以他想找一条最短的路到达公园。由于途中会有许多消费点,而每到一个消费点女朋友就要购物,而渣渣灰比较抠,所以假如有多条最短路,则他会选择途中消费点最便宜的。给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s,终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。

    输入

    输入nm,点的编号是1~n然后是m行,每行4个数 abdp,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 st;起点s,终点。n和m为0时输入结束。
    (1<n<=1000 0<m<100000 s != t)

    输出

    输出 一行有两个数, 最短距离及其花费。

    样例输入

    2 2
    1 2 5 10
    2 1 4 12
    1 2

    4 4
    1 2 5 6
    2 3 4 5
    1 4 5 10
    4 3 4 2
    1 3

    6 7
    1 2 5 6
    1 3 5 1
    2 6 2 1
    3 4 1 1
    4 2 1 1
    4 5 1 1
    5 2 3 1
    5 6

    0 0

    样例输出

    4 12
    9 11
    4 3

    提示

    输入样例的空行只是为了让大家分辨数据,输入有没有空行都没关系。输出样例没有空行。

    题解

    dijkstra算法求单源最短路简单扩展,我们再创建一个value数组储存花费情况。在松弛时对value进行改变。

    松弛成功则value(s->i)=value(s->k->i)。

    若最短路相等则对value值进行比较,即value(s->i)=min(value(s->k->i),value(s->i))。

    s为源点,i为当前终点,k为中间点。最终输出最短路及对应value值即可。

    #include<bits/stdc++.h>
    #define inf 0x3f3f3f3f
    using namespace std;
    const int maxn=1e3+10;
    int n,m;
    struct node
    {
        int ds,cs;
    }road[maxn][maxn];
    int dis[maxn];//最短距离
    bool vis[maxn];
    int cost[maxn];//花费
    void dijkstra(int s)
    {
        memset(vis,0,sizeof(vis));
        memset(dis,inf,sizeof(dis));
        memset(cost,inf,sizeof(cost));
        dis[s]=0;
        cost[s]=0;
        vis[s]=1;
        for(int i=1;i<=n;i++)
            dis[i]=road[s][i].ds;
    
        for(int i=1;i<=n;i++){
             cost[i]=road[s][i].cs;
             //printf("%d:%d\n",i,dis[i]);
        }
    
        for(int u=1;u<n;u++)
        {
            int minD=inf,k=-1;
            for(int i=1;i<=n;i++){
                if(!vis[i]&&dis[i]<minD)
                {
                    k=i;
                    minD=dis[i];
                }
            }
            vis[k]=1;
            for(int i=1;i<=n;i++)
            {
                if(!vis[i]&&dis[k]+road[k][i].ds<dis[i])
                {
                    dis[i]=dis[k]+road[k][i].ds;
                    cost[i]=cost[k]+road[k][i].cs;
                }//if
    
                if(!vis[i]&&dis[k]+road[k][i].ds==dis[i]
                   &&cost[i]>cost[k]+road[k][i].cs)
                {
                    cost[i]=cost[k]+road[k][i].cs;
                }//if
    
            }//for
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)&&n&&m){
            memset(road,inf,sizeof(road));
            for(int i=1;i<=m;i++){
            int a,b,d,p;
            scanf("%d%d%d%d",&a,&b,&d,&p);
            if(d<=road[a][b].ds)//处理路径距离
            {
                if(d==road[a][b].ds)//如果距离相等,存放最短的花费
                road[a][b].cs=road[b][a].cs=min(p,road[a][b].cs);
                else //存放新路径的费用
                road[a][b].cs=road[b][a].cs=p;
                road[a][b].ds=road[b][a].ds=d;//填充路径
            }
        }
            int s,t;
            scanf("%d%d",&s,&t);
            dijkstra(s);
            printf("%d %d\n",dis[t],cost[t]);
        }
        return 0;
    }
    #include <stdio.h>
    #include <string.h>
    #define INF 0x3f3f3f3f
    #define Min(a,b) a>b?b:a
    struct Node
    {
    	int adj,val;
    }g[1005][1005];
    int dist[1005];//距离
    int value[1005];//费用
    int used[1005];//标记
    int n,m,i,j;
    void Dijkstra(int s)
    {
    	memset(dist,0x3f,sizeof(dist));
    	memset(value,0x3f,sizeof(value));
    	memset(used,0,sizeof(used));
    	dist[s]=0;//从起点开始
    	value[s]=0;
    	while(1)
    	{
    		int k,u=-1,d[1005];
    		int min=INF;
    		memset(d,0,sizeof(d));
    		for(i=1;i<=n;i++)
    			if(used[i]==0&&dist[i]<min)//找出从起点到下一个最小距离的顶点
    			{
    				min=dist[i];//记录最小值
    				u=i;//记录下标
    			}
    		if(u==-1)//判断所有顶点是否都到达过
    			return ;
    		for(i=1,k=0;i<=n;i++)
    			if(dist[u]==dist[i]&&used[i]==0)
    				d[k++]=i;//从起点到下一个要访问的顶点的最小距离可能有多个
    		for(i=0;i<k;i++)
    			used[d[i]]=1;
    		for(i=0;i<k;i++)//多个满足的点分别进行迪杰斯特拉最短路查找
    			for(j=1;j<=n;j++)
    				if(g[d[i]][j].adj!=INF && (dist[d[i]]+g[d[i]][j].adj)<=dist[j])
    				{//原理与 main()函数中建立邻接矩阵一样
    					if((dist[d[i]]+g[d[i]][j].adj)<dist[j])//小于的情况
    						value[j]=value[d[i]]+g[d[i]][j].val;
    					else
    						value[j]=Min(value[j],value[d[i]]+g[d[i]][j].val);
    					dist[j]=dist[d[i]]+g[d[i]][j].adj;
    				}
    	}
    }
    int main()
    {
    	while(scanf("%d%d",&n,&m) && (n||m))
    	{
    		int a,b,d,p;
    		memset(g,0x3f,sizeof(g));
    		for(i=1;i<=m;i++)
    		{
    			scanf("%d%d%d%d",&a,&b,&d,&p);
    			if(d<=g[a][b].adj)//处理路径距离问题
    			{
    				if(d==g[a][b].adj)//如果距离相等,则存放最少的费用
    					g[a][b].val=g[b][a].val=Min(p,g[a][b].val);
    				else//否则,存放新路径距离的费用
    					g[a][b].val=g[b][a].val=p;
    				g[a][b].adj=g[b][a].adj=d;//填充路径距离
    			}
    		}
    		int s,t;
    		scanf("%d%d",&s,&t);
    		Dijkstra(s);
    		printf("%d %d\n",dist[t],value[t]);
    	}
    	return 0;
    }

     

    展开全文
  • 单枪匹马造出一个CPU乃至完整的电脑需要多长时间?有位大牛在《我的世界》游戏里用实际行动回答了这个问题:可能要花费一年多。这篇造计算机的教程一经转载就在知乎上火了。这并不是一篇游戏攻略,而是来自复旦大学...
  • 单枪匹马造出一个CPU乃至完整的电脑需要多长时间?有位大牛在《我的世界》游戏里用实际行动回答了这个问题:可能要花费一年多。这篇造计算机的教程一经转载就在知乎上火了。这并不是一篇游戏攻略,而是来自复旦大学...
  • 单枪匹马造出一个CPU乃至完整的电脑需要多长时间?有位大牛在《我的世界》游戏里用实际行动回答了这个问题:可能要花费一年多。这篇造计算机的教程一经转载就在知乎上火了。这并不是一篇游戏攻略,而是来自复旦大学...
  • java-线程

    2019-08-19 21:41:08
    线程 synchronized 1、synchronized关键字 简介 解决个线程之间访问资源的同步性...原生切换线程,需要从用户态转成内核态要花费时间。 1.6之后,JVM层进行优化,所得效率也优化了很。关于锁的实现也...
  • 马上又继续出来创业做事了,想到注册公司,有个麻烦事。 事情得回到2014年9月。 当时,由于各种因素,决定放弃ITFriend,当然... 当时,我是这么想的:花这么钱,还要这么长时间(我比较担心,需要留在北京6个
  • 因为要求时间最短,所以夫妻俩洗衣服的时间相差越小越好,所以是一半喽,然后算出这一半时间内的洗衣服最多花费多长时间,总时间减去,就是对象洗衣服花费的时间,就是那个较长的时间。#incl
  • zcmu1277: Meat

    2021-01-27 23:23:27
    刚开始在第x个房间,问:吃完所有肉最少花费多长时间。 范围:(2<=n<=100, 1<=x<=n,0<=ai<=1000) 思路 由于房间肉可以是0,所以先确定左右非零边界,然后来回跑就好
  • 暑假练习:上学

    2018-07-20 10:05:00
    小喵喵在1号路口,他要去n号路口上学,但是他马上要迟到了,所以他想知道最短需要多长时间能够到达学校。其中忽略小喵喵由于出家门、到n号路口之后进入学校、从一条道路移动到另一条道路之类的时间,只计算他在这些...
  • 21 以太坊权益证明

    2021-01-08 00:46:12
    以太坊与比特币相比能耗少很,这是因为比特币的出块时间长,以太坊的出块时间短,所以每个交易上比特币所花费的能耗要多,但是即使如此,以太坊挖矿所消耗的能耗比信用卡公司。 如果我们把以太坊和...
  • 2015第26周一

    2015-06-22 22:14:00
    端午假期最后一天晚上,不知为何总又想看很多电影和综艺节目,好在明天就要上班了,就算是看也是大概的浏览,不会在这上面花费多长时间,最重要的还是明天的工作,下周任务艰巨,除了调试代码解决问题,还有处理很...
  • echarts使用心得

    2019-09-26 14:16:50
    echarts是一个比较好的插件,配合jquery使用简直不要爽歪歪,但是对新手而言其具有很大的局限性,首先的一点是其版本库的原因,并不像jquery那样,的commmon版与完整版简直不要相差太,今天花费长时间上面...
  • SDUT 2402 水杯

    2015-10-24 20:46:02
    题目描述 天气逐渐变热了,准备考研的高童鞋打算在夏天来临之前自己动手造一个水杯,以备口渴,你知道,高童鞋是个很挑剔而且古怪的的人,每天喝的...作为的好朋友,想让你帮做一个水杯,当然要花费最少。花费
  • 它好像在音乐里给了全篇作品以音调,演讲者往往要花费长时间才能找到它。”我们来看看高尔基是怎么做的。 1935年3月7日,高尔基应邀在苏联作协理事会第二次全体会议上讲话。当代表们听到高尔基的名时,长时间热烈...
  • —— 给出N条逃跑路径,每条路径有一个困难值Ci,Cain逃跑,一开始其有战斗值f,可以花费一个单位的时间来等概率随机选择其中一条路径逃跑,如果其战斗值f大于Ci,则在经过Ti时间(公式如上)后成功,如果小于...
  • 它好像在音乐里给了全篇作品以音调,演讲者往往要花费长时间才能找到它。”我们来看看高尔基是怎么做的。 1935年3月7日,高尔基应邀在苏联作协理事会第二次全体会议上讲话。当代表们听到高尔基的名字时,长时间...
  • 它好像在音乐里给了全篇作品以音调,演讲者往往要花费长时间才能找到它。”我们来看看高尔基是怎么做的。 1935年3月7日,高尔基应邀在苏联作协理事会第二次全体会议上讲话。当代表们听到高尔基的名字时,长时间...
  • 每次用matlab跑上万条的数据,都要花费很长很长时间,昨晚 跑8万条数据、训练100次的CNN跑了两个半小时,今天继续执行2G的电脑内存不断溢出,删了几个后面用不到的大数据后还是溢出,于是决定用东哥的服务器来跑。...
  • hdu1260 DP

    2019-09-26 10:18:54
    题意:现在有n个人买电影票,如果知道每个人单独买票花费的时间,还有和前一个人一起买花费的时间,问最少花多长时间可以全部买完票。 刚学DP,就从简单的开始做起,从这道题我们可以知道,每个人只有三种情况,如...
  • 让APP的市场一片繁荣,现在市场上的APP数量数不胜数,对于APP开发的我们很外行人也许认为,开发APP是不是特别难,是不是只有资历很高的程序员才能够完成这个任务,或者说要想开发一款APP是不是要花费时间?...
  • 第四章乐高王国,向我们 ...程序就可以完美的运行,但是目前具有很大的难度,有的时候这个组件并不能和自己的程序一起运行,往往将代码组合在一起花费时间要比自己编写花费时间长。曾经考克斯创办了一家叫...
  • Doing Homework HDU - 1074

    2018-04-12 11:37:36
    写作业长时间的,安排一个写作业顺序,让小明扣分最少。 输入:T表示组测试数据,每组数据开始n,表示有多少作业,下面n行每行输入科目,和两个正整数表示D截止日期,C表示花费时间。 输出:最少扣的分数...
  •  治懒妙招:需要花费长时间去做的事情,都不符合他们急惊风的性格,他们相当没耐性,所以不如把时间缩短,或是找个很害怕的人,在一旁监督就会好很哦! 治懒克星:天蝎座的碎碎念功。 金牛座...
  • 本科计算机学习小结

    2020-10-02 18:15:35
    花费长时间解决一个小问题。 需要自学很知识和技术。 原因 你所遇到的问题,身边的人不一定遇到(研究方向不同、使用设备不同等)。 网上解决类似问题的方案良莠不齐,可能别人用的方法可以解决,自己就...

空空如也

空空如也

1 2 3 4
收藏数 78
精华内容 31
关键字:

他要花费多长时间