動手設計 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 設計第二篇結束,旅程仍在繼續!💪💪💪

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