一個簡單的8位處理器完整設(shè)計過程及verilog代碼,適合入門學(xué)習(xí)參考,并含有作者個人寫的指令執(zhí)行過程。
1. CPU定義
我們按照應(yīng)用的需求來定義計算機(jī),本文介紹一個非常簡單的CPU的設(shè)計,它僅僅用來教學(xué)使用的。我們規(guī)定它可以存取的存儲器為64byte,其中1byte=8bits。所以這個CPU就有6位的地址線A[5:0],和8位的數(shù)據(jù)線D[7:0]。
我們僅定義一個通用寄存器AC(8bits寄存器),它僅僅執(zhí)行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位地址。
程序計數(shù)器PC[5:0],保存下一條指令的地址。
數(shù)據(jù)寄存器D[7:0],接受指令和存儲器來的數(shù)據(jù)。
指令寄存器IR[1:0],存儲指令操作碼。
2.取指設(shè)計
在處理器執(zhí)行指令之前,必須從存儲器取出指令。其中取指執(zhí)行以下操作:
1〉通過地址端口A[5:0]從地址到存儲器
2〉等待存儲器準(zhǔn)備好數(shù)據(jù)后,讀入數(shù)據(jù)。
由于地址端口數(shù)據(jù)A[5:0]是從地址寄存器中讀出的,所以取指第一個執(zhí)行的狀態(tài)是
Fetch1: AR<—PC
接下來cpu發(fā)出read信號,并把數(shù)據(jù)從存儲器M中讀入數(shù)據(jù)寄存器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在取指后進(jìn)行譯碼一邊知道執(zhí)行什么指令,對于本文中的CPU來說只有4條指令也就是只有4個執(zhí)行例程,狀態(tài)圖如下:

4.指令執(zhí)行
對譯碼中調(diào)用的4個例程我們分別討論:
4.1 ADD指令
ADD指令需要CPU做以下兩件事情:
1〉從存儲器取一個操作數(shù)
2〉把這個操作數(shù)加到AC上,并把結(jié)果存到AC
所以需要以下操作:
ADD1:DR<—M
ADD2:AC<—AC+DR
4.2 AND指令
AND指令執(zhí)行過程和ADD相似,需要以下操作:
AND1:DR<—M
AND2:AC<—AC^DR
4.3 JMP指令
JMP指令把CPU要跳轉(zhuǎn)的指令地址送PC,執(zhí)行以下操作
JMP1: PC<—DR[5:0]
4.4INC指令
INC指令執(zhí)行AC+1操作
INC1: AC<—AC+1
總的狀態(tài)圖如下:

5 建立數(shù)據(jù)路徑
這一步我們來實現(xiàn)狀態(tài)圖和相應(yīng)的寄存器傳輸。首先看下面的狀態(tài)及對應(yīng)的寄存器傳輸:
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
為了設(shè)計數(shù)據(jù)路徑,我們可以采用兩種辦法:
1〉創(chuàng)造直接的兩個要傳輸組件之間的直接路徑
2〉在CPU內(nèi)部創(chuàng)造總線來傳輸不同組件之間的數(shù)據(jù)
首先我們回顧一下可能發(fā)生的數(shù)據(jù)傳輸,以便確定各個組件的功能。特別的我們要注意把數(shù)據(jù)載入組件的各個操作。首先我們按照他們改變了那個寄存器的數(shù)據(jù)來重組這些操作。得到如下的結(jié)果:
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
現(xiàn)在我們來看每個操作來決定每個組件執(zhí)行什么樣的功能,AR,DR,IR三個組件經(jīng)常從其他的組件載入數(shù)據(jù)(從總線),所以只需要執(zhí)行一個并行輸入的操作。PC和AC能夠載入數(shù)據(jù)同時也能夠自動加一操作。
下一步我們把這些組件連接到總線上來,如圖所示:

如上圖所示,各個組件與總線之間通過三態(tài)連接,防止出現(xiàn)總線競爭。AR寄存器送出存儲器的地址,DR寄存器用于暫存存數(shù)起來的數(shù)據(jù)。到現(xiàn)在為止我們還沒有討論有關(guān)的控制信號,我們現(xiàn)在只是保證了所有的數(shù)據(jù)傳輸能夠產(chǎn)生,我們將在后面章節(jié)來使這些數(shù)據(jù)傳輸正確的產(chǎn)生---控制邏輯。
現(xiàn)在我們來看以下者寫數(shù)據(jù)傳輸中有沒有不必要的傳輸:
1〉 AR僅僅提供數(shù)據(jù)給存儲器,所以他不需要連接到總線上。
2〉 IR不通過總線提供數(shù)據(jù)給任何組件,所以他可以直接輸出到控制單元(后面章節(jié))。
3〉 AC不提供數(shù)據(jù)到任何的組件,可以不連接到總線上。
4〉總線是8bit寬度的,但是有些傳輸是6bit或者2bit的,我們必須制定寄存器的那幾位送到總線的那幾位。
5〉 AC要可以載入AC和DR的和或者邏輯與的值,數(shù)據(jù)路徑中還需要進(jìn)行運(yùn)算的ALU。
由此我們做以下工作:
1〉去掉AR,IR, AC與總線的連接。
2〉我們約定寄存器連接是從總線的低位開始的。AR,PC連接到Bus[5:0],由于IR是接受DR[7:6]的,所以可以連接到總線的Bus[7:6]。
3〉我們設(shè)定,AC作為ALU的一個輸入,另一個輸入來自總線Bus。
下面我們檢查是否有爭用總線的情況,幸運(yùn)的是這里沒有。修改后的CPU內(nèi)部組織圖如下:

6. ALU設(shè)計
這個CPU的ALU執(zhí)行的功能就是兩個操作數(shù)相加、邏輯與。這里不作詳細(xì)介紹。電路如如下:

7. 控制單元
現(xiàn)在我們來考慮如何產(chǎn)生數(shù)據(jù)路徑所需的控制信號,有兩種方法:硬布線邏輯和為程序控制。這里我們用硬布線邏輯來實現(xiàn)。
這個簡單的CPU需要的控制邏輯由三個部件組成:
1〉計數(shù)器:用于保存現(xiàn)在的狀態(tài)
2〉譯碼器:生成各個狀態(tài)的控制信號
3〉其他的組合邏輯來產(chǎn)生控制信號
一個通用的控制單元原理圖如下:

對于這個CPU來說,一共有9個狀態(tài)。所以需要一個4bit的計數(shù)器和一個4-16的譯碼器。接下來的工作就是按照前面的狀態(tài)轉(zhuǎn)換圖來對狀態(tài)進(jìn)行賦值。
首先考慮如何的對譯碼輸出狀態(tài)進(jìn)行賦值才能達(dá)到最佳狀態(tài)。我們按照以下規(guī)則:
1〉給Fetch1賦計數(shù)器的0值,并用計數(shù)器的清零端來達(dá)到這個狀態(tài)。由這個CPU的狀態(tài)圖可以看出,除了Fetch1狀態(tài)外的狀態(tài)都只能由一個狀態(tài)轉(zhuǎn)化而來,F(xiàn)etch1需要從4個分支而來,這4個分支就可以發(fā)出清零信號(CLR)來轉(zhuǎn)移到Fetch1。
2〉把連續(xù)的狀態(tài)賦連續(xù)的計數(shù)器值,這樣就可以用計數(shù)器的INC輸入來達(dá)到狀態(tài)的轉(zhuǎn)移。
3〉給每個例程的開始狀態(tài)賦值時,要基于指令的操作碼和這個例程的最大狀態(tài)數(shù)。這樣就可以用操作碼來生成計數(shù)器的LD信號達(dá)到正確的狀態(tài)轉(zhuǎn)移。首先,在Fetch3狀態(tài)發(fā)出LD信號,然后要把正確的例程地址放到計數(shù)器的輸入端。對這個CPU來說,我們考慮以地址1 [IR] 0作為計數(shù)器的預(yù)置輸入。則得到狀態(tài)編碼如下:
| 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 |
如上表所示,下面我們需要設(shè)計產(chǎn)生計數(shù)器的LD、INC、CLR等信號,總的控制單元的邏輯如下圖:

下面我們用這些譯碼信號來產(chǎn)生數(shù)據(jù)路徑控制所必需的AR、PC、DR、IR、M和ALU的控制信號。首先考慮寄存器AR,他在Fetch1狀態(tài)取PC的值,并在Fetch3狀態(tài)取DR[5:0]的值,所以我們得到ARLOAD=Fetch1 or Fetch3。以此類推我們可以得到如下結(jié)果:
PCLOAD=JMP1
PCINC=Fetch2
DRLOAD=Fetch1or ADD1 or AND1
ACLOAD=ADD2 or AND2
IRLOAD=Fetch3
對于ALU的控制信號ALUSEL是用來控制ALU做邏輯或者算數(shù)運(yùn)算的,所以有:
ALUSEL=AND2
對于片內(nèi)總線的控制較為復(fù)雜,我們先來看DR,對于DR他只在Fetch3、AND2 、ADD2和JMP1狀態(tài)占用總線進(jìn)行相信的數(shù)據(jù)傳輸,所以有:
DRBUS=Fetch3 or AND2 or ADD2 or JMP1
其他類似有:
MEMBUS=Fetch2or ADD1 or AND1
PCBUS=Fetch1
最后,控制單元需要產(chǎn)生存儲器的讀信號(READ),它發(fā)生在Fetch2、ADD1、AND1三個狀態(tài):
READ=Fetch2or ADD1 or AND1
這樣我們得到了總的控制邏輯,完成了整個CPU的設(shè)計。
8.設(shè)計驗證
我們執(zhí)行如下指令進(jìn)行設(shè)計驗證,
0:ADD4
1:AND5
2:INC
3:JMP0
4:27H
5:39H
指令執(zhí)行過程如下(初始化所有寄存器為全零態(tài)):
| 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 |
審核編輯:湯梓紅
-
處理器
+關(guān)注
關(guān)注
68文章
20253瀏覽量
252225 -
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
129968 -
Verilog
+關(guān)注
關(guān)注
30文章
1374瀏覽量
114522 -
指令
+關(guān)注
關(guān)注
1文章
623瀏覽量
37529 -
代碼
+關(guān)注
關(guān)注
30文章
4968瀏覽量
73960
原文標(biāo)題:一個簡單的8位處理器完整設(shè)計過程及verilog代碼
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
新戰(zhàn)局,解析64位處理器以及未來發(fā)展趨勢
32位嵌入式處理器與8位處理器應(yīng)用開發(fā)的區(qū)別
詳細(xì)解析32位嵌入式處理器與8位處理器應(yīng)用開發(fā)的不同之處
32位處理器可以裝64位系統(tǒng)嗎 32位處理器能否裝64位系統(tǒng)分析
32位處理器的開發(fā)與8位處理器的開發(fā)有哪些明顯的不同?
Intel 32位處理器 ,Intel 32位處理器結(jié)構(gòu)原理
Intel 64位處理器,Intel 64位處理器結(jié)構(gòu)原理
AMD 32位處理器,AMD 32位處理器有哪些系列?
在8位處理器上實現(xiàn)高效文件系統(tǒng)
華清遠(yuǎn)見FPGA代碼-使用函數(shù)實現(xiàn)簡單的八位處理器
“硬件軟件化”,32位處理器的開發(fā)與8位處理器的開發(fā)資料下載
到底64位處理器和32位處理器有什么區(qū)別呢?資料下載
一個簡單的8位處理器完整設(shè)計過程及verilog代碼
評論