【文章內(nèi)容簡介】
進(jìn)行譯碼。圖34指令寄存器外部接口圖34所示,指令寄存器的指令流向是:4位操作碼IR指令送往控制單元已做譯碼使用,而根據(jù)不同指令分離出來的要操作的立即數(shù)DATA、源操作寄存器RR、目的操作寄存器RD送到寄存器堆TRAM模塊。指令寄存器外部輸入控制信號en是來自控制單元的輸入信號,En高電平有效,與PC模塊的使能en信號功能上基本一致,它控制著指令寄存器是否可以從程序存儲器中加載指令。當(dāng)en有效時指令寄存器才能更新來自程序存儲器的指令。 時鐘發(fā)生器模塊時鐘發(fā)生器TIME_CTRL利用時鐘信號CLK生成從時鐘信號CLKR,并送往CPU的寄存器堆TRAM中,作為其進(jìn)行讀寫操作的時鐘信號。CLKR是將CLK延遲半個周期產(chǎn)生的,有利于流水線的完成。時鐘發(fā)生器的外部接口如圖35。圖35 時鐘發(fā)生器的外部接口 寄存器堆TRAM 寄存器堆與程序存儲器設(shè)計相同,都是直接使用一個數(shù)組存放二進(jìn)制數(shù)據(jù),通過 VHDL 編寫一個一定長度的數(shù)組實現(xiàn),同樣可以通過集成器數(shù)組元素和輸入地址間的相互賦值實現(xiàn)“讀存儲器”,“寫存儲器”。在本次CPU設(shè)計中TRAM模塊用以完成以下幾個操作: 將立即數(shù)寫入指定寄存器中。 將指定目的操作寄存器地址中的數(shù)據(jù)讀出并輸出。 將指定源操作寄存器地址中的數(shù)據(jù)讀出。 圖36 寄存器堆TRAM外部接口 如圖12所示,fclkr時鐘信號是來自時鐘發(fā)生器,控制寄存器是否能進(jìn)行讀寫操作。在CPU時鐘的前半周期,控制器進(jìn)行譯碼并發(fā)出控制信號,為操作的施行鋪好路,在時鐘的后半周期,也就是從時鐘信號fclkr的上升沿,TRAM在控制信號ram _ctrl、load、store的控制下進(jìn)行讀寫操作。If (rising_edge(fclkr)) then If (fstore =’1’) then ram (conv_integer(fromrd))=fR0 //存儲上條指令運算得到的結(jié)果 elsif (fromram_ctrl = 11) then toreg_rr=ram(conv_integer(fromrr))。 toreg_rd=ram(conv_integer(fromrd))。 //將指定寄存器的值輸出 elsif (fromram_ctrl = 01) then ram (conv_integer(fromrd))=value2。 // 存儲立即數(shù)到目的寄存器從這段代碼可以看出,當(dāng)控制信號store有效時,TRAM可以完成將運算器的結(jié)果寫入目的操作寄存器中,若無效,則判斷控制信號ram_ctrl的值,根據(jù)不同的控制值可以將寄存器的儲存值分別寫入目的操作寄存器和源操作寄存器中,可以將立即數(shù)寫入目的操作寄存器中,可以讀出指定寄存器的值并輸出。 ALU模塊ALU單元即算術(shù)運算單元,是CPU的核心處理的單元,不但能完成算術(shù)和邏輯運算,而且很多數(shù)據(jù)都要通過ALU送出到輸出端口并輸出。在ALU中還可以細(xì)化成兩個功能單元:取操作數(shù)單元、執(zhí)行運算單元。取操作數(shù)單元負(fù)責(zé)對ALU的兩個操作數(shù)A和B的取值,執(zhí)行運算單元負(fù)責(zé)將取到的操作數(shù)進(jìn)行相應(yīng)的操作。ALU整體框圖如圖3—7所示。圖37 ALU整體結(jié)構(gòu)圖算術(shù)邏輯單元ALU 是絕大多數(shù)指令必須經(jīng)過的單元,所有的運算都在ALU 中完成。取操作數(shù)單元在數(shù)據(jù)選擇的控制信號控制下,可以選取一個或者兩個操作數(shù)輸入執(zhí)行單元。在執(zhí)行運算單元中,根據(jù)指令的類型對兩個或一個8位輸入數(shù)據(jù)進(jìn)行運算。4 位算術(shù)控制輸入信號alu_ctrl決定兩個輸入數(shù)據(jù)的算術(shù)操作類型,可以有16 種不同的功能組合。2位邏輯控制輸入信號Logic決定一個輸入數(shù)據(jù)的邏輯操作類型,可以有4種不同的功能組合。在ALU的設(shè)計中主要還是根據(jù)指令來的,ALU所能執(zhí)行的指令是很多的,基本的指令可以分為4類,即ADD,SUB,LOGIC,LSL、LSR。指令A(yù)DD分為不帶進(jìn)位和帶進(jìn)位加法操作:SUB指令組分為執(zhí)行不帶進(jìn)位和帶進(jìn)位減法操作。LOGIC指令組分為或和與的邏輯操作。LSL指令組分為帶進(jìn)位的循環(huán)右移和不帶進(jìn)位的算術(shù)右移操作。 LSR指令組分為帶進(jìn)位的循環(huán)左移和不帶進(jìn)位的算術(shù)左移操作。在本次設(shè)計中只完成加法、減法、與、或、不帶進(jìn)位的左移和不帶進(jìn)位的右移的運算功能,并輸出溢出信號。Process (a1, b1, fromalu_ctrl , fromlogic) Begin case fromalu_ctrl is …… end case。 case fromlogic is … end case。end process。Process (clk) begin if (rising_edge(clk)) then if fouten =39。039。 then R=ZZZZZZZZ。 elsif fload =39。039。 then R=r1(7 downto 0)。 else R=a1(7 downto 0)。 由這段代碼可以看出ALU模塊是雙進(jìn)程模塊,操作數(shù)運算是不受時鐘控制的,由控制信號直接控制并計算。但是結(jié)果輸出是在下一個時鐘信號的上升沿進(jìn)行的,這樣可以控制輸出的時間,保證其輸出正確,而且輸出控制信號outen控制CPU是否輸出數(shù)據(jù),若outen控制信號有效,則再判斷需要輸出何種類型的數(shù)據(jù),若load控制信號有效則將輸入數(shù)據(jù)直接輸出,完成從指定寄存器讀出數(shù)據(jù)的操作,若無效則將算術(shù)或邏輯運算的結(jié)果輸出。ALU模塊外部接口如圖39所示。圖311 ALU模塊外部接口第四章 CPU控制單元的設(shè)計在CPU中還有一個重要的模塊,即控制單元模塊,其功能是得到當(dāng)前指令,得到需要的數(shù)據(jù),在正確的時間、用正確的值設(shè)置所有相關(guān)的控制信號,控制CPU的取指、譯碼和指令執(zhí)行等操作。因此這個模塊在整個CPU的設(shè)計中是最關(guān)鍵的也是最難精準(zhǔn)實現(xiàn)的模塊。流水線操作和數(shù)據(jù)通路各個模塊的所有控制信號都是來自控制單元。控制單元的作用就是對指令譯碼,在不同的狀態(tài)發(fā)出不同的控制信號來處理流水線過程,另一方面在合適的時間對數(shù)據(jù)通路發(fā)出正確的控制信號來控制指令的正確執(zhí)行。為了實現(xiàn)控制模塊的功能,可以將該模塊細(xì)化為兩個部分,即控制指令操作的控制器和控制狀態(tài)轉(zhuǎn)換的有限狀態(tài)機(jī)(FSM)。 控制器Control模塊控制器則是一個微處理器的核心部件之一,在每一個時鐘周期的上升沿,指令寄存器IR 從內(nèi)存中讀取指令字后,送入控制器中,控制器能夠根據(jù)輸入的4位操作碼進(jìn)行譯碼,為其他每個功能單元產(chǎn)生相應(yīng)的主控制信號,并發(fā)出信號狀態(tài)信號控制狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換,最終實現(xiàn)對CPU各個功能單元的控制,實現(xiàn)指令的順利執(zhí)行。圖41 控制器Control外部接口控制器根據(jù)4位操作碼IR進(jìn)行譯碼,通過指令譯碼給出其它各單元的操作控制信號,包括ALU 單元的算術(shù)和邏輯運算控制信號、移位控制信號,操作數(shù)輸入選擇信號、結(jié)果輸出信號,TRAM 的讀寫控制、送入狀態(tài)機(jī)得停機(jī)控制信號。 有限狀態(tài)機(jī)FSM模塊 有限狀態(tài)機(jī)狀態(tài)機(jī)是CPU的又一個控制核心部件,是實現(xiàn)高效率高可靠邏輯控制的重要途徑,用于產(chǎn)生一系列的控制信號,啟動或停止某些部件。程序計數(shù)器PC值的改變、指令寄存器取指令以及CPU的復(fù)位等操作都是由狀態(tài)機(jī)來控制的。狀態(tài)機(jī)FSM的當(dāng)前狀態(tài),由變量state記錄。從狀態(tài)機(jī)的信號輸出上分,有Moore型和Mealy型兩種狀態(tài)機(jī)。從輸出時序上看,前者屬于同步狀態(tài)機(jī),而后者屬于異步狀態(tài)機(jī)。Mealy型狀態(tài)機(jī)的輸出是當(dāng)前狀態(tài)和所輸入信號決定的,它的輸出是在輸入變化后立即發(fā)生的,不依賴時鐘的同步[16]。Moore型狀態(tài)機(jī)的輸出則僅由當(dāng)前狀態(tài)控制,這類狀態(tài)機(jī)在輸入發(fā)生變化還必須等待時鐘的到來,時鐘使?fàn)顟B(tài)發(fā)生變化時才導(dǎo)致輸出變化。在本次CPU設(shè)計中,將采用Mealy型狀態(tài)機(jī)來實現(xiàn)時序和狀態(tài)的轉(zhuǎn)換。在整個CPU的狀態(tài)機(jī)中共設(shè)計了3個狀態(tài):執(zhí)行(exe),待機(jī)(sp),停機(jī)(tj)。圖16是各個狀態(tài)的狀態(tài)轉(zhuǎn)移圖。圖42 狀態(tài)轉(zhuǎn)移圖 利用的VHDL語言進(jìn)行狀態(tài)機(jī)描述本次設(shè)計采用2個進(jìn)程模塊,一個模塊用同步時序描述狀態(tài)轉(zhuǎn)移;另一個模塊用組合邏輯判斷狀態(tài)的邏輯輸出,其VHDL代碼如下:process (clk,wr,input,start) begin //第一個進(jìn)程模塊用同步時序描述狀態(tài)轉(zhuǎn)移 if wr = 39。139。 then state = sp。 // 當(dāng)寫信號有效時程序?qū)懭?,此時狀態(tài)機(jī)保持待機(jī) elsif ( rising_edge(clk)) then case state is when exe=// 利用case語句對每一個狀態(tài)建立一項case語句的分支 If input =39。139。 then state = tj。 else state = exe。 end if。 //通過ifthenelse語句指定相應(yīng)次態(tài) when sp = when tj = end case。 end if。 end process。process (state) begin //第二個模塊用組合邏輯判斷狀態(tài)的邏輯輸出 case state is //當(dāng)狀態(tài)發(fā)生改變時,利用case語句輸出對應(yīng)狀態(tài)的信號 when exe = when sp = when tj = end case。 end process。第五章 RISC CPU的仿真驗證 各模塊的組合前面兩章將CPU細(xì)化為多個功能模塊,為了使其能集合成一個完整的系統(tǒng)共同完成特定的功能執(zhí)行,各個模塊就需要組合起來配合工作。在構(gòu)建頂層文件的方法有語言描述和原理圖法。原理圖法就是將CPU中的每個綜合模塊以元件的形式,通過互連線將各個模塊像電路上畫原理圖一樣連接起來,系統(tǒng)規(guī)模比較大時,各個模塊連起來的互連線很多,操作起來很不方便,同時也容易出錯。在本次設(shè)計中由于各個模塊的互連信號比較多,所以將采用硬件語言描述的方法將各個模塊連接起來,即用VHDL語言將各個模塊組合起來從而形成一個最頂層的模塊。用VHDL語言引用一個模塊時是先用ponent來聲明這個模塊,模塊的接口要用port關(guān)鍵詞聲明,例如對程序計數(shù)器模塊的引用聲明如下:COMPONENT pc IS PORT ( clk ,fen: IN STD_LOGIC 。 fromnrst : IN STD_LOGIC 。 frompc_inc : IN STD_LOGIC 。 pcout : out unsigned(7 downto 0) ) 。 END COMPONENT pc。對程序計數(shù)器模塊的聲明后再對該模塊的引用,引用時用的關(guān)鍵詞是 PORT MAP,通過如下程序段完成模塊引用: U1: pc PORT MAP (clk = clk,fen = en,fromnrst = nrst,frompc_inc = pc_inc, pcout = pc_out)。各個模塊間的互連信號是用用signal類型的變量聲明的。SIGNAL en, nrst ,clkr: STD_LOGIC。 SIGNAL outen :STD_LOGIC。將所有的功能模塊組合連接起來就成為一個整體,作為整個仿真的頂層模塊。 綜合RTL電路圖利用硬件語言法構(gòu)建好頂層文件,把所有模塊組裝成了一個整體,在對這個整體進(jìn)行編譯和綜合成功后即可對它進(jìn)行功能仿真。用QUARTUSII對設(shè)計模塊進(jìn)行編譯及綜合后生成的RTL綜合電路圖如圖5—1示。圖5—1 RTL綜合電路圖綜合后的電路結(jié)構(gòu)由程序計數(shù)器PC模塊、程序存儲器PC_RAM模塊、指令寄存器IR_RAM模塊、寄存器堆TRAM模塊、數(shù)據(jù)選擇器ALUMUX模塊、運算器ALU模塊、控制器CONTROL模塊、狀態(tài)機(jī)FSM模塊和時鐘發(fā)生器TIME_CTRL模塊組成。各模塊的輸出信號說明如表4所示。表4 各模塊引腳說明模塊產(chǎn)生信號功能程序計數(shù)器PCPC_OUT送入PC_RAM中提取對應(yīng)地址指令程序存儲器PC_RAMINSTRUCTION送入IR中鎖存指令指令寄存器IR_RAM IR指令操作碼送入CONTROL進(jìn)行譯碼RD送入TRAM在控制信號作用下對操作數(shù)進(jìn)行寫入和讀出操作RRDATA寄存器堆TRAMREG_RD送入ALUMUX在控制信號作用下選擇操作數(shù)REG_RR數(shù)據(jù)選擇器ALUMUXA送入ALU控制信號作用下進(jìn)行輸入操作數(shù)運算B運算器ALUR輸出結(jié)果C4輸出溢出R0運算結(jié)果送入TRAM時鐘發(fā)生器TIME_CTRLCLKR送入TRAM控制讀寫和數(shù)據(jù)輸出時間控制器CONTROLABSEL送入ALUMUX控制輸出操作數(shù)A、BOUTEN送入TRAM控制數(shù)據(jù)輸出RAM_CTRL送入TRAM控制數(shù)據(jù)的寫入和讀出LOGIC送入ALU控制移位操