一、什么是CPU?
CPU即中央處理單元的英文縮寫,它是計算機(jī)的核心部件。計算機(jī)進(jìn)行信息處理可分為兩個步驟:
將數(shù)據(jù)和程序(即指令序列)輸入到計算機(jī)的存儲器中。
從第一條指令的地址起開始執(zhí)行該程序,得到所需結(jié)果,結(jié)束運(yùn)行。CPU的作用是協(xié)調(diào)并控制計算機(jī)的各個部件執(zhí)行程序的指令序列,使其有條不紊地進(jìn)行。因此它必須具有以下基本功能:
a)取指令:當(dāng)程序已在存儲器中時,首先根據(jù)程序入口地址取出一條程序,為此要發(fā)出指令地址及控制信號。
b)分析指令:即指令譯碼。是對當(dāng)前取得的指令進(jìn)行分析,指出它要求什么操作,并產(chǎn)生相應(yīng)的操作控制命令。
c)執(zhí)行指令:根據(jù)分析指令時產(chǎn)生的“操作命令”形成相應(yīng)的操作控制信號序列,通過運(yùn)算器,存儲器及輸入/輸出設(shè)備的執(zhí)行,實(shí)現(xiàn)每條指令的功能,其中包括對運(yùn)算結(jié)果的處理以及下條指令地址的形成。
將其功能進(jìn)一步細(xì)化,可概括如下:
能對指令進(jìn)行譯碼并執(zhí)行規(guī)定的動作;
可以進(jìn)行算術(shù)和邏輯運(yùn)算;
能與存儲器,外設(shè)交換數(shù)據(jù);
提供整個系統(tǒng)所需要的控制;
盡管各種CPU的性能指標(biāo)和結(jié)構(gòu)細(xì)節(jié)各不相同,但它們所能完成的基本功能相同。由功能分析,可知任何一種CPU內(nèi)部結(jié)構(gòu)至少應(yīng)包含下面這些部件:
算術(shù)邏輯運(yùn)算部件(ALU),
累加器,
程序計數(shù)器,
指令寄存器,譯碼器,
時序和控制部件。
RISC即精簡指令集計算機(jī)(ReducedInstructionSetComputer)的縮寫。它是一種八十年代才出現(xiàn)的CPU,與一般的CPU相比不僅只是簡化了指令系統(tǒng),而且是通過簡化指令系統(tǒng)使計算機(jī)的結(jié)構(gòu)更加簡單合理,從而提高了運(yùn)算速度。從實(shí)現(xiàn)的途徑看,RISC_CPU與一般的CPU的不同處在于:它的時序控制信號形成部件是用硬布線邏輯實(shí)現(xiàn)的而不是采用微程序控制的方式。所謂硬布線邏輯也就是用觸發(fā)器和邏輯門直接連線所構(gòu)成的狀態(tài)機(jī)和組合邏輯,故產(chǎn)生控制序列的速度比用微程序控制方式快得多,因為這樣做省去了讀取微指令的時間。RISC_CPU也包括上述這些部件,下面就詳細(xì)介紹一個簡化的用于教學(xué)目的的RISC_CPU的可綜合VerilogHDL模型的設(shè)計和仿真過程。
二、RISC CPU結(jié)構(gòu)
RISC_CPU是一個復(fù)雜的數(shù)字邏輯電路,但是它的基本部件的邏輯并不復(fù)雜。可把它分成八個基本部件:
指令寄存器
累加器
RISC CPU算術(shù)邏輯運(yùn)算單元
數(shù)據(jù)控制器
狀態(tài)控制器
程序計數(shù)器
地址多路器
其中時鐘發(fā)生器利用外來時鐘信號進(jìn)行分頻生成一系列時鐘信號,送往其他部件用作時鐘信號。各部件之間的相互操作關(guān)系則由狀態(tài)控制器來控制。下面逐一介紹各部件的具體結(jié)構(gòu)和邏輯關(guān)系。
1 時鐘發(fā)生器
時鐘發(fā)生器clkgen利用外來時鐘信號clk來生成一系列時鐘信號clk1、fetch、alu_clk送往CPU的其他部件。其中fetch是外來時鐘clk的八分頻信號。利用fetch的上升沿來觸發(fā)CPU控制器開始執(zhí)行一條指令,同時fetch信號還將控制地址多路器輸出指令地址和數(shù)據(jù)地址。clk1信號用作指令寄存器、累加器、狀態(tài)控制器的時鐘信號。alu_clk則用于觸發(fā)算術(shù)邏輯運(yùn)算單元。時鐘發(fā)生器clkgen的波形見下圖所示:
其VerilogHDL程序見下面的模塊:
由于在時鐘發(fā)生器的設(shè)計中采用了同步狀態(tài)機(jī)的設(shè)計方法,不但使clk_gen模塊的源程序可以被各種綜合器綜合,也使得由其生成的clk1、clk2、clk4、fetch、alu_clk在跳變時間同步性能上有明顯的提高,為整個系統(tǒng)的性能提高打下了良好的基礎(chǔ)。
2 指令寄存器
顧名思義,指令寄存器用于寄存指令。指令寄存器的觸發(fā)時鐘是clk1,在clk1的正沿觸發(fā)下,寄存器將數(shù)據(jù)總線送來的指令存入高8位或低8位寄存器中。但并不是每個clk1的上升沿都寄存數(shù)據(jù)總線的數(shù)據(jù),因為數(shù)據(jù)總線上有時傳輸指令,有時傳輸數(shù)據(jù)。什么時候寄存,什么時候不寄存由CPU狀態(tài)控制器的load_ir信號控制。load_ir信號通過ena口輸入到指令寄存器。復(fù)位后,指令寄存器被清為零。每條指令為2個字節(jié),即16位。高3位是操作碼,低13位是地址。(CPU的地址總線為13位,尋址空間為8K字節(jié)。)本設(shè)計的數(shù)據(jù)總線為8位,所以每條指令需取兩次。先取高8位,后取低8位。而當(dāng)前取的是高8位還是低8位,由變量state記錄。state為零表示取的高8位,存入高8位寄存器,同時將變量state置為1。下次再寄存時,由于state為1,可知取的是低8位,存入低8位寄存器中。
其VerilogHDL程序見下面的模塊:
3.累加器
累加器用于存放當(dāng)前的結(jié)果,它也是雙目運(yùn)算其中一個數(shù)據(jù)來源。復(fù)位后,累加器的值是零。當(dāng)累加器通過ena口收到來自CPU狀態(tài)控制器load_acc信號時,在clk1時鐘正跳沿時就收到來自于數(shù)據(jù)總線的數(shù)據(jù)。其VerilogHDL程序見下面的模塊:
4.算術(shù)運(yùn)算器
算術(shù)邏輯運(yùn)算單元根據(jù)輸入的8種不同操作碼分別實(shí)現(xiàn)相應(yīng)的加、與、異或、跳轉(zhuǎn)等8種基本操作運(yùn)算。利用這幾種基本運(yùn)算可以實(shí)現(xiàn)很多種其它運(yùn)算以及邏輯判斷等操作。其VerilogHDL程序見下面的模塊:
5.數(shù)據(jù)控制器
數(shù)據(jù)控制器的作用是控制累加器數(shù)據(jù)輸出,由于數(shù)據(jù)總線是各種操作時傳送數(shù)據(jù)的公共通道,不同的情況下傳送不同的內(nèi)容。有時要傳輸指令,有時要傳送RAM區(qū)或接口的數(shù)據(jù)。累加器的數(shù)據(jù)只有在需要往RAM區(qū)或端口寫時才允許輸出,否則應(yīng)呈現(xiàn)高阻態(tài),以允許其它部件使用數(shù)據(jù)總線。所以任何部件往總線上輸出數(shù)據(jù)時,都需要一控制信號。而此控制信號的啟、停,則由CPU狀態(tài)控制器輸出的各信號控制決定。數(shù)據(jù)控制器何時輸出累加器的數(shù)據(jù)則由狀態(tài)控制器輸出的控制信號datactl_ena決定。其VerilogHDL程序見下面的模塊:
6.地址多路器
地址多路器用于選擇輸出的地址是PC(程序計數(shù))地址還是數(shù)據(jù)/端口地址。每個指令周期的前4個時鐘周期用于從ROM中讀取指令,輸出的應(yīng)是PC地址。后4個時鐘周期用于對RAM或端口的讀寫,該地址由指令中給出。地址的選擇輸出信號由時鐘信號的8分頻信號fetch提供。其VerilogHDL程序見下面的模塊:
7.程序計數(shù)器
程序計數(shù)器用于提供指令地址。以便讀取指令,指令按地址順序存放在存儲器中。有兩種途徑可形成指令地址:其一是順序執(zhí)行的情況,其二是遇到要改變順序執(zhí)行程序的情況,例如執(zhí)行JMP指令后,需要形成新的指令地址。復(fù)位后,指令指針為零,即每次CPU重新啟動將從ROM的零地址開始讀取指令并執(zhí)行。每條指令執(zhí)行完需2個時鐘,這時pc_addr已被增2,指向下一條指令。(因為每條指令占兩個字節(jié)。)如果正執(zhí)行的指令是跳轉(zhuǎn)語句,這時CPU狀態(tài)控制器將會輸出load_pc信號,通過load口進(jìn)入程序計數(shù)器。程序計數(shù)器(pc_addr)將裝入目標(biāo)地址(ir_addr),而不是增2。其VerilogHDL程序見下面的模塊:
8.狀態(tài)控制器
狀態(tài)控制器由兩部分組成:
狀態(tài)機(jī)(上圖中的MACHINE部分)
狀態(tài)控制器(上圖中的MACHINECTL部分)
狀態(tài)機(jī)控制器接受復(fù)位信號RST,當(dāng)RST有效時通過信號ena使其為0,輸入到狀態(tài)機(jī)中停止?fàn)顟B(tài)機(jī)的工作。狀態(tài)控制器的VerilogHDL程序見下面模塊:
狀態(tài)機(jī)是CPU的控制核心,用于產(chǎn)生一系列的控制信號,啟動或停止某些部件。CPU何時進(jìn)行讀指令讀寫I/O端口,RAM區(qū)等操作,都是由狀態(tài)機(jī)來控制的。狀態(tài)機(jī)的當(dāng)前狀態(tài),由變量state記錄,state的值就是當(dāng)前這個指令周期中已經(jīng)過的時鐘數(shù)(從零計起)。指令周期是由8個時鐘周期組成,每個時鐘周期都要完成固定的操作。
第0個時鐘,因為CPU狀態(tài)控制器的輸出:rd和load_ir為高電平,其余均為低電平。指令寄存器寄存由ROM送來的高8位指令代碼。
第1個時鐘,與上一時鐘相比只是inc_pc從0變?yōu)?故PC增1,ROM送來低8位指令代碼,指令寄存器寄存該8位代碼。
第2個時鐘,空操作。
第3個時鐘,PC增1,指向下一條指令。若操作符為HLT,則輸出信號HLT為高。如果操作符不為HLT,除了PC增一外(指向下一條指令),其它各控制線輸出為零。
第4個時鐘,若操作符為AND、ADD、XOR或LDA,讀相應(yīng)地址的數(shù)據(jù);若為JMP,將目的地址送給程序計數(shù)器;若為STO,輸出累加器數(shù)據(jù)。
第5個時鐘,若操作符為ANDD、ADD或XORR,算術(shù)運(yùn)算器就進(jìn)行相應(yīng)的運(yùn)算;若為LDA,就把數(shù)據(jù)通過算術(shù)運(yùn)算器送給累加器;若為SKZ,先判斷累加器的值是否為0,如果為0,PC就增1,否則保持原值;若為JMP,鎖存目的地址;若為STO,將數(shù)據(jù)寫入地址處。
第6個時鐘,空操作。
第7個時鐘,若操作符為SKZ且累加器值為0,則PC值再增1,跳過一條指令,否則PC無變化。
狀態(tài)機(jī)的VerilogHDL程序見下面模塊:
9.外圍模塊
為了對RISC_CPU進(jìn)行測試,需要有存儲測試程序的ROM和裝載數(shù)據(jù)的RAM、地址譯碼器。下面來簡單介紹一下:
地址譯碼器
地址譯碼器用于產(chǎn)生選通信號,選通ROM或RAM。FFFFH---1800H RAM1800H---0000H ROM
ROM用于裝載測試程序,可讀不可寫。RAM用于存放數(shù)據(jù),可讀可寫。
三、RISC CPU中各部件的相互連接關(guān)系
四、RISC CPU和它的外圍電路
五、RISC CPU的尋址方式和指令系統(tǒng)
RISC_CPU的指令格式一律為:
指令系統(tǒng)僅由8條指令組成:
1)HLT停機(jī)操作。該操作將空一個指令周期,即8個時鐘周期。
2)SKZ為零跳過下一條語句。該操作先判斷當(dāng)前alu中的結(jié)果是否為零,若是零就跳過下一條語句,否則繼續(xù)執(zhí)行。
3)ADD相加。該操作將累加器中的值與地址所指的存儲器或端口的數(shù)據(jù)相加,結(jié)果仍送回累加器中。
4)AND相與。該操作將累加器的值與地址所指的存儲器或端口的數(shù)據(jù)相與,結(jié)果仍送回累加器中。
5)XOR異或。該操作將累加器的值與指令中給出地址的數(shù)據(jù)異或,結(jié)果仍送回累加器中。
6)LDA讀數(shù)據(jù)。該操作將指令中給出地址的數(shù)據(jù)放入累加器。
7)STO寫數(shù)據(jù)。該操作將累加器的數(shù)據(jù)放入指令中給出的地址。
8)JMP無條件跳轉(zhuǎn)語句。該操作將跳轉(zhuǎn)至指令給出的目的地址,繼續(xù)執(zhí)行。
RISC_CPU是8位微處理器,一律采用直接尋址方式,即數(shù)據(jù)總是放在存儲器中,尋址單元的地址由指令直接給出。這是最簡單的尋址方式。
六、RISC CPU的操作和時序
一個微機(jī)系統(tǒng)為了完成自身的功能,需要CPU執(zhí)行許多操作。以下是RISC_CPU的主要操作:
1.系統(tǒng)的復(fù)位和啟動操作
2.總線讀操作
3.總線寫操作
下面詳細(xì)介紹一下每個操作:
1.系統(tǒng)的復(fù)位和啟動操作
RISC_CPU的復(fù)位和啟動操作是通過rst引腳的信號觸發(fā)執(zhí)行的。當(dāng)rst信號一進(jìn)入高電平,RISC_CPU就會結(jié)束現(xiàn)行操作,并且只要rst停留在高電平狀態(tài),CPU就維持在復(fù)位狀態(tài)。在復(fù)位狀態(tài),CPU各內(nèi)部寄存器都被設(shè)為初值,全部為零。數(shù)據(jù)總線為高阻態(tài),地址總線為0000H,所有控制信號均為無效狀態(tài)。rst回到低電平后,接著到來的第一個fetch上升沿將啟動RISC_CPU開始工作,從ROM的000處開始讀取指令并執(zhí)行相應(yīng)操作。波形圖如下圖所示。虛線標(biāo)志處為RISC_CPU啟動工作的時刻。
RISC_CPU的復(fù)位和啟動操作波形
2.總線讀操作
每個指令周期的前0--3個時鐘周期用于讀指令,在狀態(tài)控制器一節(jié)中已詳細(xì)講述,這里就不再重復(fù)。第3.5個周期處,存儲器或端口地址就輸出到地址總線上,第4--6個時鐘周期,讀信號rd有效,數(shù)據(jù)送到數(shù)據(jù)總線上,以備累加器鎖存,或參與算術(shù)、邏輯運(yùn)算。第7個時鐘周期,讀信號無效,第7.5個周期,地址總線輸出PC地址,為下一個指令做好準(zhǔn)備。
CPU從存儲器或端口讀取數(shù)據(jù)的時序
3 寫總線操作
每個指令周期的第3.5個時鐘周期處,寫的地址就建立了,第4個時鐘周期輸出數(shù)據(jù),第5個時鐘周期輸出寫信號。至第6個時鐘結(jié)束,數(shù)據(jù)無效,第7.5時鐘地址輸出為PC地址,為下一個指令周期做好準(zhǔn)備。
-
指令
+關(guān)注
關(guān)注
1文章
606瀏覽量
35618 -
編程
+關(guān)注
關(guān)注
88文章
3574瀏覽量
93545 -
RISC CPU
+關(guān)注
關(guān)注
0文章
3瀏覽量
7086
原文標(biāo)題:基于狀態(tài)機(jī)的簡易RISC CPU設(shè)計(看完你也可以設(shè)計CPU了?。?/p>
文章出處:【微信號:wc_ysj,微信公眾號:旺材芯片】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論