单总线 CPU 设计¶
问题 1: BEQ 指令 SUB 信号问题¶
Excel 中没有 beq
指令需要的 sub
信号,
问题 2: PSW.equal
信号表示什么?¶
PSW
是状态标志寄存器,也就是存放 ALU 的一些标志位,比如进位标志。这里的 PSW.equal
指的是 equal
标志位。
在 Excel 里的位置是输入信号列表里的 equal
。
问题 3:Logisim 无法删除元件/ 无法关闭¶
当我们在子电路中不小心拖拽了一个使用了这个子电路的电路,此时,无法删除这个元件,Logisim 判断所删除的元件被子电路使用,发生了循环嵌套,可能导致 Logisim 无法关闭,并且在电路仿真的时候会出现“因内部错误停止仿真”的提示。
例如在本次实验中,如果我们在“◇时序发生器输出函数(定长指令周期)”电路图中,不小心拖入了“◆单总线 CPU+中断(3 级时序)”,有概率出现上述情况。
为了解决这个问题,我们需要手动编辑崩溃的 .circ
文件,记住拖入错误的电路名称(例如◇时序发生器输出函数(定长指令周期))和元件名(◆单总线 CPU+中断(3 级时序))称,使用任务管理器 强制结束 卡死的 Logisim 进程,接着使用记事本或者 VS Code 打开 .circ
文件。
circ 文件
.circ
本质是 XML
格式(可扩展标记语言,Extensible Markup Language)
搜索电路名称,例如 <circuit name="◇时序发生器输出函数(定长指令周期)">
,找到形如:
...
<circuit name="◇时序发生器输出函数(定长指令周期)">
<a name="circuit" val="◇时序发生器输出函数(定长指令周期)"/>
<a name="clabel" val="输出函数"/>
<a name="clabelup" val="east"/>
<a name="clabelfont" val="Dialog bold 14"/>
<a name="clabelcolor" val="#000000"/>
<wire from="(80,790)" to="(140,790)"/>
...
◆单总线CPU+中断(3级时序)
,找到 ...
</comp>
<comp loc="(1360,1400)" name="◆单总线CPU+中断(3级时序)">
<a name="facing" val="east"/>
<a name="label" val=""/>
<a name="labelloc" val="north"/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
</comp>
<comp lib="0" loc="(470,2830)" name="Pin">
...
xml
标签,从 <comp ...
到 </comp>
,保存,并重新打开,若还出现“因内部错误停止仿真”的提示。则尝试电路复位并重新开启仿真。 问题 4:如何加载数据镜像?¶
在单总线 CPU(3 级时序),右键点击加载数据镜像。
选择 sort.hex
,然后 Open。
接着在电路仿真菜单栏下,点击时钟连续。
等待运行完毕,即 MEM
的指令不在变化。然后查看 MEM
中的内容,看是否排序成功。
然后就可以看到排序后的结果。
问题 5:注意变长指令的状态机和输出函数封装¶
连变长指令的硬布线控制器注意要将 状态机 和 输出函数 换成变长指令的。因为头歌测试变长的电路图和定长的电路图是在一块。
问题 6:时钟滴答¶
在一些需要等待时钟到达特定周期的实验中,我们可以通过设置时钟滴答频率来加速仿真。
问题 7:如何调试硬布线控制器组合逻辑单元(第四关)¶
头歌平台 提示
如果最后输出的控制信号与标准答案不一致,可以将对应的 OCinput
值加载在控制器上,检查控制总线与标准值的差异,重新填表生成相应控制信号。
这里需要注意,头歌平台给出的 OCinput
是十六进制,例如不一致的 OCinput 为 0489
,转为二进制 0 0100 1000 1001
,一共 13 位,与控制器电路输入对应: