一個簡單的8位處理器完整設計過程及verilog代碼,適合入門學習參考,并含有作者個人寫的指令執行過程。
1. CPU定義
我們按照應用的需求來定義計算機,本文介紹一個非常簡單的CPU的設計,它僅僅用來教學使用的。我們規定它可以存取的存儲器為64byte,其中1byte=8bits。所以這個CPU就有6位的地址線A[5:0],和8位的數據線D[7:0]。
我們僅定義一個通用寄存器AC(8bits寄存器),它僅僅執行4條指令如下:
Instruction | Instruction Code | Operation |
ADD | 00AAAAAA | AC<—AC+M[AAAAAA] |
AND | 01AAAAAA | AC<—AC^M[AAAAAA] |
JMP | 10AAAAAA | GOTO AAAAAA |
INC | 11XXXXXX | AC<—AC+1 |
除了寄存器AC外,我們還需要以下幾個寄存器:
地址寄存器A[5:0],保存6位地址。
程序計數器PC[5:0],保存下一條指令的地址。
數據寄存器D[7:0],接受指令和存儲器來的數據。
指令寄存器IR[1:0],存儲指令操作碼。
2.取指設計
在處理器執行指令之前,必須從存儲器取出指令。其中取指執行以下操作:
1〉通過地址端口A[5:0]從地址到存儲器
2〉等待存儲器準備好數據后,讀入數據。
由于地址端口數據A[5:0]是從地址寄存器中讀出的,所以取指第一個執行的狀態是
Fetch1: AR<—PC
接下來cpu發出read信號,并把數據從存儲器M中讀入數據寄存器DR中。同時pc加一。
Fetch2: DR<—M,PC<—PC+1
接下來把DR[7:6]送IR,把DR[5:0]送AR
Fetch3: IR<—DR[7:6],AR<—DR[5:0]
3.指令譯碼
Cpu在取指后進行譯碼一邊知道執行什么指令,對于本文中的CPU來說只有4條指令也就是只有4個執行例程,狀態圖如下:
4.指令執行
對譯碼中調用的4個例程我們分別討論:
4.1 ADD指令
ADD指令需要CPU做以下兩件事情:
1〉從存儲器取一個操作數
2〉把這個操作數加到AC上,并把結果存到AC
所以需要以下操作:
ADD1:DR<—M
ADD2:AC<—AC+DR
4.2 AND指令
AND指令執行過程和ADD相似,需要以下操作:
AND1:DR<—M
AND2:AC<—AC^DR
4.3 JMP指令
JMP指令把CPU要跳轉的指令地址送PC,執行以下操作
JMP1: PC<—DR[5:0]
4.4INC指令
INC指令執行AC+1操作
INC1: AC<—AC+1
總的狀態圖如下:
5 建立數據路徑
這一步我們來實現狀態圖和相應的寄存器傳輸。首先看下面的狀態及對應的寄存器傳輸:
Fetch1: AR<—PC
Fetch2: DR<—M,PC<—PC+1
Fetch3: IR<—DR[7:6],AR<—DR[5:0]
ADD1:DR<—M
ADD2:AC<—AC+DR
AND1:DR<—M
AND2:AC<—AC^DR
JMP1: PC<—DR[5:0]
INC1: AC<—AC+1
為了設計數據路徑,我們可以采用兩種辦法:
1〉創造直接的兩個要傳輸組件之間的直接路徑
2〉在CPU內部創造總線來傳輸不同組件之間的數據
首先我們回顧一下可能發生的數據傳輸,以便確定各個組件的功能。特別的我們要注意把數據載入組件的各個操作。首先我們按照他們改變了那個寄存器的數據來重組這些操作。得到如下的結果:
AR:AR<—PC;AR<—DR[5:0]
PC:PC<—PC+1;PC<—DR[5:0]
DR:DR<—M
IR:IR<—DR[7:6]
AC:AC<—AC+DR;
AC<—AC^DR;
AC<—AC+1
現在我們來看每個操作來決定每個組件執行什么樣的功能,AR,DR,IR三個組件經常從其他的組件載入數據(從總線),所以只需要執行一個并行輸入的操作。PC和AC能夠載入數據同時也能夠自動加一操作。
下一步我們把這些組件連接到總線上來,如圖所示:
如上圖所示,各個組件與總線之間通過三態連接,防止出現總線競爭。AR寄存器送出存儲器的地址,DR寄存器用于暫存存數起來的數據。到現在為止我們還沒有討論有關的控制信號,我們現在只是保證了所有的數據傳輸能夠產生,我們將在后面章節來使這些數據傳輸正確的產生---控制邏輯。
現在我們來看以下者寫數據傳輸中有沒有不必要的傳輸:
1〉 AR僅僅提供數據給存儲器,所以他不需要連接到總線上。
2〉 IR不通過總線提供數據給任何組件,所以他可以直接輸出到控制單元(后面章節)。
3〉 AC不提供數據到任何的組件,可以不連接到總線上。
4〉總線是8bit寬度的,但是有些傳輸是6bit或者2bit的,我們必須制定寄存器的那幾位送到總線的那幾位。
5〉 AC要可以載入AC和DR的和或者邏輯與的值,數據路徑中還需要進行運算的ALU。
由此我們做以下工作:
1〉去掉AR,IR, AC與總線的連接。
2〉我們約定寄存器連接是從總線的低位開始的。AR,PC連接到Bus[5:0],由于IR是接受DR[7:6]的,所以可以連接到總線的Bus[7:6]。
3〉我們設定,AC作為ALU的一個輸入,另一個輸入來自總線Bus。
下面我們檢查是否有爭用總線的情況,幸運的是這里沒有。修改后的CPU內部組織圖如下:
6. ALU設計
這個CPU的ALU執行的功能就是兩個操作數相加、邏輯與。這里不作詳細介紹。電路如如下:
7. 控制單元
現在我們來考慮如何產生數據路徑所需的控制信號,有兩種方法:硬布線邏輯和為程序控制。這里我們用硬布線邏輯來實現。
這個簡單的CPU需要的控制邏輯由三個部件組成:
1〉計數器:用于保存現在的狀態
2〉譯碼器:生成各個狀態的控制信號
3〉其他的組合邏輯來產生控制信號
一個通用的控制單元原理圖如下:
對于這個CPU來說,一共有9個狀態。所以需要一個4bit的計數器和一個4-16的譯碼器。接下來的工作就是按照前面的狀態轉換圖來對狀態進行賦值。
首先考慮如何的對譯碼輸出狀態進行賦值才能達到最佳狀態。我們按照以下規則:
1〉給Fetch1賦計數器的0值,并用計數器的清零端來達到這個狀態。由這個CPU的狀態圖可以看出,除了Fetch1狀態外的狀態都只能由一個狀態轉化而來,Fetch1需要從4個分支而來,這4個分支就可以發出清零信號(CLR)來轉移到Fetch1。
2〉把連續的狀態賦連續的計數器值,這樣就可以用計數器的INC輸入來達到狀態的轉移。
3〉給每個例程的開始狀態賦值時,要基于指令的操作碼和這個例程的最大狀態數。這樣就可以用操作碼來生成計數器的LD信號達到正確的狀態轉移。首先,在Fetch3狀態發出LD信號,然后要把正確的例程地址放到計數器的輸入端。對這個CPU來說,我們考慮以地址1 [IR] 0作為計數器的預置輸入。則得到狀態編碼如下:
Instruction | State | IR | counter |
Fetch | Fetch1 | 0000 | |
Fetch2 | 0001 | ||
Fetch3 | 0010 | ||
ADD | ADD1 | 00 | 1000 |
ADD2 | 00 | 1001 | |
AND | AND1 | 01 | 1010 |
AND2 | 01 | 1011 | |
INC | INC1 | 10 | 1100 |
JMP | JMP1 | 11 | 1110 |
如上表所示,下面我們需要設計產生計數器的LD、INC、CLR等信號,總的控制單元的邏輯如下圖:
下面我們用這些譯碼信號來產生數據路徑控制所必需的AR、PC、DR、IR、M和ALU的控制信號。首先考慮寄存器AR,他在Fetch1狀態取PC的值,并在Fetch3狀態取DR[5:0]的值,所以我們得到ARLOAD=Fetch1 or Fetch3。以此類推我們可以得到如下結果:
PCLOAD=JMP1
PCINC=Fetch2
DRLOAD=Fetch1or ADD1 or AND1
ACLOAD=ADD2 or AND2
IRLOAD=Fetch3
對于ALU的控制信號ALUSEL是用來控制ALU做邏輯或者算數運算的,所以有:
ALUSEL=AND2
對于片內總線的控制較為復雜,我們先來看DR,對于DR他只在Fetch3、AND2 、ADD2和JMP1狀態占用總線進行相信的數據傳輸,所以有:
DRBUS=Fetch3 or AND2 or ADD2 or JMP1
其他類似有:
MEMBUS=Fetch2or ADD1 or AND1
PCBUS=Fetch1
最后,控制單元需要產生存儲器的讀信號(READ),它發生在Fetch2、ADD1、AND1三個狀態:
READ=Fetch2or ADD1 or AND1
這樣我們得到了總的控制邏輯,完成了整個CPU的設計。
8.設計驗證
我們執行如下指令進行設計驗證,
0:ADD4
1:AND5
2:INC
3:JMP0
4:27H
5:39H
指令執行過程如下(初始化所有寄存器為全零態):
Instruction | State | Active Signals | Operations | Next State |
ADD 4 | Fetch1 | PCBUS、ARLOAD | AR<—0 | Fetch2 |
Fetch2 |
READ、MEMBUS DRLOAD、PCINC |
DR<—04H PC<—PC+1 |
Fetch3 | |
Fetch3 |
DRBUS、ARLOAD IRLOAD |
IR<—00 AR<—04H |
ADD1 | |
ADD1 |
READ、MEMBUS DRLOAD |
DR<—27H | ADD2 | |
ADD2 | DRBUS、ACLOAD | AC<—0+27H | Fetch1 | |
AND 5 | Fetch1 | |||
Fetch2 | ||||
Fetch3 | ||||
ADD1 | ||||
ADD2 | ||||
INC | Fetch1 | |||
Fetch2 | ||||
Fetch3 | ||||
INC1 | ||||
JMP 0 | Fetch1 | |||
Fetch2 | ||||
Fetch3 | ||||
JMP1 |
審核編輯:湯梓紅
-
處理器
+關注
關注
68文章
19259瀏覽量
229653 -
寄存器
+關注
關注
31文章
5336瀏覽量
120230 -
Verilog
+關注
關注
28文章
1351瀏覽量
110075 -
指令
+關注
關注
1文章
607瀏覽量
35694 -
代碼
+關注
關注
30文章
4779瀏覽量
68524
原文標題:一個簡單的8位處理器完整設計過程及verilog代碼
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論