一個(gè)簡單的8位處理器完整設(shè)計(jì)過程及verilog代碼,適合入門學(xué)習(xí)參考,并含有作者個(gè)人寫的指令執(zhí)行過程。
1. CPU定義
我們按照應(yīng)用的需求來定義計(jì)算機(jī),本文介紹一個(gè)非常簡單的CPU的設(shè)計(jì),它僅僅用來教學(xué)使用的。我們規(guī)定它可以存取的存儲(chǔ)器為64byte,其中1byte=8bits。所以這個(gè)CPU就有6位的地址線A[5:0],和8位的數(shù)據(jù)線D[7:0]。
我們僅定義一個(gè)通用寄存器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外,我們還需要以下幾個(gè)寄存器:
地址寄存器A[5:0],保存6位地址。
程序計(jì)數(shù)器PC[5:0],保存下一條指令的地址。
數(shù)據(jù)寄存器D[7:0],接受指令和存儲(chǔ)器來的數(shù)據(jù)。
指令寄存器IR[1:0],存儲(chǔ)指令操作碼。
2.取指設(shè)計(jì)
在處理器執(zhí)行指令之前,必須從存儲(chǔ)器取出指令。其中取指執(zhí)行以下操作:
1〉通過地址端口A[5:0]從地址到存儲(chǔ)器
2〉等待存儲(chǔ)器準(zhǔn)備好數(shù)據(jù)后,讀入數(shù)據(jù)。
由于地址端口數(shù)據(jù)A[5:0]是從地址寄存器中讀出的,所以取指第一個(gè)執(zhí)行的狀態(tài)是
Fetch1: AR<—PC
接下來cpu發(fā)出read信號(hào),并把數(shù)據(jù)從存儲(chǔ)器M中讀入數(shù)據(jù)寄存器DR中。同時(shí)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個(gè)執(zhí)行例程,狀態(tài)圖如下:
4.指令執(zhí)行
對譯碼中調(diào)用的4個(gè)例程我們分別討論:
4.1 ADD指令
ADD指令需要CPU做以下兩件事情:
1〉從存儲(chǔ)器取一個(gè)操作數(shù)
2〉把這個(gè)操作數(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ù)路徑
這一步我們來實(shí)現(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è)計(jì)數(shù)據(jù)路徑,我們可以采用兩種辦法:
1〉創(chuàng)造直接的兩個(gè)要傳輸組件之間的直接路徑
2〉在CPU內(nèi)部創(chuàng)造總線來傳輸不同組件之間的數(shù)據(jù)
首先我們回顧一下可能發(fā)生的數(shù)據(jù)傳輸,以便確定各個(gè)組件的功能。特別的我們要注意把數(shù)據(jù)載入組件的各個(gè)操作。首先我們按照他們改變了那個(gè)寄存器的數(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)在我們來看每個(gè)操作來決定每個(gè)組件執(zhí)行什么樣的功能,AR,DR,IR三個(gè)組件經(jīng)常從其他的組件載入數(shù)據(jù)(從總線),所以只需要執(zhí)行一個(gè)并行輸入的操作。PC和AC能夠載入數(shù)據(jù)同時(shí)也能夠自動(dòng)加一操作。
下一步我們把這些組件連接到總線上來,如圖所示:
如上圖所示,各個(gè)組件與總線之間通過三態(tài)連接,防止出現(xiàn)總線競爭。AR寄存器送出存儲(chǔ)器的地址,DR寄存器用于暫存存數(shù)起來的數(shù)據(jù)。到現(xiàn)在為止我們還沒有討論有關(guān)的控制信號(hào),我們現(xiàn)在只是保證了所有的數(shù)據(jù)傳輸能夠產(chǎn)生,我們將在后面章節(jié)來使這些數(shù)據(jù)傳輸正確的產(chǎn)生---控制邏輯。
現(xiàn)在我們來看以下者寫數(shù)據(jù)傳輸中有沒有不必要的傳輸:
1〉 AR僅僅提供數(shù)據(jù)給存儲(chǔ)器,所以他不需要連接到總線上。
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的一個(gè)輸入,另一個(gè)輸入來自總線Bus。
下面我們檢查是否有爭用總線的情況,幸運(yùn)的是這里沒有。修改后的CPU內(nèi)部組織圖如下:
6. ALU設(shè)計(jì)
這個(gè)CPU的ALU執(zhí)行的功能就是兩個(gè)操作數(shù)相加、邏輯與。這里不作詳細(xì)介紹。電路如如下:
7. 控制單元
現(xiàn)在我們來考慮如何產(chǎn)生數(shù)據(jù)路徑所需的控制信號(hào),有兩種方法:硬布線邏輯和為程序控制。這里我們用硬布線邏輯來實(shí)現(xiàn)。
這個(gè)簡單的CPU需要的控制邏輯由三個(gè)部件組成:
1〉計(jì)數(shù)器:用于保存現(xiàn)在的狀態(tài)
2〉譯碼器:生成各個(gè)狀態(tài)的控制信號(hào)
3〉其他的組合邏輯來產(chǎn)生控制信號(hào)
一個(gè)通用的控制單元原理圖如下:
對于這個(gè)CPU來說,一共有9個(gè)狀態(tài)。所以需要一個(gè)4bit的計(jì)數(shù)器和一個(gè)4-16的譯碼器。接下來的工作就是按照前面的狀態(tài)轉(zhuǎn)換圖來對狀態(tài)進(jìn)行賦值。
首先考慮如何的對譯碼輸出狀態(tài)進(jìn)行賦值才能達(dá)到最佳狀態(tài)。我們按照以下規(guī)則:
1〉給Fetch1賦計(jì)數(shù)器的0值,并用計(jì)數(shù)器的清零端來達(dá)到這個(gè)狀態(tài)。由這個(gè)CPU的狀態(tài)圖可以看出,除了Fetch1狀態(tài)外的狀態(tài)都只能由一個(gè)狀態(tài)轉(zhuǎn)化而來,F(xiàn)etch1需要從4個(gè)分支而來,這4個(gè)分支就可以發(fā)出清零信號(hào)(CLR)來轉(zhuǎn)移到Fetch1。
2〉把連續(xù)的狀態(tài)賦連續(xù)的計(jì)數(shù)器值,這樣就可以用計(jì)數(shù)器的INC輸入來達(dá)到狀態(tài)的轉(zhuǎn)移。
3〉給每個(gè)例程的開始狀態(tài)賦值時(shí),要基于指令的操作碼和這個(gè)例程的最大狀態(tài)數(shù)。這樣就可以用操作碼來生成計(jì)數(shù)器的LD信號(hào)達(dá)到正確的狀態(tài)轉(zhuǎn)移。首先,在Fetch3狀態(tài)發(fā)出LD信號(hào),然后要把正確的例程地址放到計(jì)數(shù)器的輸入端。對這個(gè)CPU來說,我們考慮以地址1 [IR] 0作為計(jì)數(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è)計(jì)產(chǎn)生計(jì)數(shù)器的LD、INC、CLR等信號(hào),總的控制單元的邏輯如下圖:
下面我們用這些譯碼信號(hào)來產(chǎn)生數(shù)據(jù)路徑控制所必需的AR、PC、DR、IR、M和ALU的控制信號(hào)。首先考慮寄存器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的控制信號(hào)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)生存儲(chǔ)器的讀信號(hào)(READ),它發(fā)生在Fetch2、ADD1、AND1三個(gè)狀態(tài):
READ=Fetch2or ADD1 or AND1
這樣我們得到了總的控制邏輯,完成了整個(gè)CPU的設(shè)計(jì)。
8.設(shè)計(jì)驗(yàn)證
我們執(zhí)行如下指令進(jìn)行設(shè)計(jì)驗(yàn)證,
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文章
19259瀏覽量
229651 -
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120230 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110074 -
指令
+關(guān)注
關(guān)注
1文章
607瀏覽量
35692 -
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68521
原文標(biāo)題:一個(gè)簡單的8位處理器完整設(shè)計(jì)過程及verilog代碼
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論