此次CPU實驗,我應該是最早驗收的,所以在此分享給大家,少走彎路,
CPU資源https://download.csdn.net/download/tian246319/14014833
一、設計目的
完整、連貫地運用《數字邏輯》所學到的知識,熟練掌握 EDA 工具基本使用方法,為
學習好后續《計算機原理》課程做鋪墊,
二、設計內容
1、按照給定的資料通路、資料格式和指令系統,使用 EDA 工具設計一臺用硬連線邏
輯控制的簡易計算機;
2、要求靈活運用各方面知識,使得所設計的計算機具有較佳的性能;
3、對所設計計算機的性能指標進行分析,整理出設計報告,
-
詳細設計
3.1設計的整體架構
(1)普通部件
1、指令計數器PC
2、選擇器
3、RAM存盤器
4、指令暫存器IR
5、指令譯碼器
6、(圖中無標出)控制臺,用于發出控制信號
7、通用暫存器組
8、函式發生器(ALU運算器)
9、移位邏輯
(2)資料通路

-
部件之間聯系和指令執行的一般流程
取指令:
1、首先通過時鐘信號對PC發出指令,將PC中的地址通過選擇器傳遞到RAM,
2、RAM根據PC傳來的地址,執行存盤在RAM中的指令,將指令輸入到總線,
3、總線上的指令暫存器IR在控制信號的控制下讀入RAM傳來的指令,
4、指令暫存器IR將指令發送到指令譯碼器,指令通過指令譯碼器和控制臺輸出指令所需要的所有控制信號,
執行指令:
資料傳送類指令的執行程序
暫存器之間的傳送
MOV R1,R2
要求完成的操作為(R2)→R1,執行程序為:
由 R2 的編碼通過 RAA1、RAA0 從通用暫存器組 A 口讀出 R2 的內容,在 S3~S0 和
M的控制下,經 ALU 送入總線 BUS;由/WE 控制和 R1 的編碼選擇 RWBA1、RWBA0,將BUS
上的資料寫入通用暫存器 R1,
暫存器到記憶體的傳送
MOV M,R2
要求完成的操作為(R2)→(C),執行程序為:
由 M 的編碼 11 通過 RWBA1、RWBA0 從通用暫存器 B 口讀出 C
暫存器中的地址,在MADD=2 的控制下,地址通過選擇器到達存盤器 RAM 的地址輸入端;由
R2 的編碼通過RAA1、RAA0 從通用暫存器組 A 口讀出 R2 的內容,在 S3~S0 和 M
的控制下,經 ALU 送入總線 BUS,并在/CS 和 XL 控制下將 BUS 上的資料寫入存盤器
RAM,
記憶體到暫存器的傳送
MOV R1,M
要求完成的操作為((C))→R1,執行程序為:
由 M 的編碼 11 通過 RAA1、RAA0 從通用暫存器 A 口讀出 C 暫存器中的地址,在
MADD=1 的控制下,地址通過選擇器到達存盤器 RAM 的地址輸入端,/CS 和 DL
使資料出現在 BUS 上;由/WE 控制和 R1 的編碼選擇 RWBA1、RWBA0,將 BUS
上的資料寫入通用暫存器 R1,
算術邏輯運算類指令的執行程序
ADD R1,R2
SUB R1,R2
OR R1,R2
這類指令的執行程序為:
由 R2 的編碼通過 RAA1、RAA0 從通用暫存器組 A 口讀出 R2 的內容,由 R1 的編碼通過
RWBA1、RWBA0 從通用暫存器組 B 口讀出 R1 的內容,在 S3~S0 和 M 的控制下,經ALU
送入總線 BUS;由/WE 控制和 R1 的編碼選擇 RWBA1、RWBA0,將 BUS
上的資料寫入通用暫存器 R1,其中 ADD 和 SUB 指令影響狀態位 Zf和 Cf,
移位指令的執行程序
RSR R1
RSL R1
這類指令的執行程序為:
由 R1 的編碼通過 RWBA1、RWBA0 從通用暫存器組 B 口讀出 R1 的內容,在 S3~S0和 M
的控制下通過 ALU,經移位邏輯回圈右移或回圈左移后送入總線 BUS;再由/WE 控制和 R1
的編碼選擇 RWBA1、RWBA0,將 BUS 上的資料寫入通用暫存器 R1,
一條指令執行完畢,RAM讀取下一條指令,
轉移類指令的執行程序
JMP add
JZ add
JC add
這類指令為雙位元組指令,第一位元組為指令碼,第二位元組為轉移目標地址,這類指令的執
行程序為:
在 MADD=0 的控制下,程式計數器 PC 中的地址通過選擇器到達存盤器 RAM
的地址輸入端,在/CS 和 DL 控制下轉移地址從 RAM 中讀出并送入
BUS;如果條件滿足(IN PC=0,LDPC=1)則在 LD PC 允許下將 BUS 上的資料輸入
PC,作為PC下一次的輸出,否則 PC 加 1 計數,并作為下一次的輸出,
(4)總邏輯圖

3.2各模塊的具體實作
(此部分必須有模塊的介面設計,功能實作,功能的仿真驗證等內容,)
- 指令計數器PC
介面設計:
(1)inc,ld兩個信號輸入,代表控制計數器自加一和資料輸出以及讀入的信號,
(2)clk時鐘信號,接受外部時序控制執行操作,
(3)a[7…0]和c[8…0],前者代表資料讀入,后者代表輸出,
原理圖

VHDL代碼:

仿真波形:

功能分析:
| CLK | inc | ld | 功能 |
|---|---|---|---|
| 1 | 0 | c<=c+1(不加載輸入,輸出自加一) | |
| 0 | 1 | c<=a(加載輸入) |
- 選擇器
原理圖

介面設計:
(1)madd是2位控制信號,用于選擇地址來源,
(2)R1,R2,R3是三個地址來源,對應PC、暫存器A口和暫存器B口,
VHDL代碼:

仿真波形:

功能分析:
| madd | 功能 |
|---|---|
| 00 | selout<=RO(選擇R0輸出) |
| 01 | selout<=R1(選擇R1輸出) |
| 10 | selout<=R2(選擇R2輸出) |
- RAM存盤器
介面設計:
(1)使用address輸入和dio輸出,都是8位,輸入為地址,輸出為指令,指令存盤在RAM中,
(2)有we、outenab控制信號,代表讀寫有效,
(3)有時鐘控制信號,對RAM的讀取寫入進行流程控制,
功能分析
(1)RAM是存盤各種指令的地方,可以進行指令的讀寫,
(2)構造RAM中的指令,需要在新建檔案里面建立一個mif檔案,設定好引數(256個,8位)根據指令表構造指令存入即可,
(3)RAM也有時鐘信號,配合其他元件,用于控制RAM何時進行讀寫操作,
原理圖:

VHDL代碼:
呼叫了LPM庫,略
仿真波形:(利用了三態門)

功能分析:
| CLK | we | outenab | 功能 |
|---|---|---|---|
| 0 | 0 | Dio<=高阻態Z | |
| 1 | 0 | Dio的資料寫入address所指定的存盤單元 | |
| 0 | 1 | address所指定的存盤單元資料從dio輸出 |
- 指令暫存器(IR)
介面設計:
(1)input是8位的輸入,output是8位的輸出,
(2)ld代表將BUS總線上的資料傳輸入譯碼器,1有效,
(3)clk時鐘信號介面,這個部件也需要時序控制,
原理圖:

VHDL代碼:

仿真波形:

功能分析:
| clk | ld | 功能 |
|---|---|---|
| 1 | output<=input |
- 指令譯碼器
介面設計:
(1)輸入的IR是8位的指令,SM為時鐘信號,
(2)輸出對應的是各個指令所需要的操作,傳輸入控制臺具體執行
原理圖:

VHDL代碼:



波形仿真:
**

**
功能分析:
指令譯碼器的功能就是對于輸入的各種指令進行讀取分析,輸出一系列的控制信號,

- 控制器:
介面設計:
包括輸入的信號,以及所有指令譯碼器傳過來的指令信號,由控制器具體執行發出信號,
原理圖:

VHDL代碼:

波形仿真:

功能分析:
將M信號改成了,M=1時在ALU中進行操作,M=0時選擇輸入進行直傳,

- 通用暫存器組:
介面設計:
(1)i是8位的輸入,AO,BO,AR,BR,CR是8位的輸出,(AR、BR、CR輸出的分別是A暫存器、B暫存器和C暫存器的值,AO、BO輸出的分別根據RA和WA的值決定)
(2)we代表將BUS總線上的資料傳輸入暫存器組,0有效,
(3)clk時鐘信號介面,這個部件也需要時序控制,
原理圖:

VHDL代碼:

波形仿真:

功能分析:
| CLK | WE | RAA[1…0] | RWBA[1…0] | 功能 |
|---|---|---|---|---|
| 1 | 00或01或10 | 00或01或10 | 根據RAA[1…0]的值從A,B,C中選擇一個暫存器的值由AO口輸出 如RAA[1…0]=00,AO<=A暫存器的值 RAA[1…0]=01,AO<=B暫存器的值 RAA[1…0]=10,AO<=C暫存器的值 根據RWBA[1…0]的值從選擇A,B,C中選擇一個暫存器的值由BO口輸出, 如RWBA[1…0]=00,BO<=A暫存器的值 RWBA[1…0]=01,BO<=B暫存器的值 RWBA[1…0]=10,BO<=C暫存器的值 | |
| 0 | XX | 00或01或10 | 根據RWBA[1…0]的值,將外部輸入寫入A,B,C三個暫存器中的一個暫存器內, |
- 函式發生器(ALU)
介面設計:
(1)使能端信號en,為0直傳,為1計算,
(2)4位控制信號S,代表ALU執行的各種操作,
(3)A,B,output三個8位介面,代表通用暫存器AO、BO口傳來的資料和ALU的運算結果,
(4)C輸出代表進位,Z輸出代表運算結果,結果為00000000時輸出1,否則為0,在跳轉指令中起作用,
原理圖:

VHDL代碼:

波形仿真:

功能分析:
ALU的功能主要是實作加、減、或等運算,由S控制,另外ALU作為資料通路,在特定的指令下,也執行直傳操作,直傳的資料來源可能有兩個,AO口和BO口,這里的ALU我定義了兩個新的控制信號S,是“1100”和“0000”,這兩個指令,在指令表中沒有定義,這里額外定義不會沖突,前者表示直傳B,后者表示直傳A,
| S | en | 功能 |
|---|---|---|
| 1001 | 1 | output<=A+B(ADD) |
| 0110 | 1 | output<=A-B(SUB) |
| 1011 | 1 | output<=A∨B(OR) |
| 1110 | 1 | output<=A∧B(AND) |
| 0101 | 1 | output<=/A(NOT) |
| 0000 | 0 | output<=A(直傳A) |
| 1100 | 0 | output<=B(直傳B) |
- 移位邏輯
介面設計:
(1)INPUT和OUTPUT是8位的輸出和輸出,
(2)三個控制信號:FBUS為1則直傳,FR為1右移,FL為1左移,
(3)C代表被移除的那一位,即左移時輸出原最左一位,右移時輸出原最右一位,
原理圖:

VHDL代碼:

波形仿真:

功能分析:
移位邏輯部件的功能類似于ALU,也是兩方面:一方面根據信號控制進行資料的處理,左移和右移,并將移除的位輸出;另一方面作為資料通路,在特殊信號控制下進行直傳,
| F_BUS | FL | FR | 功能 |
|---|---|---|---|
| 1 | 0 | 0 | 直傳 |
| 0 | 1 | 0 | 回圈左移一位 |
| 0 | 0 | 1 | 回圈右移一位 |
| 0 | 0 | 0 | 輸出高阻態 |
- 跳轉指令控制
介面設計:
C的來源有ALU和移位邏輯,Z的來源是ALU,
原理圖:

VHDL代碼:

波形仿真:

功能分析:
| clk | en | 功能 |
|---|---|---|
| 1 | out<=in |
- 停機控制
介面設計:
(1)兩個輸入,clk是時鐘信號,HALT使能端控制信號,
(2)輸出為時鐘信號,受到控制信號影響,
原理圖:

VHDL代碼:

波形仿真:

功能分析:
這是一個停機操作,加在時鐘信號傳入電路之前,
| HALT | 功能 |
|---|---|
| 1 | clock<=Z |
| 0 | clock<=clk |
- 總線輸入、輸出控制
介面分析:
1個8位輸入,連接總線,1個使能端,1個8位輸出,使能端為1,傳輸總線資料至輸出,燈發光,使能端為0,輸出高阻態,
原理圖:

VHDL代碼:


波形仿真:

功能分析:
| en | 功能 |
|---|---|
| 1 | output<=input |
| 0 | output<=Z |
- 時鐘信號控制
原理圖:

VHDL代碼:

波形仿真:

sm=0為取指令周期,sm=1為執行指令周期,
-
系統測驗
4.1 測驗環境
Quartus II 9.0 仿真型別:Functional
4.2 測驗代碼
測驗一:

測驗二:

- 測驗結果
測驗一:



-
IN指令,0.0-10.0ns取指令,10.0-20.0ns執行指令,指令編碼為00100000,將總線上的輸入加載入暫存器A,此時總線上的輸入為11000000,故執行完這個指令后暫存器A的存盤的值由初始值00000000變為11000000;
-
OUT指令,20.0-30.0ns取指令,30.0-40.0ns執行指令,指令編碼為01000000,將暫存器A中的值輸出到發光二極管,由于沒有線路板原件,故只能模擬,輸出到總線為暫存器A中的值11000000;
-
ADD指令,40.0-50.0ns取指令,50.0-60.0ns執行指令,指令編碼為10010001,將暫存器A中的值11000000和暫存器B中的值00000001相加后存入暫存器A,故執行完這個指令后暫存器A中的值變為11000001;
-
OR指令,60.0-70.0ns取指令,70.0-80.0ns執行指令,指令編碼為10110010,將暫存器A中的值11000001和暫存器C中的值00000010按位相或后存入暫存器A,故執行完這個指令后暫存器A中的值仍為11000011;
-
NOT指令,80.0-90.0ns取指令,90.0-100.0ns執行指令,指令編碼為01010000,將暫存器A中的值11000011按位取反后存入暫存器A,故執行完這個指令后暫存器A中的值變為00111100;
-
MOVA指令,100.0-110.0ns取指令,110.0-120.0ns執行指令,指令編碼為11110100,將暫存器A中的值存入暫存器B,故執行完這個指令后暫存器B中的由00000001變為00111100;
-
SUB指令,120.0-130.0ns取指令,130.0-140.0ns執行指令,指令編碼為01100001,將暫存器A中的值減去暫存器B中的值后得到的結果存入暫存器A,故執行完這個指令后暫存器A的值變為00000000,此時結果為0,Z標志位為1;
-
JZ指令,140.0-150.0ns取指令,150.0-160.0ns執行指令,指令編碼為00010001,滿足跳轉條件,后面跟的address編碼為00011000,下一次取指令的地址將變為00011000;
-
MOVC指令,160.0-170.0ns取指令,170.0-180.0ns執行指令,指令編碼為11110111,從暫存器C中讀出地址00000010,將RAM中該地址的值10010001存入暫存器B中,故執行完這個指令后暫存器B的值由01000000變為10010001;
-
HALT指令,180.0-190.0ns取指令,因為是停機指令,所以不需要等到下一個下降沿,指令編碼為10000000,總線資料全為高阻態,后序指令都不將讀取和執行,
上述指令操作結果均符合預期,
測驗二:


- NOP指令:0.0-10.0ns取指令,10.0-20.0ns執行指令,指令編碼為01110000,將PC的值加1;
(2)RSL指令:20.0-30.0ns取指令,30.0-40.0ns執行指令,指令編碼為10101011,將暫存器C中的值回圈左移一位,故執行完這個指令后暫存器C中的值由00000010變為00000100;
(3)RSR指令:40.0-50.0ns取指令,50.0-60.0ns執行指令,指令編碼為10100100,將暫存器B中的值回圈右移一位,故執行完這個指令后暫存器B中的值由00000001變為10000000,且C標志位變為1;
(4)JC指令:60.0-70.0ns取指令,70.0-80.0ns執行指令,指令編碼為00010010,滿足跳轉條件,后面跟的address為00100100,故下一次取指令的地址將變為00100100;
(5)MOVB指令:80.0-90.0取指令,90.0-100.0執行指令,指令編碼為11111100,讀出暫存器A中的值00000000和暫存器C中的值00000100,將暫存器A的值寫入RAM中地址為暫存器C中的值的單元,由下一條JMP指令檢測其正確性,
(6)JMP指令:100.0-110.0取指令,110.0-120.0執行指令,指令編碼為00010000,后面跟的地址為00000100,故下一次取指令的地址將變為00000100;
可觀測到下一次取出的指令為00000000,而不是mif檔案中00000100對應的00010010正是上次MOVB指令造成的結果,
上述指令操作結果均符合預期,



信安應憐兒和你一起努力~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/244281.html
標籤:其他
上一篇:計算機控制器及其設計實作
