![簡(jiǎn)單CPU的邏輯設(shè)計(jì)畢業(yè)設(shè)計(jì)(論文)word格式_第1頁](http://file4.renrendoc.com/view/1a8d0f1fd2d29bff0609389e8c4549b4/1a8d0f1fd2d29bff0609389e8c4549b41.gif)
![簡(jiǎn)單CPU的邏輯設(shè)計(jì)畢業(yè)設(shè)計(jì)(論文)word格式_第2頁](http://file4.renrendoc.com/view/1a8d0f1fd2d29bff0609389e8c4549b4/1a8d0f1fd2d29bff0609389e8c4549b42.gif)
![簡(jiǎn)單CPU的邏輯設(shè)計(jì)畢業(yè)設(shè)計(jì)(論文)word格式_第3頁](http://file4.renrendoc.com/view/1a8d0f1fd2d29bff0609389e8c4549b4/1a8d0f1fd2d29bff0609389e8c4549b43.gif)
![簡(jiǎn)單CPU的邏輯設(shè)計(jì)畢業(yè)設(shè)計(jì)(論文)word格式_第4頁](http://file4.renrendoc.com/view/1a8d0f1fd2d29bff0609389e8c4549b4/1a8d0f1fd2d29bff0609389e8c4549b44.gif)
![簡(jiǎn)單CPU的邏輯設(shè)計(jì)畢業(yè)設(shè)計(jì)(論文)word格式_第5頁](http://file4.renrendoc.com/view/1a8d0f1fd2d29bff0609389e8c4549b4/1a8d0f1fd2d29bff0609389e8c4549b45.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
簡(jiǎn)單cpu的邏輯設(shè)計(jì)[摘要]基于現(xiàn)場(chǎng)可編程(FPGA)技術(shù)和硬件描述語言VHDL的設(shè)計(jì)和綜合,通過自頂向下的設(shè)計(jì)方法和模塊化設(shè)計(jì)思想,在QuartusⅡ環(huán)境下能定制、仿真、下載驗(yàn)證和實(shí)現(xiàn)CPU功能。通過VHDL語言定制了運(yùn)算器ALU模塊和調(diào)用宏模塊定制了RAM模塊,介紹了基于FPGA的CPU設(shè)計(jì)方法,并通過初始化程序進(jìn)行驗(yàn)證,實(shí)現(xiàn)了基于FPGA的CPU功能,表明基于FPGA技術(shù)在設(shè)計(jì)CPU核和大規(guī)模集成電路設(shè)計(jì)方面可根據(jù)實(shí)際情況定制,具有靈活性、可靠性和可擴(kuò)展性。[關(guān)鍵字]FPGACPUQuartusⅡ仿真宏模塊設(shè)計(jì)任務(wù)與要求CPU的設(shè)計(jì)是《計(jì)算機(jī)組成原理》中一個(gè)很重要的內(nèi)容。隨著可編程邏輯器件的發(fā)展,利用QuartusII的軟件平臺(tái)設(shè)計(jì)一個(gè)簡(jiǎn)單的CPU,并下載到FPGA/CPLD進(jìn)行驗(yàn)證,此CPU所執(zhí)行的指令可任意添加,通過設(shè)計(jì)深入了解計(jì)算機(jī)的各個(gè)功能部件的功能及工作原理,深入了解狀態(tài)機(jī)控制器是如何控制模型機(jī)的運(yùn)行,了解整機(jī)動(dòng)態(tài)過程,及理解計(jì)算機(jī)從機(jī)器指令到微指令的工作原理。要求:(1)完成簡(jiǎn)單CPU邏輯設(shè)計(jì)的整體方案設(shè)計(jì)(2)完成簡(jiǎn)單CPU邏輯設(shè)計(jì)的功能設(shè)計(jì)(3)完成簡(jiǎn)單CPU邏輯設(shè)計(jì)的仿真驗(yàn)證(4)完成簡(jiǎn)單CPU邏輯設(shè)計(jì)的實(shí)際調(diào)試二、方案設(shè)計(jì)與論證1、可行方案選擇與論證CPU即中央處理器,是計(jì)算機(jī)的核心。CPU主要由運(yùn)算器、控制器、寄存器組和內(nèi)部總線等構(gòu)成。本CPU設(shè)計(jì)系統(tǒng)中控制器選擇狀態(tài)機(jī)控制器方案,而其對(duì)應(yīng)的指令集類型選擇CISC。CPU系統(tǒng)的選擇(1)ASIC方案設(shè)計(jì)ASIC(ApplicationSpecificIntegratedCircuits,專用集成電路),是指應(yīng)特定用戶要求或特定電子系統(tǒng)的需要而設(shè)計(jì)、制造的集成電路。ASIC的特點(diǎn)是面向特定用戶的需求,品種多、批量少,要求設(shè)計(jì)和生產(chǎn)周期短,它作為集成電路技術(shù)與特定用戶的整機(jī)或系統(tǒng)技術(shù)緊密結(jié)合的產(chǎn)物。ASIC是為某個(gè)客戶定制的芯片,費(fèi)用高、風(fēng)險(xiǎn)大、周期長(zhǎng)。如果要實(shí)施這個(gè)方案,系統(tǒng)設(shè)計(jì)就必須考慮成本、周期等問題。(2)基于FPGA設(shè)計(jì)方案FPGA是FieldProgrammableGateArray的簡(jiǎn)稱。FPGA的出現(xiàn)為現(xiàn)代電子產(chǎn)品嵌入式的設(shè)計(jì)帶來了更大的靈活性,更容易實(shí)現(xiàn)片上系統(tǒng)(SOC)。通過在FPGA上嵌入NIOS‖處理器,再采用C,或C++對(duì)各種邏輯器件進(jìn)行控制。另外在FPGA上采用VHDL硬件描述語言編寫各種邏輯器件的驅(qū)動(dòng),從而實(shí)現(xiàn)各種功能。方案選擇與論證:FPGA開發(fā)流程大致為:選定器件,安裝軟件,設(shè)計(jì)輸入,代碼調(diào)試(包括管腳定義、時(shí)序定義、時(shí)序分析),設(shè)計(jì)仿真(功能仿真、時(shí)序仿真)和下載調(diào)試。而ASIC是為某個(gè)客戶定制的芯片,與FPGA相比,有非通用的后端設(shè)計(jì)費(fèi)、制掩模費(fèi)、測(cè)試費(fèi)等,故前期成本較高。與傳統(tǒng)芯片實(shí)現(xiàn)ASIC相比,F(xiàn)PGA具有實(shí)現(xiàn)速度快、風(fēng)險(xiǎn)小、可編程、可隨時(shí)更改升級(jí)等一系列優(yōu)點(diǎn),因而得到了越來越廣泛的應(yīng)用?;贔PGA的設(shè)計(jì)可以利用VHDL編程,可在每一步對(duì)設(shè)計(jì)進(jìn)行仿真,保證每一步設(shè)計(jì)都可達(dá)到要求,使成本更節(jié)約,精度更高,開發(fā)周期更短;Altera公司開發(fā)的QuartusII軟件集成了功能強(qiáng)大的宏模塊,可以方便地進(jìn)行調(diào)用,以便更快更可靠完成設(shè)計(jì)工作。因此選擇基于FPGA的簡(jiǎn)單CPU的邏輯設(shè)計(jì)。1.2指令集類型的選擇指令系統(tǒng)優(yōu)化設(shè)計(jì)有兩種截然相反的方向,一個(gè)是增強(qiáng)指令的功能,即操作種類多,功能強(qiáng),把一些原來由軟件實(shí)現(xiàn)的、常用的功能改用硬件的指令系統(tǒng)來實(shí)現(xiàn),這種計(jì)算機(jī)系統(tǒng)稱為復(fù)雜指令系統(tǒng)計(jì)算機(jī)(ComplexInstructionSetComputer,CISC);另一個(gè)是20世紀(jì)80年代新發(fā)展起來的,盡量簡(jiǎn)化指令功能,提供最必須的操作,指令在一個(gè)節(jié)拍內(nèi)執(zhí)行完成,較復(fù)雜的功能用子程序來實(shí)現(xiàn),這種計(jì)算機(jī)系統(tǒng)稱為精簡(jiǎn)指令系統(tǒng)計(jì)算機(jī)(ReducedInstructionSetComputer,RISC)。(1)CISC復(fù)雜指令系統(tǒng)為了提高操作系統(tǒng)的效率,并盡量縮短指令系統(tǒng)與高級(jí)語言的語義差別,在指令系統(tǒng)中增加更多的和更復(fù)雜的指令,來使得高級(jí)語言的編譯更加方便。復(fù)雜指令系統(tǒng)計(jì)算機(jī)CISC的特點(diǎn)是:指令功能強(qiáng)大,指令格式比較復(fù)雜,尋址方式豐富,各種指令使用頻率相差很大,各種指令執(zhí)行時(shí)間相差也很大。(2)RISC精簡(jiǎn)指令系統(tǒng)它是在CISC指令系統(tǒng)基礎(chǔ)上發(fā)展起來的,相對(duì)于CISC型CPU,RISC型CPU不僅精簡(jiǎn)了指令系統(tǒng),還采用了一種叫做“超標(biāo)量和超流水線結(jié)構(gòu)”,大大增加了并行處理能力。RISC的指令格式統(tǒng)一,種類比較少,尋址方式也比復(fù)雜指令集少。當(dāng)然處理速度就提高很多了。目前在中高檔服務(wù)器中普遍采用這一指令系統(tǒng)的CPU,特別是高檔服務(wù)器全都采用RISC指令系統(tǒng)的CPU通過以上的對(duì)比,本系統(tǒng)選擇CISC指令集方案,原因是盡管CISC的實(shí)現(xiàn)要比RISC復(fù)雜,但是這種復(fù)雜主要體現(xiàn)是在指令譯碼和執(zhí)行的設(shè)計(jì)上,而其他的部分沒有很大的差異。而對(duì)CPU的設(shè)計(jì)中就應(yīng)該要對(duì)指令譯碼和執(zhí)行有一個(gè)很好的把握所以我們指令系統(tǒng)設(shè)計(jì)選擇CISC復(fù)雜指令系統(tǒng)。三、系統(tǒng)具體設(shè)計(jì)與實(shí)現(xiàn)本系統(tǒng)是基于VHDL狀態(tài)機(jī)控制的16位復(fù)雜指令(CISC,ComplexInstructionSetComputer)微處理器的設(shè)計(jì)流程,包括CPU的系統(tǒng)結(jié)構(gòu)設(shè)計(jì)、基本組成部件設(shè)計(jì)、指令系統(tǒng)設(shè)計(jì)和CPU的RTL級(jí)仿真與實(shí)現(xiàn),直至在FPGA上的調(diào)試運(yùn)行。與基本傳統(tǒng)的微程序控制技術(shù)的CPU設(shè)計(jì)不同,本CPU中指令功能的實(shí)現(xiàn),則是通過用VHDL設(shè)計(jì)一個(gè)控制模塊,在控制模塊中用狀態(tài)機(jī)的方式來實(shí)現(xiàn)各種指令的操作步驟,發(fā)出各種時(shí)序控制信號(hào),使計(jì)算機(jī)內(nèi)部各部件協(xié)調(diào)工作,從而完成指令的功能。系統(tǒng)具體設(shè)計(jì)總體框圖如圖3-1所示。圖3-1系統(tǒng)設(shè)計(jì)總體框圖3.1CPU工作原理及工作過程1、CPU的工作原理CPU的內(nèi)部結(jié)構(gòu)可以分為控制單元,邏輯運(yùn)算單元和存儲(chǔ)單元(包括內(nèi)部總線及緩沖器)三大部分。CPU的工作原理就像一個(gè)工廠對(duì)產(chǎn)品的加工過程:進(jìn)入工廠的原料(程序指令),經(jīng)過物資分配部門(控制單元)的調(diào)度分配,被送往生產(chǎn)線(邏輯運(yùn)算單元),生產(chǎn)出成品(處理后的數(shù)據(jù))后,再存儲(chǔ)在倉庫(存儲(chǔ)單元)中,最后等著拿到市場(chǎng)上去賣(交由應(yīng)用程序使用)。在這個(gè)過程中,我們注意到從控制單元開始,CPU就開始了正式的工作,中間的過程是通過邏輯運(yùn)算單元來進(jìn)行運(yùn)算處理,交到存儲(chǔ)單元代表工作的結(jié)束。2、CPU的功能及工作過程CPU的基本結(jié)構(gòu)、功能及參數(shù)CPU主要由運(yùn)算器、控制器、寄存器組和內(nèi)部總線等構(gòu)成。寄存器組用于在指令執(zhí)行過后存放操作數(shù)和中間數(shù)據(jù),由運(yùn)算器完成指令所規(guī)定的運(yùn)算及操作。CPU對(duì)數(shù)據(jù)進(jìn)行三種基本操作:讀取數(shù)據(jù)、對(duì)數(shù)據(jù)進(jìn)行處理、然后通常還要把把數(shù)據(jù)寫回到存儲(chǔ)器上。對(duì)于最簡(jiǎn)單的構(gòu)成,CPU只需要四個(gè)部分來實(shí)現(xiàn)它對(duì)數(shù)據(jù)的操作:指令、指令指示器、一些寄存器以及算術(shù)邏輯單元。數(shù)據(jù)與指令在CPU中的運(yùn)行過程:假設(shè)在內(nèi)存中的數(shù)據(jù)是最簡(jiǎn)單的原始數(shù)據(jù)。首先,指令指針(InstructionPointer)會(huì)通知CPU,將要執(zhí)行的指令放置在內(nèi)存中的存儲(chǔ)位置。因?yàn)閮?nèi)存中的每個(gè)存儲(chǔ)單元都有編號(hào)(稱為地址),可以根據(jù)這些地址把數(shù)據(jù)取出,通過地址總線送到控制單元中,指令譯碼器從指令寄存器IR中拿來指令,翻譯成CPU可以執(zhí)行的形式,然后決定完成該指令需要哪些必要的操作,它將告訴算術(shù)邏輯單元(ALU)什么時(shí)候計(jì)算,告訴指令讀取器什么時(shí)候獲取數(shù)值,告訴指令譯碼器什么時(shí)候翻譯指令等等。假如數(shù)據(jù)被送往算術(shù)邏輯單元,數(shù)據(jù)將會(huì)執(zhí)行指令中規(guī)定的算術(shù)運(yùn)算和其他各種運(yùn)算。當(dāng)數(shù)據(jù)處理完畢后,將回到寄存器中,通過不同的指令將數(shù)據(jù)繼續(xù)運(yùn)行或者通過DB總線送到數(shù)據(jù)緩存器中?;旧?,CPU就是這樣去執(zhí)行讀出數(shù)據(jù)、處理數(shù)據(jù)和往內(nèi)存寫數(shù)據(jù)3項(xiàng)基本工作。但在通常情況下,一條指令可以包含按明確順序執(zhí)行的許多操作,CPU的工作就是執(zhí)行這些指令,完成一條指令后,CPU的控制單元又將告訴指令讀取器從內(nèi)存中讀取下一條指令來執(zhí)行。這個(gè)過程不斷快速地重復(fù),快速地執(zhí)行一條又一條指令,產(chǎn)生你在顯示器上所看到的結(jié)果。我們很容易想到,在處理這么多指令和數(shù)據(jù)的同時(shí),由于數(shù)據(jù)轉(zhuǎn)移時(shí)差和CPU處理時(shí)差,肯定會(huì)出現(xiàn)混亂處理的情況。為了保證每個(gè)操作準(zhǔn)時(shí)發(fā)生,CPU需要一個(gè)時(shí)鐘,時(shí)鐘控制著CPU所執(zhí)行的每一個(gè)動(dòng)作。時(shí)鐘就像一個(gè)節(jié)拍器,它不停地發(fā)出脈沖,決定CPU的步調(diào)和處理時(shí)間,這就是我們所熟悉的CPU的標(biāo)稱速度,也稱為主頻。3.2頂層系統(tǒng)設(shè)計(jì)3.2.1圖3-216位CPU結(jié)構(gòu)框圖1、CPU的結(jié)構(gòu)圖如圖3-2所示。這是一個(gè)采取單總線系統(tǒng)架構(gòu)的復(fù)雜指令系統(tǒng)結(jié)構(gòu)CISC(ComplexInstructionSetComputer)的16位CPU。處理器中包含了各種基本器件模塊,它們是8個(gè)16位的寄存器Reg0~Reg7、一個(gè)運(yùn)算器ALU、一個(gè)移位寄存器Shifter、一個(gè)程序計(jì)數(shù)器ProgCnt、一個(gè)指令寄存器InstrReg、一個(gè)比較器Comp、一個(gè)地址寄存器AddrReg和一個(gè)控制單元Control。這些模塊共用一組16位的三態(tài)數(shù)據(jù)總線。系統(tǒng)采用自頂向下的方法進(jìn)行設(shè)計(jì)。頂層設(shè)計(jì)由微處理器和存儲(chǔ)器通過一組雙向數(shù)據(jù)總線連接,它們由一組地址總線和一些控制總線組成。處理器從外存儲(chǔ)器中讀取指令,并通過執(zhí)行這些指令來運(yùn)行程序。這些指令存儲(chǔ)在指令寄存器中,并由控制單元譯碼。控制單元使得相應(yīng)的信號(hào)相互作用,并使處理單元執(zhí)行這些指令。與普通CPU的工作方式相同,執(zhí)行一條指令,分多個(gè)步驟進(jìn)行。首先地址寄存器AR保存當(dāng)前指令的地址,當(dāng)一條指令執(zhí)行完后,程序寄存器PC指向下一條指令的地址。如果是執(zhí)行順序指令,PC+1就指向下一條指令地址;如果是分支轉(zhuǎn)移指令,則直接跳到該轉(zhuǎn)移地址。方法是控制單元將轉(zhuǎn)移地址寫入程序存儲(chǔ)器PC和地址寄存器AR,這是在地址總線上就會(huì)輸出新的地址。然后,控制單元將R/W置0,執(zhí)行讀操作,將VMA置1,告訴存儲(chǔ)器地址有效。這樣,存儲(chǔ)器就開始進(jìn)行地址譯碼,并將存儲(chǔ)單元中數(shù)據(jù)傳給數(shù)據(jù)總線,當(dāng)數(shù)據(jù)出現(xiàn)在數(shù)據(jù)總線上市時(shí),存儲(chǔ)器將READY信號(hào)置1,表明存儲(chǔ)器的數(shù)據(jù)可以使用了??刂菩盘?hào)將存儲(chǔ)器輸出的數(shù)據(jù)寫入指令寄存器IR中,接著對(duì)IR中的指令進(jìn)行譯碼和執(zhí)行指令,進(jìn)程就這樣循環(huán)進(jìn)行下去。3.2.在設(shè)計(jì)處理器時(shí)首先要確定CPU具有哪些功能,并針對(duì)這些功能采用哪些指令,然后確定指令的格式。為了使所設(shè)計(jì)的CPU具有基本的運(yùn)算功能,指令將設(shè)計(jì)成以下形式,可以分類為:●裝載指令:指令從其他寄存器或存儲(chǔ)器裝載數(shù)據(jù)或是立即賦值?!翊鎯?chǔ)指令:指令存儲(chǔ)寄存器的值寫到存儲(chǔ)器。●分支指令:指令使處理器轉(zhuǎn)到其他地址,一些分支指令為條件轉(zhuǎn)移,另外一些為無條件轉(zhuǎn)移?!褚莆恢噶睿哼@些指令用移位寄存器單元執(zhí)行移位操作,實(shí)現(xiàn)數(shù)據(jù)傳遞。1、指令格式指令有一些共有的屬性,但也有各自的特點(diǎn)。所有指令都包含5位操作碼。(1)單字指令單字節(jié)指令在滴16位指令中包含兩個(gè)3位的寄存器,一個(gè)是源操作數(shù)寄存器另一個(gè)是目的操作數(shù)寄存器。指令碼格式如下圖3-3所示。操作碼源操作數(shù)目的操作數(shù)OpcodeSRCDST1514131211543210圖3-3單字指令格式(2)雙字指令雙字節(jié)指令中第一個(gè)字節(jié)中包含目標(biāo)寄存器的地址,第二個(gè)字節(jié)中包含了指令地址或者操作數(shù)。指令碼格式如下圖3-4所示。操作碼源操作數(shù)目的操作數(shù)OpcodeSRCDST151413121154321016位操作數(shù)1514131211109876543210圖3-4雙字指令格式2、指令操作碼這里為此16位處理器中設(shè)計(jì)了下列操作碼,列于下表3-1中,主要的指令有數(shù)據(jù)存/取、算術(shù)運(yùn)算、邏輯運(yùn)算、控制轉(zhuǎn)移。表3-1操作碼功能表操作碼指令功能00000NOP空操作00001LOAD裝載數(shù)據(jù)到寄存器00010STORE將數(shù)據(jù)寄存器的數(shù)據(jù)存入存儲(chǔ)器00011MOVE在寄存器之間傳送操作數(shù)00100LOADI將立即數(shù)裝入寄存器00101BRANCHI轉(zhuǎn)移到由立即數(shù)指定的地址00110BRANCHGTI大于時(shí)轉(zhuǎn)移到由立即數(shù)指定的地址00111INC加1指令01000DEC減1指令01001AND兩個(gè)寄存器與操作01010OR兩個(gè)寄存器或操作01011XOR兩個(gè)寄存器異或操作01100NOT寄存器求反01101ADD兩個(gè)寄存器加運(yùn)算01110SUB兩個(gè)寄存器減運(yùn)算01111ZERO寄存器清零10110BRANCHEQ等于時(shí)轉(zhuǎn)移11010SHL向左邏輯移位11011SHR向右邏輯移位11100ROTR循環(huán)右移11101ROTL循環(huán)左移3、CPU執(zhí)行指令步驟及其方式①從RAM或CACHE中讀出指令(FETCH)②將讀出的指令解成微指令(DECODE)③將執(zhí)行指令所需的控制質(zhì)料讀出(FECCHOPERANDS)④執(zhí)行解碼后的微指令(EXECUTE)⑤執(zhí)行后的結(jié)果存回RAM中(WRITEBACK)3.2.此項(xiàng)設(shè)計(jì)的頂層文件包括頂層程序包CPU_LIB、TOP.VHD和應(yīng)用程序在RAM中的初始化文件RAM_16.mif。下面對(duì)CPU頂層文件的描述,包括頂層程序包CPU_LIB和頂層文件TOP.VHD的設(shè)計(jì)。同時(shí)給出了在QuartusII環(huán)境下設(shè)計(jì)的CPU頂層結(jié)構(gòu)原理圖。1、CPU元件的VHDL描述首先,頂層程序包CPU_LIB.VHD是用來說明連接各個(gè)元件之間的信號(hào)類型的。此程序包描述了多個(gè)用于規(guī)定運(yùn)算器功能、移位寄存操作和用于CPU控制的狀態(tài)的類型。頂層程序包CPU_LIB內(nèi)容如下所示:libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.std_logic_arith.all;packagecpu_libissubtypet_shiftisunsigned(2downto0);constantshftpass:unsigned(2downto0):="000";constantshl:unsigned(2downto0):="001";constantshr:unsigned(2downto0):="010";constantrotl:unsigned(2downto0):="011";constantrotr:unsigned(2downto0):="100";------subtypet_aluisunsigned(3downto0);constantalupass:unsigned(3downto0):="0000";constantandOp:unsigned(3downto0):="0001";constantorOp:unsigned(3downto0):="0010";constantnotOp:unsigned(3downto0):="0011";constantxorOp:unsigned(3downto0):="0100";constantplus:unsigned(3downto0):="0101";constantalusub:unsigned(3downto0):="0110";constantinc:unsigned(3downto0):="0111";constantdec:unsigned(3downto0):="1000";constantzero:unsigned(3downto0):="1001";-------subtypet_compisunsigned(2downto0);constanteq:unsigned(2downto0):="000";constantneq:unsigned(2downto0):="001";constantgt:unsigned(2downto0):="010";constantgte:unsigned(2downto0):="011";constantlt:unsigned(2downto0):="100";constantlte:unsigned(2downto0):="101";--------subtypet_regisstd_logic_vector(2downto0);typestateis(reset1,reset2,reset3,reset4,reset5,reset6,execute,nop,load,store,move,load2,load3,load4,store2,store3,store4,move2,move3,move4,incPc,incPc2,incPc3,incPc4,incPc5,incPc6,incPc7,loadPc,loadPc2,loadPc3,loadPc4,bgtI2,bgtI3,bgtI4,bgtI5,bgtI6,bgtI7,bgtI8,bgtI9,bgtI10,bgtI11,braI2,braI3,braI4,braI5,braI6,braI7,loadI2,loadI3,loadI4,loadI5,loadI6,loadI7,inc2,inc3,inc4,dec2,dec3,dec4,beq2,beq3,beq4,beq5,beq6,beq7,beq8,beq9,beq10,beq11);subtypebit16isstd_logic_vector(15downto0);endcpu_lib;為了驗(yàn)證微處理器的功能,在此設(shè)計(jì)了CPU內(nèi)部各模塊通過總線連接的數(shù)據(jù)通路,以及與存儲(chǔ)器接口的模型。它們通過頂層文件TOP.VHD來進(jìn)行調(diào)用。頂層文件TOP.VHD內(nèi)容如下所示:libraryIEEE;useIEEE.std_logic_1164.all;usework.cpu_lib.all;entitytopisendtop;architecturebehaveoftopiscomponentmemport(addr:inbit16;sel,rw:instd_logic;ready:outstd_logic;data:inoutbit16);endcomponent;componentcpuport(clock,reset,ready:instd_logic;addr:outbit16;rw,vma:outstd_logic;data:inoutbit16);endcomponent;signaladdr,data:bit16;signalvma,rw,ready:std_logic;signalclock,reset:std_logic:='0';beginclock<=notclockafter50ns;reset<='1','0'after100ns;m1:memportmap(addr,vma,rw,ready,data);u1:cpuportmap(clock,reset,ready,addr,rw,vma,data);endbehave;2、頂層文件的原理圖設(shè)計(jì)最頂層設(shè)計(jì)文件也采用直觀的圖形文件來描述。在QuartusII環(huán)境下用圖形設(shè)計(jì)方法實(shí)際的頂層文件為TOP_16.bdf,其結(jié)構(gòu)如圖3-5所示。圖3-5CPU頂層結(jié)構(gòu)圖ram_dp是一個(gè)存儲(chǔ)元件,其中存儲(chǔ)了CPU執(zhí)行的指令和數(shù)據(jù)。存儲(chǔ)器ram_dp由FPGA中的嵌入式陣列塊構(gòu)成,通過調(diào)用宏模塊LPM_ram_dp和設(shè)置其相關(guān)參數(shù)來實(shí)現(xiàn)。此存儲(chǔ)器的數(shù)據(jù)線和地址線都設(shè)為16位,其數(shù)據(jù)線與總線接口,CPU能對(duì)它進(jìn)行讀/寫操作。ram_dp讀數(shù)據(jù)的過程是:首先由地址寄存器AR送出一個(gè)存儲(chǔ)單元的地址addr,然后使r/w為0,進(jìn)行讀操作read;片選信號(hào)sel置1,選中存儲(chǔ)器;若信號(hào)READY為1,說明存儲(chǔ)器是可操作的,在此之后,存儲(chǔ)單元就會(huì)輸出數(shù)據(jù)data。向存儲(chǔ)器ram_dp寫入數(shù)據(jù)的過程是:首先由地址寄存器AR送出一個(gè)存儲(chǔ)單元的地址addr;同時(shí)將要寫入的數(shù)據(jù)data加到存儲(chǔ)器的數(shù)據(jù)輸入端;然后,將r/w置1,進(jìn)行寫操作,write,片選信號(hào)sel置1,選中存儲(chǔ)器;這時(shí),若信號(hào)READY為1,說明存儲(chǔ)器是可操作的,數(shù)據(jù)dada即寫入到存儲(chǔ)器的指定單元中。3. 存儲(chǔ)器分成兩個(gè)部分,第一部分是指令區(qū),第二部分是數(shù)據(jù)區(qū)。指令部分包含了將被執(zhí)行的指令。存儲(chǔ)器RAM的初始化程序和數(shù)據(jù)保存在文件RAM_16.mif中。在該文件中,數(shù)據(jù)寬度WIDTH為16位,存儲(chǔ)器深度DEPTH為256個(gè)字,地址和數(shù)據(jù)都以十六進(jìn)制的形式表示,文件的內(nèi)容如表3-2所示。表3-2WIDTH=16;;------地址10H-20H單元為數(shù)據(jù)塊DEPTH=256F:0001;ADDRESS_RADIX=HEX;10:0002;DATA_RADIX=HEX;11:0003;CONTENTBEGIN12:0004;0:2001;--源操作數(shù)(10)送REG113:0005;1:0010;14:0006;2:2002;--目的操作數(shù)(30)送REG215:0007;3:0030;16:0008;4:2006;--結(jié)束地址(2f)送REG617:0009;5:002f;18:000a;6:080b;--取數(shù)19:000b;7:101a;--存數(shù)1a:000c;8:300e;--比較R1>R6?1b:000d;9:0000;--若為yes,則停止1c:000e;a:3801;--修改源指針R1<=R1+11d:000f;b:3802;--修改目的指針R2<=R2+11e:0010;c:280d;--goto[06]單元地址,循環(huán)1f:0011;d:0006;20..7F::0000;e:0000;END;當(dāng)CPU得到一個(gè)RESET信號(hào)后,復(fù)制操作開始。RESET信號(hào)使得CPU內(nèi)部的狀態(tài)復(fù)位,從存儲(chǔ)單元00開始處理指令。程序一開始執(zhí)行一些指令設(shè)置適當(dāng)?shù)募拇嫫鳎沟脡K復(fù)制操作能夠進(jìn)行。寄存器1包含了起始地址,或者是被復(fù)制寄存器塊第一個(gè)元件的地址。寄存器2包含了目標(biāo)存儲(chǔ)器塊的地址。寄存器6包含了被復(fù)制存儲(chǔ)器塊的末地址。執(zhí)行程序中,CPU從指針REG1指向的單元取數(shù),送往指針REG2指向的單元,然后將取數(shù)指針REG1與結(jié)束標(biāo)志REG6的值進(jìn)行比較,判斷數(shù)據(jù)塊復(fù)制是否結(jié)束,若不相等,則修改原指針和目的指針,繼續(xù)循環(huán)傳輸復(fù)制數(shù)據(jù)塊;若相等,則程序結(jié)束,停止運(yùn)行。3.3CPU基本部件設(shè)計(jì)CPU頂層設(shè)計(jì)由下層元件例化而成,主要包括這樣一些基本部件:運(yùn)算器ALU、比較器COMP、控制器CONTROL、寄存器REG、寄存器陣列REGARRAY、移位寄存器SHIFT和三態(tài)寄存器TRIREG等。3.3算術(shù)邏輯單元ALU通過一條或多條輸入總線完成算術(shù)運(yùn)算或者邏輯運(yùn)算。運(yùn)算器ALU的結(jié)構(gòu)圖如圖3-6所示。a和b為運(yùn)算器輸入端口,c為運(yùn)算器輸出端口,用于輸出運(yùn)算結(jié)果??刂菩盘?hào)sel決定了運(yùn)算器的算法功能。ALU的功能如表3-3所示,ALU可完成加、減運(yùn)算,還可以進(jìn)行邏輯運(yùn)算,如與、或、非、異或。表3-3運(yùn)算器ALU的功能sel輸入操作說明0000C=A通過PASS0001C=AANDB與0010C=AORB或0011C=NOTA非0100C=AXORB異或0101C=A+B加法0110C=A-B減法0111C=A+1加11000C=A-1減11001C=0清0運(yùn)算器ALU的VHDL程序如下:libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.std_logic_unsigned.all;usework.cpu_lib.all;entityaluisport(a,b:inbit16;sel:int_alu;c:outbit16);圖3-6運(yùn)算器ALU結(jié)構(gòu)圖endalu;architecturertlofaluisbeginaluproc:process(a,b,sel)begincaseseliswhenalupass=>c<=aafter1ns; --sel為0000,通過pass,c=awhenandOp=>c<=aandbafter1ns; --sel為0001,與,c=asndbwhenorOp=>c<=aorbafter1ns; --sel為0010,或,c=aorbwhennotOp=>c<=axorbafter1ns; --sel為0011,非,c=notawhenxorOp=>c<=notaafter1ns; --sel為0100,異或,c=axorbwhenplus=>c<=a+bafter1ns;--sel為0101,加法,c=a+bwhenalusub=>c<=a-bafter1ns;--sel為0110,減法,c=a-bwheninc=>c<=a+"0000000000000001"after1ns;--sel為0111,加1,c=a+1whendec=>c<=a-"0000000000000001"after1ns;--sel為1000,減1,c=a-1whenzero=>c<="0000000000000000"after1ns;--sel為1001,清0whenothers=>c<="0000000000000000"after1ns;--sel為1010~1111,清0endcase;endprocess;endrtl;如圖3-7所示是運(yùn)算器ALU的仿真波形(ALU運(yùn)算仿真結(jié)果說明如表3-4所示)。sel是運(yùn)算功能選擇信號(hào),由4位二進(jìn)制組成,a、b是ALU的數(shù)據(jù)輸入,c是運(yùn)算結(jié)果輸出,輸入和輸出數(shù)據(jù)都是16位二進(jìn)制數(shù)。(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)圖3-7運(yùn)算器ALU的仿真波形表3-4ALU運(yùn)算仿真結(jié)果說明工作點(diǎn)波形功能選擇sel運(yùn)算類型輸入數(shù)據(jù)運(yùn)算結(jié)果cab(1)0000通過PASS2000c=a,c=2000(2)0001與20001000c=aandb=0008(3)0010或20001000c=aorb=3000(4)0011非2000c=nota=DFFF(5)0100異或20002500c=axorb=0500(6)0101加法20002500c=a+b=4500(7)0110減法20002500c=a-b=FB00(8)0111加12000c=a+1=2001(9)1000減12000c=a-1=1FFF(10)1001清0xxxxxxxxc=0000(11)1010~1111其他xxxxxxxxc=0000根據(jù)sel值的不同,ALU作相應(yīng)的算術(shù)運(yùn)算或邏輯運(yùn)算。3.3比較器的實(shí)體名為COMP,比較兩個(gè)值,輸出結(jié)果為0或1,取決于比較對(duì)象的類型和值。比較器的運(yùn)算類型決定于選擇輸入控制信號(hào)sel(t_comp)的值,其值表示的狀態(tài)如表3-5所示。比較類型t_comp定義在頂層文件cpu_lib中。兩個(gè)輸入值的比較操作將得到一個(gè)結(jié)果,這個(gè)位是執(zhí)行指令時(shí)用來控制進(jìn)程中的操作流程的。表3-5比較器的運(yùn)算類型t_comp比較類型操作說明000eq(等于)若a=b,compout=1001neq(不等于)若a<>b,compout=1010gt(大于)若a>b,compout=1011gte(大于等于)若a>=b,compout=1100Lt(小于)若a<b,compout=1101lte(小于等于)若a<=b,compout=1其他compout=0比較器程序有一個(gè)case說明語句,case語句中含有if語句。如果條件為真,賦值1;否則賦值0。1、編寫比較器程序如下:libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.std_logic_arith.all;useIEEE.std_logic_unsigned.all;usework.cpu_lib.all;entitycompisport(a,b:inbit16;sel:t_comp;compout:outstd_logic);endcomp;architecturertlofcompisbegincompproc:process(a,b,sel)begincaseseliswhen"000"=>ifa=bthencompout<='1'after1ns;--當(dāng)sel=0,如果a=b則compout=1,elsecompout<='0'after1ns;--否則compout=0endif;when"001"=>ifa/=bthencompout<='1'after1ns;--當(dāng)sel=1,如果a≠b則compout=1,elsecompout<='0'after1ns;--否則compout=0endif;when"010"=>ifa>bthencompout<='1'after1ns;--當(dāng)sel=2,如果a>b則compout=1,elsecompout<='0'after1ns;--否則compout=0endif;when"011"=>ifa>=bthencompout<='1'after1ns;--當(dāng)sel=3,如果a≥b則compout=1,elsecompout<='0'after1ns;--否則compout=0endif;when"100"=>ifa<bthencompout<='1'after1ns;--當(dāng)sel=4,如果a<b則compout=1,elsecompout<='0'after1ns;--否則compout=0endif;when"101"=>ifa<=bthencompout<='1'after1ns;--當(dāng)sel=5,如果a≤b則compout=1,elsecompout<='0'after1ns;--否則compout=0endif;whenothers=>compout<='0';--當(dāng)sel=其他,compout=0endcase;endprocess;endrtl;2、比較器COMP的仿真波形如圖3-8所示。圖3-8比較器COMP的仿真波形圖波形分析如表3-6所示:表3-6比較器COMP的仿真波形說明功能選擇sel比較類型t_comp輸入數(shù)據(jù)比較運(yùn)算結(jié)果compoutab0等于25002500a=bcompout=10等于2500444Aa<bcompout=01不等于25002500a=bcompout=01不等于25001234a≠bcompout=12大于2500273Ca<bcompout=02大于25002500a=bcompout=03大于等于25002899a<bcompout=03大于等于25002500a=bcompout=14小于25001200a>bcompout=04小于25002500a=bcompout=05小于等于25004100a<bcompout=15小于等于25002500a=bcompout=16-7其他2500xxxxxxxxcompout=0比較器COMP的結(jié)構(gòu)圖如圖3-9所示:圖3-9比較器COMP結(jié)構(gòu)圖3.3實(shí)體CONTROL提供必需的信號(hào)連接,使得數(shù)據(jù)流完全地通過CPU,達(dá)到預(yù)期的功能。結(jié)構(gòu)體包含一個(gè)狀態(tài)機(jī),這個(gè)狀態(tài)機(jī)根據(jù)當(dāng)前的狀態(tài)和輸入的信號(hào)值,輸出更新后的狀態(tài)。其中輸入信號(hào)有:指令信號(hào)instrReg[15..0]、比較器輸出狀態(tài)compout、存儲(chǔ)器就緒信號(hào)ready和CPU復(fù)位信號(hào)reset。輸出信號(hào)則是對(duì)指令instrReg[15..0]譯碼以后,對(duì)CPU所組成部件按指令要求進(jìn)行操作所需的控制信號(hào)。圖3-10是控制器CONTROL的實(shí)體結(jié)構(gòu)圖,為了與頂層原理圖保持對(duì)應(yīng)關(guān)系,圖中右邊是輸入信號(hào),左邊是輸出信號(hào)。從CONTOL的VHDL程序可以看出,控制器CONTROL的結(jié)構(gòu)體RTL有兩個(gè)進(jìn)程:第一個(gè)為組合進(jìn)程,它根據(jù)當(dāng)前狀態(tài)和輸入,產(chǎn)生輸出控制信號(hào)值及下一個(gè)狀態(tài)輸出;第二個(gè)是時(shí)序進(jìn)程,用來存儲(chǔ)當(dāng)前狀態(tài)。當(dāng)輸入時(shí)鐘上升沿到來時(shí)將次態(tài)內(nèi)容送入現(xiàn)態(tài)。如果控制塊是比較大的狀態(tài)機(jī),它的每一條指令都包含多個(gè)狀態(tài),要完成一條指令,就必須完成指令所需的必要步驟,執(zhí)行指令中的所有狀態(tài)1、控制器CONTROL的程序如下:libraryIEEE;--控制器CONTROL的設(shè)計(jì)useIEEE.std_logic_1164.all;usework.cpu_lib.all;--頂層程序包c(diǎn)pu_libentitycontrolis--控制器port(clock,reset,ready,compout:instd_logic;--工作時(shí)鐘,復(fù)位信號(hào),存儲(chǔ)器的就緒信--號(hào),比較器的輸出狀態(tài)為輸入信號(hào)instrReg:inbit16;--16位的指令為輸入信號(hào)progCntrWr,progCntrRd,addrRegWr,addrRegRd,outRegWr,outRegRd:outstd_logic;--程序計(jì)數(shù)器寫,程序計(jì)數(shù)器讀,地址寄存器寫,地址寄存器讀,輸--出寄存器寫,輸出寄存器讀為輸出信號(hào)shiftSel:outt_shift;aluSel:outt_alu;compSel:outt_comp;--移位運(yùn)算器,算術(shù)運(yùn)算邏輯單元,--比較器的功能選擇為輸出信號(hào)opRegRd,opRegWr,instrWr,regRd,regWr,rw,vma:outstd_logic;regSel:outt_reg);--工作寄存器讀,工作寄存器寫,指令寫,寄存器陣列讀,寄存器陣列寫,--存儲(chǔ)器讀寫,存儲(chǔ)器片選信號(hào),寄存器的選擇為輸出信號(hào)endcontrol;architecturertlofcontrolissignalcurrent_state,next_state:state;--定義當(dāng)前和下一個(gè)狀態(tài)類型beginnxtstateproc:process(current_state,instrReg,compout,ready)--根據(jù)當(dāng)前狀態(tài)和輸入,產(chǎn)生--輸出控制信號(hào)值及下一個(gè)狀態(tài)輸出beginprogCntrWr<='0';progCntrRd<='0';addrRegWr<='0';outRegWr<='0';outRegRd<='0';shiftSel<=shftpass;aluSel<=alupass;compSel<=eq;opRegRd<='0';opRegWr<='0';instrWr<='0';regSel<="000";regRd<='0';regWr<='0';rw<='0';vma<='0';--輸出信號(hào)值全部初始化為零casecurrent_stateis--當(dāng)前狀態(tài)的分析whenreset1=>aluSel<=zeroafter1ns;shiftSel<=shftpass;next_state<=reset2;--復(fù)位時(shí)運(yùn)算器清零,移位寄存器直通輸出whenreset2=>aluSel<=zero;shiftSel<=shftpass;outRegWr<='1';next_state<=reset3;whenreset3=>outRegRd<='1';next_state<=reset4;whenreset4=>outRegRd<='1';addrRegRd<='1';progCntrWr<='1';addrRegWr<='1';next_state<=reset5;whenreset5=>vma<='1';rw<='0';next_state<=reset6;whenreset6=>vma<='1';rw<='0';ifready='1'theninstrWr<='1';next_state<=execute;elsenext_state<=reset6;endif;---當(dāng)復(fù)位信號(hào)為reset6時(shí),若ready信號(hào)為“1”--寄存器允許寫,下一狀態(tài)將跳轉(zhuǎn)到執(zhí)行狀態(tài);否則回到reset狀態(tài),繼續(xù)判斷ready信號(hào)。whenexecute=>caseinstrReg(15downto11)is--寄存器高5位為操作碼when"00000"=>next_state<=incPc;--nop--操作碼為00000,執(zhí)行空操作when"00001"=>regSel<=instrReg(5downto3);regRd<='1';next_state<=load2;--操作碼為00001,和load2、load3、load4完成裝載數(shù)據(jù)到寄存器的功能when"00010"=>regSel<=instrReg(2downto0);regRd<='1';next_state<=store2;--操作碼--為00010,和store2、store3、store4執(zhí)行將寄存器的數(shù)據(jù)存入存儲(chǔ)器when"00011"=>regSel<=instrReg(5downto3);regRd<='1';aluSel<=alupass;shiftSel<=shftpass;next_state<=move2;--操作碼為00011,執(zhí)行在寄存器之間傳送操作數(shù)when"00100"=>progcntrRd<='1';alusel<=inc;shiftsel<=shftpass;next_state<=loadI2;--操作碼為00100,執(zhí)行將立即數(shù)裝入寄存器when"00101"=>progcntrRd<='1';alusel<=inc;shiftsel<=shftpass;next_state<=braI2;--操作碼為00101,執(zhí)行轉(zhuǎn)移到由立即數(shù)指定的地址when"00110"=>regSel<=instrReg(5downto3);regRd<='1';next_state<=bgtI2;--操作碼為00110,執(zhí)行大于時(shí)轉(zhuǎn)移到由立即數(shù)指定的地址when"00111"=>regSel<=instrReg(2downto0);regRd<='1';alusel<=inc;shiftsel<=shftpass;next_state<=inc2;--操作碼為00111,執(zhí)行加1指令when"01000"=>regSel<=instrReg(2downto0);regRd<='1';alusel<=dec;shiftsel<=shftpass;next_state<=dec2;--當(dāng)操作碼為01000時(shí),執(zhí)行dec操作when"01001"=>regSel<=instrReg(5downto3);regRd<='1';alusel<=andOp;shiftsel<=shftpass;next_state<=and2;--當(dāng)操作碼為01001時(shí),執(zhí)行與操作when"01010"=>regSel<=instrReg(5downto3);regRd<='1';alusel<=orOp;shiftsel<=shftpass;next_state<=or2;--當(dāng)操作碼為01010時(shí),執(zhí)行或操作when"01011"=>regSel<=instrReg(5downto3);regRd<='1';alusel<=xorOp;shiftsel<=shftpass;next_state<=xor2;--當(dāng)操作碼為01011時(shí),執(zhí)行異或操作when"01100"=>regSel<=instrReg(2downto0);regRd<='1';alusel<=notOp;shiftsel<=shftpass;next_state<=not2;--當(dāng)操作碼為01100時(shí),執(zhí)行寄存器取反操作when"01101"=>regSel<=instrReg(5downto3);regRd<='1';opRegWr<='1';next_state<=plus2;--當(dāng)操作碼為01101時(shí),執(zhí)行加運(yùn)算操作when"01110"=>regSel<=instrReg(5downto3);regRd<='1';opRegWr<='1';next_state<=alusub2;--當(dāng)操作碼為01110時(shí),執(zhí)行減運(yùn)算操作when"01111"=>regSel<=instrReg(2downto0);regRd<='1';alusel<=zero;shiftsel<=shftpass;next_state<=zero2;--當(dāng)操作碼為01111時(shí),執(zhí)行寄存器清零操作when"10110"=>regSel<=instrReg(5downto3);regRd<='1';next_state<=beq2;--當(dāng)操作碼為10110時(shí),執(zhí)行等于時(shí)轉(zhuǎn)移操作when"11010"=>regSel<=instrReg(2downto0);regRd<='1';alusel<=alupass;shiftsel<="001";next_state<=shl2;--當(dāng)操作碼為11010時(shí),執(zhí)行向左邏輯移位操作when"11011"=>regSel<=instrReg(2downto0);regRd<='1';alusel<=alupass;shiftsel<="010";next_state<=shr2;--當(dāng)操作碼為11011時(shí),執(zhí)行向右邏輯移位操作when"11100"=>regSel<=instrReg(2downto0);regRd<='1';alusel<=alupass;shiftsel<="100";next_state<=rotr2;--當(dāng)操作碼為11100時(shí),執(zhí)行循環(huán)右移操作whenothers=>next_state<=incPc;--操作碼為其它值時(shí),下一狀態(tài)跳轉(zhuǎn)到incpcendcase;--*******************************************************LOADwhenload2=>regSel<=instrReg(5downto3);regRd<='1';whenload3=>vma<='1';rw<='0';next_state<=load4;whenload4=>vma<='1';rw<='0';regSel<=instrReg(2downto0);regWr<='1';next_state<=incPc;--*******************************************************STOREwhenstore2=>regSel<=instrReg(2downto0);regRd<='1';addrregWr<='1';next_state<=store3;-whenstore3=>regSel<=instrReg(5downto3);regRd<='1';next_state<=store4;whenstore4=>regSel<=instrReg(5downto3);regRd<='1';vma<='1';rw<='1';next_state<=incPc;--*******************************************************MOVEwhenmove2=>regSel<=instrReg(5downto3);regRd<='1';aluSel<=alupass;shiftsel<=shftpass;outRegWr<='1';next_state<=move3;whenmove3=>outRegRd<='1';next_state<=move4;whenmove4=>outRegRd<='1';regSel<=instrReg(2downto0);regWr<='1';next_state<=incPc;--*******************************************************LOADIwhenloadI2=>progcntrRd<='1';alusel<=inc;shiftsel<=shftpass;outregWr<='1';next_state<=loadI3;whenloadI3=>outregRd<='1';next_state<=loadI4;whenloadI4=>outregRd<='1';progcntrWr<='1';addrregWr<='1';next_state<=loadI5;whenloadI5=>vma<='1';rw<='0';next_state<=loadI6;whenloadI6=>vma<='1';rw<='0';ifready='1'thenregSel<=instrReg(2downto0);regWr<='1';next_state<=incPc;elsenext_state<=loadI6;endif;--********************************************************BRANCHIwhenbraI2=>progcntrRd<='1';alusel<=inc;shiftsel<=shftpass;outregWr<='1';next_state<=braI3;whenbraI3=>next_state<=braI4;whenbraI4=>outregRd<='1';next_state<=braI5;whenbraI5=>outregRd<='1';progcntrWr<='1';addrregWr<='1';next_state<=braI6;whenbraI6=>vma<='1';rw<='0';next_state<=braI7;whenbraI7=>vma<='1';rw<='0';ifready='1'thenprogcntrWr<='1';next_state<=loadPc;elsenext_state<=braI7;endif;--*********************************************************BRANCHGTIwhenbgtI2=>regSel<=instrReg(5downto3);regRd<='1';opRegWr<='1';next_state<=bgtI3;whenbgtI3=>opRegRd<='1';regSel<=instrReg(2downto0);regRd<='1';compsel<=gt;next_state<=bgtI4;whenbgtI4=>opRegRd<='1'after1ns;--1ns后工作寄存器讀允許regSel<=instrReg(2downto0);regRd<='1';compsel<=gt;--選定目的操作數(shù)寄存器,讀允許,--比較器運(yùn)算類型置為gt(大于)ifcompout='1'thennext_state<=bgtI5;--若比較輸出為1,則下一狀態(tài)置為bgtI5elsenext_state<=incPc;endif;--否則下一狀態(tài)置為incPcwhenbgtI5=>progcntrRd<='1';alusel<=inc;shiftSel<=shftpass;next_state<=bgtI6;whenbgtI6=>progcntrRd<='1';alusel<=inc;shiftsel<=shftpass;outregWr<='1';next_state<=bgtI7;whenbgtI7=>next_state<=bgtI8;whenbgtI8=>outregRd<='1';next_state<=bgtI9;whenbgtI9=>outregRd<='1';progcntrWr<='1';addrregWr<='1';next_state<=bgtI10;whenbgtI10=>vma<='1';rw<='0';next_state<=bgtI11;whenbgtI11=>vma<='1';rw<='0';ifready='1'thenprogcntrWr<='1';next_state<=loadPc;elsenext_state<=bgtI11;endif;--若ready信號(hào)為1,則程序計(jì)數(shù)器寫--允許,下一狀態(tài)跳轉(zhuǎn)到loadPc,否則下一狀態(tài)跳回bgtI11--***********************************************************INCwheninc2=>regSel<=instrReg(2downto0);regRd<='1';alusel<=inc;shiftsel<=shftpass;outregWr<='1';next_state<=inc3;wheninc3=>outregRd<='1';next_state<=inc4;wheninc4=>outregRd<='1';regsel<=instrReg(2downto0);regWr<='1';next_state<=incPc;--***********************************************************DECwhendec2=>regSel<=instrReg(2downto0);regRd<='1';alusel<=dec;shiftsel<=shftpass;outregWr<='1';next_state<=dec3;whendec3=>outregRd<='1';next_state<=dec4;whendec4=>outregRd<='1';regsel<=instrReg(2downto0);regWr<='1';next_state<=incPc;--***********************************************************ANDwhenand2=>regSel<=instrReg(5downto3);regRd<='1';opRegWr<='0';next_state<=and3;whenand3=>regSel<=instrReg(5downto3);regRd<='1';opRegWr<='1';opRegRd<='1';next_state<=and4;whenand4=>regSel<=instrReg(2downto0);regRd<='1';alusel<=andOp;shiftsel<=shftpass;outRegWr<='1';next_state<=and5;whenand5=>outRegRd<='1';regWr<='0';regSel<=instrReg(2downto0);next_state<=and6;whenand6=>regWr<='1';outRegRd<='1';regSel<=instrReg(2downto0);outRegRd<='1';next_state<=incPc;--***********************************************************ORwhenor2=>regSel<=instrReg(5downto3);regRd<='1';opRegWr<='0';next_state<=or3;whenor3=>regSel<=instrReg(5downto3);regRd<='1';opRegWr<='1';opRegRd<='1';next_state<=or4;whenor4=>regSel<=instrReg(2downto0);regRd<='1';alusel<=orOp;shiftsel<=shftpass;outRegWr<='1';next_state<=or5;whenor5=>outRegRd<='1';regWr<='0';regSel<=instrReg(2downto0);next_state<=or6;whenor6=>regWr<='1';outRegRd<='1';regSel<=instrReg(2downto0);outRegRd<='1';next_state<=incPc;--*********************************************************XORwhenxor2=>regSel<=instrReg(5downto3);regRd<='1';opRegWr<='0';next_state<=xor3;whenxor3=>regSel<=instrReg(5downto3);regRd<='1';opRegWr<='1';opRegRd<='1';next_state<=xor4;whenxor4=>regSel<=instrReg(2downto0);regRd<='1';alusel<=xorOp;shiftsel<=shftpass;outRegWr<='1';next_state<=xor5;whenxor5=>outRegRd<='1';regWr<='0';regSel<=instrReg(2downto0);next_state<=xor6;whenxor6=>regWr<='1';outRegRd<='1';regSel<=instrReg(2downto0);outRegRd<='1';next_state<=incPc;--**********************************************************NOTwhennot2=>regSel<=instrReg(2downto0);regRd<='1';alusel<=notOp;shiftsel<=shftpass;outRegWr<='1';next_state<=not3;whennot3=>outRegRd<='1';next_state<=not4;whennot4=>regSel<=instrReg(2downto0);regWr<='1';outRegRd<='1';next_state<=incPc;--**********************************************************ADDwhenplus2=>opRegRd<='1';next_state<=plus3;whenplus3=>opRegRd<='1';regSel<=instrReg(5downto3);regRd<='1';next_state<=plus4;whenplus4=>regsel<=instrReg(2downto0);regRd<='1';alusel<=plus;shiftsel<=shftpass;next_state<=plus5;whenplus5=>regsel<=instrReg(2downto0);regRd<='1';alusel<=plus;shiftsel<=shftpass;outregWr<='1';next_state<=plus6;whenplus6=>outregRd<='1';next_state<=plus7;whenplus7=>outregRd<='1';regsel<=instrReg(2downto0);regWr<='1';next_state<=incPc;--**********************************************************ZEROwhenzero2=>regSel<=instrReg(2downto0);regRd<='1';alusel<=zero;shiftsel<=shftpass;outregWr<='1';next_state<=zero3;whenzero3=>outregRd<='1';next_state<=zero4;whenzero4=>outregRd<='1';regsel<=instrReg(2downto0);regWr<='1';next_state<=incPc;--**********************************************************SUBwhenalusub2=>opRegRd<='1';next_state<=alusub3;whenalusub3=>opRegRd<='1';regSel<=instrReg(5downto3);regRd<='1';next_state<=alus
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二手轎車買賣合同示范文本
- 個(gè)人車位贈(zèng)與合同范本
- 臨時(shí)工勞動(dòng)合同范本參考
- 2025年平安保險(xiǎn)公司特定疾病終身保險(xiǎn)賠付合同
- 業(yè)務(wù)合作合同格式樣本
- 不銹鋼采購與銷售合同
- 個(gè)人借款質(zhì)押合同書樣本
- 專用線鐵路物流服務(wù)合同細(xì)則
- 個(gè)人與企業(yè)租賃合同范本大全
- 采購標(biāo)準(zhǔn)合同書
- 2025年中國山泉水市場(chǎng)前景預(yù)測(cè)及投資規(guī)劃研究報(bào)告
- GB/T 18109-2024凍魚
- 2025年八省聯(lián)考數(shù)學(xué)試題(原卷版)
- 重慶市2025屆高三第一次聯(lián)合診斷檢測(cè)英語試卷(含解析含聽力原文無音頻)
- 《榜樣9》觀后感心得體會(huì)二
- 天津市部分區(qū)2024-2025學(xué)年九年級(jí)(上)期末物理試卷(含答案)
- 一氧化碳中毒培訓(xùn)
- 保潔服務(wù)質(zhì)量與服務(wù)意識(shí)的培訓(xùn)
- CONSORT2010流程圖(FlowDiagram)【模板】文檔
- SMM英國建筑工程標(biāo)準(zhǔn)計(jì)量規(guī)則中文 全套
- GB 18030-2022信息技術(shù)中文編碼字符集
評(píng)論
0/150
提交評(píng)論