单周期CPU是什么意思呢
CPU又名中央处理器,作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。Logisim是一款逻辑电路设计仿真软件,我们可以在这个软件上面绘制各种逻辑电路,当然也包括CPU。
电脑中有intel、AMD、Apple的CPU,手机中也有华为、高通、Apple的SOC,每次我研究这些他们设计的硬件时,总是觉得研究得不能很深入,往往只是看看官网参数和一些评测数据罢了。但是有些时候,总是有那么些不合常理的存在让我对CPU的认知一次又一次地被刷新。半年前是AMD(他们的笔记本CPU性能竟然直逼台式机),几个月前是Apple(他们的15W的M1芯片竟然砍倒一片几十W乃至几百W的台式机CPU,核显更是剑指独显)。这使我很烦躁,因为只是在外头看个热闹,很多原因我不能探明。所以就有了以下的一切。
这是第一章节《单周期CPU》
下面直接上图:
这便是该CPU全貌了
左上的部分是取指单元,其作用是从指令内存中取出指令。右上是译码单元,其作用是把指令所需操作翻译成电路的控制信号。右下是计算单元,通过调整对应的控制信号可以进行两数四则运算,并且可以访问数据内存,读取或者写入对应的数据。图中有深绿、亮绿和黑色的线,深绿色意味着这条线的电压是0V,亮绿色则为1V,黑色是因为每根黑色线都由若干根深绿或亮绿线组成,所以统一显示成黑色。
这个CPU采用自己瞎编指令集(ISA),属于精简指令集。与复杂指令集的区别在于它精简……之所以没有使用别人的指令集是因为我还在学习,下一次更新会采用RISC-V的开源指令集。有人可能会觉得难道自己造指令集不好吗?好又不好。这个问题我先挖个坑放着,有空我再讲。
字长为16位宽,意味着每次可以做16位的二进制运算,也就是最大2的16次方(65536)的运算,可以寻65536的内存地址。目前主流在32位和64位,只有少数单片机还在用16位,下次更新会更到32位。可能有人会有疑惑,如果我要计算的数字是天文数字呢?你就是64位也不够怎么办?首先,我们可以多做几次运算,这个可以通过专门的计算器程序来实现。(求积分的软件都有这个不算什么),其次可以使用浮点运算。但是我这个CPU没有浮点运算单元。(滑稽脸)这个挖个坑以后讲。
单周期(single cycle),每个时钟周期只能做一次运算。难道还能做好多次吗?能的,那就是流水线或者超标量技术甚至多核心。级数越高的流水线每个时钟周期可以做越多次的运算。五级流水线是最经典的流水线级数,当下主流的CPU的流水线级数都在8-15之间,也有20多的超流水线。但是流水线不是越深越好,凡事都有个度。再挖个坑,以后讲。
仅具备简单加减乘除的运算功能,当然也可以写个开方或者幂程序来支持高级运算。目前大多数的复杂运算也都是基于程序来实现的,直接固化在硬件电路中的也比较少见。据我所知,intel有把开平方写在指令集和硬件电路中,这样的好处是可以更快地求得结果,减少中途程序的调度过程。下一次更新会增加好多个运算电路,同时砍掉乘除,因为RISC-V中的RC32I不支持乘除指令,所以下次先砍掉。
该CPU一共有4个寄存器,没有缓存。相比之下,目前的CPU有几十到几百个寄存器,以及数kb的缓存。这个也会在下次更新补足到32个的。
这个CPU的解码部分也很有趣。我参考了x86的微指令设计。什么意思呢,就是正常的解码电路都是靠硬件逻辑解码硬解出来的,我这个不一样,是像查字典一样查出来的。这个字典就是图右上部分的ROM。这样的好处是不用设计电路了,实际电路生产中,如果电路设计有问题就得从头再来,再设计再生产。但是如果是我这种设计方式,改改ROM里的数值就行了,无法是给个软件升级。坏处也有,就是ROM实现方式占地太大,并且速度慢,功耗高。不过如果是在FPGA中大家都一样。FPGA我就再挖个坑吧。
对了,这个CPU有个bug,就是立即数(直接在程序中给明的数)不能直接参与运算,本来实现之初是有考虑到的,这个改也不难,但是现在忙着设计第二代,算了,留点遗憾才是完美。
审核编辑:刘清