處理器的指令集決定了處理器能做什么沈矿、擅長做什么惜犀,也決定了處理器的復(fù)雜度甲脏。舉個例子貌嫡,當(dāng)指令集中包含了很多特殊數(shù)學(xué)運算指令如舍入,不同精度定點浮點運算狡孔,除法,蝶形運算和比特反轉(zhuǎn)尋址等時,這個處理器一定是針對數(shù)字信號處理而設(shè)計的數(shù)字信號處理器跟衅。
RISC是精簡指令集的縮寫,其包含的指令都是最基本的播歼,如算數(shù)運算伶跷,邏輯運算以及跳轉(zhuǎn)等必須的指令。下圖是一個典型的精簡指令集秘狞。
這個指令集包含31條指令叭莫,如第三列所示。第一列是每種指令對應(yīng)的操作碼烁试。由于這個指令集僅包含31條指令雇初,操作碼的位數(shù)是5位。為了便于擴充指令集减响,操作碼編碼為6位靖诗,最高位全是零。
操作數(shù)
通常每條指令有兩個操作數(shù)(operand)支示,分別為side_a和side_b刊橘。
有的指令只有一個操作數(shù),如跳轉(zhuǎn)指令颂鸿,其唯一的操作數(shù)就是程序執(zhí)行時要跳轉(zhuǎn)到的地址促绵。同樣所有的移位操作也只有一個操作數(shù),即暫存了待移位數(shù)的寄存器編號。移位后的數(shù)會仍然留在同一個寄存器中败晴。
同樣的浓冒,加一指令(INC)和減一指令(DEC)也只需要一個操作數(shù),因為加減一后的數(shù)也留在原地位衩。
需要注意的是有兩個指令不需要任何操作數(shù)裆蒸,分別是NOP指令和SLEEP指令。
NOP
NOP指令就是no operation的意思糖驴,處理器不干任何事情僚祷。那為什么需要這個指令?這個指令的用處可不小贮缕。程序中為了湊時序辙谜,等待,死循環(huán)等功能就是靠若干個NOP指令來實現(xiàn)的感昼。
SLEEP
SLEEP睡眠指令也很重要装哆,是為了讓處理器臨時進入低功耗狀態(tài)從而實現(xiàn)節(jié)電的效果。SLEEP需要特殊的上電電路來實現(xiàn)定嗓。
指令長度
上表的Words列給出?每種指令包含幾個Words蜕琴。每個Word包含16個bit。
可以看到除了加載立即數(shù)(LOADI)外其他所有指令都只占用一個Word宵溅,即16bit凌简。這16比特中6bit是指令字(最高位為零,方便擴充指令集)恃逻,5bit是操作數(shù)a對應(yīng)的寄存
器的編號雏搂。這表示最大支持的寄存器數(shù)為32。最低5bit對應(yīng)操作數(shù)b對應(yīng)的寄存器寇损。
指令周期
指令周期指一條指令執(zhí)行時需要的時鐘周期數(shù)凸郑。
三個加載和存儲指令,加載立即數(shù)(LOADI)指令矛市,從內(nèi)存加載(LOAD)和存儲(STORE)需要三個時鐘周期來執(zhí)行芙沥。其余所有指令都需要兩個時鐘周期來執(zhí)行。
具體每個時鐘周期處理器對應(yīng)的任務(wù)分解隨后會講到浊吏。
進位標(biāo)志 C-flag
進位標(biāo)志表示當(dāng)前運算是否發(fā)生了進位或者借位而昨。如果發(fā)生了進位或者借位時,進位標(biāo)志被置為1卿捎,否則進位標(biāo)志被置為0配紫。
上表C-flag列中標(biāo)注x的指令被執(zhí)行時會影響進位標(biāo)志。
進位標(biāo)志用來判斷指令執(zhí)行是否發(fā)生溢出午阵,也可以用來級聯(lián)前后操作躺孝,實現(xiàn)對大數(shù)的運算享扔。
零標(biāo)志 Z-flag
零標(biāo)志表示當(dāng)前運算結(jié)果是否為零。如果為零則該標(biāo)志被置為1植袍。
零標(biāo)志可以用來判斷預(yù)設(shè)的計數(shù)器是否減為零惧眠,兩個數(shù)是否相等。
ALU 算術(shù)邏輯運算單元
ALU是處理器中具體完成每條指令運算的功能模塊于个。上表最后三列給出了每條指令執(zhí)行時每個時鐘周期需要完成ALU運算氛魁。
經(jīng)過分析歸納,ALU需要支持的運算包括對操作數(shù)加1厅篓,對操作數(shù)減1秀存,兩個操作數(shù)加和減,兩個數(shù)的與或及異或等按位邏輯運算羽氮,操作數(shù)按位取反或链,左移右移。
ALU 的實現(xiàn)需要包括上面的所有功能档押“难危考慮到面積優(yōu)化,加減1和減法可以全部由加反來實現(xiàn)令宿。
ADD
以加法指令為例叼耙。第一個時鐘周期時,ALU 被用來作程度計數(shù)器(PC program counter)的加1操作粒没,從而使程序指針指向當(dāng)前指令筛婉。第二個時鐘周期完成實際的加法功能。
LOADI
所有指令中最特殊的指令是LOADI指令革娄。由于LOADI是唯一的雙字指令倾贰,第一個時鐘周期時冕碟,ALU執(zhí)行加1操作拦惋,將程序計數(shù)器指向該條指令的第一個16bit word,第二個時鐘周期時安寺,ALU再次執(zhí)行加1操作厕妖,將程序計數(shù)器指向該指令的第二個word,即立即數(shù)。
這個經(jīng)典的16bit精簡指令處理器非常適合用來學(xué)習(xí)處理器設(shè)計挑庶,匯編語言學(xué)習(xí)言秸,以及硬件描述語言學(xué)習(xí)。從理解指令集開始迎捺,到ALU設(shè)計到datapath 設(shè)計举畸,大家會很快收到良好的學(xué)習(xí)效果。