,
(安陽師范學(xué)院,河南 安陽 455000)
CPU作為計算機系統(tǒng)的核心,其功能與結(jié)構(gòu)設(shè)計一直是國內(nèi)外研究的熱點。近年來隨著計算機和微電子技術(shù)的發(fā)展,采用EDA技術(shù),基于FPGA器件的CPU設(shè)計成為計算機組成原理和計算機系統(tǒng)結(jié)構(gòu)實驗中的重要內(nèi)容[1]。如何使CPU更有效率地工作,使其內(nèi)部結(jié)構(gòu)更精簡,一直是研究的方向。本文研究了CPU的功能和結(jié)構(gòu)特點,完成了一個8位CPU的設(shè)計,并給出綜合仿真結(jié)果。
本文設(shè)計的CPU是基于FPGA器件的具有完整的取指、譯碼、執(zhí)行功能的8位CPU。在此設(shè)計中,指令系統(tǒng)采用單字長結(jié)構(gòu),指令地址碼部分采用直接尋址方式,指令所能訪問的數(shù)據(jù)存儲器的地址空間為32字節(jié)。為簡化處理,所設(shè)計的指令存儲器的地址空間也為32字節(jié),用5位指令地址進行訪問取指。
CPU的功能主要是取指令、分析指令、執(zhí)行指令。其工作過程是對所存儲的程序指令進行讀取,并進行指令譯碼,從而按照指令所代表的含義執(zhí)行相應(yīng)操作?;诖嗽O(shè)計的CPU及存儲器的大致結(jié)構(gòu)如圖1所示。在圖中可以清晰地看到整個CPU的運作過程。首先從寄存器PC中取出指令地址,根據(jù)指令地址從指令存儲器中取出指令,將指令放入寄存器IR中,再根據(jù)寄存器IR中的指令進行指令分析;其次從數(shù)據(jù)存儲器中進行數(shù)據(jù)存取,通過ALU運算器,最終按照指令要求進行數(shù)據(jù)加工操作;最后根據(jù)AC結(jié)果值,對標志位ZF進行賦值。根據(jù)整個CPU的運作過程,把CPU的功能模塊設(shè)計成取指部件、譯碼部件、執(zhí)行部件三大功能部件,然后設(shè)計一個時序信號處理部件來控制這三個部件的執(zhí)行[2]。
圖1 CPU結(jié)構(gòu)圖
基于FPGA的8位CPU的設(shè)計主要包括三大功能部件:取指部件、譯碼部件、執(zhí)行部件。這三大功能部件的執(zhí)行通過時序信號處理部件timer來控制,從而模擬CPU的功能。其中,取指部件的主要功能是根據(jù)指令地址從指令存儲器中取出指令,然后把取出的指令送給譯碼部件;譯碼部件進行指令功能解析,取出需要操作執(zhí)行的數(shù)據(jù);執(zhí)行部件根據(jù)譯碼部件提供的譯碼命令和數(shù)據(jù),進行最終的操作執(zhí)行[3]。
(1)取指部件:i_fetch,如圖2所示。該部件以PC中的指令地址instr_addr為輸入,在指令存儲器中讀取指令,在時鐘信號的邊沿將指令存入指令寄存器IR中,并將取指令地址+1送入pcaddl。該部分的核心為指令存儲器。
圖2 取指部件:i_fetch
(2)指令譯碼部件:i_decoder,如圖3所示。該部件以IR中的指令代碼為輸入,完成指令譯碼分析,產(chǎn)生各種控制命令。因為指令系統(tǒng)中的各指令地址都采用直接尋址,所以譯碼階段可直接使用該地址處理,以完成數(shù)據(jù)在數(shù)據(jù)存儲器上的存取操作。在執(zhí)行指令譯碼部件功能時,需要考慮PC值的變化情況。在指令地址沒有發(fā)生跳轉(zhuǎn)時,需對PC置入取指部件送來的指令地址pcaddl,產(chǎn)生后繼指令地址;在轉(zhuǎn)移執(zhí)行時,需對PC置入轉(zhuǎn)移地址,同時在系統(tǒng)執(zhí)行指令時,無論指令地址是否發(fā)生跳轉(zhuǎn),如果系統(tǒng)的復(fù)位信號RESET產(chǎn)生復(fù)位,都需要對PC清0;在執(zhí)行動態(tài)停機指令halt時,可使PC值保持不變。
圖3 指令譯碼部件:i_decoder
(3)指令執(zhí)行部件:i_exe,如圖4所示。該部件包括ALU與累加器AC,ALU為核心部件。對AC值的打入使用時序信號控制,同時執(zhí)行部件會根據(jù)AC結(jié)果值,對標志位ZF進行賦值,該標志會被送回指令譯碼部件,當執(zhí)行jz指令時,決定是否轉(zhuǎn)移。
圖4 指令執(zhí)行部件:i_exe
(4)時鐘信號處理部件:timer,如圖5所示。該部件本來是控制器的一個組成部分,現(xiàn)在單獨作為一個模塊來設(shè)計??紤]到前面的3個模塊的劃分,每個部件都需要一個時鐘信號來控制其中寄存器、存儲器部分數(shù)據(jù)的寫入和讀出。每個部件所需要的時鐘信號分別稱為T1、T2、T3,它們是由時鐘信號處理部件timer根據(jù)時鐘信號clock周期性地依次產(chǎn)生的,但在系統(tǒng)復(fù)位時不產(chǎn)生時鐘信號。
圖5 時鐘信號處理部件:timer
設(shè)指令字長為8位,每字節(jié)存放一條完整的指令,指令操作碼為高3位,地址碼為低5位,CPU的尋址方式為直接尋址,CPU設(shè)計中的機器指令主要支持如下指令,如表1所示。
在該CPU設(shè)計中,指令譯碼部件通過取指部件取得指令,根據(jù)指令集將指令進行譯碼,產(chǎn)生控制指令執(zhí)行的一系列命令,同時完成存取數(shù)據(jù)的處理。其VHDL程序?qū)嶓w部分定義如圖6所示。
表1 指令系統(tǒng)表
圖6 指令譯碼部件VHDL程序?qū)嶓w部分定義截圖
在指令譯碼部件程序截圖中,zf為0標志位,reset為復(fù)位信號,wr_data為要寫入數(shù)據(jù)存儲器中的數(shù)據(jù),t2為時鐘,pcadd1為加1后的指令地址,instr_coder為IR中存儲的指令代碼,pc為輸出的指令地址,dmem_out為輸出的數(shù)據(jù),fun_alu為控制執(zhí)行部件的操作命令,ac_in用來控制執(zhí)行部件是否打入AC值。
時序控制部件應(yīng)依次產(chǎn)生控制各功能部件操作的時序信號。應(yīng)用VHDL語言完成其設(shè)計后,其VHDL程序結(jié)構(gòu)體部分定義如圖7所示。
圖7 時序信號處理部件timer的VHDL程序結(jié)構(gòu)體部分定義截圖
在時序控制部件程序截圖中,t1、t2、t3通過信號count來依次獲取時鐘,獲取時鐘后,t1用來控制取指部件,t2用來控制指令譯碼部件,t3用來控制執(zhí)行部件。在代碼中,獲取時鐘的順序為t1、t2、t3,所以在CPU執(zhí)行中,先執(zhí)行取指部件,再執(zhí)行譯碼部件,最后執(zhí)行執(zhí)行部件。
此次設(shè)計的CPU總共有四大模塊,首先對每個模塊進行單獨的設(shè)計和仿真,實現(xiàn)其功能,然后將各個模塊進行連接,創(chuàng)建頂層的設(shè)計文件simcom.bdf。頂層模塊連接圖如圖8所示。
圖8 頂層模塊連接圖
在完成總體設(shè)計的情況下,用 QuartusII9.0對其進行綜合和仿真,根據(jù)之前對存儲器中指令和數(shù)據(jù)的設(shè)置,得到仿真結(jié)果,如圖9所示。
圖9 仿真結(jié)果圖
其仿真所用程序指令可理解如下:
pc 指令 指令含義 數(shù)據(jù)地址 數(shù)據(jù)
0 00000100 load 4 00000100 00000111
1 01000100 add4
2 00100100 store 4
3 11000000 halt 4
基于FPGA的8位CPU設(shè)計,其硬件最終實現(xiàn)是在Altera公司的Cyclone系列FPGA芯片EP1C3T100A8上完成的,而最后的硬件仿真結(jié)果,也如預(yù)期的那樣,得到了實現(xiàn)和驗證。
基于FPGA的8位CPU設(shè)計,完成了對CPU功能模塊的設(shè)計和仿真,充分展示了使用FPGA和VHDL進行EDA數(shù)字系統(tǒng)設(shè)計的優(yōu)越性。該設(shè)計中使用獨立的指令存儲器和數(shù)據(jù)存儲器,這相當于在CPU內(nèi)使用獨立的指令CACHE和數(shù)據(jù)CACHE,為后繼進行基于哈佛結(jié)構(gòu)的復(fù)雜CPU設(shè)計或帶CACHE結(jié)構(gòu)的CPU設(shè)計打下了基礎(chǔ)。
參考文獻:
[1] 湯志忠,楊春武.開放式實驗CPU設(shè)計[M].北京:清華大學(xué)出版社,2007.
[2] 李強,潘明,許勇.基于FPGA的RISC微處理器的設(shè)計和實現(xiàn)[J].廣西科學(xué)院學(xué)報, 2005(11): 294-297 .
[3] 馬輝,王丁磊.計算機組成原理[M].北京:中國水利水電出版社,2010.