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