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