P3 一些增强电路可拓展性的方法
不知不觉就要和logisim说再见了(好兴奋好激动),趁着自己还能记得这软件怎么用,写一些使用logisim搭建单周期CPU的技巧,留作纪念。
1.狂用Tunnel
使用Tunnel可以避免混乱的连线,更好的理清各单元的输入/输出/控制信号。特别是在顶层电路中,对于某个功能单元,Tunnel就像是一个函数的输入/输出,不仅可以在添加指令时直观地显示出其中的逻辑关系,还可以突出各个功能单元模块化的特点。这样即使不断增加指令数也能获得一个较为清晰的顶层电路。下图是自己近乎全Tunnel的顶层电路设计
2.输入端使用MUX
随着指令数的增加,一些功能单元可能需要不同的输入。配合上一条的Tunnel,利用MUX可以很方便地对输入端进行拓展。注意此时MUX的控制信号由控制单元产生。下图是顶层电路中ALU模块的连线方式
3.适当增加MUX的Select Bits
随着指令数的增加,MUX的输入端势必会有越来越多的信号。下图是IFU单元中nPC模块的MUX,尽管目前仅涉及了四条指令,但还是设置了3位的Select Bits,以便后续的指令扩展。
对于上例,控制信号IFU_MUX在控制单元的与或门阵列中可以暂时加一个常量0(如下图所示),等到需要拓展指令时再进行改动即可。
4.控制单元中将指令最多的情况设为“0”
这一条听起来有点拗口,结合上一条的IFU_MUX信号进行阐释。
显然对于大多数指令,我们进行的都是常规的pc=pc+4的操作。因此我们把pc+4放在了MUX最上方的输入端口(即对应的控制信号为0)。这样的好处在于,在搭建控制单元的与或门阵列时,对于大多数指令,我们不必将它连接到或门上(因为不连接或门对应的输出信号为0)。
再从反面理解一下:可以想象,如果我们把pc+4放在了MUX的第二个输入端,则对于每一条新加入的指令,都要在控制单元的与或门阵列中将它连接到上图上端的或门上,这会是一项繁琐的工作。
而对于如何定义指令最多的情况,我认为可以借助nop指令,即:将nop指令对应的情况设为“0”。因为nop指令实质不进行任何操作,对应指令运行的默认情况,也就是多数指令对应的情况 (思考题2好像也可以从这个角度理解
5.对控制信号建立一套命名规则
随着指令数的增加,需要产生的控制信号也会越来越多。建立一套控制信号的命名规则可以帮助更加快捷的找到需要引出的控制信号 (贴上自己奇怪的命名,如GRF_aw_M代表控制GRF单元写入(write)地址端(address)的多路选择器(MUX)的控制信号
6.一些其它美化电路的方法 (强迫症必看)
以下仅代表个人审美观点,不喜勿喷(
a.设置分线器的属性
分线后再合并×
把需要的位数合并后再输出√
遗留用不到的分叉×
只保留需要输出的位数√(属性栏设置none实现)
b.编辑子电路外观
将各端口的间距调整到两个点阵。这样引出Tunnel时可以恰好平行引出
而不会像默认间距一个点阵导致连线曲曲折折
c.调整子电路端口朝向与顺序
保证输入端口朝左,输出端口朝右,控制信号的端口朝上/下
将各端口自上到下自左到右按命名的字典序排列
(以上两点可以方便顶层电路连线时不必反复点开子电路查看端口对应关系
d.多用Ctrl+C/V
特指GRF单元。得到一个整齐的寄存器阵列整个人呼吸都顺畅了
over!goodbye logisim~
Author:Mr.Lin