动手设计 CPU(二)—— 微程序控制的运算器

一、架构设计

在正式开始设计 CPU 之前,我们需要设计两个架构来熟悉一下整个环境以及完成一些小的功能部件。两个架构分别是:

  1. 微程序控制的运算器设计
  2. 微程序控制的存储器读写系统设计

本篇文章主要探讨如何设计第一个架构。

下图即为我们将要设计的 微程序控制的运算器 的整体架构。

在这里插入图片描述
由于我们还没有正式开始设计 CPU 的指令,因此暂时用下述的指令进行设计。
在这里插入图片描述
至此,我们应该可以大体明白这个架构设计的逻辑。

  1. 指令预先存在 CROM 中
  2. uPC 从 CROM 中取出指令
  3. CROM 将指令传给 CPUIR,即指令寄存器中
  4. 指令寄存器再将具体的指令内容对应传给 ALU 中
  5. ALU 执行指令,输出结果

搞明白逻辑后,我们将元件分离一一进行实现,不难发现,一共有 4 个元件,列举如下所示。

  1. uPC — 计数器
  2. CROM — 存储器
  3. CPUIR — 寄存器
  4. ALU — 运算器

二、元件实现

(1) 计数器 — uPC

由于架构中 CROM 为 256*24,因此我们需要设计 8 位的计数器,即将两个 74161 元件组合起来进行设计。(各元件具体功能可以参看:动手设计 CPU(一)—— 各类元件功能表

该元件设计不太复杂,因此此处不再赘言,具体设计内容可以查看下述的电路图。
在这里插入图片描述
设计完该元件后,我们将其封装,封装后的元件如下所示。
在这里插入图片描述

(2) 存储器 — CROM

点击下图的按钮,根据流程即可设计 1-port 的 ROM,此处设计部分为 Quartus 应用的操作,不明白的可以继续查询网上资料,此处不再赘言。
在这里插入图片描述
最后的设计成果如下所示。

在这里插入图片描述

(3) 寄存器 — CPUIR

由于 74273 元件仅提供 8 位寄存器,因此我们需要将 3 个 8 位寄存器进行并行连接组成我们所需要的 CPUIR,具体电路结构如下所示。
在这里插入图片描述
最后不要忘记将该元件封装,封装后的结果如下所示。
在这里插入图片描述

(4) 运算器 — ALU

由于 74181 中没有提供输入、输出端的寄存器,因此我们需要手动在原有的 ALU 元件中加入输入、输出寄存器的部分,并加入 74182 组成 8 位超前进位并行加法器,具体结构如下所示。

在这里插入图片描述
其中 register_normal 元件是使用 74273 封装的 8 位寄存器,主要是封装了输入端和输出端,与 74273 基本没有差别。最后,我们将这个元件封装,结果如下所示。

在这里插入图片描述

三、完整电路实现

设计完上述的 4 个元件之后,我们可以轻松搭建出我们所要设计的架构 微程序控制的运算器,具体搭建电路如下。
在这里插入图片描述
注意 uPC、CROM、uIR 的 CLK 均取反,其中 uIR 取反是为了和 uPC 保持一致,CROM 取反是因为 ROM 是下降沿打入。

而 uPC 取反的原因是,让 CROM 比 uPC 先打入,才可以读出 CROM 中第一个单元的数据。若 uPC 和 CROM 同时打入,则 uPC 的输出值会立马变成 0000 0001,即无法输出 0000 0000,因此我们需要令 CROM 比 uPC 先打入。

除了上述时钟的控制之外,其余地方没有太大难度,参考上图即可搭建成功!

四、仿真测试

内存设置

共存入两条指令,分别执行 A+BA+B+1 两个命令。
在这里插入图片描述

仿真结果

运行仿真,输出 CLK 的波形,即可得到输出结果。可以发现输出结果恰好为 A+BA+B+1 的答案,因此电路验证正确。
在这里插入图片描述

五、总结

至此,我们即实现了 微程序控制的运算器设计 的架构,总体上来说没有太大难度,主要的目的就是熟悉环境,并且设计一些基础元件,例如 ALU、uPC、uIR 等。

并且在结果输出的过程中我们遇到了时钟设计的问题,这个问题在之后将会经常出现,我们在设计时钟的时候一定要注意!

CPU 设计第二篇结束,旅程仍在继续!💪💪💪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章