E1.1,C语言程序设计
程序和编程语言程序(program)告诉计算机如何完成一个计算任务。而程序由一系列的指令(instruction)组成,是指示计算机做某种运算的命令。任何一个程序,都由输入,输出,运算,测试与分支,循环几个操作组成。所以,编写程序就是把任务分解为子任务,子任务再分解为更简单的任务的一个过程。 习题 1、解释执行的语言相比编译执行的语言有什么优缺点? 现在回答这个思考题,根据编译和解释的不同原理,你能否在执行效率和平台无关性等方面做一下比较? 希望读者掌握以概念为中心的阅读思考习惯,每读一节就总结一套概念之间的关系图画在书上空白处。如果读到后面某一节看到一个讲过的概念,但是记不清在哪一节讲过了,没关系,书后的索引可以帮你找到它是在哪一节定义的。 在流程上面,解释不需要经过编译,会具有更高的执行效率。在专用于这个芯片的场景下,这是一种执行速度更快的选择。 但是解释更像是一种translate,是一种one to one的模式,把一个指令解释为另一个可以执行的指令。大多数情况下,机器的执行的情况是不一样的。所以他又一个显著的特征是,输入的编码需要根据机器执行的不同,而去修改而适应设备...
3:三月的总结
日子过得很快,从开学到现在,已经有了两个星期了,这两个星期发生了很多事,也许很多事也会逐渐地忘记。但是,总结和记录也许是时间的锚点,让我们知道,我们从何而来,到何而去;我们的生命地意义是为了什么。我想,对于每一个人而言,这都是一个绕不开地话题。 从应试教育走来,大家往往非常会卷,会刷题。会用一些和自己并不是表里如一的词语和语句,来彰显着自己学识地渊博。但是,究其源,我认为这是一种不自信的体现。这一种不自信很可能不是所谓的人的自信,而是对于自己的道路的自信和理论的自信。 就好像在高考作文中写着”酌古“”观今“”揆诸当下“一样,这一些所谓地高级词汇并不会将我们的生命因此而多姿多彩。上个星期听了”李冉在冥想“的李冉老师,分享的一本书《狂喜之后》,在旅行也好,修行也罢,我们可能会经历那一段极度的狂喜与开心的时候。好像自己整个的心思都是澄澈的,眼里闪着清澈的光。但我们知道,我们并不会因为一次觉悟而发生任何的改变,而是花自开,水自流。照样要与这一个并不美好的现状”周旋久“,但我们要做到的也许是”勿忘我“。不在一场又一场的旅途中慢慢地忘记自己的样子。我想,对开学以来的这半个月做一个总结,告诉我...
F6:我的第一块芯片
我们已经实现了sCPU,可以计算数列求和,但是这个处理器确实让我们对处理器如何工作有着更为深入的认识。但由于限制,不能运行复杂的程序,由于其指令集的宽度,PC的数量,GPR的位宽,指令的功能。所以,在接下来我们要实现一个功能完备的RISC-V处理,可以运行更多的程序。 Just for fun! let’s go! 迷你RISC-V指令集RISC-V是近十年流行起来的开放指令集架构, 它采用模块化的思想, 把指令划分成不同模块。除了基础指令集RV32I, 还有各种指令扩展, 包括乘除扩展, 浮点扩展, 原子操作扩展等. 开发者可以根据自身需求选择一个或多个扩展, 也可以一个扩展都不选, 这种灵活性受到了开发者的喜爱. RV32I共有42条指令, 通过实现RV32I, 处理器已经足够完成绝大部分的计算工作. 不过为了进一步降低开发的工作量, 我们提出了一个”迷你RISC-V”指令集minirv, 从RV32I中选出了8条指令, 用它们来替代其他RV32I指令的功能, 使得RV32I能完成的工作, minirv也能完成. 这样, 我们就不必实现完整的42条RV32I指令, 也能让处理...
F5 支持数列求和的简单处理器
要求:在此之前, 我们需要再次明确需要实现的指令集sISA的细节. 和上一小节相比, 此处还约定了一些寄存器的位宽: PC位宽为4位, 初值为0 GPR有4个, 位宽均为8位 支持如下3条指令 123456787 6 5 4 3 2 1 0+----+----+-----+-----+| 00 | rd | rs1 | rs2 | R[rd]=R[rs1]+R[rs2] add指令, 寄存器相加+----+----+-----+-----+| 10 | rd | imm | R[rd]=imm li指令, 装入立即数, 高位补0+----+----+-----+-----+| 11 | addr | rs2 | if (R[0]!=R[rs2]) PC=addr bner0指令, 若不等于R[0]则跳转+----+----------+-----+ 最多执行16条指令,不含benr0现有情况,支持8位int,最大数为256 我们将这个用数字电路实现的sISA指令集的CPU称为sCPU. 要实现sCPU...
F4 计算机系统的状态机模型
计算机是严谨的,输入与输出有着严格的end to end的关系,我们要处理的中央处理器(CPU),也是这样的装置。 处理器是一个机械地进行数据处理的装置, 它要做何种处理, 就应该是受到某种方式的控制, 而不存在可以自己思考的智能。这样的处理器的媒介,就是指令。我们可以用加法字段对两个数据相加,和我们在计算器中的控制码是非常的类似的。 要”用加法指令来控制处理器对两个数据进行相加”, 说明一条指令需要给出两方面的信息: 一方面, 计算机需要处理的数据有很多, 因此指令中需要指定需要处理哪些数据, 这称为指令的”操作数”(operand)字段; 另一方面, 计算机处理数据的方式也有很多种, 因此指令中也需要指定用何种方式处理数据, 这称为指令的”操作码”(opcode)字段. 我们看到,在计算中的很多结果,需要保存起来供后续使用,这种东西就叫做寄存器。由于这样的寄存器用于处理一般数据,一次也称为通用寄存器(GPR)。相对地,有一些寄存器地功能并不是用于一般处理,便不叫作GPR 存储程序程序的本质就是一段指令序列 那就有一个问题,计算机为什么会比计算器强太多。答案在于计算机的工作机制...
2:对寒假的总结
从二月多放假,到二月底的现在。寒假快要走到了尾声。 虽说寒假的确在学习上花了很多时间,但多多少少是有些不在状态的,也就是说,我画的时间和得到的进步往往不成比例。我学的最多的应该是“一生一芯”,可能对于一个新生的板块,我自己有着很强的好奇心和主观能动性,所以应该还是投入最多的。但接触一个新的,诸如计算机原理这样的课程,对我也有着并很多的冲击和启发。 去动手,去实践,不去逃避,不去AI。而是去手搓,感受老一辈艺术家的魅力,我觉得这样真的很棒,在假期中,我可以追寻在课本之外的一个世界。对于电信大类而言,学的东西说白了都很肤浅,在其中有着极其庞大的一座巨人的肩膀,等着我们去探索和发现。 但是假期我还是懒惰的,思想中也产生了片刻的迷茫。当一股热潮过去后,思考为什么的时候,确实应该是这样的。只不过在假期快要结束的现在,这样的情况,得到了一些的好转。 还有一件很重要的事情,是要去保护视力,我的视力,相比高三那种健康的状态,视力还是有了很多的下滑,实际上花在工作上的时间是有限的,更多是自己玩手机刷视频而虚度的。 在这个变换的世界,大道以多歧亡羊,学者以多方丧生。有的时候,相比于刷短视频去打发时间...
1:bilibili下载器
最近喜欢听钢琴曲,但很多曲子在音乐上都没有,而且很多音乐的曲子在音乐平台上都是没有的,又或者有些是UP主的天赋,很想下下来,放在耳机里循环欣赏,于是有了这个想法 参考 pangguy/bilibiliAudioDownloader-1: 输入视频BV号列表,批量下载B站视频中的音频到本地。 https://github.com/Henryhaohao/Bilibili_video_download https://github.com/SocialSisterYi/bilibili-API-collect 改进原有的代码在2021年最后一次进行更新,我们在现在进行复现,并且随着哔哩哔哩的反爬技术进一步的更新,我们需要进行一些改进,最后在原有的代码基础上,我们将其封装成为exe文件,供没有python环境的音乐爱好者们可以一起欣赏 主要功能输入视频BV号,下载B站视频中的音频到本地。 使用方法在哔站上复制BV号,然后按需要点击下载即可 获取https://github.com/lijiayi-plus/bilibili-audio-downloader-v2
F3.3: 数字逻辑电路基础
续 基本组合逻辑电路多路选择器1.搭建一个1位2选1选择器,如图 整数的机器级表示原码原码是一种直观的编码,最高位表示符号位,0表示正数,1表示负数,其余位表示真值的绝对值,但这存在一个问题。 例如: 12340b00000111 = 70b10000111 = -70b00100010 = 340b10100010 = -34 考虑采用8位的RCA进行原码加法: 12340b10000111 (-7) 0b10000111 (-7) 0b00000111 (7)+0b10100010 (-34) +0b00100010 (34) +0b10000111 (-7)----------- ----------- --------0b00101001 (41) 0b10101001 (-41) 0b10001110 (-14) 通过上述观察, 我们可以得出以下结论: 当两数皆为正数时, 通过RCA进行加法所得的结果按原码解释, 与将两数按原码解释后得到的结果在数学意义上相加, 两者一致. 因此, 在这种情况下, 可...
F3.2 数字逻辑电路基础
通过门电路搭建基本组合逻辑电路有了门电路以后,我们就可以通过多个门电路的组合来搭建一些在数字电路中常用的模块了 译码器译码器(decoder)是一种将K位输入转换为最多2的K次方种不同输出的电路,一类常见的译码器是n选1译码器(1-of-n decoder),他将二进制输入解析为一个数值x,并且使得输入的第x位为1,其余全为0,也就是我们说的独热(one-hot)编码。其真值表和电路图如下: 搭建2-4译码器我们在logisim中进行实现,由于我们要进行编码,而输入为2,输出为4,我们需要将其两两进行逻辑运算。我们对于输入的两个信号进行非运算后,我们有了4个两两一组的元素可以进行比较。由于其它都是0,只有一位是1,所以我们最终选择与门进行实现在计算机中, n选1译码器常用于实现寻址的部分功能, 此时译码器的输入即为地址, 输出则是选择信号, 其中与地址对应的选择信号为1. 在现代计算机中,得益于存储单元之间的连续性, 如果计算机要访问其中一个存储单元, 它并不需要从第1个存储单元开始按顺序检查, 而是可以通过一个”行号”来快速找到对应的存储单元. 这个”行号”在计算机中称为”地址...
F3.1 数字逻辑电路基础
这是“一生一芯”项目的一个beginning,千里之行始于足下,希望能够通过自己的学习和体会,在下个学期末之前完成流片。如果我的数电的大作业最后是自己搭的一个芯片,我真的觉得那样酷毙了,learn for fun。 处理器本质上是数字电路,而数字电路是用来处理数字信号的电路,而数字信号简单来说就是指0和1这样两种练得信号。0和1并不是数字意义的自然数的前两位,而是电路的高电平和低电平的两种不同的状态,所以有的时候也会把它们称之为逻辑0和逻辑1。 模拟信号是连续的,像是电流和电压一样。 想要学习数字电路,学习处理器的芯片设计,数字电路的知识是基础,而要学习数字电路,就是要学习信息在数字电路中是如何表示,处理和存储的。 通过晶体管实现0和10和1是抽象的,在数字电路中,0和1一般来说依靠晶体管进行实现,我们常常采用MOSFET(金属-氧化物-半导体场效应晶体管),根据用途的不同,一般又分为nMOS ,和pMOS,管两种。在模电中,我们一般运用的是场效应管的放大效应,即其对电压的放大能力,而在数电中,我们一般使用其开关特性。原理不进行赘述,参考模电教材。 接下来我们学习CMOS(Com...











